FIx for new OpenJDK 7 (7u85-2.6.1-3)
Some more recent OpenJDK 7 (7u85-2.6.1-3) introduced
a classLoader field in java.lang.Class instances, making
java.lang.Class.getClassLoader0() useless (the Java code
accesses the field directly). To support both implementations,
remember the offset of the `classLoader` field (if any)
and fill in the classLoader field whenever a java.lang.Class
object is created (by the VM)
--- a/JavaClassRegistry.st Wed Aug 19 21:11:09 2015 +0100
+++ b/JavaClassRegistry.st Fri Sep 11 16:08:20 2015 +0100
@@ -1,5 +1,3 @@
-"{ Encoding: utf8 }"
-
"
COPYRIGHT (c) 1996-2015 by Claus Gittinger
@@ -469,6 +467,16 @@
].
nm = #'java/lang/Class' ifTrue:[
_java_lang_Class_CLASS := class.
+ "/ Some more recent OpenJDK 7 (7u85-2.6.1-3) introduced
+ "/ a classLoader field in java.lang.Class instances, making
+ "/ java.lang.Class.getClassLoader0() useless. To support both,
+ "/ remember the offset of the `classLoader` here. It will
+ "/ be used then by JavaReflectionRegistry to fill in
+ "/ the field. If this particular Java runtime does not
+ "/ have it (older OpenJDK7, OpenJDK6), leave it nil.
+ "/ See JavaVM::ReflectionRegistry>>javaClassObjectForClass:init:.
+ _java_lang_Class_classLoader_ID := _java_lang_Class_CLASS instVarIndexFor: #classLoader ifAbsent: [ nil ].
+
"/ Force load of other reflective classes. This saves us a nil check in
"/ JavaMirror>>createMethod...
#(#'java/lang/reflect/Constructor' #'java/lang/reflect/Method' #'java/lang/reflect/Field') do:[:e|
@@ -487,7 +495,7 @@
].
"Created: / 22-05-2013 / 20:40:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
- "Modified: / 18-12-2013 / 13:03:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 11-09-2015 / 15:53:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
registerClassInClassLoader: class
@@ -630,6 +638,6 @@
!
version_SVN
- ^ '§Id§'
+ ^ '§Id§'
! !
--- a/JavaVM.st Wed Aug 19 21:11:09 2015 +0100
+++ b/JavaVM.st Fri Sep 11 16:08:20 2015 +0100
@@ -7971,12 +7971,20 @@
aClass lookupObject: JavaLookup instance.
].
javaClassObj := _java_lang_Class_CLASS new.
+ "/ Some more recent OpenJDK 7 (7u85-2.6.1-3) introduced
+ "/ a classLoader field in java.lang.Class instances, making
+ "/ java.lang.Class.getClassLoader0() useless. To support both,
+ "/ fill in the `classLoader` field here (if defined, if not,
+ "/ _java_lang_Class_classLoader_ID will be nil)
+ _java_lang_Class_classLoader_ID notNil ifTrue:[
+ javaClassObj instVarAt: _java_lang_Class_classLoader_ID put: aClass classLoader.
+ ].
self rememberJavaClassObject: javaClassObj for: aClass.
^ javaClassObj
"Modified: / 28-01-2011 / 15:15:44 / Marcel Hlopko <hlopik@gmail.com>"
"Created: / 12-08-2011 / 19:07:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
- "Modified: / 21-05-2013 / 16:28:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 11-09-2015 / 15:40:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
javaClassObjectForClassNamed: className
--- a/JavaVMData.st Wed Aug 19 21:11:09 2015 +0100
+++ b/JavaVMData.st Fri Sep 11 16:08:20 2015 +0100
@@ -20,35 +20,38 @@
"
"{ Package: 'stx:libjava' }"
+"{ NameSpace: Smalltalk }"
+
SharedPool subclass:#JavaVMData
instanceVariableNames:''
classVariableNames:'FileIOTrace JavaWindowGroup ThreadTrace JavaMethods
- SystemClassLoader DrawOPTrace JavaEventThread AssertionsEnabled
- SocketConnectConfirmation NoAudio SimulatedLibs OpenFileTable
- ZipCache ZipCacheLastAccessed EventTrace FileOpenConfirmation
- ZipEntryCache ZipEntryCacheLock ZipEntryCacheFirstFree LibPath
- WindowOPTrace FileAccessTrace ClassRegistry WindowCreationTrace
- SimulatedNativeMemory KnownWindows PermittedHostConnects
- FullExceptionTrace SimulatedNativeLibs StartupTime FileOpenTrace
- ImageStretchCache LoadedNativeLibs JavaConsoleStream
- JavaEventQueueThread PermittedDirectories
- StdinReplacementFileQuerySignal JavaScreenUpdaterThread
- ZipInflaters LoadedLibs EnteredMonitorsPerProcess
- _java_net_DatagramPacket_CLASS _java_net_DatagramPacket_buf_ID
- _java_lang_Object_CLASS _java_lang_System_CLASS _java_lang_Class_CLASS
- _java_lang_reflect_Constructor_CLASS _java_lang_reflect_Method_CLASS
- _java_lang_reflect_Field_CLASS
- _java_net_DatagramPacket_offset_ID
- _java_net_DatagramPacket_length_ID
- _java_net_DatagramPacket_bufLength_ID
- _java_net_DatagramPacket_address_ID
- _java_net_DatagramPacket_port_ID _java_net_InetAddress_CLASS
- _java_net_InetAddress_holder_ID
- _java_net_InetAddress_canonicalHostName_ID
- _java_net_InetAddress_family_ID _java_net_InetAddress_address_ID
- _java_net_InetAddress_hostName_ID _java_net_Inet4Address_CLASS
- _java_net_PlainDatagramSocketImpl_CLASS
- _java_net_PlainDatagramSocketImpl_timeout_ID'
+ SystemClassLoader DrawOPTrace JavaEventThread AssertionsEnabled
+ SocketConnectConfirmation NoAudio SimulatedLibs OpenFileTable
+ ZipCache ZipCacheLastAccessed EventTrace FileOpenConfirmation
+ ZipEntryCache ZipEntryCacheLock ZipEntryCacheFirstFree LibPath
+ WindowOPTrace FileAccessTrace ClassRegistry WindowCreationTrace
+ SimulatedNativeMemory KnownWindows PermittedHostConnects
+ FullExceptionTrace SimulatedNativeLibs StartupTime FileOpenTrace
+ ImageStretchCache LoadedNativeLibs JavaConsoleStream
+ JavaEventQueueThread PermittedDirectories
+ StdinReplacementFileQuerySignal JavaScreenUpdaterThread
+ ZipInflaters LoadedLibs EnteredMonitorsPerProcess
+ _java_net_DatagramPacket_CLASS _java_net_DatagramPacket_buf_ID
+ _java_lang_Object_CLASS _java_lang_System_CLASS
+ _java_lang_Class_CLASS _java_lang_reflect_Constructor_CLASS
+ _java_lang_reflect_Method_CLASS _java_lang_reflect_Field_CLASS
+ _java_net_DatagramPacket_offset_ID
+ _java_net_DatagramPacket_length_ID
+ _java_net_DatagramPacket_bufLength_ID
+ _java_net_DatagramPacket_address_ID
+ _java_net_DatagramPacket_port_ID _java_net_InetAddress_CLASS
+ _java_net_InetAddress_holder_ID
+ _java_net_InetAddress_canonicalHostName_ID
+ _java_net_InetAddress_family_ID _java_net_InetAddress_address_ID
+ _java_net_InetAddress_hostName_ID _java_net_Inet4Address_CLASS
+ _java_net_PlainDatagramSocketImpl_CLASS
+ _java_net_PlainDatagramSocketImpl_timeout_ID
+ _java_lang_Class_classLoader_ID'
poolDictionaries:''
category:'Languages-Java-Support'
!