JSPROP_SETTER, NULL);
JSPROP_SETTER | JSPROP_SHARED, NULL);
obj_defineSetter(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,                 jsval *rval){    jsval fval, junk;    jsid id;    JSBool found;    uintN attrs;    fval = argv[1];    if (JS_TypeOfValue(cx, fval) != JSTYPE_FUNCTION) {        JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,                             JSMSG_BAD_GETTER_OR_SETTER,                             js_setter_str);        return JS_FALSE;    }    if (!JS_ValueToId(cx, argv[0], &id))        return JS_FALSE;    if (!js_CheckRedeclaration(cx, obj, id, JSPROP_SETTER, &found))        return JS_FALSE;    /*     * Getters and setters are just like watchpoints from an access     * control point of view.     */    if (!OBJ_CHECK_ACCESS(cx, obj, id, JSACC_WATCH, &junk, &attrs))        return JS_FALSE;    return OBJ_DEFINE_PROPERTY(cx, obj, id, JSVAL_VOID,                               NULL, (JSPropertyOp) JSVAL_TO_OBJECT(fval),                               JSPROP_SETTER, NULL);}