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;
                    }
                }
            }
        }