Title: [131662] trunk
Revision
131662
Author
[email protected]
Date
2012-10-17 16:09:36 -0700 (Wed, 17 Oct 2012)

Log Message

REGRESSION (r130826 or r130828): Twitter top bar is dysfunctional
https://bugs.webkit.org/show_bug.cgi?id=99577
<rdar://problem/12518883>

Reviewed by Mark Hahnenberg.

Source/_javascript_Core: 

It turns out that it's a good idea to maintain the invariants of your object model, such as that
elements past publicLength should have the hole value.

* dfg/DFGGraph.cpp:
(JSC::DFG::Graph::dump):
* dfg/DFGSpeculativeJIT32_64.cpp:
(JSC::DFG::SpeculativeJIT::compile):
* dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::compile):

LayoutTests: 

* fast/js/dfg-array-pop-value-clearing-expected.txt: Added.
* fast/js/dfg-array-pop-value-clearing.html: Added.
* fast/js/jsc-test-list:
* fast/js/script-tests/dfg-array-pop-value-clearing.js: Added.
(foo):

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (131661 => 131662)


--- trunk/LayoutTests/ChangeLog	2012-10-17 22:57:30 UTC (rev 131661)
+++ trunk/LayoutTests/ChangeLog	2012-10-17 23:09:36 UTC (rev 131662)
@@ -1,3 +1,17 @@
+2012-10-17  Filip Pizlo  <[email protected]>
+
+        REGRESSION (r130826 or r130828): Twitter top bar is dysfunctional
+        https://bugs.webkit.org/show_bug.cgi?id=99577
+        <rdar://problem/12518883>
+
+        Reviewed by Mark Hahnenberg.
+
+        * fast/js/dfg-array-pop-value-clearing-expected.txt: Added.
+        * fast/js/dfg-array-pop-value-clearing.html: Added.
+        * fast/js/jsc-test-list:
+        * fast/js/script-tests/dfg-array-pop-value-clearing.js: Added.
+        (foo):
+
 2012-10-17  Joshua Bell  <[email protected]>
 
         IndexedDB: Enforce unsigned long/unsigned long long ranges

Added: trunk/LayoutTests/fast/js/dfg-array-pop-value-clearing-expected.txt (0 => 131662)


--- trunk/LayoutTests/fast/js/dfg-array-pop-value-clearing-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/js/dfg-array-pop-value-clearing-expected.txt	2012-10-17 23:09:36 UTC (rev 131662)
@@ -0,0 +1,1009 @@
+Tests that array popping properly cleans up the popped element.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS foo([1, 2]) is [2,42,,]
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/fast/js/dfg-array-pop-value-clearing.html (0 => 131662)


--- trunk/LayoutTests/fast/js/dfg-array-pop-value-clearing.html	                        (rev 0)
+++ trunk/LayoutTests/fast/js/dfg-array-pop-value-clearing.html	2012-10-17 23:09:36 UTC (rev 131662)
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<script src=""
+<script src=""
+</body>
+</html>

Modified: trunk/LayoutTests/fast/js/jsc-test-list (131661 => 131662)


--- trunk/LayoutTests/fast/js/jsc-test-list	2012-10-17 22:57:30 UTC (rev 131661)
+++ trunk/LayoutTests/fast/js/jsc-test-list	2012-10-17 23:09:36 UTC (rev 131662)
@@ -83,6 +83,7 @@
 fast/js/dfg-arrayify-when-prevent-extensions
 fast/js/dfg-array-length-dead
 fast/js/dfg-array-pop-side-effects
+fast/js/dfg-array-pop-value-clearing
 fast/js/dfg-array-push-bad-time
 fast/js/dfg-array-push-slow-put
 fast/js/dfg-bool-to-int32-reuse

Added: trunk/LayoutTests/fast/js/script-tests/dfg-array-pop-value-clearing.js (0 => 131662)


