Bug 1091900 - Make GetIterator and others take an object as outparam. r=efaust

This commit is contained in:
Tom Schuster 2014-11-19 01:44:03 +01:00
parent fc0765b663
commit 127a42b89f
21 changed files with 96 additions and 83 deletions

View File

@ -652,7 +652,7 @@ public:
JS::AutoIdVector &props) const MOZ_OVERRIDE;
virtual bool iterate(JSContext *cx, JS::Handle<JSObject*> proxy,
unsigned flags,
JS::MutableHandle<JS::Value> vp) const MOZ_OVERRIDE;
JS::MutableHandle<JSObject*> objp) const MOZ_OVERRIDE;
virtual const char *className(JSContext *cx,
JS::Handle<JSObject*> wrapper) const MOZ_OVERRIDE;
@ -943,14 +943,13 @@ nsOuterWindowProxy::getEnumerablePropertyKeys(JSContext *cx, JS::Handle<JSObject
return js::AppendUnique(cx, props, innerProps);
}
bool
nsOuterWindowProxy::iterate(JSContext *cx, JS::Handle<JSObject*> proxy,
unsigned flags, JS::MutableHandle<JS::Value> vp) const
unsigned flags, JS::MutableHandle<JSObject*> objp) const
{
// BaseProxyHandler::iterate seems to do what we want here: fall
// back on the property names returned from keys() and enumerate().
return js::BaseProxyHandler::iterate(cx, proxy, flags, vp);
return js::BaseProxyHandler::iterate(cx, proxy, flags, objp);
}
bool

View File

