Index: test/mjsunit/regress/regress-2073.js |
diff --git a/test/mjsunit/regress/regress-147497.js b/test/mjsunit/regress/regress-2073.js |
similarity index 53% |
copy from test/mjsunit/regress/regress-147497.js |
copy to test/mjsunit/regress/regress-2073.js |
index 92e29d12589984b0cf34a91d7cac3479a04bfbaa..4e40b044c734eb4001f4c0d6dde450b7f692e3a1 100644 |
--- a/test/mjsunit/regress/regress-147497.js |
+++ b/test/mjsunit/regress/regress-2073.js |
@@ -25,21 +25,75 @@ |
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
-// Flags: --expose-debug-as debug |
+// Running this test with --trace_gc will show heap size growth due to |
+// leaking objects via embedded maps in optimized code. |
-Debug = debug.Debug; |
+var counter = 0; |
-function listener(event, exec_state, event_data, data) { |
- if (event == Debug.DebugEvent.Break) { |
- exec_state.prepareStep(Debug.StepAction.StepNext, 10); |
+function nextid() { |
+ counter += 1; |
+ return counter; |
+} |
+ |
+function Scope() { |
+ this.id = nextid(); |
+ this.parent = null; |
+ this.left = null; |
+ this.right = null; |
+ this.head = null; |
+ this.tail = null; |
+ this.counter = 0; |
+} |
+ |
+Scope.prototype = { |
+ new: function() { |
+ var Child, |
+ child; |
+ Child = function() {}; |
+ Child.prototype = this; |
+ child = new Child(); |
+ child.id = nextid(); |
+ child.parent = this; |
+ child.left = this.last; |
+ child.right = null; |
+ child.head = null; |
+ child.tail = null; |
+ child.counter = 0; |
+ if (this.head) { |
+ this.tail.right = child; |
+ this.tail = child; |
+ } else { |
+ this.head = this.tail = child; |
+ } |
+ return child; |
+ }, |
+ |
+ destroy: function() { |
+ if ($root == this) return; |
+ var parent = this.parent; |
+ if (parent.head == this) parent.head = this.right; |
+ if (parent.tail == this) parent.tail = this.left; |
+ if (this.left) this.left.right = this.right; |
+ if (this.right) this.right.left = this.left; |
} |
}; |
-Debug.setListener(listener); |
+function inc(scope) { |
+ scope.counter = scope.counter + 1; |
+} |
+ |
+var $root = new Scope(); |
+ |
+n = 100000; |
+m = 10; |
-var statement = ""; |
-for (var i = 0; i < 1024; i++) statement += "z"; |
-statement = 'with(0)' + statement + '=function foo(){}'; |
+function doit() { |
+ var a = $root.new(); |
+ var b = a.new(); |
+ inc(b); |
+ if (i > m) $root.head.destroy(); |
+} |
-debugger; |
-eval(statement); |
+for (var i = 0; i < n; i++) { |
+ doit(); |
+} |