Skip to content

Commit 44844eb

Browse files
committed
Internal Commands for toInteger and toLength
1 parent eb531e5 commit 44844eb

15 files changed

+117
-104
lines changed

lib/Backend/BackwardPass.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6573,6 +6573,8 @@ BackwardPass::TrackBitWiseOrNumberOp(IR::Instr *const instr)
65736573
{
65746574
// Instructions that can cause src values to escape the local scope have already been excluded
65756575

6576+
case Js::OpCode::ToInteger:
6577+
case Js::OpCode::ToLength:
65766578
case Js::OpCode::Conv_Num:
65776579
case Js::OpCode::Div_A:
65786580
case Js::OpCode::Mul_A:
@@ -7003,6 +7005,8 @@ BackwardPass::TrackIntUsage(IR::Instr *const instr)
70037005
case Js::OpCode::Ld_A:
70047006
case Js::OpCode::Conv_Num:
70057007
case Js::OpCode::ShrU_A:
7008+
case Js::OpCode::ToInteger:
7009+
case Js::OpCode::ToLength:
70067010
if(!ignoreIntOverflowCandidate)
70077011
{
70087012
// Int overflow matters for dst, so int overflow also matters for srcs

lib/Backend/GlobOpt.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8114,6 +8114,24 @@ GlobOpt::TypeSpecializeIntUnary(
81148114
opcode = Js::OpCode::Ld_I4;
81158115
break;
81168116

8117+
case Js::OpCode::ToInteger:
8118+
newMin = min;
8119+
newMax = max;
8120+
opcode = Js::OpCode::Ld_I4;
8121+
isTransfer = true;
8122+
break;
8123+
8124+
case Js::OpCode::ToLength:
8125+
if (min >= 0)
8126+
{
8127+
newMin = min;
8128+
newMax = max;
8129+
opcode = Js::OpCode::Ld_I4;
8130+
isTransfer = true;
8131+
break;
8132+
}
8133+
return false;
8134+
81178135
case Js::OpCode::Neg_A:
81188136
if (min <= 0 && max >= 0)
81198137
{

lib/Backend/IRBuilder.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1860,6 +1860,11 @@ IRBuilder::BuildReg2(Js::OpCode newOpcode, uint32 offset, Js::RegSlot R0, Js::Re
18601860
return;
18611861
}
18621862

1863+
case Js::OpCode::ToLength:
1864+
case Js::OpCode::ToInteger:
1865+
dstOpnd->SetValueType(ValueType::Int.ToLikely());
1866+
break;
1867+
18631868
case Js::OpCode::Conv_Str:
18641869
dstOpnd->SetValueType(ValueType::String);
18651870
break;

lib/Backend/JnHelperMethodList.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ HELPERCALL_MATH(Conv_ToUInt32Core, (uint32(*)(double))Js::JavascriptMath::ToUInt
136136
HELPERCALL_MATH(Op_MaxInAnArray, Js::JavascriptMath::MaxInAnArray, AttrCanThrow)
137137
HELPERCALL_MATH(Op_MinInAnArray, Js::JavascriptMath::MinInAnArray, AttrCanThrow)
138138

139+
HELPERCALLCHK(Op_ToInteger, Js::JavascriptOperators::OP_ToInteger, AttrCanThrow)
140+
HELPERCALLCHK(Op_ToLength, Js::JavascriptOperators::OP_ToLength, AttrCanThrow)
139141
HELPERCALLCHK(Op_ConvString, Js::JavascriptConversion::ToString, AttrCanThrow)
140142
HELPERCALLCHK(Op_ConvPropertyKey, Js::JavascriptOperators::OP_ToPropertyKey, AttrCanThrow)
141143
HELPERCALLCHK(Op_CoerseString, Js::JavascriptConversion::CoerseString, AttrCanThrow)

lib/Backend/Lower.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3143,6 +3143,14 @@ Lowerer::LowerRange(IR::Instr *instrStart, IR::Instr *instrEnd, bool defaultDoFa
31433143
instrPrev = this->LowerStPropIdArrFromVar(instr);
31443144
break;
31453145

3146+
case Js::OpCode::ToInteger:
3147+
this->LowerUnaryHelperMem(instr, IR::HelperOp_ToInteger);
3148+
break;
3149+
3150+
case Js::OpCode::ToLength:
3151+
this->LowerUnaryHelperMem(instr, IR::HelperOp_ToLength);
3152+
break;
3153+
31463154
#ifdef ENABLE_DEBUG_CONFIG_OPTIONS
31473155
case Js::OpCode::GeneratorOutputBailInTraceLabel:
31483156
#endif

lib/Parser/InternalCommands.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
44
//-------------------------------------------------------------------------------------------------------
55

6-
// This file is designed to be included repeatedly to provide a list of internal commands
7-
// The Command macro should be defined each time before inclusion
6+
// The Internal Command mechanism currently supports OpCodes with one or two parameters
7+
// and a return value. Any such can be enabled as Internal commands by adding them below
88

99
// command name, expected parameters
10-
Command(Conv_Num, 1)
1110
Command(Conv_Obj, 1)
11+
Command(ToInteger, 1)
12+
Command(ToLength, 1)
1213

1314
#undef Command

lib/Runtime/Base/JnDirectFields.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -650,8 +650,6 @@ ENTRY(methodName)
650650
ENTRY(registerChakraLibraryFunction)
651651
ENTRY(registerFunction)
652652
ENTRY(staticMethod)
653-
ENTRY(toLength)
654-
ENTRY(toInteger)
655653
ENTRY(arraySpeciesCreate)
656654
ENTRY(arrayCreateDataPropertyOrThrow)
657655
ENTRY(Array_values)

lib/Runtime/ByteCode/OpCodes.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,9 @@ MACRO_EXTEND_WMS( Conv_Str, Reg2, OpOpndHasImplicitCal
334334
// Operation ToPropertyKey(var)
335335
MACRO_EXTEND_WMS( Conv_Prop, Reg2, OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut)
336336

337+
MACRO_EXTEND_WMS( ToInteger, Reg2, OpSideEffect|OpTempNumberProducing|OpTempNumberTransfer|OpTempObjectSources|OpOpndHasImplicitCall|OpProducesNumber)
338+
MACRO_EXTEND_WMS( ToLength, Reg2, OpSideEffect|OpTempNumberProducing|OpTempNumberTransfer|OpTempObjectSources|OpOpndHasImplicitCall|OpProducesNumber)
339+
337340
// Conv_Obj:
338341
// OpSideEffect - May throw exception on null/undefined.
339342
// Do not call valueOf/toString no implicit call

lib/Runtime/Language/InterpreterHandler.inl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ EXDEF2_WMS(A1toA1Mem, Conv_Str, JavascriptConver
9999
EXDEF2_WMS(A1toA1Mem, Conv_Prop, JavascriptOperators::OP_ToPropertyKey)
100100
DEF2_WMS(A1toA1Mem, Conv_Obj, JavascriptOperators::ToObject)
101101
EXDEF2_WMS(A1toA1Mem, NewUnscopablesWrapperObject,JavascriptOperators::ToUnscopablesWrapperObject)
102+
EXDEF2_WMS(A1toA1Mem, ToInteger, JavascriptOperators::OP_ToInteger)
103+
EXDEF2_WMS(A1toA1Mem, ToLength, JavascriptOperators::OP_ToLength)
102104
DEF2_WMS(A1toA1Mem, Conv_Num, JavascriptOperators::ToNumber)
103105
DEF2_WMS(A1toA1Mem, Incr_A, JavascriptMath::Increment)
104106
DEF2_WMS(A1toA1Mem, Decr_A, JavascriptMath::Decrement)

lib/Runtime/Language/JavascriptOperators.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10471,6 +10471,45 @@ using namespace Js;
1047110471
JIT_HELPER_END(NewAsyncFromSyncIterator);
1047210472
}
1047310473

10474+
Var JavascriptOperators::OP_ToInteger(Var value, ScriptContext* scriptContext)
10475+
{
10476+
JIT_HELPER_REENTRANT_HEADER(Op_ToInteger);
10477+
if (TaggedInt::Is(value))
10478+
{
10479+
return value;
10480+
}
10481+
else if (JavascriptOperators::IsUndefinedOrNull(value))
10482+
{
10483+
return TaggedInt::ToVarUnchecked(0);
10484+
}
10485+
10486+
return JavascriptNumber::ToVarIntCheck(JavascriptConversion::ToInteger(value, scriptContext), scriptContext);
10487+
JIT_HELPER_END(Op_ToInteger);
10488+
}
10489+
10490+
Var JavascriptOperators::OP_ToLength(Var value, ScriptContext* scriptContext)
10491+
{
10492+
JIT_HELPER_REENTRANT_HEADER(Op_ToLength);
10493+
if (TaggedInt::Is(value))
10494+
{
10495+
if (TaggedInt::ToInt32(value) > 0)
10496+
{
10497+
return value;
10498+
}
10499+
else
10500+
{
10501+
return TaggedInt::ToVarUnchecked(0);
10502+
}
10503+
}
10504+
else if (JavascriptOperators::IsUndefinedOrNull(value))
10505+
{
10506+
return TaggedInt::ToVarUnchecked(0);
10507+
}
10508+
10509+
return JavascriptNumber::ToVar(JavascriptConversion::ToLength(value, scriptContext), scriptContext);
10510+
JIT_HELPER_END(Op_ToLength);
10511+
}
10512+
1047410513
Js::Var
1047510514
JavascriptOperators::BoxStackInstance(Js::Var instance, ScriptContext * scriptContext, bool allowStackFunction, bool deepCopy)
1047610515
{

0 commit comments

Comments
 (0)