Skip to content

[JSC] Add a resolve_and_get_from_scope bytecode opcode - #1579

Closed
hyjorc1 wants to merge 1 commit into
WebKit:mainfrom
hyjorc1:eng/scope
Closed

hyjorc1 wants to merge 1 commit into
WebKit:mainfrom
hyjorc1:eng/scope

Conversation

@hyjorc1

@hyjorc1 hyjorc1 commented Jun 16, 2022 •

Copy link
Copy Markdown
Contributor

d7468b4

[JSC] Add a resolve_and_get_from_scope bytecode opcode
https://bugs.webkit.org/show_bug.cgi?id=237836

Reviewed by NOBODY (OOPS!).

In generated bytecodes, resolve_scope followed by get_from_scope is common.
This patch introduces a new bytecode opcode resolve_and_get_from_scope by
replacing the resolve_scope and get_from_scope pair in the generated instruction stream.

Bytecodes Before:
...
[  28] resolve_scope      dst:loc10, scope:loc4, var:1, resolveType:GlobalProperty, localScopeDepth:0
[  35] get_from_scope     dst:loc7, scope:loc10, var:1, getPutInfo:2048<...>, localScopeDepth:0, offset:0
...

Bytecodes After:
...
[  28] resolve_and_get_from_scope dst:loc7, scope:loc4, resolvedScope:loc10, var:1, resolveType:GlobalProperty, getPutInfo:2048<...>, localScopeDepth:0, offset:0
...

Reviewed by NOBODY (OOPS!).

