Macromedia Flash編譯器遺失Pop Op Code Bug最近MMUG上有人發現一個
奇怪的問題....仔細研究之後,發現是Macromedia編譯的Bug
當一個AS 2.0的Class繼承MovieClip
在其成員函式內呼叫stop、play、.....等函式
又未明確指定對象this時候
Macromedia的編譯器會自動替該函式呼叫加上this
但是卻會漏失一個Op Code - POP
導致執行的時候會有一個多餘的資料殘存在Stack內
間接引起回傳值接收錯誤
用Flash 7、8編譯都會發生此錯誤
至於最新的Flex 2.0 Builder Alpha 1則沒有發現,可能是因為編譯器是用Java重新寫的
所以沒有繼承到IDE編譯器的Bug
倘若連續下兩個stop
理論上會有兩個資料殘存
接著連續作三次指定的動作
結果會發現有兩個變數都沒有得到資料
以下是Demo程式
fla frame 1 AS
|
var v1; var v2; var v3; var mc:Test = new Test(); v1 = v2 = v3 = mc.echo(); trace("v1 : " + v1); trace("v2 : " + v2); trace("v3 : " + v3);
// output: // v1 : undefined // v2 : undefined // v3 : echo
|
Test.as Class
|
//要繼承MovieClip class Test extends MovieClip { public function echo():String { // // 以下函式皆會造成編譯時缺少 pop op code // 導致執行時 Stack 內有多餘的資料無法清除 // // play(); // stop(); // gotoAndPlay(1); // gotoAndStop(1); // nextFrame(); // prevFrame(); // // startDrag(this); // stopDrag(); // // unloadMovie(null); // // getURL("http://www.google.com", "_blank"); // loadVariables("http://www.google.com", "_root"); // stop(); stop(); return "echo"; } }
|