]> git.saurik.com Git - cycript.git/commitdiff
Pretend to support Blocks.
authorJay Freeman (saurik) <saurik@saurik.com>
Sat, 24 Apr 2010 23:11:51 +0000 (23:11 +0000)
committerJay Freeman (saurik) <saurik@saurik.com>
Sat, 24 Apr 2010 23:11:51 +0000 (23:11 +0000)
ObjectiveC/Library.mm
sig/ffi_type.cpp
sig/parse.cpp
sig/types.hpp
todo.txt

index f40d74c446280cafbaf5f1225b5d8c7f1604d22d..9d5289f4d206b7bfe17a87d938c18d039b5cc9b5 100644 (file)
@@ -1343,6 +1343,8 @@ static void CYObjectiveC_CallFunction(JSContextRef context, ffi_cif *cif, void (
 
 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);
@@ -1361,6 +1363,8 @@ static bool CYObjectiveC_PoolFFI(apr_pool_t *pool, JSContextRef context, sig::Ty
 
 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));
index 05dbb123a402f30fc9064613a63e4e4e949313ad..e542ba4d6a6c54219308f21f7aaccdc8bdec9555 100644 (file)
@@ -71,6 +71,7 @@ ffi_type *ObjectiveC(apr_pool_t *pool, struct Type *type) {
 
         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;
@@ -139,6 +140,7 @@ ffi_type *Java(apr_pool_t *pool, struct Type *type) {
         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;
index 7fc663fc0eb18df671b81d98daae1e5ced11cd45..02e54291eb07ee4a198ca65f9c9c6445e1e4492b 100644 (file)
@@ -124,17 +124,25 @@ struct Type *Parse_(apr_pool_t *pool, const char **name, char eos, bool named, C
         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;
@@ -255,6 +263,7 @@ const char *Unparse(apr_pool_t *pool, struct Type *type) {
         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";
index 0d3cf200aaf9465bfd36ae36238a588bdc4621f7..580d999bf4ea0841618344a971183ad81bd7116a 100644 (file)
@@ -49,7 +49,8 @@ enum Primitive {
     union_P = '(',
     string_P = '*',
     selector_P = ':',
-    object_P = '@',
+    block_P = '?',
+    object_P = 'W',
     boolean_P = 'B',
     uchar_P = 'C',
     uint_P = 'I',
index b7480c1acd5a282d94fc303a601ba8387d2c32f6..bc4bea2a9861f4f838141111b6ca12980454bebd 100644 (file)
--- a/todo.txt
+++ b/todo.txt
@@ -26,3 +26,4 @@ NSArray's .toString() and .toLocaleString() fail hard, as Array.prototype.to*Str
 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 = '?'