Bug 828607 - Fix exact rooting in jsproxy; r=evilpie

--HG--
rename : extensions/cookie/test/frame_clear_browser_data.html => dom/tests/mochitest/localstorage/frame_clear_browser_data.html
rename : extensions/cookie/test/test_app_cleardata_permissions.html => extensions/cookie/test/test_app_uninstall_permissions.html
rename : services/crypto/cryptoComponents.manifest => services/sync/SyncComponents.manifest
rename : toolkit/components/passwordmgr/test/test_privbrowsing_perwindowpb.html => toolkit/components/passwordmgr/test/test_privbrowsing.html
extra : rebase_source : 60c8a3c9390572c40c817d4d6e1e21056920e046
This commit is contained in:
Terrence Cole 2013-01-08 10:27:50 -08:00
Родитель 1e1a3187d9
Коммит 83418c4ac8
2 изменённых файлов: 27 добавлений и 21 удалений

Просмотреть файл

@ -28,6 +28,8 @@
#include "vm/ObjectImpl.h" #include "vm/ObjectImpl.h"
#include "vm/String.h" #include "vm/String.h"
ForwardDeclareJS(Object);
namespace JS { namespace JS {
struct ObjectsExtraSizes; struct ObjectsExtraSizes;
} }

Просмотреть файл

