Title: [293629] trunk/Source/_javascript_Core
Revision
293629
Author
[email protected]
Date
2022-04-29 13:05:32 -0700 (Fri, 29 Apr 2022)

Log Message

[JSC] Use FixedVector in JumpReplacements and VariableEventStream
https://bugs.webkit.org/show_bug.cgi?id=239892

Reviewed by Mark Lam.

1. Introduce DFG::VariableEventStreamBuilder. And construct DFG::VariableEventStream from that
builder when finailizing code generation. We also make it FixedVector.
2. Use FixedVector for JumpReplacements.

* Source/_javascript_Core/dfg/DFGCommonData.cpp:
(JSC::DFG::CommonData::shrinkToFit):
* Source/_javascript_Core/dfg/DFGCommonData.h:
* Source/_javascript_Core/dfg/DFGGenerationInfo.h:
(JSC::DFG::GenerationInfo::noticeOSRBirth):
(JSC::DFG::GenerationInfo::use):
(JSC::DFG::GenerationInfo::spill):
(JSC::DFG::GenerationInfo::setSpilled):
(JSC::DFG::GenerationInfo::fillGPR):
(JSC::DFG::GenerationInfo::fillJSValue):
(JSC::DFG::GenerationInfo::fillCell):
(JSC::DFG::GenerationInfo::fillInt32):
(JSC::DFG::GenerationInfo::fillInt52):
(JSC::DFG::GenerationInfo::fillStrictInt52):
(JSC::DFG::GenerationInfo::fillBoolean):
(JSC::DFG::GenerationInfo::fillDouble):
(JSC::DFG::GenerationInfo::fillStorage):
(JSC::DFG::GenerationInfo::appendBirth):
(JSC::DFG::GenerationInfo::appendFill):
(JSC::DFG::GenerationInfo::appendSpill):
* Source/_javascript_Core/dfg/DFGJITCode.cpp:
(JSC::DFG::JITCode::shrinkToFit):
(JSC::DFG::JITCode::reconstruct):
* Source/_javascript_Core/dfg/DFGJITCompiler.cpp:
(JSC::DFG::JITCompiler::link):
(JSC::DFG::JITCompiler::compile):
(JSC::DFG::JITCompiler::compileFunction):
(JSC::DFG::JITCompiler::exceptionCheck):
* Source/_javascript_Core/dfg/DFGSlowPathGenerator.h:
(JSC::DFG::SlowPathGenerator::SlowPathGenerator):
* Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::SpeculativeJIT):
(JSC::DFG::SpeculativeJIT::speculationCheck):
(JSC::DFG::SpeculativeJIT::emitInvalidationPoint):
(JSC::DFG::SpeculativeJIT::addSlowPathGeneratorLambda):
(JSC::DFG::SpeculativeJIT::fillStorage):
(JSC::DFG::SpeculativeJIT::compileDeleteById):
(JSC::DFG::SpeculativeJIT::compileDeleteByVal):
(JSC::DFG::SpeculativeJIT::compileInById):
(JSC::DFG::SpeculativeJIT::compileInByVal):
(JSC::DFG::SpeculativeJIT::compileHasPrivate):
(JSC::DFG::SpeculativeJIT::noticeOSRBirth):
(JSC::DFG::SpeculativeJIT::compileMovHint):
(JSC::DFG::SpeculativeJIT::compileCurrentBlock):
(JSC::DFG::SpeculativeJIT::compilePutByVal):
* Source/_javascript_Core/dfg/DFGSpeculativeJIT.h:
(JSC::DFG::SpeculativeJIT::finalizeEventStream):
(JSC::DFG::SpeculativeJIT::use):
(JSC::DFG::SpeculativeJIT::spill):
(JSC::DFG::SpeculativeJIT::recordSetLocal):
* Source/_javascript_Core/dfg/DFGSpeculativeJIT32_64.cpp:
(JSC::DFG::SpeculativeJIT::fillJSValue):
(JSC::DFG::SpeculativeJIT::cachedGetById):
(JSC::DFG::SpeculativeJIT::cachedGetByIdWithThis):
(JSC::DFG::SpeculativeJIT::emitCall):
(JSC::DFG::SpeculativeJIT::fillSpeculateInt32Internal):
(JSC::DFG::SpeculativeJIT::fillSpeculateDouble):
(JSC::DFG::SpeculativeJIT::fillSpeculateCell):
(JSC::DFG::SpeculativeJIT::fillSpeculateBoolean):
(JSC::DFG::SpeculativeJIT::compileGetByVal):
* Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::fillJSValue):
(JSC::DFG::SpeculativeJIT::cachedGetById):
(JSC::DFG::SpeculativeJIT::cachedGetByIdWithThis):
(JSC::DFG::SpeculativeJIT::emitCall):
(JSC::DFG::SpeculativeJIT::fillSpeculateInt32Internal):
(JSC::DFG::SpeculativeJIT::fillSpeculateInt52):
(JSC::DFG::SpeculativeJIT::fillSpeculateDouble):
(JSC::DFG::SpeculativeJIT::fillSpeculateCell):
(JSC::DFG::SpeculativeJIT::fillSpeculateBoolean):
(JSC::DFG::SpeculativeJIT::fillSpeculateBigInt32):
(JSC::DFG::SpeculativeJIT::compileGetByVal):
(JSC::DFG::SpeculativeJIT::compile):
* Source/_javascript_Core/dfg/DFGVariableEventStream.cpp:
(JSC::DFG::VariableEventStreamBuilder::logEvent):
(JSC::DFG::VariableEventStream::reconstruct const):
(JSC::DFG::VariableEventStream::logEvent): Deleted.
* Source/_javascript_Core/dfg/DFGVariableEventStream.h:
(JSC::DFG::VariableEventStream::VariableEventStream):
(JSC::DFG::VariableEventStreamBuilder::appendAndLog):
(JSC::DFG::VariableEventStreamBuilder::size const):
(JSC::DFG::VariableEventStreamBuilder::finalize):
(JSC::DFG::VariableEventStream::appendAndLog): Deleted.
* Source/_javascript_Core/ftl/FTLLink.cpp:
(JSC::FTL::link):
* Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp:
(JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq):
* Source/_javascript_Core/ftl/FTLState.h:

Canonical link: https://commits.webkit.org/250135@main

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (293628 => 293629)


