static void BuildMap() { InstructionMap = new Hashtable(); foreach (Code code in Enum.GetValues(typeof(Code))) { OpCode opcode = OpCodes.GetOpCode(code); InstructionInfo info = Find(opcode); InstructionMap[opcode] = info; } }
public static void Main() { Compiler compiler = new Compiler(); var result = compiler.Compile(File.ReadAllText(@"C:\Home\Projects\EcmaScript\EcmaScript.Compiler\test2.ts")); var list = new List <FunctionDefinition>(); foreach (FunctionDefinition function in result.Functions) { Console.WriteLine(".function " + function.Name); function.Body.Code.Position = 0; while (true) { var reader = new BinaryReader(function.Body.Code); ushort opCode = reader.ReadUInt16(); OpCode op = OpCodes.GetOpCode(opCode); Console.Write(op.Mnemonic); switch (op.OperandType) { case OperandType.MetadataToken: Console.Write(" "); Console.Write("T(" + reader.ReadInt32() + ")"); break; case OperandType.Integer: Console.Write(" "); Console.Write(reader.ReadInt32()); break; case OperandType.None: break; default: throw new NotImplementedException(); } Console.WriteLine(); if (reader.BaseStream.Length == reader.BaseStream.Position) { break; } } Console.WriteLine(); } Console.ReadLine(); }
protected void E(OpCode opCode) { ushort data = CodeReader.ReadUInt16(); if (opCode.Value != data) { Assert.Fail(string.Format("Expected: {0}. Actual: {1}", opCode.Mnemonic, OpCodes.GetOpCode(data).Mnemonic)); } }
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 { } }