2016-02-04 10:50:01 +00:00
|
|
|
// 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/handles.h"
|
2016-02-24 13:32:06 +00:00
|
|
|
#include "src/zone.h"
|
2016-02-04 10:50:01 +00:00
|
|
|
#include "src/zone-containers.h"
|
|
|
|
|
|
|
|
namespace v8 {
|
|
|
|
namespace internal {
|
|
|
|
|
|
|
|
class BytecodeArray;
|
2016-02-24 13:32:06 +00:00
|
|
|
class FixedArray;
|
2016-02-04 10:50:01 +00:00
|
|
|
class Isolate;
|
|
|
|
|
|
|
|
namespace interpreter {
|
|
|
|
|
|
|
|
class SourcePositionTableBuilder {
|
|
|
|
public:
|
|
|
|
explicit SourcePositionTableBuilder(Isolate* isolate, Zone* zone)
|
2016-02-24 13:32:06 +00:00
|
|
|
: isolate_(isolate), entries_(zone) {}
|
2016-02-04 10:50:01 +00:00
|
|
|
|
2016-02-05 13:29:03 +00:00
|
|
|
void AddStatementPosition(size_t bytecode_offset, int source_position);
|
|
|
|
void AddExpressionPosition(size_t bytecode_offset, int source_position);
|
2016-02-24 13:32:06 +00:00
|
|
|
void RevertPosition(size_t bytecode_offset);
|
|
|
|
Handle<FixedArray> ToFixedArray();
|
2016-02-04 10:50:01 +00:00
|
|
|
|
|
|
|
private:
|
2016-02-24 13:32:06 +00:00
|
|
|
struct Entry {
|
|
|
|
int bytecode_offset;
|
|
|
|
uint32_t source_position_and_type;
|
|
|
|
};
|
|
|
|
|
|
|
|
bool CodeOffsetHasPosition(int bytecode_offset) {
|
|
|
|
// Return whether bytecode offset already has a position assigned.
|
|
|
|
return entries_.size() > 0 &&
|
|
|
|
entries_.back().bytecode_offset == bytecode_offset;
|
|
|
|
}
|
2016-02-04 10:50:01 +00:00
|
|
|
|
|
|
|
Isolate* isolate_;
|
2016-02-24 13:32:06 +00:00
|
|
|
ZoneVector<Entry> entries_;
|
2016-02-04 10:50:01 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class SourcePositionTableIterator {
|
|
|
|
public:
|
2016-02-24 13:32:06 +00:00
|
|
|
explicit SourcePositionTableIterator(BytecodeArray* bytecode_array);
|
2016-02-04 10:50:01 +00:00
|
|
|
|
|
|
|
void Advance();
|
|
|
|
|
|
|
|
int bytecode_offset() const {
|
|
|
|
DCHECK(!done());
|
2016-02-24 13:32:06 +00:00
|
|
|
return bytecode_offset_;
|
2016-02-04 10:50:01 +00:00
|
|
|
}
|
|
|
|
int source_position() const {
|
|
|
|
DCHECK(!done());
|
2016-02-24 13:32:06 +00:00
|
|
|
return source_position_;
|
2016-02-04 10:50:01 +00:00
|
|
|
}
|
|
|
|
bool is_statement() const {
|
|
|
|
DCHECK(!done());
|
2016-02-24 13:32:06 +00:00
|
|
|
return is_statement_;
|
2016-02-04 10:50:01 +00:00
|
|
|
}
|
2016-02-24 13:32:06 +00:00
|
|
|
bool done() const { return index_ > length_; }
|
2016-02-04 10:50:01 +00:00
|
|
|
|
|
|
|
private:
|
2016-02-24 13:32:06 +00:00
|
|
|
FixedArray* table_;
|
2016-02-04 10:50:01 +00:00
|
|
|
int index_;
|
2016-02-24 13:32:06 +00:00
|
|
|
int length_;
|
|
|
|
bool is_statement_;
|
|
|
|
int bytecode_offset_;
|
|
|
|
int source_position_;
|
2016-02-04 10:50:01 +00:00
|
|
|
DisallowHeapAllocation no_gc;
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace interpreter
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace v8
|
|
|
|
|
|
|
|
#endif // V8_INTERPRETER_SOURCE_POSITION_TABLE_H_
|