return JSObjectMake(context, Pointer_, internal);
}
-static JSObjectRef CYMakeFunctor(JSContextRef context, void (*function)(), const char *type) {
- return JSObjectMake(context, Functor_, new cy::Functor(type, function));
+static JSObjectRef CYMakeFunctor(JSContextRef context, void (*function)(), const sig::Signature &signature) {
+ return JSObjectMake(context, Functor_, new cy::Functor(signature, function));
}
-static JSObjectRef CYMakeFunctor(JSContextRef context, const char *symbol, const char *type, void **cache) {
+static JSObjectRef CYMakeFunctor(JSContextRef context, const char *symbol, const char *encoding, void **cache) {
cy::Functor *internal;
if (*cache != NULL)
internal = reinterpret_cast<cy::Functor *>(*cache);
if (function == NULL)
return NULL;
- internal = new cy::Functor(type, function);
+ internal = new cy::Functor(encoding, function);
*cache = internal;
}
CYExecuteClosure(cif, result, arguments, arg, &FunctionAdapter_);
}
-Closure_privateData *CYMakeFunctor_(JSContextRef context, JSObjectRef function, const char *type, void (*callback)(ffi_cif *, void *, void **, void *)) {
+Closure_privateData *CYMakeFunctor_(JSContextRef context, JSObjectRef function, const sig::Signature &signature, void (*callback)(ffi_cif *, void *, void **, void *)) {
// XXX: in case of exceptions this will leak
// XXX: in point of fact, this may /need/ to leak :(
- Closure_privateData *internal(new Closure_privateData(context, function, type));
+ Closure_privateData *internal(new Closure_privateData(context, function, signature));
-#if defined(__APPLE__) && defined(__arm__)
+#if defined(__APPLE__) && (defined(__arm__) || defined(__arm64__))
void *executable;
ffi_closure *writable(reinterpret_cast<ffi_closure *>(ffi_closure_alloc(sizeof(ffi_closure), &executable)));
return internal;
}
-static JSObjectRef CYMakeFunctor(JSContextRef context, JSObjectRef function, const char *type) {
- Closure_privateData *internal(CYMakeFunctor_(context, function, type, &FunctionClosure_));
+static JSObjectRef CYMakeFunctor(JSContextRef context, JSObjectRef function, const sig::Signature &signature) {
+ Closure_privateData *internal(CYMakeFunctor_(context, function, signature, &FunctionClosure_));
JSObjectRef object(JSObjectMake(context, Functor_, internal));
// XXX: see above notes about needing to leak
JSValueProtect(CYGetJSContext(context), object);
return CYCastJSObject(context, CYGetProperty(context, CYCastJSObject(context, CYGetProperty(context, CYGetGlobalObject(context), cy_s)), name));
}
-static JSObjectRef CYMakeFunctor(JSContextRef context, JSValueRef value, const char *type) {
+static JSObjectRef CYMakeFunctor(JSContextRef context, JSValueRef value, const sig::Signature &signature) {
JSObjectRef Function(CYGetCachedObject(context, CYJSString("Function")));
bool function(_jsccall(JSValueIsInstanceOfConstructor, context, value, Function));
if (function) {
JSObjectRef function(CYCastJSObject(context, value));
- return CYMakeFunctor(context, function, type);
+ return CYMakeFunctor(context, function, signature);
} else {
void (*function)()(CYCastPointer<void (*)()>(context, value));
- return CYMakeFunctor(context, function, type);
+ return CYMakeFunctor(context, function, signature);
}
}
sig::Type type;
type.name = NULL;
- type.flags = 0;
- type.primitive = sig::pointer_P;
- type.data.data.type = internal->type_;
- type.data.data.size = 0;
+ if (internal->type_->primitive == sig::char_P) {
+ type.flags = internal->type_->flags;
+ type.primitive = sig::string_P;
+ type.data.data.type = NULL;
+ type.data.data.size = 0;
+ } else {
+ type.flags = 0;
+ type.primitive = sig::pointer_P;
+ type.data.data.type = internal->type_;
+ type.data.data.size = 0;
+ }
return CYMakeType(context, &type);
} CYCatch(NULL) }
throw CYJSError(context, "incorrect number of arguments to type cast function");
Type_privateData *internal(reinterpret_cast<Type_privateData *>(JSObjectGetPrivate(object)));
+ if (internal->type_->primitive == sig::function_P)
+ return CYMakeFunctor(context, arguments[0], internal->type_->data.signature);
+
sig::Type *type(internal->type_);
ffi_type *ffi(internal->GetFFI());
// XXX: alignment?
type = type->data.data.type;
}
- void *value(malloc(internal->GetFFI()->size));
+ void *value(calloc(1, internal->GetFFI()->size));
return CYMakePointer(context, value, length, type, NULL, NULL);
} CYCatch(NULL) }
if (count != 2)
throw CYJSError(context, "incorrect number of arguments to Functor constructor");
CYPool pool;
- const char *type(CYPoolCString(pool, context, arguments[1]));
- return CYMakeFunctor(context, arguments[0], type);
+ const char *encoding(CYPoolCString(pool, context, arguments[1]));
+ sig::Signature signature;
+ sig::Parse(pool, &signature, encoding, &Structor_);
+ return CYMakeFunctor(context, arguments[0], signature);
} CYCatch(NULL) }
static JSValueRef CYValue_callAsFunction_valueOf(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {