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 1143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1154 | 1154 |
1155 Expression* condition_; | 1155 Expression* condition_; |
1156 Statement* then_statement_; | 1156 Statement* then_statement_; |
1157 Statement* else_statement_; | 1157 Statement* else_statement_; |
1158 int base_id_; | 1158 int base_id_; |
1159 }; | 1159 }; |
1160 | 1160 |
1161 | 1161 |
1162 class TryStatement : public Statement { | 1162 class TryStatement : public Statement { |
1163 public: | 1163 public: |
1164 int index() const { return index_; } | |
1165 Block* try_block() const { return try_block_; } | 1164 Block* try_block() const { return try_block_; } |
1166 | 1165 |
1167 protected: | 1166 protected: |
1168 TryStatement(Zone* zone, int index, Block* try_block, int pos) | 1167 TryStatement(Zone* zone, Block* try_block, int pos) |
1169 : Statement(zone, pos), index_(index), try_block_(try_block) {} | 1168 : Statement(zone, pos), try_block_(try_block) {} |
1170 | 1169 |
1171 private: | 1170 private: |
1172 // Unique (per-function) index of this handler. This is not an AST ID. | |
1173 int index_; | |
1174 | |
1175 Block* try_block_; | 1171 Block* try_block_; |
1176 }; | 1172 }; |
1177 | 1173 |
1178 | 1174 |
1179 class TryCatchStatement final : public TryStatement { | 1175 class TryCatchStatement final : public TryStatement { |
1180 public: | 1176 public: |
1181 DECLARE_NODE_TYPE(TryCatchStatement) | 1177 DECLARE_NODE_TYPE(TryCatchStatement) |
1182 | 1178 |
1183 Scope* scope() { return scope_; } | 1179 Scope* scope() { return scope_; } |
1184 Variable* variable() { return variable_; } | 1180 Variable* variable() { return variable_; } |
1185 Block* catch_block() const { return catch_block_; } | 1181 Block* catch_block() const { return catch_block_; } |
1186 | 1182 |
1187 protected: | 1183 protected: |
1188 TryCatchStatement(Zone* zone, | 1184 TryCatchStatement(Zone* zone, Block* try_block, Scope* scope, |
1189 int index, | 1185 Variable* variable, Block* catch_block, int pos) |
1190 Block* try_block, | 1186 : TryStatement(zone, try_block, pos), |
1191 Scope* scope, | |
1192 Variable* variable, | |
1193 Block* catch_block, | |
1194 int pos) | |
1195 : TryStatement(zone, index, try_block, pos), | |
1196 scope_(scope), | 1187 scope_(scope), |
1197 variable_(variable), | 1188 variable_(variable), |
1198 catch_block_(catch_block) { | 1189 catch_block_(catch_block) {} |
1199 } | |
1200 | 1190 |
1201 private: | 1191 private: |
1202 Scope* scope_; | 1192 Scope* scope_; |
1203 Variable* variable_; | 1193 Variable* variable_; |
1204 Block* catch_block_; | 1194 Block* catch_block_; |
1205 }; | 1195 }; |
1206 | 1196 |
1207 | 1197 |
1208 class TryFinallyStatement final : public TryStatement { | 1198 class TryFinallyStatement final : public TryStatement { |
1209 public: | 1199 public: |
1210 DECLARE_NODE_TYPE(TryFinallyStatement) | 1200 DECLARE_NODE_TYPE(TryFinallyStatement) |
1211 | 1201 |
1212 Block* finally_block() const { return finally_block_; } | 1202 Block* finally_block() const { return finally_block_; } |
1213 | 1203 |
1214 protected: | 1204 protected: |
1215 TryFinallyStatement( | 1205 TryFinallyStatement(Zone* zone, Block* try_block, Block* finally_block, |
1216 Zone* zone, int index, Block* try_block, Block* finally_block, int pos) | 1206 int pos) |
1217 : TryStatement(zone, index, try_block, pos), | 1207 : TryStatement(zone, try_block, pos), finally_block_(finally_block) {} |
1218 finally_block_(finally_block) { } | |
1219 | 1208 |
1220 private: | 1209 private: |
1221 Block* finally_block_; | 1210 Block* finally_block_; |
1222 }; | 1211 }; |
1223 | 1212 |
1224 | 1213 |
1225 class DebuggerStatement final : public Statement { | 1214 class DebuggerStatement final : public Statement { |
1226 public: | 1215 public: |
1227 DECLARE_NODE_TYPE(DebuggerStatement) | 1216 DECLARE_NODE_TYPE(DebuggerStatement) |
1228 | 1217 |
(...skipping 1169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2398 kInitial, // The initial yield that returns the unboxed generator object. | 2387 kInitial, // The initial yield that returns the unboxed generator object. |
2399 kSuspend, // A normal yield: { value: EXPRESSION, done: false } | 2388 kSuspend, // A normal yield: { value: EXPRESSION, done: false } |
2400 kDelegating, // A yield*. | 2389 kDelegating, // A yield*. |
2401 kFinal // A return: { value: EXPRESSION, done: true } | 2390 kFinal // A return: { value: EXPRESSION, done: true } |
2402 }; | 2391 }; |
2403 | 2392 |
2404 Expression* generator_object() const { return generator_object_; } | 2393 Expression* generator_object() const { return generator_object_; } |
2405 Expression* expression() const { return expression_; } | 2394 Expression* expression() const { return expression_; } |
2406 Kind yield_kind() const { return yield_kind_; } | 2395 Kind yield_kind() const { return yield_kind_; } |
2407 | 2396 |
2408 // Delegating yield surrounds the "yield" in a "try/catch". This index | |
2409 // locates the catch handler in the handler table, and is equivalent to | |
2410 // TryCatchStatement::index(). | |
2411 int index() const { | |
2412 DCHECK_EQ(kDelegating, yield_kind()); | |
2413 return index_; | |
2414 } | |
2415 void set_index(int index) { | |
2416 DCHECK_EQ(kDelegating, yield_kind()); | |
2417 index_ = index; | |
2418 } | |
2419 | |
2420 // Type feedback information. | 2397 // Type feedback information. |
2421 bool HasFeedbackSlots() const { return yield_kind() == kDelegating; } | 2398 bool HasFeedbackSlots() const { return yield_kind() == kDelegating; } |
2422 virtual FeedbackVectorRequirements ComputeFeedbackRequirements( | 2399 virtual FeedbackVectorRequirements ComputeFeedbackRequirements( |
2423 Isolate* isolate, const ICSlotCache* cache) override { | 2400 Isolate* isolate, const ICSlotCache* cache) override { |
2424 return FeedbackVectorRequirements(0, HasFeedbackSlots() ? 3 : 0); | 2401 return FeedbackVectorRequirements(0, HasFeedbackSlots() ? 3 : 0); |
2425 } | 2402 } |
2426 void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot, | 2403 void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot, |
2427 ICSlotCache* cache) override { | 2404 ICSlotCache* cache) override { |
2428 yield_first_feedback_slot_ = slot; | 2405 yield_first_feedback_slot_ = slot; |
2429 } | 2406 } |
(...skipping 12 matching lines...) Expand all Loading... |
2442 | 2419 |
2443 FeedbackVectorICSlot ValueFeedbackSlot() { return DoneFeedbackSlot().next(); } | 2420 FeedbackVectorICSlot ValueFeedbackSlot() { return DoneFeedbackSlot().next(); } |
2444 | 2421 |
2445 protected: | 2422 protected: |
2446 Yield(Zone* zone, Expression* generator_object, Expression* expression, | 2423 Yield(Zone* zone, Expression* generator_object, Expression* expression, |
2447 Kind yield_kind, int pos) | 2424 Kind yield_kind, int pos) |
2448 : Expression(zone, pos), | 2425 : Expression(zone, pos), |
2449 generator_object_(generator_object), | 2426 generator_object_(generator_object), |
2450 expression_(expression), | 2427 expression_(expression), |
2451 yield_kind_(yield_kind), | 2428 yield_kind_(yield_kind), |
2452 index_(-1), | |
2453 yield_first_feedback_slot_(FeedbackVectorICSlot::Invalid()) {} | 2429 yield_first_feedback_slot_(FeedbackVectorICSlot::Invalid()) {} |
2454 | 2430 |
2455 private: | 2431 private: |
2456 Expression* generator_object_; | 2432 Expression* generator_object_; |
2457 Expression* expression_; | 2433 Expression* expression_; |
2458 Kind yield_kind_; | 2434 Kind yield_kind_; |
2459 int index_; | |
2460 FeedbackVectorICSlot yield_first_feedback_slot_; | 2435 FeedbackVectorICSlot yield_first_feedback_slot_; |
2461 }; | 2436 }; |
2462 | 2437 |
2463 | 2438 |
2464 class Throw final : public Expression { | 2439 class Throw final : public Expression { |
2465 public: | 2440 public: |
2466 DECLARE_NODE_TYPE(Throw) | 2441 DECLARE_NODE_TYPE(Throw) |
2467 | 2442 |
2468 Expression* exception() const { return exception_; } | 2443 Expression* exception() const { return exception_; } |
2469 | 2444 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2516 int end_position() const; | 2491 int end_position() const; |
2517 int SourceSize() const { return end_position() - start_position(); } | 2492 int SourceSize() const { return end_position() - start_position(); } |
2518 bool is_expression() const { return IsExpression::decode(bitfield_); } | 2493 bool is_expression() const { return IsExpression::decode(bitfield_); } |
2519 bool is_anonymous() const { return IsAnonymous::decode(bitfield_); } | 2494 bool is_anonymous() const { return IsAnonymous::decode(bitfield_); } |
2520 LanguageMode language_mode() const; | 2495 LanguageMode language_mode() const; |
2521 | 2496 |
2522 static bool NeedsHomeObject(Expression* expr); | 2497 static bool NeedsHomeObject(Expression* expr); |
2523 | 2498 |
2524 int materialized_literal_count() { return materialized_literal_count_; } | 2499 int materialized_literal_count() { return materialized_literal_count_; } |
2525 int expected_property_count() { return expected_property_count_; } | 2500 int expected_property_count() { return expected_property_count_; } |
2526 int handler_count() { return handler_count_; } | |
2527 int parameter_count() { return parameter_count_; } | 2501 int parameter_count() { return parameter_count_; } |
2528 | 2502 |
2529 bool AllowsLazyCompilation(); | 2503 bool AllowsLazyCompilation(); |
2530 bool AllowsLazyCompilationWithoutContext(); | 2504 bool AllowsLazyCompilationWithoutContext(); |
2531 | 2505 |
2532 void InitializeSharedInfo(Handle<Code> code); | 2506 void InitializeSharedInfo(Handle<Code> code); |
2533 | 2507 |
2534 Handle<String> debug_name() const { | 2508 Handle<String> debug_name() const { |
2535 if (raw_name_ != NULL && !raw_name_->IsEmpty()) { | 2509 if (raw_name_ != NULL && !raw_name_->IsEmpty()) { |
2536 return raw_name_->string(); | 2510 return raw_name_->string(); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2611 bool dont_optimize() { return dont_optimize_reason_ != kNoReason; } | 2585 bool dont_optimize() { return dont_optimize_reason_ != kNoReason; } |
2612 BailoutReason dont_optimize_reason() { return dont_optimize_reason_; } | 2586 BailoutReason dont_optimize_reason() { return dont_optimize_reason_; } |
2613 void set_dont_optimize_reason(BailoutReason reason) { | 2587 void set_dont_optimize_reason(BailoutReason reason) { |
2614 dont_optimize_reason_ = reason; | 2588 dont_optimize_reason_ = reason; |
2615 } | 2589 } |
2616 | 2590 |
2617 protected: | 2591 protected: |
2618 FunctionLiteral(Zone* zone, const AstRawString* name, | 2592 FunctionLiteral(Zone* zone, const AstRawString* name, |
2619 AstValueFactory* ast_value_factory, Scope* scope, | 2593 AstValueFactory* ast_value_factory, Scope* scope, |
2620 ZoneList<Statement*>* body, int materialized_literal_count, | 2594 ZoneList<Statement*>* body, int materialized_literal_count, |
2621 int expected_property_count, int handler_count, | 2595 int expected_property_count, int parameter_count, |
2622 int parameter_count, FunctionType function_type, | 2596 FunctionType function_type, |
2623 ParameterFlag has_duplicate_parameters, | 2597 ParameterFlag has_duplicate_parameters, |
2624 IsFunctionFlag is_function, | 2598 IsFunctionFlag is_function, |
2625 EagerCompileHint eager_compile_hint, FunctionKind kind, | 2599 EagerCompileHint eager_compile_hint, FunctionKind kind, |
2626 int position) | 2600 int position) |
2627 : Expression(zone, position), | 2601 : Expression(zone, position), |
2628 raw_name_(name), | 2602 raw_name_(name), |
2629 scope_(scope), | 2603 scope_(scope), |
2630 body_(body), | 2604 body_(body), |
2631 raw_inferred_name_(ast_value_factory->empty_string()), | 2605 raw_inferred_name_(ast_value_factory->empty_string()), |
2632 ast_properties_(zone), | 2606 ast_properties_(zone), |
2633 dont_optimize_reason_(kNoReason), | 2607 dont_optimize_reason_(kNoReason), |
2634 materialized_literal_count_(materialized_literal_count), | 2608 materialized_literal_count_(materialized_literal_count), |
2635 expected_property_count_(expected_property_count), | 2609 expected_property_count_(expected_property_count), |
2636 handler_count_(handler_count), | |
2637 parameter_count_(parameter_count), | 2610 parameter_count_(parameter_count), |
2638 function_token_position_(RelocInfo::kNoPosition) { | 2611 function_token_position_(RelocInfo::kNoPosition) { |
2639 bitfield_ = IsExpression::encode(function_type != DECLARATION) | | 2612 bitfield_ = IsExpression::encode(function_type != DECLARATION) | |
2640 IsAnonymous::encode(function_type == ANONYMOUS_EXPRESSION) | | 2613 IsAnonymous::encode(function_type == ANONYMOUS_EXPRESSION) | |
2641 Pretenure::encode(false) | | 2614 Pretenure::encode(false) | |
2642 HasDuplicateParameters::encode(has_duplicate_parameters) | | 2615 HasDuplicateParameters::encode(has_duplicate_parameters) | |
2643 IsFunction::encode(is_function) | | 2616 IsFunction::encode(is_function) | |
2644 EagerCompileHintBit::encode(eager_compile_hint) | | 2617 EagerCompileHintBit::encode(eager_compile_hint) | |
2645 FunctionKindBits::encode(kind) | | 2618 FunctionKindBits::encode(kind) | |
2646 ShouldBeUsedOnceHintBit::encode(kDontKnowIfShouldBeUsedOnce); | 2619 ShouldBeUsedOnceHintBit::encode(kDontKnowIfShouldBeUsedOnce); |
2647 DCHECK(IsValidFunctionKind(kind)); | 2620 DCHECK(IsValidFunctionKind(kind)); |
2648 } | 2621 } |
2649 | 2622 |
2650 private: | 2623 private: |
2651 const AstRawString* raw_name_; | 2624 const AstRawString* raw_name_; |
2652 Handle<String> name_; | 2625 Handle<String> name_; |
2653 Handle<SharedFunctionInfo> shared_info_; | 2626 Handle<SharedFunctionInfo> shared_info_; |
2654 Scope* scope_; | 2627 Scope* scope_; |
2655 ZoneList<Statement*>* body_; | 2628 ZoneList<Statement*>* body_; |
2656 const AstString* raw_inferred_name_; | 2629 const AstString* raw_inferred_name_; |
2657 Handle<String> inferred_name_; | 2630 Handle<String> inferred_name_; |
2658 AstProperties ast_properties_; | 2631 AstProperties ast_properties_; |
2659 BailoutReason dont_optimize_reason_; | 2632 BailoutReason dont_optimize_reason_; |
2660 | 2633 |
2661 int materialized_literal_count_; | 2634 int materialized_literal_count_; |
2662 int expected_property_count_; | 2635 int expected_property_count_; |
2663 int handler_count_; | |
2664 int parameter_count_; | 2636 int parameter_count_; |
2665 int function_token_position_; | 2637 int function_token_position_; |
2666 | 2638 |
2667 unsigned bitfield_; | 2639 unsigned bitfield_; |
2668 class IsExpression : public BitField<bool, 0, 1> {}; | 2640 class IsExpression : public BitField<bool, 0, 1> {}; |
2669 class IsAnonymous : public BitField<bool, 1, 1> {}; | 2641 class IsAnonymous : public BitField<bool, 1, 1> {}; |
2670 class Pretenure : public BitField<bool, 2, 1> {}; | 2642 class Pretenure : public BitField<bool, 2, 1> {}; |
2671 class HasDuplicateParameters : public BitField<ParameterFlag, 3, 1> {}; | 2643 class HasDuplicateParameters : public BitField<ParameterFlag, 3, 1> {}; |
2672 class IsFunction : public BitField<IsFunctionFlag, 4, 1> {}; | 2644 class IsFunction : public BitField<IsFunctionFlag, 4, 1> {}; |
2673 class EagerCompileHintBit : public BitField<EagerCompileHint, 5, 1> {}; | 2645 class EagerCompileHintBit : public BitField<EagerCompileHint, 5, 1> {}; |
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3353 } | 3325 } |
3354 | 3326 |
3355 IfStatement* NewIfStatement(Expression* condition, | 3327 IfStatement* NewIfStatement(Expression* condition, |
3356 Statement* then_statement, | 3328 Statement* then_statement, |
3357 Statement* else_statement, | 3329 Statement* else_statement, |
3358 int pos) { | 3330 int pos) { |
3359 return new (zone_) | 3331 return new (zone_) |
3360 IfStatement(zone_, condition, then_statement, else_statement, pos); | 3332 IfStatement(zone_, condition, then_statement, else_statement, pos); |
3361 } | 3333 } |
3362 | 3334 |
3363 TryCatchStatement* NewTryCatchStatement(int index, | 3335 TryCatchStatement* NewTryCatchStatement(Block* try_block, Scope* scope, |
3364 Block* try_block, | |
3365 Scope* scope, | |
3366 Variable* variable, | 3336 Variable* variable, |
3367 Block* catch_block, | 3337 Block* catch_block, int pos) { |
3368 int pos) { | 3338 return new (zone_) |
3369 return new (zone_) TryCatchStatement(zone_, index, try_block, scope, | 3339 TryCatchStatement(zone_, try_block, scope, variable, catch_block, pos); |
3370 variable, catch_block, pos); | |
3371 } | 3340 } |
3372 | 3341 |
3373 TryFinallyStatement* NewTryFinallyStatement(int index, | 3342 TryFinallyStatement* NewTryFinallyStatement(Block* try_block, |
3374 Block* try_block, | 3343 Block* finally_block, int pos) { |
3375 Block* finally_block, | |
3376 int pos) { | |
3377 return new (zone_) | 3344 return new (zone_) |
3378 TryFinallyStatement(zone_, index, try_block, finally_block, pos); | 3345 TryFinallyStatement(zone_, try_block, finally_block, pos); |
3379 } | 3346 } |
3380 | 3347 |
3381 DebuggerStatement* NewDebuggerStatement(int pos) { | 3348 DebuggerStatement* NewDebuggerStatement(int pos) { |
3382 return new (zone_) DebuggerStatement(zone_, pos); | 3349 return new (zone_) DebuggerStatement(zone_, pos); |
3383 } | 3350 } |
3384 | 3351 |
3385 EmptyStatement* NewEmptyStatement(int pos) { | 3352 EmptyStatement* NewEmptyStatement(int pos) { |
3386 return new(zone_) EmptyStatement(zone_, pos); | 3353 return new(zone_) EmptyStatement(zone_, pos); |
3387 } | 3354 } |
3388 | 3355 |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3570 Yield(zone_, generator_object, expression, yield_kind, pos); | 3537 Yield(zone_, generator_object, expression, yield_kind, pos); |
3571 } | 3538 } |
3572 | 3539 |
3573 Throw* NewThrow(Expression* exception, int pos) { | 3540 Throw* NewThrow(Expression* exception, int pos) { |
3574 return new (zone_) Throw(zone_, exception, pos); | 3541 return new (zone_) Throw(zone_, exception, pos); |
3575 } | 3542 } |
3576 | 3543 |
3577 FunctionLiteral* NewFunctionLiteral( | 3544 FunctionLiteral* NewFunctionLiteral( |
3578 const AstRawString* name, AstValueFactory* ast_value_factory, | 3545 const AstRawString* name, AstValueFactory* ast_value_factory, |
3579 Scope* scope, ZoneList<Statement*>* body, int materialized_literal_count, | 3546 Scope* scope, ZoneList<Statement*>* body, int materialized_literal_count, |
3580 int expected_property_count, int handler_count, int parameter_count, | 3547 int expected_property_count, int parameter_count, |
3581 FunctionLiteral::ParameterFlag has_duplicate_parameters, | 3548 FunctionLiteral::ParameterFlag has_duplicate_parameters, |
3582 FunctionLiteral::FunctionType function_type, | 3549 FunctionLiteral::FunctionType function_type, |
3583 FunctionLiteral::IsFunctionFlag is_function, | 3550 FunctionLiteral::IsFunctionFlag is_function, |
3584 FunctionLiteral::EagerCompileHint eager_compile_hint, FunctionKind kind, | 3551 FunctionLiteral::EagerCompileHint eager_compile_hint, FunctionKind kind, |
3585 int position) { | 3552 int position) { |
3586 return new (zone_) FunctionLiteral( | 3553 return new (zone_) FunctionLiteral( |
3587 zone_, name, ast_value_factory, scope, body, materialized_literal_count, | 3554 zone_, name, ast_value_factory, scope, body, materialized_literal_count, |
3588 expected_property_count, handler_count, parameter_count, function_type, | 3555 expected_property_count, parameter_count, function_type, |
3589 has_duplicate_parameters, is_function, eager_compile_hint, kind, | 3556 has_duplicate_parameters, is_function, eager_compile_hint, kind, |
3590 position); | 3557 position); |
3591 } | 3558 } |
3592 | 3559 |
3593 ClassLiteral* NewClassLiteral(const AstRawString* name, Scope* scope, | 3560 ClassLiteral* NewClassLiteral(const AstRawString* name, Scope* scope, |
3594 VariableProxy* proxy, Expression* extends, | 3561 VariableProxy* proxy, Expression* extends, |
3595 FunctionLiteral* constructor, | 3562 FunctionLiteral* constructor, |
3596 ZoneList<ObjectLiteral::Property*>* properties, | 3563 ZoneList<ObjectLiteral::Property*>* properties, |
3597 int start_position, int end_position) { | 3564 int start_position, int end_position) { |
3598 return new (zone_) | 3565 return new (zone_) |
(...skipping 28 matching lines...) Expand all Loading... |
3627 | 3594 |
3628 private: | 3595 private: |
3629 Zone* zone_; | 3596 Zone* zone_; |
3630 AstValueFactory* ast_value_factory_; | 3597 AstValueFactory* ast_value_factory_; |
3631 }; | 3598 }; |
3632 | 3599 |
3633 | 3600 |
3634 } } // namespace v8::internal | 3601 } } // namespace v8::internal |
3635 | 3602 |
3636 #endif // V8_AST_H_ | 3603 #endif // V8_AST_H_ |
OLD | NEW |