--- a/src/JavaClassReader.st Tue May 10 07:31:14 2011 +0000
+++ b/src/JavaClassReader.st Tue May 10 21:04:10 2011 +0000
@@ -13,10 +13,10 @@
Object subclass:#JavaClassReader
instanceVariableNames:'inStream msb constants majorVsn minorVsn constNeeds2Slots
- constSlot'
+ constSlot classBeingRead'
classVariableNames:'Verbose AnnotationsVerbose Silent AbsolutelySilent
LazyClassLoading InvalidClassFormatSignal ClassLoaderQuerySignal
- JavaArchiveCache'
+ JavaArchiveCache UsedJavaClassReaderClass'
poolDictionaries:''
category:'Languages-Java-Support'
!
@@ -45,6 +45,7 @@
InvalidClassFormatSignal := Signal new mayProceed: true.
InvalidClassFormatSignal notifierString: 'class load failure'.
InvalidClassFormatSignal nameClass: self message: #invalidClassFormatSignal.
+ UsedJavaClassReaderClass := self.
Verbose := false.
Silent := true.
AbsolutelySilent := false.
@@ -55,13 +56,14 @@
ClassLoaderQuerySignal := QuerySignal new.
JavaArchiveCache := CacheDictionary new: 32.
AnnotationsVerbose := false.
+
"
JavaClassReader initialize"
"Modified: / 27-01-1998 / 17:54:23 / cg"
"Modified: / 17-12-2010 / 17:37:45 / Marcel Hlopko <hlopik@gmail.com>"
"Modified: / 10-02-2011 / 23:16:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
- "Modified: / 16-03-2011 / 12:13:41 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 09-05-2011 / 23:12:29 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
! !
!JavaClassReader class methodsFor:'Signal constants'!
@@ -413,17 +415,16 @@
"Created: / 30.3.1998 / 17:59:02 / cg"
!
-loadSystemClass:aClassName
+loadSystemClass: aClassName
"reads a class, installs and returns it.
The classes string constants are resolved & <clinit> is called,
if it implements it.
This only loads local classes (i.e. any Java classReader is not used)"
-
- |rslt|
-
- rslt := self loadClassLazy:aClassName ignoring:(Set new).
- rslt notNil ifTrue:[self postLoadActions].
-
+
+ | rslt |
+
+ rslt := UsedJavaClassReaderClass loadClassLazy: aClassName ignoring: (Set new).
+ rslt notNil ifTrue: [ UsedJavaClassReaderClass postLoadActions ].
^ rslt
"
@@ -433,11 +434,10 @@
JavaClassReader loadSystemClass:'java/lang/Object'
JavaClassReader loadSystemClass:'java/lang/AbstractMethodError'
- JavaClassReader loadSystemClass:'java/lang/Thread'
- "
-
- "Modified: / 3.1.1998 / 22:36:13 / cg"
- "Created: / 20.10.1998 / 17:24:40 / cg"
+ JavaClassReader loadSystemClass:'java/lang/Thread'"
+
+ "Created: / 20-10-1998 / 17:24:40 / cg"
+ "Modified: / 09-05-2011 / 23:12:58 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!
postLoadActions
@@ -572,21 +572,21 @@
"Modified: 14.8.1997 / 19:51:50 / cg"
!
-readStream:aStream ignoring:classesBeingLoaded
+readStream: aStream ignoring: classesBeingLoaded
"reads a class from aStream and returns it.
The JavaClass is not installed as global"
-
- |javaClass|
-
- javaClass := self new readStream:aStream ignoring:classesBeingLoaded.
-
- AbsolutelySilent ifFalse:[
- ' ... loaded ' print. javaClass displayString printNL.
- ].
-
+
+ | javaClass |
+
+ javaClass := UsedJavaClassReaderClass new readStream: aStream ignoring: classesBeingLoaded.
+ AbsolutelySilent
+ ifFalse:
+ [ ' ... loaded ' print.
+ javaClass displayString printNL. ].
^ javaClass
- "Modified: / 30.3.1998 / 18:14:40 / cg"
+ "Modified: / 30-03-1998 / 18:14:40 / cg"
+ "Modified: / 09-05-2011 / 23:15:30 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!
readStream:aStream loader:aClassLoader
@@ -604,28 +604,28 @@
"Modified: 15.8.1997 / 01:00:35 / cg"
!
-readStream:aStream loader:aClassLoader loadUnresolved:loadUnresolved
+readStream: aStream loader: aClassLoader loadUnresolved: loadUnresolved
"reads a class from aStream and returns it.
The JavaClass is installed as global.
If new classes are required to be loaded, aClassLoader is
asked to do it. If aClassLoader is nil, a new standard loader
is created."
-
- |javaClass|
-
- ClassLoaderQuerySignal answer:aClassLoader
- do:[
- javaClass := self readStream:aStream ignoring:(Set new).
- javaClass notNil ifTrue:[
- self postLoadActions:loadUnresolved.
- Java at:(javaClass fullName asSymbol) put:javaClass.
- JavaUnresolvedConstant resolveFor:javaClass.
- ].
- ].
+
+ | javaClass |
+
+ ClassLoaderQuerySignal answer: aClassLoader
+ do:
+ [ javaClass := self readStream: aStream ignoring: (Set new).
+ javaClass notNil
+ ifTrue:
+ [ UsedJavaClassReaderClass postLoadActions: loadUnresolved.
+ Java at: (javaClass fullName asSymbol) put: javaClass.
+ JavaUnresolvedConstant resolveFor: javaClass. ]. ].
^ javaClass
- "Created: / 15.8.1997 / 00:59:24 / cg"
- "Modified: / 23.1.1998 / 17:14:09 / cg"
+ "Created: / 15-08-1997 / 00:59:24 / cg"
+ "Modified: / 23-01-1998 / 17:14:09 / cg"
+ "Modified: / 09-05-2011 / 23:15:23 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!
resolveClass:aJavaClass
@@ -689,57 +689,100 @@
"Modified: / 20.10.1998 / 17:59:09 / cg"
! !
+!JavaClassReader class methodsFor:'mode setting'!
+
+useNewClassReader
+ UsedJavaClassReaderClass := JavaClassReader2.
+
+ "Created: / 09-05-2011 / 23:11:12 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+useOldClassReader
+UsedJavaClassReaderClass := JavaClassReader.
+
+ "Created: / 09-05-2011 / 23:11:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+! !
+
+!JavaClassReader methodsFor:'* uncategorized *'!
+
+updateOwnersInCP: each
+ each isJavaConstantPoolContent
+ ifTrue: [ each owner: classBeingRead ].
+
+ "Created: / 10-05-2011 / 17:12:29 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+! !
+
+!JavaClassReader methodsFor:'accessing'!
+
+constants
+^ constants.
+
+ "Created: / 10-05-2011 / 13:48:30 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+constants: aJavaConstantPool
+ constants := aJavaConstantPool.
+
+ "Created: / 10-05-2011 / 13:48:46 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+stream
+^ inStream.
+
+ "Created: / 09-05-2011 / 23:22:38 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+stream:aReadStream
+ inStream := aReadStream.
+
+ "Created: / 09-05-2011 / 23:23:11 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+! !
+
!JavaClassReader methodsFor:'file reading'!
-readClassFileIgnoring:classesbeingLoaded
+readClassFileIgnoring: classesbeingLoaded
"reads a class from inStream and returns it.
The JavaClass is not installed as global and its constants
(especially strings) may not be fully resolved."
- |magic access_flags this_class this_class_index super_class super_class_index realSuperClass this_class_ref existingSuperClass fields interfaces staticFields nStatic jSuperClass loader superClassName thisClassName existing_class thisMetaClass|
+ | magic access_flags this_class_index super_class super_class_index realSuperClass this_class_ref existingSuperClass fields interfaces staticFields nStatic jSuperClass loader superClassName thisClassName existing_class thisMetaClass |
"/
"/ read magic, determine byte order
"/
msb := true.
- magic := inStream nextUnsignedLongMSB:true.
- magic = (self class magic_MSB) ifFalse:[
- magic = (self class magic_LSB) ifFalse:[
- InvalidClassFormatSignal raiseErrorString:'not a java class file'.
- ^ nil
- ].
- msb := false.
- Verbose ifTrue:[
- Transcript showCR:'file is lsb'
- ].
- ] ifTrue:[
- Verbose ifTrue:[
- Transcript showCR:'file is msb'
- ].
- ].
+ magic := inStream nextUnsignedLongMSB: true.
+ magic = (self class magic_MSB)
+ ifFalse:
+ [ magic = (self class magic_LSB)
+ ifFalse:
+ [ InvalidClassFormatSignal raiseErrorString: 'not a java class file'.
+ ^ nil ].
+ msb := false.
+ Verbose ifTrue: [ Transcript showCR: 'file is lsb' ]. ]
+ ifTrue: [ Verbose ifTrue: [ Transcript showCR: 'file is msb' ]. ].
"/
"/ get version
"/
- minorVsn := inStream nextUnsignedShortMSB:msb.
- majorVsn := inStream nextUnsignedShortMSB:msb.
- ((self class fileMajorVersions includes:majorVsn) not
- or:[(self class fileMinorVersions includes:minorVsn) not])
- ifTrue:[
- Transcript
- show:'warning this file has version ';
- show:majorVsn;
- show:'.';
- showCR:minorVsn.
- ].
- Verbose ifTrue:[
- Transcript
- show:'version = ';
- show:(majorVsn printString);
- show:'.';
- showCR:(minorVsn printString).
- ].
+ minorVsn := inStream nextUnsignedShortMSB: msb.
+ majorVsn := inStream nextUnsignedShortMSB: msb.
+ ((self class fileMajorVersions includes: majorVsn) not
+ or: [ (self class fileMinorVersions includes: minorVsn) not ])
+ ifTrue:
+ [ Transcript
+ show: 'warning this file has version ';
+ show: majorVsn;
+ show: '.';
+ showCR: minorVsn. ].
+ Verbose
+ ifTrue:
+ [ Transcript
+ show: 'version = ';
+ show: (majorVsn printString);
+ show: '.';
+ showCR: (minorVsn printString). ].
"/
"/ get constant pool
@@ -751,61 +794,59 @@
"/ access flags
"/
- access_flags := inStream nextUnsignedShortMSB:msb.
- this_class_index := inStream nextUnsignedShortMSB:msb.
- super_class_index := inStream nextUnsignedShortMSB:msb.
- super_class_index == 0 ifTrue:[
- super_class := nil
- ] ifFalse:[
- super_class := constants at:super_class_index.
- superClassName := super_class fullName.
-
- "/ special for ST-classes
-
- (superClassName startsWith:'smalltalk.') ifTrue:[
- "/ a Smalltalk class
- superClassName := superClassName copyFrom:11.
- existingSuperClass := Smalltalk at:superClassName asSymbol.
- existingSuperClass notNil ifTrue:[
- super_class := existingSuperClass
- ] ifFalse:[
- "/ self halt - must load superclass ...
- ]
- ] ifFalse:[
- "/ a JAVA class
- existingSuperClass := Java classNamed:superClassName.
- existingSuperClass notNil ifTrue:[
- super_class := existingSuperClass
- ] ifFalse:[
- (super_class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
- Silent ifFalse:[
- 'load superClass: ' print.
- superClassName printCR.
- ].
- loader := ClassLoaderQuerySignal query.
- loader isNil ifTrue:[
- existingSuperClass := self class loadClassLazy:superClassName
- ignoring:classesbeingLoaded.
- ] ifFalse:[
- jSuperClass := loader
- perform:#'loadClass(Ljava/lang/String;)Ljava/lang/Class;'
- with:(Java as_String:superClassName).
- existingSuperClass := JavaVM reflection classForJavaClassObject:jSuperClass.
- ].
- existingSuperClass isNil ifTrue:[
- ('JAVA: cannot find superclass: ' , superClassName) infoPrintCR.
-
- "/ self halt:('cannot find superclass: ' , superClassName).
-
- ^ nil.
- ].
- super_class := existingSuperClass
- ] ifFalse:[
- self halt:'oops - superclass ?'
- ]
- ].
- ].
- ].
+ access_flags := inStream nextUnsignedShortMSB: msb.
+ this_class_index := inStream nextUnsignedShortMSB: msb.
+ super_class_index := inStream nextUnsignedShortMSB: msb.
+ super_class_index == 0
+ ifTrue: [ super_class := nil ]
+ ifFalse:
+ [ super_class := constants at: super_class_index.
+ superClassName := super_class fullName.
+
+ "/ special for ST-classes
+
+ (superClassName startsWith: 'smalltalk.')
+ ifTrue:
+ [ "/ a Smalltalk class
+ superClassName := superClassName copyFrom: 11.
+ existingSuperClass := Smalltalk at: superClassName asSymbol.
+ existingSuperClass notNil
+ ifTrue: [ super_class := existingSuperClass ]
+ ifFalse:
+ [ "/ self halt - must load superclass ...
+ ] ]
+ ifFalse:
+ [ "/ a JAVA class
+ existingSuperClass := Java classNamed: superClassName.
+ existingSuperClass notNil
+ ifTrue: [ super_class := existingSuperClass ]
+ ifFalse:
+ [ (super_class isMemberOf: JavaUnresolvedClassConstant)
+ ifTrue:
+ [ Silent
+ ifFalse:
+ [ 'load superClass: ' print.
+ superClassName printCR. ].
+ loader := ClassLoaderQuerySignal query.
+ loader isNil
+ ifTrue:
+ [ existingSuperClass := self class loadClassLazy: superClassName
+ ignoring: classesbeingLoaded. ]
+ ifFalse:
+ [ jSuperClass := loader
+ perform: #'loadClass(Ljava/lang/String;)Ljava/lang/Class;'
+ with: (Java as_String: superClassName).
+ existingSuperClass := JavaVM reflection
+ classForJavaClassObject: jSuperClass. ].
+ existingSuperClass isNil
+ ifTrue:
+ [ ('JAVA: cannot find superclass: ' , superClassName) infoPrintCR.
+
+ "/ self halt:('cannot find superclass: ' , superClassName).
+
+ ^ nil. ].
+ super_class := existingSuperClass ]
+ ifFalse: [ self halt: 'oops - superclass ?' ] ]. ]. ].
"/
"/ get interfaces
@@ -824,51 +865,53 @@
"/ static fields are created as class-InstVars
"/
- staticFields := fields select:[:f | f isStatic].
+ staticFields := fields select: [:f | f isStatic ].
nStatic := staticFields size.
- this_class_ref := constants at:this_class_index.
+ this_class_ref := constants at: this_class_index.
thisClassName := this_class_ref fullName.
"/ care for smalltalk classes ...
- (thisClassName startsWith:'smalltalk.') ifTrue:[
- thisClassName := thisClassName copyFrom:11.
- existing_class := Smalltalk at:thisClassName asSymbol.
- existing_class notNil ifTrue:[
- self halt:('overloading existing class: ' , thisClassName).
- thisClassName := (thisClassName , '_new') asSymbol.
- ].
- thisMetaClass := Metaclass new.
- thisMetaClass setSuperclass:super_class class.
- thisMetaClass instSize:(super_class class instSize + nStatic).
- this_class := thisMetaClass new.
- this_class setSuperclass:super_class.
- this_class setName:thisClassName asSymbol.
- ] ifFalse:[
- "/ a java class
- this_class := JavaClass fullName:thisClassName numStatic:nStatic.
- nStatic ~~ 0 ifTrue:[
- fields := fields select:[:f | f isStatic not].
- JavaClass setInstanceVariableStringFromFields:staticFields
- in:this_class class.
- this_class setStaticFields:staticFields.
- this_class initializeStaticFields.
- ].
- this_class setAccessFlags:access_flags.
- this_class setSuperclass:super_class.
- this_class setConstantPool:constants.
- this_class setFields:fields.
- this_class setInterfaces:interfaces.
- constants owner:this_class.
- ].
+ (thisClassName startsWith: 'smalltalk.')
+ ifTrue:
+ [ thisClassName := thisClassName copyFrom: 11.
+ existing_class := Smalltalk at: thisClassName asSymbol.
+ existing_class notNil
+ ifTrue:
+ [ self halt: ('overloading existing class: ' , thisClassName).
+ thisClassName := (thisClassName , '_new') asSymbol. ].
+ thisMetaClass := Metaclass new.
+ thisMetaClass setSuperclass: super_class class.
+ thisMetaClass instSize: (super_class class instSize + nStatic).
+ classBeingRead := thisMetaClass new.
+ classBeingRead setSuperclass: super_class.
+ classBeingRead setName: thisClassName asSymbol. ]
+ ifFalse:
+ [ "/ a java class
+ classBeingRead := JavaClass fullName: thisClassName numStatic: nStatic.
+ nStatic ~~ 0
+ ifTrue:
+ [ fields := fields select: [:f | f isStatic not ].
+ JavaClass setInstanceVariableStringFromFields: staticFields
+ in: classBeingRead class.
+ classBeingRead setStaticFields: staticFields.
+ classBeingRead initializeStaticFields. ].
+ classBeingRead setAccessFlags: access_flags.
+ classBeingRead setSuperclass: super_class.
+ classBeingRead setConstantPool: constants.
+ classBeingRead setFields: fields.
+ classBeingRead setInterfaces: interfaces.
+ constants owner: classBeingRead. ].
"/
"/ get methods
"/
- self readMethodsFor:this_class.
- self readAttributesFor:this_class.
- ^ this_class
+ self readMethodsFor: classBeingRead.
+ self readAttributesFor: classBeingRead.
+
+ classBeingRead constantPool do: [:each | self updateOwnersInCP: each].
+ ^ classBeingRead.
"
JavaClassReader loadFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
@@ -884,6 +927,7 @@
"Modified: / 15-10-2010 / 17:37:38 / Jan Kurs <kurs.jan@post.cz>"
"Modified: / 19-10-2010 / 21:43:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 28-01-2011 / 15:09:48 / Marcel Hlopko <hlopik@gmail.com>"
+ "Modified: / 10-05-2011 / 17:12:51 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!
readStream:aStream ignoring:classesBeingLoaded
@@ -2535,3 +2579,4 @@
JavaClassReader initialize!
+