--- trunk/Source/_javascript_Core/ChangeLog	2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/ChangeLog	2022-04-29 20:05:32 UTC (rev 293629)
@@ -1,3 +1,103 @@
+2022-04-29  Yusuke Suzuki  <[email protected]>
+
+        [JSC] Use FixedVector in JumpReplacements and VariableEventStream
+        https://bugs.webkit.org/show_bug.cgi?id=239892
+
+        Reviewed by Mark Lam.
+
+        1. Introduce DFG::VariableEventStreamBuilder. And construct DFG::VariableEventStream from that
+           builder when finailizing code generation. We also make it FixedVector.
+        2. Use FixedVector for JumpReplacements.
+
+        * dfg/DFGCommonData.cpp:
+        (JSC::DFG::CommonData::shrinkToFit):
+        * dfg/DFGCommonData.h:
+        * dfg/DFGGenerationInfo.h:
+        (JSC::DFG::GenerationInfo::noticeOSRBirth):
+        (JSC::DFG::GenerationInfo::use):
+        (JSC::DFG::GenerationInfo::spill):
+        (JSC::DFG::GenerationInfo::setSpilled):
+        (JSC::DFG::GenerationInfo::fillGPR):
+        (JSC::DFG::GenerationInfo::fillJSValue):
+        (JSC::DFG::GenerationInfo::fillCell):
+        (JSC::DFG::GenerationInfo::fillInt32):
+        (JSC::DFG::GenerationInfo::fillInt52):
+        (JSC::DFG::GenerationInfo::fillStrictInt52):
+        (JSC::DFG::GenerationInfo::fillBoolean):
+        (JSC::DFG::GenerationInfo::fillDouble):
+        (JSC::DFG::GenerationInfo::fillStorage):
+        (JSC::DFG::GenerationInfo::appendBirth):
+        (JSC::DFG::GenerationInfo::appendFill):
+        (JSC::DFG::GenerationInfo::appendSpill):
+        * dfg/DFGJITCode.cpp:
+        (JSC::DFG::JITCode::shrinkToFit):
+        (JSC::DFG::JITCode::reconstruct):
+        * dfg/DFGJITCompiler.cpp:
+        (JSC::DFG::JITCompiler::link):
+        (JSC::DFG::JITCompiler::compile):
+        (JSC::DFG::JITCompiler::compileFunction):
+        (JSC::DFG::JITCompiler::exceptionCheck):
+        * dfg/DFGSlowPathGenerator.h:
+        (JSC::DFG::SlowPathGenerator::SlowPathGenerator):
+        * dfg/DFGSpeculativeJIT.cpp:
+        (JSC::DFG::SpeculativeJIT::SpeculativeJIT):
+        (JSC::DFG::SpeculativeJIT::speculationCheck):
+        (JSC::DFG::SpeculativeJIT::emitInvalidationPoint):
+        (JSC::DFG::SpeculativeJIT::addSlowPathGeneratorLambda):
+        (JSC::DFG::SpeculativeJIT::fillStorage):
+        (JSC::DFG::SpeculativeJIT::compileDeleteById):
+        (JSC::DFG::SpeculativeJIT::compileDeleteByVal):
+        (JSC::DFG::SpeculativeJIT::compileInById):
+        (JSC::DFG::SpeculativeJIT::compileInByVal):
+        (JSC::DFG::SpeculativeJIT::compileHasPrivate):
+        (JSC::DFG::SpeculativeJIT::noticeOSRBirth):
+        (JSC::DFG::SpeculativeJIT::compileMovHint):
+        (JSC::DFG::SpeculativeJIT::compileCurrentBlock):
+        (JSC::DFG::SpeculativeJIT::compilePutByVal):
+        * dfg/DFGSpeculativeJIT.h:
+        (JSC::DFG::SpeculativeJIT::finalizeEventStream):
+        (JSC::DFG::SpeculativeJIT::use):
+        (JSC::DFG::SpeculativeJIT::spill):
+        (JSC::DFG::SpeculativeJIT::recordSetLocal):
+        * dfg/DFGSpeculativeJIT32_64.cpp:
+        (JSC::DFG::SpeculativeJIT::fillJSValue):
+        (JSC::DFG::SpeculativeJIT::cachedGetById):
+        (JSC::DFG::SpeculativeJIT::cachedGetByIdWithThis):
+        (JSC::DFG::SpeculativeJIT::emitCall):
+        (JSC::DFG::SpeculativeJIT::fillSpeculateInt32Internal):
+        (JSC::DFG::SpeculativeJIT::fillSpeculateDouble):
+        (JSC::DFG::SpeculativeJIT::fillSpeculateCell):
+        (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean):
+        (JSC::DFG::SpeculativeJIT::compileGetByVal):
+        * dfg/DFGSpeculativeJIT64.cpp:
+        (JSC::DFG::SpeculativeJIT::fillJSValue):
+        (JSC::DFG::SpeculativeJIT::cachedGetById):
+        (JSC::DFG::SpeculativeJIT::cachedGetByIdWithThis):
+        (JSC::DFG::SpeculativeJIT::emitCall):
+        (JSC::DFG::SpeculativeJIT::fillSpeculateInt32Internal):
+        (JSC::DFG::SpeculativeJIT::fillSpeculateInt52):
+        (JSC::DFG::SpeculativeJIT::fillSpeculateDouble):
+        (JSC::DFG::SpeculativeJIT::fillSpeculateCell):
+        (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean):
+        (JSC::DFG::SpeculativeJIT::fillSpeculateBigInt32):
+        (JSC::DFG::SpeculativeJIT::compileGetByVal):
+        (JSC::DFG::SpeculativeJIT::compile):
+        * dfg/DFGVariableEventStream.cpp:
+        (JSC::DFG::VariableEventStreamBuilder::logEvent):
+        (JSC::DFG::VariableEventStream::reconstruct const):
+        (JSC::DFG::VariableEventStream::logEvent): Deleted.
+        * dfg/DFGVariableEventStream.h:
+        (JSC::DFG::VariableEventStream::VariableEventStream):
+        (JSC::DFG::VariableEventStreamBuilder::appendAndLog):
+        (JSC::DFG::VariableEventStreamBuilder::size const):
+        (JSC::DFG::VariableEventStreamBuilder::finalize):
+        (JSC::DFG::VariableEventStream::appendAndLog): Deleted.
+        * ftl/FTLLink.cpp:
+        (JSC::FTL::link):
+        * ftl/FTLLowerDFGToB3.cpp:
+        (JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq):
+        * ftl/FTLState.h:
+
 2022-04-29  Yury Semikhatsky  <[email protected]>
 
         Format time zone name using ICU instead of platform calls

Modified: trunk/Source/_javascript_Core/dfg/DFGCommonData.cpp (293628 => 293629)


--- trunk/Source/_javascript_Core/dfg/DFGCommonData.cpp	2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGCommonData.cpp	2022-04-29 20:05:32 UTC (rev 293629)
@@ -42,7 +42,6 @@
 void CommonData::shrinkToFit()
 {
     codeOrigins->shrinkToFit();
-    m_jumpReplacements.shrinkToFit();
 }
 
 static Lock pcCodeBlockMapLock;

Modified: trunk/Source/_javascript_Core/dfg/DFGCommonData.h (293628 => 293629)


--- trunk/Source/_javascript_Core/dfg/DFGCommonData.h	2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGCommonData.h	2022-04-29 20:05:32 UTC (rev 293629)
@@ -129,7 +129,7 @@
     FixedVector<AdaptiveInferredPropertyValueWatchpoint> m_adaptiveInferredPropertyValueWatchpoints;
     std::unique_ptr<PCToCodeOriginMap> m_pcToCodeOriginMap;
     RecordedStatuses recordedStatuses;
-    Vector<JumpReplacement> m_jumpReplacements;
+    FixedVector<JumpReplacement> m_jumpReplacements;
     Bag<StructureStubInfo> m_stubInfos;
     Bag<OptimizingCallLinkInfo> m_callLinkInfos;
     Yarr::YarrBoyerMoyerData m_boyerMooreData;

Modified: trunk/Source/_javascript_Core/dfg/DFGGenerationInfo.h (293628 => 293629)


--- trunk/Source/_javascript_Core/dfg/DFGGenerationInfo.h	2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGGenerationInfo.h	2022-04-29 20:05:32 UTC (rev 293629)
@@ -148,7 +148,7 @@
     // Get the node that produced this value.
     Node* node() { return m_node; }
     
