internal void ParseTraits(ByteReader r, DoABCTag doabc) { uint __num_traits = r.GetUInt30(); for (uint __i = 0; __i < __num_traits; __i++) { try { uint __nIndex = r.GetUInt30(); //var name:* = names[nIndex]; uint __tag = r.GetByte(); uint __attributes = (__tag >> 4); uint __kind = (__tag & 0x0f); AS3_MemberInfo __member = null; switch (__kind) { case TRAIT_SLOT: case TRAIT_CONST: case TRAIT_CLASS: AS3_SlotInfo __slot = new AS3_SlotInfo(); __slot.id = r.GetUInt30(); slots[__slot.id] = __slot; if (__kind == TRAIT_SLOT || __kind == TRAIT_CONST) { __slot.type = doabc.Multinames[r.GetUInt30()]; uint __index = r.GetUInt30(); if (__index > 0) { //__slot.value = defaults[data.readByte()][index]; r.GetByte(); } } else // (kind == TRAIT_CLASS) { //slot.value = classes[readU32()]; r.GetUInt30(); } __member = __slot; break; case TRAIT_METHOD: case TRAIT_GETTER: case TRAIT_SETTER: uint disp_id = r.GetUInt30(); AS3_MethodInfo __method = doabc.MethodInfos[r.GetUInt30()]; __method.id = disp_id; methods[disp_id] = __method; __member = __method; break; default: break; } if (__member == null) { //this.log.errorPrint("error trait kind "+kind + "\r"); } else { __member.kind = __kind; //member.name = name; __member.nIndex = __nIndex; members[__i] = __member; //t.names[String(name)] = t.members[i] = member; if (__attributes > 0) { if ((__attributes & ATTR_METADATA) != 0) { __member.metadatas = new Dictionary <uint, AS3_Metadata>(); uint __metadataCount = r.GetUInt30(); for (uint __j = 0; __j < __metadataCount; __j++) { uint __metaindex = r.GetUInt30(); try { __member.metadatas[__j] = doabc.MetaDatas[__metaindex]; } catch { } } } if ((__attributes & ATTR_FINAL) != 0) { __member.isFinal = true; } if ((__attributes & ATTR_OVERRIDE) != 0) { __member.isOverride = true; } if ((__attributes & ATTR_PUBLIC) != 0) { __member.isPublic = true; } } } } catch (Exception __e) { return; } } }
internal void ParseCode(DoABCTag doabc) { if (doabc.Strings.ContainsValue("CURRENT_VERSION")) { } try { while (_byteReader.LeftBytes > 0) { byte __opcode = _byteReader.GetByte(); if (OpCodes.Exists(__opcode)) { OpCode __OpCode = OpCodes.GetOpCode(__opcode); char[] __parameters = __OpCode.parameters.ToCharArray(); __OpCode.datas = new object[__parameters.Length]; for (int __i = 0; __i < __parameters.Length; __i++) { object data = null; char __parameter = __parameters[__i]; if (__parameter == 'n') // generic integer { data = _byteReader.GetInt30(); } else if (__parameter == '2') //multiname { data = doabc.Multinames[_byteReader.GetUInt30()]; } else if (__parameter == 'N') //namespace { data = doabc.Namespaces[_byteReader.GetUInt30()]; } else if (__parameter == 'U') //uint { data = doabc.UIntegers[_byteReader.GetUInt30()]; } else if (__parameter == 'I') //int { data = doabc.Integers[_byteReader.GetUInt30()]; } else if (__parameter == 'f') //double { data = doabc.Doubles[_byteReader.GetUInt30()]; } else if (__parameter == 'm') //method { data = doabc.MethodInfos[_byteReader.GetUInt30()]; } else if (__parameter == 'c') //classinfo { data = doabc.Classes[_byteReader.GetUInt30()]; } else if (__parameter == 'i') //methodbody { _byteReader.GetUInt30(); //data = array_getvalue(file->method_bodies, swf_GetU30(tag)); } else if (__parameter == 'u') // generic uinteger { data = _byteReader.GetInt30(); } else if (__parameter == 'r') // local register { data = _byteReader.GetInt30(); } else if (__parameter == 'b') // byte { data = _byteReader.GetByte(); } else if (__parameter == 'j') // jump { data = _byteReader.GetU24(); } else if (__parameter == 's') // string { data = doabc.Strings[_byteReader.GetUInt30()]; } else if (__parameter == 'D') // debug { /*type, usually 1*/ byte __type = _byteReader.GetByte(); if (__type != 1) { //fprintf(stderr, "Unknown debug type: %02x\n", type); } /*register name*/ //code->data[0] = strdup((char*)pool_lookup_string(pool, swf_GetU30(tag))); _byteReader.GetUInt30(); /*register index*/ //code->data[1] = (void*)(ptroff_t)swf_GetU8(tag); _byteReader.GetByte(); /*unused*/ _byteReader.GetUInt30(); } else if (__parameter == 'S') // switch statement { uint __def = _byteReader.GetU24(); uint __targets_number = _byteReader.GetUInt30(); for (uint __j = 0; __j < __targets_number; __j++) { uint __target = _byteReader.GetU24(); } /* * lookupswitch_t* l = malloc(sizeof(lookupswitch_t)); * l->def = (code_t*)(ptroff_t)swf_GetS24(tag); * l->targets = list_new(); * int num = swf_GetU30(tag) + 1; * int t; * for (t = 0; t < num; t++) * list_append(l->targets, (code_t*)(ptroff_t)swf_GetS24(tag)); * data = l; * */ } else { //printf("Can't parse opcode param type \"%c\" (for op %02x %s).\n", *p, code->opcode, op->name); return; } __OpCode.datas[__i] = data; //code->data[pos++] = data; } Codes.Add(__OpCode); } else { } } if (Codes.Count > 0 && doabc.Strings.ContainsValue("CURRENT_VERSION")) { for (int __i = 0; __i < Codes.Count; __i++) { Console.WriteLine(__i.ToString("00000") + ") " + Codes[__i].name); } } } catch { } }