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); }
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); } }
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); } }
internal override void Generate(CodeGenContext context, CodeEmitter ilgen) { ilgen.EmitLdarg(ArgNum); }