Почему вызов этой функции с более чем 2 параметрами в ActionScript 3 вызывает переполнение стека? - PullRequest
4 голосов
/ 28 июля 2010
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 ]

4 голосов
/ 28 июля 2010

На этой странице обсуждается похожая проблема переполнения стека .Кажется, добавление trace где-то в функции это исправит.

Это известная ошибка

0 голосов
/ 28 июля 2010

Да, это проигрыватель ошибок, другой обходной путь - приведение вашего результата к 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
0 голосов
/ 28 июля 2010

Спасибо, что указали на этот факт. В любом случае, вот что я понимаю.

Функция в 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);

Я действительно ничего не нашел в Google. Что привело меня к самой странице Aobe. В любом случае рад, что узнал что-то новое.

Редактировать: Пожалуйста, просмотрите определение функции здесь: http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/Function.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...