Index: src/parser.h |
diff --git a/src/parser.h b/src/parser.h |
index 2952581af92c7313c203e4fb67178045d644c963..56412a05a54e53f13a834f938c4999dfdad3e65c 100644 |
--- a/src/parser.h |
+++ b/src/parser.h |
@@ -72,14 +72,25 @@ class FunctionEntry BASE_EMBEDDED { |
backing_[kPropertyCountOffset] = value; |
} |
- int predata_skip() { return backing_[kPredataSkipOffset]; } |
- void set_predata_skip(int value) { |
- backing_[kPredataSkipOffset] = value; |
+ int predata_function_skip() { return backing_[kPredataFunctionSkipOffset]; } |
+ void set_predata_function_skip(int value) { |
+ backing_[kPredataFunctionSkipOffset] = value; |
} |
+ int predata_symbol_skip() { return backing_[kPredataSymbolSkipOffset]; } |
+ void set_predata_symbol_skip(int value) { |
+ backing_[kPredataSymbolSkipOffset] = value; |
+ } |
+ |
+ int symbol_id_skip() { return backing_[kSymbolIdSkipOffset]; } |
+ void set_symbol_id_skip(int value) { |
+ backing_[kSymbolIdSkipOffset] = value; |
+ } |
+ |
+ |
bool is_valid() { return backing_.length() > 0; } |
- static const int kSize = 5; |
+ static const int kSize = 7; |
private: |
Vector<unsigned> backing_; |
@@ -87,7 +98,9 @@ class FunctionEntry BASE_EMBEDDED { |
static const int kEndPosOffset = 1; |
static const int kLiteralCountOffset = 2; |
static const int kPropertyCountOffset = 3; |
- static const int kPredataSkipOffset = 4; |
+ static const int kPredataFunctionSkipOffset = 4; |
+ static const int kPredataSymbolSkipOffset = 5; |
+ static const int kSymbolIdSkipOffset = 6; |
}; |
@@ -95,12 +108,30 @@ class ScriptDataImpl : public ScriptData { |
public: |
explicit ScriptDataImpl(Vector<unsigned> store) |
: store_(store), |
- index_(kHeaderSize) { } |
+ function_index_(kHeaderSize), |
+ symbol_id_(0), |
+ owns_store_(true) { |
+ Initialize(); |
+ } |
+ |
+ void Initialize() { |
+ if (store_.length() >= kHeaderSize) { |
+ // Otherwise we won't satisfy the SanityCheck. |
+ symbol_index_ = kHeaderSize + store_[kFunctionsSizeOffset]; |
+ } |
+ } |
+ |
+ // Create an empty ScriptDataImpl that is guaranteed to not satisfy |
+ // a SanityCheck. |
+ ScriptDataImpl() : store_(Vector<unsigned>()), owns_store_(false) { } |
+ |
virtual ~ScriptDataImpl(); |
virtual int Length(); |
virtual const char* Data(); |
virtual bool HasError(); |
+ |
FunctionEntry GetFunctionEntry(int start); |
+ int GetSymbolIdentifier(int start); |
void SkipFunctionEntry(int start); |
bool SanityCheck(); |
@@ -108,36 +139,67 @@ class ScriptDataImpl : public ScriptData { |
const char* BuildMessage(); |
Vector<const char*> BuildArgs(); |
+ int symbol_count() { |
+ return (store_.length() > kHeaderSize) ? store_[kSymbolCountOffset] : 0; |
+ } |
+ // The following functions should only be called if SanityCheck has |
+ // returned true. |
bool has_error() { return store_[kHasErrorOffset]; } |
unsigned magic() { return store_[kMagicOffset]; } |
unsigned version() { return store_[kVersionOffset]; } |
+ |
// Skip forward in the preparser data by the given number |
// of unsigned ints. |
- virtual void Skip(int entries) { |
- ASSERT(entries >= 0); |
- ASSERT(entries <= store_.length() - index_); |
- index_ += entries; |
+ virtual void Skip(int function_entries, int symbol_entries, int symbol_ids) { |
+ ASSERT(function_entries >= 0); |
+ ASSERT(function_entries |
+ <= (static_cast<int>(store_[kFunctionsSizeOffset]) |
+ - (function_index_ - kHeaderSize))); |
+ function_index_ += function_entries; |
+ symbol_index_ += symbol_entries; |
+ symbol_id_ += symbol_ids; |
} |
static const unsigned kMagicNumber = 0xBadDead; |
- static const unsigned kCurrentVersion = 1; |
+ static const unsigned kCurrentVersion = 2; |
static const int kMagicOffset = 0; |
static const int kVersionOffset = 1; |
static const int kHasErrorOffset = 2; |
- static const int kSizeOffset = 3; |
- static const int kHeaderSize = 4; |
+ static const int kFunctionsSizeOffset = 3; |
+ static const int kSymbolCountOffset = 4; |
+ static const int kSizeOffset = 5; |
+ static const int kHeaderSize = 6; |
+ |
+ static const int kMessageStartPos = 0; |
+ static const int kMessageEndPos = 1; |
+ static const int kMessageArgCountPos = 2; |
+ static const int kMessageTextPos = 3; |
private: |
Vector<unsigned> store_; |
- int index_; |
+ int function_index_; |
+ int symbol_index_; |
+ int symbol_id_; |
+ bool owns_store_; |
unsigned Read(int position); |
unsigned* ReadAddress(int position); |
- void FindStart(int position); |
+ ScriptDataImpl(const char* backing_store, int length) |
+ : store_(reinterpret_cast<unsigned*>(const_cast<char*>(backing_store)), |
+ length / sizeof(unsigned)), |
+ function_index_(kHeaderSize), |
+ symbol_id_(0), |
+ owns_store_(false) { |
+ ASSERT_EQ(0, reinterpret_cast<intptr_t>(backing_store) % sizeof(unsigned)); |
+ Initialize(); |
+ } |
+ |
// Read strings written by ParserRecorder::WriteString. |
static const char* ReadString(unsigned* start, int* chars); |
+ |
+ friend class ScriptData; |
}; |