Я играл с байт-кодом ABC и надеялся, что кто-то сможет прояснить для меня проблему. У меня есть простой флэш-файл, который помещает клип на сцену и имеет крошечный скрипт для обновления его позиции в каждом кадре. Код выглядит примерно так:
package
{
import flash.display.MovieClip;
import flash.events.Event;
public class RedCircle extends MovieClip
{
public function RedCircle()
{
this.addEventListener(Event.ENTER_FRAME, moveit);
}
function moveit(e:Event)
{
this.x -=1;
}
}
}
Что компилируется примерно так:
protected package protected RedCircle
{
class RedCircle extends flash.display.MovieClip
{
static () : Void
{
getlocal_0();
pushscope();
returnvoid();
}
RedCircle () : Void
{
getlocal_0();
pushscope();
getlocal_0();
constructsuper(0);
getlocal_0();
getlex(flash.events.Event);
getproperty(ENTER_FRAME);
getlex(internal .moveit); // ###1
callpropvoid(addEventListener, 2);
returnvoid();
}
function (anonymous) (flash.events.Event param1) : Void // ###2
{
getlocal_0();
pushscope();
getlocal_0();
getlocal_0();
getproperty(x);
decrement();
setproperty(x);
returnvoid();
}
}
}
Мой вопрос в том, как работает 'getlex' работа работает (пометил ### 1). Ему передается multiname, который ссылается на метод moveit класса. К сожалению, кажется, что поле name в информации о методе никогда не будет использовано компилятором. Все методы имеют в качестве имени пустую строку (Показано выше как безымянная функция под номером ### 2).
Как flash-плеер связывает мульти-имя с безымянным методом? Похоже, что в спецификации AVM2 для этого нет положения.
Я знаю, что это возможно, потому что коммерческим декомпиляторам, таким как sothink, удается определить имя метода. Я просто не знаю, как они это делают или как код может работать.