【问题标题】:AS3Eval library is complaining about "Variable compile is not defined"AS3Eval 库抱怨“未定义变量编译”
【发布时间】:2012-08-09 11:05:08
【问题描述】:

我正在使用 FlashBuilder 4.6 并使用来自:http://eval.hurlant.com/

AS3Eval v0.3 库

该库在我的 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 时出现问题。

我已经检查了两个项目(它们使用同一个库......但仍然检查)通过成功加载 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 类使用 [Embed](查看库代码)嵌入到 SWC 中,并且所有 ByteArray 在这两种情况下都通过 ByteLoader 进行初始化和加载。

到目前为止,我还没有找到任何线索,为什么编译对我的第一个项目有效,而对另一个项目无效。有没有人有类似的经历或提示可能导致问题的原因?

最好, 雅库布

【问题讨论】:

    标签: actionscript-3 flash


    【解决方案1】:

    哈!

    我太绝望了,找到了解决办法。

    看来,CompiledESC 不能在它被创建的同一帧中使用


    换句话说,这样的事情行不通

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

    以下代码将起作用(应用程序加载、初始化 CompileESC,然后用户单击 RUN! 按钮,这发生在与创建 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 加载其字节码的方式有关。当您尝试将一些代码插入 VM 并在同一框架中使用它时,您是在自找麻烦,因为您的代码尚未加载。你必须“让出”线程并等待另一个帧,在 Tamarin ESC 代码之间的某个地方被加载。

    请注意,这同样适用于您通过 ByteBuffer 加载的编译代码!每当你做类似的事情时

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

    不要期望 myAS3Code 会立即执行。同样,只要您“让出”线程并让 VM 真正加载您的代码,代码就会被加载。

    希望这对处于相同情况的人有所帮助。

    最好, 雅库布

    【讨论】:

      【解决方案2】:

      您应该检查权限是否与第一个项目相同。您正在合并(如果我理解正确的话)来自外部的库,是否允许?

      【讨论】:

      • 感谢您的提示,但我终于找到了解决方案(见下文)。干杯!
      猜你喜欢
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 2011-04-28
      相关资源
      最近更新 更多