Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 在ActionScript字节码中,新激活意味着什么?_Actionscript 3_Bytecode_Avm2 - Fatal编程技术网

Actionscript 3 在ActionScript字节码中,新激活意味着什么?

Actionscript 3 在ActionScript字节码中,新激活意味着什么?,actionscript-3,bytecode,avm2,Actionscript 3,Bytecode,Avm2,有些方法使用它,有些不使用,显然这是由needsActivation标志指定的,它做什么,何时使用,何时不使用 关于AVM文档的信息有些不全面: 创建一个新的激活对象newactivation,并将其推送到堆栈上。只能用于在MethodInfo条目中设置了“需要”激活标志的方法。AVM 2概述的第6.3节中有很好的描述: 由于 当 执行newfunction指令, 非叶函数的环境 必须存储在激活对象中 这是可以正确捕捉的。这个 newactivation指令创建这样的 激活 当方法中定义了一个局

有些方法使用它,有些不使用,显然这是由needsActivation标志指定的,它做什么,何时使用,何时不使用

关于AVM文档的信息有些不全面:


创建一个新的激活对象newactivation,并将其推送到堆栈上。只能用于在MethodInfo条目中设置了“需要”激活标志的方法。

AVM 2概述的第6.3节中有很好的描述:

由于 当 执行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.

好吧,也许我应该先问一下什么是“激活”。因为在对新激活的描述中,他们说“因为激活的本地寄存器…”。那么ABC术语中的激活是什么呢?@ska据我所知,它基本上是一个包含局部变量作为属性的对象。object?AVM不是更多地使用堆栈和寄存器而不是对象吗?我想这就是全部的想法。这可能类似于在Unix NASM中,在Unix控制机器指令程序之前,必须将寄存器推送到(某些)堆栈上。但在Unix中,这是很好的解释和逻辑。无论如何,谢谢你的帖子,我会去挖掘更多。实际上没有“更多的堆栈”或“更多的对象”,但你是在寻找技术描述,还是想了解它是什么?如果您需要技术说明,请参阅AVM 2概述。如果你想知道如何思考它,可以把它看作是一个包含局部变量的对象。