--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Decomp.st Fri Jul 16 11:38:57 1993 +0200
@@ -0,0 +1,782 @@
+"
+ COPYRIGHT (c) 1991-93 by Claus Gittinger
+ All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice. This software may not
+ be provided or otherwise made available to, or used by, any
+ other person. No title to or ownership of the software is
+ hereby transferred.
+"
+
+ByteCodeCompiler subclass:#Decompiler
+ instanceVariableNames:'extra hasLineNo bytes literals index '
+ classVariableNames:''
+ poolDictionaries:''
+ category:'System-Compiler'
+!
+
+Decompiler comment:'
+
+COPYRIGHT (c) 1991-92 by Claus Gittinger
+ All Rights Reserved
+
+additional methods for decompilation
+
+%W% %E%
+'!
+
+!Decompiler class methodsFor:'decompiling'!
+
+decompile:aMethod
+ ^ (self new) decompile:aMethod
+
+ "Decompiler decompile:(FileBrowser compiledMethodAt:#initialize)"
+! !
+
+!Decompiler methodsFor:'decompiling'!
+
+showOffset:byte
+ |offs|
+
+ index := index + 1.
+ (byte > 127) ifTrue:[
+ offs := byte - 256
+ ] ifFalse:[
+ offs := byte
+ ].
+ Transcript show:(offs printString).
+ Transcript show:' ('.
+ Transcript show:(index + offs) printString.
+ Transcript show:')'
+!
+
+showLongOffset:byte
+ |offs|
+
+ index := index + 1.
+ (byte > 127) ifTrue:[
+ offs := byte - 256 - 128
+ ] ifFalse:[
+ offs := byte + 128
+ ].
+ Transcript show:offs printString.
+ Transcript show:' ('.
+ Transcript show:(index + offs) printString.
+ Transcript show:')'
+!
+
+showVeryLongOffset:byte
+ |offs|
+
+ index := index + 1.
+ (byte > 127) ifTrue:[
+ offs := byte - 256 - 256
+ ] ifFalse:[
+ offs := byte + 256
+ ].
+ Transcript show:offs printString.
+ Transcript show:' ('.
+ Transcript show:(index + offs) printString.
+ Transcript show:')'
+!
+
+showNvarNargsAt:index
+ Transcript show:' nv='.
+ Transcript show:(bytes at:index) printString.
+ Transcript show:' na='.
+ Transcript show:(bytes at:(index + 1)) printString
+!
+
+showLiteralAt:index
+ |offs|
+
+ offs := bytes at:index.
+ Transcript show:(literals at:offs) printString
+!
+
+showLiteral:byte
+ index := index + 1.
+ Transcript show:(literals at:byte) printString.
+!
+
+showLiteralSkip5:byte
+ index := index + 1.
+ Transcript show:(literals at:byte) printString.
+ index := index + 5
+!
+
+showOffsetLevel:byte
+ self showOffset:byte.
+ self showNvarNargsAt:index.
+ index := index + 2
+!
+
+showLongOffsetLevel:byte
+ self showLongOffset:byte.
+ self showNvarNargsAt:index.
+ index := index + 2
+!
+
+showVeryLongOffsetLevel:byte
+ self showVeryLongOffset:byte.
+ self showNvarNargsAt:index.
+ index := index + 2
+!
+
+showSendArgs:byte
+ Transcript show:byte printString.
+ Transcript show:' '.
+ index := index + 1.
+ self showLiteralAt:index
+!
+
+showSuperSendArgs:byte
+ Transcript show:byte printString.
+ Transcript show:' '.
+ index := index + 1.
+ self showLiteralAt:index.
+ index := index + 1
+!
+
+showLineNo:byte
+ Transcript show:' line:' , byte printString.
+ index := index + 1
+!
+
+showIndex:byte
+ Transcript show:byte printString.
+ index := index + 1
+!
+
+showNumber:byte
+ Transcript show:byte printString.
+ index := index + 1
+!
+
+showPC
+ Transcript show:(index printStringRadix:10 size:3 fill:(Character space)).
+ Transcript show:': '.
+ Transcript show:((bytes at:index) printStringRadix:16 size:2 fill:$0).
+ Transcript show:' '.
+!
+
+decompile:aMethod
+ |nBytes offs byte sym sel|
+
+ aMethod isNil ifTrue:[
+ Transcript showCr:'nil method'.
+ ^ self
+ ].
+
+ bytes := aMethod byteCode.
+ bytes isNil ifTrue:[
+ Transcript showCr:'no bytecode'.
+ ^ self
+ ].
+ literals := aMethod literals.
+ index := 1.
+ nBytes := bytes size.
+ [index <= nBytes] whileTrue:[
+ self showPC.
+ sym := self symbolicCodeFor:(bytes at:index).
+ Transcript show:sym.
+"
+ extra notNil ifTrue:[Transcript show:(extra printString)].
+"
+ hasLineNo ifTrue:[
+ index := index + 1
+ ].
+ index := index + 1.
+ extra notNil ifTrue:[
+ Transcript show:' '.
+ byte := bytes at:index.
+
+ "compute argument showXXX selector from extra ..."
+
+ sel := 'show' , extra , ':'.
+ sel at:5 put:(sel at:5) asUppercase.
+ self perform:sel asSymbol with:byte
+ ].
+ Transcript showCr:''
+ ]
+!
+
+symbolicCodeFor:aByte
+ |syms extras lnos|
+
+ syms := #( retTop " 0 "
+ retNil
+ retTrue
+ retFalse
+ ret0
+ retSelf " 5 "
+ blockRetTop
+ nil
+ nil
+ nil
+ pushNil " 10 "
+ pushTrue
+ pushFalse
+ pushInt
+ pushLit
+ pushSelf " 15 "
+ pushNum
+ pushChar
+ drop
+ send
+ superSend " 20 "
+ send0
+ send1
+ send2
+ send3
+ sendDrop " 25 "
+ sendDrop0
+ sendDrop1
+ sendDrop2
+ sendDrop3
+ pushMethodArg " 30 "
+ pushMethodVar
+ pushBlockArg
+ pushBlockVar
+ pushInstVar
+ pushClassVar " 35 "
+ pushGlobal
+ storeMethodVar
+ storeBlockVar
+ storeInstVar
+ storeClassVar " 40 "
+ storeGlobal
+ pushOuterBlockArg
+ pushOuter1BlockArg
+ pushOuter2BlockArg
+ equal " 45 "
+ notEqual
+ dup
+ equal0
+ notEqual0
+ falseJump " 50 "
+ trueJump
+ nilJump
+ notNilJump
+ jump
+ makeBlock " 55 "
+ zeroJump
+ notZeroJump
+ eqJump
+ notEqJump
+ falseJump " 60 "
+ trueJump
+ nilJump
+ notNilJump
+ jump
+ makeBlock " 65 "
+ zeroJump
+ notZeroJump
+ eqJump
+ notEqJump
+ falseJump " 70 "
+ trueJump
+ nilJump
+ notNilJump
+ jump
+ makeBlock " 75 "
+ zeroJump
+ notZeroJump
+ eqJump
+ notEqJump
+ pushMethodVar1 " 80 "
+ pushMethodVar2
+ pushMethodVar3
+ pushMethodVar4
+ pushMethodVar5
+ pushMethodVar6 " 85 "
+ pushMethodArg1
+ pushMethodArg2
+ pushMethodArg3
+ pushMethodArg4
+ pushInstVar1 " 90 "
+ pushInstVar2
+ pushInstVar3
+ pushInstVar4
+ pushInstVar5
+ pushInstVar6 " 95 "
+ pushInstVar7
+ pushInstVar8
+ pushInstVar9
+ pushInstVar10
+ storeMethodVar1 " 100 "
+ storeMethodVar2
+ storeMethodVar3
+ storeMethodVar4
+ storeMethodVar5
+ storeMethodVar6 " 105 "
+ nil
+ nil
+ nil
+ nil
+ storeInstVar1 " 110 "
+ storeInstVar2
+ storeInstVar3
+ storeInstVar4
+ storeInstVar5
+ storeInstVar6 " 115 "
+ storeInstVar7
+ storeInstVar8
+ storeInstVar9
+ storeInstVar10
+ push0 " 120 "
+ push1
+ pushMinus1
+ sendPlus1
+ sendMinus1
+ incMethodVar " 125 "
+ decMethodVar
+ retNum
+ pushOuterBlockVar
+ storeOuterBlockVar
+ sendEQ " 130 "
+ sendPLUS
+ sendNE
+ sendMINUS
+ sendCLASS
+ sendAT " 135 "
+ sendATPUT
+ sendBitAnd
+ sendBitOr
+ nil
+ pushBlockArg1 " 140 "
+ pushBlockArg2
+ pushBlockArg3
+ pushBlockArg4
+ pushContext
+ sendGT " 145 "
+ sendGE
+ sendLT
+ sendLE
+ sendNEXT
+ sendPEEK " 150 "
+ sendVALUE
+ sendVALUE1
+ sendSIZE
+ sendORIGIN
+ sendEXTENT " 155 "
+ make0Block
+ makeNILBlock
+ nil
+ nil
+ retMvar1 " 160 "
+ retMvar2
+ retMvar3
+ retMvar4
+ retMvar5
+ retMvar6 " 165 "
+ retIvar1
+ retIvar2
+ retIvar3
+ retIvar4
+ retIvar5 " 170 "
+ retIvar6
+ retIvar7
+ retIvar8
+ retMarg1
+ retMarg2 " 175 "
+ pushClassInstVar
+ storeClassInstVar
+ nil
+ nil
+ sendSelf0 " 180 "
+ sendSelf1
+ sendSelf2
+ sendSelf3
+ sendSelfDrop0
+ sendSelfDrop1 " 185 "
+ sendSelfDrop2
+ sendSelfDrop3
+ ).
+
+ lnos := #( false " 0 "
+ false
+ false
+ false
+ false
+ false " 5 "
+ false
+ false
+ false
+ false
+ false " 10 "
+ false
+ false
+ false
+ false
+ false " 15 "
+ false
+ false
+ false
+ true
+ true " 20 "
+ true
+ true
+ true
+ true
+ true " 25 "
+ true
+ true
+ true
+ true
+ false " 30 "
+ false
+ false
+ false
+ false
+ false " 35 "
+ false
+ false
+ false
+ false
+ false " 40 "
+ false
+ false
+ false
+ false
+ false " 45 "
+ false
+ false
+ false
+ false
+ false " 50 "
+ false
+ false
+ false
+ false
+ false " 55 "
+ false
+ false
+ false
+ false
+ false " 60 "
+ false
+ false
+ false
+ false
+ false " 65 "
+ false
+ false
+ false
+ false
+ false " 70 "
+ false
+ false
+ false
+ false
+ false " 75 "
+ false
+ false
+ false
+ false
+ false " 80 "
+ false
+ false
+ false
+ false
+ false " 85 "
+ false
+ false
+ false
+ false
+ false " 90 "
+ false
+ false
+ false
+ false
+ false " 95 "
+ false
+ false
+ false
+ false
+ false " 100 "
+ false
+ false
+ false
+ false
+ false " 105 "
+ false
+ false
+ false
+ false
+ false " 110 "
+ false
+ false
+ false
+ false
+ false " 115 "
+ false
+ false
+ false
+ false
+ false " 120 "
+ false
+ false
+ false
+ false
+ false " 125 "
+ false
+ false
+ false
+ false
+ false " 130 "
+ false
+ false
+ false
+ false
+ false " 135 "
+ false
+ false
+ false
+ false
+ false " 140 "
+ false
+ false
+ false
+ false
+ false " 145 "
+ false
+ false
+ false
+ false
+ false " 150 "
+ false
+ false
+ false
+ false
+ false " 155 "
+ false
+ false
+ false
+ false
+ false " 160 "
+ false
+ false
+ false
+ false
+ false " 165 "
+ false
+ false
+ false
+ false
+ false " 170 "
+ false
+ false
+ false
+ false
+ false " 175 "
+ false
+ false
+ false
+ false
+ true " 180 "
+ true
+ true
+ true
+ true
+ true " 185 "
+ true
+ true
+ ).
+
+ extras := #(nil " 0 "
+ nil
+ nil
+ nil
+ nil
+ nil " 5 "
+ nil
+ nil
+ nil
+ nil
+ nil " 10 "
+ nil
+ nil
+ nil
+ literal
+ nil " 15 "
+ number
+ nil
+ nil
+ sendArgs
+ superSendArgs " 20 "
+ literal
+ literal
+ literal
+ literal
+ sendArgs " 25 "
+ literal
+ literal
+ literal
+ literal
+ index " 30 "
+ index
+ index
+ index
+ index
+ literalSkip5 " 35 "
+ literalSkip5
+ index
+ index
+ index
+ literalSkip5 " 40 "
+ literalSkip5
+ indexLevel
+ index
+ index
+ nil " 45 "
+ nil
+ nil
+ nil
+ nil
+ offset " 50 "
+ offset
+ offset
+ offset
+ offset
+ offsetLevel " 55 "
+ offset
+ offset
+ offset
+ offset
+ longOffset " 60 "
+ longOffset
+ longOffset
+ longOffset
+ longOffset
+ longOffsetLevel " 65 "
+ longOffset
+ longOffset
+ longOffset
+ longOffset
+ veryLongOffset " 70 "
+ veryLongOffset
+ veryLongOffset
+ veryLongOffset
+ veryLongOffset
+ veryLongOffsetLevel " 75 "
+ veryLongOffset
+ veryLongOffset
+ veryLongOffset
+ veryLongOffset
+ nil " 80 "
+ nil
+ nil
+ nil
+ nil
+ nil " 85 "
+ nil
+ nil
+ nil
+ nil
+ nil " 90 "
+ nil
+ nil
+ nil
+ nil
+ nil " 95 "
+ nil
+ nil
+ nil
+ nil
+ nil " 100 "
+ nil
+ nil
+ nil
+ nil
+ nil " 105 "
+ nil
+ nil
+ nil
+ nil
+ nil " 110 "
+ nil
+ nil
+ nil
+ nil
+ nil " 115 "
+ nil
+ nil
+ nil
+ nil
+ nil " 120 "
+ nil
+ nil
+ nil
+ nil
+ index " 125 "
+ index
+ number
+ indexLevel
+ indexLevel
+ nil " 130 "
+ nil
+ nil
+ nil
+ nil
+ nil " 135 "
+ nil
+ nil
+ nil
+ nil
+ nil " 140 "
+ nil
+ nil
+ nil
+ nil
+ nil " 145 "
+ nil
+ nil
+ nil
+ nil
+ nil " 150 "
+ nil
+ nil
+ nil
+ nil
+ nil " 155 "
+ nil
+ nil
+ nil
+ nil
+ nil " 160 "
+ nil
+ nil
+ nil
+ nil
+ nil " 165 "
+ nil
+ nil
+ nil
+ nil
+ nil " 170 "
+ nil
+ nil
+ nil
+ nil
+ nil " 175 "
+ index
+ index
+ nil
+ nil
+ literal " 180 "
+ literal
+ literal
+ literal
+ literal
+ literal " 185 "
+ literal
+ literal
+ ).
+
+ extra := extras at:(aByte + 1).
+ hasLineNo := lnos at:(aByte + 1).
+ ^ syms at:(aByte + 1)
+! !