Bug 1249698 - Use parent stack instead of vanished child stack. r=billm

MozReview-Commit-ID: LaX5K1uPZo9

--HG--
extra : transplant_source : 7o%A6C%21%D1H1%C3%3Dn%E6%5E%B4%E5%D6%A3%21E%A6
This commit is contained in:
Wei-Cheng Pan 2016-07-26 18:30:42 +08:00
parent 6ea345bfbe
commit d4d6f8ed60
4 changed files with 40 additions and 20 deletions

View File

@ -99,6 +99,10 @@ struct ReturnStopIteration
{
};
struct ReturnDeadCPOW
{
};
struct ReturnException
{
JSVariant exn;
@ -113,6 +117,7 @@ union ReturnStatus
{
ReturnSuccess;
ReturnStopIteration;
ReturnDeadCPOW;
ReturnException;
ReturnObjectOpResult;
};

View File

@ -73,6 +73,15 @@ WrapperAnswer::ok(ReturnStatus* rs, const JS::ObjectOpResult& result)
return true;
}
bool
WrapperAnswer::deadCPOW(AutoJSAPI& jsapi, ReturnStatus* rs)
{
JSContext* cx = jsapi.cx();
JS_ClearPendingException(cx);
*rs = ReturnStatus(ReturnDeadCPOW());
return true;
}
bool
WrapperAnswer::RecvPreventExtensions(const ObjectId& objId, ReturnStatus* rs)
{
@ -83,7 +92,7 @@ WrapperAnswer::RecvPreventExtensions(const ObjectId& objId, ReturnStatus* rs)
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(jsapi, rs);
return deadCPOW(jsapi, rs);
ObjectOpResult success;
if (!JS_PreventExtensions(cx, obj, success))
@ -115,7 +124,7 @@ WrapperAnswer::RecvGetPropertyDescriptor(const ObjectId& objId, const JSIDVarian
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(jsapi, rs);
return deadCPOW(jsapi, rs);
LOG("%s.getPropertyDescriptor(%s)", ReceiverObj(objId), Identifier(idVar));
@ -145,7 +154,7 @@ WrapperAnswer::RecvGetOwnPropertyDescriptor(const ObjectId& objId, const JSIDVar
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(jsapi, rs);
return deadCPOW(jsapi, rs);
LOG("%s.getOwnPropertyDescriptor(%s)", ReceiverObj(objId), Identifier(idVar));
@ -174,7 +183,7 @@ WrapperAnswer::RecvDefineProperty(const ObjectId& objId, const JSIDVariant& idVa
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(jsapi, rs);
return deadCPOW(jsapi, rs);
LOG("define %s[%s]", ReceiverObj(objId), Identifier(idVar));
@ -202,7 +211,7 @@ WrapperAnswer::RecvDelete(const ObjectId& objId, const JSIDVariant& idVar, Retur
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(jsapi, rs);
return deadCPOW(jsapi, rs);
LOG("delete %s[%s]", ReceiverObj(objId), Identifier(idVar));
@ -228,7 +237,7 @@ WrapperAnswer::RecvHas(const ObjectId& objId, const JSIDVariant& idVar, ReturnSt
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(jsapi, rs);
return deadCPOW(jsapi, rs);
LOG("%s.has(%s)", ReceiverObj(objId), Identifier(idVar));
@ -253,7 +262,7 @@ WrapperAnswer::RecvHasOwn(const ObjectId& objId, const JSIDVariant& idVar, Retur
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(jsapi, rs);
return deadCPOW(jsapi, rs);
LOG("%s.hasOwn(%s)", ReceiverObj(objId), Identifier(idVar));
@ -281,7 +290,7 @@ WrapperAnswer::RecvGet(const ObjectId& objId, const JSVariant& receiverVar,
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(aes, rs);
return deadCPOW(aes, rs);
RootedValue receiver(cx);
if (!fromVariant(cx, receiverVar, &receiver))
@ -314,7 +323,7 @@ WrapperAnswer::RecvSet(const ObjectId& objId, const JSIDVariant& idVar, const JS
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(aes, rs);
return deadCPOW(aes, rs);
LOG("set %s[%s] = %s", ReceiverObj(objId), Identifier(idVar), InVariant(value));
@ -348,7 +357,7 @@ WrapperAnswer::RecvIsExtensible(const ObjectId& objId, ReturnStatus* rs, bool* r
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(jsapi, rs);
return deadCPOW(jsapi, rs);
LOG("%s.isExtensible()", ReceiverObj(objId));
@ -378,7 +387,7 @@ WrapperAnswer::RecvCallOrConstruct(const ObjectId& objId,
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(aes, rs);
return deadCPOW(aes, rs);
MOZ_ASSERT(argv.Length() >= 2);
@ -473,7 +482,7 @@ WrapperAnswer::RecvHasInstance(const ObjectId& objId, const JSVariant& vVar, Ret
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(jsapi, rs);
return deadCPOW(jsapi, rs);
LOG("%s.hasInstance(%s)", ReceiverObj(objId), InVariant(vVar));
@ -500,7 +509,7 @@ WrapperAnswer::RecvGetBuiltinClass(const ObjectId& objId, ReturnStatus* rs,
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(jsapi, rs);
return deadCPOW(jsapi, rs);
LOG("%s.getBuiltinClass()", ReceiverObj(objId));
@ -525,7 +534,7 @@ WrapperAnswer::RecvIsArray(const ObjectId& objId, ReturnStatus* rs,
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(jsapi, rs);
return deadCPOW(jsapi, rs);
LOG("%s.isArray()", ReceiverObj(objId));
@ -570,7 +579,7 @@ WrapperAnswer::RecvGetPrototype(const ObjectId& objId, ReturnStatus* rs, ObjectO
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(jsapi, rs);
return deadCPOW(jsapi, rs);
JS::RootedObject proto(cx);
if (!JS_GetPrototype(cx, obj, &proto))
@ -598,7 +607,7 @@ WrapperAnswer::RecvGetPrototypeIfOrdinary(const ObjectId& objId, ReturnStatus* r
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(jsapi, rs);
return deadCPOW(jsapi, rs);
JS::RootedObject proto(cx);
if (!JS_GetPrototypeIfOrdinary(cx, obj, isOrdinary, &proto))
@ -623,7 +632,7 @@ WrapperAnswer::RecvRegExpToShared(const ObjectId& objId, ReturnStatus* rs,
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(jsapi, rs);
return deadCPOW(jsapi, rs);
RootedString sourceJSStr(cx, JS_GetRegExpSource(cx, obj));
if (!sourceJSStr)
@ -649,7 +658,7 @@ WrapperAnswer::RecvGetPropertyKeys(const ObjectId& objId, const uint32_t& flags,
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(jsapi, rs);
return deadCPOW(jsapi, rs);
LOG("%s.getPropertyKeys()", ReceiverObj(objId));
@ -681,7 +690,7 @@ WrapperAnswer::RecvInstanceOf(const ObjectId& objId, const JSIID& iid, ReturnSta
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(jsapi, rs);
return deadCPOW(jsapi, rs);
LOG("%s.instanceOf()", ReceiverObj(objId));
@ -707,7 +716,7 @@ WrapperAnswer::RecvDOMInstanceOf(const ObjectId& objId, const int& prototypeID,
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
return fail(jsapi, rs);
return deadCPOW(jsapi, rs);
LOG("%s.domInstanceOf()", ReceiverObj(objId));

View File

@ -73,6 +73,7 @@ class WrapperAnswer : public virtual JavaScriptShared
bool fail(dom::AutoJSAPI& jsapi, ReturnStatus* rs);
bool ok(ReturnStatus* rs);
bool ok(ReturnStatus* rs, const JS::ObjectOpResult& result);
bool deadCPOW(dom::AutoJSAPI& jsapi, ReturnStatus* rs);
};
} // namespace jsipc

View File

@ -1076,6 +1076,11 @@ WrapperOwner::ok(JSContext* cx, const ReturnStatus& status)
if (status.type() == ReturnStatus::TReturnStopIteration)
return JS_ThrowStopIteration(cx);
if (status.type() == ReturnStatus::TReturnDeadCPOW) {
JS_ReportError(cx, "operation not possible on dead CPOW");
return false;
}
RootedValue exn(cx);
if (!fromVariant(cx, status.get_ReturnException().exn(), &exn))
return false;