Laan's steps..

Feed Rss

flash中try catch的不同编译

06.25.2009, flash, by .

先看两端代码:

function aaa():void {
var bytes:ByteArray;
try{

} catch (e:Error){
}
}

以及:

function aaa():void {
var bytes:ByteArray;
}

然后看编译后,用硕思反编译看到的代码对应是:

function aaa() : void {
var bytes:ByteArray;
try{
}
catch (e:Error){
}
return;
}// end function

以及:

function aaa() : void {
var _loc_1:ByteArray;
return;
}// end function

看看加粗的部分代码,第一种情况下竟然临时变量的变量名被保存了。而实际上,临时变量在编译时,由于不会被域外(比如该方法域)引用,就不会将变量名编译到swf文件中,而是在运行时分配空间,直接使用,使用后释放空间。为什么什么出现这样的情况呢?

我解析了他们的指令集:
function aaa():void    /* disp_id 0*/
{
activation {
var test_fla::bytes:flash.utils::ByteArray    /* slot_id 1 */
}

// local_count=3 max_scope=5 max_stack=3 code_len=34
0       getlocal0
1       pushscope
2       newactivation
3       dup
4       setlocal1
5       pushscope
6       getscopeobject    1
8       pushnull
9       coerce            flash.utils::ByteArray
11      setslot           1

13      jump              L1

17      getlocal0
18      pushscope
19      getlocal1
20      pushscope
21      newcatch          0
23      dup
24      setlocal2
25      dup
26      pushscope
27      swap
28      setslot           1
30      popscope
31      kill              2

L1:
33      returnvoid
}

以及:

function aaa():void    /* disp_id 0*/
{
// local_count=2 max_scope=1 max_stack=1 code_len=7
0       getlocal0
1       pushscope
2       pushnull
3       coerce            flash.utils::ByteArray
5       setlocal1

6       returnvoid
}

主要的不同在于:在第一种方式下,会使用activation来保存变量,activation存在变量名;第二种情况是使用local空间存贮变量,及现开辟空间,没有变量名。而导致使用activation来保存变量的主要原因是try catch模块的使用。

说去try catch我又想起另外一个想不通的地方:

public function aaa():void {
var bytes:ByteArray;

try {
bytes = new ByteArray();
bytes.writeUTFBytes(“abc”);

throw new Error(“asdf”);
} catch (e:Error) {

}
trace(bytes);
}

调用方法aaa,竟然会输出abc出来。按我的理解,遭遇Error后,应该回滚啊,这样的话bytes还是没有初始化并赋值。后来到群里面一讨论,竟然都说是正常的~~ 汗,大学基础课上得也太失败了~~~

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>