JavaFieldRef2.st
branchdevelopment
changeset 2745 d82859be4462
parent 2711 a00302fe5083
child 2749 b097de8f18b1
--- a/JavaFieldRef2.st	Fri Sep 06 00:16:38 2013 +0100
+++ b/JavaFieldRef2.st	Tue Sep 10 00:11:17 2013 +0200
@@ -97,28 +97,42 @@
 
 findResolvedStaticValue
 
-self findResolvedValue.
+    self findResolvedValue.
 
     "Created: / 28-04-2011 / 22:05:10 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
     "Modified: / 03-12-2011 / 12:16:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 08-12-2011 / 13:37:05 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified (format): / 09-09-2013 / 23:39:33 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
 !
 
 findResolvedValue: doClassInit
+    |class|
     valueCache := JavaResolver uniqueInstance 
-                resolveFieldIndentifiedByRef: self.
+                resolveFieldIndentifiedByRef: self.                    
     valueCache isStatic ifTrue: [ classCache := valueCache javaClass ] ifFalse: [
         classCache := (constantPool at: classRefIndex) resolve: doClassInit.
-    ].
+    ].    
     classCache isNil ifTrue: [ self breakPoint: #mh ].
     self resolveOffset.
     nameAndTypeCache := (constantPool at: nameAndTypeIndex) resolve.
     self resolveType.
     nameAndTypeCache isNil ifTrue: [ self breakPoint: #mh ].
 
+    class := self classRef resolve: false.
+    class canCacheReferences ifTrue: [ ^ valueCache] ifFalse: [
+        "references to class cannot be cached, returning resolved value
+        and invalidating the reference so it has to be resolved again
+        next time"
+        |resolvedValue|
+        resolvedValue := valueCache.
+        self invalidate.
+        ^ resolvedValue.
+    ]
+
     "Modified: / 07-12-2011 / 21:52:23 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
     "Created: / 09-02-2012 / 23:09:18 / mh <hlopik@gmail.com>"
     "Modified: / 16-10-2012 / 10:46:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 10-09-2013 / 00:06:44 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
 !
 
 findStaticOffset