merge heads development
authorMarcel Hlopko <marcel.hlopko@fit.cvut.cz>
Sun, 14 Apr 2013 15:48:00 +0200
branchdevelopment
changeset 2510 8bcf99df65ee
parent 2509 ba1669165c50 (current diff)
parent 2504 08bdd02727cf (diff)
child 2511 a9325a7e0920
merge heads
--- a/JavaBehavior.st	Sun Apr 14 15:47:40 2013 +0200
+++ b/JavaBehavior.st	Sun Apr 14 15:48:00 2013 +0200
@@ -75,7 +75,6 @@
 "
 ! !
 
-
 !JavaBehavior class methodsFor:'initialization'!
 
 initialize
@@ -104,7 +103,6 @@
     "Modified: / 11-02-2012 / 16:55:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-
 !JavaBehavior class methodsFor:'constants'!
 
 ACC_NATIVE
@@ -125,7 +123,6 @@
     "Created: / 16.5.1998 / 00:02:07 / cg"
 ! !
 
-
 !JavaBehavior class methodsFor:'signature parsing'!
 
 initialValueFromSignature:aSignature
@@ -152,7 +149,6 @@
     ^ InitialValuePerType at:typeChar ifAbsent:nil.
 ! !
 
-
 !JavaBehavior methodsFor:'accessing'!
 
 accessFlags
@@ -181,7 +177,6 @@
     "Modified: / 31-05-2011 / 09:40:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-
 !JavaBehavior methodsFor:'compiler interface'!
 
 programmingLanguage
@@ -191,7 +186,6 @@
     "Created: / 26-10-2010 / 23:42:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-
 !JavaBehavior methodsFor:'private accessing'!
 
 makeObsolete
@@ -200,6 +194,26 @@
     "Created: 7.8.1997 / 19:04:48 / cg"
 !
 
+markCacheable
+    "
+    mark this class cacheable - references to this class don't have to be 
+    resolved over and over again, but can be cached.
+    "
+    self breakPoint: #mh.
+
+    "Created: / 14-04-2013 / 14:17:38 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+markNonCacheable
+    "
+    mark this class non cacheable - references to this class have to be 
+    resolved over and over again, because multiple versions of this class exist.
+    "
+    self breakPoint: #mh.
+
+    "Created: / 14-04-2013 / 14:25:23 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
 markUninitialized
     (accessFlags bitAnd:ACX_INITIALIZED) ~~ 0 ifTrue:[
 	accessFlags := accessFlags bitXor:ACX_INITIALIZED
@@ -230,7 +244,6 @@
     "Modified: 7.4.1997 / 15:44:53 / cg"
 ! !
 
-
 !JavaBehavior methodsFor:'queries'!
 
 hasInterface:aJavaInterface
@@ -362,7 +375,6 @@
     "Created: / 13-04-2012 / 18:51:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-
 !JavaBehavior class methodsFor:'documentation'!
 
 version
--- a/JavaClass.st	Sun Apr 14 15:47:40 2013 +0200
+++ b/JavaClass.st	Sun Apr 14 15:48:00 2013 +0200
@@ -22,12 +22,20 @@
 
 JavaBehavior subclass:#JavaClass
 	instanceVariableNames:'classLoader fullName sourceFile sourceString classfileBytes
-		fields staticFields annotations protectionDomain signatureJ'
+		fields staticFields annotations protectionDomain signatureJ
+		versions'
 	classVariableNames:'ArgumentConversionErrorSignal OrderOfClassInits'
 	poolDictionaries:'JavaConstants'
 	category:'Languages-Java-Classes'
 !
 
+Object subclass:#JavaClassVersionDiedHandler
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:JavaClass
+!
+
 !JavaClass class methodsFor:'documentation'!
 
 copyright
@@ -874,6 +882,29 @@
     "
 
     "Modified: 21.1.1997 / 22:48:28 / cg"
+!
+
+versions
+    "
+    Return all existing versions of this class.
+    A new version is added when a class is 
+    updated by runtime code reload and removed when all instances of 
+        the version die 
+    "
+
+    ^ versions.
+
+    "Created: / 14-04-2013 / 12:10:54 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+versions: aWeakArray
+    "
+    set this class' versions. It is expected that all versions of the 
+    class will share the same weak array instance.
+    "
+    versions := aWeakArray.
+
+    "Created: / 14-04-2013 / 12:28:09 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
 ! !
 
 !JavaClass methodsFor:'accessing - java'!
@@ -2782,6 +2813,64 @@
     "Created: / 08-11-2011 / 12:25:15 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 ! !
 
+!JavaClass methodsFor:'versions'!
+
+mergeVersionsWith: aJavaClass
+    "
+    take both self and aJavaClass and ensure that:
+    1) both share the same versions array instance
+    2) versions instance includes both self and aJavaClass.
+    "
+
+    (self versions isNil and: [ aJavaClass versions isNil ]) ifTrue: [
+|versions|
+        versions := WeakArray with: self with: aJavaClass.
+        versions addDependent: JavaClass::JavaClassVersionDiedHandler new.
+        self versions: versions.
+        aJavaClass versions: versions.        
+        ^ self.
+    ].
+    self versions isNil ifTrue: [
+        self versions: aJavaClass versions.
+        self versions add: self.
+        ^ self.
+    ].
+    aJavaClass versions isNil ifTrue: [
+        aJavaClass versions: self versions.
+        self versions add: aJavaClass.
+        ^ self.
+    ].
+    self error: 'merge of two classes both of which have multiple versions not supported'.
+
+    "Created: / 14-04-2013 / 13:44:03 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+! !
+
+!JavaClass::JavaClassVersionDiedHandler class methodsFor:'documentation'!
+
+history
+
+    "Created: #update:with:from: / 14-04-2013 / 14:04:20 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+! !
+
+!JavaClass::JavaClassVersionDiedHandler methodsFor:'notification'!
+
+update:aParameter with:anArgument from:source
+
+    aParameter = #ElementExpired ifFalse: [
+        self error: 'only #ElementExpired updates supported'.
+    ].
+    self assert: (source notNil and: [ source size >= 1 ]).
+
+    source size = 1 ifTrue: [
+        "only one version remaining - we can start caching. Let's change the flag"
+        | javaClass |
+        javaClass := (source at: 1).
+        javaClass markCacheable.
+    ].
+
+    "Created: / 14-04-2013 / 14:04:20 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+! !
+
 !JavaClass class methodsFor:'documentation'!
 
 version
