# HG changeset patch # User Jan Vrany # Date 1613463591 0 # Node ID 3e1e2a1e6971f2e214570a12dac648684b13d6d8 # Parent d4de58ea5a344f8d6a8519a4c098ab74c7a9bfc9 Improve "decompiling" of native methods Native methods are standard Smalltalk methods with smalltalk bytecode. This commit fixes `JavaMethod >> #decompileOn:` to print Smalltalk bytecode. diff -r d4de58ea5a34 -r 3e1e2a1e6971 JavaMethod.st --- 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 " + "Modified (format): / 16-02-2021 / 08:12:30 / Jan Vrany " ! 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 " + "Modified: / 16-02-2021 / 07:55:35 / Jan Vrany " ! decompiler