Fixed class reloader in cases a top-level class has both, nested and anonymous classes.
authorJan Vrany <jan.vrany@fit.cvut.cz>
Sat, 11 Oct 2014 23:21:45 +0100
changeset 3244 0a8b9f03ffa5
parent 3243 769369f7b48c
child 3245 16a1b7c1eccc
Fixed class reloader in cases a top-level class has both, nested and anonymous classes.
JavaClassRegistry.st
JavaClassReloader.st
abbrev.stc
experiments/JavaClassReloaderTests.st
experiments/Make.proto
experiments/abbrev.stc
experiments/bc.mak
experiments/experiments.rc
experiments/stx_libjava_experiments.st
libjava.rc
stx_libjava.st
tools/stx_libjava_tools.st
tools/tools.rc
--- a/JavaClassRegistry.st	Fri Oct 10 11:56:56 2014 +0100
+++ b/JavaClassRegistry.st	Sat Oct 11 23:21:45 2014 +0100
@@ -402,6 +402,13 @@
 !
 
 unregisterClass: oldClass
+    ^ self unregisterClass: oldClass ignoring: Set new.
+
+    "Created: / 04-04-2012 / 02:43:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 10-10-2014 / 12:12:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+unregisterClass: oldClass ignoring: ignoredClasses
     | classes |
 
     classes := loaders at: oldClass classLoader ifAbsent: nil.
@@ -410,7 +417,7 @@
         (classes includesKey: oldClass binaryName) ifTrue:[
             "/ Now, invalidate references and unload all dependent clases
             "/ (JavaClassReloader will unload them by recursively call #unregisterClass:
-            JavaClassReloader unload: oldClass.
+            JavaClassReloader unload: oldClass ignoring: ignoredClasses.
             "/ Now remove it from class registry...
             classes removeKey: oldClass binaryName.
             "/ ...from class loader...
@@ -422,8 +429,7 @@
         ]
     ].
 
-    "Created: / 04-04-2012 / 02:43:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 11-08-2014 / 01:57:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 10-10-2014 / 12:12:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 unregisterClassLoader: aJavaClassLoader
--- a/JavaClassReloader.st	Fri Oct 10 11:56:56 2014 +0100
+++ b/JavaClassReloader.st	Sat Oct 11 23:21:45 2014 +0100
@@ -107,6 +107,13 @@
 
     "Created: / 20-02-2012 / 23:29:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified (comment): / 14-09-2013 / 15:51:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+unload: oldClass ignoring: ignoredClasses
+    "Remove oldClass from the system"
+    ^ self new unload: oldClass ignoring: ignoredClasses
+
+    "Created: / 10-10-2014 / 12:13:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !JavaClassReloader class methodsFor:'reloading-requests'!
@@ -179,13 +186,18 @@
     "Modified: / 15-10-2013 / 01:16:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-unload: oldClass
+unload: oldClass ignoring: ignoredClasses
 
+    ignoredClasses add: oldClass.
     oldClass subclassesDo:[:subclass |
-        JavaVM registry unregisterClass: subclass.
+        (ignoredClasses includes: subclass) ifFalse:[
+            JavaVM registry unregisterClass: subclass ignoring: ignoredClasses
+        ].
     ].
     oldClass innerClassesIgnoreUnloaded do:[:innerclass | 
-        JavaVM registry unregisterClass: innerclass.
+        (ignoredClasses includes: innerclass) ifFalse:[
+            JavaVM registry unregisterClass: innerclass ignoring: ignoredClasses
+        ]
     ].
     JavaVM registry allClassesDo:[:cls|        
         "/ JV: Q: Should we remove all users of the interface? Let's do it, but not
@@ -195,14 +207,15 @@
         ifaces := cls getInterfaces.
         ifaces notNil ifTrue:[
             (ifaces  anySatisfy:[:ref| ref isJavaClass ifTrue:[ ref == oldClass]  ifFalse:[ ref name =  oldClass binaryName ] ]) ifTrue:[
-                JavaVM registry unregisterClass: cls
+                (ignoredClasses includes: cls) ifFalse:[
+                    JavaVM registry unregisterClass: cls ignoring: ignoredClasses
+                ].
             ].
         ].
         cls constantPool invalidateForClass: oldClass binaryName
     ]
 
