FIx for new OpenJDK 7 (7u85-2.6.1-3)
authorJan Vrany <jan.vrany@fit.cvut.cz>
Fri, 11 Sep 2015 16:08:20 +0100
changeset 3495 494403a0af56
parent 3493 4c7b405cf1ca
child 3496 e1e02c2f3b94
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)
JavaClassRegistry.st
JavaVM.st
JavaVMData.st
--- 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'
 !