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 --harmony-scoping 291044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 301044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org"use strict"; 311044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 321044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// Get the Debug object exposed from the debug context global object. 331044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgvar Debug = debug.Debug; 341044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 351044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgfunction CheckScope(scope_mirror, scope_expectations, expected_scope_type) { 361044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org assertEquals(expected_scope_type, scope_mirror.scopeType()); 371044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 381044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var scope_object = scope_mirror.scopeObject().value(); 391044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 401044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org for (let name in scope_expectations) { 411044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org let actual = scope_object[name]; 421044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org let expected = scope_expectations[name]; 431044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org assertEquals(expected, actual); 441044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org } 451044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org} 461044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 471044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// A copy of the scope types from mirror-debugger.js. 481044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgvar ScopeType = { Global: 0, 491044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org Local: 1, 501044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org With: 2, 511044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org Closure: 3, 521044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org Catch: 4, 531044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org Block: 5 }; 541044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 551044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgvar f1 = (function F1(x) { 561044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org function F2(y) { 571044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var z = x + y; 581044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org { 591044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var w = 5; 601044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var v = "Capybara"; 611044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var F3 = function(a, b) { 621044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org function F4(p) { 631044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org return p + a + b + z + w + v.length; 641044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org } 651044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org return F4; 661044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org } 671044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org return F3(4, 5); 681044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org } 691044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org } 701044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org return F2(17); 711044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org})(5); 721044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 731044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgvar mirror = Debug.MakeMirror(f1); 741044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 751044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgassertEquals(4, mirror.scopeCount()); 761044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 771044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(0), { a: 4, b: 5 }, ScopeType.Closure); 781044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(1), { z: 22, w: 5, v: "Capybara" }, ScopeType.Closure); 791044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(2), { x: 5 }, ScopeType.Closure); 801044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(3), {}, ScopeType.Global); 811044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 821044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgvar f2 = (function() { 831044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var v1 = 3; 841044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var v2 = 4; 851044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org let l0 = 0; 861044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org { 871044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var v3 = 5; 881044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org let l1 = 6; 891044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org let l2 = 7; 901044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org { 911044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var v4 = 8; 921044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org let l3 = 9; 931044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org { 941044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var v5 = "Cat"; 951044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org let l4 = 11; 961044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org var v6 = l4; 971044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org return function() { 981044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org return l0 + v1 + v3 + l2 + l3 + v6; 991044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org }; 1001044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org } 1011044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org } 1021044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org } 1031044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org})(); 1041044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1051044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgvar mirror = Debug.MakeMirror(f2); 1061044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1071044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgassertEquals(5, mirror.scopeCount()); 1081044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1091044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// Implementation artifact: l4 isn't used in closure, but still it is saved. 1101044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(0), { l4: 11 }, ScopeType.Block); 1111044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org 1121044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(1), { l3: 9 }, ScopeType.Block); 1131044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(2), { l1: 6, l2: 7 }, ScopeType.Block); 1141044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(3), { v1:3, l0: 0, v3: 5, v6: 11 }, ScopeType.Closure); 1151044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgCheckScope(mirror.scope(4), {}, ScopeType.Global); 116