AS3Eval库抱怨“变量编译未定义”

时间:2012-08-09 11:05:08

标签: actionscript-3 flash

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

我的 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内部,所有ByteArrays都通过ByteLoader进行初始化和加载。

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

最佳, 的Jakub

2 个答案:

答案 0 :(得分: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真正加载代码,代码就会被加载。

希望这可以帮助处于相同情况的人。

最佳, 的Jakub

答案 1 :(得分:0)

您应该检查权限是否与第一个项目相同。你是从外面合并(如果我理解的话)一个图书馆,这是允许的吗?