* Source/JavaScriptCore/bytecode/BytecodeList.rb:
* Source/JavaScriptCore/bytecode/BytecodeLivenessAnalysis.cpp:
(JSC::tmpLivenessForCheckpoint):
* Source/JavaScriptCore/bytecode/BytecodeOperandsForCheckpoint.h:
(JSC::valueProfileForImpl):
(JSC::valueProfileFor):
* Source/JavaScriptCore/bytecode/BytecodeUseDef.cpp:
(JSC::computeUsesForBytecodeIndexImpl):
(JSC::computeDefsForBytecodeIndexImpl):
* Source/JavaScriptCore/bytecode/CodeBlock.cpp:
(JSC::CodeBlock::finishCreation):
(JSC::CodeBlock::finalizeLLIntInlineCaches):
(JSC::CodeBlock::notifyLexicalBindingUpdate):
(JSC::CodeBlock::tryGetValueProfileForBytecodeIndex):
* Source/JavaScriptCore/bytecode/CodeBlockInlines.h:
(JSC::CodeBlock::forEachValueProfile):
* Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp:
(JSC::UnlinkedCodeBlock::allocateSharedProfiles):
* Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:
(JSC::BytecodeGenerator::initializeDefaultParameterValuesAndSetupFunctionScopeStack):
(JSC::BytecodeGenerator::hoistSloppyModeFunctionIfNecessary):
(JSC::BytecodeGenerator::emitResolveScopeWithVarKindScope):
(JSC::BytecodeGenerator::emitResolveScopeHelper):
(JSC::BytecodeGenerator::emitResolveScope):
(JSC::BytecodeGenerator::emitGetFromScopeWithVarKindStack):
(JSC::BytecodeGenerator::emitGetFromScopeWithVarKindDirectArgument):
(JSC::BytecodeGenerator::emitGetFromScopeHelper):
(JSC::BytecodeGenerator::emitGetFromScope):
(JSC::BytecodeGenerator::emitResolveAndGetFromScope):
(JSC::BytecodeGenerator::emitLoadThisFromArrowFunctionLexicalEnvironment):
(JSC::BytecodeGenerator::emitGetGlobalPrivate): Deleted.
* Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h:
* Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp:
(JSC::ResolveNode::emitBytecode):
(JSC::BaseDotNode::emitGetPropertyValue):
(JSC::BaseDotNode::emitPutProperty):
(JSC::PostfixNode::emitDot):
(JSC::PrefixNode::emitDot):
(JSC::EmptyVarExpression::emitBytecode):
(JSC::DefineFieldNode::emitBytecode):
* Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:
(JSC::DFG::ByteCodeParser::needsDynamicLookup):
(JSC::DFG::ByteCodeParser::parseBlock):
* Source/JavaScriptCore/dfg/DFGCapabilities.cpp:
(JSC::DFG::capabilityLevel):
* Source/JavaScriptCore/jit/JIT.cpp:
(JSC::JIT::privateCompileMainPass):
* Source/JavaScriptCore/jit/JIT.h:
* Source/JavaScriptCore/jit/JITOperations.cpp:
(JSC::operationResolveScopeHelper):
(JSC::JSC_DEFINE_JIT_OPERATION):
(JSC::operationGetFromScopeHelper):
* Source/JavaScriptCore/jit/JITOperations.h:
* Source/JavaScriptCore/jit/JITPropertyAccess.cpp:
(JSC::JIT::emit_op_resolve_scope_helper):
(JSC::JIT::emit_op_resolve_scope):
(JSC::JIT::generateOpResolveScopeThunkHelper):
(JSC::JIT::generateOpResolveScopeThunk):
(JSC::JIT::slow_op_resolve_scopeGenerator_helper):
(JSC::JIT::slow_op_resolve_scopeGenerator):
(JSC::JIT::emit_op_get_from_scope_helper):
(JSC::JIT::emit_op_get_from_scope):
(JSC::JIT::generateOpGetFromScopeThunk):
(JSC::JIT::generateOpGetFromScopeThunkHelper):
(JSC::JIT::slow_op_get_from_scopeGenerator):
(JSC::JIT::slow_op_get_from_scopeGenerator_helper):
(JSC::JIT::emit_op_resolve_and_get_from_scope):
(JSC::JIT::generateOpRGSResolveScopeThunk):
(JSC::JIT::generateOpRGSGetFromScopeThunk):
(JSC::JIT::slow_op_rgs_resolve_scopeGenerator):
(JSC::JIT::slow_op_rgs_get_from_scopeGenerator):
* Source/JavaScriptCore/llint/LLIntSlowPaths.cpp:
(JSC::LLInt::scopeGetPropertyHelper):
(JSC::LLInt::llintSlowPathGetFromScopeHelper):
(JSC::LLInt::LLINT_SLOW_PATH_DECL):
(JSC::LLInt::handleResolveAndGetFromScopeCheckpoint):
(JSC::LLInt::llint_slow_path_checkpoint_osr_exit):
* Source/JavaScriptCore/llint/LLIntSlowPaths.h:
* Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm:
* Source/JavaScriptCore/llint/LowLevelInterpreter64.asm:
* Source/JavaScriptCore/runtime/CommonSlowPaths.cpp:
(JSC::commonSlowPathResolveScopeHelper):
(JSC::JSC_DEFINE_COMMON_SLOW_PATH):
* Source/JavaScriptCore/runtime/CommonSlowPaths.h:
* Source/JavaScriptCore/runtime/CommonSlowPathsInlines.h:
(JSC::CommonSlowPaths::tryCacheGetFromScopeGlobal):

@hyjorc1
hyjorc1 requested a review from a team as a code owner June 16, 2022 16:57
@hyjorc1 hyjorc1 self-assigned this Jun 16, 2022
@webkit-early-warning-system webkit-early-warning-system added the merging-blocked Applied to prevent a change from being merged label Jun 16, 2022
@hyjorc1 hyjorc1 removed the merging-blocked Applied to prevent a change from being merged label Jun 17, 2022
@hyjorc1 hyjorc1 changed the title Need a short description (OOPS!). need to debug Jun 17, 2022
@webkit-early-warning-system webkit-early-warning-system added the merging-blocked Applied to prevent a change from being merged label Jun 17, 2022
@hyjorc1 hyjorc1 removed the merging-blocked Applied to prevent a change from being merged label Jun 21, 2022
@webkit-early-warning-system webkit-early-warning-system added the merging-blocked Applied to prevent a change from being merged label Jun 21, 2022
@hyjorc1 hyjorc1 removed the merging-blocked Applied to prevent a change from being merged label Jun 23, 2022
@webkit-early-warning-system webkit-early-warning-system added the merging-blocked Applied to prevent a change from being merged label Jun 23, 2022

