[ruFlash] Вызывание глобального trace в кастомной функции trace.

0 views
Skip to first unread message

Pilipenko Dima

unread,
Nov 22, 2009, 7:29:56 AM11/22/09
to ruF...@googlegroups.com
Кто знает как вызвать глобальную функцию трейс в теле функции трейс?
То есть, например:
private function trace(arr : Array) : void {
trace('array in private function trace:', arr);
}

может как-то через неймспейс вызвать, типа global::trace('array in
private function trace:', arr);

Также создавать специально класс со статик функцией трейс не корректно.

Ruslan Shestopal

unread,
Nov 22, 2009, 7:52:11 AM11/22/09
to ruf...@googlegroups.com
может не стоит морочится, раз уж trace поддерживает более одного
аргумента? Тут неавно был разговор как эти трейсу потом поубирать
отовсюду.

--
http://ruslanshestopal.com | -  freelance flash developer and a DJ

Pilipenko Dima

unread,
Nov 22, 2009, 9:07:08 AM11/22/09
to ruf...@googlegroups.com
Я просто хочу назвать метод своего класса trace и в нём вывести значения! :D
Мой вопрос не для релиза.

Ruslan Shestopal пишет:

Daniil Tutubalin

unread,
Nov 22, 2009, 9:16:55 AM11/22/09
to ruf...@googlegroups.com
Поэкспериментировал с дизасемблером, и получается вот такой вывод:
у обычного trace никакого namespace нет.

Поэтому придётся сделать наоборот: указать namespace для своего метода.

Pilipenko Dima

unread,
Nov 22, 2009, 9:19:59 AM11/22/09
to ruf...@googlegroups.com
Фдт показыва трейс так:

//Generated from playerglobal.swc
package {
public function trace(...args : *) : void;
}

судя по этому, неймспейса по дефу нету.. хотя если его запихнуть в
папку, и скомпилить свц, то вероятно возможно.
Но ломать стандартную структуру свц, ради этой идею - влом xD

Daniil Tutubalin пишет:

Daniil Tutubalin

unread,
Nov 22, 2009, 11:05:19 AM11/22/09
to ruf...@googlegroups.com
> Фдт показыва трейс так:

Он забывает добавить, что функция ещё и native.
То есть её реализация находится не в playerglobal.swc, а в флеш плеере.
Кроме того, плеер содержит собственную копию playerglobal.swc (точнее,
abc-кода из неё), поэтому хак swcшки компилятора никак не поможет.

Daniil Tutubalin

unread,
Nov 22, 2009, 11:13:58 AM11/22/09
to ruf...@googlegroups.com
Придумал ещё вариант, как можно это похакать.
Создаём специальный класс: или публичный в отдельном файле, если нужен
в нескольких местах, или внутренний в том же файле, если нужен только
в одном месте.
И создаём ему метод с названием отличным от trace, который будет
вызывать "старый" trace.
А затем используем этот метод вместо trace в тех случаях, когда надо
разрулить конфликт имен.
Пример:

package {

public class Test {
public var value:int = 1;

public function Test() {
trace();
}

public function trace():void {
Hack.myTrace(value);
}
}
}

internal class Hack {
public static function myTrace(... args):void {
trace.apply(null, args);
}
}

Pilipenko Dima

unread,
Nov 22, 2009, 11:17:10 AM11/22/09
to ruf...@googlegroups.com
Так я писал, что как кроме хака специального класса.

"Также создавать специально класс со статик функцией трейс не корректно."

Daniil Tutubalin пишет:

Яски

unread,
Nov 22, 2009, 2:14:58 PM11/22/09
to ruFlash
Можно сделать, как я писал здесь
http://www.flasher.ru/forum/blog.php?b=126

private function trace(arr : Array) : void {

public::trace('array in private function trace:', arr);
}
Но будет работать только если ваша функция в приватном неймспейсе

Nox Noctis

unread,
Nov 22, 2009, 4:23:15 PM11/22/09
to ruf...@googlegroups.com
> То есть её реализация находится не в playerglobal.swc, а в флеш плеере.

Раньше в АВМ1 вообще трейс не был функцией, как и некоторые другие якобы
глобальные якобы функции. Была инструкция за номером 0x26 с одним
аргументом.

--
Michael Antipin
______________________________________________________________________
fe...@noregret.org | http://skazkastudio.ru | http://noregret.org

Reply all
Reply to author
Forward
0 new messages