Index: test/mjsunit/keyed-load-hole-to-undefined.js |
diff --git a/test/mjsunit/keyed-load-hole-to-undefined.js b/test/mjsunit/keyed-load-hole-to-undefined.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e9403b8c5e2233d00e3763cec05fda70fb729e43 |
--- /dev/null |
+++ b/test/mjsunit/keyed-load-hole-to-undefined.js |
@@ -0,0 +1,26 @@ |
+// Copyright 2015 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Flags: --allow-natives-syntax |
+// Flags: --nostress-opt |
+ |
+// --nostress-opt is specified because the test corrupts the "pristine" |
+// array prototype chain by storing an element, and this is tracked |
+// per-isolate. A subsequent stress run would send the load generic, |
+// and no more deoptimizations of foo would occur. |
+ |
+function foo(a, i) { return a[i]; } |
+ |
+var a = ['one', , 'three']; |
+foo(a, 0); |
+foo(a, 0); |
+foo(a, 0); |
+%OptimizeFunctionOnNextCall(foo); |
+assertEquals(undefined, foo(a, 1)); |
+assertOptimized(foo); |
+ |
+// Whereas if we disrupt the prototype chain... |
+Array.prototype[1] = 'cow'; |
+assertEquals('cow', foo(a, 1)); |
+assertUnoptimized(foo); |