From 6d3657ece1b070819f61776cd97b19d7c54c5e35 Mon Sep 17 00:00:00 2001 From: slava Date: Mon, 20 Feb 2006 03:47:07 +0000 Subject: [PATCH] Support Objective C messages returning structs by value --- TODO.FACTOR.txt | 2 -- library/alien/structs.factor | 3 ++- library/cocoa/cocoa-types.factor | 3 +++ library/cocoa/objc-utils.factor | 27 +++++++++++++++++++++------ 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/TODO.FACTOR.txt b/TODO.FACTOR.txt index cd27011ba3..065e90d94a 100644 --- a/TODO.FACTOR.txt +++ b/TODO.FACTOR.txt @@ -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 diff --git a/library/alien/structs.factor b/library/alien/structs.factor index 627f9c6e3c..78bc909489 100644 --- a/library/alien/structs.factor +++ b/library/alien/structs.factor @@ -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* ; diff --git a/library/cocoa/cocoa-types.factor b/library/cocoa/cocoa-types.factor index a106ce6329..d1dbcedf5c 100644 --- a/library/cocoa/cocoa-types.factor +++ b/library/cocoa/cocoa-types.factor @@ -11,6 +11,7 @@ BEGIN-STRUCT: NSRect END-STRUCT TYPEDEF: NSRect _NSRect +TYPEDEF: NSRect CGRect : "NSRect" @@ -25,6 +26,7 @@ BEGIN-STRUCT: NSPoint END-STRUCT TYPEDEF: NSPoint _NSPoint +TYPEDEF: NSPoint CGPoint : "NSPoint" @@ -37,6 +39,7 @@ BEGIN-STRUCT: NSSize END-STRUCT TYPEDEF: NSSize _NSSize +TYPEDEF: NSPoint CGPoint : "NSSize" diff --git a/library/cocoa/objc-utils.factor b/library/cocoa/objc-utils.factor index 183dc3a9a5..53bc40c253 100644 --- a/library/cocoa/objc-utils.factor +++ b/library/cocoa/objc-utils.factor @@ -97,14 +97,29 @@ C: selector ( name -- sel ) [ set-selector-name ] keep ; : make-dip ( quot n -- quot ) dup \ >r -rot \ r> append3 ; -: make-objc-method ( returns args selector -- ) - [ selector ] curry over length 2 - make-dip [ - % - swap , - [ f "objc_msgSend" ] % , - \ alien-invoke , +: selector-quot ( string -- ) [ 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 [ 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 ;