--- a/JavaClassReloader.st	Sun Apr 14 15:47:40 2013 +0200
+++ b/JavaClassReloader.st	Sun Apr 14 15:48:00 2013 +0200
@@ -85,7 +85,6 @@
 "
 ! !
 
-
 !JavaClassReloader class methodsFor:'reloading'!
 
 reload: oldClass with: newClass
@@ -94,7 +93,6 @@
     "Created: / 20-02-2012 / 23:29:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-
 !JavaClassReloader methodsFor:'reloading'!
 
 reload: oldClass with: newClass
@@ -103,7 +101,8 @@
 
     newClassToInstall := SingleClassReloader new reload: oldClass with: newClass.
     "Also, reload all subclasses - fields may have changed!!"
-    newClassToInstall ~~ oldClass ifTrue:[
+    newClassToInstall ~~ oldClass ifTrue: [
+        oldClass mergeVersionsWith: newClassToInstall.
         oldClass subclassesDo:[:oldSubclass|
             | newSubclass |
 
@@ -116,9 +115,10 @@
     ^newClassToInstall.
 
     "Created: / 04-04-2012 / 01:32:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 14-04-2013 / 12:34:18 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified (format): / 14-04-2013 / 14:27:20 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
 ! !
 
-
 !JavaClassReloader::SingleClassReloader methodsFor:'private'!
 
 invalidate
@@ -278,7 +278,6 @@
     "Created: / 16-12-2012 / 17:36:52 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
 ! !
 
-
 !JavaClassReloader::SingleClassReloader methodsFor:'reloading'!
 
 reload
@@ -299,7 +298,6 @@
     "Created: / 20-02-2012 / 23:29:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-
 !JavaClassReloader::SingleClassReloader::FieldMapping class methodsFor:'instance creation'!
 
 old: old new:new
@@ -309,7 +307,6 @@
     "Created: / 21-02-2012 / 09:20:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-
 !JavaClassReloader::SingleClassReloader::FieldMapping methodsFor:'accessing'!
 
 new
@@ -333,7 +330,6 @@
     new := newArg.
 ! !
 
-
 !JavaClassReloader::SingleClassReloader::FieldMapping methodsFor:'queries'!
 
 mustMigrate
@@ -374,7 +370,6 @@
     "Created: / 21-02-2012 / 10:57:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-
 !JavaClassReloader class methodsFor:'documentation'!
 
 version_CVS