| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_ | 5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_ |
| 6 #define VM_INTERMEDIATE_LANGUAGE_H_ | 6 #define VM_INTERMEDIATE_LANGUAGE_H_ |
| 7 | 7 |
| 8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" |
| 9 #include "vm/ast.h" | 9 #include "vm/ast.h" |
| 10 #include "vm/growable_array.h" | 10 #include "vm/growable_array.h" |
| (...skipping 3476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3487 ASSERT(environment_->values_[index_] != NULL); | 3487 ASSERT(environment_->values_[index_] != NULL); |
| 3488 return environment_->values_[index_]; | 3488 return environment_->values_[index_]; |
| 3489 } | 3489 } |
| 3490 | 3490 |
| 3491 void SetCurrentValue(Value* value) { | 3491 void SetCurrentValue(Value* value) { |
| 3492 ASSERT(!Done()); | 3492 ASSERT(!Done()); |
| 3493 ASSERT(value != NULL); | 3493 ASSERT(value != NULL); |
| 3494 environment_->values_[index_] = value; | 3494 environment_->values_[index_] = value; |
| 3495 } | 3495 } |
| 3496 | 3496 |
| 3497 Location CurrentLocation() const { |
| 3498 ASSERT(!Done()); |
| 3499 return environment_->locations_[index_]; |
| 3500 } |
| 3501 |
| 3502 void SetCurrentLocation(Location loc) { |
| 3503 ASSERT(!Done()); |
| 3504 environment_->locations_[index_] = loc; |
| 3505 } |
| 3506 |
| 3497 private: | 3507 private: |
| 3498 Environment* environment_; | 3508 Environment* environment_; |
| 3499 intptr_t index_; | 3509 intptr_t index_; |
| 3500 }; | 3510 }; |
| 3501 | 3511 |
| 3502 // Iterate all non-NULL values in an environment, including outer | 3512 // Iterate all non-NULL values in an environment, including outer |
| 3503 // environments. Note that the iterator skips empty environments. | 3513 // environments. Note that the iterator skips empty environments. |
| 3504 class DeepIterator : public ValueObject { | 3514 class DeepIterator : public ValueObject { |
| 3505 public: | 3515 public: |
| 3506 explicit DeepIterator(Environment* environment) : iterator_(environment) { | 3516 explicit DeepIterator(Environment* environment) : iterator_(environment) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3518 Value* CurrentValue() const { | 3528 Value* CurrentValue() const { |
| 3519 ASSERT(!Done()); | 3529 ASSERT(!Done()); |
| 3520 return iterator_.CurrentValue(); | 3530 return iterator_.CurrentValue(); |
| 3521 } | 3531 } |
| 3522 | 3532 |
| 3523 void SetCurrentValue(Value* value) { | 3533 void SetCurrentValue(Value* value) { |
| 3524 ASSERT(!Done()); | 3534 ASSERT(!Done()); |
| 3525 iterator_.SetCurrentValue(value); | 3535 iterator_.SetCurrentValue(value); |
| 3526 } | 3536 } |
| 3527 | 3537 |
| 3538 Location CurrentLocation() const { |
| 3539 ASSERT(!Done()); |
| 3540 return iterator_.CurrentLocation(); |
| 3541 } |
| 3542 |
| 3543 void SetCurrentLocation(Location loc) { |
| 3544 ASSERT(!Done()); |
| 3545 iterator_.SetCurrentLocation(loc); |
| 3546 } |
| 3547 |
| 3528 private: | 3548 private: |
| 3529 void SkipDone() { | 3549 void SkipDone() { |
| 3530 while (!Done() && iterator_.Done()) { | 3550 while (!Done() && iterator_.Done()) { |
| 3531 iterator_ = ShallowIterator(iterator_.environment()->outer()); | 3551 iterator_ = ShallowIterator(iterator_.environment()->outer()); |
| 3532 } | 3552 } |
| 3533 } | 3553 } |
| 3534 | 3554 |
| 3535 ShallowIterator iterator_; | 3555 ShallowIterator iterator_; |
| 3536 }; | 3556 }; |
| 3537 | 3557 |
| 3538 // Construct an environment by constructing uses from an array of definitions. | 3558 // Construct an environment by constructing uses from an array of definitions. |
| 3539 static Environment* From(const GrowableArray<Definition*>& definitions, | 3559 static Environment* From(const GrowableArray<Definition*>& definitions, |
| 3540 intptr_t fixed_parameter_count, | 3560 intptr_t fixed_parameter_count, |
| 3541 const Environment* outer); | 3561 const Function& function); |
| 3542 | 3562 |
| 3543 void set_locations(Location* locations) { | 3563 void set_locations(Location* locations) { |
| 3544 ASSERT(locations_ == NULL); | 3564 ASSERT(locations_ == NULL); |
| 3545 locations_ = locations; | 3565 locations_ = locations; |
| 3546 } | 3566 } |
| 3547 | 3567 |
| 3548 void set_deopt_id(intptr_t deopt_id) { deopt_id_ = deopt_id; } | 3568 void set_deopt_id(intptr_t deopt_id) { deopt_id_ = deopt_id; } |
| 3549 intptr_t deopt_id() const { return deopt_id_; } | 3569 intptr_t deopt_id() const { return deopt_id_; } |
| 3550 | 3570 |
| 3551 Environment* outer() const { return outer_; } | 3571 Environment* outer() const { return outer_; } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 3576 index -= env->Length(); | 3596 index -= env->Length(); |
| 3577 env = env->outer_; | 3597 env = env->outer_; |
| 3578 } | 3598 } |
| 3579 return env->ValueAt(index); | 3599 return env->ValueAt(index); |
| 3580 } | 3600 } |
| 3581 | 3601 |
| 3582 intptr_t fixed_parameter_count() const { | 3602 intptr_t fixed_parameter_count() const { |
| 3583 return fixed_parameter_count_; | 3603 return fixed_parameter_count_; |
| 3584 } | 3604 } |
| 3585 | 3605 |
| 3606 const Function& function() const { return function_; } |
| 3607 |
| 3586 void DeepCopyTo(Instruction* instr) const; | 3608 void DeepCopyTo(Instruction* instr) const; |
| 3609 void DeepCopyToOuter(Instruction* instr) const; |
| 3587 | 3610 |
| 3588 void PrintTo(BufferFormatter* f) const; | 3611 void PrintTo(BufferFormatter* f) const; |
| 3589 | 3612 |
| 3590 private: | 3613 private: |
| 3591 friend class ShallowIterator; | 3614 friend class ShallowIterator; |
| 3592 | 3615 |
| 3593 Environment(intptr_t length, | 3616 Environment(intptr_t length, |
| 3594 intptr_t fixed_parameter_count, | 3617 intptr_t fixed_parameter_count, |
| 3595 intptr_t deopt_id, | 3618 intptr_t deopt_id, |
| 3619 const Function& function, |
| 3596 Environment* outer) | 3620 Environment* outer) |
| 3597 : values_(length), | 3621 : values_(length), |
| 3598 locations_(NULL), | 3622 locations_(NULL), |
| 3599 fixed_parameter_count_(fixed_parameter_count), | 3623 fixed_parameter_count_(fixed_parameter_count), |
| 3600 deopt_id_(deopt_id), | 3624 deopt_id_(deopt_id), |
| 3625 function_(function), |
| 3601 outer_(outer) { } | 3626 outer_(outer) { } |
| 3602 | 3627 |
| 3603 Environment* DeepCopy() const; | 3628 Environment* DeepCopy() const; |
| 3604 | 3629 |
| 3605 GrowableArray<Value*> values_; | 3630 GrowableArray<Value*> values_; |
| 3606 Location* locations_; | 3631 Location* locations_; |
| 3607 const intptr_t fixed_parameter_count_; | 3632 const intptr_t fixed_parameter_count_; |
| 3608 intptr_t deopt_id_; | 3633 intptr_t deopt_id_; |
| 3634 const Function& function_; |
| 3609 Environment* outer_; | 3635 Environment* outer_; |
| 3610 | 3636 |
| 3611 DISALLOW_COPY_AND_ASSIGN(Environment); | 3637 DISALLOW_COPY_AND_ASSIGN(Environment); |
| 3612 }; | 3638 }; |
| 3613 | 3639 |
| 3614 | 3640 |
| 3615 // Visitor base class to visit each instruction and computation in a flow | 3641 // Visitor base class to visit each instruction and computation in a flow |
| 3616 // graph as defined by a reversed list of basic blocks. | 3642 // graph as defined by a reversed list of basic blocks. |
| 3617 class FlowGraphVisitor : public ValueObject { | 3643 class FlowGraphVisitor : public ValueObject { |
| 3618 public: | 3644 public: |
| (...skipping 23 matching lines...) Expand all Loading... |
| 3642 ForwardInstructionIterator* current_iterator_; | 3668 ForwardInstructionIterator* current_iterator_; |
| 3643 | 3669 |
| 3644 private: | 3670 private: |
| 3645 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); | 3671 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); |
| 3646 }; | 3672 }; |
| 3647 | 3673 |
| 3648 | 3674 |
| 3649 } // namespace dart | 3675 } // namespace dart |
| 3650 | 3676 |
| 3651 #endif // VM_INTERMEDIATE_LANGUAGE_H_ | 3677 #endif // VM_INTERMEDIATE_LANGUAGE_H_ |
| OLD | NEW |