Home | History | Annotate | Download | only in regress
      1 // Copyright 2012 the V8 project authors. All rights reserved.
      2 // Redistribution and use in source and binary forms, with or without
      3 // modification, are permitted provided that the following conditions are
      4 // met:
      5 //
      6 //     * Redistributions of source code must retain the above copyright
      7 //       notice, this list of conditions and the following disclaimer.
      8 //     * Redistributions in binary form must reproduce the above
      9 //       copyright notice, this list of conditions and the following
     10 //       disclaimer in the documentation and/or other materials provided
     11 //       with the distribution.
     12 //     * Neither the name of Google Inc. nor the names of its
     13 //       contributors may be used to endorse or promote products derived
     14 //       from this software without specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 
     28 // Test that global eval calls of strict code (independent from whether being
     29 // direct or indirect) have their own lexical and variable environment.
     30 
     31 var evil = eval;
     32 
     33 // Test global direct strict eval.
     34 // Expects new environment.
     35 var no_touch = 0;
     36 eval('"use strict"; var no_touch = 1;');
     37 assertSame(0, no_touch);
     38 
     39 // Test global indirect strict eval.
     40 // Expects new environment.
     41 var no_touch = 0;
     42 evil('"use strict"; var no_touch = 2;');
     43 assertSame(0, no_touch);
     44 
     45 // Test global direct non-strict eval.
     46 // Expects global environment.
     47 var no_touch = 0;
     48 eval('var no_touch = 3;');
     49 assertSame(3, no_touch);
     50 
     51 // Test global indirect non-strict eval.
     52 // Expects global environment.
     53 var no_touch = 0;
     54 evil('var no_touch = 4;');
     55 assertSame(4, no_touch);
     56 
     57 // Test non-global direct strict eval in non-strict function.
     58 // Expects new environment.
     59 var no_touch = 0;
     60 (function() {
     61   var no_touch = 0;
     62   eval('"use strict"; var no_touch = 5;');
     63   assertSame(0, no_touch);
     64 })()
     65 assertSame(0, no_touch);
     66 
     67 // Test non-global indirect strict eval in non-strict function.
     68 // Expects new environment.
     69 var no_touch = 0;
     70 (function() {
     71   var no_touch = 0;
     72   evil('"use strict"; var no_touch = 6;');
     73   assertSame(0, no_touch);
     74 })()
     75 assertSame(0, no_touch);
     76 
     77 // Test non-global direct non-strict eval in non-strict function.
     78 // Expects function environment.
     79 var no_touch = 0;
     80 (function() {
     81   var no_touch = 0;
     82   eval('var no_touch = 7;');
     83   assertSame(7, no_touch);
     84 })()
     85 assertSame(0, no_touch);
     86 
     87 // Test non-global indirect non-strict eval in non-strict function.
     88 // Expects global environment.
     89 var no_touch = 0;
     90 (function() {
     91   var no_touch = 0;
     92   evil('var no_touch = 8;');
     93   assertSame(0, no_touch);
     94 })()
     95 assertSame(8, no_touch);
     96 
     97 // Test non-global direct strict eval in strict function.
     98 // Expects new environment.
     99 var no_touch = 0;
    100 (function() {
    101   "use strict";
    102   var no_touch = 0;
    103   eval('"use strict"; var no_touch = 9;');
    104   assertSame(0, no_touch);
    105 })()
    106 assertSame(0, no_touch);
    107 
    108 // Test non-global indirect strict eval in strict function.
    109 // Expects new environment.
    110 var no_touch = 0;
    111 (function() {
    112   "use strict";
    113   var no_touch = 0;
    114   evil('"use strict"; var no_touch = 10;');
    115   assertSame(0, no_touch);
    116 })()
    117 assertSame(0, no_touch);
    118 
    119 // Test non-global direct non-strict eval in strict function.
    120 // Expects new environment.
    121 var no_touch = 0;
    122 (function() {
    123   "use strict";
    124   var no_touch = 0;
    125   eval('var no_touch = 11;');
    126   assertSame(0, no_touch);
    127 })()
    128 assertSame(0, no_touch);
    129 
    130 // Test non-global indirect non-strict eval in strict function.
    131 // Expects global environment.
    132 var no_touch = 0;
    133 (function() {
    134   "use strict";
    135   var no_touch = 0;
    136   evil('var no_touch = 12;');
    137   assertSame(0, no_touch);
    138 })()
    139 assertSame(12, no_touch);
    140