static bool CYObjectiveC_PoolFFI(apr_pool_t *pool, JSContextRef context, sig::Type *type, ffi_type *ffi, void *data, JSValueRef value) { CYSadTry {
switch (type->primitive) {
+ // XXX: do something epic about blocks
+ case sig::block_P:
case sig::object_P:
case sig::typename_P:
*reinterpret_cast<id *>(data) = CYCastNSObject(pool, context, value);
static JSValueRef CYObjectiveC_FromFFI(JSContextRef context, sig::Type *type, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) { CYPoolTry {
switch (type->primitive) {
+ // XXX: do something epic about blocks
+ case sig::block_P:
case sig::object_P:
if (NSObject *object = *reinterpret_cast<NSObject **>(data)) {
JSValueRef value(CYCastJSValue(context, object));
case string_P: return &ffi_type_pointer;
case selector_P: return &ffi_type_pointer;
+ case block_P: return &ffi_type_pointer;
case object_P: return &ffi_type_pointer;
case boolean_P: return &ffi_type_uchar;
case uchar_P: return &ffi_type_uchar;
case union_P: return &ffi_type_pointer;
case string_P: return &ffi_type_pointer;
case selector_P: return &ffi_type_pointer;
+ case block_P: return &ffi_type_pointer;
case object_P: return &ffi_type_pointer;
case boolean_P: return &ffi_type_uchar;
case uchar_P: return &ffi_type_uchar;
case '*': type->primitive = string_P; break;
case ':': type->primitive = selector_P; break;
- case '@':
- if (**name == '"') {
- const char *quote = strchr(*name + 1, '"');
- if (!named || quote[1] == eos || quote[1] == '"') {
- type->name = apr_pstrmemdup(pool, *name + 1, quote - *name - 1);
- *name = quote + 1;
+ case '@': {
+ char next(**name);
+
+ if (next == '?') {
+ type->primitive = block_P;
+ ++*name;
+ } else {
+ type->primitive = object_P;
+
+ if (next == '"') {
+ const char *quote = strchr(*name + 1, '"');
+ if (!named || quote[1] == eos || quote[1] == '"') {
+ type->name = apr_pstrmemdup(pool, *name + 1, quote - *name - 1);
+ *name = quote + 1;
+ }
}
}
- type->primitive = object_P;
- break;
+ } break;
case 'B': type->primitive = boolean_P; break;
case 'C': type->primitive = uchar_P; break;
case union_P: return apr_psprintf(pool, "(%s)", Unparse(pool, &type->data.signature));
case string_P: return "*";
case selector_P: return ":";
+ case block_P: return "@?";
case object_P: return type->name == NULL ? "@" : apr_psprintf(pool, "@\"%s\"", type->name);
case boolean_P: return "B";
case uchar_P: return "C";
union_P = '(',
string_P = '*',
selector_P = ':',
- object_P = '@',
+ block_P = '?',
+ object_P = 'W',
boolean_P = 'B',
uchar_P = 'C',
uint_P = 'I',
applyOnMainThread, when done at console, loops the cyonifier
special work needs to be done to correctly handle the "arguments" symbol: Declare("arguments", ...Special)
at the Program level I seem to be eating away all of the var statements
+function pointers are ?; note that blocks are currently block_P = '?'