Wrapped LocalBuilder in new CodeEmitterLocal class to allow CodeEmitter to encapsulate the ILGenerator fully.

This commit is contained in:
jfrijters 2010-09-29 07:21:51 +00:00
Родитель cda96b33f0
Коммит 3888406d95
12 изменённых файлов: 99 добавлений и 74 удалений

Просмотреть файл

@ -850,7 +850,7 @@ namespace IKVM.Internal
{
MethodBuilder mb;
CodeEmitter ilgen;
LocalBuilder local;
CodeEmitterLocal local;
// add implicit conversions for all the ghost implementers
TypeWrapper[] implementers = classLoader.GetGhostImplementers(this);
for(int i = 0; i < implementers.Length; i++)
@ -891,8 +891,8 @@ namespace IKVM.Internal
mb = ghostIsInstanceArrayMethod;
AttributeHelper.HideFromJava(mb);
ilgen = CodeEmitter.Create(mb);
LocalBuilder localType = ilgen.DeclareLocal(Types.Type);
LocalBuilder localRank = ilgen.DeclareLocal(Types.Int32);
CodeEmitterLocal localType = ilgen.DeclareLocal(Types.Type);
CodeEmitterLocal localRank = ilgen.DeclareLocal(Types.Int32);
ilgen.Emit(OpCodes.Ldarg_0);
CodeEmitterLabel skip = ilgen.DefineLabel();
ilgen.Emit(OpCodes.Brtrue_S, skip);

Просмотреть файл

@ -455,7 +455,7 @@ namespace IKVM.Internal
mainStub.SetCustomAttribute(new CustomAttributeBuilder(apartmentAttributeType.GetConstructor(Type.EmptyTypes), new object[0]));
}
CodeEmitter ilgen = CodeEmitter.Create(mainStub);
LocalBuilder rc = ilgen.DeclareLocal(Types.Int32);
CodeEmitterLocal rc = ilgen.DeclareLocal(Types.Int32);
TypeWrapper startupType = LoadClassByDottedName("ikvm.runtime.Startup");
if(props.Count > 0)
{
@ -486,10 +486,10 @@ namespace IKVM.Internal
ilgen.Emit(OpCodes.Call, m);
ilgen.BeginCatchBlock(Types.Exception);
LoadClassByDottedName("ikvm.runtime.Util").GetMethodWrapper("mapException", "(Ljava.lang.Throwable;)Ljava.lang.Throwable;", false).EmitCall(ilgen);
LocalBuilder exceptionLocal = ilgen.DeclareLocal(Types.Exception);
CodeEmitterLocal exceptionLocal = ilgen.DeclareLocal(Types.Exception);
ilgen.Emit(OpCodes.Stloc, exceptionLocal);
TypeWrapper threadTypeWrapper = ClassLoaderWrapper.LoadClassCritical("java.lang.Thread");
LocalBuilder threadLocal = ilgen.DeclareLocal(threadTypeWrapper.TypeAsLocalOrStackType);
CodeEmitterLocal threadLocal = ilgen.DeclareLocal(threadTypeWrapper.TypeAsLocalOrStackType);
threadTypeWrapper.GetMethodWrapper("currentThread", "()Ljava.lang.Thread;", false).EmitCall(ilgen);
ilgen.Emit(OpCodes.Stloc, threadLocal);
ilgen.Emit(OpCodes.Ldloc, threadLocal);

Просмотреть файл

@ -149,7 +149,7 @@ namespace IKVM.Internal.MapXml
{
if(argTypeWrappers[i].IsGhost)
{
LocalBuilder[] temps = new LocalBuilder[argTypeWrappers.Length + (method.IsStatic ? 0 : 1)];
CodeEmitterLocal[] temps = new CodeEmitterLocal[argTypeWrappers.Length + (method.IsStatic ? 0 : 1)];
for(int j = temps.Length - 1; j >= 0; j--)
{
TypeWrapper tw;
@ -563,7 +563,7 @@ namespace IKVM.Internal.MapXml
internal override void Generate(CodeGenContext context, CodeEmitter ilgen)
{
LocalBuilder lb = (LocalBuilder)context[Name];
CodeEmitterLocal lb = (CodeEmitterLocal)context[Name];
if(lb == null)
{
if(typeWrapper == null && typeType == null)
@ -593,7 +593,7 @@ namespace IKVM.Internal.MapXml
internal override void Generate(CodeGenContext context, CodeEmitter ilgen)
{
ilgen.Emit(OpCodes.Ldloc, (LocalBuilder)context[Name]);
ilgen.Emit(OpCodes.Ldloc, (CodeEmitterLocal)context[Name]);
}
}

Просмотреть файл

@ -68,6 +68,31 @@ namespace IKVM.Internal
}
}
sealed class CodeEmitterLocal
{
private readonly LocalBuilder local;
internal CodeEmitterLocal(LocalBuilder local)
{
this.local = local;
}
internal Type LocalType
{
get { return local.LocalType; }
}
internal void SetLocalSymInfo(string name)
{
local.SetLocalSymInfo(name);
}
internal LocalBuilder __LocalBuilder
{
get { return local; }
}
}
sealed class CodeEmitter
{
private static readonly MethodInfo objectToString = Types.Object.GetMethod("ToString", BindingFlags.Public | BindingFlags.Instance, null, Type.EmptyTypes, null);
@ -82,7 +107,7 @@ namespace IKVM.Internal
private Expr[] stackArray = new Expr[8];
private int topOfStack;
private CodeEmitterLabel lazyBranch;
private LocalBuilder[] tempLocals = new LocalBuilder[32];
private CodeEmitterLocal[] tempLocals = new CodeEmitterLocal[32];
private ISymbolDocumentWriter symbols;
#if LABELCHECK
private Dictionary<CodeEmitterLabel, System.Diagnostics.StackFrame> labels = new Dictionary<CodeEmitterLabel, System.Diagnostics.StackFrame>();
@ -154,12 +179,12 @@ namespace IKVM.Internal
symbols = module.DefineDocument(url, language, languageVendor, documentType);
}
internal LocalBuilder UnsafeAllocTempLocal(Type type)
internal CodeEmitterLocal UnsafeAllocTempLocal(Type type)
{
int free = -1;
for (int i = 0; i < tempLocals.Length; i++)
{
LocalBuilder lb = tempLocals[i];
CodeEmitterLocal lb = tempLocals[i];
if (lb == null)
{
if (free == -1)
@ -172,7 +197,7 @@ namespace IKVM.Internal
return lb;
}
}
LocalBuilder lb1 = DeclareLocal(type);
CodeEmitterLocal lb1 = DeclareLocal(type);
if (free != -1)
{
tempLocals[free] = lb1;
@ -180,11 +205,11 @@ namespace IKVM.Internal
return lb1;
}
internal LocalBuilder AllocTempLocal(Type type)
internal CodeEmitterLocal AllocTempLocal(Type type)
{
for (int i = 0; i < tempLocals.Length; i++)
{
LocalBuilder lb = tempLocals[i];
CodeEmitterLocal lb = tempLocals[i];
if (lb != null && lb.LocalType == type)
{
tempLocals[i] = null;
@ -194,7 +219,7 @@ namespace IKVM.Internal
return DeclareLocal(type);
}
internal void ReleaseTempLocal(LocalBuilder lb)
internal void ReleaseTempLocal(CodeEmitterLocal lb)
{
for (int i = 0; i < tempLocals.Length; i++)
{
@ -259,9 +284,9 @@ namespace IKVM.Internal
ilgen_real.BeginScope();
}
internal LocalBuilder DeclareLocal(Type localType)
internal CodeEmitterLocal DeclareLocal(Type localType)
{
return ilgen_real.DeclareLocal(localType);
return new CodeEmitterLocal(ilgen_real.DeclareLocal(localType));
}
internal CodeEmitterLabel DefineLabel()
@ -425,11 +450,11 @@ namespace IKVM.Internal
ilgen_real.Emit(opcode, real);
}
internal void Emit(OpCode opcode, LocalBuilder local)
internal void Emit(OpCode opcode, CodeEmitterLocal local)
{
LazyGen();
#if !STATIC_COMPILER
int index = local.LocalIndex;
int index = local.__LocalBuilder.LocalIndex;
if(index < 4 && opcode.Value != OpCodes.Ldloca.Value && opcode.Value != OpCodes.Ldloca_S.Value)
{
offset += 1;
@ -443,7 +468,7 @@ namespace IKVM.Internal
offset += 4;
}
#endif
ilgen_real.Emit(opcode, local);
ilgen_real.Emit(opcode, local.__LocalBuilder);
}
internal void Emit(OpCode opcode, MethodInfo meth)
@ -631,7 +656,7 @@ namespace IKVM.Internal
{
if (verboseCastFailure != null)
{
LocalBuilder lb = DeclareLocal(Types.Object);
CodeEmitterLocal lb = DeclareLocal(Types.Object);
Emit(OpCodes.Stloc, lb);
Emit(OpCodes.Ldloc, lb);
Emit(OpCodes.Isinst, type);
@ -655,7 +680,7 @@ namespace IKVM.Internal
// throws an IncompatibleClassChangeError on failure.
internal void EmitAssertType(Type type)
{
LocalBuilder lb = DeclareLocal(Types.Object);
CodeEmitterLocal lb = DeclareLocal(Types.Object);
Emit(OpCodes.Stloc, lb);
Emit(OpCodes.Ldloc, lb);
Emit(OpCodes.Isinst, type);
@ -1150,7 +1175,7 @@ namespace IKVM.Internal
// unbox leaves a pointer to the value of the stack (instead of the value)
// so we have to copy the value into a local variable and load the address
// of the local onto the stack
LocalBuilder local = ilgen.DeclareLocal(Type);
CodeEmitterLocal local = ilgen.DeclareLocal(Type);
ilgen.Emit(OpCodes.Stloc, local);
ilgen.Emit(OpCodes.Ldloca, local);
}
@ -1382,8 +1407,8 @@ namespace IKVM.Internal
internal sealed override void Emit(CodeEmitter ilgen)
{
LocalBuilder value1 = ilgen.AllocTempLocal(Types.Int64);
LocalBuilder value2 = ilgen.AllocTempLocal(Types.Int64);
CodeEmitterLocal value1 = ilgen.AllocTempLocal(Types.Int64);
CodeEmitterLocal value2 = ilgen.AllocTempLocal(Types.Int64);
ilgen.Emit(OpCodes.Stloc, value2);
ilgen.Emit(OpCodes.Stloc, value1);
ilgen.Emit(OpCodes.Ldloc, value1);
@ -1412,8 +1437,8 @@ namespace IKVM.Internal
internal sealed override void Emit(CodeEmitter ilgen)
{
LocalBuilder value1 = ilgen.AllocTempLocal(FloatOrDouble());
LocalBuilder value2 = ilgen.AllocTempLocal(FloatOrDouble());
CodeEmitterLocal value1 = ilgen.AllocTempLocal(FloatOrDouble());
CodeEmitterLocal value2 = ilgen.AllocTempLocal(FloatOrDouble());
ilgen.Emit(OpCodes.Stloc, value2);
ilgen.Emit(OpCodes.Stloc, value1);
ilgen.Emit(OpCodes.Ldloc, value1);
@ -1456,8 +1481,8 @@ namespace IKVM.Internal
internal sealed override void Emit(CodeEmitter ilgen)
{
LocalBuilder value1 = ilgen.AllocTempLocal(FloatOrDouble());
LocalBuilder value2 = ilgen.AllocTempLocal(FloatOrDouble());
CodeEmitterLocal value1 = ilgen.AllocTempLocal(FloatOrDouble());
CodeEmitterLocal value2 = ilgen.AllocTempLocal(FloatOrDouble());
ilgen.Emit(OpCodes.Stloc, value2);
ilgen.Emit(OpCodes.Stloc, value1);
ilgen.Emit(OpCodes.Ldloc, value1);

Просмотреть файл

@ -1740,7 +1740,7 @@ namespace IKVM.Internal
internal override void EmitNewobj(CodeEmitter ilgen)
{
MethodInfo createDelegate = Types.Delegate.GetMethod("CreateDelegate", new Type[] { Types.Type, Types.Object, Types.String });
LocalBuilder targetObj = ilgen.DeclareLocal(Types.Object);
CodeEmitterLocal targetObj = ilgen.DeclareLocal(Types.Object);
ilgen.Emit(OpCodes.Stloc, targetObj);
ilgen.Emit(OpCodes.Ldtoken, delegateConstructor.DeclaringType);
ilgen.Emit(OpCodes.Call, Types.Type.GetMethod("GetTypeFromHandle", new Type[] { Types.RuntimeTypeHandle }));
@ -1795,7 +1795,7 @@ namespace IKVM.Internal
protected override void PreEmit(CodeEmitter ilgen)
{
LocalBuilder[] locals = new LocalBuilder[args.Length];
CodeEmitterLocal[] locals = new CodeEmitterLocal[args.Length];
for (int i = args.Length - 1; i >= 0; i--)
{
Type type = args[i];
@ -1858,7 +1858,7 @@ namespace IKVM.Internal
protected override void EmitSetImpl(CodeEmitter ilgen)
{
// NOTE even though the field is final, JNI reflection can still be used to set its value!
LocalBuilder temp = ilgen.AllocTempLocal(underlyingType);
CodeEmitterLocal temp = ilgen.AllocTempLocal(underlyingType);
ilgen.Emit(OpCodes.Stloc, temp);
ilgen.Emit(OpCodes.Unbox, underlyingType);
ilgen.Emit(OpCodes.Ldloc, temp);
@ -1878,7 +1878,7 @@ namespace IKVM.Internal
#if !STUB_GENERATOR
internal override void EmitNewobj(CodeEmitter ilgen)
{
LocalBuilder local = ilgen.DeclareLocal(DeclaringType.TypeAsTBD);
CodeEmitterLocal local = ilgen.DeclareLocal(DeclaringType.TypeAsTBD);
ilgen.Emit(OpCodes.Ldloc, local);
ilgen.Emit(OpCodes.Box, DeclaringType.TypeAsTBD);
}

Просмотреть файл

@ -4589,7 +4589,7 @@ namespace IKVM.Internal
internal static void Generate(DynamicTypeWrapper.FinishContext context, CodeEmitter ilGenerator, DynamicTypeWrapper wrapper, MethodWrapper mw, TypeBuilder typeBuilder, ClassFile classFile, ClassFile.Method m, TypeWrapper[] args, bool thruProxy)
{
LocalBuilder syncObject = null;
CodeEmitterLocal syncObject = null;
if (m.IsSynchronized && m.IsStatic)
{
wrapper.EmitClassLiteral(ilGenerator);
@ -4602,7 +4602,7 @@ namespace IKVM.Internal
string sig = m.Signature.Replace('.', '/');
// TODO use/unify JNI.METHOD_PTR_FIELD_PREFIX
FieldBuilder methodPtr = typeBuilder.DefineField("__<jniptr>" + m.Name + sig, Types.IntPtr, FieldAttributes.Static | FieldAttributes.PrivateScope);
LocalBuilder localRefStruct = ilGenerator.DeclareLocal(localRefStructType);
CodeEmitterLocal localRefStruct = ilGenerator.DeclareLocal(localRefStructType);
ilGenerator.Emit(OpCodes.Ldloca, localRefStruct);
ilGenerator.Emit(OpCodes.Initobj, localRefStructType);
ilGenerator.Emit(OpCodes.Ldsfld, methodPtr);
@ -4632,7 +4632,7 @@ namespace IKVM.Internal
context.EmitCallerID(ilGenerator);
}
ilGenerator.Emit(OpCodes.Call, enterLocalRefStruct);
LocalBuilder jnienv = ilGenerator.DeclareLocal(Types.IntPtr);
CodeEmitterLocal jnienv = ilGenerator.DeclareLocal(Types.IntPtr);
ilGenerator.Emit(OpCodes.Stloc, jnienv);
ilGenerator.BeginExceptionBlock();
TypeWrapper retTypeWrapper = mw.ReturnType;
@ -4705,7 +4705,7 @@ namespace IKVM.Internal
realRetType = Types.IntPtr;
}
ilGenerator.EmitCalli(OpCodes.Calli, System.Runtime.InteropServices.CallingConvention.StdCall, realRetType, modargs);
LocalBuilder retValue = null;
CodeEmitterLocal retValue = null;
if (retTypeWrapper != PrimitiveTypeWrapper.VOID)
{
if (!retTypeWrapper.IsUnloadable && !retTypeWrapper.IsPrimitive)
@ -4717,8 +4717,8 @@ namespace IKVM.Internal
}
else if (retTypeWrapper.IsGhost)
{
LocalBuilder ghost = ilGenerator.DeclareLocal(retTypeWrapper.TypeAsSignatureType);
LocalBuilder obj = ilGenerator.DeclareLocal(Types.Object);
CodeEmitterLocal ghost = ilGenerator.DeclareLocal(retTypeWrapper.TypeAsSignatureType);
CodeEmitterLocal obj = ilGenerator.DeclareLocal(Types.Object);
ilGenerator.Emit(OpCodes.Stloc, obj);
ilGenerator.Emit(OpCodes.Ldloca, ghost);
ilGenerator.Emit(OpCodes.Ldloc, obj);
@ -4957,7 +4957,7 @@ namespace IKVM.Internal
MethodBuilder mb = typeBuilder.DefineMethod("op_Implicit", MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.SpecialName, iface.TypeAsSignatureType, new Type[] { wrapper.TypeAsSignatureType });
AttributeHelper.HideFromJava(mb);
CodeEmitter ilgen = CodeEmitter.Create(mb);
LocalBuilder local = ilgen.DeclareLocal(iface.TypeAsSignatureType);
CodeEmitterLocal local = ilgen.DeclareLocal(iface.TypeAsSignatureType);
ilgen.Emit(OpCodes.Ldloca, local);
ilgen.Emit(OpCodes.Ldarg_0);
ilgen.Emit(OpCodes.Stfld, iface.GhostRefField);

Просмотреть файл

@ -40,7 +40,7 @@ sealed class LocalVar
internal bool isArg;
internal int local;
internal TypeWrapper type;
internal LocalBuilder builder;
internal CodeEmitterLocal builder;
// used to emit debugging info, only available if ClassLoaderWrapper.EmitDebugInfo is true
internal string name;
internal int start_pc;

Просмотреть файл

@ -1437,7 +1437,7 @@ namespace IKVM.Internal
FieldInfo fi = GetField();
if(!IsStatic && DeclaringType.IsNonPrimitiveValueType)
{
LocalBuilder temp = ilgen.DeclareLocal(FieldTypeWrapper.TypeAsSignatureType);
CodeEmitterLocal temp = ilgen.DeclareLocal(FieldTypeWrapper.TypeAsSignatureType);
ilgen.Emit(OpCodes.Stloc, temp);
ilgen.Emit(OpCodes.Unbox, DeclaringType.TypeAsTBD);
ilgen.Emit(OpCodes.Ldloc, temp);
@ -1490,7 +1490,7 @@ namespace IKVM.Internal
protected override void EmitSetImpl(CodeEmitter ilgen)
{
FieldInfo fi = GetField();
LocalBuilder temp = ilgen.DeclareLocal(FieldTypeWrapper.TypeAsSignatureType);
CodeEmitterLocal temp = ilgen.DeclareLocal(FieldTypeWrapper.TypeAsSignatureType);
ilgen.Emit(OpCodes.Stloc, temp);
if(fi.IsStatic)
{
@ -1568,7 +1568,7 @@ namespace IKVM.Internal
{
if(!IsStatic && DeclaringType.IsNonPrimitiveValueType)
{
LocalBuilder temp = ilgen.DeclareLocal(FieldTypeWrapper.TypeAsSignatureType);
CodeEmitterLocal temp = ilgen.DeclareLocal(FieldTypeWrapper.TypeAsSignatureType);
ilgen.Emit(OpCodes.Stloc, temp);
ilgen.Emit(OpCodes.Unbox, DeclaringType.TypeAsTBD);
ilgen.Emit(OpCodes.Ldloc, temp);

Просмотреть файл

@ -2815,7 +2815,7 @@ namespace IKVM.Internal
}
else if(IsGhost)
{
LocalBuilder local = ilgen.DeclareLocal(TypeAsSignatureType);
CodeEmitterLocal local = ilgen.DeclareLocal(TypeAsSignatureType);
ilgen.Emit(OpCodes.Stloc, local);
ilgen.Emit(OpCodes.Ldloca, local);
ilgen.Emit(OpCodes.Ldfld, GhostRefField);
@ -2830,9 +2830,9 @@ namespace IKVM.Internal
{
if(IsGhost)
{
LocalBuilder local1 = ilgen.DeclareLocal(TypeAsLocalOrStackType);
CodeEmitterLocal local1 = ilgen.DeclareLocal(TypeAsLocalOrStackType);
ilgen.Emit(OpCodes.Stloc, local1);
LocalBuilder local2 = ilgen.DeclareLocal(TypeAsSignatureType);
CodeEmitterLocal local2 = ilgen.DeclareLocal(TypeAsSignatureType);
ilgen.Emit(OpCodes.Ldloca, local2);
ilgen.Emit(OpCodes.Ldloc, local1);
ilgen.Emit(OpCodes.Stfld, GhostRefField);

Просмотреть файл

@ -403,9 +403,9 @@ sealed class Compiler
private sealed class ReturnCookie
{
private CodeEmitterLabel stub;
private LocalBuilder local;
private CodeEmitterLocal local;
internal ReturnCookie(CodeEmitterLabel stub, LocalBuilder local)
internal ReturnCookie(CodeEmitterLabel stub, CodeEmitterLocal local)
{
this.stub = stub;
this.local = local;
@ -458,18 +458,18 @@ sealed class Compiler
}
private Compiler compiler;
private StackType[] types;
private LocalBuilder[] locals;
private CodeEmitterLocal[] locals;
internal DupHelper(Compiler compiler, int count)
{
this.compiler = compiler;
types = new StackType[count];
locals = new LocalBuilder[count];
locals = new CodeEmitterLocal[count];
}
internal void Release()
{
foreach(LocalBuilder lb in locals)
foreach (CodeEmitterLocal lb in locals)
{
if(lb != null)
{
@ -655,7 +655,7 @@ sealed class Compiler
{
clazz.EmitClassLiteral(ilGenerator);
ilGenerator.Emit(OpCodes.Dup);
LocalBuilder monitor = ilGenerator.DeclareLocal(Types.Object);
CodeEmitterLocal monitor = ilGenerator.DeclareLocal(Types.Object);
ilGenerator.Emit(OpCodes.Stloc, monitor);
ilGenerator.Emit(OpCodes.Call, monitorEnterMethod);
ilGenerator.BeginExceptionBlock();
@ -1453,9 +1453,9 @@ sealed class Compiler
// this could be done a little more efficiently, but since in practice this
// code never runs (for code compiled from Java source) it doesn't
// really matter
LocalBuilder newobj = ilGenerator.DeclareLocal(GetLocalBuilderType(thisType));
CodeEmitterLocal newobj = ilGenerator.DeclareLocal(GetLocalBuilderType(thisType));
ilGenerator.Emit(OpCodes.Stloc, newobj);
LocalBuilder[] tempstack = new LocalBuilder[stackfix.Length];
CodeEmitterLocal[] tempstack = new CodeEmitterLocal[stackfix.Length];
for(int j = 0; j < stackfix.Length; j++)
{
if(!stackfix[j])
@ -1471,7 +1471,7 @@ sealed class Compiler
}
else if(!VerifierTypeWrapper.IsNotPresentOnStack(stacktype))
{
LocalBuilder lb = ilGenerator.DeclareLocal(GetLocalBuilderType(stacktype));
CodeEmitterLocal lb = ilGenerator.DeclareLocal(GetLocalBuilderType(stacktype));
ilGenerator.Emit(OpCodes.Stloc, lb);
tempstack[j] = lb;
}
@ -1618,7 +1618,7 @@ sealed class Compiler
if(block.IsNested)
{
// if we're inside an exception block, copy TOS to local, emit "leave" and push item onto our "todo" list
LocalBuilder local = null;
CodeEmitterLocal local = null;
if(instr.NormalizedOpCode != NormalizedByteCode.__return)
{
TypeWrapper retTypeWrapper = mw.ReturnType;
@ -1675,7 +1675,7 @@ sealed class Compiler
retTypeWrapper.EmitConvStackTypeToSignatureType(ilGenerator, ma.GetStackTypeWrapper(i, 0));
if(stackHeight != 1)
{
LocalBuilder local = ilGenerator.AllocTempLocal(retTypeWrapper.TypeAsSignatureType);
CodeEmitterLocal local = ilGenerator.AllocTempLocal(retTypeWrapper.TypeAsSignatureType);
ilGenerator.Emit(OpCodes.Stloc, local);
ilGenerator.Emit(OpCodes.Leave_S, (byte)0);
ilGenerator.Emit(OpCodes.Ldloc, local);
@ -1788,8 +1788,8 @@ sealed class Compiler
}
case NormalizedByteCode.__multianewarray:
{
LocalBuilder localArray = ilGenerator.UnsafeAllocTempLocal(JVM.Import(typeof(int[])));
LocalBuilder localInt = ilGenerator.UnsafeAllocTempLocal(Types.Int32);
CodeEmitterLocal localArray = ilGenerator.UnsafeAllocTempLocal(JVM.Import(typeof(int[])));
CodeEmitterLocal localInt = ilGenerator.UnsafeAllocTempLocal(Types.Int32);
ilGenerator.LazyEmitLdc_I4(instr.Arg2);
ilGenerator.Emit(OpCodes.Newarr, Types.Int32);
ilGenerator.Emit(OpCodes.Stloc, localArray);
@ -2002,7 +2002,7 @@ sealed class Compiler
if(elem.IsNonPrimitiveValueType)
{
Type t = elem.TypeAsTBD;
LocalBuilder local = ilGenerator.UnsafeAllocTempLocal(Types.Object);
CodeEmitterLocal local = ilGenerator.UnsafeAllocTempLocal(Types.Object);
ilGenerator.Emit(OpCodes.Stloc, local);
ilGenerator.Emit(OpCodes.Ldelema, t);
ilGenerator.Emit(OpCodes.Ldloc, local);
@ -2803,9 +2803,9 @@ sealed class Compiler
}
else
{
LocalBuilder ghost = ilGenerator.AllocTempLocal(Types.Object);
CodeEmitterLocal ghost = ilGenerator.AllocTempLocal(Types.Object);
ilGenerator.Emit(OpCodes.Stloc, ghost);
LocalBuilder local = ilGenerator.AllocTempLocal(args[i].TypeAsSignatureType);
CodeEmitterLocal local = ilGenerator.AllocTempLocal(args[i].TypeAsSignatureType);
ilGenerator.Emit(OpCodes.Ldloca, local);
ilGenerator.Emit(OpCodes.Ldloc, ghost);
ilGenerator.Emit(OpCodes.Stfld, args[i].GhostRefField);
@ -2962,8 +2962,8 @@ sealed class Compiler
{
Profiler.Count("EmitDynamicInvokeEmitter");
TypeWrapper[] args = cpi.GetArgTypes();
LocalBuilder argarray = ilGenerator.DeclareLocal(JVM.Import(typeof(object[])));
LocalBuilder val = ilGenerator.DeclareLocal(Types.Object);
CodeEmitterLocal argarray = ilGenerator.DeclareLocal(JVM.Import(typeof(object[])));
CodeEmitterLocal val = ilGenerator.DeclareLocal(Types.Object);
ilGenerator.Emit(OpCodes.Ldc_I4, args.Length);
ilGenerator.Emit(OpCodes.Newarr, Types.Object);
ilGenerator.Emit(OpCodes.Stloc, argarray);

Просмотреть файл

@ -271,7 +271,7 @@ namespace IKVM.Internal
private static void EmitConversion(CodeEmitter ilgen, Type converterType, string method)
{
LocalBuilder converter = ilgen.UnsafeAllocTempLocal(converterType);
CodeEmitterLocal converter = ilgen.UnsafeAllocTempLocal(converterType);
ilgen.Emit(OpCodes.Ldloca, converter);
ilgen.Emit(OpCodes.Call, converterType.GetMethod(method));
}

Просмотреть файл

@ -821,8 +821,8 @@ namespace IKVM.NativeCode.java
// we want the getters to be verifiable (because writeObject can be used from partial trust),
// so we create a local to hold the properly typed object reference
LocalBuilder objGetterThis = ilgenObjGetter.DeclareLocal(tw.TypeAsBaseType);
LocalBuilder primGetterThis = ilgenPrimGetter.DeclareLocal(tw.TypeAsBaseType);
CodeEmitterLocal objGetterThis = ilgenObjGetter.DeclareLocal(tw.TypeAsBaseType);
CodeEmitterLocal primGetterThis = ilgenPrimGetter.DeclareLocal(tw.TypeAsBaseType);
ilgenObjGetter.Emit(OpCodes.Ldarg_0);
ilgenObjGetter.Emit(OpCodes.Castclass, tw.TypeAsBaseType);
ilgenObjGetter.Emit(OpCodes.Stloc, objGetterThis);
@ -5951,7 +5951,7 @@ namespace IKVM.NativeCode.sun.reflect
mw.ResolveMethod();
DynamicMethod dm = DynamicMethodUtils.Create("__<Invoker>", mw.DeclaringType.TypeAsBaseType, !mw.IsPublic || !mw.DeclaringType.IsPublic || nonvirtual, typeof(object), new Type[] { typeof(object), typeof(object[]), typeof(global::ikvm.@internal.CallerID) });
CodeEmitter ilgen = CodeEmitter.Create(dm);
LocalBuilder ret = ilgen.DeclareLocal(typeof(object));
CodeEmitterLocal ret = ilgen.DeclareLocal(typeof(object));
if (!mw.IsStatic)
{
// check target for null
@ -5976,7 +5976,7 @@ namespace IKVM.NativeCode.sun.reflect
ilgen.MarkLabel(argsLengthOK);
int thisCount = mw.IsStatic ? 0 : 1;
LocalBuilder[] args = new LocalBuilder[mw.GetParameters().Length + thisCount];
CodeEmitterLocal[] args = new CodeEmitterLocal[mw.GetParameters().Length + thisCount];
if (!mw.IsStatic)
{
args[0] = ilgen.DeclareLocal(mw.DeclaringType.TypeAsSignatureType);
@ -6314,7 +6314,7 @@ namespace IKVM.NativeCode.sun.reflect
mw.ResolveMethod();
DynamicMethod dm = DynamicMethodUtils.Create("__<Invoker>", mw.DeclaringType.TypeAsTBD, !mw.IsPublic || !mw.DeclaringType.IsPublic, typeof(object), new Type[] { typeof(object[]) });
CodeEmitter ilgen = CodeEmitter.Create(dm);
LocalBuilder ret = ilgen.DeclareLocal(typeof(object));
CodeEmitterLocal ret = ilgen.DeclareLocal(typeof(object));
// check args length
CodeEmitterLabel argsLengthOK = ilgen.DefineLabel();
@ -6332,7 +6332,7 @@ namespace IKVM.NativeCode.sun.reflect
ilgen.Emit(OpCodes.Throw);
ilgen.MarkLabel(argsLengthOK);
LocalBuilder[] args = new LocalBuilder[mw.GetParameters().Length];
CodeEmitterLocal[] args = new CodeEmitterLocal[mw.GetParameters().Length];
for (int i = 0; i < args.Length; i++)
{
mw.GetParameters()[i].Finish();
@ -7480,7 +7480,7 @@ namespace IKVM.NativeCode.sun.reflect
ilgen.Emit(OpCodes.Castclass, fw.DeclaringType.TypeAsBaseType);
fw.EmitGet(ilgen);
fw.FieldTypeWrapper.EmitConvSignatureTypeToStackType(ilgen);
LocalBuilder local = ilgen.DeclareLocal(fieldType);
CodeEmitterLocal local = ilgen.DeclareLocal(fieldType);
ilgen.Emit(OpCodes.Stloc, local);
ilgen.BeginCatchBlock(typeof(InvalidCastException));
ilgen.Emit(OpCodes.Ldarg_0);