Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(344)

Unified Diff: runtime/lib/integers.cc

Issue 15743017: Adds a flag to the standalone vm to throw an exception on 53-bit integer overflow. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/lib/integers.cc
===================================================================
--- runtime/lib/integers.cc (revision 23032)
+++ runtime/lib/integers.cc (working copy)
@@ -13,6 +13,9 @@
namespace dart {
+DEFINE_FLAG(bool, throw_on_javascript_int_overflow, false,
+ "Throw an exception when integer arithmetic exceeds 53 bits.");
+
DEFINE_FLAG(bool, trace_intrinsified_natives, false,
"Report if any of the intrinsified natives are called");
@@ -45,6 +48,9 @@
}
const Integer& result =
Integer::Handle(left.BitOp(Token::kBIT_AND, right));
+ if (FLAG_throw_on_javascript_int_overflow) {
+ Integer::CheckForFiftyThreeBitOverflow(result, "Integer_bitAndFromInteger");
+ }
return result.AsValidInteger();
}
@@ -60,6 +66,9 @@
}
const Integer& result =
Integer::Handle(left.BitOp(Token::kBIT_OR, right));
+ if (FLAG_throw_on_javascript_int_overflow) {
+ Integer::CheckForFiftyThreeBitOverflow(result, "Integer_bitOrFromInteger");
+ }
return result.AsValidInteger();
}
@@ -75,6 +84,9 @@
}
const Integer& result =
Integer::Handle(left.BitOp(Token::kBIT_XOR, right));
+ if (FLAG_throw_on_javascript_int_overflow) {
+ Integer::CheckForFiftyThreeBitOverflow(result, "Integer_bitXorFromInteger");
+ }
return result.AsValidInteger();
}
@@ -90,6 +102,9 @@
}
const Integer& result =
Integer::Handle(left_int.ArithmeticOp(Token::kADD, right_int));
+ if (FLAG_throw_on_javascript_int_overflow) {
+ Integer::CheckForFiftyThreeBitOverflow(result, "Integer_addFromInteger");
+ }
return result.AsValidInteger();
}
@@ -105,6 +120,9 @@
}
const Integer& result =
Integer::Handle(left_int.ArithmeticOp(Token::kSUB, right_int));
+ if (FLAG_throw_on_javascript_int_overflow) {
+ Integer::CheckForFiftyThreeBitOverflow(result, "Integer_subFromInteger");
+ }
return result.AsValidInteger();
}
@@ -120,6 +138,9 @@
}
const Integer& result =
Integer::Handle(left_int.ArithmeticOp(Token::kMUL, right_int));
+ if (FLAG_throw_on_javascript_int_overflow) {
+ Integer::CheckForFiftyThreeBitOverflow(result, "Integer_mulFromInteger");
+ }
return result.AsValidInteger();
}
@@ -132,6 +153,10 @@
ASSERT(!right_int.IsZero());
const Integer& result =
Integer::Handle(left_int.ArithmeticOp(Token::kTRUNCDIV, right_int));
+ if (FLAG_throw_on_javascript_int_overflow) {
+ Integer::CheckForFiftyThreeBitOverflow(result,
+ "Integer_trucDivFromInteger");
+ }
return result.AsValidInteger();
}
@@ -151,6 +176,9 @@
}
const Integer& result =
Integer::Handle(left_int.ArithmeticOp(Token::kMOD, right_int));
+ if (FLAG_throw_on_javascript_int_overflow) {
+ Integer::CheckForFiftyThreeBitOverflow(result, "Integer_moduloFromInteger");
+ }
return result.AsValidInteger();
}
@@ -193,7 +221,11 @@
const int64_t int_value = strtoll(cstr, &p_end, 10);
if (p_end == (cstr + len)) {
if ((int_value != LLONG_MIN) && (int_value != LLONG_MAX)) {
- return Integer::New(int_value);
+ const Integer& i = Integer::Handle(Integer::New(int_value));
+ if (FLAG_throw_on_javascript_int_overflow) {
+ Integer::CheckForFiftyThreeBitOverflow(i, "Integer_parse");
+ }
+ return i.raw();
}
}
}
@@ -212,7 +244,11 @@
}
String& temp = String::Handle();
temp = String::Concat(Symbols::Dash(), *int_string);
- return Integer::New(temp);
+ const Integer& i = Integer::Handle(Integer::New(temp));
+ if (FLAG_throw_on_javascript_int_overflow) {
+ Integer::CheckForFiftyThreeBitOverflow(i, "Integer_parse");
+ }
+ return i.raw();
}
const Array& args = Array::Handle(Array::New(1));
@@ -274,6 +310,9 @@
ASSERT(CheckInteger(value));
const Integer& result = Integer::Handle(
ShiftOperationHelper(Token::kSHR, value, amount));
+ if (FLAG_throw_on_javascript_int_overflow) {
+ Integer::CheckForFiftyThreeBitOverflow(result, "Smi_shrFromInt");
+ }
return result.AsValidInteger();
}
@@ -290,6 +329,9 @@
}
const Integer& result = Integer::Handle(
ShiftOperationHelper(Token::kSHL, value, amount));
+ if (FLAG_throw_on_javascript_int_overflow) {
+ Integer::CheckForFiftyThreeBitOverflow(result, "Smi_shlFromInt");
+ }
return result.AsValidInteger();
}
@@ -313,7 +355,11 @@
OS::Print("Mint_bitNegate: %s\n", operand.ToCString());
}
int64_t result = ~operand.value();
- return Integer::New(result);
+ const Integer& i = Integer::Handle(Integer::New(result));
+ if (FLAG_throw_on_javascript_int_overflow) {
+ Integer::CheckForFiftyThreeBitOverflow(i, "Integer_bitAndFromInteger");
+ }
+ return i.raw();
}
// Bigint natives.

Powered by Google App Engine
This is Rietveld 408576698