| Index: src/ast/ast.h
|
| diff --git a/src/ast/ast.h b/src/ast/ast.h
|
| index ba35956da8b651fbe12af3ca5c88789456da0629..b611d2701addfb06b91be3ef2578324f67169dcf 100644
|
| --- a/src/ast/ast.h
|
| +++ b/src/ast/ast.h
|
| @@ -1429,9 +1429,7 @@ class ObjectLiteralProperty final : public ZoneObject {
|
|
|
| void set_receiver_type(Handle<Map> map) { receiver_type_ = map; }
|
|
|
| - bool NeedsSetFunctionName() const {
|
| - return is_computed_name_ && value_->IsAnonymousFunctionDefinition();
|
| - }
|
| + bool NeedsSetFunctionName() const;
|
|
|
| protected:
|
| friend class AstNodeFactory;
|
| @@ -2575,15 +2573,13 @@ class FunctionLiteral final : public Expression {
|
| kAnonymousExpression,
|
| kNamedExpression,
|
| kDeclaration,
|
| - kGlobalOrEval
|
| + kAccessorOrMethod
|
| };
|
|
|
| enum ParameterFlag { kNoDuplicateParameters, kHasDuplicateParameters };
|
|
|
| enum EagerCompileHint { kShouldEagerCompile, kShouldLazyCompile };
|
|
|
| - enum ArityRestriction { kNormalArity, kGetterArity, kSetterArity };
|
| -
|
| DECLARE_NODE_TYPE(FunctionLiteral)
|
|
|
| Handle<String> name() const { return raw_name_->string(); }
|
| @@ -2596,8 +2592,13 @@ class FunctionLiteral final : public Expression {
|
| int start_position() const;
|
| int end_position() const;
|
| int SourceSize() const { return end_position() - start_position(); }
|
| - bool is_expression() const { return IsExpression::decode(bitfield_); }
|
| - bool is_anonymous() const { return IsAnonymous::decode(bitfield_); }
|
| + bool is_declaration() const { return IsDeclaration::decode(bitfield_); }
|
| + bool is_named_expression() const {
|
| + return IsNamedExpression::decode(bitfield_);
|
| + }
|
| + bool is_anonymous_expression() const {
|
| + return IsAnonymousExpression::decode(bitfield_);
|
| + }
|
| LanguageMode language_mode() const;
|
|
|
| static bool NeedsHomeObject(Expression* expr);
|
| @@ -2690,10 +2691,7 @@ class FunctionLiteral final : public Expression {
|
| }
|
|
|
| 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();
|
| + return is_anonymous_expression();
|
| }
|
|
|
| protected:
|
| @@ -2704,7 +2702,7 @@ class FunctionLiteral final : public Expression {
|
| FunctionType function_type,
|
| ParameterFlag has_duplicate_parameters,
|
| EagerCompileHint eager_compile_hint, FunctionKind kind,
|
| - int position)
|
| + int position, bool is_function)
|
| : Expression(zone, position),
|
| raw_name_(name),
|
| scope_(scope),
|
| @@ -2717,26 +2715,28 @@ class FunctionLiteral final : public Expression {
|
| parameter_count_(parameter_count),
|
| function_token_position_(RelocInfo::kNoPosition) {
|
| bitfield_ =
|
| - IsExpression::encode(function_type != kDeclaration) |
|
| - IsAnonymous::encode(function_type == kAnonymousExpression) |
|
| + IsDeclaration::encode(function_type == kDeclaration) |
|
| + IsNamedExpression::encode(function_type == kNamedExpression) |
|
| + IsAnonymousExpression::encode(function_type == kAnonymousExpression) |
|
| Pretenure::encode(false) |
|
| HasDuplicateParameters::encode(has_duplicate_parameters ==
|
| kHasDuplicateParameters) |
|
| - IsFunction::encode(function_type != kGlobalOrEval) |
|
| + IsFunction::encode(is_function) |
|
| ShouldEagerCompile::encode(eager_compile_hint == kShouldEagerCompile) |
|
| FunctionKindBits::encode(kind) | ShouldBeUsedOnceHint::encode(false);
|
| DCHECK(IsValidFunctionKind(kind));
|
| }
|
|
|
| private:
|
| - class IsExpression : public BitField16<bool, 0, 1> {};
|
| - class IsAnonymous : public BitField16<bool, 1, 1> {};
|
| - class Pretenure : public BitField16<bool, 2, 1> {};
|
| - class HasDuplicateParameters : public BitField16<bool, 3, 1> {};
|
| - class IsFunction : public BitField16<bool, 4, 1> {};
|
| - class ShouldEagerCompile : public BitField16<bool, 5, 1> {};
|
| - class FunctionKindBits : public BitField16<FunctionKind, 6, 8> {};
|
| - class ShouldBeUsedOnceHint : public BitField16<bool, 15, 1> {};
|
| + class IsDeclaration : public BitField16<bool, 0, 1> {};
|
| + class IsNamedExpression : public BitField16<bool, 1, 1> {};
|
| + class IsAnonymousExpression : public BitField16<bool, 2, 1> {};
|
| + class Pretenure : public BitField16<bool, 3, 1> {};
|
| + class HasDuplicateParameters : public BitField16<bool, 4, 1> {};
|
| + class IsFunction : public BitField16<bool, 5, 1> {};
|
| + class ShouldEagerCompile : public BitField16<bool, 6, 1> {};
|
| + class ShouldBeUsedOnceHint : public BitField16<bool, 7, 1> {};
|
| + class FunctionKindBits : public BitField16<FunctionKind, 8, 8> {};
|
|
|
| // Start with 16-bit field, which should get packed together
|
| // with Expression's trailing 16-bit field.
|
| @@ -3413,7 +3413,22 @@ class AstNodeFactory final BASE_EMBEDDED {
|
| parser_zone_, name, ast_value_factory_, scope, body,
|
| materialized_literal_count, expected_property_count, parameter_count,
|
| function_type, has_duplicate_parameters, eager_compile_hint, kind,
|
| - position);
|
| + position, true);
|
| + }
|
| +
|
| + // Creates a FunctionLiteral representing a top-level script, the
|
| + // result of an eval (top-level or otherwise), or the result of calling
|
| + // the Function constructor.
|
| + FunctionLiteral* NewScriptOrEvalFunctionLiteral(
|
| + Scope* scope, ZoneList<Statement*>* body, int materialized_literal_count,
|
| + int expected_property_count) {
|
| + return new (parser_zone_) FunctionLiteral(
|
| + parser_zone_, ast_value_factory_->empty_string(), ast_value_factory_,
|
| + scope, body, materialized_literal_count, expected_property_count, 0,
|
| + FunctionLiteral::kAnonymousExpression,
|
| + FunctionLiteral::kNoDuplicateParameters,
|
| + FunctionLiteral::kShouldLazyCompile, FunctionKind::kNormalFunction, 0,
|
| + false);
|
| }
|
|
|
| ClassLiteral* NewClassLiteral(Scope* scope, VariableProxy* proxy,
|
|
|