|
Last change
on this file was
15283,
checked in by Mark Evenson, 6 years ago
|
|
abcl-introspect: fernflower decompiler working
Adapted from (Alan Ruttenberg)
|
|
File size:
1.3 KB
|
| Line | |
|---|
| 1 | (defpackage :abcl-introspect/jvm/tools/fernflower |
|---|
| 2 | (:use :cl) |
|---|
| 3 | (:export |
|---|
| 4 | #:disassemble-class-bytes)) |
|---|
| 5 | (in-package :abcl-introspect/jvm/tools/fernflower) |
|---|
| 6 | |
|---|
| 7 | (defun fernflower-classpath () |
|---|
| 8 | ;; Very ugly. How to make more intelligble? |
|---|
| 9 | (slot-value (first (asdf:component-children (asdf:find-component :fernflower "mvn-libs"))) |
|---|
| 10 | 'asdf/interface::resolved-classpath)) |
|---|
| 11 | |
|---|
| 12 | (defun disassemble-class-bytes (object) |
|---|
| 13 | (uiop/stream::with-temporary-file (:pathname p :type "class") |
|---|
| 14 | (ext::write-class object p) |
|---|
| 15 | (let* ((directory |
|---|
| 16 | (namestring (truename (make-pathname :directory (pathname-directory p))))) |
|---|
| 17 | (path |
|---|
| 18 | (namestring (truename p))) |
|---|
| 19 | (command |
|---|
| 20 | (format nil "java -cp ~a org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler ~a ~a" |
|---|
| 21 | (fernflower-classpath) p directory)) |
|---|
| 22 | (output |
|---|
| 23 | (namestring (make-pathname :defaults p :type "java")))) |
|---|
| 24 | (uiop:run-program command) |
|---|
| 25 | (let ((result (alexandria:read-file-into-string output))) |
|---|
| 26 | (sys::print-lines-with-prefix result))))) |
|---|
| 27 | |
|---|
| 28 | (eval-when (:load-toplevel :execute) |
|---|
| 29 | (pushnew `(:fernflower . abcl-introspect/jvm/tools/fernflower::disassemble-class-bytes) |
|---|
| 30 | sys::*disassemblers*) |
|---|
| 31 | (format cl:*load-verbose* "~&; ~a: Successfully added fernflower decompiler.~%" *package*)) |
|---|
| 32 | |
|---|
| 33 | |
|---|
Note: See
TracBrowser
for help on using the repository browser.