-    "Created: / 14-09-2013 / 15:53:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified (format): / 08-08-2014 / 22:38:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 10-10-2014 / 12:14:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !JavaClassReloader methodsFor:'reloading-requests'!
--- a/abbrev.stc	Fri Oct 10 11:56:56 2014 +0100
+++ b/abbrev.stc	Sat Oct 11 23:21:45 2014 +0100
@@ -10,6 +10,7 @@
 JavaAnnotationDefault JavaAnnotationDefault stx:libjava 'Languages-Java-Annotations' 1
 JavaAnnotationDictionary JavaAnnotationDictionary stx:libjava 'Languages-Java-Annotations' 1
 JavaAnnotationValue JavaAnnotationValue stx:libjava 'Languages-Java-Reader-Support' 0
+JavaAntProjectResource JavaAntProjectResource stx:libjava 'Languages-Java-Tests' 2
 JavaArray JavaArray stx:libjava 'Languages-Java-Classes' 1
 JavaBooleanArray JavaBooleanArray stx:libjava 'Languages-Java-Support' 0
 JavaByte JavaByte stx:libjava 'Languages-Java-Support' 0
@@ -92,6 +93,7 @@
 JavaFieldAnnotationContainer JavaFieldAnnotationContainer stx:libjava 'Languages-Java-Annotations' 1
 JavaFieldDescriptor JavaFieldDescriptor stx:libjava 'Languages-Java-Support' 0
 JavaFieldDescriptorWithUnionType JavaFieldDescriptorWithUnionType stx:libjava 'Languages-Java-Support' 0
+JavaInitializedResource JavaInitializedResource stx:libjava 'Languages-Java-Tests' 2
 JavaInvalidRefError JavaInvalidRefError stx:libjava 'Languages-Java-Support' 1
 JavaInvokeDynamic2 JavaInvokeDynamic2 stx:libjava 'Languages-Java-Reader-Support-new' 0
 JavaMethod JavaMethod stx:libjava 'Languages-Java-Classes' 0
@@ -142,7 +144,6 @@
 JavaNativeMethodImpl_OracleJDK8 JavaNativeMethodImpl_OracleJDK8 stx:libjava 'Languages-Java-Support-Java 8' 0
 GroovyEvaluatorTests GroovyEvaluatorTests stx:libjava 'Languages-Groovy-Tests' 1
 JUnitTestCaseProxy JUnitTestCaseProxy stx:libjava 'Languages-Java-Tests-Proxies' 3
-JavaAntProjectResource JavaAntProjectResource stx:libjava 'Languages-Java-Tests' 2
 JavaByteCodeDisassemblerTests JavaByteCodeDisassemblerTests stx:libjava 'Languages-Java-Tests' 1
 JavaByteCodeProcessorTests JavaByteCodeProcessorTests stx:libjava 'Languages-Java-Tests' 1
 JavaClassLoadingTests JavaClassLoadingTests stx:libjava 'Languages-Java-Tests-ClassLoading' 1
@@ -151,7 +152,6 @@
 JavaExceptionTests JavaExceptionTests stx:libjava 'Languages-Java-Tests' 1
 JavaFieldRefTests JavaFieldRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
 JavaFreshlyInitializedResource JavaFreshlyInitializedResource stx:libjava 'Languages-Java-Tests' 1
-JavaInitializedResource JavaInitializedResource stx:libjava 'Languages-Java-Tests' 2
 JavaInterfaceMethodRefTests JavaInterfaceMethodRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
 JavaJUnitTests JavaJUnitTests stx:libjava 'Languages-Java-Tests-Libraries' 1
 JavaLibrariesResource JavaLibrariesResource stx:libjava 'Languages-Java-Tests' 1
