Bug 828462 - Root Proxy/Wrapper rests in js/src. r=terrence

This commit is contained in:
Tom Schuster 2013-03-21 23:23:48 +01:00
parent 787f786f96
commit b4f8d32afe
12 changed files with 390 additions and 500 deletions

View File

@ -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);

View File

@ -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 */

View File

@ -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();

View File

@ -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

View File

@ -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;
};

View File

@ -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);

View File

@ -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;
}

View File

@ -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;
};

View File

@ -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

View File

@ -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

View File

@ -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();