flash中try catch的不同编译

转自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我又想起另外一个想不通的地方:

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还是没有初始化并赋值。后来到群里面一讨论,竟然都说是正常的~~ 汗,大学基础课上得也太失败了~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值