Changeset 7732 for lang/actionscript
- Timestamp:
- 03/10/08 02:08:04 (5 years ago)
- Location:
- lang/actionscript/tinyaction/tavm
- Files:
-
- 4 modified
-
DatLoaderRequest.as (modified) (2 diffs)
-
ModuleData.as (modified) (2 diffs)
-
TACallFrameStack.as (modified) (4 diffs)
-
TAContext.as (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/actionscript/tinyaction/tavm/DatLoaderRequest.as
r7721 r7732 60 60 var rval:ModuleData = new ModuleData(); 61 61 62 rval.name = parseModuleName(); 62 63 rval.setConstantPool( parseConstantPool() ); 63 64 parseFuncEntries(rval); … … 65 66 return rval; 66 67 } 68 69 private function parseModuleName():String 70 { 71 var nm:String = nextLine(); 72 return nm; 73 } 67 74 68 75 private function parseConstantPool():Array 69 76 { 70 77 var flds:String = nextLine(); 71 return flds.split( / +/);78 return flds.split('\u0000'); 72 79 } 73 80 -
lang/actionscript/tinyaction/tavm/ModuleData.as
r7721 r7732 5 5 private var mFuncs:Array; 6 6 private var mConstantPool:Array; 7 private var mName:String; 8 private var mFuncBuf:TACodeBuffer; 7 9 8 10 function ModuleData() 9 11 { 10 12 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; 11 29 } 12 30 … … 14 32 { 15 33 mFuncs.push(f); 34 mFuncBuf.addFuncObject(f); 16 35 } 17 36 -
lang/actionscript/tinyaction/tavm/TACallFrameStack.as
r7477 r7732 7 7 private var mDataStack:TAStack; 8 8 private var mFuncStack:Array; 9 private var mReturn Stack:Array;9 private var mReturnVal:Object; 10 10 private var mReturnAddrStack:Array; 11 11 … … 22 22 mRegStack = new Array(); 23 23 mFuncStack = new Array(); 24 mReturn Stack = new Array();24 mReturnVal = undefined; 25 25 mDataStack = new TAStack(); 26 26 … … 42 42 mRegStack = new Array(); 43 43 mFuncStack = new Array(); 44 mReturn Stack = new Array();44 mReturnVal = undefined; 45 45 mDataStack.clear(); 46 46 … … 174 174 public function pushReturn(val:Object):void 175 175 { 176 mReturn Stack.push(val);176 mReturnVal = val; 177 177 } 178 178 179 179 public function popReturn():Object 180 180 { 181 return mReturnStack.pop(); 181 var ret:Object = mReturnVal; 182 mReturnVal = undefined; 183 return ret; 182 184 } 183 185 -
lang/actionscript/tinyaction/tavm/TAContext.as
r7477 r7732 25 25 26 26 27 private var mCodes:TACodeBuffer;28 27 private var mRegs:Array; 29 28 private var mConsts:Array; … … 42 41 mGlobal = null; 43 42 mConsts = null; 44 mCodes = new TACodeBuffer();45 43 mCallFrames = new TACallFrameStack(this); 46 44 } … … 58 56 return mGlobal.getByName(name); 59 57 } 60 61 public function get codeBuffer():TACodeBuffer62 {63 return mCodes;64 }65 58 66 59 public function get progCount():uint … … 94 87 public function returnVoid():void 95 88 { 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; 96 101 mCallFrames.popFrame(); 97 98 102 mCurBuf = mCallFrames.empty ? null : mCallFrames.currentFunction.bytecode; 99 103 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 } 111 108 } 112 109 … … 132 129 return; 133 130 //--------------------- 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 136 139 code = mCurBuf.readUnsignedByte(); 137 140 //profiles[code] = profiles[code] ? (profiles[code]+1) : 1; … … 192 195 break; 193 196 194 case 0x3e: 197 case 0x3e: // ret 195 198 { 196 199 val1 = mCallFrames.popData(); // return param 197 200 returnParam(val1); 198 return;201 continue; 199 202 } 200 203 break; … … 292 295 293 296 // 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); 295 298 // TATest.p(" ret= "+mCallFrames.topOfDataStack()); 296 299 } … … 375 378 } // switch 376 379 377 if (mCurBuf.bytesAvailable == 0)378 {379 returnVoid();380 381 if (mCallFrames.empty)382 {383 //TATest.p("execution has finished.");384 break;385 }386 }387 380 388 381 } // for loop … … 430 423 } 431 424 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 434 435 // 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 439 441 { 440 442 if (mConsts == null) 441 443 throw "constant pool must be set"; 442 444 443 var func_obj:Object = lookup_func(name);445 var func_obj:Object = obj.lookupFunction(name); 444 446 if (!func_obj) 445 447 throw "function not found: "+name; … … 527 529 } 528 530 529 private function lookup_func(name:String):Object530 {531 return mCodes.funcTable[name] || null;532 }533 534 535 531 private static function decodeIEEE754(a:Array, ofs:int):Number 536 532 {
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)