Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Увидеть порядок вызова функций (http://www.flasher.ru/forum/showthread.php?t=198354)

faraday 25.04.2013 01:38

Увидеть порядок вызова функций
 
Здравствуйте, овзникла необходимость быстро разобраться в большом количестве чужого кода?
Сначала выбрал схему ити от главного класса по обращению к другим, и так в рекурсии. Но это очень путает и медленно. Есть ли какой то инструмент, помогающий облегчить этот процесс?
К прмиеру при запуске приложения отображает порядок вызова функций. чтобы можно было в интерактивном режиме увидеть что за что отвечает?

derhab 25.04.2013 02:05

там где вам нужно получить цепочку вызовов функций:
Код AS3:

trace(new Error().getStackTrace());

#getStackTrace

AlexCooper 25.04.2013 04:45

Цитата:

Сообщение от derhab (Сообщение 1131159)
там где вам нужно получить цепочку вызовов функций:
Код AS3:

trace(new Error().getStackTrace());

#getStackTrace

возьму на заметку)

Babylon 25.04.2013 13:19

Тогда уж вот эту возьмите :)
Код AS3:

public static function getFunctionName(e:Error):String {
                        var stackTrace:String = e.getStackTrace();    // entire stack trace
                        var startIndex:int = stackTrace.indexOf("at ");// start of first line
                        var endIndex:int = stackTrace.indexOf("()")// end of function name
                        var suffixTrace:String=stackTrace.substring(endIndex + 3);
                        startIndex=suffixTrace.indexOf("at ");
                        endIndex= suffixTrace.indexOf("()")// end of function name
                        suffixTrace=suffixTrace.substring(startIndex + 3, endIndex);
 
                        return suffixTrace;
                }
getFunctionName(new Error())


faraday 25.04.2013 13:29

Спасибо, буду пробовать)

derhab 25.04.2013 13:39

Babylon, Вы тестировали сами, то что предлагаете?
Где там цепочка вызовов?

ну то есть понятно, так можно получить имя последней вызывающей функции в стеке.
изначально речь шла о другом немного.

Babylon 25.04.2013 14:42

derhab, тестирую постоянно :)
Более того. Написал две обертки для входа ni() и выхода из функции ne()

Где то в базовом классе
....
Код AS3:

public static var sp:String;
public static var nsp:int;
.....
public static function dsp():void
                {
                        sp="";
                        for (var i:uint=0;i<=2*nsp;i++){       
                                sp=sp+" ";
                        }
                }
 
public static function ni(s:String=""):void
                {
                        if (s!=""){s=" # "+s}
                        dsp();
                        trace(sp+"->"+getFunctionName(new Error())+s);
                        nsp++;
                }
                public static function ne():void
                {
                        nsp--;
                        dsp();
                        trace(sp+"<-"+getFunctionName(new Error()));
                        if (nsp<0) nsp=0;
 
                }

s - это для параметров которые хотите увидеть в трейсе

vizgl 25.04.2013 15:36

Цитата:

Сообщение от Babylon (Сообщение 1131213)
derhab, тестирую постоянно :)
Более того. Написал две обертки для входа ni() и выхода из функции ne()

Где то в базовом классе
....
Код AS3:

public static var sp:String;
public static var nsp:int;
.....
public static function dsp():void
                {
                        sp="";
                        for (var i:uint=0;i<=2*nsp;i++){       
                                sp=sp+" ";
                        }
                }
 
public static function ni(s:String=""):void
                {
                        if (s!=""){s=" # "+s}
                        dsp();
                        trace(sp+"->"+getFunctionName(new Error())+s);
                        nsp++;
                }
                public static function ne():void
                {
                        nsp--;
                        dsp();
                        trace(sp+"<-"+getFunctionName(new Error()));
                        if (nsp<0) nsp=0;
 
                }

s - это для параметров которые хотите увидеть в трейсе

А можно подробнее, зачем это нужно? И как в релизе вы избавляетесь от этих функций(CONFIG:: DEBUG)?

Babylon 25.04.2013 16:12

Вы не поверите у меня и в некоторых релизах они стоят. Ибо через какое-то время - год-два ты не вспомнишь логику работы приложения и тут они в самый раз:)

tsarapkabel 25.04.2013 16:37

Для проверки написал 3 функции, запускаются так:
Конструктор класса -> goSecondFunction, goSecondFunction запускает таймер, по таймеру вызывается goThirdFunction.

В goThirdFunction вызываю trace(new Error().getStackTrace()), получаю:
Код:

Error
at StackTrace/goThirdFunction()[D:\путь к классу\StackTrace.as:46]
at StackTrace/onTimerStartThird()[D:\путь к классу\StackTrace.as:39]

Выходит, работает до 1-го таймера. Если вызвать ещё и из функции, вызывающей таймер, всё ок.
Код:

goThirdFunction()
onTimerStartThird()
goSecondFunction()
конструктор()

Используя метод Babylon getFunctionName:
Код:

StackTrace/onTimerStartThird
StackTrace

Может я чего недопонял?


Часовой пояс GMT +4, время: 12:31.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.