blob: 4e40b044c734eb4001f4c0d6dde450b7f692e3a1 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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
31var counter = 0;
32
33function nextid() {
34 counter += 1;
35 return counter;
36}
37
38function 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
48Scope.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
81function inc(scope) {
82 scope.counter = scope.counter + 1;
83}
84
85var $root = new Scope();
86
87n = 100000;
88m = 10;
89
90function doit() {
91 var a = $root.new();
92 var b = a.new();
93 inc(b);
94 if (i > m) $root.head.destroy();
95}
96
97for (var i = 0; i < n; i++) {
98 doit();
99}