Home | History | Annotate | Download | only in src
      1 // Copyright 2016 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef V8_SOURCE_POSITION_TABLE_H_
      6 #define V8_SOURCE_POSITION_TABLE_H_
      7 
      8 #include "src/assert-scope.h"
      9 #include "src/checks.h"
     10 #include "src/globals.h"
     11 #include "src/source-position.h"
     12 #include "src/zone/zone-containers.h"
     13 
     14 namespace v8 {
     15 namespace internal {
     16 
     17 class AbstractCode;
     18 class BytecodeArray;
     19 class ByteArray;
     20 template <typename T>
     21 class Handle;
     22 class Isolate;
     23 class Zone;
     24 
     25 struct PositionTableEntry {
     26   PositionTableEntry()
     27       : code_offset(0), source_position(0), is_statement(false) {}
     28   PositionTableEntry(int offset, int64_t source, bool statement)
     29       : code_offset(offset), source_position(source), is_statement(statement) {}
     30 
     31   int code_offset;
     32   int64_t source_position;
     33   bool is_statement;
     34 };
     35 
     36 class V8_EXPORT_PRIVATE SourcePositionTableBuilder {
     37  public:
     38   enum RecordingMode { OMIT_SOURCE_POSITIONS, RECORD_SOURCE_POSITIONS };
     39 
     40   SourcePositionTableBuilder(Zone* zone,
     41                              RecordingMode mode = RECORD_SOURCE_POSITIONS);
     42 
     43   void AddPosition(size_t code_offset, SourcePosition source_position,
     44                    bool is_statement);
     45 
     46   Handle<ByteArray> ToSourcePositionTable(Isolate* isolate,
     47                                           Handle<AbstractCode> code);
     48 
     49  private:
     50   void AddEntry(const PositionTableEntry& entry);
     51 
     52   inline bool Omit() const { return mode_ == OMIT_SOURCE_POSITIONS; }
     53 
     54   RecordingMode mode_;
     55   ZoneVector<byte> bytes_;
     56 #ifdef ENABLE_SLOW_DCHECKS
     57   ZoneVector<PositionTableEntry> raw_entries_;
     58 #endif
     59   PositionTableEntry previous_;  // Previously written entry, to compute delta.
     60 };
     61 
     62 class V8_EXPORT_PRIVATE SourcePositionTableIterator {
     63  public:
     64   explicit SourcePositionTableIterator(ByteArray* byte_array);
     65 
     66   void Advance();
     67 
     68   int code_offset() const {
     69     DCHECK(!done());
     70     return current_.code_offset;
     71   }
     72   SourcePosition source_position() const {
     73     DCHECK(!done());
     74     return SourcePosition::FromRaw(current_.source_position);
     75   }
     76   bool is_statement() const {
     77     DCHECK(!done());
     78     return current_.is_statement;
     79   }
     80   bool done() const { return index_ == kDone; }
     81 
     82  private:
     83   static const int kDone = -1;
     84 
     85   ByteArray* table_;
     86   int index_;
     87   PositionTableEntry current_;
     88   DisallowHeapAllocation no_gc;
     89 };
     90 
     91 }  // namespace internal
     92 }  // namespace v8
     93 
     94 #endif  // V8_SOURCE_POSITION_TABLE_H_
     95