]> git.saurik.com Git - cycript.git/commitdiff
Factor JSValueRef exception arguments to _jsccall.
authorJay Freeman (saurik) <saurik@saurik.com>
Thu, 9 Jan 2014 04:39:13 +0000 (20:39 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Thu, 9 Jan 2014 04:39:13 +0000 (20:39 -0800)
Exception.hpp
Execute.cpp
ObjectiveC/Library.mm

index 9f6a81a5e8f72a69479628914c31f1a50c082729..0410fd151398755ab8593cab38bf68e1b1b373f8 100644 (file)
@@ -103,4 +103,28 @@ void CYThrow(JSContextRef context, JSValueRef value);
     _value; \
 })
 
+struct CYJSException {
+    JSContextRef context_;
+    JSValueRef value_;
+
+    CYJSException(JSContextRef context) :
+        context_(context),
+        value_(NULL)
+    {
+    }
+
+    ~CYJSException() {
+        CYThrow(context_, value_);
+    }
+
+    operator JSValueRef *() {
+        return &value_;
+    }
+};
+
+#define _jsccall(code, args...) ({ \
+    CYJSException _error(context); \
+    (code)(args, _error); \
+})
+
 #endif/*CYCRIPT_ERROR_HPP*/
index ca0b6174f13a0e593cb08d258453e2b5ed3576fc..87e7de246736daf69b74a0e1cabdd0e552ea741b 100644 (file)
@@ -50,29 +50,19 @@ struct CYHooks *hooks_;
 
 /* JavaScript Properties {{{ */
 JSValueRef CYGetProperty(JSContextRef context, JSObjectRef object, size_t index) {
-    JSValueRef exception(NULL);
-    JSValueRef value(JSObjectGetPropertyAtIndex(context, object, index, &exception));
-    CYThrow(context, exception);
-    return value;
+    return _jsccall(JSObjectGetPropertyAtIndex, context, object, index);
 }
 
 JSValueRef CYGetProperty(JSContextRef context, JSObjectRef object, JSStringRef name) {
-    JSValueRef exception(NULL);
-    JSValueRef value(JSObjectGetProperty(context, object, name, &exception));
-    CYThrow(context, exception);
-    return value;
+    return _jsccall(JSObjectGetProperty, context, object, name);
 }
 
 void CYSetProperty(JSContextRef context, JSObjectRef object, size_t index, JSValueRef value) {
-    JSValueRef exception(NULL);
-    JSObjectSetPropertyAtIndex(context, object, index, value, &exception);
-    CYThrow(context, exception);
+    _jsccall(JSObjectSetPropertyAtIndex, context, object, index, value);
 }
 
 void CYSetProperty(JSContextRef context, JSObjectRef object, JSStringRef name, JSValueRef value, JSPropertyAttributes attributes) {
-    JSValueRef exception(NULL);
-    JSObjectSetProperty(context, object, name, value, attributes, &exception);
-    CYThrow(context, exception);
+    _jsccall(JSObjectSetProperty, context, object, name, value, attributes);
 }
 
 void CYSetProperty(JSContextRef context, JSObjectRef object, JSStringRef name, JSValueRef (*callback)(JSContextRef, JSObjectRef, JSObjectRef, size_t, const JSValueRef[], JSValueRef *), JSPropertyAttributes attributes) {
@@ -96,10 +86,7 @@ JSStringRef CYCopyJSString(CYUTF8String value) {
 JSStringRef CYCopyJSString(JSContextRef context, JSValueRef value) {
     if (JSValueIsNull(context, value))
         return NULL;
-    JSValueRef exception(NULL);
-    JSStringRef string(JSValueToStringCopy(context, value, &exception));
-    CYThrow(context, exception);
-    return string;
+    return _jsccall(JSValueToStringCopy, context, value);
 }
 
 static CYUTF16String CYCastUTF16String(JSStringRef value) {
@@ -284,10 +271,7 @@ JSValueRef CYJSUndefined(JSContextRef context) {
 }
 
 double CYCastDouble(JSContextRef context, JSValueRef value) {
-    JSValueRef exception(NULL);
-    double number(JSValueToNumber(context, value, &exception));
-    CYThrow(context, exception);
-    return number;
+    return _jsccall(JSValueToNumber, context, value);
 }
 
 bool CYCastBool(JSContextRef context, JSValueRef value) {
@@ -307,17 +291,11 @@ JSValueRef CYCastJSValue(JSContextRef context, const char *value) {
 }
 
 JSObjectRef CYCastJSObject(JSContextRef context, JSValueRef value) {
-    JSValueRef exception(NULL);
-    JSObjectRef object(JSValueToObject(context, value, &exception));
-    CYThrow(context, exception);
-    return object;
+    return _jsccall(JSValueToObject, context, value);
 }
 
 JSValueRef CYCallAsFunction(JSContextRef context, JSObjectRef function, JSObjectRef _this, size_t count, const JSValueRef arguments[]) {
-    JSValueRef exception(NULL);
-    JSValueRef value(JSObjectCallAsFunction(context, function, _this, count, arguments, &exception));
-    CYThrow(context, exception);
-    return value;
+    return _jsccall(JSObjectCallAsFunction, context, function, _this, count, arguments);
 }
 
 bool CYIsCallable(JSContextRef context, JSValueRef value) {
@@ -329,19 +307,14 @@ size_t CYArrayLength(JSContextRef context, JSObjectRef array) {
 }
 
 JSValueRef CYArrayGet(JSContextRef context, JSObjectRef array, size_t index) {
-    JSValueRef exception(NULL);
-    JSValueRef value(JSObjectGetPropertyAtIndex(context, array, index, &exception));
-    CYThrow(context, exception);
-    return value;
+    return _jsccall(JSObjectGetPropertyAtIndex, context, array, index);
 }
 
 void CYArrayPush(JSContextRef context, JSObjectRef array, JSValueRef value) {
-    JSValueRef exception(NULL);
     JSValueRef arguments[1];
     arguments[0] = value;
     JSObjectRef Array(CYGetCachedObject(context, CYJSString("Array_prototype")));
-    JSObjectCallAsFunction(context, CYCastJSObject(context, CYGetProperty(context, Array, push_s)), array, 1, arguments, &exception);
-    CYThrow(context, exception);
+    _jsccall(JSObjectCallAsFunction, context, CYCastJSObject(context, CYGetProperty(context, Array, push_s)), array, 1, arguments);
 }
 
 static JSValueRef System_print(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
@@ -400,10 +373,7 @@ const char *CYPoolCCYON(CYPool &pool, JSContextRef context, JSValueRef value, JS
 } CYCatch(NULL) }
 
 const char *CYPoolCCYON(CYPool &pool, JSContextRef context, JSValueRef value) {
-    JSValueRef exception(NULL);
-    const char *cyon(CYPoolCCYON(pool, context, value, &exception));
-    CYThrow(context, exception);
-    return cyon;
+    return _jsccall(CYPoolCCYON, pool, context, value);
 }
 
 const char *CYPoolCCYON(CYPool &pool, JSContextRef context, JSObjectRef object) {
@@ -417,10 +387,7 @@ const char *CYPoolCCYON(CYPool &pool, JSContextRef context, JSObjectRef object)
     JSValueRef toJSON(CYGetProperty(context, object, toJSON_s));
     if (CYIsCallable(context, toJSON)) {
         JSValueRef arguments[1] = {CYCastJSValue(context, CYJSString(""))};
-        JSValueRef exception(NULL);
-        const char *cyon(CYPoolCCYON(pool, context, CYCallAsFunction(context, (JSObjectRef) toJSON, object, 1, arguments), &exception));
-        CYThrow(context, exception);
-        return cyon;
+        return _jsccall(CYPoolCCYON, pool, context, CYCallAsFunction(context, (JSObjectRef) toJSON, object, 1, arguments));
     }
 
     if (JSObjectIsFunction(context, object)) {
@@ -786,10 +753,7 @@ JSObjectRef CYGetCachedObject(JSContextRef context, JSStringRef name) {
 static JSObjectRef CYMakeFunctor(JSContextRef context, JSValueRef value, const char *type) {
     JSObjectRef Function(CYGetCachedObject(context, CYJSString("Function")));
 
-    JSValueRef exception(NULL);
-    bool function(JSValueIsInstanceOfConstructor(context, value, Function, &exception));
-    CYThrow(context, exception);
-
+    bool function(_jsccall(JSValueIsInstanceOfConstructor, context, value, Function));
     if (function) {
         JSObjectRef function(CYCastJSObject(context, value));
         return CYMakeFunctor(context, function, type);
@@ -1311,11 +1275,9 @@ void CYSetArgs(int argc, const char *argv[]) {
         args[i] = CYCastJSValue(context, argv[i]);
 
     JSObjectRef array;
-    if (JSObjectMakeArray$ != NULL) {
-        JSValueRef exception(NULL);
-        array = (*JSObjectMakeArray$)(context, argc, args, &exception);
-        CYThrow(context, exception);
-    } else {
+    if (JSObjectMakeArray$ != NULL)
+        array = _jsccall(*JSObjectMakeArray$, context, argc, args);
+    else {
         JSObjectRef Array(CYGetCachedObject(context, CYJSString("Array")));
         JSValueRef value(CYCallAsFunction(context, Array, NULL, argc, args));
         array = CYCastJSObject(context, value);
@@ -1471,14 +1433,8 @@ JSValueRef CYJSError::CastJSValue(JSContextRef context) const {
 
 JSValueRef CYCastJSError(JSContextRef context, const char *message) {
     JSObjectRef Error(CYGetCachedObject(context, CYJSString("Error")));
-
     JSValueRef arguments[1] = {CYCastJSValue(context, message)};
-
-    JSValueRef exception(NULL);
-    JSValueRef value(JSObjectCallAsConstructor(context, Error, 1, arguments, &exception));
-    CYThrow(context, exception);
-
-    return value;
+    return _jsccall(JSObjectCallAsConstructor, context, Error, 1, arguments);
 }
 
 JSValueRef CYPoolError::CastJSValue(JSContextRef context) const {
@@ -1504,8 +1460,6 @@ JSGlobalContextRef CYGetJSContext(JSContextRef context) {
 }
 
 extern "C" void CYSetupContext(JSGlobalContextRef context) {
-    JSValueRef exception(NULL);
-
     CYInitializeDynamic();
 
     JSObjectRef global(CYGetGlobalObject(context));
@@ -1559,8 +1513,7 @@ extern "C" void CYSetupContext(JSGlobalContextRef context) {
     JSObjectRef all(JSObjectMake(context, All_, NULL));
     CYSetProperty(context, cycript, CYJSString("all"), all);
 
-    JSObjectRef alls(JSObjectCallAsConstructor(context, Array, 0, NULL, &exception));
-    CYThrow(context, exception);
+    JSObjectRef alls(_jsccall(JSObjectCallAsConstructor, context, Array, 0, NULL));
     CYSetProperty(context, cycript, CYJSString("alls"), alls);
 
     if (true) {
index e54e02a5a2ef61f10f5b4e47aa1886c194f6ee1d..dddbd951740f3ec806dd7ac14f324c67cffa13bf 100644 (file)
 
 #include <dlfcn.h>
 
-#define CYObjectiveTry_(context) { \
-    JSContextRef context_(context); \
+#define CYObjectiveTry_ { \
     try
 #define CYObjectiveTry { \
+    JSContextRef context(context_); \
     try
 #define CYObjectiveCatch \
     catch (const CYException &error) { \
-        @throw CYCastNSObject(NULL, context_, error.CastJSValue(context_)); \
+        @throw CYCastNSObject(NULL, context, error.CastJSValue(context)); \
     } \
 }
 
@@ -630,11 +630,7 @@ _finline bool CYJSValueIsNSObject(JSContextRef context, JSValueRef value) {
 }
 
 _finline bool CYJSValueIsInstanceOfCachedConstructor(JSContextRef context, JSValueRef value, JSStringRef cache) {
-    JSValueRef exception(NULL);
-    JSObjectRef constructor(CYGetCachedObject(context, cache));
-    bool is(JSValueIsInstanceOfConstructor(context, value, constructor, &exception));
-    CYThrow(context, exception);
-    return is;
+    return _jsccall(JSValueIsInstanceOfConstructor, context, value, CYGetCachedObject(context, cache));
 }
 
 NSObject *CYMakeBlock(void (*invoke)(), sig::Signature &signature) {
@@ -806,7 +802,7 @@ NSObject *CYCopyNSObject(CYPool &pool, JSContextRef context, JSValueRef value) {
 }
 
 - (JSValueRef) cy$getProperty:(NSString *)name inContext:(JSContextRef)context {
-    CYObjectiveTry_(context) {
+    CYObjectiveTry_ {
         if ([name isEqualToString:@"length"])
             return CYCastJSValue(context, [self count]);
     } CYObjectiveCatch
@@ -853,7 +849,7 @@ NSObject *CYCopyNSObject(CYPool &pool, JSContextRef context, JSValueRef value) {
     return objective ? value : [NSString stringWithFormat:@"@%@", value];
 }
 
-- (JSValueRef) cy$valueOfInContext:(JSContextRef)context { CYObjectiveTry_(context) {
+- (JSValueRef) cy$valueOfInContext:(JSContextRef)context { CYObjectiveTry_ {
     return CYCastJSValue(context, (bool) [self boolValue]);
 } CYObjectiveCatch }
 
@@ -1010,7 +1006,7 @@ NSObject *CYCopyNSObject(CYPool &pool, JSContextRef context, JSValueRef value) {
     return objective ? value : [NSString stringWithFormat:@"@%@", value];
 }
 
-- (JSValueRef) cy$valueOfInContext:(JSContextRef)context { CYObjectiveTry_(context) {
+- (JSValueRef) cy$valueOfInContext:(JSContextRef)context { CYObjectiveTry_ {
     return [self cy$JSType] != kJSTypeBoolean ? CYCastJSValue(context, [self doubleValue]) : CYCastJSValue(context, static_cast<bool>([self boolValue]));
 } CYObjectiveCatch }
 
@@ -1028,7 +1024,7 @@ NSObject *CYCopyNSObject(CYPool &pool, JSContextRef context, JSValueRef value) {
     return objective ? value : [NSString stringWithFormat:@"@%@", value];
 }
 
-- (JSValueRef) cy$valueOfInContext:(JSContextRef)context { CYObjectiveTry_(context) {
+- (JSValueRef) cy$valueOfInContext:(JSContextRef)context { CYObjectiveTry_ {
     return CYJSNull(context);
 } CYObjectiveCatch }
 
@@ -1045,7 +1041,7 @@ NSObject *CYCopyNSObject(CYPool &pool, JSContextRef context, JSValueRef value) {
     return [self cy$valueOfInContext:context];
 }
 
-- (JSValueRef) cy$valueOfInContext:(JSContextRef)context { CYObjectiveTry_(context) {
+- (JSValueRef) cy$valueOfInContext:(JSContextRef)context { CYObjectiveTry_ {
     return NULL;
 } CYObjectiveCatch }
 
@@ -1065,7 +1061,7 @@ NSObject *CYCopyNSObject(CYPool &pool, JSContextRef context, JSValueRef value) {
     return nil;
 }
 
-- (JSValueRef) cy$getProperty:(NSString *)name inContext:(JSContextRef)context { CYObjectiveTry_(context) {
+- (JSValueRef) cy$getProperty:(NSString *)name inContext:(JSContextRef)context { CYObjectiveTry_ {
     if (NSObject *value = [self cy$getProperty:name])
         return CYCastJSValue(context, value);
     return NULL;
@@ -1144,7 +1140,7 @@ NSObject *CYCopyNSObject(CYPool &pool, JSContextRef context, JSValueRef value) {
     }
 }
 
-- (JSValueRef) cy$valueOfInContext:(JSContextRef)context { CYObjectiveTry_(context) {
+- (JSValueRef) cy$valueOfInContext:(JSContextRef)context { CYObjectiveTry_ {
     return CYCastJSValue(context, CYJSString(context, self));
 } CYObjectiveCatch }
 
@@ -1163,7 +1159,7 @@ NSObject *CYCopyNSObject(CYPool &pool, JSContextRef context, JSValueRef value) {
     //return objective ? value : [NSString stringWithFormat:@"@%@", value];
 }
 
-- (JSValueRef) cy$valueOfInContext:(JSContextRef)context { CYObjectiveTry_(context) {
+- (JSValueRef) cy$valueOfInContext:(JSContextRef)context { CYObjectiveTry_ {
     return CYJSUndefined(context);
 } CYObjectiveCatch }
 
@@ -1204,7 +1200,7 @@ JSValueRef CYCastJSValue(JSContextRef context, NSObject *value) { CYPoolTry {
 
 @implementation CYJSObject
 
-- (id) initWithJSObject:(JSObjectRef)object inContext:(JSContextRef)context { CYObjectiveTry {
+- (id) initWithJSObject:(JSObjectRef)object inContext:(JSContextRef)context { CYObjectiveTry_ {
     if ((self = [super init]) != nil) {
         object_ = object;
         context_ = CYGetJSContext(context);
@@ -1221,7 +1217,7 @@ JSValueRef CYCastJSValue(JSContextRef context, NSObject *value) { CYPoolTry {
 
 - (NSString *) cy$toCYON:(bool)objective { CYObjectiveTry {
     CYPool pool;
-    const char *cyon(CYPoolCCYON(pool, context_, object_));
+    const char *cyon(CYPoolCCYON(pool, context, object_));
     if (cyon == NULL)
         return [super cy$toCYON:objective];
     else
@@ -1229,46 +1225,44 @@ JSValueRef CYCastJSValue(JSContextRef context, NSObject *value) { CYPoolTry {
 } CYObjectiveCatch }
 
 - (NSUInteger) count { CYObjectiveTry {
-    JSPropertyNameArrayRef names(JSObjectCopyPropertyNames(context_, object_));
+    JSPropertyNameArrayRef names(JSObjectCopyPropertyNames(context, object_));
     size_t size(JSPropertyNameArrayGetCount(names));
     JSPropertyNameArrayRelease(names);
     return size;
 } CYObjectiveCatch }
 
 - (id) objectForKey:(id)key { CYObjectiveTry {
-    JSValueRef value(CYGetProperty(context_, object_, CYJSString(context_, (NSObject *) key)));
-    if (JSValueIsUndefined(context_, value))
+    JSValueRef value(CYGetProperty(context, object_, CYJSString(context, (NSObject *) key)));
+    if (JSValueIsUndefined(context, value))
         return nil;
-    return CYCastNSObject(NULL, context_, value) ?: [NSNull null];
+    return CYCastNSObject(NULL, context, value) ?: [NSNull null];
 } CYObjectiveCatch }
 
 - (NSEnumerator *) keyEnumerator { CYObjectiveTry {
-    JSPropertyNameArrayRef names(JSObjectCopyPropertyNames(context_, object_));
-    NSEnumerator *enumerator([CYCastNSArray(context_, names) objectEnumerator]);
+    JSPropertyNameArrayRef names(JSObjectCopyPropertyNames(context, object_));
+    NSEnumerator *enumerator([CYCastNSArray(context, names) objectEnumerator]);
     JSPropertyNameArrayRelease(names);
     return enumerator;
 } CYObjectiveCatch }
 
 - (void) setObject:(id)object forKey:(id)key { CYObjectiveTry {
-    CYSetProperty(context_, object_, CYJSString(context_, (NSObject *) key), CYCastJSValue(context_, (NSString *) object));
+    CYSetProperty(context, object_, CYJSString(context, (NSObject *) key), CYCastJSValue(context, (NSString *) object));
 } CYObjectiveCatch }
 
 - (void) removeObjectForKey:(id)key { CYObjectiveTry {
-    JSValueRef exception(NULL);
-    (void) JSObjectDeleteProperty(context_, object_, CYJSString(context_, (NSObject *) key), &exception);
-    CYThrow(context_, exception);
+    (void) _jsccall(JSObjectDeleteProperty, context, object_, CYJSString(context, (NSObject *) key));
 } CYObjectiveCatch }
 
 @end
 
 @implementation CYJSArray
 
-- (NSString *) cy$toCYON:(bool)objective {
+- (NSString *) cy$toCYON:(bool)objective { CYObjectiveTry {
     CYPool pool;
-    return [NSString stringWithUTF8String:CYPoolCCYON(pool, context_, object_)];
-}
+    return [NSString stringWithUTF8String:CYPoolCCYON(pool, context, object_)];
+} CYObjectiveCatch }
 
-- (id) initWithJSObject:(JSObjectRef)object inContext:(JSContextRef)context { CYObjectiveTry {
+- (id) initWithJSObject:(JSObjectRef)object inContext:(JSContextRef)context { CYObjectiveTry_ {
     if ((self = [super init]) != nil) {
         object_ = object;
         context_ = CYGetJSContext(context);
@@ -1284,62 +1278,54 @@ JSValueRef CYCastJSValue(JSContextRef context, NSObject *value) { CYPoolTry {
 } CYObjectiveCatch }
 
 - (NSUInteger) count { CYObjectiveTry {
-    return CYArrayLength(context_, object_);
+    return CYArrayLength(context, object_);
 } CYObjectiveCatch }
 
 - (id) objectAtIndex:(NSUInteger)index { CYObjectiveTry {
     size_t bounds([self count]);
     if (index >= bounds)
         @throw [NSException exceptionWithName:NSRangeException reason:[NSString stringWithFormat:@"*** -[CYJSArray objectAtIndex:]: index (%zu) beyond bounds (%zu)", static_cast<size_t>(index), bounds] userInfo:nil];
-    JSValueRef exception(NULL);
-    JSValueRef value(JSObjectGetPropertyAtIndex(context_, object_, index, &exception));
-    CYThrow(context_, exception);
-    return CYCastNSObject(NULL, context_, value) ?: [NSNull null];
+    JSValueRef value(_jsccall(JSObjectGetPropertyAtIndex, context, object_, index));
+    return CYCastNSObject(NULL, context, value) ?: [NSNull null];
 } CYObjectiveCatch }
 
 - (void) addObject:(id)object { CYObjectiveTry {
-    CYArrayPush(context_, object_, CYCastJSValue(context_, (NSObject *) object));
+    CYArrayPush(context, object_, CYCastJSValue(context, (NSObject *) object));
 } CYObjectiveCatch }
 
 - (void) insertObject:(id)object atIndex:(NSUInteger)index { CYObjectiveTry {
     size_t bounds([self count] + 1);
     if (index >= bounds)
         @throw [NSException exceptionWithName:NSRangeException reason:[NSString stringWithFormat:@"*** -[CYJSArray insertObject:atIndex:]: index (%zu) beyond bounds (%zu)", static_cast<size_t>(index), bounds] userInfo:nil];
-    JSValueRef exception(NULL);
     JSValueRef arguments[3];
-    arguments[0] = CYCastJSValue(context_, index);
-    arguments[1] = CYCastJSValue(context_, 0);
-    arguments[2] = CYCastJSValue(context_, (NSObject *) object);
-    JSObjectRef Array(CYGetCachedObject(context_, CYJSString("Array_prototype")));
-    JSObjectCallAsFunction(context_, CYCastJSObject(context_, CYGetProperty(context_, Array, splice_s)), object_, 3, arguments, &exception);
-    CYThrow(context_, exception);
+    arguments[0] = CYCastJSValue(context, index);
+    arguments[1] = CYCastJSValue(context, 0);
+    arguments[2] = CYCastJSValue(context, (NSObject *) object);
+    JSObjectRef Array(CYGetCachedObject(context, CYJSString("Array_prototype")));
+    _jsccall(JSObjectCallAsFunction, context, CYCastJSObject(context, CYGetProperty(context, Array, splice_s)), object_, 3, arguments);
 } CYObjectiveCatch }
 
 - (void) removeLastObject { CYObjectiveTry {
-    JSValueRef exception(NULL);
-    JSObjectRef Array(CYGetCachedObject(context_, CYJSString("Array_prototype")));
-    JSObjectCallAsFunction(context_, CYCastJSObject(context_, CYGetProperty(context_, Array, pop_s)), object_, 0, NULL, &exception);
-    CYThrow(context_, exception);
+    JSObjectRef Array(CYGetCachedObject(context, CYJSString("Array_prototype")));
+    _jsccall(JSObjectCallAsFunction, context, CYCastJSObject(context, CYGetProperty(context, Array, pop_s)), object_, 0, NULL);
 } CYObjectiveCatch }
 
 - (void) removeObjectAtIndex:(NSUInteger)index { CYObjectiveTry {
     size_t bounds([self count]);
     if (index >= bounds)
         @throw [NSException exceptionWithName:NSRangeException reason:[NSString stringWithFormat:@"*** -[CYJSArray removeObjectAtIndex:]: index (%zu) beyond bounds (%zu)", static_cast<size_t>(index), bounds] userInfo:nil];
-    JSValueRef exception(NULL);
     JSValueRef arguments[2];
-    arguments[0] = CYCastJSValue(context_, index);
-    arguments[1] = CYCastJSValue(context_, 1);
-    JSObjectRef Array(CYGetCachedObject(context_, CYJSString("Array_prototype")));
-    JSObjectCallAsFunction(context_, CYCastJSObject(context_, CYGetProperty(context_, Array, splice_s)), object_, 2, arguments, &exception);
-    CYThrow(context_, exception);
+    arguments[0] = CYCastJSValue(context, index);
+    arguments[1] = CYCastJSValue(context, 1);
+    JSObjectRef Array(CYGetCachedObject(context, CYJSString("Array_prototype")));
+    _jsccall(JSObjectCallAsFunction, context, CYCastJSObject(context, CYGetProperty(context, Array, splice_s)), object_, 2, arguments);
 } CYObjectiveCatch }
 
 - (void) replaceObjectAtIndex:(NSUInteger)index withObject:(id)object { CYObjectiveTry {
     size_t bounds([self count]);
     if (index >= bounds)
         @throw [NSException exceptionWithName:NSRangeException reason:[NSString stringWithFormat:@"*** -[CYJSArray replaceObjectAtIndex:withObject:]: index (%zu) beyond bounds (%zu)", static_cast<size_t>(index), bounds] userInfo:nil];
-    CYSetProperty(context_, object_, index, CYCastJSValue(context_, (NSObject *) object));
+    CYSetProperty(context, object_, index, CYCastJSValue(context, (NSObject *) object));
 } CYObjectiveCatch }
 
 @end
@@ -1354,18 +1340,18 @@ JSValueRef CYCastJSValue(JSContextRef context, NSObject *value) { CYPoolTry {
 
 @implementation CYInternal
 
-- (void) dealloc {
+- (void) dealloc { CYObjectiveTry {
     JSValueUnprotect(context_, object_);
     JSGlobalContextRelease(context_);
     [super dealloc];
-}
+} CYObjectiveCatch }
 
-- (id) initInContext:(JSContextRef)context {
+- (id) initInContext:(JSContextRef)context { CYObjectiveTry_ {
     if ((self = [super init]) != nil) {
         context_ = CYGetJSContext(context);
         JSGlobalContextRetain(context_);
     } return self;
-}
+} CYObjectiveCatch }
 
 - (bool) hasProperty:(JSStringRef)name inContext:(JSContextRef)context {
     if (object_ == NULL)
@@ -2598,7 +2584,7 @@ static JSStaticFunction Selector_staticFunctions[5] = {
 };
 
 #ifdef __APPLE__
-JSValueRef NSCFType$cy$toJSON$inContext$(id self, SEL sel, JSValueRef key, JSContextRef context) { CYObjectiveTry_(context) {
+JSValueRef NSCFType$cy$toJSON$inContext$(id self, SEL sel, JSValueRef key, JSContextRef context) { CYObjectiveTry_ {
     return CYCastJSValue(context, [(NSString *) CFCopyDescription((CFTypeRef) self) autorelease]);
 } CYObjectiveCatch }
 #endif