mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-15 06:15:43 +00:00
Bug 828462 - Root Proxy/Wrapper rests in js/src. r=terrence
This commit is contained in:
parent
787f786f96
commit
b4f8d32afe
@ -288,7 +288,7 @@ obj_toSource(JSContext *cx, unsigned argc, Value *vp)
|
||||
#endif /* JS_HAS_TOSOURCE */
|
||||
|
||||
JSString *
|
||||
js::obj_toStringHelper(JSContext *cx, JSObject *obj)
|
||||
js::obj_toStringHelper(JSContext *cx, HandleObject obj)
|
||||
{
|
||||
if (obj->isProxy())
|
||||
return Proxy::obj_toString(cx, obj);
|
||||
|
@ -20,7 +20,7 @@ extern JSBool
|
||||
obj_construct(JSContext *cx, unsigned argc, js::Value *vp);
|
||||
|
||||
extern JSString *
|
||||
obj_toStringHelper(JSContext *cx, JSObject *obj);
|
||||
obj_toStringHelper(JSContext *cx, HandleObject obj);
|
||||
|
||||
} /* namespace js */
|
||||
|
||||
|
@ -254,7 +254,7 @@ CompileRegExpObject(JSContext *cx, RegExpObjectBuilder &builder, CallArgs args)
|
||||
RegExpFlag flags;
|
||||
{
|
||||
RegExpGuard g(cx);
|
||||
if (!RegExpToShared(cx, *sourceObj, &g))
|
||||
if (!RegExpToShared(cx, sourceObj, &g))
|
||||
return false;
|
||||
|
||||
flags = g->getFlags();
|
||||
|
@ -808,7 +808,7 @@ JSObject::getProto(JSContext *cx, js::HandleObject obj, js::MutableHandleObject
|
||||
{
|
||||
if (obj->getTaggedProto().isLazy()) {
|
||||
JS_ASSERT(obj->isProxy());
|
||||
return js::Proxy::getPrototypeOf(cx, obj, protop.address());
|
||||
return js::Proxy::getPrototypeOf(cx, obj, protop);
|
||||
} else {
|
||||
protop.set(obj->js::ObjectImpl::getProto());
|
||||
return true;
|
||||
|
File diff suppressed because it is too large
Load Diff
102
js/src/jsproxy.h
102
js/src/jsproxy.h
@ -100,7 +100,7 @@ class JS_FRIEND_API(BaseProxyHandler) {
|
||||
SET,
|
||||
CALL
|
||||
};
|
||||
virtual bool enter(JSContext *cx, JSObject *wrapper, jsid id, Action act,
|
||||
virtual bool enter(JSContext *cx, HandleObject wrapper, HandleId id, Action act,
|
||||
bool *bp);
|
||||
|
||||
/* ES5 Harmony fundamental proxy traps. */
|
||||
@ -114,34 +114,34 @@ class JS_FRIEND_API(BaseProxyHandler) {
|
||||
virtual bool getOwnPropertyNames(JSContext *cx, HandleObject proxy,
|
||||
AutoIdVector &props) = 0;
|
||||
virtual bool delete_(JSContext *cx, HandleObject proxy, HandleId id, bool *bp) = 0;
|
||||
virtual bool enumerate(JSContext *cx, JSObject *proxy,
|
||||
AutoIdVector &props) = 0;
|
||||
virtual bool enumerate(JSContext *cx, HandleObject proxy, AutoIdVector &props) = 0;
|
||||
|
||||
/* ES5 Harmony derived proxy traps. */
|
||||
virtual bool has(JSContext *cx, JSObject *proxy, jsid id, bool *bp);
|
||||
virtual bool hasOwn(JSContext *cx, JSObject *proxy, jsid id, bool *bp);
|
||||
virtual bool get(JSContext *cx, JSObject *proxy, JSObject *receiver,
|
||||
jsid id, Value *vp);
|
||||
virtual bool set(JSContext *cx, JSObject *proxy, JSObject *receiver,
|
||||
jsid id, bool strict, Value *vp);
|
||||
virtual bool has(JSContext *cx, HandleObject proxy, HandleId id, bool *bp);
|
||||
virtual bool hasOwn(JSContext *cx, HandleObject proxy, HandleId id, bool *bp);
|
||||
virtual bool get(JSContext *cx, HandleObject proxy, HandleObject receiver,
|
||||
HandleId id, MutableHandleValue vp);
|
||||
virtual bool set(JSContext *cx, HandleObject proxy, HandleObject receiver,
|
||||
HandleId id, bool strict, MutableHandleValue vp);
|
||||
virtual bool keys(JSContext *cx, HandleObject proxy, AutoIdVector &props);
|
||||
virtual bool iterate(JSContext *cx, JSObject *proxy, unsigned flags,
|
||||
Value *vp);
|
||||
virtual bool iterate(JSContext *cx, HandleObject proxy, unsigned flags,
|
||||
MutableHandleValue vp);
|
||||
|
||||
/* Spidermonkey extensions. */
|
||||
virtual bool call(JSContext *cx, JSObject *proxy, unsigned argc, Value *vp);
|
||||
virtual bool construct(JSContext *cx, JSObject *proxy, unsigned argc, Value *argv, Value *rval);
|
||||
virtual bool call(JSContext *cx, HandleObject proxy, unsigned argc, Value *vp);
|
||||
virtual bool construct(JSContext *cx, HandleObject proxy, unsigned argc,
|
||||
Value *argv, MutableHandleValue rval);
|
||||
virtual bool nativeCall(JSContext *cx, IsAcceptableThis test, NativeImpl impl, CallArgs args);
|
||||
virtual bool hasInstance(JSContext *cx, HandleObject proxy, MutableHandleValue v, bool *bp);
|
||||
virtual bool objectClassIs(JSObject *obj, ESClassValue classValue, JSContext *cx);
|
||||
virtual JSString *obj_toString(JSContext *cx, JSObject *proxy);
|
||||
virtual JSString *fun_toString(JSContext *cx, JSObject *proxy, unsigned indent);
|
||||
virtual bool regexp_toShared(JSContext *cx, JSObject *proxy, RegExpGuard *g);
|
||||
virtual bool defaultValue(JSContext *cx, JSObject *obj, JSType hint, Value *vp);
|
||||
virtual bool objectClassIs(HandleObject obj, ESClassValue classValue, JSContext *cx);
|
||||
virtual JSString *obj_toString(JSContext *cx, HandleObject proxy);
|
||||
virtual JSString *fun_toString(JSContext *cx, HandleObject proxy, unsigned indent);
|
||||
virtual bool regexp_toShared(JSContext *cx, HandleObject proxy, RegExpGuard *g);
|
||||
virtual bool defaultValue(JSContext *cx, HandleObject obj, JSType hint, MutableHandleValue vp);
|
||||
virtual void finalize(JSFreeOp *fop, JSObject *proxy);
|
||||
virtual bool getElementIfPresent(JSContext *cx, JSObject *obj, JSObject *receiver,
|
||||
uint32_t index, Value *vp, bool *present);
|
||||
virtual bool getPrototypeOf(JSContext *cx, JSObject *proxy, JSObject **protop);
|
||||
virtual bool getElementIfPresent(JSContext *cx, HandleObject obj, HandleObject receiver,
|
||||
uint32_t index, MutableHandleValue vp, bool *present);
|
||||
virtual bool getPrototypeOf(JSContext *cx, HandleObject proxy, MutableHandleObject protop);
|
||||
|
||||
/* See comment for weakmapKeyDelegateOp in jsclass.h. */
|
||||
virtual JSObject *weakmapKeyDelegate(JSObject *proxy);
|
||||
@ -169,37 +169,37 @@ public:
|
||||
AutoIdVector &props) MOZ_OVERRIDE;
|
||||
virtual bool delete_(JSContext *cx, HandleObject proxy, HandleId id,
|
||||
bool *bp) MOZ_OVERRIDE;
|
||||
virtual bool enumerate(JSContext *cx, JSObject *proxy,
|
||||
virtual bool enumerate(JSContext *cx, HandleObject proxy,
|
||||
AutoIdVector &props) MOZ_OVERRIDE;
|
||||
|
||||
/* ES5 Harmony derived proxy traps. */
|
||||
virtual bool has(JSContext *cx, JSObject *proxy, jsid id,
|
||||
virtual bool has(JSContext *cx, HandleObject proxy, HandleId id,
|
||||
bool *bp) MOZ_OVERRIDE;
|
||||
virtual bool hasOwn(JSContext *cx, JSObject *proxy, jsid id,
|
||||
virtual bool hasOwn(JSContext *cx, HandleObject proxy, HandleId id,
|
||||
bool *bp) MOZ_OVERRIDE;
|
||||
virtual bool get(JSContext *cx, JSObject *proxy, JSObject *receiver,
|
||||
jsid id, Value *vp) MOZ_OVERRIDE;
|
||||
virtual bool set(JSContext *cx, JSObject *proxy, JSObject *receiver,
|
||||
jsid id, bool strict, Value *vp) MOZ_OVERRIDE;
|
||||
virtual bool get(JSContext *cx, HandleObject proxy, HandleObject receiver,
|
||||
HandleId id, MutableHandleValue vp) MOZ_OVERRIDE;
|
||||
virtual bool set(JSContext *cx, HandleObject proxy, HandleObject receiver,
|
||||
HandleId id, bool strict, MutableHandleValue vp) MOZ_OVERRIDE;
|
||||
virtual bool keys(JSContext *cx, HandleObject proxy,
|
||||
AutoIdVector &props) MOZ_OVERRIDE;
|
||||
virtual bool iterate(JSContext *cx, JSObject *proxy, unsigned flags,
|
||||
Value *vp) MOZ_OVERRIDE;
|
||||
virtual bool iterate(JSContext *cx, HandleObject proxy, unsigned flags,
|
||||
MutableHandleValue vp) MOZ_OVERRIDE;
|
||||
|
||||
/* Spidermonkey extensions. */
|
||||
virtual bool nativeCall(JSContext *cx, IsAcceptableThis test, NativeImpl impl,
|
||||
CallArgs args) MOZ_OVERRIDE;
|
||||
virtual bool hasInstance(JSContext *cx, HandleObject proxy, MutableHandleValue v,
|
||||
bool *bp) MOZ_OVERRIDE;
|
||||
virtual bool objectClassIs(JSObject *obj, ESClassValue classValue,
|
||||
virtual bool objectClassIs(HandleObject obj, ESClassValue classValue,
|
||||
JSContext *cx) MOZ_OVERRIDE;
|
||||
virtual JSString *obj_toString(JSContext *cx, JSObject *proxy) MOZ_OVERRIDE;
|
||||
virtual JSString *fun_toString(JSContext *cx, JSObject *proxy,
|
||||
virtual JSString *obj_toString(JSContext *cx, HandleObject proxy) MOZ_OVERRIDE;
|
||||
virtual JSString *fun_toString(JSContext *cx, HandleObject proxy,
|
||||
unsigned indent) MOZ_OVERRIDE;
|
||||
virtual bool regexp_toShared(JSContext *cx, JSObject *proxy,
|
||||
virtual bool regexp_toShared(JSContext *cx, HandleObject proxy,
|
||||
RegExpGuard *g) MOZ_OVERRIDE;
|
||||
virtual bool defaultValue(JSContext *cx, JSObject *obj, JSType hint,
|
||||
Value *vp) MOZ_OVERRIDE;
|
||||
virtual bool defaultValue(JSContext *cx, HandleObject obj, JSType hint,
|
||||
MutableHandleValue vp) MOZ_OVERRIDE;
|
||||
virtual JSObject *weakmapKeyDelegate(JSObject *proxy);
|
||||
};
|
||||
|
||||
@ -219,30 +219,32 @@ class Proxy {
|
||||
static bool defineProperty(JSContext *cx, HandleObject proxy, HandleId id, HandleValue v);
|
||||
static bool getOwnPropertyNames(JSContext *cx, HandleObject proxy, AutoIdVector &props);
|
||||
static bool delete_(JSContext *cx, HandleObject proxy, HandleId id, bool *bp);
|
||||
static bool enumerate(JSContext *cx, JSObject *proxy, AutoIdVector &props);
|
||||
static bool enumerate(JSContext *cx, HandleObject proxy, AutoIdVector &props);
|
||||
|
||||
/* ES5 Harmony derived proxy traps. */
|
||||
static bool has(JSContext *cx, JSObject *proxy, jsid id, bool *bp);
|
||||
static bool hasOwn(JSContext *cx, JSObject *proxy, jsid id, bool *bp);
|
||||
static bool get(JSContext *cx, HandleObject proxy, HandleObject receiver, HandleId id, MutableHandleValue vp);
|
||||
static bool has(JSContext *cx, HandleObject proxy, HandleId id, bool *bp);
|
||||
static bool hasOwn(JSContext *cx, HandleObject proxy, HandleId id, bool *bp);
|
||||
static bool get(JSContext *cx, HandleObject proxy, HandleObject receiver, HandleId id,
|
||||
MutableHandleValue vp);
|
||||
static bool getElementIfPresent(JSContext *cx, HandleObject proxy, HandleObject receiver,
|
||||
uint32_t index, MutableHandleValue vp, bool *present);
|
||||
static bool set(JSContext *cx, HandleObject proxy, HandleObject receiver, HandleId id, bool strict,
|
||||
MutableHandleValue vp);
|
||||
static bool set(JSContext *cx, HandleObject proxy, HandleObject receiver, HandleId id,
|
||||
bool strict, MutableHandleValue vp);
|
||||
static bool keys(JSContext *cx, HandleObject proxy, AutoIdVector &props);
|
||||
static bool iterate(JSContext *cx, HandleObject proxy, unsigned flags, MutableHandleValue vp);
|
||||
|
||||
/* Spidermonkey extensions. */
|
||||
static bool call(JSContext *cx, JSObject *proxy, unsigned argc, Value *vp);
|
||||
static bool construct(JSContext *cx, JSObject *proxy, unsigned argc, Value *argv, Value *rval);
|
||||
static bool call(JSContext *cx, HandleObject proxy, unsigned argc, Value *vp);
|
||||
static bool construct(JSContext *cx, HandleObject proxy, unsigned argc, Value *argv,
|
||||
MutableHandleValue rval);
|
||||
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(JSObject *obj, ESClassValue classValue, JSContext *cx);
|
||||
static JSString *obj_toString(JSContext *cx, JSObject *proxy);
|
||||
static JSString *fun_toString(JSContext *cx, JSObject *proxy, unsigned indent);
|
||||
static bool regexp_toShared(JSContext *cx, JSObject *proxy, RegExpGuard *g);
|
||||
static bool defaultValue(JSContext *cx, JSObject *obj, JSType hint, Value *vp);
|
||||
static bool getPrototypeOf(JSContext *cx, JSObject *proxy, JSObject **protop);
|
||||
static bool objectClassIs(HandleObject obj, ESClassValue classValue, JSContext *cx);
|
||||
static JSString *obj_toString(JSContext *cx, HandleObject proxy);
|
||||
static JSString *fun_toString(JSContext *cx, HandleObject proxy, unsigned indent);
|
||||
static bool regexp_toShared(JSContext *cx, HandleObject proxy, RegExpGuard *g);
|
||||
static bool defaultValue(JSContext *cx, HandleObject obj, JSType hint, MutableHandleValue vp);
|
||||
static bool getPrototypeOf(JSContext *cx, HandleObject proxy, MutableHandleObject protop);
|
||||
|
||||
static JSObject * const LazyProto;
|
||||
};
|
||||
|
@ -1593,7 +1593,8 @@ class StringRegExpGuard
|
||||
bool init(JSContext *cx, CallArgs args, bool convertVoid = false)
|
||||
{
|
||||
if (args.length() != 0 && IsObjectWithClass(args[0], ESClass_RegExp, cx)) {
|
||||
if (!RegExpToShared(cx, args[0].toObject(), &re_))
|
||||
RootedObject obj(cx, &args[0].toObject());
|
||||
if (!RegExpToShared(cx, obj, &re_))
|
||||
return false;
|
||||
} else {
|
||||
if (convertVoid && !args.hasDefined(0)) {
|
||||
@ -2980,7 +2981,8 @@ js::str_split(JSContext *cx, unsigned argc, Value *vp)
|
||||
bool sepDefined = args.hasDefined(0);
|
||||
if (sepDefined) {
|
||||
if (IsObjectWithClass(args[0], ESClass_RegExp, cx)) {
|
||||
if (!RegExpToShared(cx, args[0].toObject(), &re))
|
||||
RootedObject obj(cx, &args[0].toObject());
|
||||
if (!RegExpToShared(cx, obj, &re))
|
||||
return false;
|
||||
} else {
|
||||
sepstr = ArgToRootedString(cx, args, 0);
|
||||
|
@ -137,17 +137,11 @@ Wrapper::~Wrapper()
|
||||
* algorithm whenever unwrapping is forbidden.
|
||||
*/
|
||||
bool
|
||||
Wrapper::defaultValue(JSContext *cx, JSObject *wrapperArg, JSType hint, Value *vp)
|
||||
Wrapper::defaultValue(JSContext *cx, HandleObject wrapper, JSType hint, MutableHandleValue vp)
|
||||
{
|
||||
RootedObject wrapper(cx, wrapperArg);
|
||||
if (!wrapperHandler(wrapper)->isSafeToUnwrap())
|
||||
return DefaultValue(cx, wrapper, hint, vp);
|
||||
|
||||
if (!wrapperHandler(wrapper)->isSafeToUnwrap()) {
|
||||
RootedValue v(cx);
|
||||
if (!DefaultValue(cx, wrapper, hint, &v))
|
||||
return false;
|
||||
*vp = v;
|
||||
return true;
|
||||
}
|
||||
/*
|
||||
* We enter the compartment of the wrappee here, even if we're not a cross
|
||||
* compartment wrapper. Moreover, cross compartment wrappers do not enter
|
||||
@ -286,9 +280,8 @@ CrossCompartmentWrapper::delete_(JSContext *cx, HandleObject wrapper, HandleId i
|
||||
}
|
||||
|
||||
bool
|
||||
CrossCompartmentWrapper::enumerate(JSContext *cx, JSObject *wrapperArg, AutoIdVector &props)
|
||||
CrossCompartmentWrapper::enumerate(JSContext *cx, HandleObject wrapper, AutoIdVector &props)
|
||||
{
|
||||
RootedObject wrapper(cx, wrapperArg);
|
||||
PIERCE(cx, wrapper,
|
||||
NOTHING,
|
||||
Wrapper::enumerate(cx, wrapper, props),
|
||||
@ -296,63 +289,56 @@ CrossCompartmentWrapper::enumerate(JSContext *cx, JSObject *wrapperArg, AutoIdVe
|
||||
}
|
||||
|
||||
bool
|
||||
CrossCompartmentWrapper::has(JSContext *cx, JSObject *wrapperArg, jsid id, bool *bp)
|
||||
CrossCompartmentWrapper::has(JSContext *cx, HandleObject wrapper, HandleId id, bool *bp)
|
||||
{
|
||||
RootedObject wrapper(cx, wrapperArg);
|
||||
RootedId idCopy(cx, id);
|
||||
PIERCE(cx, wrapper,
|
||||
cx->compartment->wrapId(cx, &id),
|
||||
Wrapper::has(cx, wrapper, id, bp),
|
||||
cx->compartment->wrapId(cx, idCopy.address()),
|
||||
Wrapper::has(cx, wrapper, idCopy, bp),
|
||||
NOTHING);
|
||||
}
|
||||
|
||||
bool
|
||||
CrossCompartmentWrapper::hasOwn(JSContext *cx, JSObject *wrapperArg, jsid id, bool *bp)
|
||||
CrossCompartmentWrapper::hasOwn(JSContext *cx, HandleObject wrapper, HandleId id, bool *bp)
|
||||
{
|
||||
RootedObject wrapper(cx, wrapperArg);
|
||||
RootedId idCopy(cx, id);
|
||||
PIERCE(cx, wrapper,
|
||||
cx->compartment->wrapId(cx, &id),
|
||||
Wrapper::hasOwn(cx, wrapper, id, bp),
|
||||
cx->compartment->wrapId(cx, idCopy.address()),
|
||||
Wrapper::hasOwn(cx, wrapper, idCopy, bp),
|
||||
NOTHING);
|
||||
}
|
||||
|
||||
bool
|
||||
CrossCompartmentWrapper::get(JSContext *cx, JSObject *wrapperArg, JSObject *receiverArg,
|
||||
jsid idArg, Value *vpArg)
|
||||
CrossCompartmentWrapper::get(JSContext *cx, HandleObject wrapper, HandleObject receiver,
|
||||
HandleId id, MutableHandleValue vp)
|
||||
{
|
||||
RootedObject wrapper(cx, wrapperArg);
|
||||
RootedObject receiver(cx, receiverArg);
|
||||
RootedId id(cx, idArg);
|
||||
RootedValue vp(cx, *vpArg);
|
||||
|
||||
RootedObject receiverCopy(cx, receiver);
|
||||
RootedId idCopy(cx, id);
|
||||
{
|
||||
AutoCompartment call(cx, wrappedObject(wrapper));
|
||||
if (!cx->compartment->wrap(cx, receiver.address()) ||
|
||||
!cx->compartment->wrapId(cx, id.address()))
|
||||
if (!cx->compartment->wrap(cx, receiverCopy.address()) ||
|
||||
!cx->compartment->wrapId(cx, idCopy.address()))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!Wrapper::get(cx, wrapper, receiver, id, vp.address()))
|
||||
if (!Wrapper::get(cx, wrapper, receiverCopy, idCopy, vp))
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ok = cx->compartment->wrap(cx, &vp);
|
||||
*vpArg = vp.get();
|
||||
return ok;
|
||||
return cx->compartment->wrap(cx, vp);
|
||||
}
|
||||
|
||||
bool
|
||||
CrossCompartmentWrapper::set(JSContext *cx, JSObject *wrapper_, JSObject *receiver_, jsid id_,
|
||||
bool strict, Value *valueArg)
|
||||
CrossCompartmentWrapper::set(JSContext *cx, HandleObject wrapper, HandleObject receiver,
|
||||
HandleId id, bool strict, MutableHandleValue vp)
|
||||
{
|
||||
RootedObject wrapper(cx, wrapper_), receiver(cx, receiver_);
|
||||
RootedId id(cx, id_);
|
||||
RootedValue value(cx, *valueArg);
|
||||
RootedObject receiverCopy(cx, receiver);
|
||||
RootedId idCopy(cx, id);
|
||||
PIERCE(cx, wrapper,
|
||||
cx->compartment->wrap(cx, receiver.address()) &&
|
||||
cx->compartment->wrapId(cx, id.address()) &&
|
||||
cx->compartment->wrap(cx, &value),
|
||||
Wrapper::set(cx, wrapper, receiver, id, strict, value.address()),
|
||||
cx->compartment->wrap(cx, receiverCopy.address()) &&
|
||||
cx->compartment->wrapId(cx, idCopy.address()) &&
|
||||
cx->compartment->wrap(cx, vp),
|
||||
Wrapper::set(cx, wrapper, receiverCopy, idCopy, strict, vp),
|
||||
NOTHING);
|
||||
}
|
||||
|
||||
@ -370,11 +356,11 @@ CrossCompartmentWrapper::keys(JSContext *cx, HandleObject wrapper, AutoIdVector
|
||||
* allows fast iteration over objects across a compartment boundary.
|
||||
*/
|
||||
static bool
|
||||
CanReify(Value *vp)
|
||||
CanReify(HandleValue vp)
|
||||
{
|
||||
JSObject *obj;
|
||||
return vp->isObject() &&
|
||||
(obj = &vp->toObject())->isPropertyIterator() &&
|
||||
return vp.isObject() &&
|
||||
(obj = &vp.toObject())->isPropertyIterator() &&
|
||||
(obj->asPropertyIterator().getNativeIterator()->flags & JSITER_ENUMERATE);
|
||||
}
|
||||
|
||||
@ -440,28 +426,23 @@ Reify(JSContext *cx, JSCompartment *origin, MutableHandleValue vp)
|
||||
}
|
||||
|
||||
bool
|
||||
CrossCompartmentWrapper::iterate(JSContext *cx, JSObject *wrapperArg, unsigned flags, Value *vpArg)
|
||||
CrossCompartmentWrapper::iterate(JSContext *cx, HandleObject wrapper, unsigned flags,
|
||||
MutableHandleValue vp)
|
||||
{
|
||||
RootedObject wrapper(cx, wrapperArg);
|
||||
RootedValue vp(cx, *vpArg);
|
||||
|
||||
{
|
||||
AutoCompartment call(cx, wrappedObject(wrapper));
|
||||
if (!Wrapper::iterate(cx, wrapper, flags, vp.address()))
|
||||
if (!Wrapper::iterate(cx, wrapper, flags, vp))
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ok = CanReify(vp.address())
|
||||
? Reify(cx, cx->compartment, &vp)
|
||||
: cx->compartment->wrap(cx, &vp);
|
||||
*vpArg = vp.get();
|
||||
return ok;
|
||||
if (CanReify(vp))
|
||||
return Reify(cx, cx->compartment, vp);
|
||||
return cx->compartment->wrap(cx, vp);
|
||||
}
|
||||
|
||||
bool
|
||||
CrossCompartmentWrapper::call(JSContext *cx, JSObject *wrapperArg, unsigned argc, Value *vp)
|
||||
CrossCompartmentWrapper::call(JSContext *cx, HandleObject wrapper, unsigned argc, Value *vp)
|
||||
{
|
||||
RootedObject wrapper(cx, wrapperArg);
|
||||
RootedObject wrapped(cx, wrappedObject(wrapper));
|
||||
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
@ -485,11 +466,10 @@ CrossCompartmentWrapper::call(JSContext *cx, JSObject *wrapperArg, unsigned argc
|
||||
}
|
||||
|
||||
bool
|
||||
CrossCompartmentWrapper::construct(JSContext *cx, JSObject *wrapperArg, unsigned argc, Value *argv,
|
||||
Value *rvalArg)
|
||||
CrossCompartmentWrapper::construct(JSContext *cx, HandleObject wrapper, unsigned argc, Value *argv,
|
||||
MutableHandleValue rval)
|
||||
{
|
||||
RootedObject wrapper(cx, wrapperArg);
|
||||
JSObject *wrapped = wrappedObject(wrapper);
|
||||
RootedObject wrapped(cx, wrappedObject(wrapper));
|
||||
{
|
||||
AutoCompartment call(cx, wrapped);
|
||||
|
||||
@ -499,13 +479,10 @@ CrossCompartmentWrapper::construct(JSContext *cx, JSObject *wrapperArg, unsigned
|
||||
return false;
|
||||
argv[n] = arg;
|
||||
}
|
||||
if (!Wrapper::construct(cx, wrapper, argc, argv, rvalArg))
|
||||
if (!Wrapper::construct(cx, wrapper, argc, argv, rval))
|
||||
return false;
|
||||
}
|
||||
RootedValue rval(cx, *rvalArg);
|
||||
bool ok = cx->compartment->wrap(cx, &rval);
|
||||
*rvalArg = rval;
|
||||
return ok;
|
||||
return cx->compartment->wrap(cx, rval);
|
||||
}
|
||||
|
||||
bool
|
||||
@ -559,7 +536,8 @@ CrossCompartmentWrapper::nativeCall(JSContext *cx, IsAcceptableThis test, Native
|
||||
}
|
||||
|
||||
bool
|
||||
CrossCompartmentWrapper::hasInstance(JSContext *cx, HandleObject wrapper, MutableHandleValue v, bool *bp)
|
||||
CrossCompartmentWrapper::hasInstance(JSContext *cx, HandleObject wrapper, MutableHandleValue v,
|
||||
bool *bp)
|
||||
{
|
||||
AutoCompartment call(cx, wrappedObject(wrapper));
|
||||
if (!cx->compartment->wrap(cx, v))
|
||||
@ -568,9 +546,8 @@ CrossCompartmentWrapper::hasInstance(JSContext *cx, HandleObject wrapper, Mutabl
|
||||
}
|
||||
|
||||
JSString *
|
||||
CrossCompartmentWrapper::obj_toString(JSContext *cx, JSObject *wrapperArg)
|
||||
CrossCompartmentWrapper::obj_toString(JSContext *cx, HandleObject wrapper)
|
||||
{
|
||||
RootedObject wrapper(cx, wrapperArg);
|
||||
RootedString str(cx);
|
||||
{
|
||||
AutoCompartment call(cx, wrappedObject(wrapper));
|
||||
@ -584,9 +561,8 @@ CrossCompartmentWrapper::obj_toString(JSContext *cx, JSObject *wrapperArg)
|
||||
}
|
||||
|
||||
JSString *
|
||||
CrossCompartmentWrapper::fun_toString(JSContext *cx, JSObject *wrapperArg, unsigned indent)
|
||||
CrossCompartmentWrapper::fun_toString(JSContext *cx, HandleObject wrapper, unsigned indent)
|
||||
{
|
||||
RootedObject wrapper(cx, wrapperArg);
|
||||
RootedString str(cx);
|
||||
{
|
||||
AutoCompartment call(cx, wrappedObject(wrapper));
|
||||
@ -600,51 +576,40 @@ CrossCompartmentWrapper::fun_toString(JSContext *cx, JSObject *wrapperArg, unsig
|
||||
}
|
||||
|
||||
bool
|
||||
CrossCompartmentWrapper::regexp_toShared(JSContext *cx, JSObject *wrapperArg, RegExpGuard *g)
|
||||
CrossCompartmentWrapper::regexp_toShared(JSContext *cx, HandleObject wrapper, RegExpGuard *g)
|
||||
{
|
||||
RootedObject wrapper(cx, wrapperArg);
|
||||
AutoCompartment call(cx, wrappedObject(wrapper));
|
||||
return Wrapper::regexp_toShared(cx, wrapper, g);
|
||||
}
|
||||
|
||||
bool
|
||||
CrossCompartmentWrapper::defaultValue(JSContext *cx, JSObject *wrapper, JSType hint, Value *vpArg)
|
||||
CrossCompartmentWrapper::defaultValue(JSContext *cx, HandleObject wrapper, JSType hint,
|
||||
MutableHandleValue vp)
|
||||
{
|
||||
if (!Wrapper::defaultValue(cx, wrapper, hint, vpArg))
|
||||
if (!Wrapper::defaultValue(cx, wrapper, hint, vp))
|
||||
return false;
|
||||
|
||||
RootedValue vp(cx, *vpArg);
|
||||
bool ok = cx->compartment->wrap(cx, &vp);
|
||||
*vpArg = vp;
|
||||
return ok;
|
||||
return cx->compartment->wrap(cx, vp);
|
||||
}
|
||||
|
||||
bool
|
||||
CrossCompartmentWrapper::getPrototypeOf(JSContext *cx, JSObject *wrapperArg, JSObject **protop)
|
||||
CrossCompartmentWrapper::getPrototypeOf(JSContext *cx, HandleObject wrapper,
|
||||
MutableHandleObject protop)
|
||||
{
|
||||
RootedObject wrapper(cx, wrapperArg);
|
||||
assertSameCompartment(cx, wrapper);
|
||||
|
||||
if (!wrapper->getTaggedProto().isLazy()) {
|
||||
*protop = wrapper->getTaggedProto().toObjectOrNull();
|
||||
protop.set(wrapper->getTaggedProto().toObjectOrNull());
|
||||
return true;
|
||||
}
|
||||
|
||||
RootedObject proto(cx);
|
||||
{
|
||||
RootedObject wrapped(cx, wrappedObject(wrapper));
|
||||
AutoCompartment call(cx, wrapped);
|
||||
if (!JSObject::getProto(cx, wrapped, &proto))
|
||||
if (!JSObject::getProto(cx, wrapped, protop))
|
||||
return false;
|
||||
if (proto)
|
||||
proto->setDelegate(cx);
|
||||
if (protop)
|
||||
protop->setDelegate(cx);
|
||||
}
|
||||
|
||||
if (!wrapper->compartment()->wrap(cx, proto.address()))
|
||||
return false;
|
||||
|
||||
*protop = proto;
|
||||
return true;
|
||||
return cx->compartment->wrap(cx, protop.address());
|
||||
}
|
||||
|
||||
CrossCompartmentWrapper CrossCompartmentWrapper::singleton(0u);
|
||||
@ -661,7 +626,7 @@ SecurityWrapper<Base>::SecurityWrapper(unsigned flags)
|
||||
|
||||
template <class Base>
|
||||
bool
|
||||
SecurityWrapper<Base>::enter(JSContext *cx, JSObject *wrapper, jsid id,
|
||||
SecurityWrapper<Base>::enter(JSContext *cx, HandleObject wrapper, HandleId id,
|
||||
Wrapper::Action act, bool *bp)
|
||||
{
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_UNWRAP_DENIED);
|
||||
@ -680,14 +645,14 @@ SecurityWrapper<Base>::nativeCall(JSContext *cx, IsAcceptableThis test, NativeIm
|
||||
|
||||
template <class Base>
|
||||
bool
|
||||
SecurityWrapper<Base>::objectClassIs(JSObject *obj, ESClassValue classValue, JSContext *cx)
|
||||
SecurityWrapper<Base>::objectClassIs(HandleObject obj, ESClassValue classValue, JSContext *cx)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
template <class Base>
|
||||
bool
|
||||
SecurityWrapper<Base>::regexp_toShared(JSContext *cx, JSObject *obj, RegExpGuard *g)
|
||||
SecurityWrapper<Base>::regexp_toShared(JSContext *cx, HandleObject obj, RegExpGuard *g)
|
||||
{
|
||||
return Base::regexp_toShared(cx, obj, g);
|
||||
}
|
||||
@ -741,23 +706,22 @@ DeadObjectProxy::delete_(JSContext *cx, HandleObject wrapper, HandleId id, bool
|
||||
}
|
||||
|
||||
bool
|
||||
DeadObjectProxy::enumerate(JSContext *cx, JSObject *wrapper,
|
||||
AutoIdVector &props)
|
||||
DeadObjectProxy::enumerate(JSContext *cx, HandleObject wrapper, AutoIdVector &props)
|
||||
{
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_DEAD_OBJECT);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
DeadObjectProxy::call(JSContext *cx, JSObject *wrapper, unsigned argc, Value *vp)
|
||||
DeadObjectProxy::call(JSContext *cx, HandleObject wrapper, unsigned argc, Value *vp)
|
||||
{
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_DEAD_OBJECT);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
DeadObjectProxy::construct(JSContext *cx, JSObject *wrapper, unsigned argc,
|
||||
Value *vp, Value *rval)
|
||||
DeadObjectProxy::construct(JSContext *cx, HandleObject wrapper, unsigned argc,
|
||||
Value *vp, MutableHandleValue rval)
|
||||
{
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_DEAD_OBJECT);
|
||||
return false;
|
||||
@ -771,58 +735,57 @@ DeadObjectProxy::nativeCall(JSContext *cx, IsAcceptableThis test, NativeImpl imp
|
||||
}
|
||||
|
||||
bool
|
||||
DeadObjectProxy::hasInstance(JSContext *cx, HandleObject proxy, MutableHandleValue v,
|
||||
bool *bp)
|
||||
DeadObjectProxy::hasInstance(JSContext *cx, HandleObject proxy, MutableHandleValue v, bool *bp)
|
||||
{
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_DEAD_OBJECT);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
DeadObjectProxy::objectClassIs(JSObject *obj, ESClassValue classValue, JSContext *cx)
|
||||
DeadObjectProxy::objectClassIs(HandleObject obj, ESClassValue classValue, JSContext *cx)
|
||||
{
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_DEAD_OBJECT);
|
||||
return false;
|
||||
}
|
||||
|
||||
JSString *
|
||||
DeadObjectProxy::obj_toString(JSContext *cx, JSObject *wrapper)
|
||||
DeadObjectProxy::obj_toString(JSContext *cx, HandleObject wrapper)
|
||||
{
|
||||
return JS_NewStringCopyZ(cx, "[object DeadObject]");
|
||||
}
|
||||
|
||||
JSString *
|
||||
DeadObjectProxy::fun_toString(JSContext *cx, JSObject *proxy, unsigned indent)
|
||||
DeadObjectProxy::fun_toString(JSContext *cx, HandleObject proxy, unsigned indent)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool
|
||||
DeadObjectProxy::regexp_toShared(JSContext *cx, JSObject *proxy, RegExpGuard *g)
|
||||
DeadObjectProxy::regexp_toShared(JSContext *cx, HandleObject proxy, RegExpGuard *g)
|
||||
{
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_DEAD_OBJECT);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
DeadObjectProxy::defaultValue(JSContext *cx, JSObject *obj, JSType hint, Value *vp)
|
||||
DeadObjectProxy::defaultValue(JSContext *cx, HandleObject obj, JSType hint, MutableHandleValue vp)
|
||||
{
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_DEAD_OBJECT);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
DeadObjectProxy::getElementIfPresent(JSContext *cx, JSObject *obj, JSObject *receiver,
|
||||
uint32_t index, Value *vp, bool *present)
|
||||
DeadObjectProxy::getElementIfPresent(JSContext *cx, HandleObject obj, HandleObject receiver,
|
||||
uint32_t index, MutableHandleValue vp, bool *present)
|
||||
{
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_DEAD_OBJECT);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
DeadObjectProxy::getPrototypeOf(JSContext *cx, JSObject *proxy, JSObject **protop)
|
||||
DeadObjectProxy::getPrototypeOf(JSContext *cx, HandleObject proxy, MutableHandleObject protop)
|
||||
{
|
||||
*protop = NULL;
|
||||
protop.set(NULL);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -66,8 +66,8 @@ class JS_FRIEND_API(Wrapper) : public DirectProxyHandler
|
||||
virtual ~Wrapper();
|
||||
|
||||
/* ES5 Harmony fundamental wrapper traps. */
|
||||
virtual bool defaultValue(JSContext *cx, JSObject *wrapper_, JSType hint,
|
||||
Value *vp) MOZ_OVERRIDE;
|
||||
virtual bool defaultValue(JSContext *cx, HandleObject wrapper, JSType hint,
|
||||
MutableHandleValue vp) MOZ_OVERRIDE;
|
||||
|
||||
static Wrapper singleton;
|
||||
static Wrapper singletonWithPrototype;
|
||||
@ -95,28 +95,34 @@ class JS_FRIEND_API(CrossCompartmentWrapper) : public Wrapper
|
||||
virtual bool getOwnPropertyNames(JSContext *cx, HandleObject wrapper,
|
||||
AutoIdVector &props) MOZ_OVERRIDE;
|
||||
virtual bool delete_(JSContext *cx, HandleObject wrapper, HandleId id, bool *bp) MOZ_OVERRIDE;
|
||||
virtual bool enumerate(JSContext *cx, JSObject *wrapper, AutoIdVector &props) MOZ_OVERRIDE;
|
||||
virtual bool enumerate(JSContext *cx, HandleObject wrapper, AutoIdVector &props) MOZ_OVERRIDE;
|
||||
|
||||
/* ES5 Harmony derived wrapper traps. */
|
||||
virtual bool has(JSContext *cx, JSObject *wrapper, jsid id, bool *bp) MOZ_OVERRIDE;
|
||||
virtual bool hasOwn(JSContext *cx, JSObject *wrapper, jsid id, bool *bp) MOZ_OVERRIDE;
|
||||
virtual bool get(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id, Value *vp) MOZ_OVERRIDE;
|
||||
virtual bool set(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id, bool strict,
|
||||
Value *vp) MOZ_OVERRIDE;
|
||||
virtual bool has(JSContext *cx, HandleObject wrapper, HandleId id, bool *bp) MOZ_OVERRIDE;
|
||||
virtual bool hasOwn(JSContext *cx, HandleObject wrapper, HandleId id, bool *bp) MOZ_OVERRIDE;
|
||||
virtual bool get(JSContext *cx, HandleObject wrapper, HandleObject receiver,
|
||||
HandleId id, MutableHandleValue vp) MOZ_OVERRIDE;
|
||||
virtual bool set(JSContext *cx, HandleObject wrapper, HandleObject receiver,
|
||||
HandleId id, bool strict, MutableHandleValue vp) MOZ_OVERRIDE;
|
||||
virtual bool keys(JSContext *cx, HandleObject wrapper, AutoIdVector &props) MOZ_OVERRIDE;
|
||||
virtual bool iterate(JSContext *cx, JSObject *wrapper, unsigned flags, Value *vp) MOZ_OVERRIDE;
|
||||
virtual bool iterate(JSContext *cx, HandleObject wrapper, unsigned flags,
|
||||
MutableHandleValue vp) MOZ_OVERRIDE;
|
||||
|
||||
/* Spidermonkey extensions. */
|
||||
virtual bool call(JSContext *cx, JSObject *wrapper, unsigned argc, Value *vp) MOZ_OVERRIDE;
|
||||
virtual bool construct(JSContext *cx, JSObject *wrapper, unsigned argc, Value *argv, Value *rval) MOZ_OVERRIDE;
|
||||
virtual bool call(JSContext *cx, HandleObject wrapper, unsigned argc, Value *vp) MOZ_OVERRIDE;
|
||||
virtual bool construct(JSContext *cx, HandleObject wrapper, unsigned argc, Value *argv,
|
||||
MutableHandleValue rval) MOZ_OVERRIDE;
|
||||
virtual bool nativeCall(JSContext *cx, IsAcceptableThis test, NativeImpl impl,
|
||||
CallArgs args) MOZ_OVERRIDE;
|
||||
virtual bool hasInstance(JSContext *cx, HandleObject wrapper, MutableHandleValue v, bool *bp) MOZ_OVERRIDE;
|
||||
virtual JSString *obj_toString(JSContext *cx, JSObject *wrapper) MOZ_OVERRIDE;
|
||||
virtual JSString *fun_toString(JSContext *cx, JSObject *wrapper, unsigned indent) MOZ_OVERRIDE;
|
||||
virtual bool regexp_toShared(JSContext *cx, JSObject *proxy, RegExpGuard *g) MOZ_OVERRIDE;
|
||||
virtual bool defaultValue(JSContext *cx, JSObject *wrapper, JSType hint, Value *vp) MOZ_OVERRIDE;
|
||||
virtual bool getPrototypeOf(JSContext *cx, JSObject *proxy, JSObject **protop);
|
||||
virtual bool hasInstance(JSContext *cx, HandleObject wrapper, MutableHandleValue v,
|
||||
bool *bp) MOZ_OVERRIDE;
|
||||
virtual JSString *obj_toString(JSContext *cx, HandleObject wrapper) MOZ_OVERRIDE;
|
||||
virtual JSString *fun_toString(JSContext *cx, HandleObject wrapper,
|
||||
unsigned indent) MOZ_OVERRIDE;
|
||||
virtual bool regexp_toShared(JSContext *cx, HandleObject proxy, RegExpGuard *g) MOZ_OVERRIDE;
|
||||
virtual bool defaultValue(JSContext *cx, HandleObject wrapper, JSType hint,
|
||||
MutableHandleValue vp) MOZ_OVERRIDE;
|
||||
virtual bool getPrototypeOf(JSContext *cx, HandleObject proxy, MutableHandleObject protop);
|
||||
|
||||
static CrossCompartmentWrapper singleton;
|
||||
static CrossCompartmentWrapper singletonWithPrototype;
|
||||
@ -137,12 +143,13 @@ class JS_FRIEND_API(SecurityWrapper) : public Base
|
||||
public:
|
||||
SecurityWrapper(unsigned flags);
|
||||
|
||||
virtual bool enter(JSContext *cx, JSObject *wrapper, jsid id, Wrapper::Action act,
|
||||
virtual bool enter(JSContext *cx, HandleObject wrapper, HandleId id, Wrapper::Action act,
|
||||
bool *bp) MOZ_OVERRIDE;
|
||||
virtual bool nativeCall(JSContext *cx, IsAcceptableThis test, NativeImpl impl,
|
||||
CallArgs args) MOZ_OVERRIDE;
|
||||
virtual bool objectClassIs(JSObject *obj, ESClassValue classValue, JSContext *cx) MOZ_OVERRIDE;
|
||||
virtual bool regexp_toShared(JSContext *cx, JSObject *proxy, RegExpGuard *g) MOZ_OVERRIDE;
|
||||
virtual bool objectClassIs(HandleObject obj, ESClassValue classValue,
|
||||
JSContext *cx) MOZ_OVERRIDE;
|
||||
virtual bool regexp_toShared(JSContext *cx, HandleObject proxy, RegExpGuard *g) MOZ_OVERRIDE;
|
||||
|
||||
/*
|
||||
* Allow our subclasses to select the superclass behavior they want without
|
||||
@ -172,22 +179,23 @@ class JS_FRIEND_API(DeadObjectProxy) : public BaseProxyHandler
|
||||
virtual bool getOwnPropertyNames(JSContext *cx, HandleObject wrapper,
|
||||
AutoIdVector &props) MOZ_OVERRIDE;
|
||||
virtual bool delete_(JSContext *cx, HandleObject wrapper, HandleId id, bool *bp) MOZ_OVERRIDE;
|
||||
virtual bool enumerate(JSContext *cx, JSObject *wrapper, AutoIdVector &props) MOZ_OVERRIDE;
|
||||
virtual bool enumerate(JSContext *cx, HandleObject wrapper, AutoIdVector &props) MOZ_OVERRIDE;
|
||||
|
||||
/* Spidermonkey extensions. */
|
||||
virtual bool call(JSContext *cx, JSObject *proxy, unsigned argc, Value *vp);
|
||||
virtual bool construct(JSContext *cx, JSObject *proxy, unsigned argc, Value *argv, Value *rval);
|
||||
virtual bool call(JSContext *cx, HandleObject proxy, unsigned argc, Value *vp);
|
||||
virtual bool construct(JSContext *cx, HandleObject proxy, unsigned argc,
|
||||
Value *argv, MutableHandleValue rval);
|
||||
virtual bool nativeCall(JSContext *cx, IsAcceptableThis test, NativeImpl impl,
|
||||
CallArgs args) MOZ_OVERRIDE;
|
||||
virtual bool hasInstance(JSContext *cx, HandleObject proxy, MutableHandleValue v, bool *bp);
|
||||
virtual bool objectClassIs(JSObject *obj, ESClassValue classValue, JSContext *cx);
|
||||
virtual JSString *obj_toString(JSContext *cx, JSObject *proxy);
|
||||
virtual JSString *fun_toString(JSContext *cx, JSObject *proxy, unsigned indent);
|
||||
virtual bool regexp_toShared(JSContext *cx, JSObject *proxy, RegExpGuard *g);
|
||||
virtual bool defaultValue(JSContext *cx, JSObject *obj, JSType hint, Value *vp);
|
||||
virtual bool getElementIfPresent(JSContext *cx, JSObject *obj, JSObject *receiver,
|
||||
uint32_t index, Value *vp, bool *present);
|
||||
virtual bool getPrototypeOf(JSContext *cx, JSObject *proxy, JSObject **protop);
|
||||
virtual bool objectClassIs(HandleObject obj, ESClassValue classValue, JSContext *cx);
|
||||
virtual JSString *obj_toString(JSContext *cx, HandleObject proxy);
|
||||
virtual JSString *fun_toString(JSContext *cx, HandleObject proxy, unsigned indent);
|
||||
virtual bool regexp_toShared(JSContext *cx, HandleObject proxy, RegExpGuard *g);
|
||||
virtual bool defaultValue(JSContext *cx, HandleObject obj, JSType hint, MutableHandleValue vp);
|
||||
virtual bool getElementIfPresent(JSContext *cx, HandleObject obj, HandleObject receiver,
|
||||
uint32_t index, MutableHandleValue vp, bool *present);
|
||||
virtual bool getPrototypeOf(JSContext *cx, HandleObject proxy, MutableHandleObject protop);
|
||||
|
||||
static DeadObjectProxy singleton;
|
||||
};
|
||||
|
@ -116,11 +116,11 @@ RegExpShared::isJITRuntimeEnabled(JSContext *cx)
|
||||
}
|
||||
|
||||
inline bool
|
||||
RegExpToShared(JSContext *cx, JSObject &obj, RegExpGuard *g)
|
||||
RegExpToShared(JSContext *cx, HandleObject obj, RegExpGuard *g)
|
||||
{
|
||||
if (obj.isRegExp())
|
||||
return obj.asRegExp().getShared(cx, g);
|
||||
return Proxy::regexp_toShared(cx, &obj, g);
|
||||
if (obj->isRegExp())
|
||||
return obj->asRegExp().getShared(cx, g);
|
||||
return Proxy::regexp_toShared(cx, obj, g);
|
||||
}
|
||||
|
||||
inline void
|
||||
|
@ -389,7 +389,7 @@ ParseRegExpFlags(JSContext *cx, JSString *flagStr, RegExpFlag *flagsOut);
|
||||
* to be the private of any RegExpObject.
|
||||
*/
|
||||
inline bool
|
||||
RegExpToShared(JSContext *cx, JSObject &obj, RegExpGuard *g);
|
||||
RegExpToShared(JSContext *cx, HandleObject obj, RegExpGuard *g);
|
||||
|
||||
template<XDRMode mode>
|
||||
bool
|
||||
|
@ -1136,7 +1136,7 @@ class DebugScopeProxy : public BaseProxyHandler
|
||||
* completed by handleUnaliasedAccess.
|
||||
*/
|
||||
bool handleUnaliasedAccess(JSContext *cx, Handle<DebugScopeObject*> debugScope, Handle<ScopeObject*> scope,
|
||||
jsid id, Action action, Value *vp)
|
||||
jsid id, Action action, MutableHandleValue vp)
|
||||
{
|
||||
JS_ASSERT(&debugScope->scope() == scope);
|
||||
AbstractFramePtr maybeframe = DebugScopes::hasLiveFrame(*scope);
|
||||
@ -1162,22 +1162,22 @@ class DebugScopeProxy : public BaseProxyHandler
|
||||
|
||||
if (maybeframe) {
|
||||
if (action == GET)
|
||||
*vp = maybeframe.unaliasedVar(i);
|
||||
vp.set(maybeframe.unaliasedVar(i));
|
||||
else
|
||||
maybeframe.unaliasedVar(i) = *vp;
|
||||
maybeframe.unaliasedVar(i) = vp;
|
||||
} else if (JSObject *snapshot = debugScope->maybeSnapshot()) {
|
||||
if (action == GET)
|
||||
*vp = snapshot->getDenseElement(bindings.numArgs() + i);
|
||||
vp.set(snapshot->getDenseElement(bindings.numArgs() + i));
|
||||
else
|
||||
snapshot->setDenseElement(bindings.numArgs() + i, *vp);
|
||||
snapshot->setDenseElement(bindings.numArgs() + i, vp);
|
||||
} else {
|
||||
/* The unaliased value has been lost to the debugger. */
|
||||
if (action == GET)
|
||||
*vp = UndefinedValue();
|
||||
vp.set(UndefinedValue());
|
||||
}
|
||||
|
||||
if (action == SET)
|
||||
TypeScript::SetLocal(cx, script, i, *vp);
|
||||
TypeScript::SetLocal(cx, script, i, vp);
|
||||
|
||||
} else {
|
||||
JS_ASSERT(bi->kind() == ARGUMENT);
|
||||
@ -1188,28 +1188,28 @@ class DebugScopeProxy : public BaseProxyHandler
|
||||
if (maybeframe) {
|
||||
if (script->argsObjAliasesFormals() && maybeframe.hasArgsObj()) {
|
||||
if (action == GET)
|
||||
*vp = maybeframe.argsObj().arg(i);
|
||||
vp.set(maybeframe.argsObj().arg(i));
|
||||
else
|
||||
maybeframe.argsObj().setArg(i, *vp);
|
||||
maybeframe.argsObj().setArg(i, vp);
|
||||
} else {
|
||||
if (action == GET)
|
||||
*vp = maybeframe.unaliasedFormal(i, DONT_CHECK_ALIASING);
|
||||
vp.set(maybeframe.unaliasedFormal(i, DONT_CHECK_ALIASING));
|
||||
else
|
||||
maybeframe.unaliasedFormal(i, DONT_CHECK_ALIASING) = *vp;
|
||||
maybeframe.unaliasedFormal(i, DONT_CHECK_ALIASING) = vp;
|
||||
}
|
||||
} else if (JSObject *snapshot = debugScope->maybeSnapshot()) {
|
||||
if (action == GET)
|
||||
*vp = snapshot->getDenseElement(i);
|
||||
vp.set(snapshot->getDenseElement(i));
|
||||
else
|
||||
snapshot->setDenseElement(i, *vp);
|
||||
snapshot->setDenseElement(i, vp);
|
||||
} else {
|
||||
/* The unaliased value has been lost to the debugger. */
|
||||
if (action == GET)
|
||||
*vp = UndefinedValue();
|
||||
vp.set(UndefinedValue());
|
||||
}
|
||||
|
||||
if (action == SET)
|
||||
TypeScript::SetArgument(cx, script, i, *vp);
|
||||
TypeScript::SetArgument(cx, script, i, vp);
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -1230,15 +1230,15 @@ class DebugScopeProxy : public BaseProxyHandler
|
||||
RawScript script = maybeframe.script();
|
||||
unsigned local = block->slotToLocalIndex(script->bindings, shape->slot());
|
||||
if (action == GET)
|
||||
*vp = maybeframe.unaliasedLocal(local);
|
||||
vp.set(maybeframe.unaliasedLocal(local));
|
||||
else
|
||||
maybeframe.unaliasedLocal(local) = *vp;
|
||||
maybeframe.unaliasedLocal(local) = vp;
|
||||
JS_ASSERT(analyze::LocalSlot(script, local) >= analyze::TotalSlots(script));
|
||||
} else {
|
||||
if (action == GET)
|
||||
*vp = block->var(i, DONT_CHECK_ALIASING);
|
||||
vp.set(block->var(i, DONT_CHECK_ALIASING));
|
||||
else
|
||||
block->setVar(i, *vp, DONT_CHECK_ALIASING);
|
||||
block->setVar(i, vp, DONT_CHECK_ALIASING);
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -1329,7 +1329,7 @@ class DebugScopeProxy : public BaseProxyHandler
|
||||
return true;
|
||||
}
|
||||
|
||||
Value v;
|
||||
RootedValue v(cx);
|
||||
if (handleUnaliasedAccess(cx, debugScope, scope, id, GET, &v)) {
|
||||
PodZero(desc);
|
||||
desc->obj = debugScope;
|
||||
@ -1341,48 +1341,35 @@ class DebugScopeProxy : public BaseProxyHandler
|
||||
return JS_GetPropertyDescriptorById(cx, scope, id, 0, desc);
|
||||
}
|
||||
|
||||
bool get(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid idArg, Value *vp) MOZ_OVERRIDE
|
||||
bool get(JSContext *cx, HandleObject proxy, HandleObject receiver, HandleId id,
|
||||
MutableHandleValue vp) MOZ_OVERRIDE
|
||||
{
|
||||
Rooted<DebugScopeObject*> debugScope(cx, &proxy->asDebugScope());
|
||||
Rooted<ScopeObject*> scope(cx, &proxy->asDebugScope().scope());
|
||||
RootedId id(cx, idArg);
|
||||
|
||||
ArgumentsObject *maybeArgsObj;
|
||||
if (!checkForMissingArguments(cx, id, *scope, &maybeArgsObj))
|
||||
return false;
|
||||
|
||||
if (maybeArgsObj) {
|
||||
*vp = ObjectValue(*maybeArgsObj);
|
||||
vp.set(ObjectValue(*maybeArgsObj));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (handleUnaliasedAccess(cx, debugScope, scope, id, GET, vp))
|
||||
return true;
|
||||
|
||||
RootedValue value(cx);
|
||||
if (!JSObject::getGeneric(cx, scope, scope, id, &value))
|
||||
return false;
|
||||
|
||||
*vp = value;
|
||||
return true;
|
||||
return JSObject::getGeneric(cx, scope, scope, id, vp);
|
||||
}
|
||||
|
||||
bool set(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid idArg, bool strict,
|
||||
Value *vp) MOZ_OVERRIDE
|
||||
bool set(JSContext *cx, HandleObject proxy, HandleObject receiver, HandleId id, bool strict,
|
||||
MutableHandleValue vp) MOZ_OVERRIDE
|
||||
{
|
||||
Rooted<DebugScopeObject*> debugScope(cx, &proxy->asDebugScope());
|
||||
Rooted<ScopeObject*> scope(cx, &proxy->asDebugScope().scope());
|
||||
RootedId id(cx, idArg);
|
||||
|
||||
if (handleUnaliasedAccess(cx, debugScope, scope, id, SET, vp))
|
||||
return true;
|
||||
|
||||
RootedValue value(cx, *vp);
|
||||
if (!JSObject::setGeneric(cx, scope, scope, id, &value, strict))
|
||||
return false;
|
||||
|
||||
*vp = value;
|
||||
return true;
|
||||
return JSObject::setGeneric(cx, scope, scope, id, vp, strict);
|
||||
}
|
||||
|
||||
bool defineProperty(JSContext *cx, HandleObject proxy, HandleId id,
|
||||
@ -1400,7 +1387,8 @@ class DebugScopeProxy : public BaseProxyHandler
|
||||
desc->attrs);
|
||||
}
|
||||
|
||||
bool getScopePropertyNames(JSContext *cx, JSObject *proxy, AutoIdVector &props, unsigned flags)
|
||||
bool getScopePropertyNames(JSContext *cx, HandleObject proxy, AutoIdVector &props,
|
||||
unsigned flags)
|
||||
{
|
||||
Rooted<ScopeObject*> scope(cx, &proxy->asDebugScope().scope());
|
||||
|
||||
@ -1432,12 +1420,12 @@ class DebugScopeProxy : public BaseProxyHandler
|
||||
return getScopePropertyNames(cx, proxy, props, JSITER_OWNONLY);
|
||||
}
|
||||
|
||||
bool enumerate(JSContext *cx, JSObject *proxy, AutoIdVector &props) MOZ_OVERRIDE
|
||||
bool enumerate(JSContext *cx, HandleObject proxy, AutoIdVector &props) MOZ_OVERRIDE
|
||||
{
|
||||
return getScopePropertyNames(cx, proxy, props, 0);
|
||||
}
|
||||
|
||||
bool has(JSContext *cx, JSObject *proxy, jsid id, bool *bp) MOZ_OVERRIDE
|
||||
bool has(JSContext *cx, HandleObject proxy, HandleId id, bool *bp) MOZ_OVERRIDE
|
||||
{
|
||||
ScopeObject &scopeObj = proxy->asDebugScope().scope();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user