Made sun.misc.Unsafe.ensureClassInitialized() into an intrinsic.

This commit is contained in:
jfrijters 2011-07-07 07:52:59 +00:00
Родитель 12a909f21f
Коммит 8973d97e41
3 изменённых файлов: 23 добавлений и 55 удалений

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

@ -1882,55 +1882,6 @@
</replace-method-call>
</method>
</class>
<class name="sun.misc.SharedSecrets">
<method name="javaUtilJarAccess" sig="()Lsun.misc.JavaUtilJarAccess;">
<replace-method-call class="sun.misc.Unsafe" name="ensureClassInitialized" sig="(Ljava.lang.Class;)V">
<code>
<pop />
<pop />
<runclassinit class="java.util.jar.JarFile" />
</code>
</replace-method-call>
</method>
<method name="getJavaNioAccess" sig="()Lsun.misc.JavaNioAccess;">
<replace-method-call class="sun.misc.Unsafe" name="ensureClassInitialized" sig="(Ljava.lang.Class;)V">
<code>
<pop />
<pop />
<!-- the Java source initializes java.nio.ByteOrder (which causes java.nio.Bits to initialize) -->
<runclassinit class="java.nio.Bits" />
</code>
</replace-method-call>
</method>
<method name="getJavaIOAccess" sig="()Lsun.misc.JavaIOAccess;">
<replace-method-call class="sun.misc.Unsafe" name="ensureClassInitialized" sig="(Ljava.lang.Class;)V">
<code>
<pop />
<pop />
<runclassinit class="java.io.Console" />
</code>
</replace-method-call>
</method>
<method name="getJavaSecurityProtectionDomainAccess" sig="()Lsun.misc.JavaSecurityProtectionDomainAccess;">
<replace-method-call class="sun.misc.Unsafe" name="ensureClassInitialized" sig="(Ljava.lang.Class;)V">
<code>
<pop />
<pop />
<runclassinit class="java.security.ProtectionDomain" />
</code>
</replace-method-call>
</method>
<method name="getJavaSecurityAccess" sig="()Lsun.misc.JavaSecurityAccess;">
<replace-method-call class="sun.misc.Unsafe" name="ensureClassInitialized" sig="(Ljava.lang.Class;)V">
<code>
<pop />
<pop />
<!-- JDK bug: They are initializing AccessController here, but the setJavaSecurityAccess call is in ProtectionDomain -->
<runclassinit class="java.security.ProtectionDomain" />
</code>
</replace-method-call>
</method>
</class>
<class name="java.util.concurrent.atomic.AtomicReference">
<method name="compareAndSet" sig="(Ljava.lang.Object;Ljava.lang.Object;)Z">
<body>

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

@ -83,10 +83,8 @@ public class SharedSecrets {
public static JavaNioAccess getJavaNioAccess() {
if (javaNioAccess == null) {
// Ensure java.nio.ByteOrder is initialized; we know that
// this class initializes java.nio.Bits that provides the
// shared secret.
unsafe.ensureClassInitialized(java.nio.ByteOrder.class);
// [IKVM] OpenJDK initializes java.nio.ByteOrder here, but that doesn't work
java.nio.ByteOrder.nativeOrder();
}
return javaNioAccess;
}
@ -120,7 +118,8 @@ public class SharedSecrets {
public static JavaSecurityAccess getJavaSecurityAccess() {
if (javaSecurityAccess == null) {
unsafe.ensureClassInitialized(AccessController.class);
// [IKVM] OpenJDK initializes AccessController here, but that's a bug
unsafe.ensureClassInitialized(ProtectionDomain.class);
}
return javaSecurityAccess;
}

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

@ -1,5 +1,5 @@
/*
Copyright (C) 2008-2010 Jeroen Frijters
Copyright (C) 2008-2011 Jeroen Frijters
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
@ -186,6 +186,7 @@ namespace IKVM.Internal
intrinsics.Add(new IntrinsicKey("java.lang.Class", "getPrimitiveClass", "(Ljava.lang.String;)Ljava.lang.Class;"), Class_getPrimitiveClass);
#endif
intrinsics.Add(new IntrinsicKey("java.lang.ThreadLocal", "<init>", "()V"), ThreadLocal_new);
intrinsics.Add(new IntrinsicKey("sun.misc.Unsafe", "ensureClassInitialized", "(Ljava.lang.Class;)V"), Unsafe_ensureClassInitialized);
return intrinsics;
}
@ -560,5 +561,22 @@ namespace IKVM.Internal
});
return cb;
}
private static bool Unsafe_ensureClassInitialized(EmitIntrinsicContext eic)
{
if (eic.MatchRange(-1, 2)
&& eic.Match(-1, NormalizedByteCode.__ldc))
{
TypeWrapper classLiteral = eic.GetClassLiteral(-1);
if (!classLiteral.IsUnloadable)
{
eic.Emitter.Emit(OpCodes.Pop);
eic.Emitter.EmitNullCheck();
classLiteral.EmitRunClassConstructor(eic.Emitter);
return true;
}
}
return false;
}
}
}