Index: test/mjsunit/regress/regress-5205.js |
diff --git a/test/mjsunit/regress/regress-5205.js b/test/mjsunit/regress/regress-5205.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0d88f450539f028e6954100f2ca9a875b952937e |
--- /dev/null |
+++ b/test/mjsunit/regress/regress-5205.js |
@@ -0,0 +1,37 @@ |
+// 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 --gc-global |
+ |
+(function TestGCDuringToObjectForWith() { |
+ function f(o) { |
+ if (o == 'warmup') { return g() } |
+ with (o) { return x } |
+ } |
+ function g() { |
+ // Only a marker function serving as weak embedded object. |
+ } |
+ |
+ // Warm up 'f' so that weak embedded object 'g' will be used. |
+ f('warmup'); |
+ f('warmup'); |
+ g = null; |
+ |
+ // Test that 'f' behaves correctly unoptimized. |
+ assertEquals(23, f({ x:23 })); |
+ assertEquals(42, f({ x:42 })); |
+ |
+ // Test that 'f' behaves correctly optimized. |
+ %OptimizeFunctionOnNextCall(f); |
+ assertEquals(65, f({ x:65 })); |
+ |
+ // Test that 'f' behaves correctly on numbers. |
+ Number.prototype.x = 99; |
+ assertEquals(99, f(0)); |
+ |
+ // Make sure the next [[ToObject]] allocation triggers GC. This in turn will |
+ // deoptimize 'f' because it has the weak embedded object 'g' in the code. |
+ %SetAllocationTimeout(1000, 1, false); |
+ assertEquals(99, f(0)); |
+})(); |