summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Lisp/libobjcl.lisp2
-rw-r--r--Lisp/method-invocation.lisp10
-rw-r--r--Objective-C/libobjcl.h4
-rw-r--r--Objective-C/libobjcl.m11
4 files changed, 14 insertions, 13 deletions
diff --git a/Lisp/libobjcl.lisp b/Lisp/libobjcl.lisp
index d1efe53..6cb9759 100644
--- a/Lisp/libobjcl.lisp
+++ b/Lisp/libobjcl.lisp
@@ -33,8 +33,6 @@
&rest)
(defcfun ("objcl_invoke_with_types" %objcl-invoke-with-types) :pointer
- (receiver (:pointer :void))
- (method_selector (:pointer :void))
(argc :int)
(return_typespec (:pointer :char))
(arg_typespecs (:pointer (:pointer :char)))
diff --git a/Lisp/method-invocation.lisp b/Lisp/method-invocation.lisp
index 43a3365..c44fb04 100644
--- a/Lisp/method-invocation.lisp
+++ b/Lisp/method-invocation.lisp
@@ -189,11 +189,15 @@ Returns: *result* --- the return value of the method invocation.
(type-name->type-id return-type)))
(selector (selector method-name)))
(cffi:with-foreign-objects ((arg-types '(:pointer :char) (length args))
- (objc-args '(:pointer :void) (length args))
+ (objc-args '(:pointer :void) (+ (length args) 2))
(return-value-cell return-c-type))
(flet ((ad-hoc-arglist->objc-arglist! (args)
+ (setf (cffi:mem-aref objc-args '(:pointer :void) 0)
+ (pointer-to receiver)
+ (cffi:mem-aref objc-args '(:pointer :void) 1)
+ (pointer-to selector))
(loop for arg in args
- for i from 0
+ for i from 2
do (let* ((type-name (lisp-value->type-name arg))
#+(or)
(cffi-type (type-name->lisp-type type-name)))
@@ -220,7 +224,7 @@ Returns: *result* --- the return value of the method invocation.
(dealloc-ad-hoc-objc-arglist ()
(dotimes (i (length args))
(cffi:foreign-free
- (cffi:mem-aref objc-args '(:pointer :void) i))
+ (cffi:mem-aref objc-args '(:pointer :void) (+ i 2)))
(cffi:foreign-string-free
(cffi:mem-aref arg-types '(:pointer :char) i)))))
(ad-hoc-arglist->objc-arglist! args)
diff --git a/Objective-C/libobjcl.h b/Objective-C/libobjcl.h
index b47ab17..d2f5e76 100644
--- a/Objective-C/libobjcl.h
+++ b/Objective-C/libobjcl.h
@@ -51,9 +51,7 @@ objcl_invoke_method (OBJCL_OBJ_DATA receiver,
...);
id
-objcl_invoke_with_types (void *receiver,
- SEL method_selector,
- int argc,
+objcl_invoke_with_types (int argc,
char *return_typespec,
char *arg_typespecs[],
void *return_value,
diff --git a/Objective-C/libobjcl.m b/Objective-C/libobjcl.m
index 7dc5de2..4fe4aef 100644
--- a/Objective-C/libobjcl.m
+++ b/Objective-C/libobjcl.m
@@ -268,9 +268,7 @@ objcl_invoke_method (OBJCL_OBJ_DATA receiver,
#ifdef USE_LIBFFI
id
-objcl_invoke_with_types (void *receiver,
- SEL method_selector,
- int argc,
+objcl_invoke_with_types (int argc,
char *return_typespec,
char *arg_typespecs[],
void *return_value,
@@ -283,6 +281,9 @@ objcl_invoke_with_types (void *receiver,
ffi_type *arg_types[argc + 2];
ffi_status status;
+ id receiver = (id) argv[0];
+ SEL method_selector = (SEL) argv[1];
+
static ffi_type *id_type = NULL;
static ffi_type *sel_type = NULL;
@@ -294,7 +295,7 @@ objcl_invoke_with_types (void *receiver,
NS_DURING
{
#ifdef __NEXT_RUNTIME__
- method = class_getInstanceMethod ([((id) receiver) class], method_selector)->method_imp;
+ method = class_getInstanceMethod ([receiver class], method_selector)->method_imp;
#else
method = objc_msg_lookup (receiver, method_selector);
#endif
@@ -319,7 +320,7 @@ objcl_invoke_with_types (void *receiver,
userInfo: nil] raise];
}
- ffi_call (&cif, (void *) method, return_value, argv);
+ ffi_call (&cif, FFI_FN (method), return_value, argv);
}
NS_HANDLER
{