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..0373e96000000f02c84eb65d8527abe356970d42 100644 |
--- a/test/mjsunit/regress/regress-2163.js |
+++ b/test/mjsunit/stack-traces-gc.js |
@@ -25,46 +25,55 @@ |
// (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 %MarkOneShotGetter( 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 original getter. |
+ var getter = getter_function(i); |
+ 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 original 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 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); |