В байт-коде ActionScript, что означает NewActivation? - PullRequest
4 голосов
/ 23 марта 2011

Некоторые методы используют его, а некоторые нет, очевидно, это определяется флагом needsActivation, но что он делает и когда его использует, а когда нет?

Информация о документах AVM несколько необычна:

Создает новый объект активации newactivation и помещает его в стек. Может использоваться только в методах, для которых установлен флаг NEED_ACTIVATION в их записи MethodInfo.

1 Ответ

4 голосов
/ 23 марта 2011

В разделе 6.3 обзора AVM 2 есть хорошее описание:

С локальных регистров активация не фиксируется, когда инструкция новой функции выполнена, среда для неконечных функций должны храниться в объектах активации это может быть захвачено правильно. инструкция newactivation создает такой активация.

Используется в методе, когда внутри него определена локальная функция, например:

public function QuickTest()
{
    startTimer(1);
    startTimer(2);
}

public function startTimer(id:int):void
{
    var timer:Timer = new Timer(1000, 1);
    timer.addEventListener(TimerEvent.TIMER_COMPLETE, function(ev:TimerEvent):void
    {
        trace('Timer #'+id+' done.');
    });
    timer.start();        
}       

Что приводит к:

Timer #1 done.
Timer #2 done.

Вы видите, что локальная переменная и аргумент были "заблокированы" при вызове метода. Это связано с тем, что метод startTimer создает активацию при каждом запуске, и именно в этом месте эти переменные блокируются. Если локальные переменные не были заблокированы, результатом этого кода будет:

Timer #2 done.
Timer #2 done.
...