From 6fd0a55cc77469570af4bdacadd4d2141511ccda Mon Sep 17 00:00:00 2001 From: Andreas Gal Date: Wed, 7 Apr 2010 17:14:38 -0700 Subject: [PATCH] Remove gcIteratorTable (557914, r=Waldo). --- js/src/jscntxt.h | 6 ------ js/src/jsgc.cpp | 37 ------------------------------------- js/src/jsiter.cpp | 22 ++++++++++++++++------ js/src/jsiter.h | 12 ------------ 4 files changed, 16 insertions(+), 61 deletions(-) diff --git a/js/src/jscntxt.h b/js/src/jscntxt.h index 38175a5bca57..6cac5b811912 100644 --- a/js/src/jscntxt.h +++ b/js/src/jscntxt.h @@ -795,12 +795,6 @@ struct JSRuntime { size_t gcMarkLaterCount; #endif - /* - * Table for tracking iterators to ensure that we close iterator's state - * before finalizing the iterable object. - */ - js::Vector gcIteratorTable; - /* * The trace operation and its data argument to trace embedding-specific * GC roots. diff --git a/js/src/jsgc.cpp b/js/src/jsgc.cpp index 895b7104cb2b..d1681861d299 100644 --- a/js/src/jsgc.cpp +++ b/js/src/jsgc.cpp @@ -1149,7 +1149,6 @@ js_FinishGC(JSRuntime *rt) js_DumpGCStats(rt, stdout); #endif - rt->gcIteratorTable.clear(); FinishGCArenaLists(rt); if (rt->gcRootsHash.ops) { @@ -1336,39 +1335,6 @@ js_MapGCRoots(JSRuntime *rt, JSGCRootMapFun map, void *data) return rv; } -JSBool -js_RegisterCloseableIterator(JSContext *cx, JSObject *obj) -{ - JSRuntime *rt; - JSBool ok; - - rt = cx->runtime; - JS_ASSERT(!rt->gcRunning); - - JS_LOCK_GC(rt); - ok = rt->gcIteratorTable.append(obj); - JS_UNLOCK_GC(rt); - return ok; -} - -static void -CloseNativeIterators(JSContext *cx) -{ - JSRuntime *rt = cx->runtime; - size_t length = rt->gcIteratorTable.length(); - JSObject **array = rt->gcIteratorTable.begin(); - - size_t newLength = 0; - for (size_t i = 0; i < length; ++i) { - JSObject *obj = array[i]; - if (js_IsAboutToBeFinalized(obj)) - js_CloseNativeIterator(cx, obj); - else - array[newLength++] = obj; - } - rt->gcIteratorTable.resize(newLength); -} - void JSRuntime::setGCTriggerFactor(uint32 factor) { @@ -3217,9 +3183,6 @@ js_GC(JSContext *cx, JSGCInvocationKind gckind) TIMESTAMP(gcTimer.startSweep); js_SweepAtomState(cx); - /* Finalize iterator states before the objects they iterate over. */ - CloseNativeIterators(cx); - /* Finalize watch points associated with unreachable objects. */ js_SweepWatchPoints(cx); diff --git a/js/src/jsiter.cpp b/js/src/jsiter.cpp index 9a7b03a0be11..3341c91d7822 100644 --- a/js/src/jsiter.cpp +++ b/js/src/jsiter.cpp @@ -74,6 +74,12 @@ using namespace js; +/* + * Native iterator object slots. + */ +const uint32 JSSLOT_ITER_STATE = JSSLOT_PRIVATE; +const uint32 JSSLOT_ITER_FLAGS = JSSLOT_PRIVATE + 1; + JS_STATIC_ASSERT(JSSLOT_ITER_FLAGS < JS_INITIAL_NSLOTS); #if JS_HAS_GENERATORS @@ -87,8 +93,8 @@ CloseGenerator(JSContext *cx, JSObject *genobj); * Shared code to close iterator's state either through an explicit call or * when GC detects that the iterator is no longer reachable. */ -void -js_CloseNativeIterator(JSContext *cx, JSObject *iterobj) +static void +CloseNativeIterator(JSContext *cx, JSObject *iterobj) { jsval state; JSObject *iterable; @@ -115,6 +121,12 @@ js_CloseNativeIterator(JSContext *cx, JSObject *iterobj) iterobj->setSlot(JSSLOT_ITER_STATE, JSVAL_NULL); } +static void +iterator_finalize(JSContext *cx, JSObject *obj) +{ + CloseNativeIterator(cx, obj); +} + static void iterator_trace(JSTracer *trc, JSObject *obj) { @@ -139,7 +151,7 @@ JSClass js_IteratorClass = { JSCLASS_HAS_CACHED_PROTO(JSProto_Iterator) | JSCLASS_MARK_IS_TRACE, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, - JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, NULL, + JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, iterator_finalize, NULL, NULL, NULL, NULL, NULL, NULL, JS_CLASS_TRACE(iterator_trace), NULL }; @@ -156,8 +168,6 @@ InitNativeIterator(JSContext *cx, JSObject *iterobj, JSObject *obj, uintN flags) iterobj->setParent(obj); iterobj->setSlot(JSSLOT_ITER_STATE, JSVAL_NULL); iterobj->setSlot(JSSLOT_ITER_FLAGS, INT_TO_JSVAL(flags)); - if (!js_RegisterCloseableIterator(cx, iterobj)) - return JS_FALSE; if (!obj) return JS_TRUE; @@ -433,7 +443,7 @@ js_CloseIterator(JSContext *cx, jsval v) clasp = obj->getClass(); if (clasp == &js_IteratorClass) { - js_CloseNativeIterator(cx, obj); + CloseNativeIterator(cx, obj); } #if JS_HAS_GENERATORS else if (clasp == &js_GeneratorClass) { diff --git a/js/src/jsiter.h b/js/src/jsiter.h index 41826cebb8a0..fb3bb8434211 100644 --- a/js/src/jsiter.h +++ b/js/src/jsiter.h @@ -58,12 +58,6 @@ JS_BEGIN_EXTERN_C #define JSITER_FOREACH 0x2 /* return [key, value] pair rather than key */ #define JSITER_KEYVALUE 0x4 /* destructuring for-in wants [key, value] */ -/* - * Native iterator object slots, shared between jsiter.cpp and jstracer.cpp. - */ -const uint32 JSSLOT_ITER_STATE = JSSLOT_PRIVATE; -const uint32 JSSLOT_ITER_FLAGS = JSSLOT_PRIVATE + 1; - /* * Convert the value stored in *vp to its iteration object. The flags should * contain JSITER_ENUMERATE if js_ValueToIterator is called when enumerating @@ -83,12 +77,6 @@ js_CloseIterator(JSContext *cx, jsval v); extern JS_FRIEND_API(JSBool) js_CallIteratorNext(JSContext *cx, JSObject *iterobj, jsval *rval); -/* - * Close iterobj, whose class must be js_IteratorClass. - */ -extern void -js_CloseNativeIterator(JSContext *cx, JSObject *iterobj); - extern JSBool js_ThrowStopIteration(JSContext *cx);