@saambarati saambarati left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd try to work on sharing a bit more code between the implementations, and getting this patch into a state where it can be reviewed a bit more easily. Right now, it contains a lot of duplicate code.

Comment thread Source/JavaScriptCore/bytecode/Opcode.h Resolved
@hyjorc1 hyjorc1 removed the merging-blocked Applied to prevent a change from being merged label Jun 25, 2022
@hyjorc1 hyjorc1 changed the title need to debug refactor5 Jun 25, 2022
@webkit-early-warning-system webkit-early-warning-system added the merging-blocked Applied to prevent a change from being merged label Jun 25, 2022
@hyjorc1 hyjorc1 removed the merging-blocked Applied to prevent a change from being merged label Jun 25, 2022
@webkit-early-warning-system webkit-early-warning-system added the merging-blocked Applied to prevent a change from being merged label Jun 25, 2022
@hyjorc1 hyjorc1 removed the merging-blocked Applied to prevent a change from being merged label Jun 25, 2022
@webkit-early-warning-system webkit-early-warning-system added the merging-blocked Applied to prevent a change from being merged label Jun 25, 2022
@hyjorc1 hyjorc1 removed the merging-blocked Applied to prevent a change from being merged label Jun 25, 2022
@webkit-early-warning-system webkit-early-warning-system added the merging-blocked Applied to prevent a change from being merged label Jun 25, 2022
@hyjorc1 hyjorc1 removed the merging-blocked Applied to prevent a change from being merged label Jun 26, 2022
@hyjorc1 hyjorc1 changed the title refactor5 refactor7 Jun 26, 2022
@hyjorc1 hyjorc1 changed the title [JSC] Add a resolve_and_get_from_scope bytecode opcode refactor Jun 29, 2022
@webkit-early-warning-system webkit-early-warning-system added the merging-blocked Applied to prevent a change from being merged label Jun 29, 2022
@hyjorc1 hyjorc1 removed the merging-blocked Applied to prevent a change from being merged label Jun 29, 2022
@hyjorc1 hyjorc1 changed the title refactor [JSC] Add a resolve_and_get_from_scope bytecode opcode Jun 29, 2022
@hyjorc1 hyjorc1 changed the title [JSC] Add a resolve_and_get_from_scope bytecode opcode remove resolveType from args Jun 29, 2022
@hyjorc1 hyjorc1 changed the title remove resolveType from args [JSC] Add a resolve_and_get_from_scope bytecode opcode Jun 29, 2022

@justinmichaud justinmichaud left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have a few questions about the code, maybe we can brainstorm later with Yusuke?