-    void noticeOSRBirth(VariableEventStream& stream, Node* node, VirtualRegister virtualRegister)
+    void noticeOSRBirth(VariableEventStreamBuilder& stream, Node* node, VirtualRegister virtualRegister)
     {
         if (m_node != node)
             return;
@@ -170,7 +170,7 @@
     // Mark the value as having been used (decrement the useCount).
     // Returns true if this was the last use of the value, and any
     // associated machine registers may be freed.
-    bool use(VariableEventStream& stream)
+    bool use(VariableEventStreamBuilder& stream)
     {
         ASSERT(m_useCount);
         bool result = !--m_useCount;
@@ -268,7 +268,7 @@
     }
 
     // Called when a VirtualRegister is being spilled to the JSStack for the first time.
-    void spill(VariableEventStream& stream, VirtualRegister virtualRegister, DataFormat spillFormat)
+    void spill(VariableEventStreamBuilder& stream, VirtualRegister virtualRegister, DataFormat spillFormat)
     {
         // We shouldn't be spill values that don't need spilling.
         ASSERT(!m_canFill);
@@ -286,7 +286,7 @@
 
     // Called on values that don't need spilling (constants and values that have
     // already been spilled), to mark them as no longer being in machine registers.
-    void setSpilled(VariableEventStream& stream, VirtualRegister virtualRegister)
+    void setSpilled(VariableEventStreamBuilder& stream, VirtualRegister virtualRegister)
     {
         // Should only be called on values that don't need spilling, and are currently in registers.
         ASSERT(m_canFill && m_registerFormat != DataFormatNone);
@@ -302,7 +302,7 @@
         m_canFill = false;
     }
     
-    void fillGPR(VariableEventStream& stream, GPRReg gpr, DataFormat format)
+    void fillGPR(VariableEventStreamBuilder& stream, GPRReg gpr, DataFormat format)
     {
         ASSERT(gpr != InvalidGPRReg);
         m_registerFormat = format;
@@ -314,13 +314,13 @@
     // Record that this value is filled into machine registers,
     // tracking which registers, and what format the value has.
 #if USE(JSVALUE64)
-    void fillJSValue(VariableEventStream& stream, GPRReg gpr, DataFormat format = DataFormatJS)
+    void fillJSValue(VariableEventStreamBuilder& stream, GPRReg gpr, DataFormat format = DataFormatJS)
     {
         ASSERT(format & DataFormatJS);
         fillGPR(stream, gpr, format);
     }
 #elif USE(JSVALUE32_64)
-    void fillJSValue(VariableEventStream& stream, GPRReg tagGPR, GPRReg payloadGPR, DataFormat format = DataFormatJS)
+    void fillJSValue(VariableEventStreamBuilder& stream, GPRReg tagGPR, GPRReg payloadGPR, DataFormat format = DataFormatJS)
     {
         ASSERT(format & DataFormatJS);
         m_registerFormat = format;
@@ -330,33 +330,33 @@
         if (m_bornForOSR)
             appendFill(Fill, stream);
     }
-    void fillCell(VariableEventStream& stream, GPRReg gpr)
+    void fillCell(VariableEventStreamBuilder& stream, GPRReg gpr)
     {
         fillGPR(stream, gpr, DataFormatCell);
     }
 #endif
-    void fillInt32(VariableEventStream& stream, GPRReg gpr)
+    void fillInt32(VariableEventStreamBuilder& stream, GPRReg gpr)
     {
         fillGPR(stream, gpr, DataFormatInt32);
     }
-    void fillInt52(VariableEventStream& stream, GPRReg gpr, DataFormat format)
+    void fillInt52(VariableEventStreamBuilder& stream, GPRReg gpr, DataFormat format)
     {
         ASSERT(format == DataFormatInt52 || format == DataFormatStrictInt52);
         fillGPR(stream, gpr, format);
     }
-    void fillInt52(VariableEventStream& stream, GPRReg gpr)
+    void fillInt52(VariableEventStreamBuilder& stream, GPRReg gpr)
     {
         fillGPR(stream, gpr, DataFormatInt52);
     }
-    void fillStrictInt52(VariableEventStream& stream, GPRReg gpr)
+    void fillStrictInt52(VariableEventStreamBuilder& stream, GPRReg gpr)
     {
         fillGPR(stream, gpr, DataFormatStrictInt52);
     }
-    void fillBoolean(VariableEventStream& stream, GPRReg gpr)
+    void fillBoolean(VariableEventStreamBuilder& stream, GPRReg gpr)
     {
         fillGPR(stream, gpr, DataFormatBoolean);
     }
-    void fillDouble(VariableEventStream& stream, FPRReg fpr)
+    void fillDouble(VariableEventStreamBuilder& stream, FPRReg fpr)
     {
         ASSERT(fpr != InvalidFPRReg);
         m_registerFormat = DataFormatDouble;
@@ -365,7 +365,7 @@
         if (m_bornForOSR)
             appendFill(Fill, stream);
     }
-    void fillStorage(VariableEventStream& stream, GPRReg gpr)
+    void fillStorage(VariableEventStreamBuilder& stream, GPRReg gpr)
     {
         fillGPR(stream, gpr, DataFormatStorage);
     }
@@ -399,12 +399,12 @@
     }
 
 private:
-    void appendBirth(VariableEventStream& stream)
+    void appendBirth(VariableEventStreamBuilder& stream)
     {
         stream.appendAndLog(VariableEvent::birth(MinifiedID(m_node)));
     }
     
-    void appendFill(VariableEventKind kind, VariableEventStream& stream)
+    void appendFill(VariableEventKind kind, VariableEventStreamBuilder& stream)
     {
         ASSERT(m_bornForOSR);
         
@@ -421,7 +421,7 @@
         stream.appendAndLog(VariableEvent::fillGPR(kind, MinifiedID(m_node), u.gpr, m_registerFormat));
     }
     
-    void appendSpill(VariableEventKind kind, VariableEventStream& stream, VirtualRegister virtualRegister)
+    void appendSpill(VariableEventKind kind, VariableEventStreamBuilder& stream, VirtualRegister virtualRegister)
     {
         stream.appendAndLog(VariableEvent::spill(kind, MinifiedID(m_node), virtualRegister, m_spillFormat));
     }

Modified: trunk/Source/_javascript_Core/dfg/DFGJITCode.cpp (293628 => 293629)


--- trunk/Source/_javascript_Core/dfg/DFGJITCode.cpp	2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGJITCode.cpp	2022-04-29 20:05:32 UTC (rev 293629)
@@ -59,7 +59,6 @@
 {
     common.shrinkToFit();
     minifiedDFG.prepareAndShrink();
-    variableEventStream.shrinkToFit();
 }
 
 void JITCode::reconstruct(
@@ -66,8 +65,7 @@
     CodeBlock* codeBlock, CodeOrigin codeOrigin, unsigned streamIndex,
     Operands<ValueRecovery>& result)
 {
-    variableEventStream.reconstruct(
-        codeBlock, codeOrigin, minifiedDFG, streamIndex, result);
+    variableEventStream.reconstruct(codeBlock, codeOrigin, minifiedDFG, streamIndex, result);
 }
 
 void JITCode::reconstruct(CallFrame* callFrame, CodeBlock* codeBlock, CodeOrigin codeOrigin, unsigned streamIndex, Operands<std::optional<JSValue>>& result)

Modified: trunk/Source/_javascript_Core/dfg/DFGJITCompiler.cpp (293628 => 293629)


--- trunk/Source/_javascript_Core/dfg/DFGJITCompiler.cpp	2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGJITCompiler.cpp	2022-04-29 20:05:32 UTC (rev 293629)
@@ -291,6 +291,7 @@
     if (!m_exceptionChecksWithCallFrameRollback.empty())
         linkBuffer.link(m_exceptionChecksWithCallFrameRollback, CodeLocationLabel(vm().getCTIStub(handleExceptionWithCallFrameRollbackGenerator).retaggedCode<NoPtrTag>()));
 
+    Vector<JumpReplacement> jumpReplacements;
     MacroAssemblerCodeRef<JITThunkPtrTag> osrExitThunk = vm().getCTIStub(osrExitGenerationThunkGenerator);
     auto target = CodeLocationLabel<JITThunkPtrTag>(osrExitThunk.code());
     for (unsigned i = 0; i < m_osrExit.size(); ++i) {
@@ -303,11 +304,12 @@
         }
 
         if (info.m_replacementSource.isSet()) {
-            m_jitCode->common.m_jumpReplacements.append(JumpReplacement(
+            jumpReplacements.append(JumpReplacement(
                 linkBuffer.locationOf<JSInternalPtrTag>(info.m_replacementSource),
                 linkBuffer.locationOf<OSRExitPtrTag>(info.m_replacementDestination)));
         }
     }
+    m_jitCode->common.m_jumpReplacements = WTFMove(jumpReplacements);
     
     if (UNLIKELY(m_graph.compilation())) {
         ASSERT(m_exitSiteLabels.size() == m_osrExit.size());
@@ -415,6 +417,7 @@
 
     auto codeRef = FINALIZE_DFG_CODE(*linkBuffer, JSEntryPtrTag, "DFG JIT code for %s", toCString(CodeBlockWithJITType(m_codeBlock, JITType::DFGJIT)).data());
     m_jitCode->initializeCodeRefForDFG(codeRef, codeRef.code());
+    m_jitCode->variableEventStream = m_speculative->finalizeEventStream();
 
     auto finalizer = makeUnique<JITFinalizer>(m_graph.m_plan, m_jitCode.releaseNonNull(), WTFMove(linkBuffer));
     m_graph.m_plan.setFinalizer(WTFMove(finalizer));
@@ -525,6 +528,7 @@
     m_jitCode->initializeCodeRefForDFG(
         FINALIZE_DFG_CODE(*linkBuffer, JSEntryPtrTag, "DFG JIT code for %s", toCString(CodeBlockWithJITType(m_codeBlock, JITType::DFGJIT)).data()),
         withArityCheck);
+    m_jitCode->variableEventStream = m_speculative->finalizeEventStream();
 
     auto finalizer = makeUnique<JITFinalizer>(m_graph.m_plan, m_jitCode.releaseNonNull(), WTFMove(linkBuffer), withArityCheck);
     m_graph.m_plan.setFinalizer(WTFMove(finalizer));
@@ -653,7 +657,7 @@
     HandlerInfo* exceptionHandler;
     bool willCatchException = m_graph.willCatchExceptionInMachineFrame(m_speculative->m_currentNode->origin.forExit, opCatchOrigin, exceptionHandler); 
     if (willCatchException) {
-        unsigned streamIndex = m_speculative->m_outOfLineStreamIndex ? *m_speculative->m_outOfLineStreamIndex : m_speculative->m_stream->size();
+        unsigned streamIndex = m_speculative->m_outOfLineStreamIndex ? *m_speculative->m_outOfLineStreamIndex : m_speculative->m_stream.size();
         MacroAssembler::Jump hadException = emitNonPatchableExceptionCheck(vm());
         // We assume here that this is called after callOpeartion()/appendCall() is called.
         appendExceptionHandlingOSRExit(ExceptionCheck, streamIndex, opCatchOrigin, exceptionHandler, m_jitCode->common.codeOrigins->lastCallSite(), hadException);

Modified: trunk/Source/_javascript_Core/dfg/DFGSlowPathGenerator.h (293628 => 293629)


--- trunk/Source/_javascript_Core/dfg/DFGSlowPathGenerator.h	2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGSlowPathGenerator.h	2022-04-29 20:05:32 UTC (rev 293629)
@@ -39,7 +39,7 @@
 public:
     SlowPathGenerator(SpeculativeJIT* jit)
         : m_currentNode(jit->m_currentNode)
-        , m_streamIndex(jit->m_stream->size())
+        , m_streamIndex(jit->m_stream.size())
         , m_origin(jit->m_origin) 
     {
     }

Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp (293628 => 293629)


--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp	2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp	2022-04-29 20:05:32 UTC (rev 293629)
@@ -84,7 +84,6 @@
     , m_compileOkay(true)
     , m_state(m_graph)
     , m_interpreter(m_graph, m_state)
-    , m_stream(&jit.jitCode()->variableEventStream)
     , m_minifiedGraph(&jit.jitCode()->minifiedDFG)
 {
 }
@@ -268,7 +267,7 @@
         m_jit.appendExitInfo(jumpsToFail);
     } else
         m_jit.appendExitInfo(jumpToFail);
-    m_jit.appendOSRExit(OSRExit(kind, jsValueSource, m_graph.methodOfGettingAValueProfileFor(m_currentNode, node), this, m_stream->size()));
+    m_jit.appendOSRExit(OSRExit(kind, jsValueSource, m_graph.methodOfGettingAValueProfileFor(m_currentNode, node), this, m_stream.size()));
 }
 
 void SpeculativeJIT::speculationCheck(ExitKind kind, JSValueSource jsValueSource, Node* node, const MacroAssembler::JumpList& jumpsToFail)
@@ -283,7 +282,7 @@
         m_jit.appendExitInfo(myJumpsToFail);
     } else
         m_jit.appendExitInfo(jumpsToFail);
-    m_jit.appendOSRExit(OSRExit(kind, jsValueSource, m_graph.methodOfGettingAValueProfileFor(m_currentNode, node), this, m_stream->size()));
+    m_jit.appendOSRExit(OSRExit(kind, jsValueSource, m_graph.methodOfGettingAValueProfileFor(m_currentNode, node), this, m_stream.size()));
 }
 
 OSRExitJumpPlaceholder SpeculativeJIT::speculationCheck(ExitKind kind, JSValueSource jsValueSource, Node* node)
@@ -292,7 +291,7 @@
         return OSRExitJumpPlaceholder();
     unsigned index = m_jit.m_osrExit.size();
     m_jit.appendExitInfo();
-    m_jit.appendOSRExit(OSRExit(kind, jsValueSource, m_graph.methodOfGettingAValueProfileFor(m_currentNode, node), this, m_stream->size()));
+    m_jit.appendOSRExit(OSRExit(kind, jsValueSource, m_graph.methodOfGettingAValueProfileFor(m_currentNode, node), this, m_stream.size()));
     return OSRExitJumpPlaceholder(index);
 }
 
