Skip to content

Commit 9074c1d

Browse files
committed
Unreviewed, relanding 266519@main
https://bugs.webkit.org/show_bug.cgi?id=259749 rdar://113292761 Relanding 266519@main with one fix, adding OpCallIgnoreResult to ArrayProfile list in Opcode.h * LayoutTests/platform/ios-wk2/fast/dom/focus-dialog-blur-input-type-change-crash-expected.txt: * Source/JavaScriptCore/bytecode/BytecodeList.rb: * Source/JavaScriptCore/bytecode/BytecodeOperandsForCheckpoint.h: (JSC::destinationFor): * Source/JavaScriptCore/bytecode/BytecodeUseDef.cpp: (JSC::computeUsesForBytecodeIndexImpl): (JSC::computeDefsForBytecodeIndexImpl): * Source/JavaScriptCore/bytecode/CallLinkInfo.cpp: (JSC::CallLinkInfo::callTypeFor): * Source/JavaScriptCore/bytecode/CodeBlock.cpp: (JSC::CodeBlock::finishCreation): * Source/JavaScriptCore/bytecode/Opcode.h: * Source/JavaScriptCore/bytecode/OpcodeInlines.h: (JSC::isOpcodeShape): * Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::generate): (JSC::BytecodeGenerator::BytecodeGenerator): (JSC::BytecodeGenerator::emitCallInTailPosition): (JSC::BytecodeGenerator::emitCall): (JSC::BytecodeGenerator::emitCallVarargsInTailPosition): (JSC::BytecodeGenerator::emitCallForwardArgumentsInTailPosition): * Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h: (JSC::BytecodeGenerator::emitNode): (JSC::BytecodeGenerator::emitNodeInTailPositionFromReturnNode): (JSC::BytecodeGenerator::emitNodeInTailPositionFromExprStatementNode): * Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp: (JSC::ExprStatementNode::emitBytecode): (JSC::ReturnNode::emitBytecode): * Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::getPredictionWithoutOSRExit): (JSC::DFG::ByteCodeParser::handleCallVariant): (JSC::DFG::ByteCodeParser::handleMinMax): (JSC::DFG::ByteCodeParser::handleIntrinsicCall): (JSC::DFG::ByteCodeParser::parseBlock): * Source/JavaScriptCore/dfg/DFGGraph.cpp: (JSC::DFG::Graph::methodOfGettingAValueProfileFor): * Source/JavaScriptCore/dfg/DFGNodeType.h: * Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp: (JSC::DFG::callerReturnPC): (JSC::DFG::reifyInlinedCallFrames): * Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::compileFunction): * Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::emitCall): * Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::lower): (JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq): * Source/JavaScriptCore/ftl/FTLSlowPathCall.h: (JSC::FTL::callOperation): * Source/JavaScriptCore/jit/CallFrameShuffler.cpp: (JSC::CallFrameShuffler::prepareAny): * Source/JavaScriptCore/jit/JIT.cpp: (JSC::JIT::privateCompileMainPass): (JSC::JIT::privateCompileSlowCases): * Source/JavaScriptCore/jit/JIT.h: * Source/JavaScriptCore/jit/JITCall.cpp: (JSC::JIT::compileSetupFrame): (JSC::JIT::compileOpCall): (JSC::JIT::emit_op_call_ignore_result): (JSC::JIT::emitSlow_op_call_ignore_result): * Source/JavaScriptCore/llint/LLIntOpcode.h: * Source/JavaScriptCore/llint/LLIntThunks.cpp: (JSC::LLInt::returnLocationThunk): * Source/JavaScriptCore/llint/LowLevelInterpreter.asm: * Source/JavaScriptCore/llint/LowLevelInterpreter.cpp: (JSC::CLoop::execute): * Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm: * Source/JavaScriptCore/llint/LowLevelInterpreter64.asm: * Source/JavaScriptCore/runtime/FileBasedFuzzerAgent.cpp: (JSC::FileBasedFuzzerAgent::getPredictionInternal): * Source/JavaScriptCore/runtime/Gate.h: * Source/JavaScriptCore/runtime/PredictionFileCreatingFuzzerAgent.cpp: (JSC::PredictionFileCreatingFuzzerAgent::getPredictionInternal): Canonical link: https://commits.webkit.org/266537@main
1 parent ad82b55 commit 9074c1d

