2012-08-09 133 views
1

我與FlashBuilder 4.6工作,並使用AS3Eval V0.3庫來自:http://eval.hurlant.com/AS3Eval庫抱怨「變量編譯沒有定義」

該庫完全一個工作我的Flex 4.6.0項目不在其他(相同的庫鏈接「合併到代碼」的EvalES4.swc庫)。

第一個項目下面的代碼工作:

private var compiler:CompiledESC = new CompiledESC; 

public function compile(code: String) : ByteArray { 
    return compiler.eval(code); 
} 

其他項目,它失敗有: 的ReferenceError:錯誤#1065:不定義的變量編譯。

錯誤指的是在AS3Eval庫以下行(即EvalES4.swc文件)

var compile:Function = getDefinitionByName("ESC::compile") as Function; 

貌似庫有問題完全加載Tamarin的ESC中的其他項目。

我檢查了這兩個項目(他們使用相同的庫...但還是檢查)成功通過

// inside CompiledESC.as 
    private function loadESC():void { 
     var a:Array = [ 
      new debug_abc as ByteArray, 
      new util_abc as ByteArray, 
      new bytes_tamarin_abc as ByteArray, 
      new util_tamarin_abc as ByteArray, 
      new lex_char_abc as ByteArray, 
      new lex_scan_abc as ByteArray, 
      new lex_token_abc as ByteArray, 
      new ast_abc as ByteArray, 
      new parse_abc as ByteArray, 
      new asm_abc as ByteArray, 
      new abc_abc as ByteArray, 
      new emit_abc as ByteArray, 
      new cogen_abc as ByteArray, 
      new cogen_stmt_abc as ByteArray, 
      new cogen_expr_abc as ByteArray, 
      new esc_core_abc as ByteArray, 
      new eval_support_abc as ByteArray, 
      new esc_env_abc as ByteArray, 
     ] 
     ByteLoader.loadBytes(a, true); 
    } 

這些的ByteArray類是通過嵌入在裏面SWC加載狨ESC [嵌入] (通過庫代碼查看),並且所有ByteArray都通過ByteLoader進行初始化和加載。

到目前爲止,我還沒有發現任何線索爲什麼編譯工作爲我的第一個項目,但不爲另一個。有沒有人有類似的經歷或一些提示可能會導致問題?

最佳, 的Jakub

回答

1

哈!

我太絕望了,找到了解決辦法。

看來,CompiledESC不能用在同一幀它是創建


所以在換句話說,這樣的事情將無法​​工作

public function compile(code: String) : ByteArray { 
    var compiler:CompiledESC = new CompiledESC(); 
    return compiler.eval(code); 
} 

下面的代碼將工作(應用程序加載,初始化CompileESC然後用戶點擊運行!按鈕,它在不同的幀恰好從那裏CompileESC創建一個):

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" 
> 
<fx:Script> 
    <![CDATA[ 
     import com.hurlant.eval.CompiledESC; 

     import mx.events.FlexEvent; 

     private var compiler:CompiledESC = new CompiledESC(); 

     protected function button1_clickHandler(event:MouseEvent):void 
     { 
      compiler.eval("trace(\"hello!\")"); 
     } 

    ]]> 
</fx:Script> 
<mx:Button label="RUN!" click="button1_clickHandler(event)" /> 
</s:Application> 

我不知道爲什麼,但我懷疑它是用flash做加載它的字節碼的方式。當你嘗試在虛擬機中插入一些代碼,並在同一幀中使用它時,你會遇到麻煩,因爲你的代碼尚未加載。你必須「屈服」線程並等待另一幀,在Tamarin ESC代碼之間的某處加載。

請注意,這同樣適用於您通過ByteBuffer加載的編譯代碼!當你這樣做

ByteLoader.load(compiler.eval(myAS3Code)); 

不要指望myAS3Code會馬上執行。同樣,只要您「讓步」線程並讓VM真正加載您的代碼,就會加載代碼。

希望這可以幫助在相同情況下的人。

最佳, 的Jakub

0

你應該檢查的權限是相同的第一個項目。你從外面合併(如果我理解的話)一個圖書館,這是允許的嗎?

+0

謝謝你的提示,但我終於找到了解決方案(見下文)。乾杯! – Kefik 2012-08-09 11:39:36