mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Gecko engine for Wine
62486d8029
It turns out that the careful effort RecycleTree and NewOrRecycledNode make to disassemble the recycled tree lazily is wasted: every recycling call ends up calling UnlinkFunctionBoxes and walking the entire parse node tree to fix up funbox and method links. There's no locality; you might as well queue up the parse nodes while you're at it. And the stack doesn't stay shallow. This patch replaces the (very clever) lazy recycling with eager recycling, using a work stack chained through the nodes themselves to avoid creating deep C++ stacks when recycling deep parse trees. We put off cleaning up the method lists and funbox tree until just before function analysis, at which point we do so in a single linear pass. Putting this off to the end avoids quadratic behavior, as noted in the comments. The patch localizes the process of adding nodes to the free list in a single function, ensuring that we don't recycle used/defn nodes. It also poisons newly freed nodes. The patch also more clearly distinguishes between function nodes that have been fully deleted, and function nodes that have been mutated (by js_FoldConstants) into other kinds of nodes. See the comments before Parser::cleanFunctionList. I believe the patch also improves the care with which we handle nodes that cannot be recycled immediately (those that appear in JSAtomLists, or are referred to by JSFunctionBoxes). In some cases, those nodes may be picked up and fiddled with later, so it is important that they not refer to nodes around them that did get recycled. |
||
---|---|---|
accessible | ||
browser | ||
build | ||
caps | ||
chrome | ||
config | ||
content | ||
db | ||
dbm | ||
docshell | ||
dom | ||
editor | ||
embedding | ||
extensions | ||
gfx | ||
intl | ||
ipc | ||
jpeg | ||
js | ||
layout | ||
media | ||
memory | ||
modules | ||
netwerk | ||
nsprpub | ||
other-licenses | ||
parser | ||
probes | ||
profile | ||
rdf | ||
security | ||
services | ||
startupcache | ||
storage | ||
testing | ||
toolkit | ||
tools | ||
uriloader | ||
view | ||
webshell | ||
widget | ||
xpcom | ||
xpfe | ||
xpinstall | ||
xulrunner | ||
.hgignore | ||
.hgtags | ||
aclocal.m4 | ||
allmakefiles.sh | ||
client.mk | ||
client.py | ||
configure.in | ||
LEGAL | ||
LICENSE | ||
Makefile.in | ||
README.txt |
An explanation of the Mozilla Source Code Directory Structure and links to project pages with documentation can be found at: https://developer.mozilla.org/en/Mozilla_Source_Code_Directory_Structure For information on how to build Mozilla from the source code, see: http://developer.mozilla.org/en/docs/Build_Documentation To have your bug fix / feature added to Mozilla, you should create a patch and submit it to Bugzilla (https://bugzilla.mozilla.org). Instructions are at: http://developer.mozilla.org/en/docs/Creating_a_patch http://developer.mozilla.org/en/docs/Getting_your_patch_in_the_tree If you have a question about developing Mozilla, and can't find the solution on http://developer.mozilla.org, you can try asking your question in a mozilla.* Usenet group, or on IRC at irc.mozilla.org. [The Mozilla news groups are accessible on Google Groups, or news.mozilla.org with a NNTP reader.] You can download nightly development builds from the Mozilla FTP server. Keep in mind that nightly builds, which are used by Mozilla developers for testing, may be buggy. Firefox nightlies, for example, can be found at: ftp://ftp.mozilla.org/pub/firefox/nightly/latest-trunk/