resolve rewritten
authorcg
Fri, 28 Jun 1996 21:39:53 +0000
changeset 90 918e2740098c
parent 89 3f6da952c7c6
child 91 9b325648aa77
resolve rewritten
Java.st
JavaClass.st
JavaClassPointerRef.st
JavaFieldref.st
JavaInterfaceMethodref.st
JavaMethod.st
JavaMethodref.st
JavaNameandType.st
JavaRef.st
JavaUnresolvedClassConstant.st
JavaUnresolvedConstant.st
JavaUnresolvedFieldrefConstant.st
JavaUnresolvedInterfaceMethodrefConstant.st
JavaUnresolvedMethodrefConstant.st
JavaUnresolvedNameandTypeConstant.st
JavaUnresolvedRefConstant.st
JavaUnresolvedStringConstant.st
--- a/Java.st	Fri Jun 28 21:39:41 1996 +0000
+++ b/Java.st	Fri Jun 28 21:39:53 1996 +0000
@@ -1,6 +1,6 @@
 Object subclass:#Java
 	instanceVariableNames:''
-	classVariableNames:'Classes UnresolvedClassRefs SourceDirectories'
+	classVariableNames:'Classes UnresolvedClassRefs SourceDirectories JavaString'
 	poolDictionaries:''
 	category:'Java-Support'
 !
@@ -8,22 +8,12 @@
 
 !Java  class methodsFor:'accessing'!
 
-allClasses
-    ^ Classes
-
-    "
-     Java allClasses do:[:cls |
-        cls methodDictionary keysAndValuesDo:[:sel :mthd |
-            ('*updateClient*' match:sel) ifTrue:[
-                self halt
-            ]
-        ]
-     ]
-    "
+classNamed:aString
+    ^ self at:aString
 !
 
-classNamed:aString
-    ^ self at:aString
+javaString
+    ^ JavaString
 !
 
 sourceDirectories
@@ -77,6 +67,10 @@
 
 !Java  class methodsFor:'enumerating'!
 
