resolve rewritten; interpreter fixes
authorcg
Fri, 28 Jun 1996 21:44:19 +0000
changeset 91 9b325648aa77
parent 90 918e2740098c
child 92 9a1eef9e0de1
resolve rewritten; interpreter fixes
JavaClassReader.st
JavaDecompiler.st
JavaExceptionTableEntry.st
JavaLocalVariableTableEntry.st
JavaObject.st
JavaProcess.st
--- a/JavaClassReader.st	Fri Jun 28 21:39:53 1996 +0000
+++ b/JavaClassReader.st	Fri Jun 28 21:44:19 1996 +0000
@@ -1,7 +1,7 @@
 Object subclass:#JavaClassReader
-	instanceVariableNames:'inStream msb constants version majorVsn minorVsn constNeeds2Slots
+	instanceVariableNames:'inStream msb constants majorVsn minorVsn constNeeds2Slots
 		constSlot'
-	classVariableNames:'Verbose ClassPath Silent'
+	classVariableNames:'Verbose ClassPath Silent AbsolutelySilent LazyClassLoading'
 	poolDictionaries:''
 	category:'Java-Support'
 !
@@ -10,8 +10,12 @@
 !JavaClassReader  class methodsFor:'initialization'!
 
 initialize
-    Verbose := false. Silent := false.
-    self initializeClassPath
+    Verbose := false. 
+    Silent := true.
+    AbsolutelySilent := false.
+
+    self initializeClassPath.
+    LazyClassLoading := false. "/ true.
 
     "
      JavaClassReader initialize
@@ -66,7 +70,7 @@
     |rslt|
 
     rslt := self loadClassLazy:aClassName ignoring:Set new.
-    self postLoadActions.
+    rslt notNil ifTrue:[self postLoadActions].
 
     ^ rslt
 
@@ -93,11 +97,16 @@
        (i.e they are still ST-Strings).
      - The class is not initialized."
 
-    |rslt clsName|
+    |rslt clsName cls loadedClass|
 
     (aClassName endsWith:';') ifTrue:[
         ('oops - loading of ' , aClassName , ' attempted') printNL.
-self halt.
+        self halt:'should not happen'.
+        ^ nil
+    ].
+    (aClassName endsWith:'[]') ifTrue:[
+        ('oops - loading of ' , aClassName , ' attempted') printNL.
+        self halt:'should not happen'.
         ^ nil
     ].
 
@@ -106,21 +115,39 @@
         clsName := clsName copy replaceAll:$. by:$/
     ].
 
