зеркало из https://github.com/mono/ikvm-fork.git
- Moved class literal TypeWrapper -> Type step into expression emitter.
- Fixed Class.desiredAssertionStatus() instrinsic to use the RemoveAsserts flag from the right class loader.
This commit is contained in:
Родитель
f4991c7bd4
Коммит
e417a92a37
|
@ -591,7 +591,7 @@ namespace IKVM.Internal
|
|||
}
|
||||
}
|
||||
|
||||
internal void LazyEmitLoadClass(Type type)
|
||||
internal void LazyEmitLoadClass(TypeWrapper type)
|
||||
{
|
||||
PushStack(new ClassLiteralExpr(type));
|
||||
}
|
||||
|
@ -874,6 +874,16 @@ namespace IKVM.Internal
|
|||
return null;
|
||||
}
|
||||
|
||||
internal TypeWrapper PeekLazyClassLiteral()
|
||||
{
|
||||
ClassLiteralExpr lit = PeekStack() as ClassLiteralExpr;
|
||||
if (lit != null)
|
||||
{
|
||||
return lit.Type;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void LazyGen()
|
||||
{
|
||||
if(lazyBranch != null)
|
||||
|
@ -1335,16 +1345,29 @@ namespace IKVM.Internal
|
|||
|
||||
class ClassLiteralExpr : Expr
|
||||
{
|
||||
private readonly Type type;
|
||||
internal readonly TypeWrapper Type;
|
||||
|
||||
internal ClassLiteralExpr(Type type)
|
||||
internal ClassLiteralExpr(TypeWrapper type)
|
||||
{
|
||||
this.type = type;
|
||||
this.Type = type;
|
||||
}
|
||||
|
||||
internal override void Emit(CodeEmitter ilgen)
|
||||
{
|
||||
ilgen.Emit(OpCodes.Ldtoken, type);
|
||||
TypeWrapper tw = Type;
|
||||
if (tw.IsGhostArray)
|
||||
{
|
||||
int rank = tw.ArrayRank;
|
||||
while (tw.IsArray)
|
||||
{
|
||||
tw = tw.ElementTypeWrapper;
|
||||
}
|
||||
ilgen.Emit(OpCodes.Ldtoken, ArrayTypeWrapper.MakeArrayType(tw.TypeAsTBD, rank));
|
||||
}
|
||||
else
|
||||
{
|
||||
ilgen.Emit(OpCodes.Ldtoken, tw.IsRemapped ? tw.TypeAsBaseType : tw.TypeAsTBD);
|
||||
}
|
||||
Compiler.getClassFromTypeHandle.EmitCall(ilgen);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1722,18 +1722,9 @@ class Compiler
|
|||
ilGenerator.Emit(OpCodes.Call, ByteCodeHelperMethods.DynamicClassLiteral);
|
||||
java_lang_Class.EmitCheckcast(clazz, ilGenerator);
|
||||
}
|
||||
else if(tw.IsGhostArray)
|
||||
{
|
||||
int rank = tw.ArrayRank;
|
||||
while(tw.IsArray)
|
||||
{
|
||||
tw = tw.ElementTypeWrapper;
|
||||
}
|
||||
ilGenerator.LazyEmitLoadClass(ArrayTypeWrapper.MakeArrayType(tw.TypeAsTBD, rank));
|
||||
}
|
||||
else
|
||||
{
|
||||
ilGenerator.LazyEmitLoadClass(tw.IsRemapped ? tw.TypeAsBaseType : tw.TypeAsTBD);
|
||||
ilGenerator.LazyEmitLoadClass(tw);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -145,7 +145,8 @@ namespace IKVM.Internal
|
|||
|
||||
private static bool Class_desiredAssertionStatus(DynamicTypeWrapper.FinishContext context, CodeEmitter ilgen, MethodWrapper method, MethodAnalyzer ma, int opcodeIndex, MethodWrapper caller, ClassFile classFile, ClassFile.Method.Instruction[] code)
|
||||
{
|
||||
if (caller.DeclaringType.GetClassLoader().RemoveAsserts)
|
||||
TypeWrapper classLiteral = ilgen.PeekLazyClassLiteral();
|
||||
if (classLiteral != null && classLiteral.GetClassLoader().RemoveAsserts)
|
||||
{
|
||||
ilgen.LazyEmitPop();
|
||||
ilgen.LazyEmitLdc_I4(0);
|
||||
|
|
Загрузка…
Ссылка в новой задаче