+allClasses
+    ^ Classes
+!
+
 allClassesDo:aBlock
     Classes notNil ifTrue:[
         Classes do:aBlock
@@ -104,7 +98,7 @@
 
     nm := aJavaName.
     (nm includes:$.) ifTrue:[
-        nm := (nm copy replaceAll:$. by:$/).
+        nm := (nm asString copy replaceAll:$. by:$/).
         sym := nm asSymbolIfInterned.
         sym notNil ifTrue:[
             cls := Classes at:sym ifAbsent:nil.
@@ -136,14 +130,21 @@
 !
 
 at:aJavaName put:aJavaClass
+    |nameSymbol|
+
     Classes isNil ifTrue:[
         Classes := IdentityDictionary new.
     ].
-    (Classes includesKey:(aJavaName asSymbol)) ifTrue:[
+
+    nameSymbol := aJavaName asSymbol.
+    (Classes includesKey:nameSymbol) ifTrue:[
         self halt:'class ' , aJavaName , ' is already loaded'.
     ].
 
-    Classes at:(aJavaName asSymbol) put:aJavaClass.
+    Classes at:nameSymbol put:aJavaClass.
+    nameSymbol == #'java/lang/String' ifTrue:[
+        JavaString := aJavaClass
+    ].
 
 "/    UnresolvedClassRefs notNil ifTrue:[
 "/        UnresolvedClassRefs do:[:toResolve |
@@ -157,9 +158,11 @@
 !
 
 flushClasses
-    Classes := UnresolvedClassRefs := nil.
+    Classes := UnresolvedClassRefs := JavaString := nil.
     JavaInterpreter terminateAllThreads.
     JavaInterpreter releaseAllMonitors.
+    JavaInterpreter releaseAllWindows.
+    JavaUnresolvedConstant flushPatchLists.
 
     "
      Java flushClasses
@@ -178,14 +181,37 @@
     "
 !
 
+nextUnresolved
+    |unresolved|
+
+    UnresolvedClassRefs isNil ifTrue:[
+        ^ nil
+    ].
+    unresolved := UnresolvedClassRefs removeFirst.
+    UnresolvedClassRefs isEmpty ifTrue:[
+        UnresolvedClassRefs := nil
+    ].
+    ^ unresolved
+
+
+
+!
+
 rememberUnresolved:anUnresolvedClassRef
-"/    UnresolvedClassRefs isNil ifTrue:[
-"/        UnresolvedClassRefs := OrderedCollection new.
-"/    ].
-"/    UnresolvedClassRefs add:anUnresolvedClassRef
+    ('JAVA: remember unresolved class: ' , anUnresolvedClassRef fullName) infoPrintCR.
+
+    UnresolvedClassRefs isNil ifTrue:[
+        UnresolvedClassRefs := Set new.
+    ].
+    UnresolvedClassRefs add:anUnresolvedClassRef
 
     "Created: 18.4.1996 / 00:05:31 / cg"
     "Modified: 18.4.1996 / 00:05:41 / cg"
+!
+
+unresolvedClassRefFor:aClassName
+    UnresolvedClassRefs isNil ifTrue:[^ nil].
+    ^ UnresolvedClassRefs at:aClassName ifAbsent:nil.
 ! !
 
 !Java  class methodsFor:'source management'!
@@ -294,6 +320,6 @@
 !Java  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/Java.st,v 1.13 1996/06/27 15:56:36 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/Java.st,v 1.14 1996/06/28 21:36:24 cg Exp $'
 ! !
 Java initialize!
--- a/JavaClass.st	Fri Jun 28 21:39:41 1996 +0000
+++ b/JavaClass.st	Fri Jun 28 21:39:53 1996 +0000
@@ -1,6 +1,6 @@
 ClassDescription subclass:#JavaClass
 	instanceVariableNames:'fullName accessFlags constantPool sourceFile binaryFilePath
-		fields initialized initValues staticFields'
+		fields initialized initValues staticFields hasUnresolvedConstants'
 	classVariableNames:'InitialValuePerType'
 	poolDictionaries:''
 	category:'Java-Classes'
@@ -30,9 +30,9 @@
 !JavaClass  class methodsFor:'instance creation'!
 
 fullName:aString
-    ^ self new setFullName:aString
+    self shouldNotImplement.
+    ^ self new flags:0; setFullName:aString
 
-    "Created: 15.4.1996 / 15:52:55 / cg"
 !
 
 fullName:aString numStatic:nStatic
@@ -143,6 +143,10 @@
     ^ fullName
 !
 
+javaClass
+    ^ self
+!
+
 name
     ^ name "/ fullName
 !
@@ -191,7 +195,7 @@
 
     m := self compiledMethodAt:#'<clinit>()V'.
     m notNil ifTrue:[
-        'calling clinit() of ' print. self fullName printNL.
+"/        'calling clinit() of ' print. self fullName printNL.
         [
             self invokeJavaMethod:m sender:thisContext.
         ] valueOnUnwindDo:[
@@ -214,6 +218,8 @@
 !
 
 initializeStaticFields
+    staticFields isNil ifTrue:[^ self].
+
     staticFields do:[:f |
         |val type|
 
@@ -477,6 +483,7 @@
 
 setConstantPool:anArray
     constantPool := anArray.
+    hasUnresolvedConstants := true
 
     "Created: 15.4.1996 / 16:42:52 / cg"
 !
@@ -598,56 +605,10 @@
 
 isPublic
     ^ (accessFlags bitAnd:16r0001) ~~ 0
-! !
-
-!JavaClass methodsFor:'resolving class refs'!
-
-resolveClassRefsIgnoring:classesBeingLoaded
-    |newClass const newConst clsName cls|
-
-    (superclass isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
-        newClass := superclass resolve.
-        newClass isNil ifTrue:[
-            newClass := JavaClassReader 
-                                loadClassLazy:(superclass fullName)
-                                ignoring:classesBeingLoaded.
-        ].
-        newClass notNil ifTrue:[
-            superclass := newClass
-        ]
-    ].
+!
 
-    1 to:constantPool size do:[:index |
-        const := constantPool at:index.
-        
-        (const isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
-            "/ try to resolve
-            newConst := const resolve.
-            newConst isNil ifTrue:[
-                cls := const resolveClass.
-                cls isNil ifTrue:[
-                    clsName := const className.
-                    (classesBeingLoaded includes:clsName) ifFalse:[
-                        newConst := JavaClassReader 
-                                        loadClassLazy:clsName
-                                        ignoring:classesBeingLoaded.
-                    ]
-                ]
-            ].
-            newConst notNil ifTrue:[
-                constantPool at:index put:newConst
-            ]
-        ]
-    ].
-
-    (superclass notNil and:[(superclass isMemberOf:JavaUnresolvedClassConstant) not]) ifTrue:[
-        superclass resolveClassRefsIgnoring:classesBeingLoaded.
-        instSize := superclass instSize + (instvars asCollectionOfWords size)
-    ] ifFalse:[
-        instSize := instvars asCollectionOfWords size
-    ].
-"/Transcript show:'resolved '; show: self displayString; 
-"/           show: ' instSize='; showCr:  instSize.
+isUnresolved
+    ^ false
 ! !
 
 !JavaClass methodsFor:'smalltalk interface'!
@@ -701,6 +662,6 @@
 !JavaClass  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaClass.st,v 1.32 1996/06/27 16:30:57 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaClass.st,v 1.33 1996/06/28 21:35:48 cg Exp $'
 ! !
 JavaClass initialize!
--- a/JavaClassPointerRef.st	Fri Jun 28 21:39:41 1996 +0000
+++ b/JavaClassPointerRef.st	Fri Jun 28 21:39:53 1996 +0000
@@ -1,4 +1,4 @@
-JavaRef subclass:#JavaClassPointerRef
+JavaClassRef subclass:#JavaClassPointerRef
 	instanceVariableNames:''
 	classVariableNames:''
 	poolDictionaries:''
@@ -9,7 +9,10 @@
 !JavaClassPointerRef methodsFor:'accessing'!
 
 javaClass
-    self halt.
+    class isUnresolved ifTrue:[
+        self halt.
+    ].
+    ^ class
 
     "Created: 25.6.1996 / 09:36:09 / cg"
 ! !
@@ -17,5 +20,5 @@
 !JavaClassPointerRef  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaClassPointerRef.st,v 1.1 1996/06/25 08:16:11 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaClassPointerRef.st,v 1.2 1996/06/28 21:39:25 cg Exp $'
 ! !
--- a/JavaFieldref.st	Fri Jun 28 21:39:41 1996 +0000
+++ b/JavaFieldref.st	Fri Jun 28 21:39:53 1996 +0000
@@ -35,13 +35,15 @@
 
     offset notNil ifTrue:[^ offset].
 
-    (class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
-        cls := class resolve.
-        cls notNil ifTrue:[
-            class := cls
-        ].
-    ].
-    (class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
+"/    class := class resolveClass.
+
+"/    (class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
+"/        cls := class resolve.
+"/        cls notNil ifTrue:[
+"/            class := cls
+"/        ].
+"/    ].
+    class isUnresolved ifTrue:[
         self halt:'unresolved class'.
     ].
 
@@ -58,15 +60,19 @@
 
     offset notNil ifTrue:[^ offset].
 
-    (class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
-        cls := class resolve.
-        cls notNil ifTrue:[
-            class := cls
-        ]
+    cls := class javaClass.
+    cls ~~ class ifTrue:[
+        class := cls.
     ].
-    (class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
-        self halt:'unresolved class'.
-    ].
+"/    (class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
+"/        cls := class resolve.
+"/        cls notNil ifTrue:[
+"/            class := cls
+"/        ]
+"/    ].
+"/    (class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
+"/        self halt:'unresolved class'.
+"/    ].
 
     nm := nameandType name asSymbol.
     sig := nameandType signature.
@@ -80,18 +86,19 @@
 
     type notNil ifTrue:[^ type].
 
-    (class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
-        cls := class resolve.
-        cls notNil ifTrue:[
-            class := cls
-        ]
-    ].
-    (class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
+"/    class := class resolveClass.
+
+"/    (class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
+"/        cls := class resolve.
+"/        cls notNil ifTrue:[
+"/            class := cls
+"/        ]
+"/    ].
+    class isUnresolved ifTrue:[
         self halt:'unresolved class'.
     ].
 
     sig := nameandType signature.
-
     type := JavaMethod typeFromSignature:sig.
     ^ type.
 ! !
@@ -99,5 +106,5 @@
 !JavaFieldref  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaFieldref.st,v 1.11 1996/06/27 18:38:11 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaFieldref.st,v 1.12 1996/06/28 21:37:51 cg Exp $'
 ! !
--- a/JavaInterfaceMethodref.st	Fri Jun 28 21:39:41 1996 +0000
+++ b/JavaInterfaceMethodref.st	Fri Jun 28 21:39:53 1996 +0000
@@ -6,8 +6,8 @@
 !
 
 
-!JavaInterfaceMethodref class methodsFor:'documentation'!
+!JavaInterfaceMethodref  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaInterfaceMethodref.st,v 1.2 1996/05/03 21:14:13 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaInterfaceMethodref.st,v 1.3 1996/06/28 21:38:10 cg Exp $'
 ! !
--- a/JavaMethod.st	Fri Jun 28 21:39:41 1996 +0000
+++ b/JavaMethod.st	Fri Jun 28 21:39:53 1996 +0000
@@ -315,6 +315,13 @@
     "Modified: 16.4.1996 / 12:49:06 / cg"
 !
 
+hasLineNumberInformation
+    ^ lineNumberTable notNil
+
+    "Created: 16.4.1996 / 12:34:04 / cg"
+    "Modified: 16.4.1996 / 12:49:06 / cg"
+!
+
 javaByteCode
     ^ javaByteCode
 
@@ -329,6 +336,13 @@
     "Created: 16.4.1996 / 14:55:44 / cg"
 !
 
+lineNumber
+    ^ lineNumberTable at:2
+
+    "Created: 16.4.1996 / 12:34:04 / cg"
+    "Modified: 16.4.1996 / 12:49:06 / cg"
+!
+
 lineNumberTable
     ^ lineNumberTable
 
@@ -426,8 +440,43 @@
     "Created: 16.4.1996 / 15:28:15 / cg"
 !
 
-setLineNumberTable:anArray
-    lineNumberTable := anArray.
+setLineNumberTable:anArrayOfPCtoLineAssociations
+    "since this uses up lots of memory, compress it"
+
+    |allBytes allWords idx|
+
+    allBytes := allWords := true.
+
+    anArrayOfPCtoLineAssociations do:[:assoc |
+        assoc key > 255 ifTrue:[
+            allBytes := false.
+            assoc key > 16rFFFF ifTrue:[
+                allWords := false.
+            ].
+        ].
+        assoc value > 255 ifTrue:[
+            allBytes := false.
+            assoc value > 16rFFFF ifTrue:[
+                allWords := false
+            ].
+        ].
+    ].
+    allBytes ifTrue:[
+        lineNumberTable := ByteArray new:(anArrayOfPCtoLineAssociations size * 2).
+    ] ifFalse:[
+        allWords ifTrue:[
+            lineNumberTable := WordArray new:(anArrayOfPCtoLineAssociations size * 2).
+        ] ifFalse:[
+            lineNumberTable := Array new:(anArrayOfPCtoLineAssociations size * 2).
+        ]
+    ].
+
+    idx := 1.
+    anArrayOfPCtoLineAssociations do:[:assoc |
+        lineNumberTable at:idx   put:assoc key.
+        lineNumberTable at:idx+1 put:assoc value.
+        idx := idx + 2.
+    ].
 
     "Created: 16.4.1996 / 12:34:04 / cg"
     "Modified: 16.4.1996 / 12:49:06 / cg"
@@ -570,15 +619,15 @@
     lineNumberTable notNil ifTrue:[
         classSource := javaClass source.
         classSource notNil ifTrue:[
-            lineNumberTable do:[:assoc |
-                assoc key >= pc ifTrue:[
-                    assoc key == pc ifTrue:[^ assoc value].
-                    last isNil ifTrue:[^ assoc value].
-                    ^ last value.
+            lineNumberTable pairWiseDo:[:lPc :lNr |
+                lPc >= pc ifTrue:[
+                    lPc == pc ifTrue:[^ lNr].
+                    last isNil ifTrue:[^ lNr].
+                    ^ last.
                 ].
-                last := assoc.
+                last := lNr.
             ].
-            ^ lineNumberTable first value
+            ^ lineNumberTable at:2
         ].
     ].
 
@@ -611,6 +660,6 @@
 !JavaMethod  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaMethod.st,v 1.20 1996/06/27 16:30:06 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaMethod.st,v 1.21 1996/06/28 21:36:09 cg Exp $'
 ! !
 JavaMethod initialize!
--- a/JavaMethodref.st	Fri Jun 28 21:39:41 1996 +0000
+++ b/JavaMethodref.st	Fri Jun 28 21:39:53 1996 +0000
@@ -13,6 +13,7 @@
 !
 
 selector
+self halt.
     sel isNil ifTrue:[
         sel := (nameandType name , nameandType signature) asSymbol.
     ].
@@ -37,15 +38,20 @@
 
     method notNil ifTrue:[^ method].
 
-    (class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
-        cls := class resolve.
-        cls notNil ifTrue:[
-            class := cls
-        ]
+    cls := class javaClass.
+    cls ~~ class ifTrue:[
+        class := cls.
     ].
-    (class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
-        self halt:'unresolved class'.
-    ].
+
+"/    (class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
+"/        cls := class resolve.
+"/        cls notNil ifTrue:[
+"/            class := cls
+"/        ]
+"/    ].
+"/    (class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
+"/        self halt:'unresolved class'.
+"/    ].
 
     sel isNil ifTrue:[
         nm := nameandType name asSymbol.
@@ -67,12 +73,19 @@
 
     cls == Array ifTrue:[
         cls := Java classNamed:'java.lang.Object'.
+    ] ifFalse:[
+        cls isBehavior ifTrue:[
+            cls isMeta ifTrue:[
+                cls := cls soleInstance.
+            ].
+            (cls isKindOf:JavaClass) ifFalse:[
+                self halt
+            ]
+        ].
+"/        cls := cls javaClass.
     ].
 
-    (cls isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
-        cls := cls resolve
-    ].
-    (cls isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
+    cls isUnresolved ifTrue:[
         self halt:'unresolved class'.
     ].
 
@@ -95,5 +108,5 @@
 !JavaMethodref  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaMethodref.st,v 1.11 1996/06/27 18:38:57 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaMethodref.st,v 1.12 1996/06/28 21:37:26 cg Exp $'
 ! !
--- a/JavaNameandType.st	Fri Jun 28 21:39:41 1996 +0000
+++ b/JavaNameandType.st	Fri Jun 28 21:39:53 1996 +0000
@@ -1,12 +1,12 @@
 Object subclass:#JavaNameandType
 	instanceVariableNames:'name signature'
-	classVariableNames:''
+	classVariableNames:'KnownNamesAndTypes'
 	poolDictionaries:''
 	category:'Java-Reader-Support'
 !
 
 
-!JavaNameandType class methodsFor:'instance creation'!
+!JavaNameandType  class methodsFor:'instance creation'!
 
 name:aString signature:signature
     ^ self new name:aString signature:signature
@@ -23,8 +23,8 @@
 !
 
 name:aString signature:aSignature
-     name := aString.
-     signature := aSignature
+     name := aString asSymbol.
+     signature := aSignature asSymbol
 
     "Created: 15.4.1996 / 16:16:47 / cg"
 !
@@ -38,13 +38,21 @@
 !JavaNameandType methodsFor:'printing & storing'!
 
 displayString
-    ^ self class name , '(name:' , name , ' signature: ' , signature displayString , ')'
+    ^ self class name , '(name:' , name displayString, ' signature:' , signature displayString , ')'
 
     "Created: 15.4.1996 / 16:32:40 / cg"
 ! !
 
-!JavaNameandType class methodsFor:'documentation'!
+!JavaNameandType methodsFor:'queries'!
+
+isUnresolved
+    ^ false
+
+
+! !
+
+!JavaNameandType  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaNameandType.st,v 1.3 1996/04/30 23:24:04 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaNameandType.st,v 1.4 1996/06/28 21:37:11 cg Exp $'
 ! !
--- a/JavaRef.st	Fri Jun 28 21:39:41 1996 +0000
+++ b/JavaRef.st	Fri Jun 28 21:39:53 1996 +0000
@@ -38,8 +38,16 @@
     "Created: 15.4.1996 / 16:18:54 / cg"
 ! !
 
+!JavaRef methodsFor:'queries'!
+
+isUnresolved
+    ^ false
+
+
+! !
+
 !JavaRef  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaRef.st,v 1.6 1996/06/27 18:38:27 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaRef.st,v 1.7 1996/06/28 21:38:38 cg Exp $'
 ! !
--- a/JavaUnresolvedClassConstant.st	Fri Jun 28 21:39:41 1996 +0000
+++ b/JavaUnresolvedClassConstant.st	Fri Jun 28 21:39:53 1996 +0000
@@ -1,5 +1,5 @@
 JavaUnresolvedConstant subclass:#JavaUnresolvedClassConstant
-	instanceVariableNames:'fullName pool poolIndex'
+	instanceVariableNames:'nameIndex fullName'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Java-Reader-Support'
@@ -9,11 +9,18 @@
 !JavaUnresolvedClassConstant  class methodsFor:'instance creation'!
 
 fullName:nm
-    ^ self new fullName:nm
+    |ref|
+
+    ref := Java unresolvedClassRefFor:nm.
+    ref notNil ifTrue:[^ ref].
+
+    ref := self new fullName:nm.
+    Java rememberUnresolved:ref.
+    ^ ref
 !
 
-nameIndex:index pool:aConstantPool slotIndex:slotIndex
-    ^ self new index:index pool:aConstantPool slotIndex:slotIndex
+pool:aPool poolIndex:slotIndex nameIndex:index
+    ^ self new pool:aPool poolIndex:slotIndex nameIndex:index
 ! !
 
 !JavaUnresolvedClassConstant methodsFor:'accessing'!
@@ -36,17 +43,35 @@
 fullName
     ^ fullName
 
-!
+! !
+
+!JavaUnresolvedClassConstant ignoredMethodsFor:'accessing'!
 
 fullName:nm
     fullName := nm
 
+! !
+
+!JavaUnresolvedClassConstant methodsFor:'accessing'!
+
+javaClass
+    |cls|
+
+    fullName isNil ifTrue:[
+        self halt.
+    ].
+    cls := Java at:fullName.
+    cls notNil ifTrue:[^ cls].
+
+('  *** late loading: ' , fullName) infoPrintCR.
+    ^ JavaClassReader loadClass:fullName.
+
 !
 
-index:index pool:aConstantPool slotIndex:slotIndex
-    super index:index.
-    pool := aConstantPool.
-    poolIndex := slotIndex.
+pool:aPool poolIndex:slotIndex nameIndex:name_index
+    constantPool := aPool.
+    constantPoolIndex := slotIndex.
+    nameIndex := name_index.
 
 ! !
 
@@ -61,30 +86,102 @@
 
 !JavaUnresolvedClassConstant methodsFor:'resolving'!
 
-resolve
-    |cls|
+preResolve
+    |clsName cls nm s ref|
+
+    fullName isNil ifTrue:[
+        "/ first, resolve my name ...
+
+        clsName := constantPool at:nameIndex.
+        "/ DEBUGGING
+        clsName isString ifFalse:[
+            self halt:'oops - no class name string in const pool'.
+        ].
+
+        fullName := clsName
+    ].
+
+    "/ try to resolve the class
+
+    "/ 'resolve: ' print. fullName printCR.
 
     cls := Java classNamed:fullName.
     cls notNil ifTrue:[
-        pool notNil ifTrue:[
-            pool at:poolIndex put:cls
+        "/ good - the class is already loaded.
+
+        constantPool at:constantPoolIndex put:cls.
+        ^ cls
+    ].
+
+    (fullName startsWith:$[) ifTrue:[
+        "/ a ref for newarray or new
+
+        nm := JavaMethod retvalSpecFromStream:(ReadStream on:fullName).
+        [nm endsWith:'[]'] whileTrue:[
+            nm := nm copyWithoutLast:2
+        ].
+
+        cls := Java classNamed:nm.
+        cls notNil ifTrue:[
+            ref := JavaClassPointerRef class:cls nameandType:fullName.
+            constantPool at:constantPoolIndex put:ref.
+            ^ ref
         ].
     ] ifFalse:[
-        Java rememberUnresolved:self.
+        nm := self className.
     ].
-    ^ cls
+
+    self rememberForResolveWith:nm.
+    ^ self
+
+    "Created: 15.4.1996 / 15:51:42 / cg"
+    "Modified: 15.4.1996 / 16:26:05 / cg"
+! !
+
+!JavaUnresolvedClassConstant ignoredMethodsFor:'resolving'!
+
+resolve
+    |cls nm|
+
+    cls := Java at:fullName.
+    cls isNil ifTrue:[
+        nm := self className.
+        cls := Java at:nm.
+    ].
+    cls notNil ifTrue:[
+        constantPool notNil ifTrue:[
+            constantPool at:constantPoolIndex put:cls
+        ].
+        ^ cls
+    ].
+
+    Java rememberUnresolved:self.
+    ^ nil
 
     "Created: 15.4.1996 / 15:51:42 / cg"
     "Modified: 15.4.1996 / 16:26:05 / cg"
 !
 
 resolveClass
-    |cls|
+    |cls nm|
 
-    cls := Java classNamed:self className.
+    nm := self className.
+    cls := Java at:nm.
     cls isNil ifTrue:[
-        Java rememberUnresolved:self.
+        cls := JavaClassReader loadClass:nm.
+        cls isNil ifTrue:[
+            ('JAVA: unresolved class remains: ' , nm) errorPrintCR.
+            ^ nil.
+        ].
+"/        Java rememberUnresolved:self.
     ].
+
+    cls notNil ifTrue:[
+        constantPool notNil ifTrue:[
+            constantPool at:constantPoolIndex put:cls
+        ].
+    ].
+
     ^ cls
 
     "Created: 15.4.1996 / 15:51:42 / cg"
@@ -92,9 +189,23 @@
 !
 
 resolveFrom:aConstantTable
-    |cls nm s ref|
+    |clsName cls nm s ref|
+
+self halt.
+    fullName isNil ifTrue:[
+        "/ first, resolve my name ...
 
-    fullName := self class resolve:(aConstantTable at:index) from:aConstantTable.
+        clsName := aConstantTable at:constantPoolIndex.
+        clsName isString ifTrue:[
+            fullName := clsName
+        ] ifFalse:[
+self halt:'oops - no class name string in const pool'.
+            fullName := self class resolve:clsName from:aConstantTable.
+        ].
+    ].
+
+    "/ try to resolve the class
+
 "/ 'resolve: ' print. fullName printCR.
 
     cls := Java classNamed:fullName.
@@ -117,6 +228,7 @@
 
     Java rememberUnresolved:self.
     ^ self
+
 "/    ^ JavaClass fullName:fullName
 
     "Created: 15.4.1996 / 15:51:42 / cg"
@@ -126,5 +238,5 @@
 !JavaUnresolvedClassConstant  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaUnresolvedClassConstant.st,v 1.13 1996/06/27 14:25:01 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaUnresolvedClassConstant.st,v 1.14 1996/06/28 21:39:12 cg Exp $'
 ! !
--- a/JavaUnresolvedConstant.st	Fri Jun 28 21:39:41 1996 +0000
+++ b/JavaUnresolvedConstant.st	Fri Jun 28 21:39:53 1996 +0000
@@ -1,6 +1,6 @@
 Object subclass:#JavaUnresolvedConstant
-	instanceVariableNames:'index'
-	classVariableNames:''
+	instanceVariableNames:'nextUnresolved prevUnresolved constantPool constantPoolIndex'
+	classVariableNames:'PatchLists'
 	poolDictionaries:''
 	category:'Java-Reader-Support'
 !
@@ -8,14 +8,41 @@
 
 !JavaUnresolvedConstant  class methodsFor:'instance creation'!
 
-index:index
-    ^ self new index:index
+pool:aPool poolIndex:index
+    ^ self new 
+        pool:aPool poolIndex:index
 
 
 ! !
 
+!JavaUnresolvedConstant  class methodsFor:'queries'!
+
+countUnresolved
+    |u cnt|
+
+    cnt := 0.
+    PatchLists do:[:patchList |
+        u := patchList.
+        [u notNil] whileTrue:[
+            cnt := cnt + 1.
+            u := u nextUnresolved
+        ]
+    ].
+    ^ cnt
+
+    "
+     self countUnresolved 
+    "
+! !
+
 !JavaUnresolvedConstant  class methodsFor:'resolving'!
 
+flushPatchLists
+    PatchLists := nil
+! !
+
+!JavaUnresolvedConstant  class ignoredMethodsFor:'resolving'!
+
 resolve:aPossiblyUnresolvedConstant from:aConstantTable
     (aPossiblyUnresolvedConstant isKindOf:JavaUnresolvedConstant) ifTrue:[
         ^ aPossiblyUnresolvedConstant resolveFrom:aConstantTable
@@ -24,24 +51,125 @@
 
 ! !
 
+!JavaUnresolvedConstant  class methodsFor:'resolving'!
+
+resolveFor:aJavaClass
+    "a JAVA class has been loaded - resolve what can be"
+
+    |patchList unresolved nameSymbol|
+
+"/ 'resolving: ' print. aJavaClass fullName printCR.
+
+    PatchLists isNil ifTrue:[^ self].
+
+    nameSymbol := aJavaClass fullName asSymbol.
+    patchList := PatchLists at:nameSymbol ifAbsent:nil.
+    patchList notNil ifTrue:[
+        PatchLists removeKey:nameSymbol.
+
+        [patchList notNil] whileTrue:[
+            unresolved := patchList.
+            patchList := unresolved nextUnresolved.
+
+            unresolved prevUnresolved:nil.
+            unresolved nextUnresolved:nil.
+            unresolved preResolve.
+        ]
+    ].
+
+!
+
+unresolvedClassNames
+    "return a collection of unresolved class names"
+
+    PatchLists isNil ifTrue:[^ #()].
+    ^ PatchLists keys 
+
+    "
+     self unresolvedClassNames 
+    "
+! !
+
 !JavaUnresolvedConstant methodsFor:'accessing'!
 
-index:i
-    index := i
+constantPool
+    ^ constantPool
+
+    "Created: 15.4.1996 / 15:59:45 / cg"
+!
+
+constantPoolIndex
+    ^ constantPoolIndex
 
     "Created: 15.4.1996 / 15:59:45 / cg"
+!
+
+nextUnresolved
+    ^ nextUnresolved
+!
+
+nextUnresolved:anUnresolvedConstant
+    nextUnresolved := anUnresolvedConstant
+!
+
+pool:aPool poolIndex:i
+    constantPool := aPool.
+    constantPoolIndex := i
+
+    "Created: 15.4.1996 / 15:59:45 / cg"
+!
+
+prevUnresolved:anUnresolvedConstant
+    prevUnresolved := anUnresolvedConstant
 ! !
 
 !JavaUnresolvedConstant methodsFor:'printing & storing'!
 
 displayString
-    ^ 'Unresolved( idx= ' , index printString , ')'
+    ^ (self class name) , '( idx= ' , constantPoolIndex printString , ')'
+
+
+! !
+
+!JavaUnresolvedConstant methodsFor:'queries'!
+
+isUnresolved
+    ^ true
+! !
+
+!JavaUnresolvedConstant methodsFor:'resolving'!
+
+preResolve
+    self subclassResponsibility.
+    ^ self
+
+
+!
 
+rememberForResolveWith:aFullClassName
+    |patchList nameSymbol|
+
+    prevUnresolved notNil ifTrue:[^ self].
+
+    PatchLists isNil ifTrue:[
+        PatchLists := IdentityDictionary new.
+    ].
+
+    nameSymbol := aFullClassName asSymbol.
+    patchList := PatchLists at:nameSymbol ifAbsent:nil.
+    patchList isNil ifTrue:[
+"/        ('first patch for: ' , aFullClassName) printCR.
+    ] ifFalse:[
+        patchList prevUnresolved:self.
+        nextUnresolved := patchList.
+    ].
+    PatchLists at:nameSymbol put:self.
+    prevUnresolved := #startOfList.
 
 ! !
 
 !JavaUnresolvedConstant  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaUnresolvedConstant.st,v 1.2 1996/06/27 14:25:11 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaUnresolvedConstant.st,v 1.3 1996/06/28 21:38:26 cg Exp $'
 ! !
--- a/JavaUnresolvedFieldrefConstant.st	Fri Jun 28 21:39:41 1996 +0000
+++ b/JavaUnresolvedFieldrefConstant.st	Fri Jun 28 21:39:53 1996 +0000
@@ -1,17 +1,69 @@
 JavaUnresolvedRefConstant subclass:#JavaUnresolvedFieldrefConstant
-	instanceVariableNames:''
+	instanceVariableNames:'classIndex'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Java-Reader-Support'
 !
 
 
+!JavaUnresolvedFieldrefConstant  class methodsFor:'instance creation'!
+
+pool:aPool poolIndex:idx classIndex:cIdx nameandTypeIndex:nmIdx
+    ^ self new 
+        pool:aPool poolIndex:idx classIndex:cIdx nameandTypeIndex:nmIdx
+
+
+! !
+
+!JavaUnresolvedFieldrefConstant methodsFor:'accessing'!
+
+pool:aPool poolIndex:slotIndex classIndex:cIdx nameandTypeIndex:nmIdx  
+    constantPool := aPool.
+    constantPoolIndex := slotIndex.
+    classIndex := cIdx.
+    nameandTypeIndex := nmIdx
+
+
+
+! !
+
 !JavaUnresolvedFieldrefConstant methodsFor:'resolving'!
 
+preResolve
+    |className class nameAndType ref|
+
+    class := (constantPool at:classIndex).
+    class isUnresolved ifTrue:[
+        class := class preResolve.
+    ].
+    class isUnresolved ifFalse:[
+        nameAndType := (constantPool at:nameandTypeIndex).
+        nameAndType isUnresolved ifTrue:[
+            nameAndType := nameAndType preResolve.
+        ].
+        nameAndType isUnresolved ifFalse:[
+            "/ good - class is there
+
+            ref := JavaFieldref class:class nameandType:nameAndType.
+            constantPool at:constantPoolIndex put:ref.
+            ^ ref
+        ]
+    ].
+
+    self rememberForResolveWith:(class fullName).
+    ^ self
+
+    "Created: 15.4.1996 / 16:05:50 / cg"
+    "Modified: 15.4.1996 / 16:26:44 / cg"
+! !
+
+!JavaUnresolvedFieldrefConstant ignoredMethodsFor:'resolving'!
+
 resolveFrom:aConstantTable
     |class nameAndType|
 
-    class := self class resolve:(aConstantTable at:index) from:aConstantTable.
+self halt.
+    class := self class resolve:(aConstantTable at:constantPoolIndex) from:aConstantTable.
     nameAndType := self class resolve:(aConstantTable at:nameandTypeIndex) from:aConstantTable.
 
     ^ JavaFieldref 
@@ -22,8 +74,8 @@
     "Modified: 15.4.1996 / 16:26:44 / cg"
 ! !
 
-!JavaUnresolvedFieldrefConstant class methodsFor:'documentation'!
+!JavaUnresolvedFieldrefConstant  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaUnresolvedFieldrefConstant.st,v 1.4 1996/05/03 11:28:42 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaUnresolvedFieldrefConstant.st,v 1.5 1996/06/28 21:39:53 cg Exp $'
 ! !
--- a/JavaUnresolvedInterfaceMethodrefConstant.st	Fri Jun 28 21:39:41 1996 +0000
+++ b/JavaUnresolvedInterfaceMethodrefConstant.st	Fri Jun 28 21:39:53 1996 +0000
@@ -1,4 +1,4 @@
-JavaUnresolvedRefConstant subclass:#JavaUnresolvedInterfaceMethodrefConstant
+JavaUnresolvedMethodrefConstant subclass:#JavaUnresolvedInterfaceMethodrefConstant
 	instanceVariableNames:''
 	classVariableNames:''
 	poolDictionaries:''
@@ -6,23 +6,8 @@
 !
 
 
-!JavaUnresolvedInterfaceMethodrefConstant methodsFor:'resolving'!
-
-resolveFrom:aConstantTable
-    |class nameAndType|
-
-    class := self class resolve:(aConstantTable at:index) from:aConstantTable.
-    nameAndType := self class resolve:(aConstantTable at:nameandTypeIndex) from:aConstantTable.
-    ^ JavaInterfaceMethodref 
-        class:class
-        nameandType:nameAndType
-
-    "Modified: 15.4.1996 / 16:26:59 / cg"
-    "Created: 17.4.1996 / 22:47:26 / cg"
-! !
-
-!JavaUnresolvedInterfaceMethodrefConstant class methodsFor:'documentation'!
+!JavaUnresolvedInterfaceMethodrefConstant  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaUnresolvedInterfaceMethodrefConstant.st,v 1.1 1996/04/17 20:57:56 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaUnresolvedInterfaceMethodrefConstant.st,v 1.2 1996/06/28 21:39:18 cg Exp $'
 ! !
--- a/JavaUnresolvedMethodrefConstant.st	Fri Jun 28 21:39:41 1996 +0000
+++ b/JavaUnresolvedMethodrefConstant.st	Fri Jun 28 21:39:53 1996 +0000
@@ -1,28 +1,60 @@
 JavaUnresolvedRefConstant subclass:#JavaUnresolvedMethodrefConstant
-	instanceVariableNames:''
+	instanceVariableNames:'classIndex'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Java-Reader-Support'
 !
 
 
+!JavaUnresolvedMethodrefConstant  class methodsFor:'instance creation'!
+
+pool:aPool poolIndex:idx classIndex:cIdx nameandTypeIndex:nmIdx 
+    ^ self new 
+        pool:aPool poolIndex:idx classIndex:cIdx nameandTypeIndex:nmIdx
+! !
+
+!JavaUnresolvedMethodrefConstant methodsFor:'accessing'!
+
+pool:aPool poolIndex:idx classIndex:cIdx nameandTypeIndex:nmIdx
+    constantPool := aPool.
+    constantPoolIndex := idx.
+    classIndex := cIdx.
+    nameandTypeIndex := nmIdx
+
+! !
+
 !JavaUnresolvedMethodrefConstant methodsFor:'resolving'!
 
-resolveFrom:aConstantTable
-    |class nameAndType|
+preResolve
+    |nameAndType class ref|
+
+    "/ first, resolve the nameAndType & signature ...
 
-    class := self class resolve:(aConstantTable at:index) from:aConstantTable.
-    nameAndType := self class resolve:(aConstantTable at:nameandTypeIndex) from:aConstantTable.
-    ^ JavaMethodref 
-        class:class
-        nameandType:nameAndType
+    class := (constantPool at:classIndex).
+    class isUnresolved ifTrue:[
+        class := class preResolve.
+    ].
+    class isUnresolved ifFalse:[
+        nameAndType := (constantPool at:nameandTypeIndex).
+        nameAndType isUnresolved ifTrue:[
+            nameAndType := nameAndType preResolve.
+        ].
+        nameAndType isUnresolved ifFalse:[
+            "/ ok, got them
 
-    "Created: 15.4.1996 / 16:12:41 / cg"
-    "Modified: 15.4.1996 / 16:26:59 / cg"
+            ref := JavaMethodref class:class nameandType:nameAndType.
+            constantPool at:constantPoolIndex put:ref.
+            ^ ref
+        ]
+    ].
+
+    self rememberForResolveWith:(class fullName).
+    ^ self
+
 ! !
 
-!JavaUnresolvedMethodrefConstant class methodsFor:'documentation'!
+!JavaUnresolvedMethodrefConstant  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaUnresolvedMethodrefConstant.st,v 1.3 1996/04/17 20:57:28 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaUnresolvedMethodrefConstant.st,v 1.4 1996/06/28 21:39:46 cg Exp $'
 ! !
--- a/JavaUnresolvedNameandTypeConstant.st	Fri Jun 28 21:39:41 1996 +0000
+++ b/JavaUnresolvedNameandTypeConstant.st	Fri Jun 28 21:39:53 1996 +0000
@@ -1,22 +1,24 @@
 JavaUnresolvedConstant subclass:#JavaUnresolvedNameandTypeConstant
-	instanceVariableNames:'signatureIndex'
+	instanceVariableNames:'nameIndex signatureIndex'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Java-Reader-Support'
 !
 
 
-!JavaUnresolvedNameandTypeConstant class methodsFor:'instance creation'!
+!JavaUnresolvedNameandTypeConstant  class methodsFor:'instance creation'!
 
-nameIndex:name_index signatureIndex:signature_index
-    ^ (super index:name_index) signatureIndex:signature_index
-
-    "Created: 15.4.1996 / 16:15:16 / cg"
+pool:aPool poolIndex:slotIndex nameIndex:name_index signatureIndex:signature_index
+    ^ self new
+        pool:aPool poolIndex:slotIndex nameIndex:name_index signatureIndex:signature_index
 ! !
 
 !JavaUnresolvedNameandTypeConstant methodsFor:'accessing'!
 
-signatureIndex:signature_index
+pool:aPool poolIndex:slotIndex nameIndex:name_index signatureIndex:signature_index 
+    constantPool := aPool.
+    constantPoolIndex := slotIndex.
+    nameIndex := name_index.
     signatureIndex := signature_index
 
     "Created: 15.4.1996 / 16:14:39 / cg"
@@ -24,10 +26,36 @@
 
 !JavaUnresolvedNameandTypeConstant methodsFor:'resolving'!
 
+preResolve
+    |name signature ref|
+
+    name := (constantPool at:nameIndex).
+    name isString ifFalse:[
+        name := name preResolve.
+    ].
+    signature := (constantPool at:signatureIndex).
+    signature isString ifFalse:[
+        signature := signature preResolve.
+    ].
+    (name isString and:[signature isString]) ifTrue:[
+        ref := JavaNameandType name:name signature:signature.
+        constantPool at:constantPoolIndex put:ref.
+        ^ ref
+    ].
+
+    self halt:'should be resolvable'.
+    ^ self
+
+    "Created: 15.4.1996 / 16:15:53 / cg"
+    "Modified: 15.4.1996 / 16:27:33 / cg"
+! !
+
+!JavaUnresolvedNameandTypeConstant ignoredMethodsFor:'resolving'!
+
 resolveFrom:aConstantTable
     |name signature|
-
-    name := self class resolve:(aConstantTable at:index) from:aConstantTable.
+self halt.
+    name := self class resolve:(aConstantTable at:nameIndex) from:aConstantTable.
     signature := self class resolve:(aConstantTable at:signatureIndex) from:aConstantTable.
     ^ JavaNameandType 
         name:name
@@ -37,8 +65,8 @@
     "Modified: 15.4.1996 / 16:27:33 / cg"
 ! !
 
-!JavaUnresolvedNameandTypeConstant class methodsFor:'documentation'!
+!JavaUnresolvedNameandTypeConstant  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaUnresolvedNameandTypeConstant.st,v 1.1 1996/04/15 15:02:07 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaUnresolvedNameandTypeConstant.st,v 1.2 1996/06/28 21:38:44 cg Exp $'
 ! !
--- a/JavaUnresolvedRefConstant.st	Fri Jun 28 21:39:41 1996 +0000
+++ b/JavaUnresolvedRefConstant.st	Fri Jun 28 21:39:53 1996 +0000
@@ -6,14 +6,6 @@
 !
 
 
-!JavaUnresolvedRefConstant class methodsFor:'instance creation'!
-
-classIndex:class_index nameandTypeIndex:name_and_type_index
-    ^ (super index:class_index) nameandTypeIndex:name_and_type_index
-
-    "Created: 15.4.1996 / 16:11:49 / cg"
-! !
-
 !JavaUnresolvedRefConstant methodsFor:'accessing'!
 
 nameandTypeIndex:name_and_type_index
@@ -31,8 +23,8 @@
     "Modified: 15.4.1996 / 16:28:11 / cg"
 ! !
 
-!JavaUnresolvedRefConstant class methodsFor:'documentation'!
+!JavaUnresolvedRefConstant  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaUnresolvedRefConstant.st,v 1.1 1996/04/15 15:03:27 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaUnresolvedRefConstant.st,v 1.2 1996/06/28 21:38:17 cg Exp $'
 ! !
--- a/JavaUnresolvedStringConstant.st	Fri Jun 28 21:39:41 1996 +0000
+++ b/JavaUnresolvedStringConstant.st	Fri Jun 28 21:39:53 1996 +0000
@@ -1,79 +1,55 @@
 JavaUnresolvedConstant subclass:#JavaUnresolvedStringConstant
-	instanceVariableNames:''
-	classVariableNames:'PatchStack'
+	instanceVariableNames:'stringIndex'
+	classVariableNames:''
 	poolDictionaries:''
 	category:'Java-Reader-Support'
 !
 
 
-!JavaUnresolvedStringConstant class methodsFor:'instance creation'!
+!JavaUnresolvedStringConstant  class methodsFor:'instance creation'!
 
-stringIndex:index
-    ^ self index:index
+pool:aPool poolIndex:index stringIndex:stringIndex
+    ^ self new 
+        pool:aPool poolIndex:index stringIndex:stringIndex
+
+
 ! !
 
-!JavaUnresolvedStringConstant class methodsFor:'resolving'!
-
-patchupStringConstants
-    "sent after java/lang/String has been loaded.
-     patch all previously unresolved string constants
-     to become JavaStrings now ..."
-
-    |jString|
-
-    jString := Java classNamed:'java/lang/String'.
-    jString notNil ifTrue:[
-        PatchStack notNil ifTrue:[
-            PatchStack do:[:entry |
-                |table index string s|
+!JavaUnresolvedStringConstant methodsFor:'accessing'!
 
-                table := entry at:1.
-                index := entry at:2.
-                string := entry at:3.
-
-                s := jString basicNew.
-                s instVarNamed:'value'  put: string.
-                s instVarNamed:'offset' put: 0.
-                s instVarNamed:'count'  put: string size.
+pool:aPool poolIndex:i stringIndex:string_index
+    constantPool := aPool.
+    constantPoolIndex := i.
+    stringIndex := string_index.
 
-                table at:index put:s.
-            ]
-        ].
-        PatchStack := nil
-    ]
-
-    "
-     JavaUnresolvedStringConstant patchupStringConstants
-    "
 ! !
 
 !JavaUnresolvedStringConstant methodsFor:'resolving'!
 
-resolveFrom:aConstantTable
-    |string|
+preResolve
+    |jString chars|
+
+    Java javaString notNil ifTrue:[
+        chars := (constantPool at:stringIndex).
+        chars isString ifFalse:[
+            self halt:'should not happen'
+        ].
+        jString := JavaObject javaStringFrom:chars.
 
-    "/
-    "/ I would like to return a JAVA-String here
-    "/ however, we can only do this, after 'java/lang/String'
-    "/ is loaded ... (hen & egg problem)
-    "/
-    "/ therefore, remember things until the class is loaded, and
-    "/ patch string constants later
-    "/
-    string := self class resolve:(aConstantTable at:index) from:aConstantTable.
-    PatchStack isNil ifTrue:[
-        PatchStack := OrderedCollection new.
+"/constantPool owner == (Java at:'java/awt/Container') ifTrue:[
+"/self halt
+"/].
+
+        constantPool at:constantPoolIndex put:jString.
+        ^ jString.
     ].
-    PatchStack addLast:(Array with:aConstantTable with:index with:string).
 
-    ^ string
-
-    "Created: 15.4.1996 / 15:51:42 / cg"
-    "Modified: 15.4.1996 / 16:28:45 / cg"
+    self rememberForResolveWith:'java/lang/String'.
+    ^ self
 ! !
 
-!JavaUnresolvedStringConstant class methodsFor:'documentation'!
+!JavaUnresolvedStringConstant  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaUnresolvedStringConstant.st,v 1.2 1996/05/02 20:46:36 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaUnresolvedStringConstant.st,v 1.3 1996/06/28 21:36:50 cg Exp $'
 ! !