Changeset 249337 in webkit


Ignore:
Timestamp:
Aug 30, 2019 11:53:26 AM (5 years ago)
Author:
ysuzuki@apple.com
Message:

[JSC] Generate new.target register only when it is used
https://bugs.webkit.org/show_bug.cgi?id=201335

Reviewed by Mark Lam.

JSTests:

  • stress/ensure-new-register-allocated.js: Added.

(shouldBe):
(basic):
(arrow):
(Base):
(Derived):
(evaluate):

Source/JavaScriptCore:

Since bytecode generator knows whether new.target register can be used, we should emit and use new.target register
only when it is actually required.

  • bytecompiler/BytecodeGenerator.cpp:

(JSC::BytecodeGenerator::BytecodeGenerator):

  • bytecompiler/BytecodeGenerator.h:

(JSC::BytecodeGenerator::newTarget):

  • parser/Nodes.h:

(JSC::ScopeNode::needsNewTargetRegisterForThisScope const):

Location:
trunk
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/JSTests/ChangeLog

    r249319 r249337  
     12019-08-30  Yusuke Suzuki  <ysuzuki@apple.com>
     2
     3        [JSC] Generate new.target register only when it is used
     4        https://bugs.webkit.org/show_bug.cgi?id=201335
     5
     6        Reviewed by Mark Lam.
     7
     8        * stress/ensure-new-register-allocated.js: Added.
     9        (shouldBe):
     10        (basic):
     11        (arrow):
     12        (Base):
     13        (Derived):
     14        (evaluate):
     15
    1162019-08-30  Yusuke Suzuki  <ysuzuki@apple.com>
    217
  • trunk/Source/JavaScriptCore/ChangeLog

    r249319 r249337  
     12019-08-30  Yusuke Suzuki  <ysuzuki@apple.com>
     2
     3        [JSC] Generate new.target register only when it is used
     4        https://bugs.webkit.org/show_bug.cgi?id=201335
     5
     6        Reviewed by Mark Lam.
     7
     8        Since bytecode generator knows whether new.target register can be used, we should emit and use new.target register
     9        only when it is actually required.
     10
     11        * bytecompiler/BytecodeGenerator.cpp:
     12        (JSC::BytecodeGenerator::BytecodeGenerator):
     13        * bytecompiler/BytecodeGenerator.h:
     14        (JSC::BytecodeGenerator::newTarget):
     15        * parser/Nodes.h:
     16        (JSC::ScopeNode::needsNewTargetRegisterForThisScope const):
     17
    1182019-08-30  Yusuke Suzuki  <ysuzuki@apple.com>
    219
  • trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp

    r249175 r249337  
    668668
    669669
    670     m_newTargetRegister = addVar();
     670    if (functionNode->needsNewTargetRegisterForThisScope() || isNewTargetUsedInInnerArrowFunction() || codeBlock->usesEval())
     671        m_newTargetRegister = addVar();
     672
    671673    switch (parseMode) {
    672674    case SourceParseMode::GeneratorWrapperFunctionMode:
     
    726728    case SourceParseMode::GeneratorBodyMode: {
    727729        // |this| is already filled correctly before here.
    728         emitLoad(m_newTargetRegister, jsUndefined());
     730        if (m_newTargetRegister)
     731            emitLoad(m_newTargetRegister, jsUndefined());
    729732        break;
    730733    }
     
    733736        if (SourceParseMode::ArrowFunctionMode != parseMode) {
    734737            if (isConstructor()) {
    735                 move(m_newTargetRegister, &m_thisRegister);
     738                if (m_newTargetRegister)
     739                    move(m_newTargetRegister, &m_thisRegister);
    736740                if (constructorKind() == ConstructorKind::Extends) {
    737741                    moveEmptyValue(&m_thisRegister);
     
    773777            emitLoadThisFromArrowFunctionLexicalEnvironment();
    774778
    775         if (m_scopeNode->usesNewTarget() || m_scopeNode->usesSuperCall())
     779        if (m_scopeNode->needsNewTargetRegisterForThisScope())
    776780            emitLoadNewTargetFromArrowFunctionLexicalEnvironment();
    777781    }
     
    830834            emitLoadThisFromArrowFunctionLexicalEnvironment();
    831835   
    832         if (m_scopeNode->usesNewTarget() || m_scopeNode->usesSuperCall())
     836        if (m_scopeNode->needsNewTargetRegisterForThisScope())
    833837            emitLoadNewTargetFromArrowFunctionLexicalEnvironment();
    834838    }
     
    900904    codeBlock->adoptFunctionHoistingCandidates(WTFMove(hoistedFunctions));
    901905   
    902     if (evalNode->usesSuperCall() || evalNode->usesNewTarget())
     906    if (evalNode->needsNewTargetRegisterForThisScope())
    903907        m_newTargetRegister = addVar();
    904908
     
    906910        emitLoadThisFromArrowFunctionLexicalEnvironment();
    907911
    908     if (evalNode->usesSuperCall() || evalNode->usesNewTarget())
     912    if (evalNode->needsNewTargetRegisterForThisScope())
    909913        emitLoadNewTargetFromArrowFunctionLexicalEnvironment();
    910914
  • trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h

    r249175 r249337  
    424424        RegisterID* newTarget()
    425425        {
     426            ASSERT(m_newTargetRegister);
    426427            return m_newTargetRegister;
    427428        }
  • trunk/Source/JavaScriptCore/parser/Nodes.h

    r249117 r249337  
    18001800        bool hasSloppyModeHoistedFunction(UniquedStringImpl* uid) const { return m_sloppyModeHoistedFunctions.contains(uid); }
    18011801
     1802        bool needsNewTargetRegisterForThisScope() const
     1803        {
     1804            return usesSuperCall() || usesNewTarget();
     1805        }
     1806
    18021807        VariableEnvironment& varDeclarations() { return m_varDeclarations; }
    18031808
Note: See TracChangeset for help on using the changeset viewer.