From 2bbbec43e9b6da3acc6ce49deaaf151036f628a1 Mon Sep 17 00:00:00 2001 From: Jon Coppeard Date: Tue, 21 Jan 2014 10:44:39 +0000 Subject: [PATCH] Bug 961095 - Improve generic callbacks with better typing, and by only adding storebuffer entries when the key is in the nursery r=terrence --- dom/plugins/base/nsJSNPRuntime.cpp | 3 +-- js/ipc/JavaScriptShared.cpp | 5 ++--- js/ipc/JavaScriptShared.h | 2 +- js/src/ctypes/CTypes.cpp | 7 +++---- js/src/gc/StoreBuffer.h | 12 +++++++----- js/src/jsfriendapi.cpp | 12 ++++++++---- js/src/jsfriendapi.h | 8 ++++---- js/xpconnect/src/XPCMaps.h | 10 ++++------ 8 files changed, 30 insertions(+), 29 deletions(-) diff --git a/dom/plugins/base/nsJSNPRuntime.cpp b/dom/plugins/base/nsJSNPRuntime.cpp index 506d5ca3f92..b4597181e5c 100644 --- a/dom/plugins/base/nsJSNPRuntime.cpp +++ b/dom/plugins/base/nsJSNPRuntime.cpp @@ -943,8 +943,7 @@ nsJSObjWrapper::NP_Construct(NPObject *npobj, const NPVariant *args, * been finalized if all wrappers have died. */ static void -JSObjWrapperKeyMarkCallback(JSTracer *trc, void *key, void *data) { - JSObject *obj = static_cast(key); +JSObjWrapperKeyMarkCallback(JSTracer *trc, JSObject *obj, void *data) { NPP npp = static_cast(data); if (!sJSObjWrappers.initialized()) return; diff --git a/js/ipc/JavaScriptShared.cpp b/js/ipc/JavaScriptShared.cpp index aa823f9f19d..7c94b23905c 100644 --- a/js/ipc/JavaScriptShared.cpp +++ b/js/ipc/JavaScriptShared.cpp @@ -111,9 +111,8 @@ ObjectIdCache::add(JSContext *cx, JSObject *obj, ObjectId id) * been moved. */ /* static */ void -ObjectIdCache::keyMarkCallback(JSTracer *trc, void *keyArg, void *dataArg) { - JSObject *key = static_cast(keyArg); - ObjectIdTable* table = static_cast(dataArg); +ObjectIdCache::keyMarkCallback(JSTracer *trc, JSObject *key, void *data) { + ObjectIdTable* table = static_cast(data); JSObject *prior = key; JS_CallObjectTracer(trc, &key, "ObjectIdCache::table_ key"); table->rekeyIfMoved(prior, key); diff --git a/js/ipc/JavaScriptShared.h b/js/ipc/JavaScriptShared.h index 0316be50ab8..6a78b0a0e23 100644 --- a/js/ipc/JavaScriptShared.h +++ b/js/ipc/JavaScriptShared.h @@ -75,7 +75,7 @@ class ObjectIdCache void remove(JSObject *obj); private: - static void keyMarkCallback(JSTracer *trc, void *key, void *data); + static void keyMarkCallback(JSTracer *trc, JSObject *key, void *data); ObjectIdTable *table_; }; diff --git a/js/src/ctypes/CTypes.cpp b/js/src/ctypes/CTypes.cpp index d6f09200582..9bc0e013fe3 100644 --- a/js/src/ctypes/CTypes.cpp +++ b/js/src/ctypes/CTypes.cpp @@ -4761,16 +4761,15 @@ StructType::Create(JSContext* cx, unsigned argc, jsval* vp) } static void -PostBarrierCallback(JSTracer *trc, void *k, void *d) +PostBarrierCallback(JSTracer *trc, JSString *key, void *data) { typedef HashMap UnbarrieredFieldInfoHash; - JSString *prior = static_cast(k); - UnbarrieredFieldInfoHash *table = reinterpret_cast(d); - JSString *key = prior; + UnbarrieredFieldInfoHash *table = reinterpret_cast(data); + JSString *prior = key; JS_CallStringTracer(trc, &key, "CType fieldName"); table->rekeyIfMoved(JS_ASSERT_STRING_IS_FLAT(prior), JS_ASSERT_STRING_IS_FLAT(key)); } diff --git a/js/src/gc/StoreBuffer.h b/js/src/gc/StoreBuffer.h index 6b1c0342115..7082ca45e77 100644 --- a/js/src/gc/StoreBuffer.h +++ b/js/src/gc/StoreBuffer.h @@ -331,12 +331,13 @@ class StoreBuffer void mark(JSTracer *trc); }; + template class CallbackRef : public BufferableRef { public: - typedef void (*MarkCallback)(JSTracer *trc, void *key, void *data); + typedef void (*MarkCallback)(JSTracer *trc, Key *key, void *data); - CallbackRef(MarkCallback cb, void *k, void *d) : callback(cb), key(k), data(d) {} + CallbackRef(MarkCallback cb, Key *k, void *d) : callback(cb), key(k), data(d) {} virtual void mark(JSTracer *trc) { callback(trc, key, data); @@ -344,7 +345,7 @@ class StoreBuffer private: MarkCallback callback; - void *key; + Key *key; void *data; }; @@ -441,8 +442,9 @@ class StoreBuffer void putGeneric(const T &t) { put(bufferGeneric, t);} /* Insert or update a callback entry. */ - void putCallback(CallbackRef::MarkCallback callback, Cell *key, void *data) { - put(bufferGeneric, CallbackRef(callback, key, data)); + template + void putCallback(void (*callback)(JSTracer *trc, Key *key, void *data), Key *key, void *data) { + put(bufferGeneric, CallbackRef(callback, key, data)); } /* Mark the source of all edges in the store buffer. */ diff --git a/js/src/jsfriendapi.cpp b/js/src/jsfriendapi.cpp index 50581214667..600ed0955f0 100644 --- a/js/src/jsfriendapi.cpp +++ b/js/src/jsfriendapi.cpp @@ -1227,17 +1227,21 @@ js::IsInRequest(JSContext *cx) #ifdef JSGC_GENERATIONAL JS_FRIEND_API(void) JS_StoreObjectPostBarrierCallback(JSContext* cx, - void (*callback)(JSTracer *trc, void *key, void *data), + void (*callback)(JSTracer *trc, JSObject *key, void *data), JSObject *key, void *data) { - cx->runtime()->gcStoreBuffer.putCallback(callback, key, data); + JSRuntime *rt = cx->runtime(); + if (IsInsideNursery(rt, key)) + rt->gcStoreBuffer.putCallback(callback, key, data); } extern JS_FRIEND_API(void) JS_StoreStringPostBarrierCallback(JSContext* cx, - void (*callback)(JSTracer *trc, void *key, void *data), + void (*callback)(JSTracer *trc, JSString *key, void *data), JSString *key, void *data) { - cx->runtime()->gcStoreBuffer.putCallback(callback, key, data); + JSRuntime *rt = cx->runtime(); + if (IsInsideNursery(rt, key)) + rt->gcStoreBuffer.putCallback(callback, key, data); } #endif /* JSGC_GENERATIONAL */ diff --git a/js/src/jsfriendapi.h b/js/src/jsfriendapi.h index 07bf263958b..fbe8d49f394 100644 --- a/js/src/jsfriendapi.h +++ b/js/src/jsfriendapi.h @@ -1892,22 +1892,22 @@ js_ReportIsNotFunction(JSContext *cx, JS::HandleValue v); #ifdef JSGC_GENERATIONAL extern JS_FRIEND_API(void) JS_StoreObjectPostBarrierCallback(JSContext* cx, - void (*callback)(JSTracer *trc, void *key, void *data), + void (*callback)(JSTracer *trc, JSObject *key, void *data), JSObject *key, void *data); extern JS_FRIEND_API(void) JS_StoreStringPostBarrierCallback(JSContext* cx, - void (*callback)(JSTracer *trc, void *key, void *data), + void (*callback)(JSTracer *trc, JSString *key, void *data), JSString *key, void *data); #else inline void JS_StoreObjectPostBarrierCallback(JSContext* cx, - void (*callback)(JSTracer *trc, void *key, void *data), + void (*callback)(JSTracer *trc, JSObject *key, void *data), JSObject *key, void *data) {} inline void JS_StoreStringPostBarrierCallback(JSContext* cx, - void (*callback)(JSTracer *trc, void *key, void *data), + void (*callback)(JSTracer *trc, JSString *key, void *data), JSString *key, void *data) {} #endif /* JSGC_GENERATIONAL */ diff --git a/js/xpconnect/src/XPCMaps.h b/js/xpconnect/src/XPCMaps.h index 205df02340d..da6bed59b8f 100644 --- a/js/xpconnect/src/XPCMaps.h +++ b/js/xpconnect/src/XPCMaps.h @@ -85,9 +85,8 @@ private: * This function is called during minor GCs for each key in the HashMap that * has been moved. */ - static void KeyMarkCallback(JSTracer *trc, void *k, void *d) { - JSObject *key = static_cast(k); - JSObject2WrappedJSMap* self = static_cast(d); + static void KeyMarkCallback(JSTracer *trc, JSObject *key, void *data) { + JSObject2WrappedJSMap* self = static_cast(data); JSObject *prior = key; JS_CallObjectTracer(trc, &key, "XPCJSRuntime::mWrappedJSMap key"); self->mTable.rekeyIfMoved(prior, key); @@ -694,7 +693,7 @@ private: * This function is called during minor GCs for each key in the HashMap that * has been moved. */ - static void KeyMarkCallback(JSTracer *trc, void *k, void *d) { + static void KeyMarkCallback(JSTracer *trc, JSObject *key, void *data) { /* * To stop the barriers on the values of mTable firing while we are * marking the store buffer, we cast the table to one that is @@ -702,10 +701,9 @@ private: */ typedef js::HashMap, js::SystemAllocPolicy> UnbarrieredMap; - JSObject2JSObjectMap *self = static_cast(d); + JSObject2JSObjectMap *self = static_cast(data); UnbarrieredMap &table = reinterpret_cast(self->mTable); - JSObject *key = static_cast(k); JSObject *prior = key; JS_CallObjectTracer(trc, &key, "XPCWrappedNativeScope::mWaiverWrapperMap key"); table.rekeyIfMoved(prior, key);