--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/JavaClassReader.st Mon Apr 15 15:08:12 1996 +0000
@@ -0,0 +1,489 @@
+Object subclass:#JavaClassReader
+ instanceVariableNames:'inStream msb constants this_class super_class'
+ classVariableNames:'Verbose'
+ poolDictionaries:''
+ category:'Java-Support'
+!
+
+
+!JavaClassReader class methodsFor:'initialization'!
+
+initialize
+ Verbose := false
+! !
+
+!JavaClassReader class methodsFor:'debugging'!
+
+verbose:aBoolean
+ Verbose := aBoolean
+
+ "
+ JavaClassReader verbose:true
+ JavaClassReader verbose:false
+ "
+! !
+
+!JavaClassReader class methodsFor:'file reading'!
+
+readFile:aFilename
+ |inStream retVal|
+
+ inStream := aFilename asFilename readStream.
+ inStream isNil ifTrue:[^ nil].
+ retVal := self readStream:inStream.
+ inStream close.
+ ^ retVal
+
+ "Created: 15.4.1996 / 14:58:53 / cg"
+!
+
+readStream:aStream
+ ^ 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'!
+
+readAttribute
+ |attribute_name attribute_length attribute_info|
+
+ attribute_name := self nextU2.
+ attribute_length := self nextU4.
+ attribute_info := ByteArray new:(attribute_length).
+ inStream nextBytes:attribute_length into:attribute_info startingAt:1.
+
+ "
+ 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"
+!
+
+readClassFile
+ |magic version
+ access_flags this_class_index super_class_index|
+
+ "/
+ "/ 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.
+ Verbose ifTrue:[Transcript show:'version = '; showCr:version].
+
+ "/
+ "/ get constant pool
+ "/
+ self readConstantPool.
+
+ "/
+ "/ access flags
+ "/
+ access_flags := self nextU2.
+ this_class_index := self nextU2.
+ super_class_index := self nextU2.
+
+ this_class := constants at:this_class_index.
+ super_class := constants at:super_class_index.
+
+ this_class setAccessFlags:access_flags.
+
+ "/
+ "/ get interfaces
+ "/
+ self readInterfaces.
+
+ "/
+ "/ get fields
+ "/
+ self readFieldInfofields.
+
+ "/
+ "/ get methods
+ "/
+ self readMethods.
+
+self halt.
+ "
+ JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
+ JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/Alignable.class'
+ "
+
+ "Created: 15.4.1996 / 15:02:47 / cg"
+ "Modified: 15.4.1996 / 16:51:48 / cg"
+!
+
+readConstant
+ |tag constReader const|
+
+
+ "/
+ "/ 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|
+
+ "/
+ "/ get constant pool
+ "/
+ constantPoolCount := self nextU2.
+ Verbose ifTrue:[Transcript show:'constantPoolCount = '; showCr:constantPoolCount].
+
+ constants := Array new:constantPoolCount-1.
+
+ 1 to:constantPoolCount-1 do:[:i |
+ Verbose ifTrue:[Transcript show:'const: '; showCr:i].
+ const := self readConstant.
+ constants at:i put:const
+ ].
+
+ 1 to:constantPoolCount-1 do:[:i |
+ |const|
+
+ const := constants at:i.
+ 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
+
+ "
+ 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_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_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_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
+
+ "
+ JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
+ "
+
+ "Created: 15.4.1996 / 15:20:33 / cg"
+ "Modified: 15.4.1996 / 16:01:37 / cg"
+!
+
+readFieldInfofield
+ |access_flags name_index signature_index attributes_count|
+
+ access_flags := self nextU2.
+ name_index := self nextU2.
+ signature_index := self nextU2.
+ attributes_count := self nextU2.
+
+ 1 to:attributes_count do:[:i |
+ self readAttribute.
+ ].
+
+ "
+ 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
+ |fieldsCount interface|
+
+ "/
+ "/ get interfaces
+ "/
+ fieldsCount := self nextU2.
+ Verbose ifTrue:[Transcript show:'fieldsCount = '; showCr:fieldsCount].
+
+ 1 to:fieldsCount do:[:i |
+ Verbose ifTrue:[Transcript show:'field: '; showCr:i].
+ self readFieldInfofield
+ ].
+
+ "
+ 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"
+!
+
+readInterfaces
+ |interfacesCount interface|
+
+
+ "/
+ "/ get interfaces
+ "/
+ interfacesCount := self nextU2.
+ Verbose ifTrue:[Transcript show:'interfacesCount = '; showCr:interfacesCount].
+
+ 1 to:interfacesCount do:[:i |
+ Verbose ifTrue:[Transcript show:'interface: '; showCr:i].
+ interface = self nextU2
+ ].
+
+ "
+ 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"
+!
+
+readMethod
+ |access_flags name_index signature_index attributes_counts attribute|
+
+
+ "/
+ "/ get a method
+ "/
+ access_flags := self nextU2.
+ name_index := self nextU2.
+ signature_index := self nextU2.
+ attributes_counts := self nextU2.
+
+ 1 to:attributes_counts do:[:i |
+ attribute = self readAttribute
+ ].
+
+ "
+ 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"
+!
+
+readMethods
+ |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 readMethod
+ ].
+
+ "
+ 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"
+!
+
+readStream:aStream
+ 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:'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.1 1996/04/15 15:08:12 cg Exp $'
+! !
+JavaClassReader initialize!