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 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.EmitLdarga(ArgNum); }
internal void LoadFirstArgAddress() { ilgen.EmitLdarga(firstArg); }