В байт-коде ActionScript, что означает NewActivation?

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

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

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

1 ответ

Решение

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

Поскольку локальные регистры активации не регистрируются при выполнении инструкции newfunction, среда для неконечных функций должна храниться в объектах активации, которые могут быть записаны надлежащим образом. Инструкция 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.
Другие вопросы по тегам