bug 580128 - Propagate whether we're getting or setting to getPropertyDescriptor. r=gal

This commit is contained in:
Blake Kaplan 2010-09-17 14:54:41 -07:00
Родитель f746556e55
Коммит f01ca483f0
9 изменённых файлов: 59 добавлений и 54 удалений

Просмотреть файл

@ -3593,8 +3593,8 @@ GetPropertyDescriptorById(JSContext *cx, JSObject *obj, jsid id, uintN flags,
if (obj2->isProxy()) {
JSAutoResolveFlags rf(cx, flags);
return own
? JSProxy::getOwnPropertyDescriptor(cx, obj2, id, desc)
: JSProxy::getPropertyDescriptor(cx, obj2, id, desc);
? JSProxy::getOwnPropertyDescriptor(cx, obj2, id, false, desc)
: JSProxy::getPropertyDescriptor(cx, obj2, id, false, desc);
}
if (!obj2->getAttributes(cx, id, &desc->attrs))
return false;

Просмотреть файл

@ -1676,7 +1676,7 @@ JSBool
js_GetOwnPropertyDescriptor(JSContext *cx, JSObject *obj, jsid id, Value *vp)
{
if (obj->isProxy()) {
if (!JSProxy::getOwnPropertyDescriptor(cx, obj, id, vp))
if (!JSProxy::getOwnPropertyDescriptor(cx, obj, id, false, vp))
return false;
}

Просмотреть файл

@ -93,7 +93,7 @@ JSProxyHandler::has(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
{
JS_ASSERT(OperationInProgress(cx, proxy));
AutoPropertyDescriptorRooter desc(cx);
if (!getPropertyDescriptor(cx, proxy, id, &desc))
if (!getPropertyDescriptor(cx, proxy, id, false, &desc))
return false;
*bp = !!desc.obj;
return true;
@ -104,7 +104,7 @@ JSProxyHandler::hasOwn(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
{
JS_ASSERT(OperationInProgress(cx, proxy));
AutoPropertyDescriptorRooter desc(cx);
if (!getOwnPropertyDescriptor(cx, proxy, id, &desc))
if (!getOwnPropertyDescriptor(cx, proxy, id, false, &desc))
return false;
*bp = !!desc.obj;
return true;
@ -115,7 +115,7 @@ JSProxyHandler::get(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id,
{
JS_ASSERT(OperationInProgress(cx, proxy));
AutoPropertyDescriptorRooter desc(cx);
if (!getPropertyDescriptor(cx, proxy, id, &desc))
if (!getPropertyDescriptor(cx, proxy, id, false, &desc))
return false;
if (!desc.obj) {
vp->setUndefined();
@ -142,7 +142,7 @@ JSProxyHandler::set(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id,
{
JS_ASSERT(OperationInProgress(cx, proxy));
AutoPropertyDescriptorRooter desc(cx);
if (!getOwnPropertyDescriptor(cx, proxy, id, &desc))
if (!getOwnPropertyDescriptor(cx, proxy, id, true, &desc))
return false;
/* The control-flow here differs from ::get() because of the fall-through case below. */
if (desc.obj) {
@ -160,7 +160,7 @@ JSProxyHandler::set(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id,
desc.value = *vp;
return defineProperty(cx, proxy, id, &desc);
}
if (!getPropertyDescriptor(cx, proxy, id, &desc))
if (!getPropertyDescriptor(cx, proxy, id, true, &desc))
return false;
if (desc.obj) {
if (desc.setter && ((desc.attrs & JSPROP_SETTER) || desc.setter != PropertyStub)) {
@ -200,7 +200,7 @@ JSProxyHandler::enumerateOwn(JSContext *cx, JSObject *proxy, AutoIdVector &props
for (size_t j = 0, len = props.length(); j < len; j++) {
JS_ASSERT(i <= j);
jsid id = props[j];
if (!getOwnPropertyDescriptor(cx, proxy, id, &desc))
if (!getOwnPropertyDescriptor(cx, proxy, id, false, &desc))
return false;
if (desc.obj && (desc.attrs & JSPROP_ENUMERATE))
props[i++] = id;
@ -435,9 +435,9 @@ class JSScriptedProxyHandler : public JSProxyHandler {
virtual ~JSScriptedProxyHandler();
/* ES5 Harmony fundamental proxy traps. */
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id,
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc);
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id,
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc);
virtual bool defineProperty(JSContext *cx, JSObject *proxy, jsid id,
PropertyDescriptor *desc);
@ -487,7 +487,7 @@ GetProxyHandlerObject(JSContext *cx, JSObject *proxy)
}
bool
JSScriptedProxyHandler::getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id,
JSScriptedProxyHandler::getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc)
{
JSObject *handler = GetProxyHandlerObject(cx, proxy);
@ -499,7 +499,7 @@ JSScriptedProxyHandler::getPropertyDescriptor(JSContext *cx, JSObject *proxy, js
}
bool
JSScriptedProxyHandler::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id,
JSScriptedProxyHandler::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc)
{
JSObject *handler = GetProxyHandlerObject(cx, proxy);
@ -665,35 +665,36 @@ class AutoPendingProxyOperation {
};
bool
JSProxy::getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, PropertyDescriptor *desc)
JSProxy::getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc)
{
AutoPendingProxyOperation pending(cx, proxy);
return proxy->getProxyHandler()->getPropertyDescriptor(cx, proxy, id, desc);
return proxy->getProxyHandler()->getPropertyDescriptor(cx, proxy, id, set, desc);
}
bool
JSProxy::getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, Value *vp)
JSProxy::getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set, Value *vp)
{
AutoPendingProxyOperation pending(cx, proxy);
AutoPropertyDescriptorRooter desc(cx);
return JSProxy::getPropertyDescriptor(cx, proxy, id, &desc) &&
return JSProxy::getPropertyDescriptor(cx, proxy, id, set, &desc) &&
MakePropertyDescriptorObject(cx, id, &desc, vp);
}
bool
JSProxy::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id,
JSProxy::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc)
{
AutoPendingProxyOperation pending(cx, proxy);
return proxy->getProxyHandler()->getOwnPropertyDescriptor(cx, proxy, id, desc);
return proxy->getProxyHandler()->getOwnPropertyDescriptor(cx, proxy, id, set, desc);
}
bool
JSProxy::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, Value *vp)
JSProxy::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set, Value *vp)
{
AutoPendingProxyOperation pending(cx, proxy);
AutoPropertyDescriptorRooter desc(cx);
return JSProxy::getOwnPropertyDescriptor(cx, proxy, id, &desc) &&
return JSProxy::getOwnPropertyDescriptor(cx, proxy, id, set, &desc) &&
MakePropertyDescriptorObject(cx, id, &desc, vp);
}
@ -866,7 +867,7 @@ static JSBool
proxy_GetAttributes(JSContext *cx, JSObject *obj, jsid id, uintN *attrsp)
{
AutoPropertyDescriptorRooter desc(cx);
if (!JSProxy::getOwnPropertyDescriptor(cx, obj, id, &desc))
if (!JSProxy::getOwnPropertyDescriptor(cx, obj, id, false, &desc))
return false;
*attrsp = desc.attrs;
return true;
@ -877,7 +878,7 @@ proxy_SetAttributes(JSContext *cx, JSObject *obj, jsid id, uintN *attrsp)
{
/* Lookup the current property descriptor so we have setter/getter/value. */
AutoPropertyDescriptorRooter desc(cx);
if (!JSProxy::getOwnPropertyDescriptor(cx, obj, id, &desc))
if (!JSProxy::getOwnPropertyDescriptor(cx, obj, id, true, &desc))
return false;
desc.attrs = (*attrsp & (~JSPROP_SHORTID));
return JSProxy::defineProperty(cx, obj, id, &desc);

Просмотреть файл

@ -56,9 +56,9 @@ class JSProxyHandler {
virtual ~JSProxyHandler();
/* ES5 Harmony fundamental proxy traps. */
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id,
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc) = 0;
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id,
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc) = 0;
virtual bool defineProperty(JSContext *cx, JSObject *proxy, jsid id,
PropertyDescriptor *desc) = 0;
@ -97,12 +97,13 @@ class JSProxyHandler {
class JSProxy {
public:
/* ES5 Harmony fundamental proxy traps. */
static bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id,
static bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc);
static bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, Value *vp);
static bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id,
static bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set, Value *vp);
static bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc);
static bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, Value *vp);
static bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
Value *vp);
static bool defineProperty(JSContext *cx, JSObject *proxy, jsid id, PropertyDescriptor *desc);
static bool defineProperty(JSContext *cx, JSObject *proxy, jsid id, const Value &v);
static bool getOwnPropertyNames(JSContext *cx, JSObject *proxy, js::AutoIdVector &props);

Просмотреть файл

@ -101,10 +101,10 @@ JSWrapper::~JSWrapper()
bool
JSWrapper::getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
PropertyDescriptor *desc)
bool set, PropertyDescriptor *desc)
{
GET(JS_GetPropertyDescriptorById(cx, wrappedObject(wrapper), id, JSRESOLVE_QUALIFIED,
Jsvalify(desc)));
CHECKED(JS_GetPropertyDescriptorById(cx, wrappedObject(wrapper), id, JSRESOLVE_QUALIFIED,
Jsvalify(desc)), set ? SET : GET);
}
static bool
@ -118,11 +118,11 @@ GetOwnPropertyDescriptor(JSContext *cx, JSObject *obj, jsid id, uintN flags, JSP
}
bool
JSWrapper::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
JSWrapper::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, bool set,
PropertyDescriptor *desc)
{
GET(GetOwnPropertyDescriptor(cx, wrappedObject(wrapper), id, JSRESOLVE_QUALIFIED,
Jsvalify(desc)));
CHECKED(GetOwnPropertyDescriptor(cx, wrappedObject(wrapper), id, JSRESOLVE_QUALIFIED,
Jsvalify(desc)), set ? SET : GET);
}
bool
@ -373,20 +373,22 @@ JSCrossCompartmentWrapper::isCrossCompartmentWrapper(JSObject *obj)
#define NOTHING (true)
bool
JSCrossCompartmentWrapper::getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, PropertyDescriptor *desc)
JSCrossCompartmentWrapper::getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, PropertyDescriptor *desc)
{
PIERCE(cx, wrapper, GET,
PIERCE(cx, wrapper, set ? SET : GET,
call.destination->wrapId(cx, &id),
JSWrapper::getPropertyDescriptor(cx, wrapper, id, desc),
JSWrapper::getPropertyDescriptor(cx, wrapper, id, set, desc),
call.origin->wrap(cx, desc));
}
bool
JSCrossCompartmentWrapper::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, PropertyDescriptor *desc)
JSCrossCompartmentWrapper::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, PropertyDescriptor *desc)
{
PIERCE(cx, wrapper, GET,
PIERCE(cx, wrapper, set ? SET : GET,
call.destination->wrapId(cx, &id),
JSWrapper::getOwnPropertyDescriptor(cx, wrapper, id, desc),
JSWrapper::getOwnPropertyDescriptor(cx, wrapper, id, set, desc),
call.origin->wrap(cx, desc));
}

Просмотреть файл

@ -61,9 +61,9 @@ class JSWrapper : public js::JSProxyHandler {
/* ES5 Harmony fundamental wrapper traps. */
virtual JS_FRIEND_API(bool) getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
js::PropertyDescriptor *desc);
bool set, js::PropertyDescriptor *desc);
virtual JS_FRIEND_API(bool) getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
js::PropertyDescriptor *desc);
bool set, js::PropertyDescriptor *desc);
virtual JS_FRIEND_API(bool) defineProperty(JSContext *cx, JSObject *wrapper, jsid id,
js::PropertyDescriptor *desc);
virtual JS_FRIEND_API(bool) getOwnPropertyNames(JSContext *cx, JSObject *wrapper,
@ -115,9 +115,9 @@ class JS_FRIEND_API(JSCrossCompartmentWrapper) : public JSWrapper {
virtual ~JSCrossCompartmentWrapper();
/* ES5 Harmony fundamental wrapper traps. */
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, bool set,
js::PropertyDescriptor *desc);
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, bool set,
js::PropertyDescriptor *desc);
virtual bool defineProperty(JSContext *cx, JSObject *wrapper, jsid id,
js::PropertyDescriptor *desc);

Просмотреть файл

@ -72,11 +72,10 @@ Filter(JSContext *cx, JSObject *wrapper, AutoIdVector &props)
for (size_t n = 0; n < props.length(); ++n) {
jsid id = props[n];
Permission perm;
if (perm != PermitObjectAccess && !Policy::check(cx, wrapper, id, JSWrapper::GET, perm))
if (!Policy::check(cx, wrapper, id, JSWrapper::GET, perm))
return false; // Error
if (perm != DenyAccess) {
if (perm != DenyAccess)
props[w++] = id;
}
}
props.resize(w);
return true;

Просмотреть файл

@ -324,7 +324,8 @@ XrayWrapper<Base>::set(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsi
template <typename Base>
bool
XrayWrapper<Base>::getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, PropertyDescriptor *desc_in)
XrayWrapper<Base>::getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, PropertyDescriptor *desc_in)
{
JSPropertyDescriptor *desc = Jsvalify(desc_in);
@ -337,7 +338,7 @@ XrayWrapper<Base>::getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid
desc->value = JSVAL_VOID;
return true;
}
if (!Base::getPropertyDescriptor(cx, wrapper, id, desc_in)) {
if (!Base::getPropertyDescriptor(cx, wrapper, id, set, desc_in)) {
return false;
}
if (desc->obj)
@ -347,9 +348,10 @@ XrayWrapper<Base>::getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid
template <typename Base>
bool
XrayWrapper<Base>::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, PropertyDescriptor *desc)
XrayWrapper<Base>::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, PropertyDescriptor *desc)
{
return getPropertyDescriptor(cx, wrapper, id, desc);
return getPropertyDescriptor(cx, wrapper, id, set, desc);
}
template <typename Base>

Просмотреть файл

@ -58,9 +58,9 @@ class XrayWrapper : public Base {
virtual bool set(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id,
js::Value *vp);
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
js::PropertyDescriptor *desc);
bool set, js::PropertyDescriptor *desc);
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
js::PropertyDescriptor *desc);
bool set, js::PropertyDescriptor *desc);
virtual bool has(JSContext *cx, JSObject *wrapper, jsid id, bool *bp);
virtual bool hasOwn(JSContext *cx, JSObject *wrapper, jsid id, bool *bp);