- 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:
jfrijters 2009-03-02 06:31:55 +00:00
Родитель f4991c7bd4
Коммит e417a92a37
3 изменённых файлов: 31 добавлений и 16 удалений

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

@ -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);