Changeset 223232 in webkit for trunk/Source/JavaScriptCore
- Timestamp:
- Oct 11, 2017, 11:45:23 PM (8 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r223222 r223232 1 2017-10-11 Yusuke Suzuki <[email protected]> 2 3 import.meta should not be assignable 4 https://bugs.webkit.org/show_bug.cgi?id=178202 5 6 Reviewed by Saam Barati. 7 8 `import.meta` cannot be used for LHS. This patch adds MetaPropertyNode 9 and make NewTargetNode and ImportMetaNode as derived classes of MetaPropertyNode. 10 We change the parser not to allow assignments for MetaPropertyNode. 11 12 * bytecompiler/NodesCodegen.cpp: 13 (JSC::ImportMetaNode::emitBytecode): 14 * parser/ASTBuilder.h: 15 (JSC::ASTBuilder::createImportMetaExpr): 16 (JSC::ASTBuilder::isMetaProperty): 17 (JSC::ASTBuilder::isImportMeta): 18 * parser/NodeConstructors.h: 19 (JSC::MetaPropertyNode::MetaPropertyNode): 20 (JSC::NewTargetNode::NewTargetNode): 21 (JSC::ImportMetaNode::ImportMetaNode): 22 * parser/Nodes.h: 23 (JSC::ExpressionNode::isMetaProperty const): 24 (JSC::ExpressionNode::isImportMeta const): 25 * parser/Parser.cpp: 26 (JSC::Parser<LexerType>::metaPropertyName): 27 (JSC::Parser<LexerType>::parseAssignmentExpression): 28 (JSC::Parser<LexerType>::parseMemberExpression): 29 (JSC::Parser<LexerType>::parseUnaryExpression): 30 * parser/Parser.h: 31 * parser/SyntaxChecker.h: 32 (JSC::SyntaxChecker::createImportMetaExpr): 33 (JSC::SyntaxChecker::isMetaProperty): 34 (JSC::SyntaxChecker::isImportMeta): 35 1 36 2017-10-11 Saam Barati <[email protected]> 2 37 -
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r222689 r223232 210 210 211 211 return generator.moveToDestinationIfNeeded(dst, generator.newTarget()); 212 } 213 214 // ------------------------------ ImportMetaNode --------------------------------- 215 216 RegisterID* ImportMetaNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 217 { 218 return generator.emitNode(dst, m_expr); 212 219 } 213 220 -
trunk/Source/JavaScriptCore/parser/ASTBuilder.h
r223175 r223232 190 190 return new (m_parserArena) NewTargetNode(location); 191 191 } 192 ExpressionNode* createImportMetaExpr(const JSTokenLocation& location, ExpressionNode* expr) { return new (m_parserArena) ImportMetaNode(location, expr); } 193 bool isMetaProperty(ExpressionNode* node) { return node->isMetaProperty(); } 192 194 bool isNewTarget(ExpressionNode* node) { return node->isNewTarget(); } 195 bool isImportMeta(ExpressionNode* node) { return node->isImportMeta(); } 193 196 ExpressionNode* createResolve(const JSTokenLocation& location, const Identifier& ident, const JSTextPosition& start, const JSTextPosition& end) 194 197 { -
trunk/Source/JavaScriptCore/parser/NodeConstructors.h
r221358 r223232 172 172 } 173 173 174 inline MetaPropertyNode::MetaPropertyNode(const JSTokenLocation& location) 175 : ExpressionNode(location) 176 { 177 } 178 174 179 inline NewTargetNode::NewTargetNode(const JSTokenLocation& location) 175 : ExpressionNode(location) 180 : MetaPropertyNode(location) 181 { 182 } 183 184 inline ImportMetaNode::ImportMetaNode(const JSTokenLocation& location, ExpressionNode* expr) 185 : MetaPropertyNode(location) 186 , m_expr(expr) 176 187 { 177 188 } -
trunk/Source/JavaScriptCore/parser/Nodes.h
r223047 r223232 187 187 virtual bool isSuperNode() const { return false; } 188 188 virtual bool isImportNode() const { return false; } 189 virtual bool isMetaProperty() const { return false; } 189 190 virtual bool isNewTarget() const { return false; } 191 virtual bool isImportMeta() const { return false; } 190 192 virtual bool isBytecodeIntrinsicNode() const { return false; } 191 193 … … 585 587 }; 586 588 587 class NewTargetNode final : public ExpressionNode { 589 class MetaPropertyNode : public ExpressionNode { 590 public: 591 MetaPropertyNode(const JSTokenLocation&); 592 593 private: 594 bool isMetaProperty() const final { return true; } 595 }; 596 597 class NewTargetNode final : public MetaPropertyNode { 588 598 public: 589 599 NewTargetNode(const JSTokenLocation&); … … 592 602 bool isNewTarget() const final { return true; } 593 603 RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override; 604 }; 605 606 class ImportMetaNode final : public MetaPropertyNode { 607 public: 608 ImportMetaNode(const JSTokenLocation&, ExpressionNode*); 609 610 private: 611 bool isImportMeta() const final { return true; } 612 RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override; 613 614 ExpressionNode* m_expr; 594 615 }; 595 616 -
trunk/Source/JavaScriptCore/parser/Parser.cpp
r223175 r223232 3586 3586 return parseAssignmentExpression(context, classifier); 3587 3587 } 3588 3589 3590 template <typename LexerType> 3591 template <typename TreeBuilder> NEVER_INLINE const char* Parser<LexerType>::metaPropertyName(TreeBuilder& context, TreeExpression expr) 3592 { 3593 if (context.isNewTarget(expr)) 3594 return "new.target"; 3595 if (context.isImportMeta(expr)) 3596 return "import.meta"; 3597 RELEASE_ASSERT_NOT_REACHED(); 3598 return "error"; 3599 } 3588 3600 3589 3601 template <typename LexerType> … … 3691 3703 m_parserState.nonTrivialExpressionCount++; 3692 3704 hadAssignment = true; 3693 if (UNLIKELY(context.is NewTarget(lhs)))3694 internalFailWithMessage(false, "new.targetcan't be the left hand side of an assignment expression");3705 if (UNLIKELY(context.isMetaProperty(lhs))) 3706 internalFailWithMessage(false, metaPropertyName(context, lhs), " can't be the left hand side of an assignment expression"); 3695 3707 context.assignmentStackAppend(assignmentStack, lhs, start, tokenStartPosition(), m_parserState.assignmentCount, op); 3696 3708 start = tokenStartPosition(); … … 4699 4711 4700 4712 JSTokenLocation location(tokenLocation()); 4701 base = c reateResolveAndUseVariable(context, &m_vm->propertyNames->builtinNames().metaPrivateName(), false, expressionStart, location);4713 base = context.createImportMetaExpr(location, createResolveAndUseVariable(context, &m_vm->propertyNames->builtinNames().metaPrivateName(), false, expressionStart, location)); 4702 4714 next(); 4703 4715 } else { … … 4925 4937 failWithMessage("Cannot parse member expression"); 4926 4938 } 4927 if (UNLIKELY(isUpdateOp(static_cast<JSTokenType>(lastOperator)) && context.is NewTarget(expr)))4928 internalFailWithMessage(false, "new.targetcan't come after a prefix operator");4939 if (UNLIKELY(isUpdateOp(static_cast<JSTokenType>(lastOperator)) && context.isMetaProperty(expr))) 4940 internalFailWithMessage(false, metaPropertyName(context, expr), " can't come after a prefix operator"); 4929 4941 bool isEvalOrArguments = false; 4930 4942 if (strictMode() && !m_syntaxAlreadyValidated) { … … 4935 4947 switch (m_token.m_type) { 4936 4948 case PLUSPLUS: 4937 if (UNLIKELY(context.is NewTarget(expr)))4938 internalFailWithMessage(false, "new.targetcan't come before a postfix operator");4949 if (UNLIKELY(context.isMetaProperty(expr))) 4950 internalFailWithMessage(false, metaPropertyName(context, expr), " can't come before a postfix operator"); 4939 4951 m_parserState.nonTrivialExpressionCount++; 4940 4952 m_parserState.nonLHSCount++; … … 4947 4959 break; 4948 4960 case MINUSMINUS: 4949 if (UNLIKELY(context.is NewTarget(expr)))4950 internalFailWithMessage(false, "new.targetcan't come before a postfix operator");4961 if (UNLIKELY(context.isMetaProperty(expr))) 4962 internalFailWithMessage(false, metaPropertyName(context, expr), " can't come before a postfix operator"); 4951 4963 m_parserState.nonTrivialExpressionCount++; 4952 4964 m_parserState.nonLHSCount++; -
trunk/Source/JavaScriptCore/parser/Parser.h
r223124 r223232 1613 1613 template <class TreeBuilder> ALWAYS_INLINE bool shouldCheckPropertyForUnderscoreProtoDuplicate(TreeBuilder&, const TreeProperty&); 1614 1614 1615 template <class TreeBuilder> NEVER_INLINE const char* metaPropertyName(TreeBuilder&, TreeExpression); 1616 1615 1617 ALWAYS_INLINE int isBinaryOperator(JSTokenType); 1616 1618 bool allowAutomaticSemicolon(); -
trunk/Source/JavaScriptCore/parser/SyntaxChecker.h
r223175 r223232 69 69 } 70 70 71 enum { NoneExpr = 0, 71 static const constexpr int MetaPropertyBit = 0x80000000; 72 enum : int { NoneExpr = 0, 72 73 ResolveEvalExpr, ResolveExpr, IntegerExpr, DoubleExpr, StringExpr, 73 74 ThisExpr, NullExpr, BoolExpr, RegExpExpr, ObjectLiteralExpr, 74 75 FunctionExpr, ClassExpr, SuperExpr, ImportExpr, BracketExpr, DotExpr, CallExpr, 75 76 NewExpr, PreExpr, PostExpr, UnaryExpr, BinaryExpr, 76 ConditionalExpr, AssignmentExpr, TypeofExpr, NewTargetExpr,77 ConditionalExpr, AssignmentExpr, TypeofExpr, 77 78 DeleteExpr, ArrayLiteralExpr, BindingDestructuring, RestParameter, 78 79 ArrayDestructuring, ObjectDestructuring, SourceElementsResult, … … 86 87 ModuleNameResult, 87 88 ImportSpecifierResult, ImportSpecifierListResult, 88 ExportSpecifierResult, ExportSpecifierListResult 89 ExportSpecifierResult, ExportSpecifierListResult, 90 91 NewTargetExpr = MetaPropertyBit | 0, 92 ImportMetaExpr = MetaPropertyBit | 1, 89 93 }; 90 94 typedef int ExpressionType; … … 161 165 ExpressionType createSuperExpr(const JSTokenLocation&) { return SuperExpr; } 162 166 ExpressionType createNewTargetExpr(const JSTokenLocation&) { return NewTargetExpr; } 167 ExpressionType createImportMetaExpr(const JSTokenLocation&, ExpressionType) { return ImportMetaExpr; } 168 ALWAYS_INLINE bool isMetaProperty(ExpressionType type) { return type & MetaPropertyBit; } 163 169 ALWAYS_INLINE bool isNewTarget(ExpressionType type) { return type == NewTargetExpr; } 170 ALWAYS_INLINE bool isImportMeta(ExpressionType type) { return type == ImportMetaExpr; } 164 171 ExpressionType createResolve(const JSTokenLocation&, const Identifier&, int, int) { return ResolveExpr; } 165 172 ExpressionType createObjectLiteral(const JSTokenLocation&) { return ObjectLiteralExpr; }
Note:
See TracChangeset
for help on using the changeset viewer.