Bug 1088002 part 3. Stop requiring JSPROP_PROPOP_ACCESSORS just to use stub accessors. r=waldo

This commit is contained in:
Boris Zbarsky 2014-10-29 15:06:32 -04:00
parent e783498ddd
commit d3ead51082
19 changed files with 47 additions and 41 deletions

View File

@ -1035,7 +1035,7 @@ nsDOMClassInfo::ResolveConstructor(JSContext *cx, JSObject *aObj,
JS::Rooted<jsid> id(cx, sConstructor_id);
if (!::JS_DefinePropertyById(cx, obj, id, val,
JSPROP_ENUMERATE | JSPROP_PROPOP_ACCESSORS,
JSPROP_ENUMERATE,
JS_STUBGETTER, JS_STUBSETTER)) {
return NS_ERROR_UNEXPECTED;
}
@ -1456,8 +1456,7 @@ DefineInterfaceConstants(JSContext *cx, JS::Handle<JSObject*> obj, const nsIID *
NS_ENSURE_TRUE(NS_SUCCEEDED(rv), rv);
if (!::JS_DefineProperty(cx, obj, name, v,
JSPROP_ENUMERATE | JSPROP_READONLY |
JSPROP_PERMANENT | JSPROP_PROPOP_ACCESSORS,
JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT,
JS_STUBGETTER, JS_STUBSETTER)) {
return NS_ERROR_UNEXPECTED;
}
@ -2055,8 +2054,7 @@ ResolvePrototype(nsIXPConnect *aXPConnect, nsGlobalWindow *aWin, JSContext *cx,
// Per ECMA, the prototype property is {DontEnum, DontDelete, ReadOnly}
if (!JS_WrapValue(cx, &v) ||
!JS_DefineProperty(cx, class_obj, "prototype", v,
JSPROP_PERMANENT | JSPROP_READONLY |
JSPROP_PROPOP_ACCESSORS,
JSPROP_PERMANENT | JSPROP_READONLY,
JS_STUBGETTER, JS_STUBSETTER)) {
return NS_ERROR_UNEXPECTED;
}
@ -2515,8 +2513,7 @@ LookupComponentsShim(JSContext *cx, JS::Handle<JSObject*> global,
NS_ENSURE_TRUE(interfaces, NS_ERROR_OUT_OF_MEMORY);
bool ok =
JS_DefineProperty(cx, components, "interfaces", interfaces,
JSPROP_ENUMERATE | JSPROP_PERMANENT | JSPROP_READONLY |
JSPROP_PROPOP_ACCESSORS,
JSPROP_ENUMERATE | JSPROP_PERMANENT | JSPROP_READONLY,
JS_STUBGETTER, JS_STUBSETTER);
NS_ENSURE_TRUE(ok, NS_ERROR_OUT_OF_MEMORY);
@ -2539,8 +2536,7 @@ LookupComponentsShim(JSContext *cx, JS::Handle<JSObject*> global,
// Define the shim on the interfaces object.
ok = JS_DefineProperty(cx, interfaces, geckoName, v,
JSPROP_ENUMERATE | JSPROP_PERMANENT |
JSPROP_READONLY | JSPROP_PROPOP_ACCESSORS,
JSPROP_ENUMERATE | JSPROP_PERMANENT | JSPROP_READONLY,
JS_STUBGETTER, JS_STUBSETTER);
NS_ENSURE_TRUE(ok, NS_ERROR_OUT_OF_MEMORY);
}

View File

@ -2591,7 +2591,7 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument,
JS::Rooted<JSObject*> rootedWrapper(cx, GetWrapperPreserveColor());
if (!JS_DefineProperty(cx, newInnerGlobal, "window", rootedWrapper,
JSPROP_ENUMERATE | JSPROP_READONLY |
JSPROP_PERMANENT | JSPROP_PROPOP_ACCESSORS,
JSPROP_PERMANENT,
JS_STUBGETTER, JS_STUBSETTER)) {
NS_ERROR("can't create the 'window' property");
return NS_ERROR_FAILURE;
@ -4527,8 +4527,7 @@ nsGlobalWindow::SetOpener(JSContext* aCx, JS::Handle<JS::Value> aOpener,
}
if (!JS_WrapObject(aCx, &thisObj) ||
!JS_DefineProperty(aCx, thisObj, "opener", aOpener,
JSPROP_ENUMERATE | JSPROP_PROPOP_ACCESSORS,
!JS_DefineProperty(aCx, thisObj, "opener", aOpener, JSPROP_ENUMERATE,
JS_STUBGETTER, JS_STUBSETTER)) {
aError.Throw(NS_ERROR_FAILURE);
}
@ -14005,8 +14004,7 @@ nsGlobalWindow::SetConsole(JSContext* aCx, JS::Handle<JS::Value> aValue)
}
if (!JS_WrapObject(aCx, &thisObj) ||
!JS_DefineProperty(aCx, thisObj, "console", aValue,
JSPROP_ENUMERATE | JSPROP_PROPOP_ACCESSORS,
!JS_DefineProperty(aCx, thisObj, "console", aValue, JSPROP_ENUMERATE,
JS_STUBGETTER, JS_STUBSETTER)) {
return NS_ERROR_FAILURE;
}

View File

@ -529,7 +529,7 @@ CreateInterfaceObject(JSContext* cx, JS::Handle<JSObject*> global,
if (!namedConstructor ||
!JS_DefineProperty(cx, namedConstructor, "prototype",
proto,
JSPROP_PERMANENT | JSPROP_READONLY | JSPROP_PROPOP_ACCESSORS,
JSPROP_PERMANENT | JSPROP_READONLY,
JS_STUBGETTER, JS_STUBSETTER) ||
(defineOnGlobal &&
!DefineConstructor(cx, global, namedConstructors->mName,

View File

@ -887,7 +887,7 @@ GetOrCreateClassObjectMap(JSContext *cx, JS::Handle<JSObject*> scope, const char
// It's not there. Create and define it.
JS::Rooted<JSObject*> map(cx, JS::NewWeakMapObject(cx));
if (!map || !JS_DefineProperty(cx, scope, mapName, map,
JSPROP_PERMANENT | JSPROP_READONLY | JSPROP_PROPOP_ACCESSORS,
JSPROP_PERMANENT | JSPROP_READONLY,
JS_STUBGETTER, JS_STUBSETTER))
{
return nullptr;
@ -1036,7 +1036,7 @@ nsXBLBinding::DoInitJSClass(JSContext *cx,
JSAutoCompartment ac3(cx, holder);
if (!JS_WrapObject(cx, &proto) ||
!JS_DefineProperty(cx, holder, aClassName.get(), proto,
JSPROP_READONLY | JSPROP_PERMANENT | JSPROP_PROPOP_ACCESSORS,
JSPROP_READONLY | JSPROP_PERMANENT,
JS_STUBGETTER, JS_STUBSETTER))
{
return NS_ERROR_OUT_OF_MEMORY;

View File

@ -118,7 +118,7 @@ nsXBLProtoImpl::InstallImplementation(nsXBLPrototypeBinding* aPrototypeBinding,
// Define it as a property on the scopeObject, using the same name used on
// the content side.
bool ok = JS_DefineProperty(cx, scopeObject, className, propertyHolder,
JSPROP_PERMANENT | JSPROP_READONLY | JSPROP_PROPOP_ACCESSORS,
JSPROP_PERMANENT | JSPROP_READONLY,
JS_STUBGETTER, JS_STUBSETTER);
NS_ENSURE_TRUE(ok, NS_ERROR_UNEXPECTED);
} else {

View File

@ -559,7 +559,7 @@ XPCShellEnvironment::Init()
JS::Rooted<Value> privateVal(cx, PrivateValue(this));
if (!JS_DefineProperty(cx, globalObj, "__XPCShellEnvironment",
privateVal,
JSPROP_READONLY | JSPROP_PERMANENT | JSPROP_PROPOP_ACCESSORS,
JSPROP_READONLY | JSPROP_PERMANENT,
JS_STUBGETTER, JS_STUBSETTER) ||
!JS_DefineFunctions(cx, globalObj, gGlobalFunctions) ||
!JS_DefineProfilingFunctions(cx, globalObj))

View File

@ -1184,14 +1184,13 @@ ShellObjectMetadataCallback(JSContext *cx, JSObject **pmetadata)
static int createdIndex = 0;
createdIndex++;
if (!JS_DefineProperty(cx, obj, "index", createdIndex,
JSPROP_PROPOP_ACCESSORS,
if (!JS_DefineProperty(cx, obj, "index", createdIndex, 0,
JS_STUBGETTER, JS_STUBSETTER))
{
return false;
}
if (!JS_DefineProperty(cx, obj, "stack", stack, JSPROP_PROPOP_ACCESSORS,
if (!JS_DefineProperty(cx, obj, "stack", stack, 0,
JS_STUBGETTER, JS_STUBSETTER))
{
return false;
@ -1204,8 +1203,7 @@ ShellObjectMetadataCallback(JSContext *cx, JSObject **pmetadata)
if (iter.isFunctionFrame() && iter.compartment() == cx->compartment()) {
id = INT_TO_JSID(stackIndex);
RootedObject callee(cx, iter.callee());
if (!JS_DefinePropertyById(cx, stack, id, callee,
JSPROP_PROPOP_ACCESSORS,
if (!JS_DefinePropertyById(cx, stack, id, callee, 0,
JS_STUBGETTER, JS_STUBSETTER))
{
return false;

View File

@ -1379,7 +1379,7 @@ JS_InitCTypesClass(JSContext* cx, HandleObject global)
return false;
if (!JS_DefineProperty(cx, global, "ctypes", ctypes,
JSPROP_READONLY | JSPROP_PERMANENT | JSPROP_PROPOP_ACCESSORS,
JSPROP_READONLY | JSPROP_PERMANENT,
JS_STUBGETTER, JS_STUBSETTER)){
return false;
}

View File

@ -47,7 +47,7 @@ BEGIN_TEST(testAddPropertyHook)
JS::RootedValue arr(cx, OBJECT_TO_JSVAL(obj));
CHECK(JS_DefineProperty(cx, global, "arr", arr,
JSPROP_ENUMERATE | JSPROP_PROPOP_ACCESSORS,
JSPROP_ENUMERATE,
JS_STUBGETTER, JS_STUBSETTER));
JS::RootedObject arrObj(cx, &arr.toObject());
@ -55,7 +55,7 @@ BEGIN_TEST(testAddPropertyHook)
obj = JS_NewObject(cx, &AddPropertyClass, JS::NullPtr(), JS::NullPtr());
CHECK(obj);
CHECK(JS_DefineElement(cx, arrObj, i, obj,
JSPROP_ENUMERATE | JSPROP_PROPOP_ACCESSORS,
JSPROP_ENUMERATE,
JS_STUBGETTER, JS_STUBSETTER));
}

View File

@ -12,8 +12,7 @@ BEGIN_TEST(testSetProperty_NativeGetterStubSetter)
JS::RootedObject obj(cx, JS_NewObject(cx, nullptr, JS::NullPtr(), JS::NullPtr()));
CHECK(obj);
CHECK(JS_DefineProperty(cx, global, "globalProp", obj,
JSPROP_ENUMERATE | JSPROP_PROPOP_ACCESSORS,
CHECK(JS_DefineProperty(cx, global, "globalProp", obj, JSPROP_ENUMERATE,
JS_STUBGETTER, JS_STUBSETTER));
CHECK(JS_DefineProperty(cx, obj, "prop", JS::UndefinedHandleValue,

View File

@ -2831,7 +2831,24 @@ DefinePropertyById(JSContext *cx, HandleObject obj, HandleId id, HandleValue val
// than JSNatives. However, we might be pulling this property descriptor off
// of something with JSNative property descriptors. If we are, wrap them in
// JS Function objects.
if (!(attrs & JSPROP_PROPOP_ACCESSORS)) {
//
// But skip doing this if our accessors are the well-known stub
// accessors, since those are known to be JSPropertyOps. Assert
// some sanity about it, though.
MOZ_ASSERT_IF(getter == JS_PropertyStub,
setter == JS_StrictPropertyStub || (attrs & JSPROP_PROPOP_ACCESSORS));
MOZ_ASSERT_IF(setter == JS_StrictPropertyStub,
getter == JS_PropertyStub || (attrs & JSPROP_PROPOP_ACCESSORS));
// If !(attrs & JSPROP_PROPOP_ACCESSORS), then either getter/setter are both
// possibly-null JSNatives (or possibly-null JSFunction* if JSPROP_GETTER or
// JSPROP_SETTER is appropriately set), or both are the well-known property
// stubs. The subsequent block must handle only the first of these cases,
// so carefully exclude the latter case.
if (!(attrs & JSPROP_PROPOP_ACCESSORS) &&
getter != JS_PropertyStub && setter != JS_StrictPropertyStub)
{
JSFunction::Flags zeroFlags = JSAPIToJSFunctionFlags(0);
RootedAtom atom(cx, JSID_IS_ATOM(id) ? JSID_TO_ATOM(id) : nullptr);

View File

@ -289,7 +289,7 @@ DefineHelpProperty(JSContext *cx, HandleObject obj, const char *prop, const char
if (!atom)
return false;
return JS_DefineProperty(cx, obj, prop, atom,
JSPROP_READONLY | JSPROP_PERMANENT | JSPROP_PROPOP_ACCESSORS,
JSPROP_READONLY | JSPROP_PERMANENT,
JS_STUBGETTER, JS_STUBSETTER);
}

View File

@ -1567,7 +1567,7 @@ js_InitMathClass(JSContext *cx, HandleObject obj)
if (!Math)
return nullptr;
if (!JS_DefineProperty(cx, obj, js_Math_str, Math, JSPROP_PROPOP_ACCESSORS,
if (!JS_DefineProperty(cx, obj, js_Math_str, Math, 0,
JS_STUBGETTER, JS_STUBSETTER))
{
return nullptr;

View File

@ -913,8 +913,7 @@ js_InitJSONClass(JSContext *cx, HandleObject obj)
if (!JSON)
return nullptr;
if (!JS_DefineProperty(cx, global, js_JSON_str, JSON,
JSPROP_PROPOP_ACCESSORS,
if (!JS_DefineProperty(cx, global, js_JSON_str, JSON, 0,
JS_STUBGETTER, JS_STUBSETTER))
return nullptr;

View File

@ -3541,7 +3541,7 @@ JS_InitReflect(JSContext *cx, HandleObject obj)
if (!Reflect)
return nullptr;
if (!JS_DefineProperty(cx, obj, "Reflect", Reflect, JSPROP_PROPOP_ACCESSORS,
if (!JS_DefineProperty(cx, obj, "Reflect", Reflect, 0,
JS_STUBGETTER, JS_STUBSETTER)) {
return nullptr;
}

View File

@ -231,8 +231,7 @@ namespace JS {
JSObject*
RegisterPerfMeasurement(JSContext *cx, HandleObject globalArg)
{
static const uint8_t PM_CATTRS =
JSPROP_ENUMERATE|JSPROP_READONLY|JSPROP_PERMANENT|JSPROP_PROPOP_ACCESSORS;
static const uint8_t PM_CATTRS = JSPROP_ENUMERATE|JSPROP_READONLY|JSPROP_PERMANENT;
RootedObject global(cx, globalArg);
RootedObject prototype(cx);

View File

@ -893,7 +893,7 @@ js_InitProxyClass(JSContext *cx, HandleObject obj)
if (!JS_DefineFunctions(cx, ctor, static_methods))
return nullptr;
if (!JS_DefineProperty(cx, obj, "Proxy", ctor, JSPROP_PROPOP_ACCESSORS,
if (!JS_DefineProperty(cx, obj, "Proxy", ctor, 0,
JS_STUBGETTER, JS_STUBSETTER)) {
return nullptr;
}

View File

@ -425,7 +425,7 @@ ExportFunction(JSContext *cx, HandleValue vfunction, HandleValue vscope, HandleV
// the target.
if (!JSID_IS_VOID(options.defineAs)) {
if (!JS_DefinePropertyById(cx, targetScope, id, rval,
JSPROP_ENUMERATE | JSPROP_PROPOP_ACCESSORS,
JSPROP_ENUMERATE,
JS_STUBGETTER, JS_STUBSETTER)) {
return false;
}
@ -470,7 +470,7 @@ CreateObjectIn(JSContext *cx, HandleValue vobj, CreateObjectInOptions &options,
if (define) {
if (!JS_DefinePropertyById(cx, scope, options.defineAs, obj,
JSPROP_ENUMERATE | JSPROP_PROPOP_ACCESSORS,
JSPROP_ENUMERATE,
JS_STUBGETTER, JS_STUBSETTER))
return false;
}

View File

@ -619,7 +619,7 @@ JSXrayTraits::defineProperty(JSContext *cx, HandleObject wrapper, HandleId id,
JSAutoCompartment ac(cx, target);
if (!JS_WrapPropertyDescriptor(cx, desc) ||
!JS_DefinePropertyById(cx, target, id, desc.value(),
desc.attributes() | JSPROP_PROPOP_ACCESSORS,
desc.attributes(),
JS_STUBGETTER, JS_STUBSETTER))
{
return false;