michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: //----------------------------------------------------------------------------- michael@0: var BUGNUMBER = 394709; michael@0: var summary = 'Do not leak with object.watch and closure'; michael@0: var actual = 'No Leak'; michael@0: var expect = 'No Leak'; michael@0: michael@0: if (typeof countHeap == 'undefined') michael@0: { michael@0: countHeap = function () { michael@0: print('This test requires countHeap which is not supported'); michael@0: return 0; michael@0: }; michael@0: } michael@0: michael@0: //----------------------------------------------------------------------------- michael@0: test(); michael@0: //----------------------------------------------------------------------------- michael@0: michael@0: function test() michael@0: { michael@0: enterFunc ('test'); michael@0: printBugNumber(BUGNUMBER); michael@0: printStatus (summary); michael@0: michael@0: // Ensure that we flush all values so that gc() collects all objects that michael@0: // the user cannot reach from JS. michael@0: eval(); michael@0: michael@0: runtest(); michael@0: gc(); michael@0: var count1 = countHeap(); michael@0: runtest(); michael@0: gc(); michael@0: var count2 = countHeap(); michael@0: runtest(); michael@0: gc(); michael@0: var count3 = countHeap(); michael@0: /* Try to be tolerant of conservative GC noise: we want a steady leak. */ michael@0: if (count1 < count2 && count2 < count3) michael@0: throw "A leaky watch point is detected"; michael@0: michael@0: function runtest () { michael@0: var obj = { b: 0 }; michael@0: obj.watch('b', watcher); michael@0: michael@0: function watcher(id, old, value) { michael@0: ++obj.n; michael@0: return value; michael@0: } michael@0: } michael@0: michael@0: reportCompare(expect, actual, summary); michael@0: michael@0: exitFunc ('test'); michael@0: }