Ignore:
Timestamp:
Jul 21, 2018, 6:10:43 AM (7 years ago)
Author:
Yusuke Suzuki
Message:

[JSC] Use Function / ScopedLambda / RecursableLambda instead of std::function
https://bugs.webkit.org/show_bug.cgi?id=187472

Reviewed by Mark Lam.

Source/JavaScriptCore:

std::function allocates memory from standard malloc instead of bmalloc. Instead of
using that, we should use WTF::{Function,ScopedLambda,RecursableLambda}.

This patch attempts to replace std::function with the above WTF function types.
If the function's lifetime can be the same to the stack, we can use ScopedLambda, which
is really efficient. Otherwise, we should use WTF::Function.
For recurring use cases, we can use RecursableLambda.

  • assembler/MacroAssembler.cpp:

(JSC::stdFunctionCallback):
(JSC::MacroAssembler::probe):

  • assembler/MacroAssembler.h:
  • b3/air/AirDisassembler.cpp:

(JSC::B3::Air::Disassembler::dump):

  • b3/air/AirDisassembler.h:
  • bytecompiler/BytecodeGenerator.cpp:

(JSC::BytecodeGenerator::BytecodeGenerator):
(JSC::BytecodeGenerator::initializeDefaultParameterValuesAndSetupFunctionScopeStack):
(JSC::BytecodeGenerator::emitEnumeration):

  • bytecompiler/BytecodeGenerator.h:
  • bytecompiler/NodesCodegen.cpp:

(JSC::ArrayNode::emitBytecode):
(JSC::ApplyFunctionCallDotNode::emitBytecode):
(JSC::ForOfNode::emitBytecode):

  • dfg/DFGSpeculativeJIT.cpp:

(JSC::DFG::SpeculativeJIT::addSlowPathGeneratorLambda):
(JSC::DFG::SpeculativeJIT::compileMathIC):

  • dfg/DFGSpeculativeJIT.h:
  • dfg/DFGSpeculativeJIT64.cpp:

(JSC::DFG::SpeculativeJIT::compile):

  • dfg/DFGValidate.cpp:
  • ftl/FTLCompile.cpp:

(JSC::FTL::compile):

  • heap/HeapSnapshotBuilder.cpp:

(JSC::HeapSnapshotBuilder::json):

  • heap/HeapSnapshotBuilder.h:
  • interpreter/StackVisitor.cpp:

(JSC::StackVisitor::Frame::dump const):

  • interpreter/StackVisitor.h:
  • runtime/PromiseDeferredTimer.h:
  • runtime/VM.cpp:

(JSC::VM::whenIdle):
(JSC::enableProfilerWithRespectToCount):
(JSC::disableProfilerWithRespectToCount):

  • runtime/VM.h:
  • runtime/VMEntryScope.cpp:

(JSC::VMEntryScope::addDidPopListener):

  • runtime/VMEntryScope.h:
  • tools/HeapVerifier.cpp:

(JSC::HeapVerifier::verifyCellList):
(JSC::HeapVerifier::validateCell):
(JSC::HeapVerifier::validateJSCell):

  • tools/HeapVerifier.h:

Source/WTF:

  • wtf/ScopedLambda.h:

(WTF::ScopedLambda<ResultType):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

    r233855 r234082  
    458458handleSpread:
    459459    RefPtr<RegisterID> index = generator.emitLoad(generator.newTemporary(), jsNumber(length));
    460     auto spreader = [array, index](BytecodeGenerator& generator, RegisterID* value)
     460    auto spreader = scopedLambda<void(BytecodeGenerator&, RegisterID*)>([array, index](BytecodeGenerator& generator, RegisterID* value)
    461461    {
    462462        generator.emitDirectPutByVal(array.get(), index.get(), value);
    463463        generator.emitInc(index.get());
    464     };
     464    });
    465465    for (; n; n = n->next()) {
    466466        if (n->elision())
     
    14561456                RefPtr<RegisterID> argumentsRegister = generator.emitLoad(generator.newTemporary(), jsUndefined());
    14571457               
    1458                 auto extractor = [&thisRegister, &argumentsRegister, &index](BytecodeGenerator& generator, RegisterID* value)
     1458                auto extractor = scopedLambda<void(BytecodeGenerator&, RegisterID*)>([&thisRegister, &argumentsRegister, &index](BytecodeGenerator& generator, RegisterID* value)
    14591459                {
    14601460                    Ref<Label> haveThis = generator.newLabel();
     
    14721472                    generator.emitLoad(index.get(), jsNumber(2));
    14731473                    generator.emitLabel(end.get());
    1474                 };
     1474                });
    14751475                generator.emitEnumeration(this, spread->expression(), extractor);
    14761476                generator.emitCallVarargsInTailPosition(returnValue.get(), realFunction.get(), thisRegister.get(), argumentsRegister.get(), generator.newTemporary(), 0, divot(), divotStart(), divotEnd(), DebuggableCall::Yes);
     
    32173217    RegisterID* forLoopSymbolTable = nullptr;
    32183218    generator.pushLexicalScope(this, BytecodeGenerator::TDZCheckOptimization::Optimize, BytecodeGenerator::NestedScopeType::IsNested, &forLoopSymbolTable);
    3219     auto extractor = [this, dst](BytecodeGenerator& generator, RegisterID* value)
     3219    auto extractor = scopedLambda<void(BytecodeGenerator&, RegisterID*)>([this, dst](BytecodeGenerator& generator, RegisterID* value)
    32203220    {
    32213221        if (m_lexpr->isResolveNode()) {
     
    32683268        generator.emitProfileControlFlow(m_statement->startOffset());
    32693269        generator.emitNode(dst, m_statement);
    3270     };
     3270    });
    32713271    generator.emitEnumeration(this, m_expr, extractor, this, forLoopSymbolTable);
    32723272    generator.popLexicalScope(this);
Note: See TracChangeset for help on using the changeset viewer.