Home | History | Annotate | Download | only in regress
      1 // Copyright 2013 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 // Running this test with --trace_gc will show heap size growth due to
     29 // leaking objects via embedded maps in optimized code.
     30 
     31 var counter = 0;
     32 
     33 function nextid() {
     34   counter += 1;
     35   return counter;
     36 }
     37 
     38 function Scope() {
     39   this.id = nextid();
     40   this.parent = null;
     41   this.left = null;
     42   this.right = null;
     43   this.head = null;
     44   this.tail = null;
     45   this.counter = 0;
     46 }
     47 
     48 Scope.prototype = {
     49   new: function() {
     50     var Child,
     51         child;
     52     Child = function() {};
     53     Child.prototype = this;
     54     child = new Child();
     55     child.id = nextid();
     56     child.parent = this;
     57     child.left = this.last;
     58     child.right = null;
     59     child.head = null;
     60     child.tail = null;
     61     child.counter = 0;
     62     if (this.head) {
     63       this.tail.right = child;
     64       this.tail = child;
     65     } else {
     66       this.head = this.tail = child;
     67     }
     68     return child;
     69   },
     70 
     71   destroy: function() {
     72     if ($root == this) return;
     73     var parent = this.parent;
     74     if (parent.head == this) parent.head = this.right;
     75     if (parent.tail == this) parent.tail = this.left;
     76     if (this.left) this.left.right = this.right;
     77     if (this.right) this.right.left = this.left;
     78   }
     79 };
     80 
     81 function inc(scope) {
     82   scope.counter = scope.counter + 1;
     83 }
     84 
     85 var $root = new Scope();
     86 
     87 n = 100000;
     88 m = 10;
     89 
     90 function doit() {
     91    var a = $root.new();
     92    var b = a.new();
     93    inc(b);
     94    if (i > m) $root.head.destroy();
     95 }
     96 
     97 for (var i = 0; i < n; i++) {
     98    doit();
     99 }
    100