зеркало из https://github.com/mono/ikvm-fork.git
Made sun.misc.Unsafe.ensureClassInitialized() into an intrinsic.
This commit is contained in:
Родитель
12a909f21f
Коммит
8973d97e41
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче