]> git.saurik.com Git - cycript.git/blobdiff - Execute.cpp
Error instances that weren't thrown have no stack.
[cycript.git] / Execute.cpp
index 4f9d18d09328de7398076699c13a2d56825de807..1c83e26e9252cec2b189c249321e96cf82faca90 100644 (file)
@@ -1206,7 +1206,15 @@ static JSValueRef All_getProperty(JSContextRef context, JSObjectRef object, JSSt
     const char *code;
     unsigned flags;
     if (CYBridgeHash(pool, CYPoolUTF8String(pool, context, property), code, flags)) {
-        JSValueRef result(_jsccall(JSEvaluateScript, context, CYJSString(CYPoolCode(pool, code)), NULL, NULL, 0));
+        CYUTF8String parsed;
+
+        try {
+            parsed = CYPoolCode(pool, code);
+        } catch (const CYException &error) {
+            CYThrow("%s", pool.strcat("error caching ", CYPoolCString(pool, context, property), ": ", error.PoolCString(pool), NULL));
+        }
+
+        JSValueRef result(_jsccall(JSEvaluateScript, context, CYJSString(parsed), NULL, NULL, 0));
 
         if (flags == 0) {
             JSObjectRef cache(CYGetCachedObject(context, CYJSString("cache")));
@@ -1228,16 +1236,30 @@ static JSValueRef All_complete_callAsFunction(JSContextRef context, JSObjectRef
 
     sqlite3_stmt *statement;
 
-    _sqlcall(sqlite3_prepare(database_,
-        "select "
-            "\"cache\".\"name\" "
-        "from \"cache\" "
-        "where"
-            " \"cache\".\"system\" & " CY_SYSTEM " == " CY_SYSTEM " and"
-            " \"cache\".\"name\" like ? || '%'"
-    , -1, &statement, NULL));
-
-    _sqlcall(sqlite3_bind_text(statement, 1, prefix.data, prefix.size, SQLITE_STATIC));
+    if (prefix.size == 0)
+        _sqlcall(sqlite3_prepare(database_,
+            "select "
+                "\"cache\".\"name\" "
+            "from \"cache\" "
+            "where"
+                " \"cache\".\"system\" & " CY_SYSTEM " == " CY_SYSTEM
+        , -1, &statement, NULL));
+    else {
+        _sqlcall(sqlite3_prepare(database_,
+            "select "
+                "\"cache\".\"name\" "
+            "from \"cache\" "
+            "where"
+                " \"cache\".\"name\" >= ? and \"cache\".\"name\" < ? and "
+                " \"cache\".\"system\" & " CY_SYSTEM " == " CY_SYSTEM
+        , -1, &statement, NULL));
+
+        _sqlcall(sqlite3_bind_text(statement, 1, prefix.data, prefix.size, SQLITE_STATIC));
+
+        char *after(pool.strndup(prefix.data, prefix.size));
+        ++after[prefix.size - 1];
+        _sqlcall(sqlite3_bind_text(statement, 2, after, prefix.size, SQLITE_STATIC));
+    }
 
     while (_sqlcall(sqlite3_step(statement)) != SQLITE_DONE)
         values.push_back(CYCastJSValue(context, CYJSString(sqlite3_column_string(statement, 0))));