1003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
2003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// Redistribution and use in source and binary forms, with or without
3003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// modification, are permitted provided that the following conditions are
4003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// met:
5003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org//
6003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org//     * Redistributions of source code must retain the above copyright
7003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org//       notice, this list of conditions and the following disclaimer.
8003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org//     * Redistributions in binary form must reproduce the above
9003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org//       copyright notice, this list of conditions and the following
10003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org//       disclaimer in the documentation and/or other materials provided
11003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org//       with the distribution.
12003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org//     * Neither the name of Google Inc. nor the names of its
13003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org//       contributors may be used to endorse or promote products derived
14003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org//       from this software without specific prior written permission.
15003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org//
16003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
28003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// Running this test with --trace_gc will show heap size growth due to
29003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// leaking objects via embedded maps in optimized code.
30003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
31003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgvar counter = 0;
32003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
33003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgfunction nextid() {
34003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  counter += 1;
35003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  return counter;
36003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org}
37003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
38003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgfunction Scope() {
39003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  this.id = nextid();
40003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  this.parent = null;
41003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  this.left = null;
42003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  this.right = null;
43003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  this.head = null;
44003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  this.tail = null;
45003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  this.counter = 0;
46003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org}
47003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
48003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgScope.prototype = {
49003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  new: function() {
50003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    var Child,
51003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org        child;
52003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    Child = function() {};
53003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    Child.prototype = this;
54003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    child = new Child();
55003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    child.id = nextid();
56003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    child.parent = this;
57003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    child.left = this.last;
58003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    child.right = null;
59003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    child.head = null;
60003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    child.tail = null;
61003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    child.counter = 0;
62003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    if (this.head) {
63003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org      this.tail.right = child;
64003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org      this.tail = child;
65003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    } else {
66003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org      this.head = this.tail = child;
67003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    }
68003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    return child;
69003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  },
70003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
71003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  destroy: function() {
72003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    if ($root == this) return;
73003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    var parent = this.parent;
74003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    if (parent.head == this) parent.head = this.right;
75003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    if (parent.tail == this) parent.tail = this.left;
76003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    if (this.left) this.left.right = this.right;
77003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org    if (this.right) this.right.left = this.left;
78003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  }
79003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org};
80003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
81003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgfunction inc(scope) {
82003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  scope.counter = scope.counter + 1;
83003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org}
84003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
85003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgvar $root = new Scope();
86003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
87003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgn = 100000;
88003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgm = 10;
89003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
90003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgfunction doit() {
91003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org   var a = $root.new();
92003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org   var b = a.new();
93003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org   inc(b);
94003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org   if (i > m) $root.head.destroy();
95003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org}
96003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
97003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgfor (var i = 0; i < n; i++) {
98003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org   doit();
99003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org}
100