--- a/experiments/JavaClassReloaderTests.st	Fri Oct 10 11:56:56 2014 +0100
+++ b/experiments/JavaClassReloaderTests.st	Sat Oct 11 23:21:45 2014 +0100
@@ -2471,6 +2471,45 @@
     self assert: (JavaVM classNamed: #'test_unloading_04d_A$1' definedBy: testClassLoader) isNil.
 
     "Created: / 12-08-2014 / 22:25:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_unloading_04e
+    "
+    1) compile class A with nested class A$Nested and annonymous class A$1
+    2) remove class A then A$Nested
+    3) check that A$1 has been removed too.
+    "
+
+    | jclassA jclassA_Nested jclassA_1 |
+
+    self compileAndRegister:'
+public class test_unloading_04e_A {
+    public static class Nested {
+        public Object foo() {
+            return new Object() { public int bar() { return 10; } };
+        }
+    }
+}'.
+
+    jclassA := JavaVM classNamed: #'test_unloading_04e_A' definedBy: testClassLoader.
+    jclassA_Nested := JavaVM classNamed: #'test_unloading_04e_A$Nested' definedBy: testClassLoader.
+    jclassA_1 := JavaVM classNamed: #'test_unloading_04e_A$1' definedBy: testClassLoader.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA).
+    self assert: (Smalltalk allClasses includesIdentical: jclassA_Nested).
+    self assert: (Smalltalk allClasses includesIdentical: jclassA_1).
+
+    jclassA removeFromSystem.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA) not.
+    self assert: (Smalltalk allClasses includesIdentical: jclassA_Nested) not.
+    self assert: (Smalltalk allClasses includesIdentical: jclassA_1) not.
+
+    self assert: (JavaVM classNamed: #'test_unloading_04e_A' definedBy: testClassLoader) isNil.    
+    self assert: (JavaVM classNamed: #'test_unloading_04e_A$Nested' definedBy: testClassLoader) isNil.
+    self assert: (JavaVM classNamed: #'test_unloading_04e_A$1' definedBy: testClassLoader) isNil.
+
+    "Created: / 10-10-2014 / 12:08:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !JavaClassReloaderTests class methodsFor:'documentation'!
--- a/experiments/Make.proto	Fri Oct 10 11:56:56 2014 +0100
+++ b/experiments/Make.proto	Sat Oct 11 23:21:45 2014 +0100
@@ -34,7 +34,7 @@
 # add the path(es) here:,
 # ********** OPTIONAL: MODIFY the next lines ***
 # LOCALINCLUDES=-Ifoo -Ibar
-LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libjava
+LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libbasic3 -I$(INCLUDE_TOP)/stx/libjava -I$(INCLUDE_TOP)/stx/libjava/tools
 
 
 # if you need any additional defines for embedded C code,
--- a/experiments/abbrev.stc	Fri Oct 10 11:56:56 2014 +0100
+++ b/experiments/abbrev.stc	Sat Oct 11 23:21:45 2014 +0100
@@ -2,6 +2,7 @@
 # this file is needed for stc to be able to compile modules independently.
 # it provides information about a classes filename, category and especially namespace.
 JavaByteCodeInterpreter JavaByteCodeInterpreter stx:libjava/experiments 'Languages-Java-Bytecode' 0
+JavaClassReloaderTests JavaClassReloaderTests stx:libjava/experiments 'Languages-Java-Tests-ClassReloading' 1
 JavaMethodWrapperCompiler JavaMethodWrapperCompiler stx:libjava/experiments 'Languages-Java-Experiments-Lookup' 0
 NoReflectionObject NoReflectionObject stx:libjava/experiments 'Languages-Java-Experiments-Lookup' 0
 PersonSample PersonSample stx:libjava/experiments 'Languages-Java-Experiments-Tests' 0
@@ -11,4 +12,3 @@
 JavaByteCodeSteppableInterpreter JavaByteCodeSteppableInterpreter stx:libjava/experiments 'Languages-Java-Bytecode' 0
 Benchmarks::JavaLookup Benchmarks__JavaLookup stx:libjava/experiments 'benchmarks-Misc' 0
 JavaByteCodeInterpreterTests JavaByteCodeInterpreterTests stx:libjava/experiments 'Languages-Java-Tests' 1
-JavaClassReloaderTests JavaClassReloaderTests stx:libjava/experiments 'Languages-Java-Tests-ClassReloading' 1
--- a/experiments/bc.mak	Fri Oct 10 11:56:56 2014 +0100
+++ b/experiments/bc.mak	Sat Oct 11 23:21:45 2014 +0100
@@ -34,7 +34,7 @@
 
 
 
-LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libjava
+LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libbasic3 -I$(INCLUDE_TOP)\stx\libjava -I$(INCLUDE_TOP)\stx\libjava\tools
 LOCALDEFINES=
 
 STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES)  -varPrefix=$(LIBNAME)
--- a/experiments/experiments.rc	Fri Oct 10 11:56:56 2014 +0100
+++ b/experiments/experiments.rc	Sat Oct 11 23:21:45 2014 +0100
@@ -3,7 +3,7 @@
 // automagically generated from the projectDefinition: stx_libjava_experiments.
 //
 VS_VERSION_INFO VERSIONINFO
-  FILEVERSION     6,2,32767,32767
+  FILEVERSION     6,2,26747,26747
   PRODUCTVERSION  6,2,4,0
 #if (__BORLANDC__)
   FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
@@ -20,12 +20,12 @@
     BEGIN
       VALUE "CompanyName", "eXept Software AG\0"
       VALUE "FileDescription", "Smalltalk/X Class library (LIB)\0"
-      VALUE "FileVersion", "6.2.32767.32767\0"
+      VALUE "FileVersion", "6.2.26747.26747\0"
       VALUE "InternalName", "stx:libjava/experiments\0"
       VALUE "LegalCopyright", "Copyright Claus Gittinger 1988-2014\nCopyright eXept Software AG 1998-2014\0"
       VALUE "ProductName", "Smalltalk/X\0"
       VALUE "ProductVersion", "6.2.4.0\0"
-      VALUE "ProductDate", "Thu, 18 Sep 2014 14:58:34 GMT\0"
+      VALUE "ProductDate", "Sat, 11 Oct 2014 22:19:46 GMT\0"
     END
 
   END
--- a/experiments/stx_libjava_experiments.st	Fri Oct 10 11:56:56 2014 +0100
+++ b/experiments/stx_libjava_experiments.st	Sat Oct 11 23:21:45 2014 +0100
@@ -63,6 +63,11 @@
  OTHER DEALINGS IN THE SOFTWARE.
 
 "
+!
+
+extensionsVersion_HG
+
+    ^ '$Changeset: <not expanded> $'
 ! !
 
 !stx_libjava_experiments class methodsFor:'description'!
@@ -118,6 +123,8 @@
      by searching all classes (and their packages) which are referenced by my classes."
 
     ^ #(
+        #'stx:libbasic3'    "MessageTracer - referenced by JavaClassReloaderTests>>test_05"
+        #'stx:libjava/tools'    "JavaCompiler - referenced by JavaClassReloaderTests>>callerClass"
     )
 !
 
@@ -191,6 +198,7 @@
     ^ #(
         "<className> or (<className> attributes...) in load order"
         JavaByteCodeInterpreter
+        (JavaClassReloaderTests autoload)
         JavaMethodWrapperCompiler
         NoReflectionObject
         PersonSample
@@ -200,7 +208,6 @@
         JavaByteCodeSteppableInterpreter
         (#'Benchmarks::JavaLookup' autoload)
         (JavaByteCodeInterpreterTests autoload)
-        (JavaClassReloaderTests autoload)
     )
 !
 
--- a/libjava.rc	Fri Oct 10 11:56:56 2014 +0100
+++ b/libjava.rc	Sat Oct 11 23:21:45 2014 +0100
@@ -3,7 +3,7 @@
 // automagically generated from the projectDefinition: stx_libjava.
 //
 VS_VERSION_INFO VERSIONINFO
-  FILEVERSION     6,2,32767,32767
+  FILEVERSION     6,2,26747,26747
   PRODUCTVERSION  6,2,4,0
 #if (__BORLANDC__)
   FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
@@ -20,12 +20,12 @@
     BEGIN
       VALUE "CompanyName", "eXept Software AG & SWING Research Group\0"
       VALUE "FileDescription", "Java support for Smalltalk/X (LIB)\0"
-      VALUE "FileVersion", "6.2.32767.32767\0"
+      VALUE "FileVersion", "6.2.26747.26747\0"
       VALUE "InternalName", "stx:libjava\0"
       VALUE "LegalCopyright", "Copyright Claus Gittinger 1988-2011\nCopyright eXept Software AG 1998-2011\nCopyright Jan Vrany, Jan Kurs and Marcel Hlopko\n          SWING Research Group, Czech Technical University In Prague\0"
       VALUE "ProductName", "Smalltalk/X\0"
       VALUE "ProductVersion", "6.2.4.0\0"
-      VALUE "ProductDate", "Thu, 18 Sep 2014 14:58:30 GMT\0"
+      VALUE "ProductDate", "Sat, 11 Oct 2014 22:19:43 GMT\0"
     END
 
   END
--- a/stx_libjava.st	Fri Oct 10 11:56:56 2014 +0100
+++ b/stx_libjava.st	Sat Oct 11 23:21:45 2014 +0100
@@ -51,6 +51,11 @@
      as of 1.9.2010
 
 "
+!
+
+extensionsVersion_HG
+
+    ^ '$Changeset: <not expanded> $'
 ! !
 
 !stx_libjava class methodsFor:'accessing'!
@@ -315,6 +320,7 @@
         JavaAnnotationDefault
         JavaAnnotationDictionary
         JavaAnnotationValue
+        (JavaAntProjectResource autoload)
         JavaArray
         JavaBooleanArray
         JavaByte
@@ -397,6 +403,7 @@
         JavaFieldAnnotationContainer
         JavaFieldDescriptor
         JavaFieldDescriptorWithUnionType
+        (JavaInitializedResource autoload)
         JavaInvalidRefError
         JavaInvokeDynamic2
         JavaMethod
@@ -447,7 +454,6 @@
         #'JavaNativeMethodImpl_OracleJDK8'
         (GroovyEvaluatorTests autoload)
         (JUnitTestCaseProxy autoload)
-        (JavaAntProjectResource autoload)
         (JavaByteCodeDisassemblerTests autoload)
         (JavaByteCodeProcessorTests autoload)
         (JavaClassLoadingTests autoload)
@@ -456,7 +462,6 @@
         (JavaExceptionTests autoload)
         (JavaFieldRefTests autoload)
         (JavaFreshlyInitializedResource autoload)
-        (JavaInitializedResource autoload)
         (JavaInterfaceMethodRefTests autoload)
         (JavaJUnitTests autoload)
         (JavaLibrariesResource autoload)
--- a/tools/stx_libjava_tools.st	Fri Oct 10 11:56:56 2014 +0100
+++ b/tools/stx_libjava_tools.st	Sat Oct 11 23:21:45 2014 +0100
@@ -7,6 +7,12 @@
 	category:'* Projects & Packages *'
 !
 
+!stx_libjava_tools class methodsFor:'documentation'!
+
+extensionsVersion_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
 
 !stx_libjava_tools class methodsFor:'description'!
 
--- a/tools/tools.rc	Fri Oct 10 11:56:56 2014 +0100
+++ b/tools/tools.rc	Sat Oct 11 23:21:45 2014 +0100
@@ -3,7 +3,7 @@
 // automagically generated from the projectDefinition: stx_libjava_tools.
 //
 VS_VERSION_INFO VERSIONINFO
-  FILEVERSION     6,2,32767,32767
+  FILEVERSION     6,2,26747,26747
   PRODUCTVERSION  6,2,4,0
 #if (__BORLANDC__)
   FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
@@ -20,12 +20,12 @@
     BEGIN
       VALUE "CompanyName", "eXept Software AG\0"
       VALUE "FileDescription", "Smalltalk/X Class library (LIB)\0"
-      VALUE "FileVersion", "6.2.32767.32767\0"
+      VALUE "FileVersion", "6.2.26747.26747\0"
       VALUE "InternalName", "stx:libjava/tools\0"
       VALUE "LegalCopyright", "Copyright Claus Gittinger 1988-2011\nCopyright eXept Software AG 1998-2011\0"
       VALUE "ProductName", "Smalltalk/X\0"
       VALUE "ProductVersion", "6.2.4.0\0"
-      VALUE "ProductDate", "Thu, 18 Sep 2014 14:58:37 GMT\0"
+      VALUE "ProductDate", "Sat, 11 Oct 2014 22:19:48 GMT\0"
     END
 
   END