Support Objective C messages returning structs by value

slava 2006-02-20 03:47:07 +00:00
parent c2140920bd
commit 6d3657ece1
4 changed files with 26 additions and 9 deletions

View File

@ -1,6 +1,4 @@
- CFBundle error handling
- messages returning structs by value
- fix bootstrap compile errors
- out of memory from ffi calls
- update amd64 for %unbox-struct and callbacks
- clean up C stack frame assembly code to avoid moving spilled arguments

View File

@ -40,4 +40,5 @@ sequences strings words ;
] "struct-name" get define-c-type
"struct-name" get in get init-c-type ;
: c-struct? ( type -- ? ) "struct" swap c-type hash ;
: c-struct? ( type -- ? )
c-types get hash [ "struct" swap hash ] [ f ] if* ;

View File

@ -11,6 +11,7 @@ BEGIN-STRUCT: NSRect
END-STRUCT
TYPEDEF: NSRect _NSRect
TYPEDEF: NSRect CGRect
: <NSRect>
"NSRect" <c-object>
@ -25,6 +26,7 @@ BEGIN-STRUCT: NSPoint
END-STRUCT
TYPEDEF: NSPoint _NSPoint
TYPEDEF: NSPoint CGPoint
: <NSPoint>
"NSPoint" <c-object>
@ -37,6 +39,7 @@ BEGIN-STRUCT: NSSize
END-STRUCT
TYPEDEF: NSSize _NSSize
TYPEDEF: NSPoint CGPoint
: <NSSize>
"NSSize" <c-object>

View File

@ -97,14 +97,29 @@ C: selector ( name -- sel ) [ set-selector-name ] keep ;
: make-dip ( quot n -- quot )
dup \ >r <array> -rot \ r> <array> append3 ;
: make-objc-method ( returns args selector -- )
<selector> [ selector ] curry over length 2 - make-dip [
%
swap ,
[ f "objc_msgSend" ] % ,
\ alien-invoke ,
: selector-quot ( string -- ) <selector> [ selector ] curry ;
: make-objc-invoke
[
>r over length 2 - make-dip % r> call \ alien-invoke ,
] [ ] make ;
: make-objc-send ( returns args selector -- )
selector-quot
[ swap , [ f "objc_msgSend" ] % , ] make-objc-invoke ;
: make-objc-send-stret ( returns args selector -- )
>r swap [ <c-object> dup ] curry 1 make-dip r>
selector-quot append [
"void" ,
[ f "objc_msgSend_stret" ] %
{ "void*" } swap append ,
] make-objc-invoke ;
: make-objc-method ( returns args selector -- )
pick c-struct?
[ make-objc-send-stret ] [ make-objc-send ] if ;
: define-objc-method ( returns types selector -- )
[ make-objc-method "[" ] keep "]" append3 create-in
swap define-compound ;