static JSBool bool_valueOf(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { if (!JS_InstanceOf(cx, obj, &boolean_class, argv)) return JS_FALSE; *rval = OBJ_GET_SLOT(cx, obj, JSSLOT_PRIVATE); return JS_TRUE; }
JSBool JS_DLL_CALLBACK js_watch_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { JSRuntime *rt; JSWatchPoint *wp; JSScopeProperty *sprop; jsval userid; JSScope *scope; JSBool ok; rt = cx->runtime; for (wp = (JSWatchPoint *)rt->watchPointList.next; wp != (JSWatchPoint *)&rt->watchPointList; wp = (JSWatchPoint *)wp->links.next) { sprop = wp->sprop; if (wp->object == obj && SPROP_USERID(sprop) == id) { JS_LOCK_OBJ(cx, obj); userid = SPROP_USERID(sprop); scope = OBJ_SCOPE(obj); JS_UNLOCK_OBJ(cx, obj); HoldWatchPoint(wp); ok = wp->handler(cx, obj, userid, SPROP_HAS_VALID_SLOT(sprop, scope) ? OBJ_GET_SLOT(cx, obj, wp->sprop->slot) : JSVAL_VOID, vp, wp->closure); if (ok) { /* * Create pseudo-frame for call to setter so that any * stack-walking security code in the setter will correctly * identify the guilty party. */ JSObject *funobj = (JSObject *) wp->closure; JSFunction *fun = (JSFunction *) JS_GetPrivate(cx, funobj); JSStackFrame frame; memset(&frame, 0, sizeof(frame)); frame.script = fun->script; frame.fun = fun; frame.down = cx->fp; cx->fp = &frame; ok = !wp->setter || ((sprop->attrs & JSPROP_SETTER) ? js_InternalCall(cx, obj, OBJECT_TO_JSVAL(wp->setter), 1, vp, vp) : wp->setter(cx, OBJ_THIS_OBJECT(cx, obj), userid, vp)); cx->fp = frame.down; } return DropWatchPoint(cx, wp); } } JS_ASSERT(0); /* XXX can't happen */ return JS_FALSE; }
static void exn_finalize(JSContext *cx, JSObject *obj) { JSExnPrivate *privateData; jsval privateValue; privateValue = OBJ_GET_SLOT(cx, obj, JSSLOT_PRIVATE); if (!JSVAL_IS_VOID(privateValue)) { privateData = (JSExnPrivate*) JSVAL_TO_PRIVATE(privateValue); if (privateData) exn_destroyPrivate(cx, privateData); } }
static JSExnPrivate * GetExnPrivate(JSContext *cx, JSObject *obj) { jsval privateValue; JSExnPrivate *priv; JS_ASSERT(OBJ_GET_CLASS(cx, obj) == &js_ErrorClass); privateValue = OBJ_GET_SLOT(cx, obj, JSSLOT_PRIVATE); if (JSVAL_IS_VOID(privateValue)) return NULL; priv = (JSExnPrivate *)JSVAL_TO_PRIVATE(privateValue); JS_ASSERT(priv); return priv; }
static JSBool bool_toString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { jsval v; JSAtom *atom; JSString *str; if (!JS_InstanceOf(cx, obj, &boolean_class, argv)) return JS_FALSE; v = OBJ_GET_SLOT(cx, obj, JSSLOT_PRIVATE); if (!JSVAL_IS_BOOLEAN(v)) return js_obj_toString(cx, obj, argc, argv, rval); atom = cx->runtime->atomState.booleanAtoms[JSVAL_TO_BOOLEAN(v) ? 1 : 0]; str = ATOM_TO_STRING(atom); if (!str) return JS_FALSE; *rval = STRING_TO_JSVAL(str); return JS_TRUE; }
JSErrorReport * js_ErrorFromException(JSContext *cx, jsval exn) { JSObject *obj; JSExnPrivate *privateData; jsval privateValue; if (JSVAL_IS_PRIMITIVE(exn)) return NULL; obj = JSVAL_TO_OBJECT(exn); if (OBJ_GET_CLASS(cx, obj) != &ExceptionClass) return NULL; privateValue = OBJ_GET_SLOT(cx, obj, JSSLOT_PRIVATE); if (JSVAL_IS_VOID(privateValue)) return NULL; privateData = (JSExnPrivate*) JSVAL_TO_PRIVATE(privateValue); if (!privateData) return NULL; JS_ASSERT(privateData->errorReport); return privateData->errorReport; }
static JSBool bool_toSource(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { jsval v; char buf[32]; JSString *str; if (!JS_InstanceOf(cx, obj, &boolean_class, argv)) return JS_FALSE; v = OBJ_GET_SLOT(cx, obj, JSSLOT_PRIVATE); if (!JSVAL_IS_BOOLEAN(v)) return js_obj_toSource(cx, obj, argc, argv, rval); JS_snprintf(buf, sizeof buf, "(new %s(%s))", boolean_class.name, js_boolean_str[JSVAL_TO_BOOLEAN(v) ? 1 : 0]); str = JS_NewStringCopyZ(cx, buf); if (!str) return JS_FALSE; *rval = STRING_TO_JSVAL(str); return JS_TRUE; }