チェンジセット 412: as3/ByteCodeDisassembler/org
- コミット日時:
- 2008/05/17 00:18:54 (4 年前)
- ファイル:
-
- as3/ByteCodeDisassembler/org/libspark/disassemble/ByteStream.as (更新) (1 diff)
- as3/ByteCodeDisassembler/org/libspark/disassemble/abc/AbcParser.as (更新) (22 diffs)
- as3/ByteCodeDisassembler/org/libspark/disassemble/abc/ClassPrinter.as (追加)
- as3/ByteCodeDisassembler/org/libspark/disassemble/abc/ConstantPool.as (更新) (11 diffs)
- as3/ByteCodeDisassembler/org/libspark/disassemble/abc/MultiName.as (更新) (1 diff)
- as3/ByteCodeDisassembler/org/libspark/disassemble/abc/NS.as (追加)
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
as3/ByteCodeDisassembler/org/libspark/disassemble/ByteStream.as
r299 r412 34 34 public function readU32():uint 35 35 { 36 var result:uint = 0; 37 var byte:uint = readU8(); 38 result |= byte & 0x7f; 39 var shift:uint = 0; 40 while ((byte & 0x80) != 0x00) { 41 byte = readU8(); 42 ++shift; 43 result |= (byte & 0x7f) << (7 * shift); 36 var result:uint = readU8(); 37 if ((result & 0x00000080) == 0) { 38 return result; 44 39 } 45 return result; 40 result = (result & 0x0000007f) | readU8() << 7; 41 if ((result & 0x00004000) == 0) { 42 return result; 43 } 44 result = (result & 0x00003fff) | readU8() << 14; 45 if ((result & 0x00200000) == 0) { 46 return result; 47 } 48 result = (result & 0x001fffff) | readU8() << 21; 49 if ((result & 0x10000000) == 0) { 50 return result; 51 } 52 return (result & 0x0fffffff) | readU8() << 28; 46 53 } 47 54 as3/ByteCodeDisassembler/org/libspark/disassemble/abc/AbcParser.as
r299 r412 96 96 for (p = 0; p < paramCount; ++p) { 97 97 params[p] = constantPool.getString(paramNames[p]) + ':' + 98 (paramTypes[p] != 0 ? constantPool.get QName(paramTypes[p]) : '*');98 (paramTypes[p] != 0 ? constantPool.getMultiName(paramTypes[p]) : '*'); 99 99 } 100 100 } … … 102 102 for (p = 0; p < paramCount; ++p) { 103 103 params[p] = '$' + p + ':' + 104 (paramTypes[p] != 0 ? constantPool.get QName(paramTypes[p]) : '*');104 (paramTypes[p] != 0 ? constantPool.getMultiName(paramTypes[p]) : '*'); 105 105 } 106 106 } … … 124 124 buf += '(' + params.join(',') + ')'; 125 125 if (type != 0) { 126 buf += ':' + constantPool.get QName(type);126 buf += ':' + constantPool.getMultiName(type); 127 127 } 128 128 else { … … 135 135 for each (var paramType:uint in paramTypes) { 136 136 if (paramType != 0) { 137 buf += 'type(' + constantPool.get QName(paramType) + ')';137 buf += 'type(' + constantPool.getMultiName(paramType) + ')'; 138 138 } 139 139 else { … … 143 143 buf += ')'; 144 144 if (type != 0) { 145 buf += 'return(' + constantPool.get QName(type) + ')'145 buf += 'return(' + constantPool.getMultiName(type) + ')' 146 146 } 147 147 else { … … 198 198 var name:uint = stream.readU32(); 199 199 var kind:uint = stream.readU8(); 200 var slotID:uint = stream.readU32();201 200 var tag:uint = kind & 0x0f; 202 var flags:uint = tag>>> 4;203 buf += "\n" + ' ' + i + ':name(' + constantPool.getFixQName(name) + ')tag(';201 var flags:uint = kind >>> 4; 202 buf += "\n" + ' ' + i + ':name(' + name + ':' + constantPool.getMultiName(name) + ')tag('; 204 203 switch (tag) { 205 204 case 0: // var … … 210 209 } 211 210 buf += ')'; 211 var slotID:uint = stream.readU32(); 212 212 var typeId:uint = stream.readU32(); 213 213 var valueId:uint = stream.readU32(); 214 buf += 'slot(' + slotID + ')type(' + constantPool.get QName(typeId) + ')';214 buf += 'slot(' + slotID + ')type(' + constantPool.getMultiName(typeId) + ')'; 215 215 if (valueId != 0) { 216 var valueKind:uint = stream.readU 32();216 var valueKind:uint = stream.readU8(); 217 217 buf += 'value(' + constantPool.getValue(valueId, valueKind) + ')'; 218 218 } … … 232 232 buf += ((flags & 1) != 0 ? 'final' : 'virtual') + ':'; 233 233 buf += ((flags & 2) != 0 ? 'override' : 'new') + ')'; 234 var dispID:uint = stream.readU32(); 234 235 var methodInfo:uint = stream.readU32(); 235 buf += 'display(' + slotID + ')info(' + methodInfo + ')';236 buf += 'display(' + dispID + ')info(' + methodInfo + ')'; 236 237 break; 237 238 case 4: // class 238 239 buf += 'class)'; 240 var slotID:uint = stream.readU32(); 239 241 var classId:uint = stream.readU32(); 240 242 buf += 'slot(' + slotID + ')class(' + classId + ')'; … … 242 244 case 5: // function 243 245 buf += 'func)'; 246 var slotID:uint = stream.readU32(); 244 247 var methodInfo:uint = stream.readU32(); 245 248 buf += 'slot(' + slotID + ')?(' + methodInfo + ')'; 246 249 break; 247 250 default: 251 buf += tag + ')'; 248 252 break; 249 253 } … … 283 287 if (isInterface) flagList.push('interface'); 284 288 var hasProtected:Boolean = (flags & 8) != 0; 285 buf += 'name(' + constantPool.get QName(name) + ')super(' + constantPool.getQName(superName) + ')';289 buf += 'name(' + constantPool.getMultiName(name) + ')super(' + constantPool.getMultiName(superName) + ')'; 286 290 buf += 'flags(' + flagList.join(':') + ')'; 287 291 if (hasProtected) { 288 292 var protectedNamespace:uint = stream.readU32(); 289 buf += 'protected(' + constantPool.getNamespace Name(protectedNamespace) + ')';293 buf += 'protected(' + constantPool.getNamespace(protectedNamespace) + ')'; 290 294 } 291 295 buf += '))'; … … 440 444 break; 441 445 case 34: 442 pushCode('PushConstant', cp.get GeneralMultiName(stream.readU32()));446 pushCode('PushConstant', cp.getMultiName(stream.readU32())); 443 447 break; 444 448 case 44: … … 446 450 break; 447 451 case 49: 448 pushCode('PushNamespace', cp.getNamespace Name(stream.readU32()));452 pushCode('PushNamespace', cp.getNamespace(stream.readU32())); 449 453 break; 450 454 case 46: … … 500 504 break; 501 505 case 69: 502 pushCode('CallSuper', cp.get GeneralMultiName(stream.readU32()), 'argc:' + stream.readU32());506 pushCode('CallSuper', cp.getMultiName(stream.readU32()), 'argc:' + stream.readU32()); 503 507 break; 504 508 case 73: … … 506 510 break; 507 511 case 70: 508 pushCode('CallProperty', cp.get GeneralMultiName(stream.readU32()), 'argc:' + stream.readU32());512 pushCode('CallProperty', cp.getMultiName(stream.readU32()), 'argc:' + stream.readU32()); 509 513 break; 510 514 case 76: 511 pushCode('CallPropertyLex', cp.get GeneralMultiName(stream.readU32()), 'argc:' + stream.readU32());515 pushCode('CallPropertyLex', cp.getMultiName(stream.readU32()), 'argc:' + stream.readU32()); 512 516 break; 513 517 case 74: 514 pushCode('ConstructProperty', cp.get GeneralMultiName(stream.readU32()), 'argc:' + stream.readU32());518 pushCode('ConstructProperty', cp.getMultiName(stream.readU32()), 'argc:' + stream.readU32()); 515 519 break; 516 520 case 78: 517 pushCode('CallSuperVoid', cp.get GeneralMultiName(stream.readU32()), 'argc:' + stream.readU32());521 pushCode('CallSuperVoid', cp.getMultiName(stream.readU32()), 'argc:' + stream.readU32()); 518 522 break; 519 523 case 79: 520 pushCode('CallPropertyVoid', cp.get GeneralMultiName(stream.readU32()), 'argc:' + stream.readU32());524 pushCode('CallPropertyVoid', cp.getMultiName(stream.readU32()), 'argc:' + stream.readU32()); 521 525 break; 522 526 case 71: … … 575 579 break; 576 580 case 102: 577 pushCode('GetProperty', cp.get GeneralMultiName(stream.readU32()));581 pushCode('GetProperty', cp.getMultiName(stream.readU32())); 578 582 break; 579 583 case 4: 580 pushCode('GetSuper', cp.get GeneralMultiName(stream.readU32()));584 pushCode('GetSuper', cp.getMultiName(stream.readU32())); 581 585 break; 582 586 case 89: 583 pushCode('GetDescendants', cp.get GeneralMultiName(stream.readU32()));587 pushCode('GetDescendants', cp.getMultiName(stream.readU32())); 584 588 break; 585 589 case 91: … … 587 591 break; 588 592 case 106: 589 pushCode('DeleteProperty', cp.get GeneralMultiName(stream.readU32()));593 pushCode('DeleteProperty', cp.getMultiName(stream.readU32())); 590 594 break; 591 595 case 97: 592 pushCode('SetProperty', cp.get GeneralMultiName(stream.readU32()));596 pushCode('SetProperty', cp.getMultiName(stream.readU32())); 593 597 break; 594 598 case 104: 595 pushCode('InitProperty', cp.get GeneralMultiName(stream.readU32()));599 pushCode('InitProperty', cp.getMultiName(stream.readU32())); 596 600 break; 597 601 case 5: 598 pushCode('SetSuper', cp.get GeneralMultiName(stream.readU32()));602 pushCode('SetSuper', cp.getMultiName(stream.readU32())); 599 603 break; 600 604 case 28: … … 650 654 break; 651 655 case 128: 652 pushCode('Coerce', cp.get GeneralMultiName(stream.readU32()));656 pushCode('Coerce', cp.getMultiName(stream.readU32())); 653 657 break; 654 658 case 129: … … 671 675 break; 672 676 case 134: 673 pushCode('AsType', cp.get GeneralMultiName(stream.readU32()));677 pushCode('AsType', cp.getMultiName(stream.readU32())); 674 678 break; 675 679 case 135: … … 755 759 break; 756 760 case 6: 757 pushCode('DefaultXMLNamespace', cp.get GeneralMultiName(stream.readU32()));761 pushCode('DefaultXMLNamespace', cp.getMultiName(stream.readU32())); 758 762 break; 759 763 case 7: … … 789 793 break; 790 794 case 94: 791 pushCode('FindProperty', cp.get GeneralMultiName(stream.readU32()));795 pushCode('FindProperty', cp.getMultiName(stream.readU32())); 792 796 break; 793 797 case 93: 794 pushCode('FindPropertyStrict', cp.get GeneralMultiName(stream.readU32()));798 pushCode('FindPropertyStrict', cp.getMultiName(stream.readU32())); 795 799 break; 796 800 case 95: 797 pushCode('FindDef', cp.get GeneralMultiName(stream.readU32()));801 pushCode('FindDef', cp.getMultiName(stream.readU32())); 798 802 break; 799 803 case 96: 800 pushCode('GetLex', cp.get GeneralMultiName(stream.readU32()));804 pushCode('GetLex', cp.getMultiName(stream.readU32())); 801 805 break; 802 806 case 179: … … 804 808 break; 805 809 case 178: 806 pushCode('IsType', cp.get GeneralMultiName(stream.readU32()));810 pushCode('IsType', cp.getMultiName(stream.readU32())); 807 811 break; 808 812 case 180: … … 836 840 pushCode('TimeStamp'); 837 841 break; 842 case 83: 843 pushCode('ApplyType'); 844 break; 838 845 default: 839 846 pushCode('Code:' + opCode); as3/ByteCodeDisassembler/org/libspark/disassemble/abc/ConstantPool.as
r299 r412 124 124 case 18: 125 125 break; 126 case 29: 127 input.readU32(); 128 var l:uint = input.readU32(); 129 for (var ti:uint = 0; ti < l; ++ti) { 130 input.readU32(); 131 } 132 break; 126 133 default: 127 134 throw new VerifyError('Invalid constant type:' + kind); … … 182 189 } 183 190 184 public function getNamespaceName(index:uint):String 185 { 186 if (index == 0) { 187 return null; 188 } 189 var pos:uint = namespaceIndices[index]; 190 var current:uint = input.position; 191 input.seek(pos); 192 var kind:uint = input.readU8(); 193 var value:String; 194 switch (kind) { 195 case 5: 196 case 8: 197 case 22: 198 case 23: 199 case 24: 200 case 25: 201 case 26: 202 value = getString(input.readU32()); 203 break; 204 default: 205 throw new VerifyError('constant pool index ' + index + ' is not a Namespace type.'); 206 } 207 input.seek(current); 208 return value; 209 } 210 211 public function getFixNamespaceName(index:uint):String 191 public function getNamespace(index:uint):NS 212 192 { 213 193 if (index == 0) { … … 230 210 break; 231 211 case 26: // Static Protected Namespace 232 value = 'static ::protected';212 value = 'static.protected'; 233 213 break; 234 214 case 22: // Package Namespace … … 243 223 } 244 224 var name:String = getString(input.readU32()); 245 if (name != null && name != '') { 246 if (value.length) { 247 value = value + '::' + name; 248 } 249 else { 250 value = name; 251 } 252 } 253 input.seek(current); 254 return value; 225 input.seek(current); 226 return new NS(value, name); 255 227 } 256 228 … … 266 238 var value:Array = new Array(count); 267 239 for (var i:uint = 0; i < count; ++i) { 268 value[i] = getNamespaceName(input.readU32()); 269 } 270 input.seek(current); 271 return value; 272 } 273 274 public function getQName(index:uint):QName 275 { 276 if (index == 0) { 277 return null; 278 } 279 var pos:uint = multinameIndices[index]; 280 var current:uint = input.position; 281 input.seek(pos); 282 var kind:uint = input.readU8(); 283 var value:QName; 284 switch (kind) { 285 case 7: // QName (hoge) 286 case 13: // QName Attribute (@hoge) 287 var namespaceIndex:uint = input.readU32(); 288 var nameIndex:uint = input.readU32(); 289 value = createQName(getNamespaceName(namespaceIndex), getString(nameIndex)); 290 break; 291 default: 292 throw new VerifyError('constant pool index ' + index + ' is not a QName type.'); 293 } 294 input.seek(current); 295 return value; 296 } 297 298 public function getFixQName(index:uint):QName 299 { 300 if (index == 0) { 301 return null; 302 } 303 var pos:uint = multinameIndices[index]; 304 var current:uint = input.position; 305 input.seek(pos); 306 var kind:uint = input.readU8(); 307 var value:QName; 308 switch (kind) { 309 case 7: // QName (hoge) 310 case 13: // QName Attribute (@hoge) 311 var namespaceIndex:uint = input.readU32(); 312 var nameIndex:uint = input.readU32(); 313 value = createQName(getFixNamespaceName(namespaceIndex), getString(nameIndex)); 314 break; 315 default: 316 throw new VerifyError('constant pool index ' + index + ' is not a QName type.'); 317 } 318 input.seek(current); 319 return value; 320 } 321 322 public function getMultiName(index:uint):MultiName 323 { 324 if (index == 0) { 325 return null; 326 } 327 var pos:uint = multinameIndices[index]; 328 var current:uint = input.position; 329 input.seek(pos); 330 var kind:uint = input.readU8(); 331 var value:MultiName; 332 switch (kind) { 333 case 9: // Multiname (hoge) 334 case 14: // Multiname Attribute (@hoge) 335 var name:String = getString(input.readU32()); 336 var namespaces:Array = getNamespaceSet(input.readU32()); 337 value = createMultiName(name, namespaces); 338 break; 339 default: 340 throw new VerifyError('constant pool index ' + index + ' is not a MultiName type.'); 341 } 342 input.seek(current); 343 return value; 344 } 345 346 public function getGeneralMultiName(index:uint):* 240 value[i] = getNamespace(input.readU32()); 241 } 242 input.seek(current); 243 return value; 244 } 245 246 public function getMultiName(index:uint):* 347 247 { 348 248 if (index == 0) { … … 358 258 var namespaceIndex:uint = input.readU32(); 359 259 var nameIndex:uint = input.readU32(); 360 var valueQName: QName = createQName(getNamespaceName(namespaceIndex), getString(nameIndex));260 var valueQName:MultiName = createQName(getNamespace(namespaceIndex), getString(nameIndex)); 361 261 input.seek(current); 362 262 return valueQName; 263 case 29: 264 var mn:MultiName = getMultiName(input.readU32()); 265 var l:uint = input.readU32(); 266 var paramTypes:Array = new Array(l); 267 for (var ti:uint = 0; ti < l; ++ti) { 268 paramTypes[ti] = getMultiName(input.readU32()); 269 } 270 var mnt:MultiName = createMultiName(mn.name, mn.namespaces, paramTypes); 271 input.seek(current); 272 return mnt; 363 273 case 9: // Multiname (hoge) 364 274 case 14: // Multiname Attribute (@hoge) … … 387 297 default: 388 298 input.seek(current); 389 throw new VerifyError('constant pool index ' + index + ' is not a QName type .');299 throw new VerifyError('constant pool index ' + index + ' is not a QName type (' + kind + ').'); 390 300 } 391 301 } … … 405 315 case 6: // Constant Double 406 316 return getDouble(index); 407 case 7: // QName408 case 13: // QName Attribute409 return getQName(index);410 317 case 5: // Private Namespace 411 318 case 8: // Namespace … … 415 322 case 25: 416 323 case 26: // Static Protected Namespace 417 return getNamespaceName(index); 324 return getNamespace(index); 325 case 7: // QName 326 case 13: // QName Attribute 327 case 29: // TypeName 418 328 case 9: // Multiname 419 329 case 14: // Multiname Attribute 330 case 15: // Runtime QName 331 case 16: // Runtime QName Attribute 420 332 return getMultiName(index); 421 333 case 10: // Constant False … … 425 337 case 12: // Constant Null 426 338 return null; 427 case 15: // Runtime QName428 case 16: // Runtime QName Attribute429 return getGeneralMultiName(index);430 339 case 17: // Runtime QName Late 431 340 return 'RuntimeQNameLate'; … … 443 352 } 444 353 445 private function createQName(n amespace:String, name:String):QName446 { 447 return new QName(new Namespace(namespace), name);448 } 449 450 private function createMultiName(name:String, namespaces:Array ):MultiName451 { 452 return new MultiName(name, namespaces );354 private function createQName(ns:NS, name:String):MultiName 355 { 356 return createMultiName(name, [ns]); 357 } 358 359 private function createMultiName(name:String, namespaces:Array, typeParams:Array = null):MultiName 360 { 361 return new MultiName(name, namespaces, typeParams); 453 362 } 454 363 } as3/ByteCodeDisassembler/org/libspark/disassemble/abc/MultiName.as
r299 r412 3 3 public class MultiName 4 4 { 5 private var name_:String; 6 private var namespaces_:Array; 5 public function MultiName(name:String, namespaces:Array, typeParams:Array = null) 6 { 7 _name = name; 8 _namespaces = namespaces; 9 _typeParams = typeParams || []; 10 } 7 11 8 public function MultiName(name:String, namespaces:Array) 9 { 10 name_ = name; 11 namespaces_ = namespaces; 12 } 12 private var _name:String; 13 private var _namespaces:Array; 14 private var _typeParams:Array; 13 15 14 16 public function get name():String 15 17 { 16 return name_; 18 return _name; 19 } 20 21 public function get namespace():NS 22 { 23 return _namespaces[0]; 17 24 } 18 25 19 26 public function get namespaces():Array 20 27 { 21 return namespaces_; 28 return _namespaces; 29 } 30 31 public function get typeParameters():Array 32 { 33 return _typeParams; 22 34 } 23 35 24 36 public function toString():String 25 37 { 26 var result:String = namespaces_.join(',');38 var result:String = _namespaces.join(','); 27 39 if (result != '') { 28 40 result += '::'; 29 41 } 30 result += name_; 42 result += _name; 43 if (typeParameters.length > 0) { 44 result += '.<' + typeParameters.join(',') + '>'; 45 } 31 46 return result; 32 47 }

