]> git.saurik.com Git - cycript.git/commitdiff
Add hasProperty for All and ObjectiveC::Classes.
authorJay Freeman (saurik) <saurik@saurik.com>
Sun, 26 Jan 2014 16:59:33 +0000 (08:59 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Sun, 26 Jan 2014 17:00:04 +0000 (09:00 -0800)
Execute.cpp
JavaScript.hpp
ObjectiveC/Library.mm

index b4614c4266e884aeabd38adf85f08be4a3d228a8..2bdd59f395882f1e3ee1dbff1da6a749d812292f 100644 (file)
 struct CYHooks *hooks_;
 
 /* JavaScript Properties {{{ */
+bool CYHasProperty(JSContextRef context, JSObjectRef object, JSStringRef name) {
+    return JSObjectHasProperty(context, object, name);
+}
+
 JSValueRef CYGetProperty(JSContextRef context, JSObjectRef object, size_t index) {
     return _jsccall(JSObjectGetPropertyAtIndex, context, object, index);
 }
@@ -991,6 +995,33 @@ JSObjectRef CYMakeType(JSContextRef context, sig::Signature *signature) {
     return CYMakeType(context, &type);
 }
 
+static bool All_hasProperty(JSContextRef context, JSObjectRef object, JSStringRef property) {
+    JSObjectRef global(CYGetGlobalObject(context));
+    JSObjectRef cycript(CYCastJSObject(context, CYGetProperty(context, global, CYJSString("Cycript"))));
+    JSObjectRef alls(CYCastJSObject(context, CYGetProperty(context, cycript, CYJSString("alls"))));
+
+    for (size_t i(0), count(CYArrayLength(context, alls)); i != count; ++i)
+        if (JSObjectRef space = CYCastJSObject(context, CYArrayGet(context, alls, count - i - 1)))
+            if (CYHasProperty(context, space, property))
+                return true;
+
+    CYPool pool;
+    CYUTF8String name(CYPoolUTF8String(pool, context, property));
+
+    size_t length(name.size);
+    char keyed[length + 2];
+    memcpy(keyed + 1, name.data, length + 1);
+
+    static const char *modes = "0124";
+    for (size_t i(0); i != 4; ++i) {
+        keyed[0] = modes[i];
+        if (CYBridgeHash(keyed, length + 1) != NULL)
+            return true;
+    }
+
+    return false;
+}
+
 static JSValueRef All_getProperty(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { CYTry {
     JSObjectRef global(CYGetGlobalObject(context));
     JSObjectRef cycript(CYCastJSObject(context, CYGetProperty(context, global, CYJSString("Cycript"))));
@@ -1538,6 +1569,7 @@ void CYInitializeDynamic() {
 
     definition = kJSClassDefinitionEmpty;
     definition.className = "All";
+    definition.hasProperty = &All_hasProperty;
     definition.getProperty = &All_getProperty;
     definition.getPropertyNames = &All_getPropertyNames;
     All_ = JSClassCreate(&definition);
index c8a8fd89bf4ba34dae75042be2338140f759ecde..3fb2e6c5995d4b976a2fa9a4cb5375800f7523ba 100644 (file)
@@ -67,6 +67,7 @@ double CYCastDouble(JSContextRef context, JSValueRef value);
 CYUTF8String CYPoolUTF8String(CYPool &pool, JSContextRef context, JSStringRef value);
 const char *CYPoolCString(CYPool &pool, JSContextRef context, JSStringRef value);
 
+bool CYHasProperty(JSContextRef context, JSObjectRef object, JSStringRef name);
 JSValueRef CYGetProperty(JSContextRef context, JSObjectRef object, size_t index);
 JSValueRef CYGetProperty(JSContextRef context, JSObjectRef object, JSStringRef name);
 
index 43e592b9c64e2fb5d6494b5ce9eb64074f8530fd..e8579cd00e9c2d9e28b938a6b24c398c951ff943 100644 (file)
@@ -2143,6 +2143,11 @@ static JSValueRef Internal_callAsFunction_$cya(JSContextRef context, JSObjectRef
     return internal->GetOwner();
 } CYCatch(NULL) }
 
+static bool ObjectiveC_Classes_hasProperty(JSContextRef context, JSObjectRef object, JSStringRef property) {
+    CYPool pool;
+    return objc_getClass(CYPoolCString(pool, context, property)) != Nil;
+}
+
 static JSValueRef ObjectiveC_Classes_getProperty(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { CYTry {
     CYPool pool;
     NSString *name(CYCastNSString(&pool, context, property));
@@ -2931,6 +2936,7 @@ void CYObjectiveC_Initialize() { /*XXX*/ JSContextRef context(NULL); CYPoolTry {
 
     definition = kJSClassDefinitionEmpty;
     definition.className = "ObjectiveC::Classes";
+    definition.hasProperty = &ObjectiveC_Classes_hasProperty;
     definition.getProperty = &ObjectiveC_Classes_getProperty;
     definition.getPropertyNames = &ObjectiveC_Classes_getPropertyNames;
     ObjectiveC_Classes_ = JSClassCreate(&definition);