我正在使用 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
答案 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)
您应该检查权限是否与第一个项目相同。你是从外面合并(如果我理解的话)一个图书馆,这是允许的吗?