@ -407,18 +407,19 @@ js::GetPropertyKeys(JSContext *cx, HandleObject obj, unsigned flags, AutoIdVecto
size_t sCustomIteratorCount = 0;
static inline bool
GetCustomIterator(JSContext *cx, HandleObject obj, unsigned flags, MutableHandleValue vp)
GetCustomIterator(JSContext *cx, HandleObject obj, unsigned flags, MutableHandleObject objp)
{
JS_CHECK_RECURSION(cx, return false);
RootedValue rval(cx);
/* Check whether we have a valid __iterator__ method. */
HandlePropertyName name = cx->names().iteratorIntrinsic;
if (!JSObject::getProperty(cx, obj, obj, name, vp))
if (!JSObject::getProperty(cx, obj, obj, name, &rval))
return false;
/* If there is no custom __iterator__ method, we are done here. */
if (!vp.isObject()) {
vp.setUndefined();
if (!rval.isObject()) {
objp.set(nullptr);
return true;
}
@ -427,9 +428,9 @@ GetCustomIterator(JSContext *cx, HandleObject obj, unsigned flags, MutableHandle
/* Otherwise call it and return that object. */
Value arg = BooleanValue((flags & JSITER_FOREACH) == 0);
if (!Invoke(cx, ObjectValue(*obj), vp, 1, &arg, vp))
if (!Invoke(cx, ObjectValue(*obj), rval, 1, &arg, &rval))
return false;
if (vp.isPrimitive()) {
if (rval.isPrimitive()) {
/*
* We are always coming from js::ValueToIterator, and we are no longer on
* trace, so the object we are iterating over is on top of the stack (-1).
@ -442,6 +443,7 @@ GetCustomIterator(JSContext *cx, HandleObject obj, unsigned flags, MutableHandle
-1, val, js::NullPtr(), bytes.ptr());
return false;
}
objp.set(&rval.toObject());
return true;
}
@ -562,7 +564,7 @@ RegisterEnumerator(JSContext *cx, PropertyIteratorObject *iterobj, NativeIterato
static inline bool
VectorToKeyIterator(JSContext *cx, HandleObject obj, unsigned flags, AutoIdVector &keys,
uint32_t slength, uint32_t key, MutableHandleValue vp)
uint32_t slength, uint32_t key, MutableHandleObject objp)
{
MOZ_ASSERT(!(flags & JSITER_FOREACH));
@ -597,7 +599,7 @@ VectorToKeyIterator(JSContext *cx, HandleObject obj, unsigned flags, AutoIdVecto
}
iterobj->setNativeIterator(ni);
vp.setObject(*iterobj);
objp.set(iterobj);
RegisterEnumerator(cx, iterobj, ni);
return true;
@ -605,7 +607,7 @@ VectorToKeyIterator(JSContext *cx, HandleObject obj, unsigned flags, AutoIdVecto
static bool
VectorToValueIterator(JSContext *cx, HandleObject obj, unsigned flags, AutoIdVector &keys,
MutableHandleValue vp)
MutableHandleObject objp)
{
MOZ_ASSERT(flags & JSITER_FOREACH);
@ -623,7 +625,7 @@ VectorToValueIterator(JSContext *cx, HandleObject obj, unsigned flags, AutoIdVec
ni->init(obj, iterobj, flags, 0, 0);
iterobj->setNativeIterator(ni);
vp.setObject(*iterobj);
objp.set(iterobj);
RegisterEnumerator(cx, iterobj, ni);
return true;
@ -631,17 +633,17 @@ VectorToValueIterator(JSContext *cx, HandleObject obj, unsigned flags, AutoIdVec
bool
js::EnumeratedIdVectorToIterator(JSContext *cx, HandleObject obj, unsigned flags,
AutoIdVector &props, MutableHandleValue vp)
AutoIdVector &props, MutableHandleObject objp)
{
if (!(flags & JSITER_FOREACH))
return VectorToKeyIterator(cx, obj, flags, props, 0, 0, vp);
return VectorToKeyIterator(cx, obj, flags, props, 0, 0, objp);
return VectorToValueIterator(cx, obj, flags, props, vp);
return VectorToValueIterator(cx, obj, flags, props, objp);
}
// Mainly used for .. in over null/undefined
bool
js::NewEmptyPropertyIterator(JSContext *cx, unsigned flags, MutableHandleValue vp)
js::NewEmptyPropertyIterator(JSContext *cx, unsigned flags, MutableHandleObject objp)
{
Rooted<PropertyIteratorObject*> iterobj(cx, NewPropertyIteratorObject(cx, flags));
if (!iterobj)
@ -654,7 +656,7 @@ js::NewEmptyPropertyIterator(JSContext *cx, unsigned flags, MutableHandleValue v
ni->init(nullptr, iterobj, flags, 0, 0);
iterobj->setNativeIterator(ni);
vp.setObject(*iterobj);
objp.set(iterobj);
RegisterEnumerator(cx, iterobj, ni);
return true;
@ -669,10 +671,10 @@ UpdateNativeIterator(NativeIterator *ni, JSObject *obj)
}
bool
js::GetIterator(JSContext *cx, HandleObject obj, unsigned flags, MutableHandleValue vp)
js::GetIterator(JSContext *cx, HandleObject obj, unsigned flags, MutableHandleObject objp)
{
if (obj->is<PropertyIteratorObject>() || obj->is<LegacyGeneratorObject>()) {
vp.setObject(*obj);
objp.set(obj);
return true;
}
@ -699,7 +701,7 @@ js::GetIterator(JSContext *cx, HandleObject obj, unsigned flags, MutableHandleVa
proto->lastProperty() == lastni->shapes_array[1] &&
!proto->getProto())
{
vp.setObject(*last);
objp.set(last);
UpdateNativeIterator(lastni, obj);
RegisterEnumerator(cx, last, lastni);
return true;
@ -742,7 +744,7 @@ js::GetIterator(JSContext *cx, HandleObject obj, unsigned flags, MutableHandleVa
ni->shapes_key == key &&
ni->shapes_length == shapes.length() &&
Compare(ni->shapes_array, shapes.begin(), ni->shapes_length)) {
vp.setObject(*iterobj);
objp.set(iterobj);
UpdateNativeIterator(ni, obj);
RegisterEnumerator(cx, iterobj, ni);
@ -755,11 +757,11 @@ js::GetIterator(JSContext *cx, HandleObject obj, unsigned flags, MutableHandleVa
miss:
if (obj->is<ProxyObject>())
return Proxy::iterate(cx, obj, flags, vp);
return Proxy::iterate(cx, obj, flags, objp);
if (!GetCustomIterator(cx, obj, flags, vp))
if (!GetCustomIterator(cx, obj, flags, objp))
return false;
if (!vp.isUndefined())
if (objp)
return true;
AutoIdVector keys(cx);
@ -768,16 +770,16 @@ js::GetIterator(JSContext *cx, HandleObject obj, unsigned flags, MutableHandleVa
if (!Snapshot(cx, obj, flags, &keys))
return false;
if (!VectorToValueIterator(cx, obj, flags, keys, vp))
if (!VectorToValueIterator(cx, obj, flags, keys, objp))
return false;
} else {
if (!Snapshot(cx, obj, flags, &keys))
return false;
if (!VectorToKeyIterator(cx, obj, flags, keys, shapes.length(), key, vp))
if (!VectorToKeyIterator(cx, obj, flags, keys, shapes.length(), key, objp))
return false;
}
PropertyIteratorObject *iterobj = &vp.toObject().as<PropertyIteratorObject>();
PropertyIteratorObject *iterobj = &objp->as<PropertyIteratorObject>();
/* Cache the iterator object if possible. */
if (shapes.length())
@ -791,10 +793,10 @@ js::GetIterator(JSContext *cx, HandleObject obj, unsigned flags, MutableHandleVa
JSObject *
js::GetIteratorObject(JSContext *cx, HandleObject obj, uint32_t flags)
{
RootedValue value(cx);
if (!GetIterator(cx, obj, flags, &value))
RootedObject iterator(cx);
if (!GetIterator(cx, obj, flags, &iterator))
return nullptr;
return &value.toObject();
return iterator;
}
JSObject *
@ -1015,14 +1017,22 @@ js::ValueToIterator(JSContext *cx, unsigned flags, MutableHandleValue vp)
* that |for (var p in <null or undefined>) <loop>;| never executes
* <loop>, per ES5 12.6.4.
*/
return NewEmptyPropertyIterator(cx, flags, vp);
RootedObject iter(cx);
if (!NewEmptyPropertyIterator(cx, flags, &iter))
return false;
vp.setObject(*iter);
return true;
} else {
obj = ToObject(cx, vp);
if (!obj)
return false;
}
return GetIterator(cx, obj, flags, vp);
RootedObject iter(cx);
if (!GetIterator(cx, obj, flags, &iter))
return false;
vp.setObject(*iter);
return true;
}
bool

View File

@ -149,7 +149,7 @@ bool
VectorToIdArray(JSContext *cx, AutoIdVector &props, JSIdArray **idap);
bool
GetIterator(JSContext *cx, HandleObject obj, unsigned flags, MutableHandleValue vp);
GetIterator(JSContext *cx, HandleObject obj, unsigned flags, MutableHandleObject objp);
JSObject *
GetIteratorObject(JSContext *cx, HandleObject obj, unsigned flags);
@ -160,10 +160,10 @@ GetIteratorObject(JSContext *cx, HandleObject obj, unsigned flags);
*/
bool
EnumeratedIdVectorToIterator(JSContext *cx, HandleObject obj, unsigned flags, AutoIdVector &props,
MutableHandleValue vp);
MutableHandleObject objp);
bool
NewEmptyPropertyIterator(JSContext *cx, unsigned flags, MutableHandleValue vp);
NewEmptyPropertyIterator(JSContext *cx, unsigned flags, MutableHandleObject objp);
/*
* Convert the value stored in *vp to its iteration object. The flags should

View File

@ -308,7 +308,7 @@ class JS_FRIEND_API(BaseProxyHandler)
virtual bool getEnumerablePropertyKeys(JSContext *cx, HandleObject proxy,
AutoIdVector &props) const = 0;
virtual bool iterate(JSContext *cx, HandleObject proxy, unsigned flags,
MutableHandleValue vp) const;
MutableHandleObject objp) const;
virtual bool nativeCall(JSContext *cx, IsAcceptableThis test, NativeImpl impl, CallArgs args) const;
virtual bool hasInstance(JSContext *cx, HandleObject proxy, MutableHandleValue v, bool *bp) const;
virtual bool objectClassIs(HandleObject obj, ESClassValue classValue, JSContext *cx) const;
@ -395,7 +395,7 @@ class JS_PUBLIC_API(DirectProxyHandler) : public BaseProxyHandler
virtual bool getEnumerablePropertyKeys(JSContext *cx, HandleObject proxy,
AutoIdVector &props) const MOZ_OVERRIDE;
virtual bool iterate(JSContext *cx, HandleObject proxy, unsigned flags,
MutableHandleValue vp) const MOZ_OVERRIDE;
MutableHandleObject objp) const MOZ_OVERRIDE;
virtual bool nativeCall(JSContext *cx, IsAcceptableThis test, NativeImpl impl,
CallArgs args) const MOZ_OVERRIDE;
virtual bool hasInstance(JSContext *cx, HandleObject proxy, MutableHandleValue v,

View File

@ -146,7 +146,7 @@ class JS_FRIEND_API(CrossCompartmentWrapper) : public Wrapper
virtual bool getEnumerablePropertyKeys(JSContext *cx, HandleObject wrapper,
AutoIdVector &props) const MOZ_OVERRIDE;
virtual bool iterate(JSContext *cx, HandleObject wrapper, unsigned flags,
MutableHandleValue vp) const MOZ_OVERRIDE;
MutableHandleObject objp) const MOZ_OVERRIDE;
virtual bool nativeCall(JSContext *cx, IsAcceptableThis test, NativeImpl impl,
CallArgs args) const MOZ_OVERRIDE;
virtual bool hasInstance(JSContext *cx, HandleObject wrapper, MutableHandleValue v,

View File

@ -198,7 +198,7 @@ BaseProxyHandler::getOwnEnumerablePropertyKeys(JSContext *cx, HandleObject proxy
bool
BaseProxyHandler::iterate(JSContext *cx, HandleObject proxy, unsigned flags,
MutableHandleValue vp) const
MutableHandleObject objp) const
{
assertEnteredPolicy(cx, proxy, JSID_VOID, ENUMERATE);
@ -209,7 +209,7 @@ BaseProxyHandler::iterate(JSContext *cx, HandleObject proxy, unsigned flags,
return false;
}
return EnumeratedIdVectorToIterator(cx, proxy, flags, props, vp);
return EnumeratedIdVectorToIterator(cx, proxy, flags, props, objp);
}
bool

View File

@ -203,11 +203,9 @@ CrossCompartmentWrapper::getEnumerablePropertyKeys(JSContext *cx, HandleObject w
* allows fast iteration over objects across a compartment boundary.
*/
static bool
CanReify(HandleValue vp)
CanReify(HandleObject obj)
{
JSObject *obj;
return vp.isObject() &&
(obj = &vp.toObject())->is<PropertyIteratorObject>() &&
return obj->is<PropertyIteratorObject>() &&
(obj->as<PropertyIteratorObject>().getNativeIterator()->flags & JSITER_ENUMERATE);
}
@ -225,9 +223,9 @@ struct AutoCloseIterator
};
static bool
Reify(JSContext *cx, JSCompartment *origin, MutableHandleValue vp)
Reify(JSContext *cx, JSCompartment *origin, MutableHandleObject objp)
{
Rooted<PropertyIteratorObject*> iterObj(cx, &vp.toObject().as<PropertyIteratorObject>());
Rooted<PropertyIteratorObject*> iterObj(cx, &objp->as<PropertyIteratorObject>());
NativeIterator *ni = iterObj->getNativeIterator();
AutoCloseIterator close(cx, iterObj);
@ -260,22 +258,22 @@ Reify(JSContext *cx, JSCompartment *origin, MutableHandleValue vp)
if (!CloseIterator(cx, iterObj))
return false;
return EnumeratedIdVectorToIterator(cx, obj, ni->flags, keys, vp);
return EnumeratedIdVectorToIterator(cx, obj, ni->flags, keys, objp);
}
bool
CrossCompartmentWrapper::iterate(JSContext *cx, HandleObject wrapper, unsigned flags,
MutableHandleValue vp) const
MutableHandleObject objp) const
{
{
AutoCompartment call(cx, wrappedObject(wrapper));
if (!Wrapper::iterate(cx, wrapper, flags, vp))
if (!Wrapper::iterate(cx, wrapper, flags, objp))
return false;
}
if (CanReify(vp))
return Reify(cx, cx->compartment(), vp);
return cx->compartment()->wrap(cx, vp);
if (CanReify(objp))
return Reify(cx, cx->compartment(), objp);
return cx->compartment()->wrap(cx, objp);
}
bool

View File

@ -254,12 +254,12 @@ DirectProxyHandler::getEnumerablePropertyKeys(JSContext *cx, HandleObject proxy,
bool
DirectProxyHandler::iterate(JSContext *cx, HandleObject proxy, unsigned flags,
MutableHandleValue vp) const
MutableHandleObject objp) const
{
assertEnteredPolicy(cx, proxy, JSID_VOID, ENUMERATE);
MOZ_ASSERT(!hasPrototype()); // Should never be called if there's a prototype.
RootedObject target(cx, proxy->as<ProxyObject>().target());
return GetIterator(cx, target, flags, vp);
return GetIterator(cx, target, flags, objp);
}
bool

View File

@ -385,11 +385,11 @@ Proxy::getEnumerablePropertyKeys(JSContext *cx, HandleObject proxy, AutoIdVector
}
bool
Proxy::iterate(JSContext *cx, HandleObject proxy, unsigned flags, MutableHandleValue vp)
Proxy::iterate(JSContext *cx, HandleObject proxy, unsigned flags, MutableHandleObject objp)
{
JS_CHECK_RECURSION(cx, return false);
const BaseProxyHandler *handler = proxy->as<ProxyObject>().handler();
vp.setUndefined(); // default result if we refuse to perform this action
objp.set(nullptr); // default result if we refuse to perform this action
if (!handler->hasPrototype()) {
AutoEnterPolicy policy(cx, handler, proxy, JSID_VOIDHANDLE,
BaseProxyHandler::ENUMERATE, true);
@ -397,9 +397,9 @@ Proxy::iterate(JSContext *cx, HandleObject proxy, unsigned flags, MutableHandleV
// to hand a valid (empty) iterator object to the caller.
if (!policy.allowed()) {
return policy.returnValue() &&
NewEmptyPropertyIterator(cx, flags, vp);
NewEmptyPropertyIterator(cx, flags, objp);
}
return handler->iterate(cx, proxy, flags, vp);
return handler->iterate(cx, proxy, flags, objp);
}
AutoIdVector props(cx);
// The other Proxy::foo methods do the prototype-aware work for us here.
@ -408,7 +408,7 @@ Proxy::iterate(JSContext *cx, HandleObject proxy, unsigned flags, MutableHandleV
: !Proxy::getEnumerablePropertyKeys(cx, proxy, props)) {
return false;
}
return EnumeratedIdVectorToIterator(cx, proxy, flags, props, vp);
return EnumeratedIdVectorToIterator(cx, proxy, flags, props, objp);
}
bool

View File

@ -56,7 +56,7 @@ class Proxy
static bool getOwnEnumerablePropertyKeys(JSContext *cx, HandleObject proxy,
AutoIdVector &props);
static bool getEnumerablePropertyKeys(JSContext *cx, HandleObject proxy, AutoIdVector &props);
static bool iterate(JSContext *cx, HandleObject proxy, unsigned flags, MutableHandleValue vp);
static bool iterate(JSContext *cx, HandleObject proxy, unsigned flags, MutableHandleObject objp);
static bool nativeCall(JSContext *cx, IsAcceptableThis test, NativeImpl impl, CallArgs args);
static bool hasInstance(JSContext *cx, HandleObject proxy, MutableHandleValue v, bool *bp);
static bool objectClassIs(HandleObject obj, ESClassValue classValue, JSContext *cx);

View File

@ -1020,10 +1020,10 @@ ScriptedDirectProxyHandler::set(JSContext *cx, HandleObject proxy, HandleObject
bool
ScriptedDirectProxyHandler::iterate(JSContext *cx, HandleObject proxy, unsigned flags,
MutableHandleValue vp) const
MutableHandleObject objp) const
{
// FIXME: Provide a proper implementation for this trap, see bug 787004
return DirectProxyHandler::iterate(cx, proxy, flags, vp);
return DirectProxyHandler::iterate(cx, proxy, flags, objp);
}
// ES6 (22 May, 2014) 9.5.13 Proxy.[[Call]]

View File

@ -65,7 +65,7 @@ class ScriptedDirectProxyHandler : public DirectProxyHandler {
virtual bool getEnumerablePropertyKeys(JSContext *cx, HandleObject proxy,
AutoIdVector &props) const MOZ_OVERRIDE;
virtual bool iterate(JSContext *cx, HandleObject proxy, unsigned flags,
MutableHandleValue vp) const MOZ_OVERRIDE;
MutableHandleObject objp) const MOZ_OVERRIDE;
virtual bool isCallable(JSObject *obj) const MOZ_OVERRIDE;
virtual bool isConstructor(JSObject *obj) const MOZ_OVERRIDE {

View File

@ -318,16 +318,22 @@ ScriptedIndirectProxyHandler::getEnumerablePropertyKeys(JSContext *cx, HandleObj
bool
ScriptedIndirectProxyHandler::iterate(JSContext *cx, HandleObject proxy, unsigned flags,
MutableHandleValue vp) const
MutableHandleObject objp) const
{
RootedObject handler(cx, GetIndirectProxyHandlerObject(proxy));
RootedValue value(cx);
if (!GetDerivedTrap(cx, handler, cx->names().iterate, &value))
return false;
if (!IsCallable(value))
return BaseProxyHandler::iterate(cx, proxy, flags, vp);
return Trap(cx, handler, value, 0, nullptr, vp) &&
ReturnedValueMustNotBePrimitive(cx, proxy, cx->names().iterate, vp);
return BaseProxyHandler::iterate(cx, proxy, flags, objp);
RootedValue rval(cx);
if (!Trap(cx, handler, value, 0, nullptr, &rval))
return false;
if (!ReturnedValueMustNotBePrimitive(cx, proxy, cx->names().iterate, rval))
return false;
objp.set(&rval.toObject());
return true;
}
bool

View File

@ -44,7 +44,7 @@ class ScriptedIndirectProxyHandler : public BaseProxyHandler
virtual bool getEnumerablePropertyKeys(JSContext *cx, HandleObject proxy,
AutoIdVector &props) const MOZ_OVERRIDE;
virtual bool iterate(JSContext *cx, HandleObject proxy, unsigned flags,
MutableHandleValue vp) const MOZ_OVERRIDE;
MutableHandleObject objp) const MOZ_OVERRIDE;
virtual bool nativeCall(JSContext *cx, IsAcceptableThis test, NativeImpl impl,
CallArgs args) const MOZ_OVERRIDE;
virtual JSString *fun_toString(JSContext *cx, HandleObject proxy, unsigned indent) const MOZ_OVERRIDE;

View File

@ -738,9 +738,9 @@ xpc::SandboxProxyHandler::getOwnEnumerablePropertyKeys(JSContext *cx,
bool
xpc::SandboxProxyHandler::iterate(JSContext *cx, JS::Handle<JSObject*> proxy,
unsigned flags, JS::MutableHandle<Value> vp) const
unsigned flags, JS::MutableHandle<JSObject*> objp) const
{
return BaseProxyHandler::iterate(cx, proxy, flags, vp);
return BaseProxyHandler::iterate(cx, proxy, flags, objp);
}
bool

View File

@ -125,14 +125,14 @@ FilteringWrapper<Base, Policy>::getEnumerablePropertyKeys(JSContext *cx,
template <typename Base, typename Policy>
bool
FilteringWrapper<Base, Policy>::iterate(JSContext *cx, HandleObject wrapper,
unsigned flags, MutableHandleValue vp) const
unsigned flags, MutableHandleObject objp) const
{
assertEnteredPolicy(cx, wrapper, JSID_VOID, BaseProxyHandler::ENUMERATE);
// We refuse to trigger the iterator hook across chrome wrappers because
// we don't know how to censor custom iterator objects. Instead we trigger
// the default proxy iterate trap, which will ask enumerate() for the list
// of (censored) ids.
return js::BaseProxyHandler::iterate(cx, wrapper, flags, vp);
return js::BaseProxyHandler::iterate(cx, wrapper, flags, objp);
}
template <typename Base, typename Policy>

View File

@ -42,7 +42,7 @@ class FilteringWrapper : public Base {
virtual bool getEnumerablePropertyKeys(JSContext *cx, JS::Handle<JSObject*> wrapper,
JS::AutoIdVector &props) const MOZ_OVERRIDE;
virtual bool iterate(JSContext *cx, JS::Handle<JSObject*> wrapper, unsigned flags,
JS::MutableHandle<JS::Value> vp) const MOZ_OVERRIDE;
JS::MutableHandle<JSObject*> objp) const MOZ_OVERRIDE;
virtual bool call(JSContext *cx, JS::Handle<JSObject*> wrapper,
const JS::CallArgs &args) const MOZ_OVERRIDE;

View File

@ -60,10 +60,10 @@ WaiveXrayWrapper::get(JSContext *cx, HandleObject wrapper,
bool
WaiveXrayWrapper::iterate(JSContext *cx, HandleObject proxy, unsigned flags,
MutableHandleValue vp) const
MutableHandleObject objp) const
{
return CrossCompartmentWrapper::iterate(cx, proxy, flags, vp) &&
WrapperFactory::WaiveXrayAndWrap(cx, vp);
return CrossCompartmentWrapper::iterate(cx, proxy, flags, objp) &&
(!objp || WrapperFactory::WaiveXrayAndWrap(cx, objp));
}
bool

View File

@ -30,7 +30,7 @@ class WaiveXrayWrapper : public js::CrossCompartmentWrapper {
const JS::CallArgs &args) const MOZ_OVERRIDE;
virtual bool iterate(JSContext *cx, JS::Handle<JSObject*> proxy, unsigned flags,
JS::MutableHandle<JS::Value> vp) const MOZ_OVERRIDE;
JS::MutableHandle<JSObject*> objp) const MOZ_OVERRIDE;
virtual bool nativeCall(JSContext *cx, JS::IsAcceptableThis test,
JS::NativeImpl impl, JS::CallArgs args) const MOZ_OVERRIDE;
virtual bool getPropertyDescriptor(JSContext *cx, JS::Handle<JSObject*> wrapper,

View File

@ -2127,10 +2127,10 @@ XrayWrapper<Base, Traits>::getEnumerablePropertyKeys(JSContext *cx, HandleObject
template <typename Base, typename Traits>
bool
XrayWrapper<Base, Traits>::iterate(JSContext *cx, HandleObject wrapper,
unsigned flags, MutableHandleValue vp) const
unsigned flags, MutableHandleObject objp) const
{
// Skip our Base if it isn't already ProxyHandler.
return js::BaseProxyHandler::iterate(cx, wrapper, flags, vp);
return js::BaseProxyHandler::iterate(cx, wrapper, flags, objp);
}
template <typename Base, typename Traits>

View File

@ -442,7 +442,7 @@ class XrayWrapper : public Base {
virtual bool getEnumerablePropertyKeys(JSContext *cx, JS::Handle<JSObject*> wrapper,
JS::AutoIdVector &props) const MOZ_OVERRIDE;
virtual bool iterate(JSContext *cx, JS::Handle<JSObject*> wrapper, unsigned flags,
JS::MutableHandle<JS::Value> vp) const MOZ_OVERRIDE;
JS::MutableHandle<JSObject*> objp) const MOZ_OVERRIDE;
virtual const char *className(JSContext *cx, JS::HandleObject proxy) const MOZ_OVERRIDE;
virtual bool defaultValue(JSContext *cx, JS::HandleObject wrapper,
@ -513,7 +513,7 @@ public:
virtual bool getOwnEnumerablePropertyKeys(JSContext *cx, JS::Handle<JSObject*> proxy,
JS::AutoIdVector &props) const MOZ_OVERRIDE;
virtual bool iterate(JSContext *cx, JS::Handle<JSObject*> proxy, unsigned flags,
JS::MutableHandle<JS::Value> vp) const MOZ_OVERRIDE;
JS::MutableHandle<JSObject*> objp) const MOZ_OVERRIDE;
};
extern const SandboxProxyHandler sandboxProxyHandler;