auto linkOpResolveScope = [&](auto& bytecode, auto& metadata) {
const Identifier& ident = identifier(bytecode.m_var);
RELEASE_ASSERT(bytecode.m_resolveType != ResolvedClosureVar);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we know why this is here?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is extracted from the resolve scope switch case.

JSScope* scope = callFrame->uncheckedR(bytecode.m_scope).Register::scope();
JSObject* resolvedScope = JSScope::resolve(globalObject, scope, ident);
bool isOpResolveScope = std::is_same<Bytecode, OpResolveScope>::value;
VirtualRegister dst = isOpResolveScope ? pc->as<Bytecode>().m_dst : pc->as<OpResolveAndGetFromScope>().m_resolvedScope;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a switch would be better, since it would be easier to grep for? Or perhaps the dst can be passed in as a parameter?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

// Proxy can throw an error here, e.g. Proxy in with statement's @unscopables.
CHECK_EXCEPTION();
CallFrame* returnSecond = isOpResolveScope ? callFrame : nullptr;
// Use the second field of SlowPathReturnType as a flag to indicate whether

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems sub-optimal? Maybe @Constellation has some thoughts? Do iterators have to do something similar?

ASSERT(scope);

#if USE(JSVALUE64)
auto validResolveAndGetFromScopePair = [&]() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since we only call this once, can this just be a bool?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

auto bytecode = currentInstruction->as<OpResolveAndGetFromScope>();
auto setResolvedScope = [&] (VirtualRegister resolvedScope, Node* value) {
set(resolvedScope, value);
set(Operand::tmp(bytecode.tmpResolvedScope), value);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we set two things here?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tmpResolvedScope is used to store the resolved scope for OSR exit.

@geoffreygaren

Copy link
Copy Markdown
Contributor

What's the motivation here? Memory use? Startup time? Revealing a new optimization to later compilers?

@justinmichaud

Copy link
Copy Markdown
Contributor

What's the motivation here? Memory use? Startup time? Revealing a new optimization to later compilers?

No-jit memory usage in particular

@hyjorc1

hyjorc1 commented Jun 30, 2022

Copy link
Copy Markdown
Contributor Author

What's the motivation here? Memory use? Startup time? Revealing a new optimization to later compilers?

Initially, we believe the new instruction could help us to reduce the total bytecode size in order to reduce memory usage, specifically for RAMification.

@hyjorc1
hyjorc1 force-pushed the eng/scope branch 2 times, most recently from 9d3ff94 to 5cb54f1 Compare July 5, 2022 23:33
@webkit-early-warning-system webkit-early-warning-system added the merging-blocked Applied to prevent a change from being merged label Jul 6, 2022

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are we padding dst as the resolved scope here? That looks quite wrong.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the logic is correct. But, the function name emitResolveAndGetFromScope is misleading and it should be tryEmitResolveAndGetFromScope. If you check the implementation of this function:

RegisterID* BytecodeGenerator::emitResolveAndGetFromScope(RegisterID* dst, RegisterID* resolvedScope, const Variable& variable, ResolveMode resolveMode, bool isPrivate)
{
    switch (variable.offset().kind()) {
    case VarKind::Stack: {
        ASSERT(!isPrivate);
        UNUSED_VARIABLE(isPrivate);
        return emitGetFromScopeWithVarKindStack(dst, variable);
    }
    case VarKind::DirectArgument:
        return emitGetFromScopeWithVarKindDirectArgument(dst, argumentsRegister(), variable);
    case VarKind::Scope:
        return emitGetFromScopeHelper(dst, emitResolveScopeWithVarKindScope(variable), variable, resolveMode);
    case VarKind::Invalid: {
#if USE(JSVALUE64)
        if (!variable.offset().isScope()) {
            OpResolveAndGetFromScope::emit(
                this,
                kill(dst),
                scopeRegister(),
                addConstant(variable.ident()),
                GetPutInfo(resolveMode, resolveType(), InitializationMode::NotInitialization, ecmaMode()),
                localScopeDepth(),
                variable.offset().isScope() ? variable.offset().scopeOffset().offset() : 0);
            return dst;
        }
#endif
        return emitGetFromScopeHelper(dst, emitResolveScopeHelper(resolvedScope, variable), variable, resolveMode);
    }
    }

    RELEASE_ASSERT_NOT_REACHED();
    return nullptr;
}

which still need to handle the non-ResolveAndGetFromScope cases. Here, the dst is passed to the function as the resolvedScope for clause:

return emitGetFromScopeHelper(dst, emitResolveScopeHelper(resolvedScope, variable), variable, resolveMode);

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe the similar situation happens in both emitResolveScope and emitGetFromScope. And they should be tryEmitResolveScope and tryEmitGetFromScope instead.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They should not be prefixed with try. Whether or not we actually emit the opcodes, we're logically resolving and getting from a scope. I don't see why we need to pass in the dst as the result of the resolve_scope. If we need the scope for later operations, we shouldn't be emitting resolve_and_get_from_scope combo opcode.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see a reason why we need a resolvedScope parameter here. The one call site that's passing something other than nullptr is looks wrong to me. I think it's actually better if the contract of this API is that we don't define a scope, so we can remove the operand from the bytecode

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, we need resolvedScope for handling non-ResolveAndGetFromScope cases introduced in emitResolveAndGetFromScope.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: this can be an else if

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't look right. It's not putting the result in dst

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, this would be a compile error once we get rid of that scope field we no longer need from the bytecode

@hyjorc1 hyjorc1 Jul 27, 2022 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't look right. It's not putting the result in dst

I think this is correct. Here, the dst is passed to the helper function resolveScopeHelper , which is extracted from case op_resolve_scope: and it is for both op_resolve_scope and op_resolve_and_get_from_scope. Each case will pass their own dst, which is the a destination register or a Tmp variable for op_resolve_scope or op_resolve_and_get_from_scope respectively.

Also, this would be a compile error once we get rid of that scope field we no longer need from the bytecode

I don't think we can remove the scope operand or field.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can this be a function instead of a macro?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The passed thunk function is a template function which cannot be passed as a function pointer. If we need to use function, then we have to create two functions for OpGetFromScope and OpResolveScope each.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ditto, can this be a function instead of a macro?

@hyjorc1 hyjorc1 Jul 27, 2022 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ditto, are two functions better than one macro?

Comment thread Source/JavaScriptCore/jit/JIT.h Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Let's not abbreviate this name this way. Write out the full thing

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Comment on lines 1971 to 1972

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should refactor this in such a way we don't need to write out the intermediate resolve_scope result to the stack. There is no need to do that, so we should avoid it

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The current implementation stores the intermediate resolve_scope result to the m_dst of op_resovle_and_get_from_scope. So, it doesn't need extra space in the stack to keep it. Are you proposing that we should store it to an GPR instead? Could that perform better performance in read and write?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can just be #include "CallFrame.h"

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: same thing about writing out the full name

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

https://bugs.webkit.org/show_bug.cgi?id=237836

Reviewed by NOBODY (OOPS!).

In generated bytecodes, resolve_scope followed by get_from_scope is common.
This patch introduces a new bytecode opcode resolve_and_get_from_scope by
replacing the resolve_scope and get_from_scope pair in the generated instruction stream.

Bytecodes Before:
...
[  28] resolve_scope      dst:loc10, scope:loc4, var:1, resolveType:GlobalProperty, localScopeDepth:0
[  35] get_from_scope     dst:loc7, scope:loc10, var:1, getPutInfo:2048<...>, localScopeDepth:0, offset:0
...

Bytecodes After:
...
[  28] resolve_and_get_from_scope dst:loc7, scope:loc4, resolvedScope:loc10, var:1, resolveType:GlobalProperty, getPutInfo:2048<...>, localScopeDepth:0, offset:0
...

Reviewed by NOBODY (OOPS!).

* Source/JavaScriptCore/bytecode/BytecodeList.rb:
* Source/JavaScriptCore/bytecode/BytecodeLivenessAnalysis.cpp:
(JSC::tmpLivenessForCheckpoint):
* Source/JavaScriptCore/bytecode/BytecodeOperandsForCheckpoint.h:
(JSC::valueProfileForImpl):
(JSC::valueProfileFor):
* Source/JavaScriptCore/bytecode/BytecodeUseDef.cpp:
(JSC::computeUsesForBytecodeIndexImpl):
(JSC::computeDefsForBytecodeIndexImpl):
* Source/JavaScriptCore/bytecode/CodeBlock.cpp:
(JSC::CodeBlock::finishCreation):
(JSC::CodeBlock::finalizeLLIntInlineCaches):
(JSC::CodeBlock::notifyLexicalBindingUpdate):
(JSC::CodeBlock::tryGetValueProfileForBytecodeIndex):
* Source/JavaScriptCore/bytecode/CodeBlockInlines.h:
(JSC::CodeBlock::forEachValueProfile):
* Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp:
(JSC::UnlinkedCodeBlock::allocateSharedProfiles):
* Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:
(JSC::BytecodeGenerator::initializeDefaultParameterValuesAndSetupFunctionScopeStack):
(JSC::BytecodeGenerator::hoistSloppyModeFunctionIfNecessary):
(JSC::BytecodeGenerator::emitResolveScopeWithVarKindScope):
(JSC::BytecodeGenerator::emitResolveScopeHelper):
(JSC::BytecodeGenerator::emitResolveScope):
(JSC::BytecodeGenerator::emitGetFromScopeWithVarKindStack):
(JSC::BytecodeGenerator::emitGetFromScopeWithVarKindDirectArgument):
(JSC::BytecodeGenerator::emitGetFromScopeHelper):
(JSC::BytecodeGenerator::emitGetFromScope):
(JSC::BytecodeGenerator::emitResolveAndGetFromScope):
(JSC::BytecodeGenerator::emitLoadThisFromArrowFunctionLexicalEnvironment):
(JSC::BytecodeGenerator::emitGetGlobalPrivate): Deleted.
* Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h:
* Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp:
(JSC::ResolveNode::emitBytecode):
(JSC::BaseDotNode::emitGetPropertyValue):
(JSC::BaseDotNode::emitPutProperty):
(JSC::PostfixNode::emitDot):
(JSC::PrefixNode::emitDot):
(JSC::EmptyVarExpression::emitBytecode):
(JSC::DefineFieldNode::emitBytecode):
* Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:
(JSC::DFG::ByteCodeParser::needsDynamicLookup):
(JSC::DFG::ByteCodeParser::parseBlock):
* Source/JavaScriptCore/dfg/DFGCapabilities.cpp:
(JSC::DFG::capabilityLevel):
* Source/JavaScriptCore/jit/JIT.cpp:
(JSC::JIT::privateCompileMainPass):
* Source/JavaScriptCore/jit/JIT.h:
* Source/JavaScriptCore/jit/JITOperations.cpp:
(JSC::operationResolveScopeHelper):
(JSC::JSC_DEFINE_JIT_OPERATION):
(JSC::operationGetFromScopeHelper):
* Source/JavaScriptCore/jit/JITOperations.h:
* Source/JavaScriptCore/jit/JITPropertyAccess.cpp:
(JSC::JIT::emit_op_resolve_scope_helper):
(JSC::JIT::emit_op_resolve_scope):
(JSC::JIT::generateOpResolveScopeThunkHelper):
(JSC::JIT::generateOpResolveScopeThunk):
(JSC::JIT::slow_op_resolve_scopeGenerator_helper):
(JSC::JIT::slow_op_resolve_scopeGenerator):
(JSC::JIT::emit_op_get_from_scope_helper):
(JSC::JIT::emit_op_get_from_scope):
(JSC::JIT::generateOpGetFromScopeThunk):
(JSC::JIT::generateOpGetFromScopeThunkHelper):
(JSC::JIT::slow_op_get_from_scopeGenerator):
(JSC::JIT::slow_op_get_from_scopeGenerator_helper):
(JSC::JIT::emit_op_resolve_and_get_from_scope):
(JSC::JIT::generateOpRGSResolveScopeThunk):
(JSC::JIT::generateOpRGSGetFromScopeThunk):
(JSC::JIT::slow_op_rgs_resolve_scopeGenerator):
(JSC::JIT::slow_op_rgs_get_from_scopeGenerator):
* Source/JavaScriptCore/llint/LLIntSlowPaths.cpp:
(JSC::LLInt::scopeGetPropertyHelper):
(JSC::LLInt::llintSlowPathGetFromScopeHelper):
(JSC::LLInt::LLINT_SLOW_PATH_DECL):
(JSC::LLInt::handleResolveAndGetFromScopeCheckpoint):
(JSC::LLInt::llint_slow_path_checkpoint_osr_exit):
* Source/JavaScriptCore/llint/LLIntSlowPaths.h:
* Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm:
* Source/JavaScriptCore/llint/LowLevelInterpreter64.asm:
* Source/JavaScriptCore/runtime/CommonSlowPaths.cpp:
(JSC::commonSlowPathResolveScopeHelper):
(JSC::JSC_DEFINE_COMMON_SLOW_PATH):
* Source/JavaScriptCore/runtime/CommonSlowPaths.h:
* Source/JavaScriptCore/runtime/CommonSlowPathsInlines.h:
(JSC::CommonSlowPaths::tryCacheGetFromScopeGlobal):
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

JavaScriptCore For bugs in JavaScriptCore, the JS engine used by WebKit, other than kxmlcore issues. merging-blocked Applied to prevent a change from being merged

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants