зеркало из https://github.com/mozilla/pjs.git
bug 580128 - Propagate whether we're getting or setting to getPropertyDescriptor. r=gal
This commit is contained in:
Родитель
f746556e55
Коммит
f01ca483f0
|
@ -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);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче