11044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 21044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// Redistribution and use in source and binary forms, with or without 31044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// modification, are permitted provided that the following conditions are 41044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// met: 51044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// 61044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// * Redistributions of source code must retain the above copyright 71044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// notice, this list of conditions and the following disclaimer. 81044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// * Redistributions in binary form must reproduce the above 91044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// copyright notice, this list of conditions and the following 101044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// disclaimer in the documentation and/or other materials provided 111044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// with the distribution. 121044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// * Neither the name of Google Inc. nor the names of its 131044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// contributors may be used to endorse or promote products derived 141044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// from this software without specific prior written permission. 151044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// 161044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 171044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 181044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 191044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 201044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 211044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 221044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 231044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 241044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 251044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 261044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 271044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 281044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// Flags: --expose-debug-as debug 291044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 301044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// Get the Debug object exposed from the debug context global object. 311044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgvar Debug = debug.Debug; 321044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 331044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgfunction CheckScope(scope_mirror, scope_expectations, expected_scope_type) { 341044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org assertEquals(expected_scope_type, scope_mirror.scopeType()); 351044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 361044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var scope_object = scope_mirror.scopeObject().value(); 371044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 381044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org for (var name in scope_expectations) { 391044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var actual = scope_object[name]; 401044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var expected = scope_expectations[name]; 411044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org assertEquals(expected, actual); 421044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org } 431044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org} 441044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 451044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// A copy of the scope types from mirror-debugger.js. 461044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgvar ScopeType = { Global: 0, 471044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org Local: 1, 481044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org With: 2, 491044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org Closure: 3, 501044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org Catch: 4, 511044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org Block: 5 }; 521044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 531044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgvar f1 = (function F1(x) { 541044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org function F2(y) { 551044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var z = x + y; 561044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org with ({w: 5, v: "Capybara"}) { 571044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var F3 = function(a, b) { 581044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org function F4(p) { 591044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org return p + a + b + z + w + v.length; 601044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org } 611044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org return F4; 621044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org } 631044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org return F3(4, 5); 641044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org } 651044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org } 661044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org return F2(17); 671044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org})(5); 681044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 691044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgvar mirror = Debug.MakeMirror(f1); 701044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 711044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgassertEquals(5, mirror.scopeCount()); 721044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 731044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(0), { a: 4, b: 5 }, ScopeType.Closure); 741044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(1), { w: 5, v: "Capybara" }, ScopeType.With); 751044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(2), { y: 17, z: 22 }, ScopeType.Closure); 761044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(3), { x: 5 }, ScopeType.Closure); 771044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(4), {}, ScopeType.Global); 781044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 791044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgvar f2 = function() { return 5; } 801044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 811044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgvar mirror = Debug.MakeMirror(f2); 821044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 831044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgassertEquals(1, mirror.scopeCount()); 841044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 851044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(0), {}, ScopeType.Global); 861044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 871044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgvar f3 = (function F1(invisible_parameter) { 881044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var invisible1 = 1; 891044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var visible1 = 10; 901044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org return (function F2() { 911044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var invisible2 = 2; 921044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org return (function F3() { 931044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var visible2 = 20; 941044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var invisible2 = 3; 951044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org return (function () {return visible1 + visible2 + visible1a;}); 961044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org })(); 971044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org })(); 981044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org})(5); 991044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1001044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgvar mirror = Debug.MakeMirror(f3); 1011044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1021044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgassertEquals(3, mirror.scopeCount()); 1031044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1041044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(0), { visible2: 20 }, ScopeType.Closure); 1051044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(1), { visible1: 10 }, ScopeType.Closure); 1061044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(2), {}, ScopeType.Global); 1071044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1081044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1091044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgvar f4 = (function One() { 1101044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org try { 1111044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org throw "I'm error 1"; 1121044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org } catch (e1) { 1131044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org try { 1141044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org throw "I'm error 2"; 1151044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org } catch (e2) { 1161044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org return function GetError() { 1171044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org return e1 + e2; 1181044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org }; 1191044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org } 1201044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org } 1211044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org})(); 1221044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1231044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgvar mirror = Debug.MakeMirror(f4); 1241044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1251044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgassertEquals(3, mirror.scopeCount()); 1261044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1271044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(0), { e2: "I'm error 2" }, ScopeType.Catch); 1281044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(1), { e1: "I'm error 1" }, ScopeType.Catch); 1291044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(2), {}, ScopeType.Global); 1301044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1311044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1321044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgvar f5 = (function Raz(p1, p2) { 1331044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var p3 = p1 + p2; 1341044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org return (function() { 1351044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var p4 = 20; 1361044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var p5 = 21; 1371044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var p6 = 22; 1381044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org return eval("(function(p7){return p1 + p4 + p6 + p7})"); 1391044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org })(); 1401044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org})(1,2); 1411044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1421044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgvar mirror = Debug.MakeMirror(f5); 1431044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1441044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgassertEquals(3, mirror.scopeCount()); 1451044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1461044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(0), { p4: 20, p6: 22 }, ScopeType.Closure); 1471044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(1), { p1: 1 }, ScopeType.Closure); 1481044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(2), {}, ScopeType.Global); 1491044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1501044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1511044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgfunction CheckNoScopeVisible(f) { 1521044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var mirror = Debug.MakeMirror(f); 1531044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org assertEquals(0, mirror.scopeCount()); 1541044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org} 1551044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1561044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckNoScopeVisible(Number); 1571044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1581044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckNoScopeVisible(Function.toString); 1591044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1601044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// This getter is known to be implemented as closure. 1611044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckNoScopeVisible(new Error().__lookupGetter__("stack")); 162