]> git.saurik.com Git - cycript.git/commitdiff
Use new ^ syntax to bridge Blocks (with @ offset). v0.9.460
authorJay Freeman (saurik) <saurik@saurik.com>
Sat, 15 Sep 2012 16:16:55 +0000 (09:16 -0700)
committerJay Freeman (saurik) <saurik@saurik.com>
Sat, 15 Sep 2012 16:16:55 +0000 (09:16 -0700)
Execute.cpp
Internal.hpp
ObjectiveC/Library.mm
ObjectiveC/Replace.cpp

index 018deb1e9415fa43ea6b4bd1ed09311670466809..0afd0980e10bfa44c7b83a618d468b08453bbf8c 100644 (file)
@@ -131,7 +131,7 @@ size_t CYGetIndex(apr_pool_t *pool, JSContextRef context, JSStringRef value) {
 
 static JSClassRef All_;
 static JSClassRef Context_;
-static JSClassRef Functor_;
+JSClassRef Functor_;
 static JSClassRef Global_;
 static JSClassRef Pointer_;
 static JSClassRef Struct_;
index 7f8563d5b6cd7e8bbd24e673874a0bf9b498b1ba..34ad2574517d9bee46510a26dcaf65acbab952db 100644 (file)
@@ -38,6 +38,8 @@ void Structor_(apr_pool_t *pool, sig::Type *&type);
 JSObjectRef CYMakeType(JSContextRef context, const char *type);
 JSObjectRef CYMakeType(JSContextRef context, sig::Type *type);
 
+extern JSClassRef Functor_;
+
 struct Type_privateData :
     CYData
 {
index 7b33245a534b8b0d3408133d213dff60c2088250..77511f8508b90b283a0d60bdf129de0e62a281bb 100644 (file)
@@ -645,12 +645,45 @@ _finline bool CYJSValueIsInstanceOfCachedConstructor(JSContextRef context, JSVal
     return is;
 }
 
+NSObject *CYMakeBlock(void (*invoke)(), sig::Signature &signature) {
+    BlockLiteral *literal(reinterpret_cast<BlockLiteral *>(malloc(sizeof(BlockLiteral))));
+
+    struct Descriptor {
+        struct {
+            BlockDescriptor1 one_;
+            BlockDescriptor2 two_;
+            BlockDescriptor3 three_;
+        } d_;
+
+        CYPool pool_;
+    };
+
+    Descriptor *descriptor(new Descriptor);
+    memset(&descriptor->d_, 0, sizeof(descriptor->d_));
+
+    literal->isa = objc_getClass("__NSGlobalBlock__");
+    literal->flags = BLOCK_HAS_SIGNATURE | BLOCK_HAS_COPY_DISPOSE | BLOCK_IS_GLOBAL;
+    literal->reserved = 0;
+    literal->invoke = reinterpret_cast<void (*)(void *, ...)>(invoke);
+    literal->descriptor = descriptor;
+
+    descriptor->d_.one_.size = sizeof(descriptor->d_);
+    descriptor->d_.three_.signature = sig::Unparse(descriptor->pool_, &signature);
+
+    return reinterpret_cast<NSObject *>(literal);
+}
+
 NSObject *CYCastNSObject(apr_pool_t *pool, JSContextRef context, JSObjectRef object) {
     if (CYJSValueIsNSObject(context, object)) {
         Instance *internal(reinterpret_cast<Instance *>(JSObjectGetPrivate(object)));
         return internal->GetValue();
     }
 
+    if (JSValueIsObjectOfClass(context, object, Functor_)) {
+        cy::Functor *internal(reinterpret_cast<cy::Functor *>(JSObjectGetPrivate(object)));
+        return CYMakeBlock(internal->GetValue(), internal->signature_);
+    }
+
     bool array(CYJSValueIsInstanceOfCachedConstructor(context, object, Array_s));
     id value(array ? [CYJSArray alloc] : [CYJSObject alloc]);
     return CYPoolRelease(pool, [value initWithJSObject:object inContext:context]);
index 96f66630fecea261f3667ea76e45d22fb3b6a39a..1f6c118ae8536499142fb24f61c3712251a86208 100644 (file)
@@ -167,7 +167,7 @@ CYExpression *CYBox::Replace(CYContext &context) {
 }
 
 CYExpression *CYObjCBlock::Replace(CYContext &context) {
-    return $N2($V("Functor"), $ CYFunctionExpression(NULL, parameters_->Parameters(context), statements_), parameters_->TypeSignature(context, type_->Replace(context)));
+    return $N2($V("Functor"), $ CYFunctionExpression(NULL, $ CYFunctionParameter($ CYDeclaration($ CYIdentifier("$cyt")), parameters_->Parameters(context)), statements_), parameters_->TypeSignature(context, $ CYAdd(type_->Replace(context), $ CYString("@"))));
 }
 
 CYStatement *CYProtocol::Replace(CYContext &context) const { $T(NULL)