@@ -317,7 +316,7 @@
         return;
     unsigned recoveryIndex = m_jit.appendSpeculationRecovery(recovery);
     m_jit.appendExitInfo(jumpToFail);
-    m_jit.appendOSRExit(OSRExit(kind, jsValueSource, m_graph.methodOfGettingAValueProfileFor(m_currentNode, node), this, m_stream->size(), recoveryIndex));
+    m_jit.appendOSRExit(OSRExit(kind, jsValueSource, m_graph.methodOfGettingAValueProfileFor(m_currentNode, node), this, m_stream.size(), recoveryIndex));
 }
 
 void SpeculativeJIT::speculationCheck(ExitKind kind, JSValueSource jsValueSource, Edge nodeUse, MacroAssembler::Jump jumpToFail, const SpeculationRecovery& recovery)
@@ -332,7 +331,7 @@
     OSRExitCompilationInfo& info = m_jit.appendExitInfo(JITCompiler::JumpList());
     m_jit.appendOSRExit(OSRExit(
         UncountableInvalidation, JSValueSource(), MethodOfGettingAValueProfile(),
-        this, m_stream->size()));
+        this, m_stream.size()));
     info.m_replacementSource = m_jit.watchpointLabel();
     RELEASE_ASSERT(info.m_replacementSource.isSet());
     noResult(node);
@@ -403,7 +402,7 @@
 
 void SpeculativeJIT::addSlowPathGeneratorLambda(Function<void()>&& lambda)
 {
-    m_slowPathLambdas.append(SlowPathLambda{ WTFMove(lambda), m_currentNode, static_cast<unsigned>(m_stream->size()) });
+    m_slowPathLambdas.append(SlowPathLambda { WTFMove(lambda), m_currentNode, static_cast<unsigned>(m_stream.size()) });
 }
 
 void SpeculativeJIT::runSlowPathGenerators(PCToCodeOriginMapBuilder& pcToCodeOriginMapBuilder)
@@ -992,7 +991,7 @@
             GPRReg gpr = allocate();
             m_gprs.retain(gpr, virtualRegister, SpillOrderSpilled);
             m_jit.loadPtr(JITCompiler::addressFor(virtualRegister), gpr);
-            info.fillStorage(*m_stream, gpr);
+            info.fillStorage(m_stream, gpr);
             return gpr;
         }
         
@@ -1189,7 +1188,7 @@
         GPRReg resultGPR = resultRegs.payloadGPR();
 
         CodeOrigin codeOrigin = node->origin.semantic;
