Index: test/mjsunit/math-round.js |
=================================================================== |
--- test/mjsunit/math-round.js (revision 8868) |
+++ test/mjsunit/math-round.js (working copy) |
@@ -1,4 +1,4 @@ |
-// Copyright 2010 the V8 project authors. All rights reserved. |
+// Copyright 2011 the V8 project authors. All rights reserved. |
// Redistribution and use in source and binary forms, with or without |
// modification, are permitted provided that the following conditions are |
// met: |
@@ -27,10 +27,12 @@ |
// Flags: --allow-natives-syntax |
+var test_id = 0; |
function testRound(expect, input) { |
- function doRound(input) { |
- return Math.round(input); |
- } |
+ // Make source code different on each invocation to make |
+ // sure it gets optimized each time. |
+ var doRound = new Function('input', |
+ '"' + (test_id++) + '";return Math.round(input)'); |
assertEquals(expect, doRound(input)); |
assertEquals(expect, doRound(input)); |
assertEquals(expect, doRound(input)); |
@@ -44,6 +46,21 @@ |
testRound(-Infinity, -Infinity); |
testRound(NaN, NaN); |
+// Regression test for a bug where a negative zero coming from Math.round |
+// was not properly handled by other operations. |
+function roundsum(i, n) { |
+ var ret = Math.round(n); |
+ while (--i > 0) { |
+ ret += Math.round(n); |
+ } |
+ return ret; |
+} |
+assertEquals(-0, roundsum(1, -0)); |
+%OptimizeFunctionOnNextCall(roundsum); |
+// The optimized function will deopt. Run it with enough iterations to try |
+// to optimize via OSR (triggering the bug). |
+assertEquals(-0, roundsum(100000, -0)); |
+ |
testRound(1, 0.5); |
testRound(1, 0.7); |
testRound(1, 1); |