In Proxy get(own)PropertyDescriptor return undefined if property doesn't exist (bug 582967, r=brendan/jorendorff).

This commit is contained in:
Andreas Gal 2011-01-26 10:43:10 -08:00
parent 4dcb309477
commit 53bf5744ef

View File

@ -377,6 +377,13 @@ ParsePropertyDescriptorObject(JSContext *cx, JSObject *obj, jsid id, const Value
return true;
}
static bool
IndicatePropertyNotFound(JSContext *cx, PropertyDescriptor *desc)
{
desc->obj = NULL;
return true;
}
static bool
MakePropertyDescriptorObject(JSContext *cx, jsid id, PropertyDescriptor *desc, Value *vp)
{
@ -496,8 +503,9 @@ JSScriptedProxyHandler::getPropertyDescriptor(JSContext *cx, JSObject *proxy, js
AutoValueRooter tvr(cx);
return GetFundamentalTrap(cx, handler, ATOM(getPropertyDescriptor), tvr.addr()) &&
Trap1(cx, handler, tvr.value(), id, tvr.addr()) &&
ReturnedValueMustNotBePrimitive(cx, proxy, ATOM(getPropertyDescriptor), tvr.value()) &&
ParsePropertyDescriptorObject(cx, proxy, id, tvr.value(), desc);
((tvr.value().isUndefined() && IndicatePropertyNotFound(cx, desc)) ||
ReturnedValueMustNotBePrimitive(cx, proxy, ATOM(getPropertyDescriptor), tvr.value()) &&
ParsePropertyDescriptorObject(cx, proxy, id, tvr.value(), desc));
}
bool
@ -508,8 +516,9 @@ JSScriptedProxyHandler::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy,
AutoValueRooter tvr(cx);
return GetFundamentalTrap(cx, handler, ATOM(getOwnPropertyDescriptor), tvr.addr()) &&
Trap1(cx, handler, tvr.value(), id, tvr.addr()) &&
ReturnedValueMustNotBePrimitive(cx, proxy, ATOM(getPropertyDescriptor), tvr.value()) &&
ParsePropertyDescriptorObject(cx, proxy, id, tvr.value(), desc);
((tvr.value().isUndefined() && IndicatePropertyNotFound(cx, desc)) ||
ReturnedValueMustNotBePrimitive(cx, proxy, ATOM(getPropertyDescriptor), tvr.value()) &&
ParsePropertyDescriptorObject(cx, proxy, id, tvr.value(), desc));
}
bool