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.
答案 0 :(得分:4)
此页面讨论了类似的stack overflow issue。似乎在函数中的某处添加trace
将修复它。
答案 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