Skip to content

Commit 44a59f2

Browse files
committed
[MERGE #5613 @sigatrev] MSFT:18327064 OpHelpers returning ints as floats leading to infinite bailouts
Merge pull request #5613 from sigatrev:stringOpt The following operations on a number as a string all returned doubles even when the value was integral, causing bailouts on some array operations. ``` var i = "1"; +i // Op_ConvNumber_Full ++i; // Op_Increment_Full -i; // Op_Negate_Full --i; // Op_Decrement_Full 1 - i; // Op_Subract_Full 1 * i; // Op_Multiply_Ful 1 ** i // Op_Exponentiation_Full 1 % i // Op_Modulus_Full var ary = [0,1]; // will bail out infinitely ary[+i]; ``` This is already checked in on the OS side
2 parents 8f90719 + 3e4c983 commit 44a59f2

File tree

3 files changed

+14
-10
lines changed

3 files changed

+14
-10
lines changed

lib/Runtime/Language/JavascriptOperators.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10544,7 +10544,7 @@ using namespace Js;
1054410544
return aRight;
1054510545
}
1054610546

10547-
return JavascriptNumber::ToVarNoCheck(JavascriptConversion::ToNumber_Full(aRight, scriptContext), scriptContext);
10547+
return JavascriptNumber::ToVarIntCheck(JavascriptConversion::ToNumber_Full(aRight, scriptContext), scriptContext);
1054810548
JIT_HELPER_END(Op_ConvNumber_Full);
1054910549
}
1055010550

lib/Runtime/Library/JavascriptNumber.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,13 @@ namespace Js
3636

3737
Var JavascriptNumber::ToVarInPlace(int64 value, ScriptContext* scriptContext, JavascriptNumber *result)
3838
{
39-
return InPlaceNew((double)value, scriptContext, result);
40-
}
39+
if (!TaggedInt::IsOverflow(value))
40+
{
41+
return TaggedInt::ToVarUnchecked(static_cast<int>(value));
42+
}
4143

44+
return InPlaceNew(static_cast<double>(value), scriptContext, result);
45+
}
4246

4347
Var JavascriptNumber::ToVarMaybeInPlace(double value, ScriptContext* scriptContext, JavascriptNumber *result)
4448
{

lib/Runtime/Math/JavascriptMath.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ using namespace Js;
1414
}
1515

1616
double value = Negate_Helper(aRight, scriptContext);
17-
return JavascriptNumber::ToVarNoCheck(value, scriptContext);
17+
return JavascriptNumber::ToVarIntCheck(value, scriptContext);
1818
JIT_HELPER_END(Op_Negate_Full);
1919
}
2020
JIT_HELPER_TEMPLATE(Op_Negate_Full, Op_Negate)
@@ -77,7 +77,7 @@ using namespace Js;
7777
}
7878

7979
double inc = Increment_Helper(aRight, scriptContext);
80-
return JavascriptNumber::ToVarNoCheck(inc, scriptContext);
80+
return JavascriptNumber::ToVarIntCheck(inc, scriptContext);
8181
JIT_HELPER_END(Op_Increment_Full);
8282
}
8383
JIT_HELPER_TEMPLATE(Op_Increment_Full, Op_Increment)
@@ -104,7 +104,7 @@ using namespace Js;
104104
}
105105

106106
double dec = Decrement_Helper(aRight,scriptContext);
107-
return JavascriptNumber::ToVarNoCheck(dec, scriptContext);
107+
return JavascriptNumber::ToVarIntCheck(dec, scriptContext);
108108
JIT_HELPER_END(Op_Decrement_Full);
109109
}
110110
JIT_HELPER_TEMPLATE(Op_Decrement_Full, Op_Decrement)
@@ -792,7 +792,7 @@ using namespace Js;
792792
{
793793
JIT_HELPER_REENTRANT_HEADER(Op_Subtract_Full);
794794
double difference = Subtract_Helper(aLeft, aRight, scriptContext);
795-
return JavascriptNumber::ToVarNoCheck(difference, scriptContext);
795+
return JavascriptNumber::ToVarIntCheck(difference, scriptContext);
796796
JIT_HELPER_END(Op_Subtract_Full);
797797
}
798798
JIT_HELPER_TEMPLATE(Op_Subtract_Full, Op_Subtract)
@@ -825,7 +825,7 @@ using namespace Js;
825825
JIT_HELPER_REENTRANT_HEADER(Op_Exponentiation_Full);
826826
double x = JavascriptConversion::ToNumber(aLeft, scriptContext);
827827
double y = JavascriptConversion::ToNumber(aRight, scriptContext);
828-
return JavascriptNumber::ToVarNoCheck(Math::Pow(x, y), scriptContext);
828+
return JavascriptNumber::ToVarIntCheck(Math::Pow(x, y), scriptContext);
829829
JIT_HELPER_END(Op_Exponentiation_Full);
830830
}
831831
JIT_HELPER_TEMPLATE(Op_Exponentiation_Full, Op_Exponentiation)
@@ -874,7 +874,7 @@ using namespace Js;
874874
return TaggedInt::Multiply(aLeft, aRight, scriptContext);
875875
}
876876
double product = Multiply_Helper(aLeft, aRight, scriptContext);
877-
return JavascriptNumber::ToVarNoCheck(product, scriptContext);
877+
return JavascriptNumber::ToVarIntCheck(product, scriptContext);
878878
JIT_HELPER_END(Op_Multiply_Full);
879879
}
880880
JIT_HELPER_TEMPLATE(Op_Multiply_Full, Op_Multiply)
@@ -939,7 +939,7 @@ using namespace Js;
939939
}
940940

941941
double remainder = Modulus_Helper(aLeft, aRight, scriptContext);
942-
return JavascriptNumber::ToVarNoCheck(remainder, scriptContext);
942+
return JavascriptNumber::ToVarIntCheck(remainder, scriptContext);
943943
JIT_HELPER_END(Op_Modulus_Full);
944944
}
945945
JIT_HELPER_TEMPLATE(Op_Modulus_Full, Op_Modulus)

0 commit comments

Comments
 (0)