-        CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+        CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
         RegisterSet usedRegisters = this->usedRegisters();
 
         JITDelByIdGenerator gen(
@@ -1275,7 +1274,7 @@
             slowCases.append(m_jit.branchIfNotCell(keyRegs));
 
         CodeOrigin codeOrigin = node->origin.semantic;
-        CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+        CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
         RegisterSet usedRegisters = this->usedRegisters();
 
         JITDelByValGenerator gen(
@@ -1355,7 +1354,7 @@
     base.use();
 
     CodeOrigin codeOrigin = node->origin.semantic;
-    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
     RegisterSet usedRegisters = this->usedRegisters();
     JITInByIdGenerator gen(
         m_jit.codeBlock(), &m_jit.jitCode()->common.m_stubInfos, JITType::DFGJIT, codeOrigin, callSite, usedRegisters, node->cacheableIdentifier(),
@@ -1407,7 +1406,7 @@
     CCallHelpers::JumpList slowCases;
 
     CodeOrigin codeOrigin = node->origin.semantic;
-    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
     RegisterSet usedRegisters = this->usedRegisters();
     JITInByValGenerator gen(
         m_jit.codeBlock(), &m_jit.jitCode()->common.m_stubInfos, JITType::DFGJIT, codeOrigin, callSite, AccessType::InByVal, usedRegisters,
@@ -1459,7 +1458,7 @@
     CCallHelpers::JumpList slowCases;
 
     CodeOrigin codeOrigin = node->origin.semantic;
-    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
     RegisterSet usedRegisters = this->usedRegisters();
     JITInByValGenerator gen(
         m_jit.codeBlock(), &m_jit.jitCode()->common.m_stubInfos, JITType::DFGJIT, codeOrigin, callSite, type, usedRegisters,
@@ -2104,7 +2103,7 @@
     VirtualRegister virtualRegister = node->virtualRegister();
     GenerationInfo& info = generationInfoFromVirtualRegister(virtualRegister);
     
-    info.noticeOSRBirth(*m_stream, node, virtualRegister);
+    info.noticeOSRBirth(m_stream, node, virtualRegister);
 }
 
 void SpeculativeJIT::compileLoopHint(Node* node)
@@ -2168,7 +2167,7 @@
     Node* child = node->child1().node();
     noticeOSRBirth(child);
     
-    m_stream->appendAndLog(VariableEvent::movHint(MinifiedID(child), node->unlinkedOperand()));
+    m_stream.appendAndLog(VariableEvent::movHint(MinifiedID(child), node->unlinkedOperand()));
 }
 
 void SpeculativeJIT::compileCheckDetached(Node* node)
@@ -2228,7 +2227,7 @@
 #endif
     }
 
-    m_stream->appendAndLog(VariableEvent::reset());
+    m_stream.appendAndLog(VariableEvent::reset());
     
     m_jit.jitAssertHasValidCallFrame();
     m_jit.jitAssertTagsInPlace();
@@ -2249,7 +2248,7 @@
             continue; // No need to record dead SetLocal's.
         format = dataFormatFor(variable->flushFormat());
         DFG_ASSERT(m_graph, node, !operand.isArgument() || operand.virtualRegister().toArgument() >= 0);
-        m_stream->appendAndLog(VariableEvent::setLocal(operand, variable->machineLocal(), format));
+        m_stream.appendAndLog(VariableEvent::setLocal(operand, variable->machineLocal(), format));
     }
 
     m_origin = NodeOrigin();
@@ -2732,7 +2731,7 @@
         speculate(node, child3);
 
         CodeOrigin codeOrigin = node->origin.semantic;
-        CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+        CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
         RegisterSet usedRegisters = this->usedRegisters();
         bool isDirect = node->op() == PutByValDirect;
         ECMAMode ecmaMode = node->ecmaMode();
@@ -4139,7 +4138,7 @@
     speculateSymbol(m_graph.child(node, 1));
 
     CodeOrigin codeOrigin = node->origin.semantic;
-    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
     RegisterSet usedRegisters = this->usedRegisters();
 
     JITCompiler::JumpList slowCases;
@@ -4344,7 +4343,7 @@
     speculateSymbol(child2, propertyGPR);
 
     CodeOrigin codeOrigin = node->origin.semantic;
-    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
     RegisterSet usedRegisters = this->usedRegisters();
 
     JITPutByValGenerator gen(
@@ -4421,7 +4420,7 @@
     speculateSymbol(node->child2(), brandGPR);
 
     CodeOrigin codeOrigin = node->origin.semantic;
-    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
     RegisterSet usedRegisters = this->usedRegisters();
 
     JITCompiler::JumpList slowCases;
@@ -4472,7 +4471,7 @@
     speculateSymbol(node->child2(), brandGPR);
 
     CodeOrigin codeOrigin = node->origin.semantic;
-    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
     RegisterSet usedRegisters = this->usedRegisters();
 
     JITCompiler::JumpList slowCases;
@@ -15820,7 +15819,7 @@
         if (scratch2GPR != InvalidGPRReg)
             usedRegisters.set(scratch2GPR, false);
     }
-    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
     JITPutByIdGenerator gen(
         m_jit.codeBlock(), &m_jit.jitCode()->common.m_stubInfos, JITType::DFGJIT, codeOrigin, callSite, usedRegisters, identifier,
         JSValueRegs::payloadOnly(baseGPR), valueRegs, stubInfoGPR,

Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.h (293628 => 293629)


--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.h	2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.h	2022-04-29 20:05:32 UTC (rev 293629)
@@ -160,6 +160,7 @@
     
     void createOSREntries();
     void linkOSREntries(LinkBuffer&);
+    Vector<VariableEvent> finalizeEventStream() { return m_stream.finalize(); }
 
     BasicBlock* nextBlock()
     {
@@ -297,7 +298,7 @@
 
         // use() returns true when the value becomes dead, and any
         // associated resources may be freed.
-        if (!info.use(*m_stream))
+        if (!info.use(m_stream))
             return;
 
         // Release the associated machine registers.
@@ -496,7 +497,7 @@
         // Check the GenerationInfo to see if this value need writing
         // to the JSStack - if not, mark it as spilled & return.
         if (!info.needsSpill()) {
-            info.setSpilled(*m_stream, spillMe);
+            info.setSpilled(m_stream, spillMe);
             return;
         }
 
@@ -506,13 +507,13 @@
             // This is special, since it's not a JS value - as in it's not visible to JS
             // code.
             m_jit.storePtr(info.gpr(), JITCompiler::addressFor(spillMe));
-            info.spill(*m_stream, spillMe, DataFormatStorage);
+            info.spill(m_stream, spillMe, DataFormatStorage);
             return;
         }
 
         case DataFormatInt32: {
             m_jit.store32(info.gpr(), JITCompiler::payloadFor(spillMe));
-            info.spill(*m_stream, spillMe, DataFormatInt32);
+            info.spill(m_stream, spillMe, DataFormatInt32);
             return;
         }
 
@@ -519,7 +520,7 @@
 #if USE(JSVALUE64)
         case DataFormatDouble: {
             m_jit.storeDouble(info.fpr(), JITCompiler::addressFor(spillMe));
-            info.spill(*m_stream, spillMe, DataFormatDouble);
+            info.spill(m_stream, spillMe, DataFormatDouble);
             return;
         }
 
@@ -526,7 +527,7 @@
         case DataFormatInt52:
         case DataFormatStrictInt52: {
             m_jit.store64(info.gpr(), JITCompiler::addressFor(spillMe));
-            info.spill(*m_stream, spillMe, spillFormat);
+            info.spill(m_stream, spillMe, spillFormat);
             return;
         }
             
@@ -542,13 +543,13 @@
             
             // Spill the value, and record it as spilled in its boxed form.
             m_jit.store64(reg, JITCompiler::addressFor(spillMe));
-            info.spill(*m_stream, spillMe, (DataFormat)(spillFormat | DataFormatJS));
+            info.spill(m_stream, spillMe, (DataFormat)(spillFormat | DataFormatJS));
             return;
 #elif USE(JSVALUE32_64)
         case DataFormatCell:
         case DataFormatBoolean: {
             m_jit.store32(info.gpr(), JITCompiler::payloadFor(spillMe));
-            info.spill(*m_stream, spillMe, spillFormat);
+            info.spill(m_stream, spillMe, spillFormat);
             return;
         }
 
@@ -555,7 +556,7 @@
         case DataFormatDouble: {
             // On JSVALUE32_64 boxing a double is a no-op.
             m_jit.storeDouble(info.fpr(), JITCompiler::addressFor(spillMe));
-            info.spill(*m_stream, spillMe, DataFormatDouble);
+            info.spill(m_stream, spillMe, DataFormatDouble);
             return;
         }
 
@@ -564,7 +565,7 @@
             RELEASE_ASSERT(spillFormat & DataFormatJS);
             m_jit.store32(info.tagGPR(), JITCompiler::tagFor(spillMe));
             m_jit.store32(info.payloadGPR(), JITCompiler::payloadFor(spillMe));
-            info.spill(*m_stream, spillMe, spillFormat);
+            info.spill(m_stream, spillMe, spillFormat);
             return;
 #endif
         }
@@ -1781,7 +1782,7 @@
         Operand bytecodeReg, VirtualRegister machineReg, DataFormat format)
     {
         ASSERT(!bytecodeReg.isArgument() || bytecodeReg.virtualRegister().toArgument() >= 0);
-        m_stream->appendAndLog(VariableEvent::setLocal(bytecodeReg, machineReg, format));
+        m_stream.appendAndLog(VariableEvent::setLocal(bytecodeReg, machineReg, format));
     }
     
     void recordSetLocal(DataFormat format)
@@ -1845,7 +1846,7 @@
     InPlaceAbstractState m_state;
     AbstractInterpreter<InPlaceAbstractState> m_interpreter;
     
-    VariableEventStream* m_stream;
+    VariableEventStreamBuilder m_stream;
     MinifiedGraph* m_minifiedGraph;
     
     Vector<std::unique_ptr<SlowPathGenerator>, 8> m_slowPathGenerators;

Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT32_64.cpp (293628 => 293629)


--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT32_64.cpp	2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT32_64.cpp	2022-04-29 20:05:32 UTC (rev 293629)
@@ -73,7 +73,7 @@
             m_jit.move(Imm32(value.payload()), payloadGPR);
             m_gprs.retain(tagGPR, virtualRegister, SpillOrderConstant);
             m_gprs.retain(payloadGPR, virtualRegister, SpillOrderConstant);
-            info.fillJSValue(*m_stream, tagGPR, payloadGPR, DataFormatJS);
+            info.fillJSValue(m_stream, tagGPR, payloadGPR, DataFormatJS);
         } else {
             DataFormat spillFormat = info.spillFormat();
             ASSERT(spillFormat != DataFormatNone && spillFormat != DataFormatStorage);
@@ -99,7 +99,7 @@
             }
             m_gprs.retain(tagGPR, virtualRegister, SpillOrderSpilled);
             m_gprs.retain(payloadGPR, virtualRegister, SpillOrderSpilled);
-            info.fillJSValue(*m_stream, tagGPR, payloadGPR, spillFormat == DataFormatJSDouble ? DataFormatJS : spillFormat);
+            info.fillJSValue(m_stream, tagGPR, payloadGPR, spillFormat == DataFormatJSDouble ? DataFormatJS : spillFormat);
         }
 
         return true;
@@ -141,7 +141,7 @@
         m_gprs.release(gpr);
         m_gprs.retain(tagGPR, virtualRegister, SpillOrderJS);
         m_gprs.retain(payloadGPR, virtualRegister, SpillOrderJS);
-        info.fillJSValue(*m_stream, tagGPR, payloadGPR, fillFormat);
+        info.fillJSValue(m_stream, tagGPR, payloadGPR, fillFormat);
         return true;
     }
 
