Index: test/mjsunit/prototype-non-existing.js |
diff --git a/test/mjsunit/prototype-non-existing.js b/test/mjsunit/prototype-non-existing.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..367a59f5474e2ea4e8f864c0b743141ad2d35865 |
--- /dev/null |
+++ b/test/mjsunit/prototype-non-existing.js |
@@ -0,0 +1,92 @@ |
+// Copyright 2016 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 |
+ |
+// Dictionary object in the prototype chain. |
+(function() { |
+ function A() { |
+ this.z = "a"; |
+ } |
+ var a = new A(); |
+ |
+ function B() { |
+ this.b = "b"; |
+ } |
+ B.prototype = a; |
+ var b = new B(); |
+ |
+ // Ensure b stays slow. |
+ for (var i = 0; i < 1200; i++) { |
+ b["b"+i] = 0; |
+ } |
+ assertFalse(%HasFastProperties(b)); |
+ |
+ function C() { |
+ this.c = "c"; |
+ } |
+ C.prototype = b; |
+ var c = new C(); |
+ |
+ function f(expected) { |
+ assertFalse(%HasFastProperties(b)); |
+ var result = c.z; |
+ assertEquals(expected, result); |
+ } |
+ f("a"); |
+ f("a"); |
+ f("a"); |
+ %OptimizeFunctionOnNextCall(f); |
+ f("a"); |
+ |
+ a.z = "z"; |
+ f("z"); |
+ f("z"); |
+ f("z"); |
+ |
+ b.z = "bz"; |
+ f("bz"); |
+ f("bz"); |
+ f("bz"); |
+})(); |
+ |
+ |
+// Global object in the prototype chain. |
+(function() { |
+ var global = this; |
+ |
+ function A() { |
+ this.z = "a"; |
+ } |
+ A.prototype = global.__proto__; |
+ var a = new A(); |
+ |
+ global.__proto__ = a; |
+ |
+ function C() { |
+ this.c = "c"; |
+ } |
+ C.prototype = global; |
+ var c = new C(); |
+ |
+ function f(expected) { |
+ var result = c.z; |
+ assertEquals(expected, result); |
+ } |
+ f("a"); |
+ f("a"); |
+ f("a"); |
+ %OptimizeFunctionOnNextCall(f); |
+ f("a"); |
+ |
+ a.z = "z"; |
+ f("z"); |
+ f("z"); |
+ f("z"); |
+ |
+ global.z = "bz"; |
+ f("bz"); |
+ f("bz"); |
+ f("bz"); |
+})(); |