1594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 2594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// Redistribution and use in source and binary forms, with or without 3594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// modification, are permitted provided that the following conditions are 4594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// met: 5594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// 6594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// * Redistributions of source code must retain the above copyright 7594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// notice, this list of conditions and the following disclaimer. 8594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// * Redistributions in binary form must reproduce the above 9594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// copyright notice, this list of conditions and the following 10594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// disclaimer in the documentation and/or other materials provided 11594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// with the distribution. 12594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// * Neither the name of Google Inc. nor the names of its 13594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// contributors may be used to endorse or promote products derived 14594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// from this software without specific prior written permission. 15594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// 16594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 28594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// Flags: --expose-debug-as debug 29594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 30594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgDebug = debug.Debug 31594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 32594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orglistenerComplete = false; 33594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgexception = false; 34594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 35594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// var0: init after break point, changed by debug eval. 36594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// const0: init before break point, changed by debug eval. 37594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// const1: init after break point, materialized but untouched by debug eval. 38594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// const2: init after break point, materialized and changed by debug eval. 39594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// const3: context allocated const, init before break point, changed by eval. 40594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgfunction f() { 41594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org var var1 = 21; 42594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org const const3 = 3; 43594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 44594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org function g() { 45594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org const const0 = 0; 46594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(undefined, const1); 47594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(undefined, const2); 48594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(3, const3); 49594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(21, var1); 50594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 51594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org debugger; // Break point. 52594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 53594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(30, var0); 54594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // TODO(yangguo): debug evaluate should not be able to alter 55594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // stack-allocated const values 56594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // assertEquals(0, const0); 57594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(undefined, const1); 58594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(undefined, const2); 59594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org var var0 = 20; 60594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org const const1 = 1; 61594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org const const2 = 2; 62594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(20, var0); 63594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(1, const1); 64594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(2, const2); 65594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 66594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 67594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org g(); 68594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 69594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(31, var1); 70594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(3, const3); 71594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org} 72594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 73594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 74594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgfunction listener(event, exec_state, event_data, data) { 75594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (event != Debug.DebugEvent.Break) return; 76594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org try { 77594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org var frame = exec_state.frame(0); 78594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org var evaluate = function(something) { 79594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return frame.evaluate(something).value() 80594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 81594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 82594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org var count = frame.localCount(); 83594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(4, count); 84594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org var expectation = { "const0" : 0, 85594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org "const1" : undefined, 86594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org "const2" : undefined, 87594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org "const3" : 3, 88594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org "var0" : undefined, 89594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org "var1" : 21 }; 90594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org for (var i = 0; i < frame.localCount(); ++i) { 91594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org var name = frame.localName(i); 92594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org var value = frame.localValue(i).value(); 93594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assertEquals(expectation[name], value); 94594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 95594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 96594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org evaluate('const0 = 10'); 97594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org evaluate('const2 = 12'); 98594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org evaluate('const3 = 13'); 99594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org evaluate('var0 = 30'); 100594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org evaluate('var1 = 31'); 101594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 102594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Indicate that all was processed. 103594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org listenerComplete = true; 104594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } catch (e) { 105594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org exception = e; 106594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org print("Caught something. " + e + " " + e.stack); 107594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org }; 108594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org}; 109594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 110594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// Run and compile before debugger is active. 111594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgtry { f(); } catch (e) { } 112594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 113594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgDebug.setListener(listener); 114594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 115594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgf(); 116594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 117594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgDebug.setListener(null); 118594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 119594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgassertFalse(exception, "exception in listener") 120594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgassertTrue(listenerComplete); 121