@@ -199,7 +199,7 @@
         usedRegisters.set(JSValueRegs(resultTagGPR, resultPayloadGPR), false);
     }
     
-    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
     JITGetByIdGenerator gen(
         m_jit.codeBlock(), &m_jit.jitCode()->common.m_stubInfos, JITType::DFGJIT, codeOrigin, callSite, usedRegisters, identifier,
         JSValueRegs(baseTagGPROrNone, basePayloadGPR), JSValueRegs(resultTagGPR, resultPayloadGPR), InvalidGPRReg, type);
@@ -235,7 +235,7 @@
     UNUSED_PARAM(stubInfoGPR);
     RegisterSet usedRegisters = this->usedRegisters();
     
-    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
     JITGetByIdWithThisGenerator gen(
         m_jit.codeBlock(), &m_jit.jitCode()->common.m_stubInfos, JITType::DFGJIT, codeOrigin, callSite, usedRegisters, identifier,
         JSValueRegs(resultTagGPR, resultPayloadGPR), JSValueRegs(baseTagGPROrNone, basePayloadGPR), JSValueRegs(thisTagGPR, thisPayloadGPR), InvalidGPRReg);
@@ -783,7 +783,7 @@
     ASSERT(!isEmulatedTail || (staticInlineCallFrame && staticInlineCallFrame->getCallerSkippingTailCalls()));
     CodeOrigin dynamicOrigin =
         isEmulatedTail ? *staticInlineCallFrame->getCallerSkippingTailCalls() : staticOrigin;
-    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(dynamicOrigin, m_stream->size());
+    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(dynamicOrigin, m_stream.size());
     
     auto* info = m_jit.jitCode()->common.addCallLinkInfo(node->origin.semantic, CallLinkInfo::UseDataIC::No);
     info->setUpCall(callType, calleePayloadGPR);
@@ -973,7 +973,7 @@
             GPRReg gpr = allocate();
             m_jit.move(MacroAssembler::Imm32(edge->asInt32()), gpr);
             m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
-            info.fillInt32(*m_stream, gpr);
+            info.fillInt32(m_stream, gpr);
             returnFormat = DataFormatInt32;
             return gpr;
         }
@@ -989,7 +989,7 @@
         GPRReg gpr = allocate();
         m_jit.load32(JITCompiler::payloadFor(virtualRegister), gpr);
         m_gprs.retain(gpr, virtualRegister, SpillOrderSpilled);
-        info.fillInt32(*m_stream, gpr);
+        info.fillInt32(m_stream, gpr);
         returnFormat = DataFormatInt32;
         return gpr;
     }
@@ -1007,7 +1007,7 @@
         m_gprs.release(tagGPR);
         m_gprs.release(payloadGPR);
         m_gprs.retain(payloadGPR, virtualRegister, SpillOrderInteger);
-        info.fillInt32(*m_stream, payloadGPR);
+        info.fillInt32(m_stream, payloadGPR);
         // If !strict we're done, return.
         returnFormat = DataFormatInt32;
         return payloadGPR;
@@ -1060,7 +1060,7 @@
             FPRReg fpr = fprAllocate();
             m_jit.loadDouble(TrustedImmPtr(m_jit.addressOfDoubleConstant(edge.node())), fpr);
             m_fprs.retain(fpr, virtualRegister, SpillOrderConstant);
-            info.fillDouble(*m_stream, fpr);
+            info.fillDouble(m_stream, fpr);
             return fpr;
         }
         
@@ -1068,7 +1068,7 @@
         FPRReg fpr = fprAllocate();
         m_jit.loadDouble(JITCompiler::addressFor(virtualRegister), fpr);
         m_fprs.retain(fpr, virtualRegister, SpillOrderSpilled);
-        info.fillDouble(*m_stream, fpr);
+        info.fillDouble(m_stream, fpr);
         return fpr;
     }
 
@@ -1099,7 +1099,7 @@
             GPRReg gpr = allocate();
             m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
             m_jit.move(TrustedImmPtr(edge->constant()), gpr);
-            info.fillCell(*m_stream, gpr);
+            info.fillCell(m_stream, gpr);
             return gpr;
         }
 
@@ -1114,7 +1114,7 @@
         GPRReg gpr = allocate();
         m_jit.load32(JITCompiler::payloadFor(virtualRegister), gpr);
         m_gprs.retain(gpr, virtualRegister, SpillOrderSpilled);
-        info.fillCell(*m_stream, gpr);
+        info.fillCell(m_stream, gpr);
         return gpr;
     }
 
@@ -1139,7 +1139,7 @@
         m_gprs.release(tagGPR);
         m_gprs.release(payloadGPR);
         m_gprs.retain(payloadGPR, virtualRegister, SpillOrderCell);
-        info.fillCell(*m_stream, payloadGPR);
+        info.fillCell(m_stream, payloadGPR);
         return payloadGPR;
     }
 
@@ -1180,7 +1180,7 @@
             GPRReg gpr = allocate();
             m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
             m_jit.move(MacroAssembler::TrustedImm32(jsValue.asBoolean()), gpr);
-            info.fillBoolean(*m_stream, gpr);
+            info.fillBoolean(m_stream, gpr);
             return gpr;
         }
 
@@ -1192,7 +1192,7 @@
         GPRReg gpr = allocate();
         m_jit.load32(JITCompiler::payloadFor(virtualRegister), gpr);
         m_gprs.retain(gpr, virtualRegister, SpillOrderSpilled);
-        info.fillBoolean(*m_stream, gpr);
+        info.fillBoolean(m_stream, gpr);
         return gpr;
     }
 
@@ -1215,7 +1215,7 @@
         m_gprs.release(tagGPR);
         m_gprs.release(payloadGPR);
         m_gprs.retain(payloadGPR, virtualRegister, SpillOrderBoolean);
-        info.fillBoolean(*m_stream, payloadGPR);
+        info.fillBoolean(m_stream, payloadGPR);
         return payloadGPR;
     }
 
@@ -1819,7 +1819,7 @@
             std::tie(resultRegs, std::ignore, std::ignore) = prefix(DataFormatJS);
 
             CodeOrigin codeOrigin = node->origin.semantic;
-            CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+            CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
             RegisterSet usedRegisters = this->usedRegisters();
 
             JITCompiler::JumpList slowCases;

Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp (293628 => 293629)


--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp	2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp	2022-04-29 20:05:32 UTC (rev 293629)
@@ -84,7 +84,7 @@
         if (edge->hasConstant()) {
             JSValue jsValue = edge->asJSValue();
             m_jit.move(MacroAssembler::TrustedImm64(JSValue::encode(jsValue)), gpr);
-            info.fillJSValue(*m_stream, gpr, DataFormatJS);
+            info.fillJSValue(m_stream, gpr, DataFormatJS);
             m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
         } else {
             DataFormat spillFormat = info.spillFormat();
@@ -102,7 +102,7 @@
                 DFG_ASSERT(m_graph, m_currentNode, spillFormat & DataFormatJS, spillFormat);
                 break;
             }
-            info.fillJSValue(*m_stream, gpr, spillFormat);
+            info.fillJSValue(m_stream, gpr, spillFormat);
         }
         return gpr;
     }
@@ -118,7 +118,7 @@
         }
         m_gprs.lock(gpr);
         m_jit.or64(GPRInfo::numberTagRegister, gpr);
-        info.fillJSValue(*m_stream, gpr, DataFormatJSInt32);
+        info.fillJSValue(m_stream, gpr, DataFormatJSInt32);
         return gpr;
     }
 
