Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 23879e6bd1a0b8a5ee2718d9faa5d66514134218
      
https://github.com/WebKit/WebKit/commit/23879e6bd1a0b8a5ee2718d9faa5d66514134218
  Author: Ross Kirsling <rkirsl...@gmail.com>
  Date:   2022-11-24 (Thu, 24 Nov 2022)

  Changed paths:
    M JSTests/stress/optional-chaining.js
    M Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
    M Source/JavaScriptCore/parser/ASTBuilder.h
    M Source/JavaScriptCore/parser/NodeConstructors.h
    M Source/JavaScriptCore/parser/Nodes.h
    M Source/JavaScriptCore/parser/Parser.cpp

  Log Message:
  -----------
  Ignored TypeError upon optional function call chain
https://bugs.webkit.org/show_bug.cgi?id=247431

Reviewed by Yusuke Suzuki.

Evidently, our implementation of optional chaining has always interpreted 
`a.b?.().c` and `a.b()?.c` as `a.b?.()?.c`.
(Hard to believe, but I guess giving more undefineds and less TypeErrors must 
not have troubled folks that much...)

The issue is rather JSC-specific, in that it's a confused result of our 
"function call node menagerie" --
ExpressionNode::isOptionalChainBase was repurposed for optional calls like 
`x?.()`, but that failed to recognize
that the result of a call can also be the base of an optional chain, as in 
`x()?.y`.

This patch adds ExpressionNode::isOptionalCall and distinguishes optional call 
as a separate concept throughout.

* JSTests/stress/optional-chaining.js:
(shouldThrowTypeError):
* Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp:
(JSC::EvalFunctionCallNode::emitBytecode):
(JSC::FunctionCallValueNode::emitBytecode):
(JSC::FunctionCallResolveNode::emitBytecode):
(JSC::FunctionCallBracketNode::emitBytecode):
(JSC::FunctionCallDotNode::emitBytecode):
(JSC::CallFunctionCallDotNode::emitBytecode):
(JSC::HasOwnPropertyFunctionCallDotNode::emitBytecode):
(JSC::ApplyFunctionCallDotNode::emitBytecode):
* Source/JavaScriptCore/parser/ASTBuilder.h:
(JSC::ASTBuilder::createOptionalChain):
(JSC::ASTBuilder::makeFunctionCallNode):
* Source/JavaScriptCore/parser/NodeConstructors.h:
(JSC::FunctionCallValueNode::FunctionCallValueNode):
(JSC::FunctionCallResolveNode::FunctionCallResolveNode):
(JSC::FunctionCallBracketNode::FunctionCallBracketNode):
(JSC::FunctionCallDotNode::FunctionCallDotNode):
(JSC::CallFunctionCallDotNode::CallFunctionCallDotNode):
(JSC::ApplyFunctionCallDotNode::ApplyFunctionCallDotNode):
(JSC::HasOwnPropertyFunctionCallDotNode::HasOwnPropertyFunctionCallDotNode):
* Source/JavaScriptCore/parser/Nodes.h:
(JSC::ExpressionNode::isOptionalCall const):
* Source/JavaScriptCore/parser/Parser.cpp:
(JSC::Parser<LexerType>::parseMemberExpression):

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


_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to