]> git.saurik.com Git - cycript.git/commitdiff
Implement Ctrl-C "cancel" with ExecutionTimeLimit.
authorJay Freeman (saurik) <saurik@saurik.com>
Tue, 17 Nov 2015 05:09:18 +0000 (21:09 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Tue, 17 Nov 2015 05:09:18 +0000 (21:09 -0800)
Console.cpp
Execute.cpp
JavaScript.hpp

index 9e84912f8a9b2b6e6d8b2bbd674fe1ac6b14338b..a7e09291d52632dda885b37df8f385fb436bf722 100644 (file)
@@ -85,7 +85,8 @@ static void sigint(int) {
         case Parsing:
             longjmp(ctrlc_, 1);
         case Running:
-            throw "*** Ctrl-C";
+            CYCancel();
+            return;
         case Sending:
             return;
         case Waiting:
index 8c50dcd3b0bc5354c9820c51054436d09fe75652..1c32d602ab635048e294675d1d0e7aa94cce708e 100644 (file)
@@ -1590,30 +1590,32 @@ class ExecutionHandle {
     }
 };
 
+static volatile bool cancel_;
+
+static bool CYShouldTerminate(JSContextRef context, void *arg) {
+    return cancel_;
+}
+
 const char *CYExecute(JSContextRef context, CYPool &pool, CYUTF8String code) {
     JSValueRef exception(NULL);
+    if (false) error:
+        return CYPoolCString(pool, context, CYJSString(context, exception));
 
     ExecutionHandle handle(context);
 
-    JSValueRef result; try {
-        result = JSEvaluateScript(context, CYJSString(code), NULL, NULL, 0, &exception);
-    } catch (const char *error) {
-        return error;
-    }
+    cancel_ = false;
+    if (&JSContextGroupSetExecutionTimeLimit != NULL)
+        JSContextGroupSetExecutionTimeLimit(JSContextGetGroup(context), 0.5, &CYShouldTerminate, NULL);
 
-    if (exception != NULL) error:
-        return CYPoolCString(pool, context, CYJSString(context, exception));
+    JSValueRef result(JSEvaluateScript(context, CYJSString(code), NULL, NULL, 0, &exception));
+    if (exception != NULL)
+        goto error;
 
     if (JSValueIsUndefined(context, result))
         return NULL;
 
-    const char *json; try {
-        std::set<void *> objects;
-        json = CYPoolCCYON(pool, context, result, objects, &exception);
-    } catch (const char *error) {
-        return error;
-    }
-
+    std::set<void *> objects;
+    const char *json(CYPoolCCYON(pool, context, result, objects, &exception));
     if (exception != NULL)
         goto error;
 
@@ -1622,6 +1624,10 @@ const char *CYExecute(JSContextRef context, CYPool &pool, CYUTF8String code) {
     return json;
 }
 
+void CYCancel() {
+    cancel_ = true;
+}
+
 static bool initialized_ = false;
 
 void CYInitializeDynamic() {
index b658a51d2d4aebe3e51760e992a0a2fe1c611364..bd1bd6796324dfb978855f3612cb768096525abc 100644 (file)
@@ -61,6 +61,7 @@ JSObjectRef CYGetGlobalObject(JSContextRef context);
 
 extern "C" void CYSetupContext(JSGlobalContextRef context);
 const char *CYExecute(JSContextRef context, CYPool &pool, CYUTF8String code);
+void CYCancel();
 
 void CYSetArgs(int argc, const char *argv[]);
 
@@ -217,6 +218,9 @@ extern "C" void JSWeakObjectMapSet(JSContextRef ctx, JSWeakObjectMapRef map, voi
 extern "C" JSObjectRef JSWeakObjectMapGet(JSContextRef ctx, JSWeakObjectMapRef map, void *key) __attribute__((__weak_import__));
 extern "C" bool JSWeakObjectMapClear(JSContextRef ctx, JSWeakObjectMapRef map, void *key, JSObjectRef object) __attribute__((__weak_import__));
 extern "C" void JSWeakObjectMapRemove(JSContextRef ctx, JSWeakObjectMapRef map, void* key) __attribute__((__weak_import__));
+
+typedef bool (*JSShouldTerminateCallback)(JSContextRef ctx, void *context);
+extern "C" void JSContextGroupSetExecutionTimeLimit(JSContextGroupRef, double limit, JSShouldTerminateCallback, void *context) __attribute__((__weak_import__));
 #endif
 
 #endif/*CYCRIPT_JAVASCRIPT_HPP*/