blob: 3ac58d621787939383f8d442f241138e06df05a5 [file] [log] [blame]
// Copyright 2016 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_INTERPRETER_SOURCE_POSITION_TABLE_H_
#define V8_INTERPRETER_SOURCE_POSITION_TABLE_H_
#include "src/assert-scope.h"
#include "src/checks.h"
#include "src/handles.h"
#include "src/log.h"
#include "src/zone-containers.h"
namespace v8 {
namespace internal {
class BytecodeArray;
class ByteArray;
class Isolate;
class Zone;
namespace interpreter {
struct PositionTableEntry {
PositionTableEntry()
: bytecode_offset(0), source_position(0), is_statement(false) {}
PositionTableEntry(int bytecode, int source, bool statement)
: bytecode_offset(bytecode),
source_position(source),
is_statement(statement) {}
int bytecode_offset;
int source_position;
bool is_statement;
};
class SourcePositionTableBuilder : public PositionsRecorder {
public:
SourcePositionTableBuilder(Isolate* isolate, Zone* zone)
: isolate_(isolate),
bytes_(zone),
#ifdef ENABLE_SLOW_DCHECKS
raw_entries_(zone),
#endif
candidate_(kUninitializedCandidateOffset, 0, false) {
}
void AddStatementPosition(size_t bytecode_offset, int source_position);
void AddExpressionPosition(size_t bytecode_offset, int source_position);
Handle<ByteArray> ToSourcePositionTable();
private:
static const int kUninitializedCandidateOffset = -1;
void AddEntry(const PositionTableEntry& entry);
void CommitEntry();
Isolate* isolate_;
ZoneVector<byte> bytes_;
#ifdef ENABLE_SLOW_DCHECKS
ZoneVector<PositionTableEntry> raw_entries_;
#endif
PositionTableEntry candidate_; // Next entry to be written, if initialized.
PositionTableEntry previous_; // Previously written entry, to compute delta.
};
class SourcePositionTableIterator {
public:
explicit SourcePositionTableIterator(ByteArray* byte_array);
void Advance();
int bytecode_offset() const {
DCHECK(!done());
return current_.bytecode_offset;
}
int source_position() const {
DCHECK(!done());
return current_.source_position;
}
bool is_statement() const {
DCHECK(!done());
return current_.is_statement;
}
bool done() const { return index_ == kDone; }
private:
static const int kDone = -1;
ByteArray* table_;
int index_;
PositionTableEntry current_;
DisallowHeapAllocation no_gc;
};
} // namespace interpreter
} // namespace internal
} // namespace v8
#endif // V8_INTERPRETER_SOURCE_POSITION_TABLE_H_