32 files changed

Lines changed: 264 additions & 113 deletions
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
CONSOLE MESSAGE: RangeError: Maximum call stack size exceeded.
2+
CONSOLE MESSAGE: RangeError: Maximum call stack size exceeded.
23
PASS

‎Source/JavaScriptCore/bytecode/BytecodeList.rb‎

Lines changed: 78 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,17 @@
516516
profile: ValueProfile,
517517
}
518518

519+
op :call_ignore_result,
520+
args: {
521+
callee: VirtualRegister,
522+
argc: unsigned,
523+
argv: unsigned,
524+
},
525+
metadata: {
526+
callLinkInfo: BaselineCallLinkInfo,
527+
arrayProfile: ArrayProfile,
528+
}
529+
519530
op :get_argument,
520531
args: {
521532
dst: VirtualRegister,
@@ -1375,58 +1386,8 @@
13751386
macro_name_component: :CLOOP_BYTECODE_HELPER
13761387

13771388
op :llint_entry
1378-
op :llint_return_to_host
13791389
op :llint_vm_entry_to_javascript
13801390
op :llint_vm_entry_to_native
1381-
op :llint_cloop_did_return_from_js_1
1382-
op :llint_cloop_did_return_from_js_2
1383-
op :llint_cloop_did_return_from_js_3
1384-
op :llint_cloop_did_return_from_js_4
1385-
op :llint_cloop_did_return_from_js_5
1386-
op :llint_cloop_did_return_from_js_6
1387-
op :llint_cloop_did_return_from_js_7
1388-
op :llint_cloop_did_return_from_js_8
1389-
op :llint_cloop_did_return_from_js_9
1390-
op :llint_cloop_did_return_from_js_10
1391-
op :llint_cloop_did_return_from_js_11
1392-
op :llint_cloop_did_return_from_js_12
1393-
op :llint_cloop_did_return_from_js_13
1394-
op :llint_cloop_did_return_from_js_14
1395-
op :llint_cloop_did_return_from_js_15
1396-
op :llint_cloop_did_return_from_js_16
1397-
op :llint_cloop_did_return_from_js_17
1398-
op :llint_cloop_did_return_from_js_18
1399-
op :llint_cloop_did_return_from_js_19
1400-
op :llint_cloop_did_return_from_js_20
1401-
op :llint_cloop_did_return_from_js_21
1402-
op :llint_cloop_did_return_from_js_22
1403-
op :llint_cloop_did_return_from_js_23
1404-
op :llint_cloop_did_return_from_js_24
1405-
op :llint_cloop_did_return_from_js_25
1406-
op :llint_cloop_did_return_from_js_26
1407-
op :llint_cloop_did_return_from_js_27
1408-
op :llint_cloop_did_return_from_js_28
1409-
op :llint_cloop_did_return_from_js_29
1410-
op :llint_cloop_did_return_from_js_30
1411-
op :llint_cloop_did_return_from_js_31
1412-
op :llint_cloop_did_return_from_js_32
1413-
op :llint_cloop_did_return_from_js_33
1414-
op :llint_cloop_did_return_from_js_34
1415-
op :llint_cloop_did_return_from_js_35
1416-
op :llint_cloop_did_return_from_js_36
1417-
op :llint_cloop_did_return_from_js_37
1418-
op :llint_cloop_did_return_from_js_38
1419-
op :llint_cloop_did_return_from_js_39
1420-
op :llint_cloop_did_return_from_js_40
1421-
op :llint_cloop_did_return_from_js_41
1422-
op :llint_cloop_did_return_from_js_42
1423-
op :llint_cloop_did_return_from_js_43
1424-
op :llint_cloop_did_return_from_js_44
1425-
op :llint_cloop_did_return_from_js_45
1426-
op :llint_cloop_did_return_from_js_46
1427-
op :llint_cloop_did_return_from_js_47
1428-
op :llint_cloop_did_return_from_js_48
1429-
op :llint_cloop_did_return_from_js_49
14301391

14311392
end_section :CLoopHelpers
14321393

@@ -1461,6 +1422,7 @@
14611422
op :llint_get_host_call_return_value
14621423
op :llint_handle_uncaught_exception
14631424
op :op_call_return_location
1425+
op :op_call_ignore_result_return_location
14641426
op :op_construct_return_location
14651427
op :op_call_varargs_return_location
14661428
op :op_construct_varargs_return_location
@@ -1476,6 +1438,7 @@
14761438
op :wasm_function_prologue_simd
14771439

14781440
op :op_call_slow_return_location
1441+
op :op_call_ignore_result_slow_return_location
14791442
op :op_construct_slow_return_location
14801443
op :op_iterator_open_slow_return_location
14811444
op :op_iterator_next_slow_return_location
@@ -1485,12 +1448,14 @@
14851448
op :op_call_direct_eval_slow_return_location
14861449

14871450
op :js_trampoline_op_call
1451+
op :js_trampoline_op_call_ignore_result
14881452
op :js_trampoline_op_construct
14891453
op :js_trampoline_op_call_varargs
14901454
op :js_trampoline_op_construct_varargs
14911455
op :js_trampoline_op_iterator_next
14921456
op :js_trampoline_op_iterator_open
14931457
op :js_trampoline_op_call_slow
1458+
op :js_trampoline_op_call_ignore_result_slow
14941459
op :js_trampoline_op_tail_call_slow
14951460
op :js_trampoline_op_construct_slow
14961461
op :js_trampoline_op_call_varargs_slow
@@ -1512,6 +1477,69 @@
15121477

15131478
end_section :NativeHelpers
15141479

1480+
begin_section :CLoopReturnHelpers,
1481+
emit_in_h_file: true,
1482+
macro_name_component: :CLOOP_RETURN_HELPER
1483+
1484+
op :llint_return_to_host
1485+
op :llint_cloop_did_return_from_js_1
1486+
op :llint_cloop_did_return_from_js_2
1487+
op :llint_cloop_did_return_from_js_3
1488+
op :llint_cloop_did_return_from_js_4
1489+
op :llint_cloop_did_return_from_js_5
1490+
op :llint_cloop_did_return_from_js_6
1491+
op :llint_cloop_did_return_from_js_7
1492+
op :llint_cloop_did_return_from_js_8
1493+
op :llint_cloop_did_return_from_js_9
1494+
op :llint_cloop_did_return_from_js_10
1495+
op :llint_cloop_did_return_from_js_11
1496+
op :llint_cloop_did_return_from_js_12
1497+
op :llint_cloop_did_return_from_js_13
1498+
op :llint_cloop_did_return_from_js_14
1499+
op :llint_cloop_did_return_from_js_15
1500+
op :llint_cloop_did_return_from_js_16
1501+
op :llint_cloop_did_return_from_js_17
1502+
op :llint_cloop_did_return_from_js_18
1503+
op :llint_cloop_did_return_from_js_19
1504+
op :llint_cloop_did_return_from_js_20
1505+
op :llint_cloop_did_return_from_js_21
1506+
op :llint_cloop_did_return_from_js_22
1507+
op :llint_cloop_did_return_from_js_23
1508+
op :llint_cloop_did_return_from_js_24
1509+
op :llint_cloop_did_return_from_js_25
1510+
op :llint_cloop_did_return_from_js_26
1511+
op :llint_cloop_did_return_from_js_27
1512+
op :llint_cloop_did_return_from_js_28
1513+
op :llint_cloop_did_return_from_js_29
1514+
op :llint_cloop_did_return_from_js_30
1515+
op :llint_cloop_did_return_from_js_31
1516+
op :llint_cloop_did_return_from_js_32
1517+
op :llint_cloop_did_return_from_js_33
1518+
op :llint_cloop_did_return_from_js_34
1519+
op :llint_cloop_did_return_from_js_35
1520+
op :llint_cloop_did_return_from_js_36
1521+
op :llint_cloop_did_return_from_js_37
1522+
op :llint_cloop_did_return_from_js_38
1523+
op :llint_cloop_did_return_from_js_39
1524+
op :llint_cloop_did_return_from_js_40
1525+
op :llint_cloop_did_return_from_js_41
1526+
op :llint_cloop_did_return_from_js_42
1527+
op :llint_cloop_did_return_from_js_43
1528+
op :llint_cloop_did_return_from_js_44
1529+
op :llint_cloop_did_return_from_js_45
1530+
op :llint_cloop_did_return_from_js_46
1531+
op :llint_cloop_did_return_from_js_47
1532+
op :llint_cloop_did_return_from_js_48
1533+
op :llint_cloop_did_return_from_js_49
1534+
op :llint_cloop_did_return_from_js_50
1535+
op :llint_cloop_did_return_from_js_51
1536+
op :llint_cloop_did_return_from_js_52
1537+
op :llint_cloop_did_return_from_js_53
1538+
op :llint_cloop_did_return_from_js_54
1539+
op :llint_cloop_did_return_from_js_55
1540+
1541+
end_section :CLoopReturnHelpers
1542+
15151543
begin_section :Wasm,
15161544
emit_in_h_file: true,
15171545
emit_in_structs_file: true,

‎Source/JavaScriptCore/bytecode/BytecodeOperandsForCheckpoint.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ Operand destinationFor(const Bytecode& bytecode, unsigned checkpointIndex, JITTy
111111
default: RELEASE_ASSERT_NOT_REACHED();
112112
}
113113
return { };
114+
} else if constexpr (Bytecode::opcodeID == op_call_ignore_result) {
115+
return { };
114116
} else
115117
return bytecode.m_dst;
116118
}