@@ -155,7 +155,7 @@
 
 void SpeculativeJIT::cachedGetById(CodeOrigin codeOrigin, GPRReg baseGPR, GPRReg resultGPR, GPRReg stubInfoGPR, GPRReg scratchGPR, CacheableIdentifier identifier, JITCompiler::Jump slowPathTarget, SpillRegistersMode spillMode, AccessType type)
 {
-    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
     RegisterSet usedRegisters = this->usedRegisters();
     if (spillMode == DontSpill) {
         // We've already flushed registers to the stack, we don't need to spill these.
@@ -195,7 +195,7 @@
 
 void SpeculativeJIT::cachedGetByIdWithThis(CodeOrigin codeOrigin, GPRReg baseGPR, GPRReg thisGPR, GPRReg resultGPR, GPRReg stubInfoGPR, GPRReg scratchGPR, CacheableIdentifier identifier, const JITCompiler::JumpList& slowPathTarget)
 {
-    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
     RegisterSet usedRegisters = this->usedRegisters();
     // We've already flushed registers to the stack, we don't need to spill these.
     usedRegisters.set(baseGPR, false);
@@ -921,7 +921,7 @@
     CodeOrigin dynamicOrigin =
         isEmulatedTail ? *staticInlineCallFrame->getCallerSkippingTailCalls() : staticOrigin;
 
-    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(dynamicOrigin, m_stream->size());
+    CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(dynamicOrigin, m_stream.size());
     
     auto setResultAndResetStack = [&] () {
         GPRFlushedCallResult result(this);
@@ -1101,7 +1101,7 @@
             m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
             ASSERT(edge->isInt32Constant());
             m_jit.move(MacroAssembler::Imm32(edge->asInt32()), gpr);
-            info.fillInt32(*m_stream, gpr);
+            info.fillInt32(m_stream, gpr);
             returnFormat = DataFormatInt32;
             return gpr;
         }
@@ -1116,17 +1116,17 @@
             // If we know this was spilled as an integer we can fill without checking.
             if (strict) {
                 m_jit.load32(JITCompiler::addressFor(virtualRegister), gpr);
-                info.fillInt32(*m_stream, gpr);
+                info.fillInt32(m_stream, gpr);
                 returnFormat = DataFormatInt32;
                 return gpr;
             }
             if (spillFormat == DataFormatInt32) {
                 m_jit.load32(JITCompiler::addressFor(virtualRegister), gpr);
-                info.fillInt32(*m_stream, gpr);
+                info.fillInt32(m_stream, gpr);
                 returnFormat = DataFormatInt32;
             } else {
                 m_jit.load64(JITCompiler::addressFor(virtualRegister), gpr);
-                info.fillJSValue(*m_stream, gpr, DataFormatJSInt32);
+                info.fillJSValue(m_stream, gpr, DataFormatJSInt32);
                 returnFormat = DataFormatJSInt32;
             }
             return gpr;
@@ -1134,7 +1134,7 @@
         m_jit.load64(JITCompiler::addressFor(virtualRegister), gpr);
 
         // Fill as JSValue, and fall through.
-        info.fillJSValue(*m_stream, gpr, DataFormatJSInt32);
+        info.fillJSValue(m_stream, gpr, DataFormatJSInt32);
         m_gprs.unlock(gpr);
         FALLTHROUGH;
     }
@@ -1146,7 +1146,7 @@
         m_gprs.lock(gpr);
         if (type & ~SpecInt32Only)
             speculationCheck(BadType, JSValueRegs(gpr), edge, m_jit.branchIfNotInt32(gpr));
-        info.fillJSValue(*m_stream, gpr, DataFormatJSInt32);
+        info.fillJSValue(m_stream, gpr, DataFormatJSInt32);
         // If !strict we're done, return.
         if (!strict) {
             returnFormat = DataFormatJSInt32;
@@ -1168,7 +1168,7 @@
                 result = allocate();
             else {
                 m_gprs.lock(gpr);
-                info.fillInt32(*m_stream, gpr);
+                info.fillInt32(m_stream, gpr);
                 result = gpr;
             }
             m_jit.zeroExtend32ToWord(gpr, result);
@@ -1249,7 +1249,7 @@
             if (desiredFormat == DataFormatInt52)
                 value = value << JSValue::int52ShiftAmount;
             m_jit.move(MacroAssembler::Imm64(value), gpr);
-            info.fillGPR(*m_stream, gpr, desiredFormat);
+            info.fillGPR(m_stream, gpr, desiredFormat);
             return gpr;
         }
         
@@ -1263,12 +1263,12 @@
         if (desiredFormat == DataFormatStrictInt52) {
             if (spillFormat == DataFormatInt52)
                 m_jit.rshift64(TrustedImm32(JSValue::int52ShiftAmount), gpr);
-            info.fillStrictInt52(*m_stream, gpr);
+            info.fillStrictInt52(m_stream, gpr);
             return gpr;
         }
         if (spillFormat == DataFormatStrictInt52)
             m_jit.lshift64(TrustedImm32(JSValue::int52ShiftAmount), gpr);
-        info.fillInt52(*m_stream, gpr);
+        info.fillInt52(m_stream, gpr);
         return gpr;
     }
 
@@ -1284,7 +1284,7 @@
             unlock(gpr);
             gpr = result;
         } else
-            info.fillInt52(*m_stream, gpr);
+            info.fillInt52(m_stream, gpr);
         m_jit.lshift64(TrustedImm32(JSValue::int52ShiftAmount), gpr);
         return gpr;
     }
@@ -1301,7 +1301,7 @@
             unlock(gpr);
             gpr = result;
         } else
-            info.fillStrictInt52(*m_stream, gpr);
+            info.fillStrictInt52(m_stream, gpr);
         m_jit.rshift64(TrustedImm32(JSValue::int52ShiftAmount), gpr);
         return gpr;
     }
@@ -1334,7 +1334,7 @@
                 }
 
                 m_fprs.retain(fpr, virtualRegister, SpillOrderDouble);
-                info.fillDouble(*m_stream, fpr);
+                info.fillDouble(m_stream, fpr);
                 return fpr;
             }
             if (mayHaveTypeCheck(edge.useKind()))
@@ -1353,7 +1353,7 @@
         FPRReg fpr = fprAllocate();
         m_jit.loadDouble(JITCompiler::addressFor(virtualRegister), fpr);
         m_fprs.retain(fpr, virtualRegister, SpillOrderDouble);
-        info.fillDouble(*m_stream, fpr);
+        info.fillDouble(m_stream, fpr);
         return fpr;
     }
 
@@ -1389,7 +1389,7 @@
             JSValue jsValue = edge->asJSValue();
             m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
             m_jit.move(MacroAssembler::TrustedImm64(JSValue::encode(jsValue)), gpr);
-            info.fillJSValue(*m_stream, gpr, DataFormatJSCell);
+            info.fillJSValue(m_stream, gpr, DataFormatJSCell);
             return gpr;
         }
 
@@ -1396,10 +1396,10 @@
         m_gprs.retain(gpr, virtualRegister, SpillOrderSpilled);
         m_jit.load64(JITCompiler::addressFor(virtualRegister), gpr);
 
-        info.fillJSValue(*m_stream, gpr, DataFormatJS);
+        info.fillJSValue(m_stream, gpr, DataFormatJS);
         if (type & ~SpecCellCheck)
             speculationCheck(BadType, JSValueRegs(gpr), edge, m_jit.branchIfNotCell(JSValueRegs(gpr)));
-        info.fillJSValue(*m_stream, gpr, DataFormatJSCell);
+        info.fillJSValue(m_stream, gpr, DataFormatJSCell);
         return gpr;
     }
 
@@ -1420,7 +1420,7 @@
         m_gprs.lock(gpr);
         if (type & ~SpecCellCheck)
             speculationCheck(BadType, JSValueRegs(gpr), edge, m_jit.branchIfNotCell(JSValueRegs(gpr)));
-        info.fillJSValue(*m_stream, gpr, DataFormatJSCell);
+        info.fillJSValue(m_stream, gpr, DataFormatJSCell);
         return gpr;
     }
 
@@ -1467,7 +1467,7 @@
             JSValue jsValue = edge->asJSValue();
             m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
             m_jit.move(MacroAssembler::TrustedImm64(JSValue::encode(jsValue)), gpr);
-            info.fillJSValue(*m_stream, gpr, DataFormatJSBoolean);
+            info.fillJSValue(m_stream, gpr, DataFormatJSBoolean);
             return gpr;
         }
         DFG_ASSERT(m_graph, m_currentNode, info.spillFormat() & DataFormatJS, info.spillFormat());
@@ -1474,13 +1474,13 @@
         m_gprs.retain(gpr, virtualRegister, SpillOrderSpilled);
         m_jit.load64(JITCompiler::addressFor(virtualRegister), gpr);
 
-        info.fillJSValue(*m_stream, gpr, DataFormatJS);
+        info.fillJSValue(m_stream, gpr, DataFormatJS);
         if (type & ~SpecBoolean) {
             m_jit.xor64(TrustedImm32(JSValue::ValueFalse), gpr);
             speculationCheck(BadType, JSValueRegs(gpr), edge, m_jit.branchTest64(MacroAssembler::NonZero, gpr, TrustedImm32(static_cast<int32_t>(~1))), SpeculationRecovery(BooleanSpeculationCheck, gpr, InvalidGPRReg));
             m_jit.xor64(TrustedImm32(JSValue::ValueFalse), gpr);
         }
-        info.fillJSValue(*m_stream, gpr, DataFormatJSBoolean);
+        info.fillJSValue(m_stream, gpr, DataFormatJSBoolean);
         return gpr;
     }
 
@@ -1499,7 +1499,7 @@
             speculationCheck(BadType, JSValueRegs(gpr), edge, m_jit.branchTest64(MacroAssembler::NonZero, gpr, TrustedImm32(static_cast<int32_t>(~1))), SpeculationRecovery(BooleanSpeculationCheck, gpr, InvalidGPRReg));
             m_jit.xor64(TrustedImm32(JSValue::ValueFalse), gpr);
         }
