Home | History | Annotate | Download | only in mjsunit
      1 // Copyright 2008 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 // Flags: --expose-debug-as debug
     29 // Get the Debug object exposed from the debug context global object.
     30 Debug = debug.Debug
     31 
     32 // Simple object.
     33 var a = {};
     34 
     35 // Create mirror for the object.
     36 var mirror = debug.MakeMirror(a);
     37 
     38 // Initially one reference from the global object.
     39 assertEquals(1, mirror.referencedBy().length);
     40 assertEquals(1, mirror.referencedBy(0).length);
     41 assertEquals(1, mirror.referencedBy(1).length);
     42 assertEquals(1, mirror.referencedBy(10).length);
     43 
     44 // Add some more references from simple objects and arrays.
     45 var b = {}
     46 b.a = a;
     47 assertEquals(2, mirror.referencedBy().length);
     48 var c = {}
     49 c.a = a;
     50 c.aa = a;
     51 c.aaa = a;
     52 assertEquals(3, mirror.referencedBy().length);
     53 function d(){};
     54 d.a = a
     55 assertEquals(4, mirror.referencedBy().length);
     56 e = [a,b,c,d];
     57 assertEquals(5, mirror.referencedBy().length);
     58 
     59 
     60 // Simple closure.
     61 function closure_simple(p) {
     62   return function() { p = null; };
     63 }
     64 
     65 // This adds a reference (function context).
     66 f = closure_simple(a);
     67 assertEquals(6, mirror.referencedBy().length);
     68 // This clears the reference (in function context).
     69 f()
     70 assertEquals(5, mirror.referencedBy().length);
     71 
     72 // Use closure with eval - creates arguments array.
     73 function closure_eval(p, s) {
     74   if (s) {
     75     eval(s);
     76   }
     77   return function e(s) { eval(s); };
     78 }
     79 
     80 // This adds a references (function context).
     81 g = closure_eval(a);
     82 assertEquals(6, mirror.referencedBy().length);
     83 
     84 // Dynamically create a variable. This should create a context extension.
     85 h = closure_eval(null, "var x_");
     86 assertEquals(6, mirror.referencedBy().length);
     87 // Adds a reference when set.
     88 h("x_ = a");
     89 var x = mirror.referencedBy();
     90 assertEquals(7, mirror.referencedBy().length);
     91 // Removes a reference when cleared.
     92 h("x_ = null");
     93 assertEquals(6, mirror.referencedBy().length);
     94 
     95 // Check circular references.
     96 x = {}
     97 mirror = debug.MakeMirror(x);
     98 assertEquals(1, mirror.referencedBy().length);
     99 x.x = x;
    100 assertEquals(2, mirror.referencedBy().length);
    101 x = null;
    102 assertEquals(0, mirror.referencedBy().length);
    103 
    104 // Check many references.
    105 y = {}
    106 mirror = debug.MakeMirror(y);
    107 refs = [];
    108 for (var i = 0; i < 200; i++) {
    109   refs[i] = {'y': y};
    110 }
    111 y = null;
    112 assertEquals(200, mirror.referencedBy().length);
    113