зеркало из https://github.com/mono/ikvm-fork.git
Wrapped LocalBuilder in new CodeEmitterLocal class to allow CodeEmitter to encapsulate the ILGenerator fully.
This commit is contained in:
Родитель
cda96b33f0
Коммит
3888406d95
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче