| Index: test/mjsunit/stack-traces-gc.js
|
| diff --git a/test/mjsunit/regress/regress-2163.js b/test/mjsunit/stack-traces-gc.js
|
| similarity index 54%
|
| copy from test/mjsunit/regress/regress-2163.js
|
| copy to test/mjsunit/stack-traces-gc.js
|
| index bfce9ff462f9f42548441a086d164bb342ed21e7..579a0c80a5a64e0117426ab0ff7dd0b74f048755 100644
|
| --- a/test/mjsunit/regress/regress-2163.js
|
| +++ b/test/mjsunit/stack-traces-gc.js
|
| @@ -25,46 +25,56 @@
|
| // (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-gc
|
| +// Flags: --expose-gc --allow-natives-syntax
|
|
|
| -// Handy abbreviation.
|
| -var dp = Object.defineProperty;
|
| +var fired = [];
|
| +for (var i = 0; i < 100; i++) fired[i] = false;
|
|
|
| -function getter() { return 111; }
|
| -function setter(x) { print(222); }
|
| -function anotherGetter() { return 333; }
|
| -function anotherSetter(x) { print(444); }
|
| -var obj1, obj2;
|
| +function getter_function(i) {
|
| + return function() { fired[i] = true; };
|
| +}
|
| +
|
| +// Error objects that die young.
|
| +for (var i = 0; i < 100; i++) {
|
| + var error = new Error();
|
| + // Replace the getter to observe whether it has been fired,
|
| + // and disguise it as native.
|
| + var getter = getter_function(i);
|
| + %SetNativeFlag(getter);
|
| + error.__defineGetter__("stack", getter);
|
| +
|
| + error = undefined;
|
| +}
|
|
|
| -// obj1 and obj2 share the getter accessor.
|
| -obj1 = {};
|
| -dp(obj1, "alpha", { get: getter, set: setter });
|
| -obj2 = {}
|
| -dp(obj2, "alpha", { get: getter });
|
| -obj1 = {};
|
| -assertEquals(111, obj2.alpha);
|
| gc();
|
| -assertEquals(111, obj2.alpha);
|
| +for (var i = 0; i < 100; i++) assertFalse(fired[i]);
|
| +
|
| +// Error objects that are kept alive.
|
| +var array = [];
|
| +for (var i = 0; i < 100; i++) {
|
| + var error = new Error();
|
| + var getter = getter_function(i);
|
| + // Replace the getter to observe whether it has been fired,
|
| + // and disguise it as native.
|
| + %SetNativeFlag(getter);
|
| + error.__defineGetter__("stack", getter);
|
| +
|
| + array.push(error);
|
| + error = undefined;
|
| +}
|
|
|
| -// obj1, obj2, and obj3 share the getter accessor.
|
| -obj1 = {};
|
| -dp(obj1, "alpha", { get: getter, set: setter });
|
| -obj2 = {}
|
| -dp(obj2, "alpha", { get: getter });
|
| -obj1 = {};
|
| gc();
|
| -obj3 = {}
|
| -dp(obj3, "alpha", { get: getter });
|
| +// We don't expect all stack traces to be formatted after only one GC.
|
| +assertTrue(fired[0]);
|
|
|
| +for (var i = 0; i < 10; i++) gc();
|
| +for (var i = 0; i < 100; i++) assertTrue(fired[i]);
|
|
|
| -// obj1 and obj2 share the getter and setter accessor.
|
| -obj1 = {};
|
| -dp(obj1, "alpha", { get: getter, set: setter });
|
| -obj1.beta = 10;
|
| -obj2 = {}
|
| -dp(obj2, "alpha", { get: getter, set: setter });
|
| -obj1 = {};
|
| -assertEquals(111, obj2.alpha);
|
| +// Error objects with custom (non-native) stack getter.
|
| +var custom_error = new Error();
|
| +var custom_getter_fired = false;
|
| +custom_error.__defineGetter__("stack",
|
| + function() { custom_getter_fired = true; });
|
| gc();
|
| -obj2.alpha = 100
|
| -assertEquals(111, obj2.alpha);
|
| +assertFalse(custom_getter_fired);
|
| +
|
|
|