--- 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 $'
! !