Previous: Lazy Alien Resolution, Up: Foreign Linkage
SBCL is capable of providing C with linkage to Lisp – the upshot of which is that C-functions can call Lisp functions thru what look like function pointers to C.
These “function pointers” are called Alien Callbacks. An alien callback sequence has 4 parts / stages / bounces:
saves the arguments from the C-call according to the alien-fun-type of the callback, and calls #'ENTER-ALIEN-CALLBACK with the index indentifying the callback, a pointer to the arguments copied on the stack and a pointer to return value storage. When control returns to the wrapper it returns the value to C. There is one assembler wrapper per callback.[1] The SAP to the wrapper code vector is what is passed to foreign code as a callback.
The Assembler Wrapper is generated by
ALIEN-CALLBACK-ASSEMBLER-WRAPPER
.
pulls the Lisp Trampoline for the given index, and calls it with the argument and result pointers.
calls the Lisp Wrapper with the argument and result pointers, and the function designator for the callback. There is one lisp trampoline per callback.
parses the arguments from stack, calls the actual callback with the arguments, and saves the return value at the result pointer. The lisp wrapper is shared between all the callbacks having the same same alien-fun-type.
[1] As assembler wrappers need to be allocated in static addresses and are (in the current scheme of things) never released it might be worth it to split it into two parts: per-callback trampoline that pushes the index of the lisp trampoline on the stack, and jumps to the appropriate assembler wrapper. The assembler wrapper could then be shared between all the callbacks with the same alien-fun-type. This would amortize most of the static allocation costs between multiple callbacks.