--- trunk/LayoutTests/fast/js/script-tests/dfg-array-pop-value-clearing.js	                        (rev 0)
+++ trunk/LayoutTests/fast/js/script-tests/dfg-array-pop-value-clearing.js	2012-10-17 23:09:36 UTC (rev 131662)
@@ -0,0 +1,12 @@
+description(
+"Tests that array popping properly cleans up the popped element."
+);
+
+function foo(a) {
+    var x = a.pop();
+    a[a.length + 1] = 42;
+    return [x, a.pop(), a.pop()];
+}
+
+for (var i = 0; i < 1000; ++i)
+    shouldBe("foo([1, 2])", "[2,42,,]");

Modified: trunk/Source/_javascript_Core/ChangeLog (131661 => 131662)


--- trunk/Source/_javascript_Core/ChangeLog	2012-10-17 22:57:30 UTC (rev 131661)
+++ trunk/Source/_javascript_Core/ChangeLog	2012-10-17 23:09:36 UTC (rev 131662)
@@ -1,3 +1,21 @@
+2012-10-17  Filip Pizlo  <[email protected]>
+
+        REGRESSION (r130826 or r130828): Twitter top bar is dysfunctional
+        https://bugs.webkit.org/show_bug.cgi?id=99577
+        <rdar://problem/12518883>
+
+        Reviewed by Mark Hahnenberg.
+
+        It turns out that it's a good idea to maintain the invariants of your object model, such as that
+        elements past publicLength should have the hole value.
+
+        * dfg/DFGGraph.cpp:
+        (JSC::DFG::Graph::dump):
+        * dfg/DFGSpeculativeJIT32_64.cpp:
+        (JSC::DFG::SpeculativeJIT::compile):
+        * dfg/DFGSpeculativeJIT64.cpp:
+        (JSC::DFG::SpeculativeJIT::compile):
+
 2012-10-17  Anders Carlsson  <[email protected]>
 
         Clean up Vector.h

Modified: trunk/Source/_javascript_Core/dfg/DFGGraph.cpp (131661 => 131662)


--- trunk/Source/_javascript_Core/dfg/DFGGraph.cpp	2012-10-17 22:57:30 UTC (rev 131661)
+++ trunk/Source/_javascript_Core/dfg/DFGGraph.cpp	2012-10-17 23:09:36 UTC (rev 131662)
@@ -246,12 +246,12 @@
     }
     if (node.hasStructureSet()) {
         for (size_t i = 0; i < node.structureSet().size(); ++i) {
-            dataLog("%sstruct(%p)", hasPrinted ? ", " : "", node.structureSet()[i]);
+            dataLog("%sstruct(%p: %s)", hasPrinted ? ", " : "", node.structureSet()[i], indexingTypeToString(node.structureSet()[i]->indexingType()));
             hasPrinted = true;
         }
     }
     if (node.hasStructure()) {
-        dataLog("%sstruct(%p)", hasPrinted ? ", " : "", node.structure());
+        dataLog("%sstruct(%p: %s)", hasPrinted ? ", " : "", node.structure(), indexingTypeToString(node.structure()->indexingType()));
         hasPrinted = true;
     }
     if (node.hasStructureTransitionData()) {

Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT32_64.cpp (131661 => 131662)


--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT32_64.cpp	2012-10-17 22:57:30 UTC (rev 131661)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT32_64.cpp	2012-10-17 23:09:36 UTC (rev 131662)
@@ -3157,19 +3157,22 @@
         case Array::ArrayWithContiguous:
         case Array::ArrayWithContiguousOutOfBounds: {
             m_jit.load32(
-                MacroAssembler::Address(storageGPR, Butterfly::offsetOfPublicLength()), valueTagGPR);
+                MacroAssembler::Address(storageGPR, Butterfly::offsetOfPublicLength()), valuePayloadGPR);
             MacroAssembler::Jump undefinedCase =
-                m_jit.branchTest32(MacroAssembler::Zero, valueTagGPR);
-            m_jit.sub32(TrustedImm32(1), valueTagGPR);
+                m_jit.branchTest32(MacroAssembler::Zero, valuePayloadGPR);
+            m_jit.sub32(TrustedImm32(1), valuePayloadGPR);
             m_jit.store32(
-                valueTagGPR, MacroAssembler::Address(storageGPR, Butterfly::offsetOfPublicLength()));
+                valuePayloadGPR, MacroAssembler::Address(storageGPR, Butterfly::offsetOfPublicLength()));
             m_jit.load32(
-                MacroAssembler::BaseIndex(storageGPR, valueTagGPR, MacroAssembler::TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.payload)),
-                valuePayloadGPR);
-            m_jit.load32(
-                MacroAssembler::BaseIndex(storageGPR, valueTagGPR, MacroAssembler::TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.tag)),
+                MacroAssembler::BaseIndex(storageGPR, valuePayloadGPR, MacroAssembler::TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.tag)),
                 valueTagGPR);
             MacroAssembler::Jump slowCase = m_jit.branch32(MacroAssembler::Equal, valueTagGPR, TrustedImm32(JSValue::EmptyValueTag));
