1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2008 the V8 project authors. All rights reserved. 2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without 3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met: 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions of source code must retain the above copyright 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// notice, this list of conditions and the following disclaimer. 8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions in binary form must reproduce the above 9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// copyright notice, this list of conditions and the following 10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// disclaimer in the documentation and/or other materials provided 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// with the distribution. 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Neither the name of Google Inc. nor the names of its 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// contributors may be used to endorse or promote products derived 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// from this software without specific prior written permission. 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Flags: --expose-debug-as debug 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Get the Debug object exposed from the debug context global object. 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebug = debug.Debug 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlocklistenerComplete = false; 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockexception = false; 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction h() { 373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var a = 1; 383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var b = 2; 393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch debugger; // Breakpoint. 403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction checkFrame0(frame) { 433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Frame 0 (h) has normal variables a and b. 443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var count = frame.localCount(); 453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(2, count); 463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch for (var i = 0; i < count; ++i) { 473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var name = frame.localName(i); 483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var value = frame.localValue(i).value(); 493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (name == 'a') { 503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(1, value); 513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals('b', name); 533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(2, value); 543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction g() { 603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var a = 3; 613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch eval("var b = 4;"); 623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch h(); 633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction checkFrame1(frame) { 663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Frame 1 (g) has normal variable a (and arguments). 673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var count = frame.localCount(); 683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(2, count); 693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch for (var i = 0; i < count; ++i) { 703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var name = frame.localName(i); 713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var value = frame.localValue(i).value(); 723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (name == 'a') { 733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(3, value); 743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals('arguments', name); 763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction f() { 823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var a = 5; 833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var b = 0; 843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch with ({b:6}) { 853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch g(); 86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction checkFrame2(frame) { 903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Frame 2 (f) has normal variables a and b (and arguments). 913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var count = frame.localCount(); 923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(3, count); 933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch for (var i = 0; i < count; ++i) { 943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var name = frame.localName(i); 953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var value = frame.localValue(i).value(); 963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (name == 'a') { 973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(5, value); 983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else if (name == 'b') { 993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(0, value); 1003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 1013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals('arguments', name); 1023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction listener(event, exec_state, event_data, data) { 108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block try { 109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (event == Debug.DebugEvent.Break) 110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block { 1113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch checkFrame0(exec_state.frame(0)); 1123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch checkFrame1(exec_state.frame(1)); 1133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch checkFrame2(exec_state.frame(2)); 114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Evaluating a and b on frames 0, 1 and 2 produces 1, 2, 3, 4, 5 and 6. 116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals(1, exec_state.frame(0).evaluate('a').value()); 117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals(2, exec_state.frame(0).evaluate('b').value()); 118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals(3, exec_state.frame(1).evaluate('a').value()); 119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals(4, exec_state.frame(1).evaluate('b').value()); 120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals(5, exec_state.frame(2).evaluate('a').value()); 121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals(6, exec_state.frame(2).evaluate('b').value()); 122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Indicate that all was processed. 124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block listenerComplete = true; 125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } catch (e) { 127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block exception = e 128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Add the debug event listener. 132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebug.setListener(listener); 133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockf(); 135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Make sure that the debug event listener vas invoked. 137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertTrue(listenerComplete); 138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertFalse(exception, "exception in listener") 139