diff --git a/runtime/CodeEmitter.cs b/runtime/CodeEmitter.cs index d66bdf9b..ca331f1e 100644 --- a/runtime/CodeEmitter.cs +++ b/runtime/CodeEmitter.cs @@ -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); } } diff --git a/runtime/compiler.cs b/runtime/compiler.cs index 38298446..938f6f51 100644 --- a/runtime/compiler.cs +++ b/runtime/compiler.cs @@ -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; } diff --git a/runtime/intrinsics.cs b/runtime/intrinsics.cs index 3bbbacad..060d6eef 100644 --- a/runtime/intrinsics.cs +++ b/runtime/intrinsics.cs @@ -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);