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 // Fix some corner cases in skipping native methods using caller.
     29 var net = [];
     30 
     31 
     32 var x = 0;
     33 
     34 function collect () {
     35   function item(operator) {
     36     binary(operator, 1, false);
     37     binary(operator, 1, true);
     38     binary(operator, '{}', false);
     39     binary(operator, '{}', true);
     40     binary(operator, '"x"', false);
     41     binary(operator, '"x"', true);
     42     unary(operator, "");
     43   }
     44 
     45   function unary(op, after) {
     46     // Capture:
     47     try {
     48       eval(op + " custom " + after);
     49     } catch(e) {
     50     }
     51   }
     52 
     53   function binary(op, other_side, inverted) {
     54     // Capture:
     55     try {
     56       if (inverted) {
     57         eval("custom " + op + " " + other_side);
     58       } else {
     59         eval(other_side + " " + op + " custom");
     60       }
     61     } catch(e) {
     62     }
     63   }
     64 
     65   function catcher() {
     66     var caller = catcher.caller;
     67     if (/native/i.test(caller) || /ADD/.test(caller)) {
     68       net[caller] = 0;
     69     }
     70   }
     71 
     72   var custom = Object.create(null, {
     73     toString: { value: catcher },
     74     length: { get: catcher }
     75   });
     76 
     77   item('^');
     78   item('~');
     79   item('<<');
     80   item('<');
     81   item('==');
     82   item('>>>');
     83   item('>>');
     84   item('|');
     85   item('-');
     86   item('*');
     87   item('&');
     88   item('%');
     89   item('+');
     90   item('in');
     91   item('instanceof');
     92   unary('{}[', ']');
     93   unary('delete {}[', ']');
     94   unary('(function() {}).apply(null, ', ')');
     95 }
     96 
     97 collect();
     98 collect();
     99 collect();
    100 
    101 var keys = 0;
    102 for (var key in net) {
    103   print(key);
    104   keys++;
    105 }
    106 
    107 assertTrue(keys == 0);
    108