-    (classesBeingLoaded includes:clsName) ifTrue:[
+    (classesBeingLoaded notNil and:[classesBeingLoaded includes:clsName]) ifTrue:[
         ('oops - recursive load of ' , clsName , ' attempted') printNL.
-"/ self halt.
+        self halt:'should not happen'.
         ^ JavaUnresolvedClassConstant fullName:clsName
     ].
 
-    classesBeingLoaded add:clsName.
+    (cls := Java at:clsName) notNil ifTrue:[
+        ('oops - ' , clsName , ' is already loaded') printNL.
+        self halt:'should not happen'.
+        ^ cls
+    ].
+
+    classesBeingLoaded isNil ifTrue:[
+        loadedClass := Set with:clsName
+    ] ifFalse:[
+        loadedClass := Set withAll:classesBeingLoaded.
+        loadedClass add:clsName.
+    ].
 
     ClassPath do:[:path |
-        rslt := self loadFileLazy:(path , clsName , '.class')
-                         ignoring:classesBeingLoaded.
-        rslt notNil ifTrue:[^ rslt].
+        |nm|
+
+        (nm := path , clsName , '.class') asFilename exists ifTrue:[
+            rslt := self loadFileLazy:nm
+                             ignoring:loadedClass.
+            rslt notNil ifTrue:[
+                ^ rslt
+            ].
+        ]
     ].
 
-    ^ rslt
+    ('JAVA: no file found for: ' , clsName) infoPrintCR.
+    ^ nil
 !
 
 loadFile:aFilename
@@ -133,7 +160,8 @@
 
 loadFileLazy:aFilename ignoring:classesBeingLoaded
     "reads a class from aFilename, installs and returns it.
-     No strings are fixed and no class-init functions are called."
+     Strings are fixed and classrefs are fixed, 
+     but NO no class-init functions are called."
 
     |javaClass pool|
 
@@ -141,12 +169,9 @@
     javaClass notNil ifTrue:[
         Java at:(javaClass fullName asSymbol) put:javaClass.
 
-"/        javaClass resolveClassRefsIgnoring:classesBeingLoaded.
-
         classesBeingLoaded remove:javaClass fullName ifAbsent:nil.
 
-"/        Smalltalk at:(javaClass fullName asSymbol) put:javaClass.
-"/        Smalltalk changed.
+        JavaUnresolvedConstant resolveFor:javaClass.
     ].
     ^ javaClass
 
@@ -213,22 +238,57 @@
      Perform all class initialization functions (of those which are not
      yet initialized)."
 
-    JavaUnresolvedStringConstant patchupStringConstants.
+    |classes prevUnresolved newUnresolved|
 
-    Java allClassesDo:[:aJavaClass |
-        aJavaClass resolveClassRefsIgnoring:Set new.
+    "/ need at least java.lang.String, for valid constants
+    Java javaString isNil ifTrue:[
+        self loadClassLazy:'java.lang.String' ignoring:Set new.
     ].
 
-    Java allClassesDo:[:aJavaClass |
-        aJavaClass isInitialized ifFalse:[
-            aJavaClass classInit
-        ]
+    LazyClassLoading ifFalse:[
+        prevUnresolved := nil.
+        newUnresolved := JavaUnresolvedConstant unresolvedClassNames asArray.
+        [prevUnresolved ~= newUnresolved] whileTrue:[
+            newUnresolved do:[:nextUnresolved |
+                (Java at:nextUnresolved) isNil ifTrue:[ "/ could have been loaded in the meantime
+                    Silent ifFalse:[
+                        'loading unresolved: ' print. nextUnresolved printCR.
+                    ].
+
+                    self
+                        loadClassLazy:nextUnresolved
+                        ignoring:Set new.
+                ]
+            ].
+            prevUnresolved := newUnresolved.
+            newUnresolved := JavaUnresolvedConstant unresolvedClassNames asArray.
+        ].
+
+        newUnresolved size == 0 ifTrue:[
+            "/ nothing unresolved
+
+            (classes := Java allClasses) notNil ifTrue:[
+                "/ init all new classes
+                "/ fetch again - there could be new ones ...
+
+                classes := Java allClasses.
+                classes do:[:aJavaClass |
+                    aJavaClass isInitialized ifFalse:[
+                        Silent ifFalse:[
+                            'performing class initialization of ' print. aJavaClass fullName printCR.
+                        ].
+                        aJavaClass classInit
+                    ]
+                ]
+            ]
+        ].
     ]
 !
 
 readFile:aFilename ignoring:classesBeingLoaded
     "reads a class from aFilename and returns it.
-     The JavaClass is NOT installed as global"
+     The JavaClass is NOT installed as global and unresolved
+     refs are NOT patched."
 
     |inStream javaClass|
 
@@ -237,14 +297,19 @@
     ].
 
     inStream := aFilename asFilename readStream.
-    inStream isNil ifTrue:['nil' printNL. ^ nil].
-    javaClass := self readStream:inStream ignoring:classesBeingLoaded.
+    inStream isNil ifTrue:[
+        ('no file: ' , aFilename) printCR.
+        self halt.
+        ^ nil
+    ].
+
+    javaClass := self new readStream:inStream ignoring:classesBeingLoaded.
     javaClass notNil ifTrue:[
         javaClass setBinaryFilePath:(inStream pathName).
     ].
     inStream close.
 
-    Silent ifFalse:[
+    AbsolutelySilent ifFalse:[
         '  ... loaded ' print. javaClass displayString printNL.
     ].
 
@@ -297,9 +362,8 @@
     "/
     "/ get version
     "/
-    version := self nextU4.
-    majorVsn := (version bitShift:-16) bitAnd:16rFFFF.
-    minorVsn := version bitAnd:16rFFFF.
+    minorVsn := self nextU2.
+    majorVsn := self nextU2.
 
     Verbose ifTrue:[Transcript show:'version = '; 
                                show:(majorVsn printString); 
@@ -318,9 +382,6 @@
     this_class_index := self nextU2.
     super_class_index := self nextU2.
 
-"/    this_class_ref := constants at:this_class_index.
-"/    this_class := JavaClass fullName:(this_class_ref fullName).
-
     super_class_index == 0 ifTrue:[
         super_class := nil
     ] ifFalse:[
@@ -330,17 +391,23 @@
             super_class := existingSuperClass
         ] ifFalse:[
             (super_class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
-                existingSuperClass := super_class resolve.
-                existingSuperClass isNil ifTrue:[
-                    existingSuperClass := self class 
-                                        loadClassLazy:(super_class fullName)
-                                        ignoring:classesbeingLoaded.
+
+                
+                Silent ifFalse:[
+                    'load superClass: ' print. super_class fullName printCR.
                 ].
+
+                existingSuperClass := self class 
+                                    loadClassLazy:(super_class fullName)
+                                    ignoring:classesbeingLoaded.
+
                 existingSuperClass isNil ifTrue:[
                     self halt:('cannot find superclass: ' , super_class fullName).
                 ].
                 super_class := existingSuperClass
-            ].
+            ] ifFalse:[
+                self halt:'oops - superclass ?'
+            ]
         ].
     ].
 
@@ -366,11 +433,12 @@
         fields := fields select:[:f | f isStatic not].
 
         this_class := JavaClass fullName:(this_class_ref fullName) numStatic:nStatic.
+
         JavaClass setInstanceVariableStringFromFields:staticFields in:this_class class.
         this_class setStaticFields:staticFields.
         this_class initializeStaticFields.
     ] ifFalse:[
-        this_class := JavaClass fullName:(this_class_ref fullName).
+        this_class := JavaClass fullName:(this_class_ref fullName) numStatic:0.
     ].
 
     this_class setAccessFlags:access_flags.
@@ -386,6 +454,8 @@
 
     self readAttributesFor:this_class.
 
+    constants owner:this_class.
+
     ^ this_class
 
     "
@@ -540,8 +610,8 @@
     Verbose ifTrue:[Transcript show:'tag = '; showCR:tag].
 
     constReader := #(
-                        readConstant_Asciz              "/ 1
-                        readConstant_Undef              "/ 2
+                        readConstant_Asciz              "/ 1  - now called Utf8
+                        readConstant_Unicode            "/ 2
                         readConstant_Integer            "/ 3
                         readConstant_Float              "/ 4
                         readConstant_Long               "/ 5
@@ -551,7 +621,7 @@
                         readConstant_Fieldref           "/ 9
                         readConstant_Methodref          "/ 10
                         readConstant_InterfaceMethodref "/ 11
-                        readConstant_NameandType        "/ 12
+                        readConstant_NameAndType        "/ 12
                     ) at:tag ifAbsent:[#readConstant_Undef].
 
     ^ self perform:constReader.
@@ -573,7 +643,7 @@
     constantPoolCount := self nextU2.
     Verbose ifTrue:[Transcript show:'constantPoolCount = '; showCR:constantPoolCount].
 
-    constants := Array new:constantPoolCount-1.
+    constants := JavaConstantPool "Array" new:constantPoolCount-1.
 
     constSlot := 1.
     [constSlot < constantPoolCount] whileTrue:[
@@ -588,13 +658,19 @@
 
     constSlot := -1.
 
+    "/ preresolve what can be (especially, strings are resolved here)
+
     1 to:constantPoolCount-1 do:[:i |
         |const value|
 
         const := constants at:i.
         const notNil ifTrue:[   "/ kludge for 2-slot constants (which only take 1 slot in ST/X)
-            value := JavaUnresolvedConstant resolve:const from:constants.
-            constants at:i put:value.
+            (const isKindOf:JavaUnresolvedConstant) ifTrue:[
+                value := const preResolve.
+                value ~~ const ifTrue:[
+                    constants at:i put:value.
+                ]
+            ]
         ]
     ].
 
@@ -640,9 +716,10 @@
     ].
 
     ^ JavaUnresolvedClassConstant 
+        pool:constants
+        poolIndex:constSlot
         nameIndex:name_index
-        pool:constants
-        slotIndex:constSlot
+
     "
      JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
     "
@@ -701,7 +778,9 @@
     Verbose ifTrue:[Transcript show:'fieldref; classindex= ';     showCR:class_index].
     Verbose ifTrue:[Transcript show:'fieldref; name&typeindex= '; showCR:name_and_type_index].
 
-    ^ JavaUnresolvedFieldrefConstant 
+    ^ JavaUnresolvedFieldrefConstant
+                pool:constants
+                poolIndex:constSlot
                 classIndex:class_index
                 nameandTypeIndex:name_and_type_index
 
@@ -771,6 +850,8 @@
     Verbose ifTrue:[Transcript show:'methodref; name&typeindex= '; showCR:name_and_type_index].
 
     ^ JavaUnresolvedInterfaceMethodrefConstant 
+                pool:constants
+                poolIndex:constSlot
                 classIndex:class_index
                 nameandTypeIndex:name_and_type_index
 
@@ -816,6 +897,8 @@
     Verbose ifTrue:[Transcript show:'methodref; name&typeindex= '; showCR:name_and_type_index].
 
     ^ JavaUnresolvedMethodrefConstant 
+                pool:constants
+                poolIndex:constSlot
                 classIndex:class_index
                 nameandTypeIndex:name_and_type_index
 
@@ -827,7 +910,7 @@
     "Modified: 15.4.1996 / 16:07:19 / cg"
 !
 
-readConstant_NameandType
+readConstant_NameAndType
     |name_index signature_index|
 
     name_index := self nextU2.
@@ -837,8 +920,10 @@
     Verbose ifTrue:[Transcript show:'methodref; signatureindex= '; showCR:signature_index].
 
     ^ JavaUnresolvedNameandTypeConstant 
+                pool:constants
+                poolIndex:constSlot
                 nameIndex:name_index
-                signatureIndex:signature_index
+                signatureIndex:signature_index  
 
     "
      JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
@@ -855,7 +940,10 @@
 
     Verbose ifTrue:[Transcript show:'string; index= '; showCR:string_index].
 
-    ^ JavaUnresolvedStringConstant index:string_index
+    ^ JavaUnresolvedStringConstant 
+        pool:constants 
+        poolIndex:constSlot
+        stringIndex:string_index
 
     "
      Verbose := true.
@@ -1230,6 +1318,6 @@
 !JavaClassReader  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaClassReader.st,v 1.28 1996/06/27 16:31:19 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaClassReader.st,v 1.29 1996/06/28 21:42:31 cg Exp $'
 ! !
 JavaClassReader initialize!
--- a/JavaDecompiler.st	Fri Jun 28 21:39:53 1996 +0000
+++ b/JavaDecompiler.st	Fri Jun 28 21:44:19 1996 +0000
@@ -133,10 +133,14 @@
 
         (fdiv)                                  "/ 110
         (ddiv)                                  "/ 111
-        (imod)                                  "/ 112
-        (lmod)                                  "/ 113
-        (fmod)                                  "/ 114
-        (dmod)                                  "/ 115
+"/        (imod)                                  "/ 112     "/ obsolete
+        (irem)                                  "/ 112
+"/        (lmod)                                  "/ 113     "/ obsolete
+        (lrem)                                  "/ 113
+"/        (fmod)                                  "/ 114     "/ obsolete
+        (frem)                                  "/ 114
+"/        (dmod)                                  "/ 115     "/ obsolete
+        (drem)                                  "/ 115
         (ineg)                                  "/ 116
         (lneg)                                  "/ 117
         (fneg)                                  "/ 118
@@ -615,6 +619,6 @@
 !JavaDecompiler  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaDecompiler.st,v 1.16 1996/06/25 10:30:39 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaDecompiler.st,v 1.17 1996/06/28 21:42:14 cg Exp $'
 ! !
 JavaDecompiler initialize!
--- a/JavaExceptionTableEntry.st	Fri Jun 28 21:39:53 1996 +0000
+++ b/JavaExceptionTableEntry.st	Fri Jun 28 21:44:19 1996 +0000
@@ -6,7 +6,7 @@
 !
 
 
-!JavaExceptionTableEntry class methodsFor:'instance creation'!
+!JavaExceptionTableEntry  class methodsFor:'instance creation'!
 
 startPC:start_pc endPC:end_pc handlerPC:handler_pc catchType:catch_type
     ^ self new startPC:start_pc endPC:end_pc handlerPC:handler_pc catchType:catch_type
@@ -47,8 +47,8 @@
     "Created: 16.4.1996 / 12:11:45 / cg"
 ! !
 
-!JavaExceptionTableEntry class methodsFor:'documentation'!
+!JavaExceptionTableEntry  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaExceptionTableEntry.st,v 1.2 1996/05/06 09:01:58 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaExceptionTableEntry.st,v 1.3 1996/06/28 21:41:39 cg Exp $'
 ! !
--- a/JavaLocalVariableTableEntry.st	Fri Jun 28 21:39:53 1996 +0000
+++ b/JavaLocalVariableTableEntry.st	Fri Jun 28 21:44:19 1996 +0000
@@ -18,8 +18,8 @@
     "Created: 6.5.1996 / 11:18:14 / cg"
 ! !
 
-!JavaLocalVariableTableEntry class methodsFor:'documentation'!
+!JavaLocalVariableTableEntry  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaLocalVariableTableEntry.st,v 1.1 1996/05/06 10:06:41 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaLocalVariableTableEntry.st,v 1.2 1996/06/28 21:41:33 cg Exp $'
 ! !
--- a/JavaObject.st	Fri Jun 28 21:39:53 1996 +0000
+++ b/JavaObject.st	Fri Jun 28 21:44:19 1996 +0000
@@ -17,6 +17,7 @@
 !JavaObject  class methodsFor:'smalltalk interface'!
 
 convertJavaObject:val signature:retValSignature
+^ val.
     retValSignature = 'void' ifTrue:[
         ^ #void
     ].
@@ -63,7 +64,7 @@
 
     |s|
 
-    s := (Java at:'java/lang/String') basicNew.
+    s := Java javaString basicNew.
     s instVarNamed:'value'  put: aString.
     s instVarNamed:'offset' put: 0.
     s instVarNamed:'count'  put: aString size.
@@ -525,5 +526,5 @@
 !JavaObject  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaObject.st,v 1.15 1996/06/27 14:25:32 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaObject.st,v 1.16 1996/06/28 21:44:19 cg Exp $'
 ! !
--- a/JavaProcess.st	Fri Jun 28 21:39:53 1996 +0000
+++ b/JavaProcess.st	Fri Jun 28 21:44:19 1996 +0000
@@ -21,8 +21,8 @@
     "Created: 7.5.1996 / 09:02:12 / cg"
 ! !
 
-!JavaProcess class methodsFor:'documentation'!
+!JavaProcess  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaProcess.st,v 1.3 1996/05/07 09:53:11 cg Exp $'
+    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaProcess.st,v 1.4 1996/06/28 21:44:08 cg Exp $'
 ! !