Как методы находятся в байт-коде AVM2?

Я играл с байт-кодом 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, удается определить имя метода. Я просто не знаю, как они это делают или как код может работать.

5
задан izb 3 November 2010 в 16:33
поделиться