Index: test/debugger/debug/debug-evaluate-no-side-effect.js |
diff --git a/test/debugger/debug/debug-evaluate-no-side-effect.js b/test/debugger/debug/debug-evaluate-no-side-effect.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..113ca3d16a591286b451f49fbb1ac67c18841f93 |
--- /dev/null |
+++ b/test/debugger/debug/debug-evaluate-no-side-effect.js |
@@ -0,0 +1,83 @@ |
+// Copyright 2017 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: --ignition --side-effect-free-debug-evaluate |
+ |
+Debug = debug.Debug |
+ |
+var exception = null; |
+let a = 1; |
+var object = { property : 2, |
+ get getter() { return 3; } |
+ }; |
+var string1 = { toString() { return "x"; } }; |
+var string2 = { toString() { print("x"); return "x"; } }; |
+var array = [4, 5]; |
+var error = new Error(); |
+ |
+function set_a() { a = 2; } |
+ |
+function get_a() { return a; } |
+ |
+function listener(event, exec_state, event_data, data) { |
+ if (event != Debug.DebugEvent.Break) return; |
+ try { |
+ function success(expectation, source) { |
+ assertEquals(expectation, exec_state.frame(0).evaluate(source).value()); |
+ } |
+ function fail(source) { |
+ assertThrows(() => exec_state.frame(0).evaluate(source), EvalError); |
+ } |
+ // Simple test. |
+ success(3, "1 + 2"); |
+ // Dymanic load. |
+ success(array, "array"); |
+ // Context load. |
+ success(1, "a"); |
+ // Global and named property load. |
+ success(2, "object.property"); |
+ // Load via read-only getter. |
+ success(3, "object.getter"); |
+ // Implicit call to read-only toString. |
+ success("xy", "string1 + 'y'"); |
+ // Keyed property load. |
+ success(5, "array[1]"); |
+ // Call to read-only function. |
+ success(1, "get_a()"); |
+ // Call to read-only function within try-catch. |
+ success(1, "try { get_a() } catch (e) {}"); |
+ // Call to C++ built-in. |
+ success(Math.sin(2), "Math.sin(2)"); |
+ // Call to whitelisted get accessors. |
+ success(3, "'abc'.length"); |
+ success(2, "array.length"); |
+ // Test that non-read-only code fails. |
+ fail("exception = 1"); |
+ // Test that calling a non-read-only function fails. |
+ fail("set_a()"); |
+ // Test that implicit call to a non-read-only function fails. |
+ fail("string2 + 'y'"); |
+ // Test that try-catch does not catch the EvalError. |
+ fail("try { set_a() } catch (e) {}"); |
+ // Test that call to set accessor fails. |
+ fail("array.length = 4"); |
+ // Test that call to non-whitelisted get accessor fails. |
+ fail("error.stack"); |
+ } catch (e) { |
+ exception = e; |
+ print(e, e.stack); |
+ }; |
+}; |
+ |
+// Add the debug event listener. |
+Debug.setListener(listener); |
+ |
+function f() { |
+ debugger; |
+}; |
+ |
+f(); |
+ |
+assertNull(exception); |
+assertEquals(1, a); |