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);