--- 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