Index: src/ast/ast.h |
diff --git a/src/ast/ast.h b/src/ast/ast.h |
index b2103b04e32d747afbc44070fe9e3b5bdba276af..2090a8197ae37ebcb85552c73aef898529081976 100644 |
--- a/src/ast/ast.h |
+++ b/src/ast/ast.h |
@@ -324,6 +324,10 @@ class Expression : public AstNode { |
// names because [] for string objects is handled only by keyed ICs. |
virtual bool IsPropertyName() const { return false; } |
+ // True iff the expression is a class or function expression without |
+ // a syntactic name. |
+ virtual bool IsAnonymousFunctionDefinition() const { return false; } |
+ |
// True iff the expression is a literal represented as a smi. |
bool IsSmiLiteral() const; |
@@ -2758,6 +2762,13 @@ class FunctionLiteral final : public Expression { |
dont_optimize_reason_ = reason; |
} |
+ bool IsAnonymousFunctionDefinition() const final { |
+ // TODO(adamk): This isn't quite accurate, as many non-expressions |
+ // (such as concise methods) are marked as anonymous, but it's |
+ // sufficient for the current callers. |
+ return is_anonymous(); |
+ } |
+ |
protected: |
FunctionLiteral(Zone* zone, const AstString* name, |
AstValueFactory* ast_value_factory, Scope* scope, |
@@ -2825,13 +2836,6 @@ class ClassLiteral final : public Expression { |
DECLARE_NODE_TYPE(ClassLiteral) |
- Handle<String> name() const { return raw_name_->string(); } |
- const AstRawString* raw_name() const { return raw_name_; } |
- void set_raw_name(const AstRawString* name) { |
- DCHECK_NULL(raw_name_); |
- raw_name_ = name; |
- } |
- |
Scope* scope() const { return scope_; } |
VariableProxy* class_variable_proxy() const { return class_variable_proxy_; } |
Expression* extends() const { return extends_; } |
@@ -2866,13 +2870,16 @@ class ClassLiteral final : public Expression { |
FeedbackVectorSlot ProxySlot() const { return slot_; } |
+ bool IsAnonymousFunctionDefinition() const final { |
+ return constructor()->raw_name()->length() == 0; |
+ } |
+ |
protected: |
- ClassLiteral(Zone* zone, const AstRawString* name, Scope* scope, |
- VariableProxy* class_variable_proxy, Expression* extends, |
- FunctionLiteral* constructor, ZoneList<Property*>* properties, |
- int start_position, int end_position) |
+ ClassLiteral(Zone* zone, Scope* scope, VariableProxy* class_variable_proxy, |
+ Expression* extends, FunctionLiteral* constructor, |
+ ZoneList<Property*>* properties, int start_position, |
+ int end_position) |
: Expression(zone, start_position), |
- raw_name_(name), |
scope_(scope), |
class_variable_proxy_(class_variable_proxy), |
extends_(extends), |
@@ -2885,7 +2892,6 @@ class ClassLiteral final : public Expression { |
private: |
int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
- const AstRawString* raw_name_; |
Scope* scope_; |
VariableProxy* class_variable_proxy_; |
Expression* extends_; |
@@ -3481,13 +3487,13 @@ class AstNodeFactory final BASE_EMBEDDED { |
position); |
} |
- ClassLiteral* NewClassLiteral(const AstRawString* name, Scope* scope, |
- VariableProxy* proxy, Expression* extends, |
+ ClassLiteral* NewClassLiteral(Scope* scope, VariableProxy* proxy, |
+ Expression* extends, |
FunctionLiteral* constructor, |
ZoneList<ObjectLiteral::Property*>* properties, |
int start_position, int end_position) { |
return new (parser_zone_) |
- ClassLiteral(parser_zone_, name, scope, proxy, extends, constructor, |
+ ClassLiteral(parser_zone_, scope, proxy, extends, constructor, |
properties, start_position, end_position); |
} |