virtual const char *PoolCString(CYPool &pool) const = 0;
#ifdef CY_EXECUTE
- virtual JSValueRef CastJSValue(JSContextRef context) const = 0;
+ virtual JSValueRef CastJSValue(JSContextRef context, const char *name) const = 0;
#endif
};
#define CYTry \
try
-#define CYCatch(value) \
+#define CYCatch_(value, name) \
catch (const CYException &error) { \
- *exception = error.CastJSValue(context); \
+ *exception = error.CastJSValue(context, name); \
return value; \
} catch (...) { \
*exception = CYCastJSValue(context, "catch(...)"); \
return value; \
}
+#define CYCatch(value) \
+ CYCatch_(value, "Error")
#define _assert_(mode, test, code, format, ...) do \
if (!(test)) \
std::stringstream value(CYPoolCString(pool, context, arguments[0]));
CYUTF8String code(CYPoolCode(pool, value));
return CYCastJSValue(context, CYJSString(code));
-} CYCatch(NULL) }
+} CYCatch_(NULL, "SyntaxError") }
static JSValueRef Cycript_gc_callAsFunction(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
CYGarbageCollect(context);
return CYPoolCCYON(pool, context_, value_, objects);
}
-JSValueRef CYJSError::CastJSValue(JSContextRef context) const {
- // XXX: what if the context is different?
+JSValueRef CYJSError::CastJSValue(JSContextRef context, const char *name) const {
+ // XXX: what if the context is different? or the name? I dunno. ("epic" :/)
return value_;
}
-JSValueRef CYCastJSError(JSContextRef context, const char *message) {
- JSObjectRef Error(CYGetCachedObject(context, CYJSString("Error")));
+JSValueRef CYCastJSError(JSContextRef context, const char *name, const char *message) {
+ JSObjectRef Error(CYGetCachedObject(context, CYJSString(name)));
JSValueRef arguments[1] = {CYCastJSValue(context, message)};
return _jsccall(JSObjectCallAsConstructor, context, Error, 1, arguments);
}
-JSValueRef CYPoolError::CastJSValue(JSContextRef context) const {
- return CYCastJSError(context, message_);
+JSValueRef CYPoolError::CastJSValue(JSContextRef context, const char *name) const {
+ return CYCastJSError(context, name, message_);
}
CYJSError::CYJSError(JSContextRef context, const char *format, ...) {
const char *message(pool.vsprintf(64, format, args));
va_end(args);
- value_ = CYCastJSError(context, message);
+ value_ = CYCastJSError(context, "Error", message);
}
JSGlobalContextRef CYGetJSContext(JSContextRef context) {
JSObjectRef String_prototype(CYCastJSObject(context, CYGetProperty(context, String, prototype_s)));
CYSetProperty(context, cy, CYJSString("String_prototype"), String_prototype);
+
+ JSObjectRef SyntaxError(CYCastJSObject(context, CYGetProperty(context, global, CYJSString("SyntaxError"))));
+ CYSetProperty(context, cy, CYJSString("SyntaxError"), SyntaxError);
/* }}} */
CYSetProperty(context, Array_prototype, toCYON_s, &Array_callAsFunction_toCYON, kJSPropertyAttributeDontEnum);