В байт-коде 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.