@ -27,14 +27,14 @@ using namespace js;
using namespace js::gc; using namespace js::gc;
static inline HeapSlot & static inline HeapSlot &
GetCall(JSObject *proxy) GetCall(UnrootedObject proxy)
{ {
JS_ASSERT(IsFunctionProxy(proxy)); JS_ASSERT(IsFunctionProxy(proxy));
return proxy->getSlotRef(JSSLOT_PROXY_CALL); return proxy->getSlotRef(JSSLOT_PROXY_CALL);
} }
static inline Value static inline Value
GetConstruct(JSObject *proxy) GetConstruct(UnrootedObject proxy)
{ {
if (proxy->slotSpan() <= JSSLOT_PROXY_CONSTRUCT) if (proxy->slotSpan() <= JSSLOT_PROXY_CONSTRUCT)
return UndefinedValue(); return UndefinedValue();
@ -42,7 +42,7 @@ GetConstruct(JSObject *proxy)
} }
static inline HeapSlot & static inline HeapSlot &
GetFunctionProxyConstruct(JSObject *proxy) GetFunctionProxyConstruct(UnrootedObject proxy)
{ {
JS_ASSERT(IsFunctionProxy(proxy)); JS_ASSERT(IsFunctionProxy(proxy));
JS_ASSERT(proxy->slotSpan() > JSSLOT_PROXY_CONSTRUCT); JS_ASSERT(proxy->slotSpan() > JSSLOT_PROXY_CONSTRUCT);
@ -60,8 +60,10 @@ BaseProxyHandler::~BaseProxyHandler()
} }
bool bool
BaseProxyHandler::has(JSContext *cx, JSObject *proxy, jsid id, bool *bp) BaseProxyHandler::has(JSContext *cx, JSObject *proxy_, jsid id_, bool *bp)
{ {
RootedObject proxy(cx, proxy_);
RootedId id(cx, id_);
AutoPropertyDescriptorRooter desc(cx); AutoPropertyDescriptorRooter desc(cx);
if (!getPropertyDescriptor(cx, proxy, id, &desc, 0)) if (!getPropertyDescriptor(cx, proxy, id, &desc, 0))
return false; return false;
@ -70,8 +72,10 @@ BaseProxyHandler::has(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
} }
bool bool
BaseProxyHandler::hasOwn(JSContext *cx, JSObject *proxy, jsid id, bool *bp) BaseProxyHandler::hasOwn(JSContext *cx, JSObject *proxy_, jsid id_, bool *bp)
{ {
RootedObject proxy(cx, proxy_);
RootedId id(cx, id_);
AutoPropertyDescriptorRooter desc(cx); AutoPropertyDescriptorRooter desc(cx);
if (!getOwnPropertyDescriptor(cx, proxy, id, &desc, 0)) if (!getOwnPropertyDescriptor(cx, proxy, id, &desc, 0))
return false; return false;
@ -270,10 +274,11 @@ BaseProxyHandler::call(JSContext *cx, JSObject *proxy, unsigned argc,
} }
bool bool
BaseProxyHandler::construct(JSContext *cx, JSObject *proxy, unsigned argc, BaseProxyHandler::construct(JSContext *cx, JSObject *proxy_, unsigned argc,
Value *argv, Value *rval) Value *argv, Value *rval)
{ {
Value fval = GetConstruct(proxy); RootedObject proxy(cx, proxy_);
RootedValue fval(cx, GetConstruct(proxy_));
if (fval.isUndefined()) if (fval.isUndefined())
fval = GetCall(proxy); fval = GetCall(proxy);
return InvokeConstructor(cx, fval, argc, argv, rval); return InvokeConstructor(cx, fval, argc, argv, rval);
@ -1646,7 +1651,7 @@ ScriptedDirectProxyHandler::getOwnPropertyNames(JSContext *cx, JSObject *proxy_,
// step d // step d
if (trap.isUndefined()) if (trap.isUndefined())
return DirectProxyHandler::getOwnPropertyNames(cx, proxy_, props); return DirectProxyHandler::getOwnPropertyNames(cx, proxy, props);
// step e // step e
Value argv[] = { Value argv[] = {
@ -1687,7 +1692,7 @@ ScriptedDirectProxyHandler::delete_(JSContext *cx, JSObject *proxy_, jsid id_, b
// step 4 // step 4
if (trap.isUndefined()) if (trap.isUndefined())
return DirectProxyHandler::delete_(cx, proxy_, id_, bp); return DirectProxyHandler::delete_(cx, proxy, id, bp);
// step 5 // step 5
RootedValue value(cx); RootedValue value(cx);
@ -1741,7 +1746,7 @@ ScriptedDirectProxyHandler::enumerate(JSContext *cx, JSObject *proxy_, AutoIdVec
// step d // step d
if (trap.isUndefined()) if (trap.isUndefined())
return DirectProxyHandler::enumerate(cx, proxy_, props); return DirectProxyHandler::enumerate(cx, proxy, props);
// step e // step e
Value argv[] = { Value argv[] = {
@ -1787,7 +1792,7 @@ ScriptedDirectProxyHandler::has(JSContext *cx, JSObject *proxy_, jsid id_, bool
// step 4 // step 4
if (trap.isUndefined()) if (trap.isUndefined())
return DirectProxyHandler::has(cx, proxy_, id_, bp); return DirectProxyHandler::has(cx, proxy, id, bp);
// step 5 // step 5
RootedValue value(cx); RootedValue value(cx);
@ -1850,7 +1855,7 @@ ScriptedDirectProxyHandler::hasOwn(JSContext *cx, JSObject *proxy_, jsid id_, bo
// step 4 // step 4
if (trap.isUndefined()) if (trap.isUndefined())
return DirectProxyHandler::hasOwn(cx, proxy_, id_, bp); return DirectProxyHandler::hasOwn(cx, proxy, id, bp);
// step 5 // step 5
RootedValue value(cx); RootedValue value(cx);
@ -1923,7 +1928,7 @@ ScriptedDirectProxyHandler::get(JSContext *cx, JSObject *proxy_, JSObject *recei
// step 4 // step 4
if (trap.isUndefined()) if (trap.isUndefined())
return DirectProxyHandler::get(cx, proxy_, receiver_, id_, vp); return DirectProxyHandler::get(cx, proxy, receiver, id, vp);
// step 5 // step 5
RootedValue value(cx); RootedValue value(cx);
@ -1996,7 +2001,7 @@ ScriptedDirectProxyHandler::set(JSContext *cx, JSObject *proxy_, JSObject *recei
// step 4 // step 4
if (trap.isUndefined()) if (trap.isUndefined())
return DirectProxyHandler::set(cx, proxy_, receiver_, id_, strict, vp); return DirectProxyHandler::set(cx, proxy, receiver, id, strict, vp);
// step 5 // step 5
RootedValue value(cx); RootedValue value(cx);
@ -2066,7 +2071,7 @@ ScriptedDirectProxyHandler::keys(JSContext *cx, JSObject *proxy_, AutoIdVector &
// step d // step d
if (trap.isUndefined()) if (trap.isUndefined())
return DirectProxyHandler::keys(cx, proxy_, props); return DirectProxyHandler::keys(cx, proxy, props);
// step e // step e
Value argv[] = { Value argv[] = {
@ -2126,7 +2131,7 @@ ScriptedDirectProxyHandler::call(JSContext *cx, JSObject *proxy_, unsigned argc,
// step 5 // step 5
if (trap.isUndefined()) if (trap.isUndefined())
return DirectProxyHandler::call(cx, proxy_, argc, vp); return DirectProxyHandler::call(cx, proxy, argc, vp);
// step 6 // step 6
Value argv[] = { Value argv[] = {
@ -2167,7 +2172,7 @@ ScriptedDirectProxyHandler::construct(JSContext *cx, JSObject *proxy_, unsigned
// step 5 // step 5
if (trap.isUndefined()) if (trap.isUndefined())
return DirectProxyHandler::construct(cx, proxy_, argc, argv, rval); return DirectProxyHandler::construct(cx, proxy, argc, argv, rval);
// step 6 // step 6
Value constructArgv[] = { Value constructArgv[] = {
@ -2991,7 +2996,7 @@ JS_FRIEND_DATA(Class) js::OuterWindowProxyClass = {
static JSBool static JSBool
proxy_Call(JSContext *cx, unsigned argc, Value *vp) proxy_Call(JSContext *cx, unsigned argc, Value *vp)
{ {
JSObject *proxy = &JS_CALLEE(cx, vp).toObject(); RootedObject proxy(cx, &JS_CALLEE(cx, vp).toObject());
JS_ASSERT(proxy->isProxy()); JS_ASSERT(proxy->isProxy());
return Proxy::call(cx, proxy, argc, vp); return Proxy::call(cx, proxy, argc, vp);
} }
@ -2999,10 +3004,9 @@ proxy_Call(JSContext *cx, unsigned argc, Value *vp)
static JSBool static JSBool
proxy_Construct(JSContext *cx, unsigned argc, Value *vp) proxy_Construct(JSContext *cx, unsigned argc, Value *vp)
{ {
JSObject *proxy = &JS_CALLEE(cx, vp).toObject(); RootedObject proxy(cx, &JS_CALLEE(cx, vp).toObject());
JS_ASSERT(proxy->isProxy()); JS_ASSERT(proxy->isProxy());
bool ok = Proxy::construct(cx, proxy, argc, JS_ARGV(cx, vp), vp); return Proxy::construct(cx, proxy, argc, JS_ARGV(cx, vp), vp);
return ok;
} }
JS_FRIEND_DATA(Class) js::FunctionProxyClass = { JS_FRIEND_DATA(Class) js::FunctionProxyClass = {