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

posted on 2010-08-22 11:44  ksqiance  阅读(352)  评论(0编辑  收藏  举报