flash中try catch的不同编译
时间:2010-08-22 来源:ksqiance
转自http://www.laaan.cn/?p=905
先看两端代码:
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我又想起另外一个想不通的地方:

{
var bytes:ByteArray;
try
{
bytes = new ByteArray();
bytes.writeUTFBytes(”abc”);
throw new Error(”asdf”);
}
catch (e:Error)
{ }
trace(bytes);
}
调用方法aaa,竟然会输出abc出来。按我的理解,遭遇Error后,应该回滚啊,这样的话bytes还是没有初始化并赋值。后来到群里面一讨论,竟然都说是正常的~~ 汗,大学基础课上得也太失败了~~~