| Index: runtime/vm/object.h
|
| ===================================================================
|
| --- runtime/vm/object.h (revision 38030)
|
| +++ runtime/vm/object.h (working copy)
|
| @@ -2985,50 +2985,15 @@
|
|
|
| class PcDescriptors : public Object {
|
| public:
|
| - enum Kind {
|
| - kDeopt, // Deoptimization continuation point.
|
| - kIcCall, // IC call.
|
| - kOptStaticCall, // Call directly to known target, e.g. static call.
|
| - kUnoptStaticCall, // Call to a known target via a stub.
|
| - kClosureCall, // Closure call.
|
| - kRuntimeCall, // Runtime call.
|
| - kOsrEntry, // OSR entry point in unoptimized code.
|
| - kOther
|
| - };
|
| -
|
| - intptr_t Length() const;
|
| -
|
| - uword PC(intptr_t index) const {
|
| - ASSERT(index < Length());
|
| - return raw_ptr()->data()[index].pc;
|
| - }
|
| - PcDescriptors::Kind DescriptorKind(intptr_t index) const {
|
| - ASSERT(index < Length());
|
| - return static_cast<PcDescriptors::Kind>(raw_ptr()->data()[index].kind);
|
| - }
|
| - intptr_t DeoptId(intptr_t index) const {
|
| - ASSERT(index < Length());
|
| - return raw_ptr()->data()[index].deopt_id;
|
| - }
|
| - intptr_t TokenPos(intptr_t index) const {
|
| - ASSERT(index < Length());
|
| - return raw_ptr()->data()[index].token_pos;
|
| - }
|
| - intptr_t TryIndex(intptr_t index) const {
|
| - ASSERT(index < Length());
|
| - return raw_ptr()->data()[index].try_index;
|
| - }
|
| - const char* KindAsStr(intptr_t index) const;
|
| -
|
| void AddDescriptor(intptr_t index,
|
| uword pc,
|
| - PcDescriptors::Kind kind,
|
| + RawPcDescriptors::Kind kind,
|
| int64_t deopt_id,
|
| int64_t token_pos, // Or deopt reason.
|
| intptr_t try_index) const { // Or deopt index.
|
| - RawPcDescriptors::PcDescriptorRec* rec = &raw_ptr()->data()[index];
|
| + RawPcDescriptors::PcDescriptorRec* rec = recAt(index);
|
| rec->pc = pc;
|
| - rec->kind = kind;
|
| + rec->kind_ = kind;
|
| ASSERT(Utils::IsInt(32, deopt_id));
|
| rec->deopt_id = deopt_id;
|
| ASSERT(Utils::IsInt(32, token_pos));
|
| @@ -3055,7 +3020,7 @@
|
| static RawPcDescriptors* New(intptr_t num_descriptors);
|
|
|
| // Returns 0 if not found.
|
| - uword GetPcForKind(Kind kind) const;
|
| + uword GetPcForKind(RawPcDescriptors::Kind kind) const;
|
|
|
| // Verify (assert) assumptions about pc descriptors in debug mode.
|
| void Verify(const Function& function) const;
|
| @@ -3067,7 +3032,36 @@
|
| // We would have a VisitPointers function here to traverse the
|
| // pc descriptors table to visit objects if any in the table.
|
|
|
| + class Iterator : public ValueObject {
|
| + public:
|
| + explicit Iterator(const PcDescriptors& descriptors)
|
| + : descriptors_(descriptors), current_ix_(0) {}
|
| +
|
| + // For nested iterations, starting at element after.
|
| + explicit Iterator(const Iterator& iter)
|
| + : descriptors_(iter.descriptors_), current_ix_(iter.current_ix_) {}
|
| +
|
| + bool HasNext() { return current_ix_ < descriptors_.Length(); }
|
| +
|
| + const RawPcDescriptors::PcDescriptorRec& Next() {
|
| + ASSERT(HasNext());
|
| + return *descriptors_.recAt(current_ix_++);
|
| + }
|
| +
|
| + private:
|
| + const PcDescriptors& descriptors_;
|
| + intptr_t current_ix_;
|
| + };
|
| +
|
| private:
|
| + static const char* KindAsStr(RawPcDescriptors::Kind kind);
|
| +
|
| + intptr_t Length() const;
|
| +
|
| + RawPcDescriptors::PcDescriptorRec* recAt(intptr_t ix) const {
|
| + ASSERT(ix < Length());
|
| + return &raw_ptr()->data()[ix];
|
| + }
|
| void SetLength(intptr_t value) const;
|
|
|
| FINAL_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors, Object);
|
| @@ -3684,7 +3678,7 @@
|
| uword GetLazyDeoptPc() const;
|
|
|
| // Find pc, return 0 if not found.
|
| - uword GetPcForDeoptId(intptr_t deopt_id, PcDescriptors::Kind kind) const;
|
| + uword GetPcForDeoptId(intptr_t deopt_id, RawPcDescriptors::Kind kind) const;
|
| intptr_t GetDeoptIdForOsr(uword pc) const;
|
|
|
| // Returns true if there is an object in the code between 'start_offset'
|
|
|