‎Source/JavaScriptCore/bytecode/BytecodeUseDef.cpp‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,9 @@ void computeUsesForBytecodeIndexImpl(const JSInstruction* instruction, Checkpoin
336336
case op_tail_call:
337337
handleOpCallLike(instruction->as<OpTailCall>());
338338
return;
339+
case op_call_ignore_result:
340+
handleOpCallLike(instruction->as<OpCallIgnoreResult>());
341+
return;
339342

340343
default:
341344
RELEASE_ASSERT_NOT_REACHED();
@@ -411,6 +414,7 @@ void computeDefsForBytecodeIndexImpl(unsigned numVars, const JSInstruction* inst
411414
case op_profile_type:
412415
case op_profile_control_flow:
413416
case op_put_to_arguments:
417+
case op_call_ignore_result:
414418
case op_set_function_name:
415419
case op_check_traps:
416420
case op_log_shadow_chicken_prologue:

‎Source/JavaScriptCore/bytecode/CallLinkInfo.cpp‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ CallLinkInfo::CallType CallLinkInfo::callTypeFor(OpcodeID opcodeID)
4848
return TailCallVarargs;
4949

5050
case op_call:
51+
case op_call_ignore_result:
5152
case op_call_direct_eval:
5253
case op_iterator_open:
5354
case op_iterator_next:

‎Source/JavaScriptCore/bytecode/CodeBlock.cpp‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,7 @@ bool CodeBlock::finishCreation(VM& vm, ScriptExecutable* ownerExecutable, Unlink
524524
LINK(OpTailCallVarargs, callLinkInfo)
525525
LINK(OpTailCallForwardArguments, callLinkInfo)
526526
LINK(OpConstructVarargs, callLinkInfo, profile)
527+
LINK(OpCallIgnoreResult, callLinkInfo)
527528

528529
case op_new_array_with_species: {
529530
INITIALIZE_METADATA(OpNewArrayWithSpecies)

‎Source/JavaScriptCore/bytecode/Opcode.h‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ namespace JSC {
5656

5757

5858
#if ENABLE(C_LOOP)
59-
const int numOpcodeIDs = NUMBER_OF_BYTECODE_IDS + NUMBER_OF_CLOOP_BYTECODE_HELPER_IDS + NUMBER_OF_BYTECODE_HELPER_IDS;
59+
const int numOpcodeIDs = NUMBER_OF_BYTECODE_IDS + NUMBER_OF_CLOOP_BYTECODE_HELPER_IDS + NUMBER_OF_BYTECODE_HELPER_IDS + NUMBER_OF_CLOOP_RETURN_HELPER_IDS;
6060
#else
6161
const int numOpcodeIDs = NUMBER_OF_BYTECODE_IDS + NUMBER_OF_BYTECODE_HELPER_IDS;
6262
#endif
@@ -132,6 +132,7 @@ static constexpr unsigned bitWidthForMaxBytecodeStructLength = WTF::getMSBSetCon
132132
macro(OpTailCallVarargs) \
133133
macro(OpTailCallForwardArguments) \
134134
macro(OpConstructVarargs) \
135+
macro(OpCallIgnoreResult) \
135136

136137
#define FOR_EACH_OPCODE_WITH_SIMPLE_ARRAY_PROFILE(macro) \
137138
macro(OpGetByVal) \
@@ -145,6 +146,7 @@ static constexpr unsigned bitWidthForMaxBytecodeStructLength = WTF::getMSBSetCon
145146
macro(OpEnumeratorHasOwnProperty) \
146147
macro(OpNewArrayWithSpecies) \
147148
macro(OpCall) \
149+
macro(OpCallIgnoreResult) \
148150
macro(OpTailCall) \
149151
macro(OpIteratorOpen) \
150152

‎Source/JavaScriptCore/bytecode/OpcodeInlines.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ inline bool isOpcodeShape(OpcodeID opcodeID)
4646
|| opcodeID == op_tail_call
4747
|| opcodeID == op_call_direct_eval
4848
|| opcodeID == op_call_varargs
49+
|| opcodeID == op_call_ignore_result
4950
|| opcodeID == op_tail_call_varargs
5051
|| opcodeID == op_tail_call_forward_arguments
5152
|| opcodeID == op_iterator_open

‎Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp‎

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,12 @@ ParserError BytecodeGenerator::generate(unsigned& size)
337337
RELEASE_ASSERT(m_codeBlock->numCalleeLocals() < static_cast<unsigned>(FirstConstantRegisterIndex));
338338
size = instructions().size();
339339
m_codeBlock->finalize(m_writer.finalize());
340+
341+
// We limit total bytecode sequence size to int32_t so that we can use int32_t jump offsets.
342+
// Also, this allows us to use one bit of bytecode for some flag, including "ignore-result-flag".
343+
if (size > static_cast<unsigned>(INT32_MAX))
344+
return ParserError(ParserError::OutOfMemory);
345+
340346
if (m_expressionTooDeep)
341347
return ParserError(ParserError::OutOfMemory);
342348
return ParserError(ParserError::ErrorNone);
@@ -353,7 +359,8 @@ BytecodeGenerator::BytecodeGenerator(VM& vm, ProgramNode* programNode, UnlinkedP
353359
, m_expressionTooDeep(false)
354360
, m_isBuiltinFunction(false)
355361
, m_usesSloppyEval(false)
356-
, m_inTailPosition(false)
362+
, m_allowTailCallOptimization(false)
363+
, m_allowCallIgnoreResultOptimization(false)
357364
, m_needsToUpdateArrowFunctionContext(programNode->usesArrowFunction() || programNode->usesEval())
358365
, m_ecmaMode(ECMAMode::fromBool(programNode->isStrictMode()))
359366
{
@@ -405,7 +412,10 @@ BytecodeGenerator::BytecodeGenerator(VM& vm, FunctionNode* functionNode, Unlinke
405412
// https://bugs.webkit.org/show_bug.cgi?id=148819
406413
//
407414
// Note that we intentionally enable tail call for naked constructors since it does not have special code for "return".
408-
, m_inTailPosition(Options::useTailCalls() && !isConstructor() && constructorKind() == ConstructorKind::None && functionNode->isStrictMode())
415+
, m_allowTailCallOptimization(Options::useTailCalls() && !isConstructor() && constructorKind() == ConstructorKind::None && functionNode->isStrictMode())
416+
// Currently, we're only conservatively allowing CallIgnoreResult optimization on tail call results that are
417+
// not in return statements. We're not attempting to eliminate all unused call results.
418+
, m_allowCallIgnoreResultOptimization(true)
409419
, m_needsToUpdateArrowFunctionContext(functionNode->usesArrowFunction() || functionNode->usesEval())
410420
, m_ecmaMode(ECMAMode::fromBool(functionNode->isStrictMode()))
411421
, m_derivedContextType(codeBlock->derivedContextType())
@@ -902,7 +912,8 @@ BytecodeGenerator::BytecodeGenerator(VM& vm, EvalNode* evalNode, UnlinkedEvalCod
902912
, m_expressionTooDeep(false)
903913
, m_isBuiltinFunction(false)
904914
, m_usesSloppyEval(evalNode->usesEval() && !evalNode->isStrictMode())
905-
, m_inTailPosition(false)
915+
, m_allowTailCallOptimization(false)
916+
, m_allowCallIgnoreResultOptimization(false)
906917
, m_needsToUpdateArrowFunctionContext(evalNode->usesArrowFunction() || evalNode->usesEval())
907918
, m_ecmaMode(ECMAMode::fromBool(evalNode->isStrictMode()))
908919
, m_derivedContextType(codeBlock->derivedContextType())
@@ -965,7 +976,8 @@ BytecodeGenerator::BytecodeGenerator(VM& vm, ModuleProgramNode* moduleProgramNod
965976
, m_expressionTooDeep(false)
966977
, m_isBuiltinFunction(false)
967978
, m_usesSloppyEval(false)
968-
, m_inTailPosition(false)
979+
, m_allowTailCallOptimization(false)
980+
, m_allowCallIgnoreResultOptimization(false)
969981
, m_needsToUpdateArrowFunctionContext(moduleProgramNode->usesArrowFunction() || moduleProgramNode->usesEval())
970982
, m_ecmaMode(ECMAMode::strict())
971983
{
@@ -3472,10 +3484,12 @@ RegisterID* BytecodeGenerator::emitCall(RegisterID* dst, RegisterID* func, Expec
34723484

34733485
RegisterID* BytecodeGenerator::emitCallInTailPosition(RegisterID* dst, RegisterID* func, ExpectedFunction expectedFunction, CallArguments& callArguments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd, DebuggableCall debuggableCall)
34743486
{
3475-
if (m_inTailPosition) {
3487+
if (m_allowTailCallOptimization) {
34763488
m_codeBlock->setHasTailCalls();
34773489
return emitCall<OpTailCall>(dst, func, expectedFunction, callArguments, divot, divotStart, divotEnd, debuggableCall);
34783490
}
3491+
if (m_allowCallIgnoreResultOptimization)
3492+
return emitCall<OpCallIgnoreResult>(dst, func, expectedFunction, callArguments, divot, divotStart, divotEnd, debuggableCall);
34793493
return emitCall<OpCall>(dst, func, expectedFunction, callArguments, divot, divotStart, divotEnd, debuggableCall);
34803494
}
34813495

@@ -3546,7 +3560,7 @@ template<typename CallOp>
35463560
RegisterID* BytecodeGenerator::emitCall(RegisterID* dst, RegisterID* func, ExpectedFunction expectedFunction, CallArguments& callArguments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd, DebuggableCall debuggableCall)
35473561
{
35483562
constexpr auto opcodeID = CallOp::opcodeID;
3549-
ASSERT(opcodeID == op_call || opcodeID == op_call_direct_eval || opcodeID == op_tail_call);
3563+
ASSERT(opcodeID == op_call || opcodeID == op_call_direct_eval || opcodeID == op_tail_call || opcodeID == op_call_ignore_result);
35503564
ASSERT(func->refCount());
35513565

35523566
// Generate code for arguments.
@@ -3596,7 +3610,11 @@ RegisterID* BytecodeGenerator::emitCall(RegisterID* dst, RegisterID* func, Expec
35963610
ASSERT(dst != ignoredResult());
35973611
if constexpr (opcodeID == op_call_direct_eval)
35983612
CallOp::emit(this, dst, func, callArguments.argumentCountIncludingThis(), callArguments.stackOffset(), thisRegister(), scopeRegister(), ecmaMode());
3599-
else
3613+
else if constexpr (opcodeID == op_call_ignore_result) {
3614+
CallOp::emit(this, func, callArguments.argumentCountIncludingThis(), callArguments.stackOffset());
3615+
if (shouldEmitTypeProfilerHooks())
3616+
emitLoad(dst, jsUndefined());
3617+
} else
36003618
CallOp::emit(this, dst, func, callArguments.argumentCountIncludingThis(), callArguments.stackOffset());
36013619

36023620
if (expectedFunction != NoExpectedFunction)
@@ -3612,7 +3630,7 @@ RegisterID* BytecodeGenerator::emitCallVarargs(RegisterID* dst, RegisterID* func
36123630

36133631
RegisterID* BytecodeGenerator::emitCallVarargsInTailPosition(RegisterID* dst, RegisterID* func, RegisterID* thisRegister, RegisterID* arguments, RegisterID* firstFreeRegister, int32_t firstVarArgOffset, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd, DebuggableCall debuggableCall)
36143632
{
3615-
if (m_inTailPosition)
3633+
if (m_allowTailCallOptimization)
36163634
return emitCallVarargs<OpTailCallVarargs>(dst, func, thisRegister, arguments, firstFreeRegister, firstVarArgOffset, divot, divotStart, divotEnd, debuggableCall);
36173635
return emitCallVarargs<OpCallVarargs>(dst, func, thisRegister, arguments, firstFreeRegister, firstVarArgOffset, divot, divotStart, divotEnd, debuggableCall);
36183636
}
@@ -3625,7 +3643,7 @@ RegisterID* BytecodeGenerator::emitConstructVarargs(RegisterID* dst, RegisterID*
36253643
RegisterID* BytecodeGenerator::emitCallForwardArgumentsInTailPosition(RegisterID* dst, RegisterID* func, RegisterID* thisRegister, RegisterID* firstFreeRegister, int32_t firstVarArgOffset, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd, DebuggableCall debuggableCall)
36263644
{
36273645
// We must emit a tail call here because we did not allocate an arguments object thus we would otherwise have no way to correctly make this call.
3628-
ASSERT(m_inTailPosition || !Options::useTailCalls());
3646+
ASSERT(m_allowTailCallOptimization || !Options::useTailCalls());
36293647
return emitCallVarargs<OpTailCallForwardArguments>(dst, func, thisRegister, nullptr, firstFreeRegister, firstVarArgOffset, divot, divotStart, divotEnd, debuggableCall);
36303648
}
36313649

0 commit comments

Comments
 (0)