Object subclass:#JavaClassReader
instanceVariableNames:'inStream msb constants version majorVsn minorVsn constNeeds2Slots
constSlot'
classVariableNames:'Verbose ClassPath Silent'
poolDictionaries:''
category:'Java-Support'
!
!JavaClassReader class methodsFor:'initialization'!
initialize
Verbose := false. Silent := false.
self initializeClassPath
"
JavaClassReader initialize
"
!
initializeClassPath
ClassPath := #(
'/phys/ibm3/java/lib/'
'/phys/ibm3/hotjava/classes/'
)
"
JavaClassReader initializeClassPath
"
! !
!JavaClassReader class methodsFor:'debugging'!
verbose:aBoolean
Verbose := aBoolean
"
JavaClassReader verbose:true
JavaClassReader verbose:false
"
! !
!JavaClassReader class methodsFor:'file reading'!
loadClass:aClassName
"reads a class, installs and returns it.
The classes string constants are resolved & <clinit> is called,
if it implements it."
|rslt|
rslt := self loadClassLazy:aClassName.
self postLoadActions.
^ rslt
"
JavaClassReader loadClass:'awt/Component'
JavaClassReader loadClass:'awt/Button'
JavaClassReader loadClass:'browser/AddButton'
JavaClassReader loadClass:'java/lang/Object'
JavaClassReader loadClass:'java/lang/AbstractMethodError'
JavaClassReader loadClass:'java/lang/Thread'
"
"Created: 15.4.1996 / 14:58:53 / cg"
!
loadClassLazy:aClassName
"private helper:
reads a class, installs and returns it.
The class is searched along the ClassPath.
This is a partial load (to load other classes):
- The classes stringConstants are not fixed to be JavaStrings
(i.e they are still ST-Strings).
- The class is not initialized."
|rslt clsName|
clsName := aClassName.
(clsName includes:$.) ifTrue:[
clsName := clsName copy replaceAll:$. by:$/
].
ClassPath do:[:path |
rslt := self loadFileLazy:(path , clsName , '.class').
rslt notNil ifTrue:[^ rslt].
].
^ nil
!
loadFile:aFilename
"reads a class from aFilename, installs and returns it.
The classes strings are fixed and its class-init function is called."
self loadFileLazy:aFilename.
self postLoadActions
!
loadFileLazy:aFilename
"reads a class from aFilename, installs and returns it.
No strings are fixed and no class-init functions are called."
|javaClass pool|
javaClass := self readFile:aFilename.
javaClass notNil ifTrue:[
Java at:(javaClass fullName asSymbol) put:javaClass.
javaClass resolveClassRefs.
"/ Smalltalk at:(javaClass fullName asSymbol) put:javaClass.
"/ Smalltalk changed.
].
^ javaClass
"
JavaClassReader loadFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
'/phys/ibm3/java/lib/java/lang' asFilename
directoryContents do:[:nm |
(nm endsWith:'.class') ifTrue:[
('/phys/ibm3/java/lib/java/lang/' , nm) printNL.
JavaClassReader loadFile:'/phys/ibm3/java/lib/java/lang/' , nm
]
].
'/phys/ibm3/java/lib/java/io' asFilename
directoryContents do:[:nm |
(nm endsWith:'.class') ifTrue:[
('/phys/ibm3/java/lib/java/io/' , nm) printNL.
JavaClassReader loadFile:'/phys/ibm3/java/lib/java/io/' , nm
]
].
'/phys/ibm3/java/lib/java/net' asFilename
directoryContents do:[:nm |
(nm endsWith:'.class') ifTrue:[
('/phys/ibm3/java/lib/java/net/' , nm) printNL.
JavaClassReader loadFile:'/phys/ibm3/java/lib/java/net/' , nm
]
].
'/phys/ibm3/java/lib/java/util' asFilename
directoryContents do:[:nm |
(nm endsWith:'.class') ifTrue:[
('/phys/ibm3/java/lib/java/util/' , nm) printNL.
JavaClassReader loadFile:'/phys/ibm3/java/lib/java/util/' , nm
]
].
'/phys/ibm3/java/lib/java/awt' asFilename
directoryContents do:[:nm |
(nm endsWith:'.class') ifTrue:[
('/phys/ibm3/java/lib/java/awt/' , nm) printNL.
JavaClassReader loadFile:'/phys/ibm3/java/lib/java/awt/' , nm
]
].
'/phys/ibm3/java/lib/java/applet' asFilename
directoryContents do:[:nm |
(nm endsWith:'.class') ifTrue:[
('/phys/ibm3/java/lib/java/applet/' , nm) printNL.
JavaClassReader loadFile:'/phys/ibm3/java/lib/java/applet/' , nm
]
].
JavaClassReader loadFile:'/phys/ibm3/java/lib/java/lang/AbstractMethodError.class'
JavaClassReader loadFile:'/phys/ibm3/java/lib/java/lang/Thread.class'
"
"Created: 15.4.1996 / 14:58:53 / cg"
!
postLoadActions
"Resolve all classes' string constants.
Perform all class initialization functions (of those which are not
yet initialized)."
JavaUnresolvedStringConstant patchupStringConstants.
Java allClassesDo:[:aJavaClass |
aJavaClass isInitialized ifFalse:[
aJavaClass classInit
]
]
!
readFile:aFilename
"reads a class from aFilename and returns it.
The JavaClass is NOT installed as global"
|inStream retVal|
Silent ifFalse:[
'reading ' print. aFilename print. ' ...' printNL.
].
inStream := aFilename asFilename readStream.
inStream isNil ifTrue:['nil' printNL. ^ nil].
retVal := self readStream:inStream.
inStream close.
Silent ifFalse:[
' ... loaded ' print. retVal displayString printNL.
].
^ retVal
"Created: 15.4.1996 / 14:58:53 / cg"
!
readStream:aStream
"reads a class from aStream and returns it.
The JavaClass is not installed as global"
^ self new readStream:aStream
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
"
"Modified: 15.4.1996 / 15:01:30 / cg"
! !
!JavaClassReader methodsFor:'file reading'!
readClassFile
"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|
"/
"/ read magic, determine byte order
"/
msb := true.
magic := self nextU4.
magic = 16rCAFEBABE ifFalse:[
magic = 16rBEBAFECA ifFalse:[
self error:'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
"/
version := self nextU4.
majorVsn := (version bitShift:-16) bitAnd:16rFFFF.
minorVsn := version bitAnd:16rFFFF.
Verbose ifTrue:[Transcript show:'version = ';
show:(majorVsn printString);
show:'.';
showCr:(minorVsn printString)].
"/
"/ get constant pool
"/
self readConstantPool.
"/
"/ access flags
"/
access_flags := self nextU2.
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:[
super_class := constants at:super_class_index.
existingSuperClass := Java classNamed:super_class fullName.
existingSuperClass notNil ifTrue:[
super_class := existingSuperClass
].
(super_class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
existingSuperClass := super_class resolve.
existingSuperClass isNil ifTrue:[
super_class := self class loadClassLazy:(super_class fullName).
].
super_class isNil ifTrue:[
self halt:('cannot find superclass: ' , super_class fullName).
]
].
].
"/
"/ get interfaces
"/
interfaces := self readInterfaces.
"/
"/ get fields
"/
fields := self readFieldInfofields.
"/
"/ create the fields as instVars
"/ static fields are created as class-InstVars
"/
staticFields := fields select:[:f | f isStatic].
nStatic := staticFields size.
this_class_ref := constants at:this_class_index.
nStatic ~~ 0 ifTrue:[
fields := fields select:[:f | f isStatic not].
this_class := JavaClass fullName:(this_class_ref fullName) numStatic:nStatic.
JavaClass setInstanceVariableStringFromFields:staticFields in:this_class class.
] ifFalse:[
this_class := JavaClass fullName:(this_class_ref fullName).
].
this_class setAccessFlags:access_flags.
this_class setSuperclass:super_class.
this_class setConstantPool:constants.
JavaClass setInstanceVariableStringFromFields:fields in:this_class.
"/
"/ get methods
"/
self readMethodsFor:this_class.
self readAttributesFor:this_class.
^ this_class
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/Alignable.class'
JavaClassReader verbose:true.
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/java/lang/ArithmeticException.class'
JavaClassReader readFile:'/phys/ibm3/java/lib/java/lang/ArithmeticException.class'
"
"Created: 15.4.1996 / 15:02:47 / cg"
"Modified: 15.4.1996 / 16:51:48 / cg"
!
readSourceFileAttributeFor:aJavaClass
|attribute_length sourceFile_index sourceFile|
attribute_length := self nextU4.
sourceFile_index := self nextU2.
sourceFile := constants at:sourceFile_index.
aJavaClass setSourceFile:sourceFile.
Verbose ifTrue:[Transcript show:'sourceFile: '; showCr:sourceFile].
^ true
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/Alignable.class'
"
"Modified: 15.4.1996 / 15:33:28 / cg"
"Created: 15.4.1996 / 15:40:17 / cg"
!
readStream:aStream
"reads a class from aStream and returns it.
The JavaClass is not installed as global"
inStream := aStream.
inStream binary.
^ self readClassFile
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
"
"Created: 15.4.1996 / 15:00:55 / cg"
"Modified: 15.4.1996 / 15:06:18 / cg"
! !
!JavaClassReader methodsFor:'file reading - attributes'!
readAttribute:attributeName for:something
(attributeName = 'Code') ifTrue:[
self readCodeAttributeFor:something.
^ true.
].
(attributeName = 'LineNumberTable') ifTrue:[
self readLineNumberTableAttributeFor:something.
^ true.
].
(attributeName = 'LocalVariableTable') ifTrue:[
self readLocalVariableTableAttributeFor:something.
^ true.
].
(attributeName = 'ConstantValue') ifTrue:[
self readConstantValueAttributeFor:something.
^ true.
].
(attributeName = 'SourceFile') ifTrue:[
self readSourceFileAttributeFor:something.
^ true.
].
^ false
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
"
"Modified: 15.4.1996 / 15:33:28 / cg"
"Created: 15.4.1996 / 15:40:17 / cg"
!
readAttributeFor:something
|attribute_name_index attribute_name attribute_length attribute_info|
Verbose ifTrue:[Transcript show:'attrib at pos: '; showCr:inStream position].
attribute_name_index := self nextU2.
"/
"/ UNDOC feature ?
"/
attribute_name_index > constants size ifTrue:[
attribute_name_index == 16rb700 ifTrue:[
self halt.
]
].
attribute_name := constants at:attribute_name_index.
Verbose ifTrue:[Transcript show:'attrib name: '; showCr:attribute_name].
(self readAttribute:attribute_name for:something) ifFalse:[
attribute_length := self nextU4.
attribute_info := ByteArray new:(attribute_length).
inStream nextBytes:attribute_length into:attribute_info startingAt:1.
Verbose ifTrue:[Transcript show:'skipped '; show:attribute_name; showCr:'-attribute'].
].
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
"
"Modified: 15.4.1996 / 15:33:28 / cg"
"Created: 15.4.1996 / 15:40:17 / cg"
!
readAttributesFor:something
|attributes_count|
attributes_count := self nextU2.
1 to:attributes_count do:[:i |
self readAttributeFor:something.
].
"Modified: 15.4.1996 / 15:33:28 / cg"
"Created: 15.4.1996 / 15:40:17 / cg"
! !
!JavaClassReader methodsFor:'file reading - constants'!
readConstant
|tag constReader const|
constNeeds2Slots := false.
"/
"/ get tag
"/
tag := self nextU1.
Verbose ifTrue:[Transcript show:'tag = '; showCr:tag].
constReader := #(
readConstant_Asciz "/ 1
readConstant_Undef "/ 2
readConstant_Integer "/ 3
readConstant_Float "/ 4
readConstant_Long "/ 5
readConstant_Double "/ 6
readConstant_Class "/ 7
readConstant_String "/ 8
readConstant_Fieldref "/ 9
readConstant_Methodref "/ 10
readConstant_InterfaceMethodref "/ 11
readConstant_NameandType "/ 12
) at:tag ifAbsent:[#readConstant_Undef].
^ self perform:constReader.
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
"
"Created: 15.4.1996 / 15:46:32 / cg"
"Modified: 15.4.1996 / 15:47:00 / cg"
!
readConstantPool
|constantPoolCount const i|
"/
"/ get constant pool
"/
constantPoolCount := self nextU2.
Verbose ifTrue:[Transcript show:'constantPoolCount = '; showCr:constantPoolCount].
constants := Array new:constantPoolCount-1.
constSlot := 1.
[constSlot < constantPoolCount] whileTrue:[
Verbose ifTrue:[Transcript show:'const: '; showCr:constSlot].
const := self readConstant.
constants at:constSlot put:const.
constNeeds2Slots ifTrue:[
constSlot := constSlot + 1.
].
constSlot := constSlot + 1.
].
1 to:constantPoolCount-1 do:[:i |
|const|
const := constants at:i.
const notNil ifTrue:[ "/ kludge for 2-slot constants (which only take 1 slot in ST/X)
constants at:i put:(JavaUnresolvedConstant resolve:const from:constants).
]
].
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/Alignable.class'
"
"Created: 15.4.1996 / 15:14:11 / cg"
"Modified: 15.4.1996 / 16:41:57 / cg"
!
readConstant_Asciz
|len string|
len := self nextU2.
string := String new:len.
inStream nextBytes:len into:string startingAt:1.
Verbose ifTrue:[Transcript show:'asciz; string= '; showCr:string].
^ string
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/Alignable.class'
"
"Created: 15.4.1996 / 15:15:35 / cg"
"Modified: 15.4.1996 / 16:33:45 / cg"
!
readConstant_Class
|name_index|
name_index := self nextU2.
Verbose ifTrue:[Transcript show:'class; index= '; showCr:name_index].
^ JavaUnresolvedClassConstant
nameIndex:name_index
pool:constants
slotIndex:constSlot
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
"
"Created: 15.4.1996 / 15:21:13 / cg"
"Modified: 15.4.1996 / 15:49:32 / cg"
!
readConstant_Double
|high low aFloat|
high := self nextU4.
low := self nextU4.
aFloat := Float new.
UninterpretedBytes isBigEndian ifTrue:[
aFloat basicAt:1 put:((high bitShift:-24) bitAnd:16rFF).
aFloat basicAt:2 put:((high bitShift:-16) bitAnd:16rFF).
aFloat basicAt:3 put:((high bitShift:-8) bitAnd:16rFF).
aFloat basicAt:4 put:(high bitAnd:16rFF).
aFloat basicAt:5 put:((low bitShift:-24) bitAnd:16rFF).
aFloat basicAt:6 put:((low bitShift:-16) bitAnd:16rFF).
aFloat basicAt:7 put:((low bitShift:-8) bitAnd:16rFF).
aFloat basicAt:8 put:(low bitAnd:16rFF).
] ifFalse:[
aFloat basicAt:1 put:(low bitAnd:16rFF).
aFloat basicAt:2 put:((low bitShift:-8) bitAnd:16rFF).
aFloat basicAt:3 put:((low bitShift:-16) bitAnd:16rFF).
aFloat basicAt:4 put:((low bitShift:-24) bitAnd:16rFF).
aFloat basicAt:5 put:(high bitAnd:16rFF).
aFloat basicAt:6 put:((high bitShift:-8) bitAnd:16rFF).
aFloat basicAt:7 put:((high bitShift:-16) bitAnd:16rFF).
aFloat basicAt:8 put:((high bitShift:-24) bitAnd:16rFF).
].
constNeeds2Slots := true.
Verbose ifTrue:[Transcript show:'double; value= '; showCr:aFloat].
^ aFloat
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/Alignable.class'
"
"Modified: 15.4.1996 / 15:42:16 / cg"
"Created: 15.4.1996 / 16:34:42 / cg"
!
readConstant_Fieldref
|class_index name_and_type_index|
class_index := self nextU2.
name_and_type_index := self nextU2.
Verbose ifTrue:[Transcript show:'fieldref; classindex= '; showCr:class_index].
Verbose ifTrue:[Transcript show:'fieldref; name&typeindex= '; showCr:name_and_type_index].
^ JavaUnresolvedFieldrefConstant
classIndex:class_index
nameandTypeIndex:name_and_type_index
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
"
"Created: 15.4.1996 / 15:22:18 / cg"
"Modified: 15.4.1996 / 16:07:01 / cg"
!
readConstant_Float
|high aFloat|
high := self nextU4.
aFloat := ShortFloat basicNew.
UninterpretedBytes isBigEndian ifTrue:[
aFloat basicAt:1 put:((high bitShift:-24) bitAnd:16rFF).
aFloat basicAt:2 put:((high bitShift:-16) bitAnd:16rFF).
aFloat basicAt:3 put:((high bitShift:-8) bitAnd:16rFF).
aFloat basicAt:4 put:(high bitAnd:16rFF).
] ifFalse:[
aFloat basicAt:1 put:(high bitAnd:16rFF).
aFloat basicAt:2 put:((high bitShift:-8) bitAnd:16rFF).
aFloat basicAt:3 put:((high bitShift:-16) bitAnd:16rFF).
aFloat basicAt:4 put:((high bitShift:-24) bitAnd:16rFF).
].
Verbose ifTrue:[Transcript show:'float; value= '; showCr:aFloat].
^ aFloat
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/Alignable.class'
"
"Modified: 15.4.1996 / 15:42:16 / cg"
"Created: 15.4.1996 / 16:34:42 / cg"
!
readConstant_Integer
|value|
value := self nextU4.
Verbose ifTrue:[Transcript show:'integer; value= '; showCr:value].
^ value
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/Alignable.class'
"
"Modified: 15.4.1996 / 15:42:16 / cg"
"Created: 15.4.1996 / 16:34:42 / cg"
!
readConstant_InterfaceMethodref
|class_index name_and_type_index|
class_index := self nextU2.
name_and_type_index := self nextU2.
Verbose ifTrue:[Transcript show:'methodref; classindex= '; showCr:class_index].
Verbose ifTrue:[Transcript show:'methodref; name&typeindex= '; showCr:name_and_type_index].
^ JavaUnresolvedInterfaceMethodrefConstant
classIndex:class_index
nameandTypeIndex:name_and_type_index
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
"
"Created: 15.4.1996 / 15:22:37 / cg"
"Modified: 15.4.1996 / 16:07:19 / cg"
!
readConstant_Long
|high low value|
high := self nextU4.
low := self nextU4.
value := (high bitShift:32) bitOr:low.
constNeeds2Slots := true.
Verbose ifTrue:[Transcript show:'long; value= '; showCr:value].
^ value
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/Alignable.class'
"
"Modified: 15.4.1996 / 15:42:16 / cg"
"Created: 15.4.1996 / 16:34:42 / cg"
!
readConstant_Methodref
|class_index name_and_type_index|
class_index := self nextU2.
name_and_type_index := self nextU2.
Verbose ifTrue:[Transcript show:'methodref; classindex= '; showCr:class_index].
Verbose ifTrue:[Transcript show:'methodref; name&typeindex= '; showCr:name_and_type_index].
^ JavaUnresolvedMethodrefConstant
classIndex:class_index
nameandTypeIndex:name_and_type_index
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
"
"Created: 15.4.1996 / 15:22:37 / cg"
"Modified: 15.4.1996 / 16:07:19 / cg"
!
readConstant_NameandType
|name_index signature_index|
name_index := self nextU2.
signature_index := self nextU2.
Verbose ifTrue:[Transcript show:'methodref; nameindex= '; showCr:name_index].
Verbose ifTrue:[Transcript show:'methodref; signatureindex= '; showCr:signature_index].
^ JavaUnresolvedNameandTypeConstant
nameIndex:name_index
signatureIndex:signature_index
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
"
"Created: 15.4.1996 / 15:23:43 / cg"
"Modified: 15.4.1996 / 16:17:16 / cg"
!
readConstant_String
|tag string_index|
string_index := self nextU2.
Verbose ifTrue:[Transcript show:'string; index= '; showCr:string_index].
^ JavaUnresolvedStringConstant index:string_index
"
Verbose := true.
JavaClassReader readFile:'/phys/ibm3/java/lib/java/lang/System.class'
"
"Created: 15.4.1996 / 15:20:33 / cg"
"Modified: 15.4.1996 / 16:01:37 / cg"
! !
!JavaClassReader methodsFor:'file reading - fields'!
readConstantValueAttributeFor:aField
|attribute_length constantvalue_index constantValue|
attribute_length := self nextU4.
constantvalue_index := self nextU2.
constantValue := constants at:constantvalue_index.
Verbose ifTrue:[Transcript show:'constantValue: '; showCr:constantValue].
^ true
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/Alignable.class'
"
"Modified: 15.4.1996 / 15:33:28 / cg"
"Created: 15.4.1996 / 15:40:17 / cg"
!
readFieldInfofield
|access_flags name_index signature_index attributes_count field|
access_flags := self nextU2.
name_index := self nextU2.
signature_index := self nextU2.
field := JavaField new.
field setAccessFlags:access_flags.
field setName:(constants at:name_index).
field setSignature:(constants at:signature_index).
attributes_count := self nextU2.
1 to:attributes_count do:[:i |
self readAttributeFor:field.
].
^ field
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
"
"Modified: 15.4.1996 / 15:33:28 / cg"
"Created: 15.4.1996 / 15:38:43 / cg"
!
readFieldInfofields
|nFields fields|
"/
"/ get fieldInfos
"/
nFields := self nextU2.
Verbose ifTrue:[Transcript show:'fieldsCount = '; showCr:nFields].
fields := Array new:nFields.
1 to:nFields do:[:i |
Verbose ifTrue:[Transcript show:'field: '; showCr:i].
fields at:i put:(self readFieldInfofield)
].
^ fields
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
"
"Created: 15.4.1996 / 15:34:41 / cg"
"Modified: 15.4.1996 / 15:35:28 / cg"
! !
!JavaClassReader methodsFor:'file reading - interfaces'!
readInterfaces
|interfacesCount interface interfaces|
"/
"/ get interfaces
"/
interfacesCount := self nextU2.
Verbose ifTrue:[Transcript show:'interfacesCount = '; showCr:interfacesCount].
interfaces := Array new:interfacesCount.
1 to:interfacesCount do:[:i |
Verbose ifTrue:[Transcript show:'interface: '; showCr:i].
interface = self nextU2.
interfaces at:i put:interface.
].
^ interfaces
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
"
"Created: 15.4.1996 / 15:31:59 / cg"
"Modified: 15.4.1996 / 15:33:28 / cg"
! !
!JavaClassReader methodsFor:'file reading - methods'!
readCodeAttributeFor:aJavaMethod
|attribute_length max_stack max_locals code_length code
exception_table_length exception_table unknown1 unknown2|
attribute_length := self nextU4.
Verbose ifTrue:[Transcript show:'attribute_length: 0x'; showCr:(attribute_length printStringRadix:16)].
majorVsn > 2 ifTrue:[
unknown1 := self nextU1.
max_stack := self nextU1.
max_locals := self nextU2.
unknown2 := self nextU2.
Verbose ifTrue:[Transcript show:'?1: '; showCr:unknown1].
Verbose ifTrue:[Transcript show:'?2: '; showCr:unknown2].
] ifFalse:[
max_stack := self nextU1.
max_locals := self nextU1.
].
code_length := self nextU2.
Verbose ifTrue:[Transcript show:'code_length: '; showCr:(code_length printStringRadix:16)].
Verbose ifTrue:[Transcript show:'code at pos: '; showCr:inStream position].
code := ByteArray new:code_length.
inStream nextBytes:code_length into:code startingAt:1.
Verbose ifTrue:[Transcript show:'method code:'; showCr:code.].
exception_table_length := self nextU2.
Verbose ifTrue:[Transcript show:'exception_table_length: '; showCr:(exception_table_length printStringRadix:16)].
exception_table_length ~~ 0 ifTrue:[
Verbose ifTrue:[Transcript show:'exceptionTable length:'; showCr:exception_table_length.].
exception_table := Array new:exception_table_length.
1 to:exception_table_length do:[:i |
|start_pc end_pc handler_pc catch_type|
start_pc := self nextU2.
end_pc := self nextU2.
handler_pc := self nextU2.
catch_type := self nextU2.
exception_table at:i put:(JavaExceptionTableEntry
startPC:start_pc
endPC:end_pc
handlerPC:handler_pc
catchType:catch_type).
].
aJavaMethod setExceptionTable:exception_table.
].
aJavaMethod
setCode:code
maxStack:max_stack
maxLocals:max_locals
u1:unknown1
u2:unknown2.
self readAttributesFor:aJavaMethod.
^ true
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/Alignable.class'
"
"Modified: 15.4.1996 / 15:33:28 / cg"
"Created: 15.4.1996 / 15:40:17 / cg"
!
readLineNumberTableAttributeFor:aJavaMethod
|attribute_length line_number_table_length line_number_table|
attribute_length := self nextU4.
line_number_table_length := self nextU2.
line_number_table_length ~~ 0 ifTrue:[
line_number_table := Array new:line_number_table_length.
1 to:line_number_table_length do:[:i |
|start_pc line_number|
start_pc := self nextU2.
line_number := self nextU2.
line_number_table at:i put:(start_pc -> line_number).
].
].
Verbose ifTrue:[Transcript showCr:'method has a lineNumberTable'].
aJavaMethod setLineNumberTable:line_number_table.
^ true
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/java/lang/Boolean.class'
"
"Modified: 15.4.1996 / 15:33:28 / cg"
"Created: 15.4.1996 / 15:40:17 / cg"
!
readLocalVariableTableAttributeFor:aJavaMethod
|attribute_length local_variable_table_length local_variable_table|
attribute_length := self nextU4.
local_variable_table_length := self nextU2.
local_variable_table_length ~~ 0 ifTrue:[
local_variable_table := Array new:local_variable_table_length.
1 to:local_variable_table_length do:[:i |
|start_pc length name_index sig_index slot name signature|
start_pc := self nextU2.
length := self nextU2.
name_index := self nextU2.
name := nil.
sig_index := self nextU2.
signature := nil.
slot := self nextU2.
local_variable_table at:i put:(JavaLocalVariableTableEntry new
startPC:start_pc
length:length
name:name
signature:signature
slot:slot)
].
].
Verbose ifTrue:[Transcript showCr:'method has a localvariableTable'].
aJavaMethod setLocalVariableTable:local_variable_table.
^ true
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/java/lang/Boolean.class'
"
"Modified: 15.4.1996 / 15:33:28 / cg"
"Created: 15.4.1996 / 15:40:17 / cg"
!
readMethodFor:aJavaClass
|m access_flags name_index name signature_index signature|
"/
"/ get a method
"/
access_flags := self nextU2.
name_index := self nextU2.
signature_index := self nextU2.
name := constants at:name_index.
signature := constants at:signature_index.
Verbose ifTrue:[Transcript show:'method name:'; showCr:name.
Transcript show:'signature:'; showCr:signature.].
m := JavaMethod new.
m setAccessFlags:access_flags.
m setSignature:signature.
m setName:name.
m setJavaClass:aJavaClass.
self readAttributesFor:m.
aJavaClass addMethod:m name:name signature:signature.
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
"
"Modified: 15.4.1996 / 15:33:28 / cg"
"Created: 15.4.1996 / 16:48:49 / cg"
!
readMethodsFor:aJavaClass
|methodsCount method|
"/
"/ get methods
"/
methodsCount := self nextU2.
Verbose ifTrue:[Transcript show:'methodsCount = '; showCr:methodsCount].
1 to:methodsCount do:[:i |
Verbose ifTrue:[Transcript show:'method: '; showCr:i].
method := self readMethodFor:aJavaClass
].
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
"
"Modified: 15.4.1996 / 15:33:28 / cg"
"Created: 15.4.1996 / 16:46:30 / cg"
! !
!JavaClassReader methodsFor:'low level reading'!
nextU1
^ inStream nextByte
"Created: 15.4.1996 / 15:15:43 / cg"
!
nextU2
^ inStream nextUnsignedShortMSB:msb
"Created: 15.4.1996 / 15:12:25 / cg"
!
nextU4
^ inStream nextUnsignedLongMSB:msb
"Created: 15.4.1996 / 15:04:28 / cg"
! !
!JavaClassReader class methodsFor:'documentation'!
version
^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaClassReader.st,v 1.16 1996/05/06 10:06:15 cg Exp $'
! !
JavaClassReader initialize!