1

我正在使用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: Error #1065: Variable compile is not defined。

该错误是指 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 进行初始化和加载。

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

最好的,雅库布

4

2 回答 2

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 真正加载您的代码,代码就会被加载。

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

最好的,雅库布

于 2012-08-09T11:39:01.947 回答
0

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

于 2012-08-09T11:16:11.937 回答