| 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.
|
|
|