luv

Workshop wiki

exception-bridge.lisp

objective-c/exception-bridge.lisp

system luv/objective-c · 12 definitions · on GitHub

One native catch frame around every declared Objective-C message.

in-package#:luv.objective-c
declaim
notinlineobjective-c-message-definition-nameobjective-c-message-definition-selectorobjective-c-message-definition-selector-pointer
defparameter*objective-c-exception-bridge-source-directory*#.
uiop:pathname-directory-pathname
or*compile-file-truename**load-truename*
"The source checkout embedded when this Lisp file is compiled or loaded."
defunobjective-c-exception-bridge-library
let
merge-pathnames
formatnil"../build/objective-c-exception-bridge-~D.dylib"stamp
*objective-c-exception-bridge-source-directory*
defunensure-objective-c-exception-bridge

Build and load the native Objective-C catch frame when its source changed.

let
when
or
not
probe-filelibrary
<
file-write-datelibrary
file-write-datesource
ensure-directories-existlibrary
uiop:run-program
list"clang""-fno-objc-arc""-fexceptions""-fobjc-exceptions""-Wall""-Wextra""-Werror""-dynamiclib""-framework""Foundation""-o"
uiop:native-namestringlibrary
uiop:native-namestringsource
:output*standard-output*:error-output*error-output*
cffi:load-foreign-librarylibrary
defparameter*objective-c-exception-bridge*"Current CFFI handle for the hot-reloadable native exception bridge."
cffi:defcstructobjective-c-native-failure
name:pointer
reason:pointer
call-stack:pointer
defunobjective-c-bridge-function
name
cffi:foreign-symbol-pointername:library*objective-c-exception-bridge*
defun%invoke-objective-c-message
receiverselectorreturn-valuereturn-sizeargument-countargumentsargument-sizesfailure
cffi:foreign-funcall-pointer
:pointerreceiver:pointerselector:pointerreturn-value:sizereturn-size:sizeargument-count:pointerarguments:pointerargument-sizes:pointerfailure:int
defun%free-objective-c-native-failure
failure
cffi:foreign-funcall-pointer
objective-c-bridge-function"luv_objc_failure_free"
:pointerfailure:void
defunnullable-native-string
pointer
unless
cffi:null-pointer-ppointer
cffi:foreign-string-to-lisppointer
defunobjective-c-native-failure-values
failure
let
values
nullable-native-string
cffi:foreign-slot-valuefailuretype'name
nullable-native-string
cffi:foreign-slot-valuefailuretype'reason
nullable-native-string
cffi:foreign-slot-valuefailuretype'call-stack
defuncall-with-objective-c-exception-boundary
definitionreceiverresultresult-sizeargumentsargument-sizesargument-count

Invoke definition natively, translating any Objective-C exception to Lisp.

cffi:with-foreign-object
let
status
%invoke-objective-c-message
objective-c-message-definition-selector-pointerdefinition
resultresult-sizeargument-countargumentsargument-sizesfailure
unless
zeropstatus
multiple-value-bind
namereasoncall-stack
error:message
objective-c-message-definition-namedefinition
:receiverreceiver:selector
objective-c-message-definition-selectordefinition
:namename:reasonreason:call-stackcall-stack