-        info.fillJSValue(*m_stream, gpr, DataFormatJSBoolean);
+        info.fillJSValue(m_stream, gpr, DataFormatJSBoolean);
         return gpr;
     }
 
@@ -1574,7 +1574,7 @@
             m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
             ASSERT(jsValue.isBigInt32());
             m_jit.move(MacroAssembler::TrustedImm64(JSValue::encode(jsValue)), gpr);
-            info.fillJSValue(*m_stream, gpr, DataFormatJSBigInt32);
+            info.fillJSValue(m_stream, gpr, DataFormatJSBigInt32);
             return gpr;
         }
 
@@ -1589,13 +1589,13 @@
         }
         if (spillFormat == DataFormatJSBigInt32) {
             m_jit.load64(JITCompiler::addressFor(virtualRegister), gpr);
-            info.fillJSValue(*m_stream, gpr, DataFormatJSBigInt32);
+            info.fillJSValue(m_stream, gpr, DataFormatJSBigInt32);
             return gpr;
         }
 
         m_jit.load64(JITCompiler::addressFor(virtualRegister), gpr);
 
-        info.fillJSValue(*m_stream, gpr, DataFormatJS);
+        info.fillJSValue(m_stream, gpr, DataFormatJS);
         m_gprs.unlock(gpr);
         FALLTHROUGH;
     }
@@ -1610,7 +1610,7 @@
             speculationCheck(BadType, JSValueRegs(gpr), edge, failureCases);
             unlock(tempGPR);
         }
-        info.fillJSValue(*m_stream, gpr, DataFormatJSBigInt32);
+        info.fillJSValue(m_stream, gpr, DataFormatJSBigInt32);
         return gpr;
     }
 
@@ -2459,7 +2459,7 @@
         GPRReg resultGPR = resultRegs.gpr();
 
         CodeOrigin codeOrigin = node->origin.semantic;
-        CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream->size());
+        CallSiteIndex callSite = m_jit.recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded(codeOrigin, m_stream.size());
         RegisterSet usedRegisters = this->usedRegisters();
 
         JITCompiler::JumpList slowCases;
@@ -6003,7 +6003,7 @@
         Vector<SilentRegisterSavePlan> savePlans;
         silentSpillAllRegistersImpl(false, savePlans, tempGPR);
 
-        unsigned streamIndex = m_stream->size();
+        unsigned streamIndex = m_stream.size();
         m_jit.jitCode()->bytecodeIndexToStreamIndex.add(bytecodeIndex, streamIndex);
 
         addSlowPathGeneratorLambda([=, this]() {

Modified: trunk/Source/_javascript_Core/dfg/DFGVariableEventStream.cpp (293628 => 293629)


--- trunk/Source/_javascript_Core/dfg/DFGVariableEventStream.cpp	2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGVariableEventStream.cpp	2022-04-29 20:05:32 UTC (rev 293629)
@@ -38,9 +38,9 @@
 
 namespace JSC { namespace DFG {
 
-void VariableEventStream::logEvent(const VariableEvent& event)
+void VariableEventStreamBuilder::logEvent(const VariableEvent& event)
 {
-    dataLogF("seq#%u:", static_cast<unsigned>(size()));
+    dataLogF("seq#%u:", static_cast<unsigned>(m_stream.size()));
     event.dump(WTF::dataFile());
     dataLogLn(" ");
 }
@@ -174,7 +174,7 @@
     
     // Step 1: Find the last checkpoint, and figure out the number of virtual registers as we go.
     unsigned startIndex = index - 1;
-    while (at(startIndex).kind() != Reset)
+    while (m_stream.at(startIndex).kind() != Reset)
         startIndex--;
     
     // Step 2: Create a mock-up of the DFG's state and execute the events.
@@ -183,7 +183,7 @@
         operandSources[i] = ValueSource(SourceIsDead);
     HashMap<MinifiedID, MinifiedGenerationInfo> generationInfos;
     for (unsigned i = startIndex; i < index; ++i) {
-        const VariableEvent& event = at(i);
+        const VariableEvent& event = m_stream.at(i);
         dataLogLnIf(verbose, "Processing event ", event);
         switch (event.kind()) {
         case Reset:

Modified: trunk/Source/_javascript_Core/dfg/DFGVariableEventStream.h (293628 => 293629)


--- trunk/Source/_javascript_Core/dfg/DFGVariableEventStream.h	2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/dfg/DFGVariableEventStream.h	2022-04-29 20:05:32 UTC (rev 293629)
@@ -41,16 +41,14 @@
     unsigned numberOfRegisters;
 };
 
-class VariableEventStream : public Vector<VariableEvent> {
-    static constexpr bool verbose = false;
+class VariableEventStream {
 public:
-    void appendAndLog(const VariableEvent& event)
+    VariableEventStream() = default;
+    VariableEventStream(Vector<VariableEvent>&& stream)
+        : m_stream(WTFMove(stream))
     {
-        if (verbose)
-            logEvent(event);
-        append(event);
     }
-    
+
     unsigned reconstruct(CodeBlock*, CodeOrigin, MinifiedGraph&, unsigned index, Operands<ValueRecovery>&) const;
     unsigned reconstruct(CodeBlock*, CodeOrigin, MinifiedGraph&, unsigned index, Operands<ValueRecovery>&, Vector<UndefinedOperandSpan>*) const;
 
@@ -64,7 +62,31 @@
         CodeBlock*, CodeOrigin, MinifiedGraph&,
         unsigned index, Operands<ValueRecovery>&, Vector<UndefinedOperandSpan>*) const;
 
+    FixedVector<VariableEvent> m_stream;
+};
+
+class VariableEventStreamBuilder {
+    WTF_MAKE_NONCOPYABLE(VariableEventStreamBuilder);
+public:
+    static constexpr bool verbose = false;
+
+    VariableEventStreamBuilder() = default;
+
+    void appendAndLog(const VariableEvent& event)
+    {
+        if (verbose)
+            logEvent(event);
+        m_stream.append(event);
+    }
+
+    unsigned size() const { return m_stream.size(); }
+
+    Vector<VariableEvent> finalize() { return WTFMove(m_stream); }
+
+private:
     void logEvent(const VariableEvent&);
+
+    Vector<VariableEvent> m_stream;
 };
 
 } } // namespace JSC::DFG

Modified: trunk/Source/_javascript_Core/ftl/FTLLink.cpp (293628 => 293629)


--- trunk/Source/_javascript_Core/ftl/FTLLink.cpp	2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/ftl/FTLLink.cpp	2022-04-29 20:05:32 UTC (rev 293629)
@@ -150,6 +150,7 @@
 
         state.jitCode->initializeB3Code(b3CodeRef);
         state.jitCode->initializeArityCheckEntrypoint(arityCheckCodeRef);
+        state.jitCode->common.m_jumpReplacements = WTFMove(state.jumpReplacements);
     }
 
     state.finalizer->entrypointLinkBuffer = WTFMove(linkBuffer);

Modified: trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp (293628 => 293629)


--- trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp	2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp	2022-04-29 20:05:32 UTC (rev 293629)
@@ -11934,7 +11934,7 @@
                         JumpReplacement jumpReplacement(
                             linkBuffer.locationOf<JSInternalPtrTag>(label),
                             linkBuffer.locationOf<OSRExitPtrTag>(handle->label));
-                        jitCode->common.m_jumpReplacements.append(jumpReplacement);
+                        state->jumpReplacements.append(jumpReplacement);
                     });
             });
 

Modified: trunk/Source/_javascript_Core/ftl/FTLState.h (293628 => 293629)


--- trunk/Source/_javascript_Core/ftl/FTLState.h	2022-04-29 19:41:48 UTC (rev 293628)
+++ trunk/Source/_javascript_Core/ftl/FTLState.h	2022-04-29 20:05:32 UTC (rev 293629)
@@ -30,6 +30,7 @@
 #include "B3Procedure.h"
 #include "DFGCommon.h"
 #include "DFGGraph.h"
+#include "DFGJumpReplacement.h"
 #include "FTLAbbreviatedTypes.h"
 #include "FTLGeneratedFunction.h"
 #include "FTLJITCode.h"
@@ -84,6 +85,7 @@
     RefPtr<PatchpointExceptionHandle> defaultExceptionHandle;
     Box<CCallHelpers::Label> exceptionHandler { Box<CCallHelpers::Label>::create() };
     B3::Air::StackSlot* capturedValue { nullptr };
+    Vector<DFG::JumpReplacement> jumpReplacements;
 };
 
 } } // namespace JSC::FTL
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to