mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-27 12:50:09 +00:00
Bug 1091900 - Make GetIterator and others take an object as outparam. r=efaust
This commit is contained in:
parent
fc0765b663
commit
127a42b89f
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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]]
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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>
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user