private void ReadMethodBody(dynamic builder) { ILGenerator gen = builder.GetILGenerator(); var count = m_br.ReadInt32(); for(int i = 0; i < count; i++) { gen.DeclareLocal( ReadType(), m_br.ReadBoolean()); } while (true) { var opcode = (EOpCode)m_br.ReadByte(); if (opcode == EOpCode.Terminator) break; EArgumentType argType = EArgumentType.None; OpCode o = default(OpCode); if(opcode == EOpCode.Extended) { var eopcode = (EExtendedOpCode)m_br.ReadByte(); argType = eopcode.ArgFor(); o = Translate(eopcode); } else { argType = opcode.ArgFor(); o = Translate(opcode); } if (opcode == EOpCode.Call || opcode == EOpCode.Callvirt) { var m = ResolveMethod(m_br.ReadString()); if (m is MethodInfo) gen.EmitCall(o, m, null); else { if (opcode == EOpCode.Call) gen.Emit(OpCodes.Call, m); else gen.Emit(OpCodes.Calli, m); } } else if(opcode == EOpCode.Calli) { gen.Emit(OpCodes.Nop); } else { switch (argType) { case EArgumentType.Field: gen.Emit(o, ResolveField(m_br.ReadString())); break; case EArgumentType.Float32: gen.Emit(o, m_br.ReadSingle()); break; case EArgumentType.Float64: gen.Emit(o, m_br.ReadDouble()); break; case EArgumentType.Int32: gen.Emit(o, m_br.ReadInt32()); break; case EArgumentType.Int64: gen.Emit(o, m_br.ReadInt64()); break; case EArgumentType.Int8: gen.Emit(o, m_br.ReadSByte()); break; case EArgumentType.ListOfInt: //just read the items and don't emit a code var num = m_br.ReadUInt32(); for (; num > 0; num--) m_br.ReadInt32(); break; case EArgumentType.Method: gen.Emit(o, ResolveMethod(m_br.ReadString())); break; case EArgumentType.None: gen.Emit(o); break; case EArgumentType.String: gen.Emit(o, m_br.ReadString()); break; case EArgumentType.Token: gen.Emit(o, m_br.ReadInt32()); break; case EArgumentType.Type: gen.Emit(o, ResolveType(m_br.ReadString())); break; case EArgumentType.Uint16: gen.Emit(o, m_br.ReadUInt16()); break; case EArgumentType.Uint32: gen.Emit(o, m_br.ReadUInt32()); break; case EArgumentType.Uint8: gen.Emit(o, m_br.ReadByte()); break; } } } }