为什么在Actionscript 3中调用带有2个以上参数的函数会导致堆栈溢出?

时间:2010-07-28 05:26:59

标签: flash actionscript-3 stack-overflow

function testFunc(val1:int, val2:int, val3:int):int {
    var returnVal:int = 0;
    return returnVal;
}

var val:int = testFunc(1, 2, 3);

原因

locals: Main int int int * 
4:dup VerifyError: Error #1023: Stack overflow occurred.

3 个答案:

答案 0 :(得分:4)

此页面讨论了类似的stack overflow issue。似乎在函数中的某处添加trace将修复它。

这是known bug

答案 1 :(得分:0)

感谢您指出这一事实。无论如何,这是我意识到的。

AS3中的功能定义为

function apply(thisArg:*, argArray:*):*

,任何用户功能都将映射到adobe定义的 Function.apply ,如上所述。我想这与c中的环境变量类似。第一个参数可用于发送参数数组的长度,后跟数组本身。

所以这基本上意味着,如果你想使用上面的函数调用,你可以将你的函数定义为

function testFunc(...args):int {

val1:int = args[0];
val2:int = args[1];
val3:int = args[2];

var returnVal:int = 0;
return returnVal;

}

var val:int = testFunc(1, 2, 3);
但是,我并没有真正找到谷歌周围的任何东西。这导致我去了aobe的页面本身。无论如何我很高兴我学会了新的东西。

编辑:请在此处查看功能定义: http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/Function.html

答案 2 :(得分:0)

是的,它是一个bug播放器,另一个解决方法是将结果转换为int,因此编译器生成的指令将不相同:

在第一种情况下:

function testFunc(val1:int, val2:int, val3:int):int {
    var returnVal:int = 0;
    return returnVal;
}

编译器生成类似的东西: 请注意,生成的代码没有任何问题

getlocal 0
pushscope 
pushbyte 0      // stack = 0
dup             // stack = 0 0
setlocal 4      // set returnVal with value on stack, stack = 0
returnvalue     // return the value left on the stack i.e. 0, stack=empty

以及解决方法:

function testFunc(val1:int, val2:int, val3:int):int {
    var returnVal:int = 0;
    return int(returnVal);
}

生成的代码是

getlocal 0
pushscope 
pushbyte 0           // stack = 0
setlocal 4           // set returnValue with the value on the stack, stack=empty
findpropstrict int   // push on stack the object holding the int property, stack=object
getlocal 4           // push on stack returnVal, stack=object 0
callproperty int(param count:1) // call the int property , stack=0
returnvalue          // return the value left on stack i.e 0, stack=empty
相关问题