Changeset 7732 for lang/actionscript

Show
Ignore:
Timestamp:
03/10/08 02:08:04 (5 years ago)
Author:
gyuque
Message:

tinyaction: fixed call/ret

Location:
lang/actionscript/tinyaction/tavm
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • lang/actionscript/tinyaction/tavm/DatLoaderRequest.as

    r7721 r7732  
    6060                        var rval:ModuleData = new ModuleData(); 
    6161                         
     62                        rval.name = parseModuleName(); 
    6263                        rval.setConstantPool( parseConstantPool() ); 
    6364                        parseFuncEntries(rval); 
     
    6566                        return rval; 
    6667                } 
     68 
     69                private function parseModuleName():String 
     70                { 
     71                        var nm:String = nextLine(); 
     72                        return nm; 
     73                } 
    6774                 
    6875                private function parseConstantPool():Array 
    6976                { 
    7077                        var flds:String = nextLine(); 
    71                         return flds.split(/ +/); 
     78                        return flds.split('\u0000'); 
    7279                } 
    7380                 
  • lang/actionscript/tinyaction/tavm/ModuleData.as

    r7721 r7732  
    55                private var mFuncs:Array; 
    66                private var mConstantPool:Array; 
     7                private var mName:String; 
     8                private var mFuncBuf:TACodeBuffer; 
    79                 
    810                function ModuleData() 
    911                { 
    1012                        mFuncs = []; 
     13                        mFuncBuf = new TACodeBuffer(); 
     14                } 
     15                 
     16                public function lookupFunction(nm:String):Object 
     17                { 
     18                        return mFuncBuf.funcTable[nm]; 
     19                } 
     20                 
     21                public function set name(nm:String):void 
     22                { 
     23                        mName = nm; 
     24                } 
     25                 
     26                public function get name():String 
     27                { 
     28                        return mName; 
    1129                } 
    1230                 
     
    1432                { 
    1533                        mFuncs.push(f); 
     34                        mFuncBuf.addFuncObject(f); 
    1635                } 
    1736                 
  • lang/actionscript/tinyaction/tavm/TACallFrameStack.as

    r7477 r7732  
    77                private var mDataStack:TAStack; 
    88                private var mFuncStack:Array; 
    9                 private var mReturnStack:Array; 
     9                private var mReturnVal:Object; 
    1010                private var mReturnAddrStack:Array; 
    1111                 
     
    2222                        mRegStack        = new Array(); 
    2323                        mFuncStack       = new Array(); 
    24                         mReturnStack     = new Array(); 
     24                        mReturnVal       = undefined; 
    2525                        mDataStack       = new TAStack(); 
    2626                         
     
    4242                        mRegStack        = new Array(); 
    4343                        mFuncStack       = new Array(); 
    44                         mReturnStack     = new Array(); 
     44                        mReturnVal       = undefined; 
    4545                        mDataStack.clear(); 
    4646                         
     
    174174                public function pushReturn(val:Object):void 
    175175                { 
    176                         mReturnStack.push(val); 
     176                        mReturnVal = val; 
    177177                } 
    178178 
    179179                public function popReturn():Object 
    180180                { 
    181                         return mReturnStack.pop(); 
     181                        var ret:Object = mReturnVal; 
     182                        mReturnVal = undefined; 
     183                        return ret; 
    182184                } 
    183185                 
  • lang/actionscript/tinyaction/tavm/TAContext.as

    r7477 r7732  
    2525                 
    2626                 
    27                 private var mCodes:TACodeBuffer; 
    2827                private var mRegs:Array; 
    2928                private var mConsts:Array; 
     
    4241                        mGlobal     = null; 
    4342                        mConsts     = null; 
    44                         mCodes      = new TACodeBuffer(); 
    4543                        mCallFrames = new TACallFrameStack(this); 
    4644                } 
     
    5856                        return mGlobal.getByName(name); 
    5957                }                
    60                  
    61                 public function get codeBuffer():TACodeBuffer 
    62                 { 
    63                         return mCodes; 
    64                 } 
    6558                 
    6659                public function get progCount():uint 
     
    9487                public function returnVoid():void 
    9588                { 
     89                        returnParam(undefined); 
     90                } 
     91 
     92                public function returnParam(val:Object):void 
     93                { 
     94                        mCallFrames.pushReturn(val); 
     95                        resume(); 
     96                } 
     97                 
     98                public function resume():void 
     99                { 
     100                        var retaddr:int = mCallFrames.returnAddress; 
    96101                        mCallFrames.popFrame(); 
    97                          
    98102                        mCurBuf = mCallFrames.empty ? null : mCallFrames.currentFunction.bytecode; 
    99103                        if (mCurBuf != null) 
    100                                 mCurBuf.position = mCallFrames.returnAddress; 
    101                 } 
    102  
    103                 public function returnParam(val:Object):void 
    104                 { 
    105                         mCallFrames.popFrame(); 
    106                         mCallFrames.pushReturn(val); 
    107                          
    108                         mCurBuf = mCallFrames.empty ? null : mCallFrames.currentFunction.bytecode; 
    109                         if (mCurBuf != null) 
    110                                 mCurBuf.position = mCallFrames.returnAddress; 
     104                        { 
     105                                mCurBuf.position = retaddr; 
     106                                mCallFrames.pushData( popLastReturnValue() ); 
     107                        } 
    111108                } 
    112109                 
     
    132129                                return; 
    133130                        //--------------------- 
    134                         for (var count:uint = 0;count < max;count++) 
    135                         { 
     131                        for (var count:uint = 0;count < max && (mCurBuf != null);count++) 
     132                        { 
     133                                if (mCurBuf.bytesAvailable == 0) 
     134                                { 
     135                                        returnVoid(); 
     136                                        continue; 
     137                                } 
     138                                 
    136139                                code = mCurBuf.readUnsignedByte(); 
    137140                                //profiles[code] = profiles[code] ? (profiles[code]+1) : 1; 
     
    192195                                        break; 
    193196                                 
    194                                 case 0x3e: 
     197                                case 0x3e: // ret 
    195198                                        { 
    196199                                                val1 = mCallFrames.popData(); // return param 
    197200                                                returnParam(val1); 
    198                                                 return; 
     201                                                continue; 
    199202                                        } 
    200203                                        break; 
     
    292295                                                 
    293296//                                      TATest.p("  call method '"+name+"' of "+val1+" with "+cm_arg_count+"args"); 
    294                                                 mCallFrames.pushData( doCallMethod(val1, name, cm_args) ); 
     297                                                doCallMethod(val1, name, cm_args); 
    295298//                                      TATest.p("  ret= "+mCallFrames.topOfDataStack()); 
    296299                                        } 
     
    375378                                } // switch 
    376379                                 
    377                                 if (mCurBuf.bytesAvailable == 0) 
    378                                 { 
    379                                         returnVoid(); 
    380                                          
    381                                         if (mCallFrames.empty) 
    382                                         { 
    383                                                 //TATest.p("execution has finished."); 
    384                                                 break; 
    385                                         } 
    386                                 } 
    387380                                 
    388381                        } // for loop 
     
    430423                } 
    431424                 
    432                 private function doCallMethod(obj:Object, name:String, args:Array):Object 
    433                 { 
     425                private function doCallMethod(obj:Object, name:String, args:Array):void 
     426                { 
     427                        if (obj is ModuleData) 
     428                        { 
     429                                // script function 
     430                                callFunctionImmediately(obj, name, args); 
     431                                // return value will be pushed while execution 
     432                                return; 
     433                        } 
     434                         
    434435                        // native method 
    435                         return obj[name].apply(obj, args); 
    436                 } 
    437                  
    438                 public function callFunctionImmediately(name:String, args:Array):void 
     436                        mCallFrames.pushData( obj[name].apply(obj, args) ); 
     437                        // push return value here. 
     438                } 
     439                 
     440                public function callFunctionImmediately(obj:Object, name:String, args:Array):void 
    439441                { 
    440442                        if (mConsts == null) 
    441443                                throw "constant pool must be set"; 
    442444                         
    443                         var func_obj:Object = lookup_func(name); 
     445                        var func_obj:Object = obj.lookupFunction(name); 
    444446                        if (!func_obj) 
    445447                                throw "function not found: "+name; 
     
    527529                } 
    528530                 
    529                 private function lookup_func(name:String):Object 
    530                 { 
    531                         return mCodes.funcTable[name] || null; 
    532                 } 
    533                  
    534                  
    535531                private static function decodeIEEE754(a:Array, ofs:int):Number 
    536532                {