Fixed #isObsolete for Java classes being replaceb by newer version(s).
authorJan Vrany <jan.vrany@fit.cvut.cz>
Mon, 19 Sep 2016 17:01:59 +0100
changeset 3623 cfae550eeda1
parent 3622 2b5c28231160
child 3624 014e840913cd
Fixed #isObsolete for Java classes being replaceb by newer version(s). * Fixed JavaClass>>isObsolete to test for bit ACX_OBSOLETE. * Fixed JavaMetaclass>>isObsolete to ask it's class. * Changed `JavaClassRegistry` to mark old class as obsolete when it's replaced. This is necessary for tools (namely browser) as it refetches class the onecurrently being displayed is changed. This depends on correct return value of #isObsolete.
JavaClass.st
JavaClassRegistry.st
JavaClassReloaderTests.st
JavaMetaclass.st
--- a/JavaClass.st	Mon Sep 19 15:26:35 2016 +0100
+++ b/JavaClass.st	Mon Sep 19 17:01:59 2016 +0100
@@ -2350,6 +2350,18 @@
     "Modified: / 08-10-2013 / 19:22:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!JavaClass methodsFor:'private'!
+
+beObsolete
+    "Mark the class as obsolete. This means that the this very
+     version has been replaced by a newer version and is no longer
+     accessible through java class registry"
+
+    accessFlags := accessFlags bitOr: ACX_OBSOLETE
+
+    "Created: / 19-09-2016 / 16:46:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !JavaClass methodsFor:'private accessing'!
 
 addMethod:m name:name signature:signature
@@ -2958,6 +2970,15 @@
     "Modified: / 09-10-2013 / 00:43:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+isObsolete
+    "return true, if the receiver is obsolete
+     Java classes are never."
+
+    ^ (accessFlags bitAnd:ACX_OBSOLETE) ~~ 0.
+
+    "Created: / 19-09-2016 / 16:47:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 isUnresolved
     "return true, if the receiver is unresolved;
      javaClasses are never; JavaUnresolvedClasses are always"
--- a/JavaClassRegistry.st	Mon Sep 19 15:26:35 2016 +0100
+++ b/JavaClassRegistry.st	Mon Sep 19 17:01:59 2016 +0100
@@ -1,5 +1,3 @@
-"{ Encoding: utf8 }"
-
 "
  COPYRIGHT (c) 1996-2015 by Claus Gittinger
 
@@ -344,6 +342,8 @@
                         self unregisterClassInClassLoader: oldClass.  
                         "/ ...from reflection cache....
                         JavaVM reflection removeJavaClassObjectForClass: oldClass.                 
+                        "/ ...and finally mark it obsolete...
+                        oldClass beObsolete.
 
                         classesPerLoader
                             at: newClass binaryName
@@ -383,7 +383,7 @@
 
     "Created: / 23-10-2011 / 11:53:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 02-11-2011 / 18:40:52 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Modified: / 15-08-2014 / 15:19:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 19-09-2016 / 16:54:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 registerClasses: classes
@@ -640,6 +640,6 @@
 !
 
 version_SVN
-    ^ '§Id§'
+    ^ '§Id§'
 ! !
 
--- a/JavaClassReloaderTests.st	Mon Sep 19 15:26:35 2016 +0100
+++ b/JavaClassReloaderTests.st	Mon Sep 19 17:01:59 2016 +0100
@@ -584,6 +584,12 @@
     public String foo = "foo+bar";
     public String bar = "foo+bar";
 }'.
+
+    self assert: jclass1 isObsolete.
+    self assert: jclass1 class isObsolete.
+    self deny: jclass2 isObsolete.
+    self deny: jclass2 class isObsolete.
+    
     jinst2 := jclass2 new.
 
     callerClass := self compileAndRegister:'
@@ -599,6 +605,7 @@
     self assert: (callerClass getFoo: jinst2) = 'foo+bar'.
 
     "Created: / 09-04-2013 / 15:32:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 19-09-2016 / 16:52:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_fields_02b
--- a/JavaMetaclass.st	Mon Sep 19 15:26:35 2016 +0100
+++ b/JavaMetaclass.st	Mon Sep 19 17:01:59 2016 +0100
@@ -20,6 +20,8 @@
 "
 "{ Package: 'stx:libjava' }"
 
+"{ NameSpace: Smalltalk }"
+
 Metaclass subclass:#JavaMetaclass
 	instanceVariableNames:''
 	classVariableNames:''
@@ -162,6 +164,12 @@
 
 !JavaMetaclass methodsFor:'queries'!
 
+isObsolete
+   ^ myClass isObsolete
+
+    "Created: / 19-09-2016 / 16:47:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 owningClass
     ^ myClass owningClass