Improve "decompiling" of native methods
Native methods are standard Smalltalk methods with smalltalk bytecode.
This commit fixes `JavaMethod >> #decompileOn:` to print Smalltalk
bytecode.
--- a/JavaMethod.st Mon Feb 15 08:33:39 2021 +0000
+++ b/JavaMethod.st Tue Feb 16 08:19:51 2021 +0000
@@ -1,6 +1,6 @@
"
COPYRIGHT (c) 1996-2015 by Claus Gittinger
- COPYRIGHT (c) 2020 LabWare
+ COPYRIGHT (c) 2020-2021 LabWare
New code and modifications done at SWING Research Group [1]:
@@ -40,7 +40,7 @@
copyright
"
COPYRIGHT (c) 1996-2015 by Claus Gittinger
- COPYRIGHT (c) 2020 LabWare
+ COPYRIGHT (c) 2020-2021 LabWare
New code and modifications done at SWING Research Group [1]:
@@ -934,7 +934,7 @@
|s|
s := '' writeStream.
- self decompileSourceTo:s.
+ self decompileTo: s.
^ s contents
"Modified: 30.7.1997 / 16:27:55 / cg"
@@ -1097,9 +1097,11 @@
literals
"return the literals as an array"
+ self isNative ifTrue: [^ super literals].
^ Array streamContents: [ :s | self literalsDo:[:e | s nextPut: e] ]
"Created: / 29-07-2016 / 09:46:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified (format): / 16-02-2021 / 08:12:30 / Jan Vrany <jan.vrany@labware.com>"
!
literalsDo:aBlock
@@ -1637,92 +1639,121 @@
!JavaMethod methodsFor:'decompiling'!
-decompileSourceTo:aStream
- |argNames|
-
- byteCode isNil ifTrue:[
- self isPublic ifTrue:[
- aStream nextPutAll:'public '.
+decompileTo: aStream
+ | argNames |
+
+ byteCode isNil ifTrue: [
+ self isPublic ifTrue: [
+ aStream nextPutAll: 'public '.
].
- self isProtected ifTrue:[
- aStream nextPutAll:'protected '.
+ self isProtected ifTrue: [
+ aStream nextPutAll: 'protected '.
].
- self isPrivate ifTrue:[
- aStream nextPutAll:'private '.
+ self isPrivate ifTrue: [
+ aStream nextPutAll: 'private '.
].
- self isStatic ifTrue:[
- aStream nextPutAll:'static '.
+ self isStatic ifTrue: [
+ aStream nextPutAll: 'static '.
].
-
- self isNative ifTrue:[
- aStream nextPutAll:'native '.
+ self isNative ifTrue: [
+ aStream nextPutAll: 'native '.
].
- self isAbstract ifTrue:[
- aStream nextPutAll:'abstract '.
+ self isAbstract ifTrue: [
+ aStream nextPutAll: 'abstract '.
].
- argNames := #('arg1' 'arg2' 'arg3' 'arg4' 'arg5' 'arg6' 'arg7' 'arg8' 'arg9').
- aStream nextPutAll:(self signatureNameWithArgNames:argNames).
- aStream nextPutAll:';'; cr.
+ argNames := #( 'arg1' 'arg2' 'arg3' 'arg4' 'arg5' 'arg6' 'arg7' 'arg8' 'arg9' ).
+ aStream nextPutAll: (self signatureNameWithArgNames: argNames).
+ aStream
+ nextPutAll: ';';
+ cr.
^ self
].
-
+ "
+ JavaDeparser isNil ifTrue:[
+ aStream nextPutAll:'// Sorry - no decompiler'.
+ ^ self
+ ].
"
- JavaDeparser isNil ifTrue:[
- aStream nextPutAll:'// Sorry - no decompiler'.
- ^ self
- ].
- "
-
-
"/ self isNative ifFalse:[
"/ self isAbstract ifFalse:[
- aStream nextPutAll:'// source not available...'; cr.
- SignalSet anySignal handle:[:ex |
- ex creator == Object haltSignal ifTrue:[ex reject].
- ex creator == MessageTracer breakpointSignal ifTrue:[ex reject].
- ex creator == Signal noHandlerSignal ifTrue:[ex reject].
-
- aStream nextPutAll:'error while decompiling:'.
- aStream cr; cr; spaces:4.
- aStream nextPutAll:ex errorString.
- aStream cr.
- aStream nextPutAll:ex suspendedContext printString.
- aStream cr.
- aStream nextPutAll:ex suspendedContext sender printString.
- aStream cr.
- aStream nextPutAll:ex suspendedContext sender sender printString.
- aStream cr.
- aStream nextPutAll:ex suspendedContext sender sender sender printString.
- aStream cr.
- aStream nextPutAll:ex suspendedContext sender sender sender sender printString.
- aStream cr.
- aStream nextPutAll:ex suspendedContext sender sender sender sender sender printString.
- aStream cr.
- aStream nextPutAll:ex suspendedContext sender sender sender sender sender sender printString.
- aStream cr.
- aStream nextPutAll:ex suspendedContext sender sender sender sender sender sender sender printString.
- aStream cr.
- aStream nextPutAll:ex suspendedContext sender sender sender sender sender sender sender sender printString.
- aStream cr.
-
- "
- JavaByteCodeDisassembler isNil ifTrue:[
- aStream nextPutAll:'// Sorry - no decompiler'
- ] ifFalse:[
- JavaByteCodeDisassembler diassemble:self to:aStream.
- ].
- "
- ex return
- ] do:[
+
+ aStream
+ nextPutAll: '/* source not available...';
+ cr.
+ SignalSet anySignal
+ handle: [:ex |
+ ex creator == Object haltSignal ifTrue: [
+ ex reject
+ ].
+ ex creator == MessageTracer breakpointSignal ifTrue: [
+ ex reject
+ ].
+ ex creator == Signal noHandlerSignal ifTrue: [
+ ex reject
+ ].
+ aStream nextPutAll: 'error while decompiling:'.
+ aStream
+ cr;
+ cr;
+ spaces: 4.
+ aStream nextPutAll: ex errorString.
+ aStream cr.
+ aStream nextPutAll: ex suspendedContext printString.
+ aStream cr.
+ aStream nextPutAll: ex suspendedContext sender printString.
+ aStream cr.
+ aStream nextPutAll: ex suspendedContext sender sender printString.
+ aStream cr.
+ aStream nextPutAll: ex suspendedContext sender sender sender printString.
+ aStream cr.
+ aStream
+ nextPutAll: ex suspendedContext sender sender sender sender printString.
+ aStream cr.
+ aStream
+ nextPutAll: ex suspendedContext sender sender sender sender sender
+ printString.
+ aStream cr.
+ aStream
+ nextPutAll: ex suspendedContext sender sender sender sender sender sender
+ printString.
+ aStream cr.
+ aStream
+ nextPutAll: ex suspendedContext sender sender sender sender sender sender
+ sender printString.
+ aStream cr.
+ aStream
+ nextPutAll: ex suspendedContext sender sender sender sender sender sender
+ sender sender
+ printString.
+ aStream cr.
+ "
+ JavaByteCodeDisassembler isNil ifTrue:[
+ aStream nextPutAll:'// Sorry - no decompiler'
+ ] ifFalse:[
+ JavaByteCodeDisassembler diassemble:self to:aStream.
+ ].
+ "
+ ex return
+ ] do: [
+ self isNative ifTrue: [
+ super decompileTo: aStream
+ ] ifFalse: [
"aStream nextPutAll:(JavaDeparser decompile:self)."
- JavaByteCodeDisassembler diassemble:self to:aStream.
- ].
-"/ ].
-"/ ].
+ JavaByteCodeDisassembler diassemble: self to: aStream.
+ ]
+ ].
+ aStream
+ cr;
+ nextPutAll: '*/';
+ cr.
+
+ "/ ].
+ "/ ].
"Created: / 30-07-1997 / 16:28:09 / cg"
"Modified: / 21-12-1999 / 14:31:54 / cg"
"Modified: / 22-03-2011 / 21:34:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 16-02-2021 / 07:55:35 / Jan Vrany <jan.vrany@labware.com>"
!
decompiler