Macromedia Flash編譯器遺失Pop Op Code Bug:Ticore's Blog:Xuite日誌
  • Site Search
  • Google
    Web Ticore's Blog
  • 最愛連結
  • 最新文章
  • Recent Comments
  • 文章分類
  • Ticore
  • 2005-11-18 10:32 Macromedia Flash編譯器遺失Pop Op Code Bug
  • ?
  • Flash Bugs
  • 好文轉寄
  • 平均分數:0 顆星    投票人數:0
    我要評分:
    標籤 : 


    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";
    }
    }




    Ticore / Xuite日誌 / 回應(1) / 引用(0) / 好文轉寄
  • 回應