[webkit-reviews] review requested: [Bug 12216] Stack overflow crash in JavaScript garbage collector mark pass : [Attachment 17551] [4/6] Not reviewed.

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Tue Nov 27 01:21:59 PST 2007

Maciej Stachowiak <mjs at apple.com> has asked  for review:
Bug 12216: Stack overflow crash in JavaScript garbage collector mark pass

Attachment 17551: [4/6] 	Not reviewed.

------- Additional Comments from Maciej Stachowiak <mjs at apple.com>

	- push ranges onto the stack to avoid making a huge mark stack for
large arrays.

	This is an 0.6% SunSpider speedup (baseline for this branch being
	about on par with trunk).

	This patch lowers the high-water mark for the most array-intensive
tests from
	2687 to 316. Unfortunately, the unpack-code test creates a very large
object and
	has a high-water mark of 1979.

	We need to get the high-water mark as low as possible so that we
	can use a fixed-size mark stack with a slow fallback algorithm for
	the rare cases that it fails.

	Remaining open-ended storages that can blow out the mark stack include:

	- PropertyMap
	- LocalStorage
	- SparseArrayValueMap

	Somewhat annoyingly, each has different rules for traversal. Only
	the PropertyMap seems likely to get huge in relatively common
	cases so the next step will be to take care of that.

	* kjs/MarkStack.h:
	(KJS::MarkStack::push): Define this as a separate inline outside of the
	(KJS::MarkStack::pushAtom): ditto
	(KJS::MarkStack::isEmpty): ditto
	(KJS::MarkStack::reserveCapacity): ditto

	(KJS::MarkStack::pushRange): New function to handle pushing a
	range. For small enough ranges or ranges that only contain known
	atomic values, they are handled immediately. Bigger ranges are saved on
	the stack and only the first chunk is pushed.

	(KJS::MarkStack::pop): Accomodate the possibility of ranges on the
	stack. We handle this by pulling out the range, repushing it, and then

	(KJS::MarkStack::size): Added. Useful for debugging.
	(KJS::MarkStack::advanceRangeStartToCellWithRefs): Helper for
	(KJS::MarkStack::pushWholeRange): ditto
	(KJS::MarkStack::pushOneItemAndAdvance): ditto
	(KJS::MarkStack::advanceUntil126ItemsPushed): ditto
	* kjs/array_instance.cpp:
	(KJS::ArrayInstance::markChildren): Use pushRange.
 JavaScriptCore/ChangeLog	       |  112 ++++++++++++++++
 JavaScriptCore/kjs/MarkStack.h        |  227 ++++++++++++++++++++++++++-------
 JavaScriptCore/kjs/array_instance.cpp |    6 +-
 3 files changed, 293 insertions(+), 52 deletions(-)

More information about the webkit-reviews mailing list