From: Jay Freeman (saurik) <saurik@saurik.com>
Date: Thu, 8 Oct 2009 21:05:32 +0000 (+0000)
Subject: Added support for array and dictionary property access.
X-Git-Tag: v0.9.432~374
X-Git-Url: https://git.saurik.com/cycript.git/commitdiff_plain/cc103044437216b14e84b9868a6d967e0fb37e7c

Added support for array and dictionary property access.
---

diff --git a/Library.mm b/Library.mm
index cc57c44..bdcac75 100644
--- a/Library.mm
+++ b/Library.mm
@@ -246,6 +246,9 @@ JSValueRef CYJSUndefined(JSContextRef context) {
 - (bool) cy$isUndefined;
 - (NSString *) cy$toJSON;
 - (JSValueRef) cy$JSValueInContext:(JSContextRef)context transient:(bool)transient;
+- (NSObject *) cy$getProperty:(NSString *)name;
+- (bool) cy$setProperty:(NSString *)name to:(NSObject *)value;
+- (bool) cy$deleteProperty:(NSString *)name;
 @end
 
 @interface NSString (Cycript)
@@ -270,6 +273,21 @@ JSValueRef CYJSUndefined(JSContextRef context) {
     return CYMakeInstance(context, self, transient);
 }
 
+- (NSObject *) cy$getProperty:(NSString *)name {
+    NSLog(@"get:%@", name);
+    return nil;
+}
+
+- (bool) cy$setProperty:(NSString *)name to:(NSObject *)value {
+    NSLog(@"set:%@", name);
+    return false;
+}
+
+- (bool) cy$deleteProperty:(NSString *)name {
+    NSLog(@"delete:%@", name);
+    return false;
+}
+
 @end
 
 @implementation WebUndefined (Cycript)
@@ -320,6 +338,38 @@ JSValueRef CYJSUndefined(JSContextRef context) {
     return json;
 }
 
+- (NSObject *) cy$getProperty:(NSString *)name {
+    int index([name intValue]);
+    if (index < 0 || index >= static_cast<int>([self count]))
+        return [super cy$getProperty:name];
+    else
+        return [self objectAtIndex:index];
+}
+
+@end
+
+@implementation NSMutableArray (Cycript)
+
+- (bool) cy$setProperty:(NSString *)name to:(NSObject *)value {
+    int index([name intValue]);
+    if (index < 0 || index >= static_cast<int>([self count]))
+        return [super cy$setProperty:name to:value];
+    else {
+        [self replaceObjectAtIndex:index withObject:value];
+        return true;
+    }
+}
+
+- (bool) cy$deleteProperty:(NSString *)name {
+    int index([name intValue]);
+    if (index < 0 || index >= static_cast<int>([self count]))
+        return [super cy$deleteProperty:name];
+    else {
+        [self removeObjectAtIndex:index];
+        return true;
+    }
+}
+
 @end
 
 @implementation NSDictionary (Cycript)
@@ -344,6 +394,28 @@ JSValueRef CYJSUndefined(JSContextRef context) {
     return json;
 }
 
+- (NSObject *) cy$getProperty:(NSString *)name {
+    return [self objectForKey:name];
+}
+
+@end
+
+@implementation NSMutableDictionary (Cycript)
+
+- (bool) cy$setProperty:(NSString *)name to:(NSObject *)value {
+    [self setObject:value forKey:name];
+    return true;
+}
+
+- (bool) cy$deleteProperty:(NSString *)name {
+    if ([self objectForKey:name] == nil)
+        return false;
+    else {
+        [self removeObjectForKey:name];
+        return true;
+    }
+}
+
 @end
 
 @implementation NSNumber (Cycript)
@@ -826,27 +898,29 @@ static void OnAccept(CFSocketRef socket, CFSocketCallBackType type, CFDataRef ad
 static JSValueRef Instance_getProperty(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) {
     CYTry {
         CYPool pool;
+        NSString *self(CYCastNSObject(pool, context, object));
         NSString *name(CYCastNSString(pool, property));
-        NSLog(@"get:%@", name);
-        return NULL;
+        NSObject *data([self cy$getProperty:name]);
+        return data == nil ? NULL : CYCastJSValue(context, data);
     } CYCatch
 }
 
 static bool Instance_setProperty(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef value, JSValueRef *exception) {
     CYTry {
         CYPool pool;
+        NSString *self(CYCastNSObject(pool, context, object));
         NSString *name(CYCastNSString(pool, property));
-        NSLog(@"set:%@", name);
-        return false;
+        NSString *data(CYCastNSObject(pool, context, value));
+        return [self cy$setProperty:name to:data];
     } CYCatch
 }
 
 static bool Instance_deleteProperty(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) {
     CYTry {
         CYPool pool;
+        NSString *self(CYCastNSObject(pool, context, object));
         NSString *name(CYCastNSString(pool, property));
-        NSLog(@"delete:%@", name);
-        return false;
+        return [self cy$deleteProperty:name];
     } CYCatch
 }