Fixed class reloader in cases a top-level class has both, nested and anonymous classes.
--- 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