--- a/Java.st Tue Apr 30 23:23:46 1996 +0000
+++ b/Java.st Tue Apr 30 23:24:49 1996 +0000
@@ -33,6 +33,7 @@
]
].
+ self changed:#classes
"Created: 17.4.1996 / 23:29:31 / cg"
"Modified: 18.4.1996 / 00:45:39 / cg"
@@ -61,5 +62,5 @@
!Java class methodsFor:'documentation'!
version
- ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/Java.st,v 1.3 1996/04/19 08:35:06 cg Exp $'
+ ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/Java.st,v 1.4 1996/04/30 23:24:33 cg Exp $'
! !
--- a/JavaClass.st Tue Apr 30 23:23:46 1996 +0000
+++ b/JavaClass.st Tue Apr 30 23:24:49 1996 +0000
@@ -1,5 +1,5 @@
ClassDescription subclass:#JavaClass
- instanceVariableNames:'fullName accessFlags constantPool sourceFile'
+ instanceVariableNames:'fullName accessFlags constantPool sourceFile fields'
classVariableNames:''
poolDictionaries:''
category:'Java-Classes'
@@ -42,7 +42,7 @@
!
name
- ^ fullName
+ ^ name "/ fullName
!
package
@@ -69,7 +69,7 @@
!JavaClass methodsFor:'printing & storing'!
displayString
- ^ self class name , '(' , name , ')'
+ ^ 'Java-' , name
"Created: 15.4.1996 / 16:02:48 / cg"
! !
@@ -81,7 +81,8 @@
selectorArray := #().
methodArray := #()
].
- selectorArray := selectorArray copyWith:name.
+"/ selectorArray := selectorArray copyWith:(name , signature) asSymbol. "/ name.
+ selectorArray := selectorArray copyWith:name asSymbol. "/ name.
methodArray := methodArray copyWith:m
"Created: 15.4.1996 / 16:42:52 / cg"
@@ -99,6 +100,21 @@
"Created: 15.4.1996 / 16:42:52 / cg"
!
+setFields:f
+ |varNames|
+
+ varNames := ''.
+ f do:[:aField |
+ varNames := varNames , aField name , ' '
+ ].
+ instvars := varNames.
+"/ instSize := superclass instSize + f size.
+
+ fields := f
+
+ "Created: 15.4.1996 / 16:42:52 / cg"
+!
+
setFullName:aString
|nameComponents|
@@ -113,10 +129,23 @@
sourceFile := aFilename.
"Created: 15.4.1996 / 16:42:52 / cg"
+!
+
+setSuperclass:aClass
+ aClass isNil ifTrue:[
+ ^ super setSuperclass:JavaObject
+ ].
+ super setSuperclass:aClass
+
+ "Created: 15.4.1996 / 16:42:52 / cg"
! !
!JavaClass methodsFor:'queries'!
+isClass
+ ^ true
+!
+
isFinal
^ (accessFlags bitAnd:16r0010) ~~ 0
!
@@ -159,10 +188,16 @@
]
]
].
+
+ (superclass notNil and:[(superclass isMemberOf:JavaUnresolvedClassConstant) not]) ifTrue:[
+ instSize := superclass instSize + (instvars asCollectionOfWords size)
+ ] ifFalse:[
+ instSize := instvars asCollectionOfWords size
+ ].
! !
!JavaClass class methodsFor:'documentation'!
version
- ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaClass.st,v 1.9 1996/04/19 08:35:44 cg Exp $'
+ ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaClass.st,v 1.10 1996/04/30 23:23:50 cg Exp $'
! !
--- a/JavaClassReader.st Tue Apr 30 23:23:46 1996 +0000
+++ b/JavaClassReader.st Tue Apr 30 23:24:49 1996 +0000
@@ -1,6 +1,6 @@
Object subclass:#JavaClassReader
instanceVariableNames:'inStream msb constants this_class super_class version majorVsn
- minorVsn constNeeds2Slots constSlot'
+ minorVsn constNeeds2Slots constSlot nFields fields'
classVariableNames:'Verbose'
poolDictionaries:''
category:'Java-Support'
@@ -134,9 +134,12 @@
'reading ' print. aFilename print. ' ...' printNL.
inStream := aFilename asFilename readStream.
- inStream isNil ifTrue:[^ nil].
+ inStream isNil ifTrue:['nil' printNL. ^ nil].
retVal := self readStream:inStream.
inStream close.
+
+ '... ' print. retVal printNL.
+
^ retVal
"Created: 15.4.1996 / 14:58:53 / cg"
@@ -231,6 +234,7 @@
"/ get fields
"/
self readFieldInfofields.
+ this_class setFields:fields.
"/
"/ get methods
@@ -767,6 +771,8 @@
self readAttributeFor:field.
].
+ ^ field
+
"
JavaClassReader readFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
"
@@ -776,17 +782,19 @@
!
readFieldInfofields
- |fieldsCount interface|
+ |interface|
"/
"/ get interfaces
"/
- fieldsCount := self nextU2.
- Verbose ifTrue:[Transcript show:'fieldsCount = '; showCr:fieldsCount].
+ nFields := self nextU2.
+ Verbose ifTrue:[Transcript show:'fieldsCount = '; showCr:nFields].
- 1 to:fieldsCount do:[:i |
+ fields := Array new:nFields.
+
+ 1 to:nFields do:[:i |
Verbose ifTrue:[Transcript show:'field: '; showCr:i].
- self readFieldInfofield
+ fields at:i put:(self readFieldInfofield)
].
"
@@ -973,6 +981,6 @@
!JavaClassReader class methodsFor:'documentation'!
version
- ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaClassReader.st,v 1.8 1996/04/17 22:51:04 cg Exp $'
+ ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaClassReader.st,v 1.9 1996/04/30 23:24:49 cg Exp $'
! !
JavaClassReader initialize!
--- a/JavaDecompiler.st Tue Apr 30 23:23:46 1996 +0000
+++ b/JavaDecompiler.st Tue Apr 30 23:24:49 1996 +0000
@@ -222,22 +222,22 @@
(arraylength) "/ 190
(athrough) "/ 191
- (checkcast) "/ 192
+ (checkcast constIndexShort) "/ 192
(instanceof constIndexShort) "/ 193
(monitorenter) "/ 194
(monitorexit) "/ 195
(verifystack) "/ 196
(breakpoint) "/ 197
(multianewarray constIndexShort dimensionsByte) "/ 198
- nil "/ 199
+ (ldc1_quick constIndexByte) "/ 199
nil "/ 200
nil "/ 201
- nil "/ 202
+ (getfield_quick unsignedByte unusedByte)"/ 202
nil "/ 203
nil "/ 204
nil "/ 205
- nil "/ 206
+nil "/ (getstatic_quick constIndexShort) "/ 206
nil "/ 207
nil "/ 208
nil "/ 209
@@ -301,6 +301,12 @@
"Modified: 16.4.1996 / 14:56:13 / cg"
! !
+!JavaDecompiler class methodsFor:'accessing'!
+
+instructionTable
+ ^ DecoderTable
+! !
+
!JavaDecompiler class methodsFor:'decompiling'!
decompile:aJavaMethod
@@ -314,7 +320,7 @@
!JavaDecompiler methodsFor:'decompiling'!
decompile:aJavaMethod to:aStream
- |who endPC insn spec|
+ |who endPC insn spec op|
outStream := aStream.
@@ -343,14 +349,21 @@
insn := code at:pc.
pc := pc + 1.
spec := DecoderTable at:(insn + 1).
+ spec isNil ifTrue:[
+ op := '** invalid opcode: ',insn printString, ' **'
+ ] ifFalse:[
+ op := spec at:1
+ ].
outStream
show:((pc - 1) printStringPaddedTo:4);
show:' ';
- show:(spec at:1);
+ show:op;
show:' '.
- spec from:2 to:spec size do:[:what |
- self perform:what
+ spec notNil ifTrue:[
+ spec from:2 to:spec size do:[:what |
+ self perform:what
+ ].
].
outStream cr.
]
@@ -390,8 +403,8 @@
outStream
show:index;
show:' [';
- show:(javaMethod constantPool at:index) displayString;
- show:']'
+ show:(javaMethod constantPool at:index ifAbsent:['??']) displayString;
+ show:'] '
"Created: 16.4.1996 / 15:00:04 / cg"
"Modified: 16.4.1996 / 15:30:55 / cg"
@@ -406,13 +419,17 @@
outStream
show:index;
show:' [';
- show:(javaMethod constantPool at:index) displayString;
- show:']'
+ show:(javaMethod constantPool at:index ifAbsent:'???') displayString;
+ show:'] '
"Created: 16.4.1996 / 15:00:04 / cg"
"Modified: 16.4.1996 / 15:30:55 / cg"
!
+dimensionsByte
+ self unsignedByte
+!
+
localIndexByte
|hi low index constants|
@@ -428,6 +445,72 @@
"Modified: 16.4.1996 / 15:30:55 / cg"
!
+lookupSwitchBytes
+ |defaultOffset delta nPairs match pc0|
+
+ pc0 := pc-1. "/ i.e. the pc of the tableSwitch op
+
+ [(pc-1) \\ 4 ~~ 0] whileTrue:[
+ pc := pc + 1
+ ].
+
+ defaultOffset := code signedDoubleWordAt:pc MSB:true.
+ pc := pc + 4.
+ nPairs := code signedDoubleWordAt:pc MSB:true.
+ pc := pc + 4.
+
+ outStream show:'n='; show:nPairs; cr.
+
+ nPairs timesRepeat:[
+ match := code signedDoubleWordAt:pc MSB:true.
+ pc := pc + 4.
+ delta := code signedDoubleWordAt:pc MSB:true.
+ pc := pc + 4.
+ outStream show:' ';
+ show:match;
+ show:' -> ';
+ show:delta;
+ show:' [';
+ show:(pc0 + delta);
+ show:']';
+ cr.
+ ].
+
+ outStream show:' ';
+ show:'default';
+ show:' -> ';
+ show:defaultOffset;
+ show:' [';
+ show:(pc0 + defaultOffset);
+ show:']'.
+!
+
+nargsByte
+ |byte constants|
+
+ byte := code byteAt:pc.
+ pc := pc + 1.
+
+ outStream
+ show:byte
+
+ "Created: 16.4.1996 / 15:00:04 / cg"
+ "Modified: 16.4.1996 / 15:30:55 / cg"
+!
+
+reservedByte
+ |byte constants|
+
+ byte := code byteAt:pc.
+ pc := pc + 1.
+
+ outStream
+ show:byte
+
+ "Created: 16.4.1996 / 15:00:04 / cg"
+ "Modified: 16.4.1996 / 15:30:55 / cg"
+!
+
signedBranchShort
|index constants|
@@ -511,11 +594,24 @@
show:']'.
+!
+
+unsignedByte
+ |byte constants|
+
+ byte := code byteAt:pc.
+ pc := pc + 1.
+
+ outStream
+ show:byte
+
+ "Created: 16.4.1996 / 15:00:04 / cg"
+ "Modified: 16.4.1996 / 15:30:55 / cg"
! !
!JavaDecompiler class methodsFor:'documentation'!
version
- ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaDecompiler.st,v 1.6 1996/04/22 10:46:31 stefan Exp $'
+ ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaDecompiler.st,v 1.7 1996/04/30 23:24:29 cg Exp $'
! !
JavaDecompiler initialize!
--- a/JavaField.st Tue Apr 30 23:23:46 1996 +0000
+++ b/JavaField.st Tue Apr 30 23:24:49 1996 +0000
@@ -6,6 +6,20 @@
!
+!JavaField methodsFor:'accessing'!
+
+name
+ ^ name
+! !
+
+!JavaField methodsFor:'printing & storing'!
+
+displayString
+ ^ self class name , '(name: ' , name displayString , ')'
+
+
+! !
+
!JavaField methodsFor:'private accessing'!
setAccessFlags:flags
@@ -35,5 +49,5 @@
!JavaField class methodsFor:'documentation'!
version
- ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaField.st,v 1.3 1996/04/17 20:57:20 cg Exp $'
+ ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaField.st,v 1.4 1996/04/30 23:24:08 cg Exp $'
! !
--- a/JavaFieldref.st Tue Apr 30 23:23:46 1996 +0000
+++ b/JavaFieldref.st Tue Apr 30 23:24:49 1996 +0000
@@ -1,13 +1,34 @@
JavaRef subclass:#JavaFieldref
- instanceVariableNames:''
+ instanceVariableNames:'offset'
classVariableNames:''
poolDictionaries:''
category:'Java-Reader-Support'
!
+!JavaFieldref methodsFor:'resolving'!
+
+offset
+ |nm sig mthd|
+
+ offset notNil ifTrue:[^ offset].
+
+ (class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
+ class := class resolve
+ ].
+ (class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
+ self halt.
+ ].
+
+ nm := nameandType name asSymbol.
+ sig := nameandType signature.
+
+ offset := class instVarOffsetOf:nm.
+ ^ offset.
+! !
+
!JavaFieldref class methodsFor:'documentation'!
version
- ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaFieldref.st,v 1.4 1996/04/17 20:57:17 cg Exp $'
+ ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaFieldref.st,v 1.5 1996/04/30 23:24:11 cg Exp $'
! !
--- a/JavaMethod.st Tue Apr 30 23:23:46 1996 +0000
+++ b/JavaMethod.st Tue Apr 30 23:24:49 1996 +0000
@@ -1,6 +1,6 @@
CompiledCode subclass:#JavaMethod
- instanceVariableNames:'javaByteCode accessFlags name signature exceptionTable
- lineNumberTable javaClass'
+ instanceVariableNames:'javaByteCode numArgs returnsVoid accessFlags name signature
+ exceptionTable lineNumberTable javaClass'
classVariableNames:'SignatureTypeCodes'
poolDictionaries:''
category:'Java-Classes'
@@ -36,11 +36,15 @@
spec := ''.
[s atEnd or:[s peek == $)]] whileFalse:[
- argSpec := self fieldTypeFromStream:s.
- spec size ~~ 0 ifTrue:[
- spec := spec , ' '
- ].
- spec := spec , argSpec.
+"/ s peek == Character space ifTrue:[
+"/ s next
+"/ ] ifFalse:[
+ argSpec := self fieldTypeFromStream:s.
+ spec size ~~ 0 ifTrue:[
+ spec := spec , ' '
+ ].
+ spec := spec , argSpec.
+"/ ]
].
^ spec
@@ -79,6 +83,56 @@
^ typeSym
!
+numArgsFromSignature:aSignature
+ "given a signature, return the number of args"
+
+ |s argSpec|
+
+ s := aSignature readStream.
+ s next ~~ $( ifTrue:[self halt. ^ name].
+
+ ^ self numArgsFromStream:s.
+
+ "
+ JavaMethod numArgsFromSignature:'(LObject;)V'
+ JavaMethod numArgsFromSignature:'(BB)S'
+ JavaMethod numArgsFromSignature:'()V'
+ "
+!
+
+numArgsFromStream:s
+ "parse an argSpec - see java doc"
+
+ |argSpec n|
+
+ n := 0.
+ [s atEnd or:[s peek == $)]] whileFalse:[
+ self fieldTypeFromStream:s.
+ n := n + 1.
+ ].
+ ^ n
+!
+
+returnsVoidFromSignature:aSignature
+ "given a signature, return true if it returns void, false if not"
+
+ |s argSpec retvalSpec|
+
+ s := aSignature readStream.
+ s next ~~ $( ifTrue:[self halt. ^ true].
+
+ self argSpecFromStream:s.
+
+ s next ~~ $) ifTrue:[self halt. ^ true].
+
+ ^ (self retvalSpecFromStream:s) = 'void'
+
+ "
+ JavaMethod returnsVoidFromSignature:'(LObject;)V'
+ JavaMethod returnsVoidFromSignature:'(BB)S'
+ "
+!
+
retvalSpecFromStream:s
"parse a retvalSpec - see java doc"
@@ -108,7 +162,7 @@
"
JavaMethod specFromSignature:'(LObject;)V' withName:'foo'
- JavaMethod specFromSignature:'(B;)S' withName:'foo'
+ JavaMethod specFromSignature:'(BB)S' withName:'foo'
"
! !
@@ -128,6 +182,25 @@
"Created: 16.4.1996 / 14:55:44 / cg"
!
+javaClass
+ ^ javaClass
+
+ "Modified: 16.4.1996 / 12:36:27 / cg"
+ "Created: 16.4.1996 / 14:55:44 / cg"
+!
+
+numArgs
+ ^ numArgs
+!
+
+numberOfMethodArgs:n
+ numArgs := n
+!
+
+returnsVoid
+ ^ returnsVoid
+!
+
setAccessFlags:flags
accessFlags := flags.
@@ -180,6 +253,14 @@
setSignature:aString
signature := aString.
+ self numberOfMethodArgs:(self class numArgsFromSignature:aString).
+ returnsVoid := self class returnsVoidFromSignature:aString.
+
+ "Created: 16.4.1996 / 11:34:29 / cg"
+!
+
+signature
+ ^ signature
"Created: 16.4.1996 / 11:34:29 / cg"
! !
@@ -258,6 +339,6 @@
!JavaMethod class methodsFor:'documentation'!
version
- ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaMethod.st,v 1.6 1996/04/17 21:59:47 cg Exp $'
+ ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaMethod.st,v 1.7 1996/04/30 23:23:20 cg Exp $'
! !
JavaMethod initialize!
--- a/JavaMethodref.st Tue Apr 30 23:23:46 1996 +0000
+++ b/JavaMethodref.st Tue Apr 30 23:24:49 1996 +0000
@@ -1,13 +1,43 @@
JavaRef subclass:#JavaMethodref
- instanceVariableNames:''
+ instanceVariableNames:'method'
classVariableNames:''
poolDictionaries:''
category:'Java-Reader-Support'
!
+!JavaMethodref methodsFor:'resolving'!
+
+method
+ |nm sig mthd|
+
+ method notNil ifTrue:[^ method].
+
+ (class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
+ class := class resolve
+ ].
+ (class isMemberOf:JavaUnresolvedClassConstant) ifTrue:[
+ self halt.
+ ].
+
+ nm := nameandType name asSymbol.
+ sig := nameandType signature.
+
+ class selectorArray keysAndValuesDo:[:idx :sel |
+"/ idx print. ' 'print. sel printNL.
+ sel == nm ifTrue:[
+ mthd := class methodArray at:idx.
+ mthd signature = sig ifTrue:[
+ method := mthd.
+ ^ mthd
+ ]
+ ]
+ ].
+ self halt.
+! !
+
!JavaMethodref class methodsFor:'documentation'!
version
- ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaMethodref.st,v 1.4 1996/04/17 20:57:59 cg Exp $'
+ ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaMethodref.st,v 1.5 1996/04/30 23:24:15 cg Exp $'
! !
--- a/JavaNameandType.st Tue Apr 30 23:23:46 1996 +0000
+++ b/JavaNameandType.st Tue Apr 30 23:24:49 1996 +0000
@@ -16,11 +16,23 @@
!JavaNameandType methodsFor:'accessing'!
+name
+ ^ name
+
+ "Created: 15.4.1996 / 16:16:47 / cg"
+!
+
name:aString signature:aSignature
name := aString.
signature := aSignature
"Created: 15.4.1996 / 16:16:47 / cg"
+!
+
+signature
+ ^ signature
+
+ "Created: 15.4.1996 / 16:16:47 / cg"
! !
!JavaNameandType methodsFor:'printing & storing'!
@@ -34,5 +46,5 @@
!JavaNameandType class methodsFor:'documentation'!
version
- ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaNameandType.st,v 1.2 1996/04/15 15:38:31 cg Exp $'
+ ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaNameandType.st,v 1.3 1996/04/30 23:24:04 cg Exp $'
! !