+            m_jit.store32(
+                MacroAssembler::TrustedImm32(JSValue::EmptyValueTag),
+                MacroAssembler::BaseIndex(storageGPR, valuePayloadGPR, MacroAssembler::TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.tag)));
+            m_jit.load32(
+                MacroAssembler::BaseIndex(storageGPR, valuePayloadGPR, MacroAssembler::TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.payload)),
+                valuePayloadGPR);
 
             addSlowPathGenerator(
                 slowPathMove(

Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp (131661 => 131662)


--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp	2012-10-17 22:57:30 UTC (rev 131661)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp	2012-10-17 23:09:36 UTC (rev 131662)
@@ -3191,24 +3191,30 @@
         SpeculateCellOperand base(this, node.child1());
         StorageOperand storage(this, node.child2());
         GPRTemporary value(this);
+        GPRTemporary storageLength(this);
         
         GPRReg baseGPR = base.gpr();
         GPRReg storageGPR = storage.gpr();
         GPRReg valueGPR = value.gpr();
+        GPRReg storageLengthGPR = storageLength.gpr();
         
         switch (node.arrayMode()) {
         case Array::ArrayWithContiguous:
         case Array::ArrayWithContiguousOutOfBounds: {
             m_jit.load32(
-                MacroAssembler::Address(storageGPR, Butterfly::offsetOfPublicLength()), valueGPR);
+                MacroAssembler::Address(storageGPR, Butterfly::offsetOfPublicLength()), storageLengthGPR);
             MacroAssembler::Jump undefinedCase =
-                m_jit.branchTest32(MacroAssembler::Zero, valueGPR);
-            m_jit.sub32(TrustedImm32(1), valueGPR);
+                m_jit.branchTest32(MacroAssembler::Zero, storageLengthGPR);
+            m_jit.sub32(TrustedImm32(1), storageLengthGPR);
             m_jit.store32(
-                valueGPR, MacroAssembler::Address(storageGPR, Butterfly::offsetOfPublicLength()));
+                storageLengthGPR, MacroAssembler::Address(storageGPR, Butterfly::offsetOfPublicLength()));
             m_jit.loadPtr(
-                MacroAssembler::BaseIndex(storageGPR, valueGPR, MacroAssembler::ScalePtr),
+                MacroAssembler::BaseIndex(storageGPR, storageLengthGPR, MacroAssembler::ScalePtr),
                 valueGPR);
+            // FIXME: This would not have to be here if changing the publicLength also zeroed the values between the old
+            // length and the new length.
+            m_jit.storePtr(
+                MacroAssembler::TrustedImmPtr(0), MacroAssembler::BaseIndex(storageGPR, storageLengthGPR, MacroAssembler::ScalePtr));
             MacroAssembler::Jump slowCase = m_jit.branchTestPtr(MacroAssembler::Zero, valueGPR);
 
             addSlowPathGenerator(
@@ -3225,8 +3231,6 @@
             
         case Array::ArrayWithArrayStorage:
         case Array::ArrayWithArrayStorageOutOfBounds: {
-            GPRTemporary storageLength(this);
-            GPRReg storageLengthGPR = storageLength.gpr();
             m_jit.load32(MacroAssembler::Address(storageGPR, ArrayStorage::lengthOffset()), storageLengthGPR);
         
             JITCompiler::Jump undefinedCase =
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to