示例#1
0
 internal void LoadFirstArgAddress(TypeWrapper tw)
 {
     ilgen.EmitLdarg(0);
     if (tw.IsGhost)
     {
         tw.EmitConvStackTypeToSignatureType(ilgen, null);
         CodeEmitterLocal local = ilgen.DeclareLocal(tw.TypeAsSignatureType);
         ilgen.Emit(OpCodes.Stloc, local);
         ilgen.Emit(OpCodes.Ldloca, local);
     }
     else if (tw.IsNonPrimitiveValueType)
     {
         ilgen.Emit(OpCodes.Unbox, tw.TypeAsSignatureType);
     }
     else
     {
         throw new InvalidOperationException();
     }
 }
    private void EmitConstant(object obj)
    {
        if (obj == null)
        {
            ilgen.Emit(OpCodes.Ldnull);
            return;
        }
        int index = constants.IndexOf(obj);

        if (index == -1)
        {
            index = constants.Count;
            constants.Add(obj);
        }
        ilgen.EmitLdarg(0);     // we want the bound value, not the real first parameter
        ilgen.EmitLdc_I4(index);
        ilgen.Emit(OpCodes.Ldelem_Ref);
    }
示例#3
0
 internal static void LoadPackedArg(CodeEmitter ilgen, int index, int firstArg, int packedArgPos, Type packedArgType)
 {
     index += firstArg;
     if (index >= packedArgPos)
     {
         ilgen.EmitLdarga(packedArgPos);
         int  fieldPos = index - packedArgPos;
         Type type     = packedArgType;
         while (fieldPos >= MaxArity || (fieldPos == MaxArity - 1 && IsPackedArgsContainer(type.GetField("t8").FieldType)))
         {
             FieldInfo field = type.GetField("t8");
             type = field.FieldType;
             ilgen.Emit(OpCodes.Ldflda, field);
             fieldPos -= MaxArity - 1;
         }
         ilgen.Emit(OpCodes.Ldfld, type.GetField("t" + (1 + fieldPos)));
     }
     else
     {
         ilgen.EmitLdarg(index);
     }
 }
示例#4
0
        internal void Emit(ClassLoaderWrapper loader, CodeEmitter ilgen)
        {
            if (Type != "static" || Class == null || Name == null || Sig == null)
            {
                throw new NotImplementedException();
            }
            Type[] redirParamTypes = loader.ArgTypeListFromSig(Sig);
            for (int i = 0; i < redirParamTypes.Length; i++)
            {
                ilgen.EmitLdarg(i);
            }
            // HACK if the class name contains a comma, we assume it is a .NET type
            if (Class.IndexOf(',') >= 0)
            {
#if NETSTANDARD
                Class = Class.Replace("mscorlib", Universe.CoreLibName);
#endif
                Type       type = StaticCompiler.Universe.GetType(Class, true);
                MethodInfo mi   = type.GetMethod(Name, redirParamTypes);
                if (mi == null)
                {
                    throw new InvalidOperationException();
                }
                ilgen.Emit(OpCodes.Call, mi);
            }
            else
            {
                TypeWrapper   tw = loader.LoadClassByDottedName(Class);
                MethodWrapper mw = tw.GetMethodWrapper(Name, Sig, false);
                if (mw == null)
                {
                    throw new InvalidOperationException();
                }
                mw.Link();
                mw.EmitCall(ilgen);
            }
            // TODO we may need a cast here (or a stack to return type conversion)
            ilgen.Emit(OpCodes.Ret);
        }
 internal void Ldarg(int i)
 {
     i += firstArg;
     if (i >= packedArgPos)
     {
         ilgen.EmitLdarga(packedArgPos);
         int  fieldPos = i - packedArgPos;
         Type type     = packedArgType;
         while (fieldPos >= MaxArity || (fieldPos == MaxArity - 1 && IsPackedArgsContainer(type.GetField("t8").FieldType)))
         {
             FieldInfo field = type.GetField("t8");
             type = field.FieldType;
             ilgen.Emit(OpCodes.Ldflda, field);
             fieldPos -= MaxArity - 1;
         }
         ilgen.Emit(OpCodes.Ldfld, type.GetField("t" + (1 + fieldPos)));
     }
     else
     {
         ilgen.EmitLdarg(i);
     }
 }
示例#6
0
文件: remapper.cs 项目: moayyaed/ikvm
 internal override void Generate(CodeGenContext context, CodeEmitter ilgen)
 {
     ilgen.EmitLdarg(ArgNum);
 }