Index: test/debugger/debug/debug-evaluate-readonly.js |
diff --git a/test/debugger/debug/debug-evaluate-readonly.js b/test/debugger/debug/debug-evaluate-readonly.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4fd1652142a7120d790748f7ddc1b343a4f3b675 |
--- /dev/null |
+++ b/test/debugger/debug/debug-evaluate-readonly.js |
@@ -0,0 +1,65 @@ |
+// 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 --readonly-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]; |
+ |
+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 { |
+ // Simple test. |
+ assertEquals(3, exec_state.frame(0).evaluate("1 + 2").value()); |
+ // Context load. |
+ assertEquals(1, exec_state.frame(0).evaluate("a").value()); |
+ // Global and named property load. |
+ assertEquals(2, exec_state.frame(0).evaluate("object.property").value()); |
+ // Load via read-only getter. |
+ assertEquals(3, exec_state.frame(0).evaluate("object.getter").value()); |
+ // Implicit call to read-only toString. |
+ assertEquals("xy", exec_state.frame(0).evaluate("string1 + 'y'").value()); |
+ // Keyed property load. |
+ assertEquals(5, exec_state.frame(0).evaluate("array[1]").value()); |
+ // Call to read-only function. |
+ assertEquals(1, exec_state.frame(0).evaluate("get_a()").value()); |
+ // Call to read-only function within try-catch. |
+ assertEquals(1, exec_state.frame(0).evaluate("try { get_a() } catch (e) {}").value()); |
+ // Test that non-read-only code fails. |
+ assertThrows(() => exec_state.frame(0).evaluate("exception = 1"), EvalError); |
+ // Test that calling a non-read-only function fails. |
+ assertThrows(() => exec_state.frame(0).evaluate("set_a()"), EvalError); |
+ // Test that implicit call to a non-read-only function fails. |
+ assertThrows(() => exec_state.frame(0).evaluate("string2 + 'y'"), EvalError); |
+ // Test that try-catch does not catch the EvalError. |
+ assertThrows(() => exec_state.frame(0).evaluate("try { set_a() } catch (e) {}"), EvalError); |
+ } 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); |