| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_AST_H_ | 5 #ifndef V8_AST_H_ |
| 6 #define V8_AST_H_ | 6 #define V8_AST_H_ |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/assembler.h" | 10 #include "src/assembler.h" |
| (...skipping 2349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2360 enum IsFunctionFlag { | 2360 enum IsFunctionFlag { |
| 2361 kGlobalOrEval, | 2361 kGlobalOrEval, |
| 2362 kIsFunction | 2362 kIsFunction |
| 2363 }; | 2363 }; |
| 2364 | 2364 |
| 2365 enum IsParenthesizedFlag { | 2365 enum IsParenthesizedFlag { |
| 2366 kIsParenthesized, | 2366 kIsParenthesized, |
| 2367 kNotParenthesized | 2367 kNotParenthesized |
| 2368 }; | 2368 }; |
| 2369 | 2369 |
| 2370 enum KindFlag { | 2370 enum IsGeneratorFlag { kNotGenerator = 0, kIsGenerator = 1 }; |
| 2371 kNormalFunction, | 2371 |
| 2372 kArrowFunction, | 2372 enum IsArrowFlag { kNotArrow = 0, kIsArrow = 1 }; |
| 2373 kGeneratorFunction | 2373 |
| 2374 }; | 2374 enum IsConciseMethodFlag { kNotConciseMethod = 0, kIsConciseMethod = 1 }; |
| 2375 | 2375 |
| 2376 enum ArityRestriction { | 2376 enum ArityRestriction { |
| 2377 NORMAL_ARITY, | 2377 NORMAL_ARITY, |
| 2378 GETTER_ARITY, | 2378 GETTER_ARITY, |
| 2379 SETTER_ARITY | 2379 SETTER_ARITY |
| 2380 }; | 2380 }; |
| 2381 | 2381 |
| 2382 DECLARE_NODE_TYPE(FunctionLiteral) | 2382 DECLARE_NODE_TYPE(FunctionLiteral) |
| 2383 | 2383 |
| 2384 Handle<String> name() const { return raw_name_->string(); } | 2384 Handle<String> name() const { return raw_name_->string(); } |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2457 // - var x = function() { ... }(); | 2457 // - var x = function() { ... }(); |
| 2458 bool is_parenthesized() { | 2458 bool is_parenthesized() { |
| 2459 return IsParenthesized::decode(bitfield_) == kIsParenthesized; | 2459 return IsParenthesized::decode(bitfield_) == kIsParenthesized; |
| 2460 } | 2460 } |
| 2461 void set_parenthesized() { | 2461 void set_parenthesized() { |
| 2462 bitfield_ = IsParenthesized::update(bitfield_, kIsParenthesized); | 2462 bitfield_ = IsParenthesized::update(bitfield_, kIsParenthesized); |
| 2463 } | 2463 } |
| 2464 | 2464 |
| 2465 bool is_generator() { return IsGenerator::decode(bitfield_); } | 2465 bool is_generator() { return IsGenerator::decode(bitfield_); } |
| 2466 bool is_arrow() { return IsArrow::decode(bitfield_); } | 2466 bool is_arrow() { return IsArrow::decode(bitfield_); } |
| 2467 bool is_concise_method() { return IsConciseMethod::decode(bitfield_); } |
| 2467 | 2468 |
| 2468 int ast_node_count() { return ast_properties_.node_count(); } | 2469 int ast_node_count() { return ast_properties_.node_count(); } |
| 2469 AstProperties::Flags* flags() { return ast_properties_.flags(); } | 2470 AstProperties::Flags* flags() { return ast_properties_.flags(); } |
| 2470 void set_ast_properties(AstProperties* ast_properties) { | 2471 void set_ast_properties(AstProperties* ast_properties) { |
| 2471 ast_properties_ = *ast_properties; | 2472 ast_properties_ = *ast_properties; |
| 2472 } | 2473 } |
| 2473 int slot_count() { | 2474 int slot_count() { |
| 2474 return ast_properties_.feedback_slots(); | 2475 return ast_properties_.feedback_slots(); |
| 2475 } | 2476 } |
| 2476 bool dont_optimize() { return dont_optimize_reason_ != kNoReason; } | 2477 bool dont_optimize() { return dont_optimize_reason_ != kNoReason; } |
| 2477 BailoutReason dont_optimize_reason() { return dont_optimize_reason_; } | 2478 BailoutReason dont_optimize_reason() { return dont_optimize_reason_; } |
| 2478 void set_dont_optimize_reason(BailoutReason reason) { | 2479 void set_dont_optimize_reason(BailoutReason reason) { |
| 2479 dont_optimize_reason_ = reason; | 2480 dont_optimize_reason_ = reason; |
| 2480 } | 2481 } |
| 2481 | 2482 |
| 2482 protected: | 2483 protected: |
| 2483 FunctionLiteral(Zone* zone, const AstRawString* name, | 2484 FunctionLiteral(Zone* zone, const AstRawString* name, |
| 2484 AstValueFactory* ast_value_factory, Scope* scope, | 2485 AstValueFactory* ast_value_factory, Scope* scope, |
| 2485 ZoneList<Statement*>* body, int materialized_literal_count, | 2486 ZoneList<Statement*>* body, int materialized_literal_count, |
| 2486 int expected_property_count, int handler_count, | 2487 int expected_property_count, int handler_count, |
| 2487 int parameter_count, FunctionType function_type, | 2488 int parameter_count, FunctionType function_type, |
| 2488 ParameterFlag has_duplicate_parameters, | 2489 ParameterFlag has_duplicate_parameters, |
| 2489 IsFunctionFlag is_function, | 2490 IsFunctionFlag is_function, |
| 2490 IsParenthesizedFlag is_parenthesized, KindFlag kind, | 2491 IsParenthesizedFlag is_parenthesized, |
| 2491 int position) | 2492 IsGeneratorFlag is_generator, IsArrowFlag is_arrow, |
| 2493 IsConciseMethodFlag is_concise_method, int position) |
| 2492 : Expression(zone, position), | 2494 : Expression(zone, position), |
| 2493 raw_name_(name), | 2495 raw_name_(name), |
| 2494 scope_(scope), | 2496 scope_(scope), |
| 2495 body_(body), | 2497 body_(body), |
| 2496 raw_inferred_name_(ast_value_factory->empty_string()), | 2498 raw_inferred_name_(ast_value_factory->empty_string()), |
| 2497 dont_optimize_reason_(kNoReason), | 2499 dont_optimize_reason_(kNoReason), |
| 2498 materialized_literal_count_(materialized_literal_count), | 2500 materialized_literal_count_(materialized_literal_count), |
| 2499 expected_property_count_(expected_property_count), | 2501 expected_property_count_(expected_property_count), |
| 2500 handler_count_(handler_count), | 2502 handler_count_(handler_count), |
| 2501 parameter_count_(parameter_count), | 2503 parameter_count_(parameter_count), |
| 2502 function_token_position_(RelocInfo::kNoPosition) { | 2504 function_token_position_(RelocInfo::kNoPosition) { |
| 2503 bitfield_ = IsExpression::encode(function_type != DECLARATION) | | 2505 bitfield_ = IsExpression::encode(function_type != DECLARATION) | |
| 2504 IsAnonymous::encode(function_type == ANONYMOUS_EXPRESSION) | | 2506 IsAnonymous::encode(function_type == ANONYMOUS_EXPRESSION) | |
| 2505 Pretenure::encode(false) | | 2507 Pretenure::encode(false) | |
| 2506 HasDuplicateParameters::encode(has_duplicate_parameters) | | 2508 HasDuplicateParameters::encode(has_duplicate_parameters) | |
| 2507 IsFunction::encode(is_function) | | 2509 IsFunction::encode(is_function) | |
| 2508 IsParenthesized::encode(is_parenthesized) | | 2510 IsParenthesized::encode(is_parenthesized) | |
| 2509 IsGenerator::encode(kind == kGeneratorFunction) | | 2511 IsGenerator::encode(is_generator) | IsArrow::encode(is_arrow) | |
| 2510 IsArrow::encode(kind == kArrowFunction); | 2512 IsConciseMethod::encode(is_concise_method); |
| 2511 } | 2513 } |
| 2512 | 2514 |
| 2513 private: | 2515 private: |
| 2514 const AstRawString* raw_name_; | 2516 const AstRawString* raw_name_; |
| 2515 Handle<String> name_; | 2517 Handle<String> name_; |
| 2516 Handle<SharedFunctionInfo> shared_info_; | 2518 Handle<SharedFunctionInfo> shared_info_; |
| 2517 Scope* scope_; | 2519 Scope* scope_; |
| 2518 ZoneList<Statement*>* body_; | 2520 ZoneList<Statement*>* body_; |
| 2519 const AstString* raw_inferred_name_; | 2521 const AstString* raw_inferred_name_; |
| 2520 Handle<String> inferred_name_; | 2522 Handle<String> inferred_name_; |
| 2521 AstProperties ast_properties_; | 2523 AstProperties ast_properties_; |
| 2522 BailoutReason dont_optimize_reason_; | 2524 BailoutReason dont_optimize_reason_; |
| 2523 | 2525 |
| 2524 int materialized_literal_count_; | 2526 int materialized_literal_count_; |
| 2525 int expected_property_count_; | 2527 int expected_property_count_; |
| 2526 int handler_count_; | 2528 int handler_count_; |
| 2527 int parameter_count_; | 2529 int parameter_count_; |
| 2528 int function_token_position_; | 2530 int function_token_position_; |
| 2529 | 2531 |
| 2530 unsigned bitfield_; | 2532 unsigned bitfield_; |
| 2531 class IsExpression: public BitField<bool, 0, 1> {}; | 2533 class IsExpression: public BitField<bool, 0, 1> {}; |
| 2532 class IsAnonymous: public BitField<bool, 1, 1> {}; | 2534 class IsAnonymous: public BitField<bool, 1, 1> {}; |
| 2533 class Pretenure: public BitField<bool, 2, 1> {}; | 2535 class Pretenure: public BitField<bool, 2, 1> {}; |
| 2534 class HasDuplicateParameters: public BitField<ParameterFlag, 3, 1> {}; | 2536 class HasDuplicateParameters: public BitField<ParameterFlag, 3, 1> {}; |
| 2535 class IsFunction: public BitField<IsFunctionFlag, 4, 1> {}; | 2537 class IsFunction: public BitField<IsFunctionFlag, 4, 1> {}; |
| 2536 class IsParenthesized: public BitField<IsParenthesizedFlag, 5, 1> {}; | 2538 class IsParenthesized: public BitField<IsParenthesizedFlag, 5, 1> {}; |
| 2537 class IsGenerator : public BitField<bool, 6, 1> {}; | 2539 class IsGenerator : public BitField<bool, 6, 1> {}; |
| 2538 class IsArrow : public BitField<bool, 7, 1> {}; | 2540 class IsArrow : public BitField<bool, 7, 1> {}; |
| 2541 class IsConciseMethod : public BitField<bool, 8, 1> {}; |
| 2539 }; | 2542 }; |
| 2540 | 2543 |
| 2541 | 2544 |
| 2542 class NativeFunctionLiteral V8_FINAL : public Expression { | 2545 class NativeFunctionLiteral V8_FINAL : public Expression { |
| 2543 public: | 2546 public: |
| 2544 DECLARE_NODE_TYPE(NativeFunctionLiteral) | 2547 DECLARE_NODE_TYPE(NativeFunctionLiteral) |
| 2545 | 2548 |
| 2546 Handle<String> name() const { return name_->string(); } | 2549 Handle<String> name() const { return name_->string(); } |
| 2547 v8::Extension* extension() const { return extension_; } | 2550 v8::Extension* extension() const { return extension_; } |
| 2548 | 2551 |
| (...skipping 920 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3469 } | 3472 } |
| 3470 | 3473 |
| 3471 FunctionLiteral* NewFunctionLiteral( | 3474 FunctionLiteral* NewFunctionLiteral( |
| 3472 const AstRawString* name, AstValueFactory* ast_value_factory, | 3475 const AstRawString* name, AstValueFactory* ast_value_factory, |
| 3473 Scope* scope, ZoneList<Statement*>* body, int materialized_literal_count, | 3476 Scope* scope, ZoneList<Statement*>* body, int materialized_literal_count, |
| 3474 int expected_property_count, int handler_count, int parameter_count, | 3477 int expected_property_count, int handler_count, int parameter_count, |
| 3475 FunctionLiteral::ParameterFlag has_duplicate_parameters, | 3478 FunctionLiteral::ParameterFlag has_duplicate_parameters, |
| 3476 FunctionLiteral::FunctionType function_type, | 3479 FunctionLiteral::FunctionType function_type, |
| 3477 FunctionLiteral::IsFunctionFlag is_function, | 3480 FunctionLiteral::IsFunctionFlag is_function, |
| 3478 FunctionLiteral::IsParenthesizedFlag is_parenthesized, | 3481 FunctionLiteral::IsParenthesizedFlag is_parenthesized, |
| 3479 FunctionLiteral::KindFlag kind, int position) { | 3482 FunctionLiteral::IsGeneratorFlag is_generator, |
| 3483 FunctionLiteral::IsArrowFlag is_arrow, |
| 3484 FunctionLiteral::IsConciseMethodFlag is_concise_method, int position) { |
| 3480 FunctionLiteral* lit = new (zone_) FunctionLiteral( | 3485 FunctionLiteral* lit = new (zone_) FunctionLiteral( |
| 3481 zone_, name, ast_value_factory, scope, body, materialized_literal_count, | 3486 zone_, name, ast_value_factory, scope, body, materialized_literal_count, |
| 3482 expected_property_count, handler_count, parameter_count, function_type, | 3487 expected_property_count, handler_count, parameter_count, function_type, |
| 3483 has_duplicate_parameters, is_function, is_parenthesized, kind, | 3488 has_duplicate_parameters, is_function, is_parenthesized, is_generator, |
| 3484 position); | 3489 is_arrow, is_concise_method, position); |
| 3485 // Top-level literal doesn't count for the AST's properties. | 3490 // Top-level literal doesn't count for the AST's properties. |
| 3486 if (is_function == FunctionLiteral::kIsFunction) { | 3491 if (is_function == FunctionLiteral::kIsFunction) { |
| 3487 visitor_.VisitFunctionLiteral(lit); | 3492 visitor_.VisitFunctionLiteral(lit); |
| 3488 } | 3493 } |
| 3489 return lit; | 3494 return lit; |
| 3490 } | 3495 } |
| 3491 | 3496 |
| 3492 NativeFunctionLiteral* NewNativeFunctionLiteral( | 3497 NativeFunctionLiteral* NewNativeFunctionLiteral( |
| 3493 const AstRawString* name, v8::Extension* extension, | 3498 const AstRawString* name, v8::Extension* extension, |
| 3494 int pos) { | 3499 int pos) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 3512 private: | 3517 private: |
| 3513 Zone* zone_; | 3518 Zone* zone_; |
| 3514 Visitor visitor_; | 3519 Visitor visitor_; |
| 3515 AstValueFactory* ast_value_factory_; | 3520 AstValueFactory* ast_value_factory_; |
| 3516 }; | 3521 }; |
| 3517 | 3522 |
| 3518 | 3523 |
| 3519 } } // namespace v8::internal | 3524 } } // namespace v8::internal |
| 3520 | 3525 |
| 3521 #endif // V8_AST_H_ | 3526 #endif // V8_AST_H_ |
| OLD | NEW |