| Index: runtime/vm/code_descriptors.h
|
| diff --git a/runtime/vm/code_descriptors.h b/runtime/vm/code_descriptors.h
|
| index fa99412751584d18a508e63574c1be96f1e7e60e..d2faea285dbd8e28de593501d405c68887eff905 100644
|
| --- a/runtime/vm/code_descriptors.h
|
| +++ b/runtime/vm/code_descriptors.h
|
| @@ -42,27 +42,6 @@ class DescriptorList : public ZoneAllocated {
|
| };
|
|
|
|
|
| -class CodeSourceMapBuilder : public ZoneAllocated {
|
| - public:
|
| - explicit CodeSourceMapBuilder(intptr_t initial_capacity = 64)
|
| - : encoded_data_(initial_capacity), prev_pc_offset(0), prev_token_pos(0) {}
|
| -
|
| - ~CodeSourceMapBuilder() {}
|
| -
|
| - void AddEntry(intptr_t pc_offset, TokenPosition token_pos);
|
| -
|
| - RawCodeSourceMap* Finalize();
|
| -
|
| - private:
|
| - GrowableArray<uint8_t> encoded_data_;
|
| -
|
| - intptr_t prev_pc_offset;
|
| - intptr_t prev_token_pos;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(CodeSourceMapBuilder);
|
| -};
|
| -
|
| -
|
| class StackMapTableBuilder : public ZoneAllocated {
|
| public:
|
| StackMapTableBuilder()
|
| @@ -159,6 +138,102 @@ class ExceptionHandlerList : public ZoneAllocated {
|
| DISALLOW_COPY_AND_ASSIGN(ExceptionHandlerList);
|
| };
|
|
|
| +
|
| +class CodeSourceMapBuilder : public ZoneAllocated {
|
| + public:
|
| + CodeSourceMapBuilder(
|
| + const GrowableArray<intptr_t>& caller_inline_id,
|
| + const GrowableArray<TokenPosition>& inline_id_to_token_pos,
|
| + const GrowableArray<const Function*>& inline_id_to_function);
|
| +
|
| + // The position at which a function implicitly starts, for both the root and
|
| + // after a push bytecode. We use the classifying position kDartCodePrologue
|
| + // since it is the most common.
|
| + static const TokenPosition kInitialPosition;
|
| +
|
| + static const uint8_t kChangePosition = 0;
|
| + static const uint8_t kAdvancePC = 1;
|
| + static const uint8_t kPushFunction = 2;
|
| + static const uint8_t kPopFunction = 3;
|
| +
|
| + void StartInliningInterval(int32_t pc_offset, intptr_t inline_id);
|
| + void BeginCodeSourceRange(int32_t pc_offset);
|
| + void EndCodeSourceRange(int32_t pc_offset, TokenPosition pos);
|
| +
|
| + RawArray* InliningIdToFunction();
|
| + RawCodeSourceMap* Finalize();
|
| +
|
| + private:
|
| + void EmitPosition(TokenPosition pos) {
|
| + FlushPeephole();
|
| + stream_.Write<uint8_t>(kChangePosition);
|
| + stream_.Write<int32_t>(static_cast<int32_t>(pos.value()));
|
| + }
|
| + void EmitAdvancePC(int32_t distance) { advance_pc_peephole_ += distance; }
|
| + void FlushPeephole() {
|
| + if (advance_pc_peephole_ != 0) {
|
| + stream_.Write<uint8_t>(kAdvancePC);
|
| + stream_.Write<int32_t>(advance_pc_peephole_);
|
| + advance_pc_peephole_ = 0;
|
| + }
|
| + }
|
| + void EmitPush(intptr_t inline_id) {
|
| + FlushPeephole();
|
| + stream_.Write<uint8_t>(kPushFunction);
|
| + stream_.Write<int32_t>(inline_id);
|
| + }
|
| + void EmitPop() {
|
| + FlushPeephole();
|
| + stream_.Write<uint8_t>(kPopFunction);
|
| + }
|
| +
|
| + bool IsOnStack(intptr_t inline_id) {
|
| + for (intptr_t i = 0; i < inline_id_stack_.length(); i++) {
|
| + if (inline_id_stack_[i] == inline_id) {
|
| + return true;
|
| + }
|
| + }
|
| + return false;
|
| + }
|
| +
|
| + intptr_t pc_offset_;
|
| + intptr_t advance_pc_peephole_;
|
| + GrowableArray<intptr_t> inline_id_stack_;
|
| + GrowableArray<TokenPosition> token_pos_stack_;
|
| +
|
| + const GrowableArray<intptr_t>& caller_inline_id_;
|
| + const GrowableArray<TokenPosition>& inline_id_to_token_pos_;
|
| + const GrowableArray<const Function*>& inline_id_to_function_;
|
| +
|
| + uint8_t* buffer_;
|
| + WriteStream stream_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(CodeSourceMapBuilder);
|
| +};
|
| +
|
| +
|
| +class CodeSourceMapReader : public ValueObject {
|
| + public:
|
| + CodeSourceMapReader(const CodeSourceMap& map,
|
| + const Array& functions,
|
| + const Function& root)
|
| + : map_(map), functions_(functions), root_(root) {}
|
| +
|
| + void GetInlinedFunctionsAt(int32_t pc_offset,
|
| + GrowableArray<const Function*>* function_stack,
|
| + GrowableArray<TokenPosition>* token_positions);
|
| + NOT_IN_PRODUCT(void PrintJSONInlineIntervals(JSONObject* jsobj));
|
| + void DumpInlineIntervals(uword start);
|
| + void DumpSourcePositions(uword start);
|
| +
|
| + private:
|
| + const CodeSourceMap& map_;
|
| + const Array& functions_;
|
| + const Function& root_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(CodeSourceMapReader);
|
| +};
|
| +
|
| } // namespace dart
|
|
|
| #endif // RUNTIME_VM_CODE_DESCRIPTORS_H_
|
|
|