branch: externals/beardbolt
commit b60a9e3a84e0d3420551660af5808d7668cc33d7
Author: Jay Kamat <[email protected]>
Commit: Jay Kamat <[email protected]>
Fix errors with emacs <25 with elisp disass
---
README.org | 2 ++
rmsbolt.el | 41 ++++++++++++++++++++++-------------------
2 files changed, 24 insertions(+), 19 deletions(-)
diff --git a/README.org b/README.org
index f8c93183f5..37bb6b4bb0 100644
--- a/README.org
+++ b/README.org
@@ -136,6 +136,8 @@ copied into it's own directory, making it much harder to
view non-toy examples.
No support for source->asm matching, filtering, or automatic recompile.
+Emacs 26 or the ~cl-print~ package are required.
+
[[https://i.imgur.com/uYrQ7En.gif][https://i.imgur.com/uYrQ7En.gif]]
** Common Lisp
diff --git a/rmsbolt.el b/rmsbolt.el
index 2b54eb0139..d24a196086 100644
--- a/rmsbolt.el
+++ b/rmsbolt.el
@@ -66,6 +66,7 @@
(require 'map)
(require 'cc-defs)
(require 'compile)
+(require 'disass)
(require 'rmsbolt-java)
@@ -618,25 +619,27 @@ This should be an object of type `rmsbolt-lang', normally
set by the major mode"
(defun rmsbolt--disassemble-file (filename out-buffer)
"Disassemble an elisp FILENAME into elisp bytecode in OUT-BUFFER.
Lifted from
https://emacs.stackexchange.com/questions/35936/disassembly-of-a-bytecode-file"
- (byte-compile-file filename)
- ;; .el -> .elc
- (setq filename (concat filename "c"))
- (with-temp-buffer
- (insert-file-contents filename)
- (let ((inbuf (current-buffer)))
- (goto-char (point-min))
- (with-current-buffer out-buffer
- (erase-buffer)
- (condition-case ()
- (cl-loop with cl-print-compiled = 'disassemble
- for expr = (read inbuf)
- do (pcase expr
- (`(byte-code ,(pred stringp) ,(pred vectorp) ,(pred
natnump))
- (princ "TOP-LEVEL byte code:\n" (current-buffer))
- (disassemble-1 expr 0))
- (_ (cl-prin1 expr (current-buffer))))
- do (terpri (current-buffer)))
- (end-of-file nil))))))
+ (if (not (require 'cl-print nil 'noerror))
+ (error "Package cl-print or Emacs 26+ are required for the Emacs
disassembler")
+ (byte-compile-file filename)
+ ;; .el -> .elc
+ (setq filename (concat filename "c"))
+ (with-temp-buffer
+ (insert-file-contents filename)
+ (let ((inbuf (current-buffer)))
+ (goto-char (point-min))
+ (with-current-buffer out-buffer
+ (erase-buffer)
+ (condition-case ()
+ (cl-loop with cl-print-compiled = 'disassemble
+ for expr = (read inbuf)
+ do (pcase expr
+ (`(byte-code ,(pred stringp) ,(pred vectorp)
,(pred natnump))
+ (princ "TOP-LEVEL byte code:\n" (current-buffer))
+ (disassemble-1 expr 0))
+ (_ (cl-prin1 expr (current-buffer))))
+ do (terpri (current-buffer)))
+ (end-of-file nil)))))))
;;;;; Filter Functions