Diff
Modified: branches/safari-534.54-branch/LayoutTests/ChangeLog (104988 => 104989)
--- branches/safari-534.54-branch/LayoutTests/ChangeLog 2012-01-13 22:20:44 UTC (rev 104988)
+++ branches/safari-534.54-branch/LayoutTests/ChangeLog 2012-01-13 22:29:54 UTC (rev 104989)
@@ -1,5 +1,22 @@
2011-1-13 Lucas Forschler <lforsch...@apple.com>
+ Merge 104086
+
+ 2012-01-04 Filip Pizlo <fpi...@apple.com>
+
+ Incorrect use of DFG node reference counts when mutating the graph
+ https://bugs.webkit.org/show_bug.cgi?id=75580
+ <rdar://problem/10644607>
+
+ Reviewed by Oliver Hunt.
+
+ * fast/js/dfg-array-length-dead-expected.txt: Added.
+ * fast/js/dfg-array-length-dead.html: Added.
+ * fast/js/script-tests/dfg-array-length-dead.js: Added.
+ (foo):
+
+2011-1-13 Lucas Forschler <lforsch...@apple.com>
+
Merge 103981
2012-01-03 Filip Pizlo <fpi...@apple.com>
Copied: branches/safari-534.54-branch/LayoutTests/fast/js/dfg-array-length-dead-expected.txt (from rev 104086, trunk/LayoutTests/fast/js/dfg-array-length-dead-expected.txt) (0 => 104989)
--- branches/safari-534.54-branch/LayoutTests/fast/js/dfg-array-length-dead-expected.txt (rev 0)
+++ branches/safari-534.54-branch/LayoutTests/fast/js/dfg-array-length-dead-expected.txt 2012-01-13 22:29:54 UTC (rev 104989)
@@ -0,0 +1,1009 @@
+Tests that an array length access being dead does not result in register allocation failures.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS foo({f:[]}) is 42
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Copied: branches/safari-534.54-branch/LayoutTests/fast/js/dfg-array-length-dead.html (from rev 104086, trunk/LayoutTests/fast/js/dfg-array-length-dead.html) (0 => 104989)
--- branches/safari-534.54-branch/LayoutTests/fast/js/dfg-array-length-dead.html (rev 0)
+++ branches/safari-534.54-branch/LayoutTests/fast/js/dfg-array-length-dead.html 2012-01-13 22:29:54 UTC (rev 104989)
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<script src=""
+<script src=""
+</body>
+</html>
Copied: branches/safari-534.54-branch/LayoutTests/fast/js/script-tests/dfg-array-length-dead.js (from rev 104086, trunk/LayoutTests/fast/js/script-tests/dfg-array-length-dead.js) (0 => 104989)
--- branches/safari-534.54-branch/LayoutTests/fast/js/script-tests/dfg-array-length-dead.js (rev 0)
+++ branches/safari-534.54-branch/LayoutTests/fast/js/script-tests/dfg-array-length-dead.js 2012-01-13 22:29:54 UTC (rev 104989)
@@ -0,0 +1,13 @@
+description(
+"Tests that an array length access being dead does not result in register allocation failures."
+);
+
+function foo(x) {
+ var y = x.f.length;
+ return 42;
+}
+
+for (var i = 0; i < 1000; ++i) {
+ shouldBe("foo({f:[]})", "42");
+}
+
Modified: branches/safari-534.54-branch/Source/_javascript_Core/ChangeLog (104988 => 104989)
--- branches/safari-534.54-branch/Source/_javascript_Core/ChangeLog 2012-01-13 22:20:44 UTC (rev 104988)
+++ branches/safari-534.54-branch/Source/_javascript_Core/ChangeLog 2012-01-13 22:29:54 UTC (rev 104989)
@@ -1,5 +1,33 @@
2011-1-13 Lucas Forschler <lforsch...@apple.com>
+ Merge 104086
+
+ 2012-01-04 Filip Pizlo <fpi...@apple.com>
+
+ Incorrect use of DFG node reference counts when mutating the graph
+ https://bugs.webkit.org/show_bug.cgi?id=75580
+ <rdar://problem/10644607>
+
+ Reviewed by Oliver Hunt.
+
+ Made deref(node) follow the pattern of ref(node), which it should have
+ to begin with.
+
+ * dfg/DFGGraph.cpp:
+ (JSC::DFG::Graph::refChildren):
+ (JSC::DFG::Graph::derefChildren):
+ * dfg/DFGGraph.h:
+ (JSC::DFG::Graph::deref):
+ (JSC::DFG::Graph::clearAndDerefChild1):
+ (JSC::DFG::Graph::clearAndDerefChild2):
+ (JSC::DFG::Graph::clearAndDerefChild3):
+ * dfg/DFGNode.h:
+ (JSC::DFG::Node::deref):
+ * dfg/DFGPropagator.cpp:
+ (JSC::DFG::Propagator::fixupNode):
+
+2011-1-13 Lucas Forschler <lforsch...@apple.com>
+
Merge 103981
2012-01-03 Filip Pizlo <fpi...@apple.com>
Modified: branches/safari-534.54-branch/Source/_javascript_Core/dfg/DFGGraph.cpp (104988 => 104989)
--- branches/safari-534.54-branch/Source/_javascript_Core/dfg/DFGGraph.cpp 2012-01-13 22:20:44 UTC (rev 104988)
+++ branches/safari-534.54-branch/Source/_javascript_Core/dfg/DFGGraph.cpp 2012-01-13 22:29:54 UTC (rev 104989)
@@ -300,31 +300,42 @@
#endif
-// FIXME: Convert this method to be iterative, not recursive.
+// FIXME: Convert this to be iterative, not recursive.
+#define DO_TO_CHILDREN(node, thingToDo) do { \
+ Node& _node = (node); \
+ if (_node.op & NodeHasVarArgs) { \
+ for (unsigned _childIdx = _node.firstChild(); \
+ _childIdx < _node.firstChild() + _node.numChildren(); \
+ _childIdx++) \
+ thingToDo(m_varArgChildren[_childIdx]); \
+ } else { \
+ if (_node.child1() == NoNode) { \
+ ASSERT(_node.child2() == NoNode \
+ && _node.child3() == NoNode); \
+ return; \
+ } \
+ thingToDo(_node.child1()); \
+ \
+ if (_node.child2() == NoNode) { \
+ ASSERT(_node.child3() == NoNode); \
+ return; \
+ } \
+ thingToDo(_node.child2()); \
+ \
+ if (_node.child3() == NoNode) \
+ return; \
+ thingToDo(_node.child3()); \
+ } \
+ } while (false)
+
void Graph::refChildren(NodeIndex op)
{
- Node& node = at(op);
+ DO_TO_CHILDREN(at(op), ref);
+}
- if (node.op & NodeHasVarArgs) {
- for (unsigned childIdx = node.firstChild(); childIdx < node.firstChild() + node.numChildren(); childIdx++)
- ref(m_varArgChildren[childIdx]);
- } else {
- if (node.child1() == NoNode) {
- ASSERT(node.child2() == NoNode && node.child3() == NoNode);
- return;
- }
- ref(node.child1());
-
- if (node.child2() == NoNode) {
- ASSERT(node.child3() == NoNode);
- return;
- }
- ref(node.child2());
-
- if (node.child3() == NoNode)
- return;
- ref(node.child3());
- }
+void Graph::derefChildren(NodeIndex op)
+{
+ DO_TO_CHILDREN(at(op), deref);
}
void Graph::predictArgumentTypes(CodeBlock* codeBlock)
Modified: branches/safari-534.54-branch/Source/_javascript_Core/dfg/DFGGraph.h (104988 => 104989)
--- branches/safari-534.54-branch/Source/_javascript_Core/dfg/DFGGraph.h 2012-01-13 22:20:44 UTC (rev 104988)
+++ branches/safari-534.54-branch/Source/_javascript_Core/dfg/DFGGraph.h 2012-01-13 22:29:54 UTC (rev 104989)
@@ -80,11 +80,17 @@
refChildren(nodeIndex);
}
+ void deref(NodeIndex nodeIndex)
+ {
+ if (at(nodeIndex).deref())
+ derefChildren(nodeIndex);
+ }
+
void clearAndDerefChild1(Node& node)
{
if (node.children.fixed.child1 == NoNode)
return;
- at(node.children.fixed.child1).deref();
+ deref(node.children.fixed.child1);
node.children.fixed.child1 = NoNode;
}
@@ -92,7 +98,7 @@
{
if (node.children.fixed.child2 == NoNode)
return;
- at(node.children.fixed.child2).deref();
+ deref(node.children.fixed.child2);
node.children.fixed.child2 = NoNode;
}
@@ -100,7 +106,7 @@
{
if (node.children.fixed.child3 == NoNode)
return;
- at(node.children.fixed.child3).deref();
+ deref(node.children.fixed.child3);
node.children.fixed.child3 = NoNode;
}
@@ -259,6 +265,7 @@
// When a node's refCount goes from 0 to 1, it must (logically) recursively ref all of its children, and vice versa.
void refChildren(NodeIndex);
+ void derefChildren(NodeIndex);
PredictionTracker m_predictions;
};
Modified: branches/safari-534.54-branch/Source/_javascript_Core/dfg/DFGNode.h (104988 => 104989)
--- branches/safari-534.54-branch/Source/_javascript_Core/dfg/DFGNode.h 2012-01-13 22:20:44 UTC (rev 104988)
+++ branches/safari-534.54-branch/Source/_javascript_Core/dfg/DFGNode.h 2012-01-13 22:29:54 UTC (rev 104989)
@@ -836,9 +836,13 @@
m_refCount = refCount;
}
- void deref()
+ // Derefs the node and returns true if the ref count reached zero.
+ // In general you don't want to use this directly; use Graph::deref
+ // instead.
+ bool deref()
{
- m_refCount--;
+ ASSERT(m_refCount);
+ return !--m_refCount;
}
NodeIndex child1()
Modified: branches/safari-534.54-branch/Source/_javascript_Core/dfg/DFGPropagator.cpp (104988 => 104989)
--- branches/safari-534.54-branch/Source/_javascript_Core/dfg/DFGPropagator.cpp 2012-01-13 22:20:44 UTC (rev 104988)
+++ branches/safari-534.54-branch/Source/_javascript_Core/dfg/DFGPropagator.cpp 2012-01-13 22:29:54 UTC (rev 104989)
@@ -809,7 +809,7 @@
node.op = GetFloat64ArrayLength;
else
ASSERT_NOT_REACHED();
- node.deref(); // No longer MustGenerate
+ m_graph.deref(m_compileIndex); // No longer MustGenerate
break;
}
case GetIndexedPropertyStorage: {