Improve "decompiling" of native methods
authorJan Vrany <jan.vrany@labware.com>
Tue, 16 Feb 2021 08:19:51 +0000
changeset 4007 3e1e2a1e6971
parent 4006 d4de58ea5a34
child 4008 916d24efebb8
Improve "decompiling" of native methods Native methods are standard Smalltalk methods with smalltalk bytecode. This commit fixes `JavaMethod >> #decompileOn:` to print Smalltalk bytecode.
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 <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