The functions described here are defined
in src/compiler.lisp
and src/record.d
and can be used to examine the internals of a compiled closure.
These function are internal CLISP
functions, their names are not exported, this section is
not supposed to be comprehensive and is not guaranteed to be
up to date. It is intended for aspiring CLISP hackers who are
supposed to graduate to reading the sources right away. All others
should stick with the [ANSI CL standard] function DISASSEMBLE
.
Closure name. The normal way to extract the name of a closure is
FUNCTION-LAMBDA-EXPRESSION
:
(defun my-plus-1 (x y) (declare (compile)) (+ x y)) ⇒MY-PLUS-1
(function-lambda-expression #'my-plus-1) ⇒(LAMBDA (X Y) (DECLARE (COMPILE)) (+ X Y))
; ⇒; ⇒
T
MY-PLUS-1
;; works only on closure objects (sys::closure-name #'my-plus-1) ⇒MY-PLUS-1
Closure bytecode. The actual bytecode vector (if you modify it, you can get a segfault when the function is executed):
(sys::closure-codevec #'my-plus-1)
⇒ #(0 0 0 0 2 0 0 0 6 3 174 174 51 2 53 25 3)
Closure constants. A closure can depend on external and internal values:
(let ((x 123) (y 456)) (defun my-plus-2 (z) (declare (compile)) (+ x y z))) ⇒MY-PLUS-2
(sys::closure-consts #'my-plus-2) ⇒(#(Y 456 X 123 NIL) 3 1)
Use DISASSEMBLE
to see how the constants are used.
Closure signature. Function SYS::SIGNATURE
returns 8 values:
LIST
)Mnemonic bytecodes. One can convert between numeric and mnemonic bytecodes (“LAP” stands for “Lisp Assembly Program”):
(multiple-value-bind (req-num opt-num rest-p key-p keyword-list allow-other-keys-p byte-list const-list) (sys::signature #'my-plus-1) (sys::disassemble-LAP byte-list const-list)) ⇒((0 LOAD&PUSH 2) (1 LOAD&PUSH 2) (2 CALLSR 2 53) (5 SKIP&RET 3))
(sys::assemble-LAP (mapcar #'rest *)) ⇒(174 174 51 2 53 25 3)
These notes document CLISP version 2.49.93+ | Last modified: 2018-02-19 |