Index: src/parser.h |
diff --git a/src/parser.h b/src/parser.h |
index ac276645a1dce197b1c7470d1535a726c01b97a8..1537e5d69dfa132e625ffdb070d40f81cd79560e 100644 |
--- a/src/parser.h |
+++ b/src/parser.h |
@@ -59,73 +59,39 @@ class FunctionEntry BASE_EMBEDDED { |
}; |
-class ScriptData { |
+// Wrapper around ScriptData to provide parser-specific functionality. |
+class ParseData { |
public: |
- explicit ScriptData(Vector<unsigned> store) |
- : store_(store), |
- owns_store_(true) { } |
- |
- ScriptData(Vector<unsigned> store, bool owns_store) |
- : store_(store), |
- owns_store_(owns_store) { } |
- |
- // The created ScriptData won't take ownership of the data. If the alignment |
- // is not correct, this will copy the data (and the created ScriptData will |
- // take ownership of the copy). |
- static ScriptData* New(const char* data, int length, bool owns_store = false); |
- |
- virtual ~ScriptData(); |
- virtual int Length(); |
- virtual const char* Data(); |
- virtual bool HasError(); |
- |
+ explicit ParseData(ScriptData* script_data) : script_data_(script_data) { |
+ CHECK(IsAligned(script_data->length(), sizeof(unsigned))); |
+ CHECK(IsSane()); |
+ } |
void Initialize(); |
- void ReadNextSymbolPosition(); |
- |
FunctionEntry GetFunctionEntry(int start); |
- int GetSymbolIdentifier(); |
- bool SanityCheck(); |
- |
- Scanner::Location MessageLocation() const; |
- bool IsReferenceError() const; |
- const char* BuildMessage() const; |
- const char* BuildArg() const; |
- |
- int function_count() { |
- int functions_size = |
- static_cast<int>(store_[PreparseDataConstants::kFunctionsSizeOffset]); |
- if (functions_size < 0) return 0; |
- if (functions_size % FunctionEntry::kSize != 0) return 0; |
- return functions_size / FunctionEntry::kSize; |
+ int FunctionCount(); |
+ |
+ bool HasError(); |
+ |
+ unsigned* Data() { // Writable data as unsigned int array. |
+ return reinterpret_cast<unsigned*>(const_cast<byte*>(script_data_->data())); |
} |
- // The following functions should only be called if SanityCheck has |
- // returned true. |
- bool has_error() { return store_[PreparseDataConstants::kHasErrorOffset]; } |
- unsigned magic() { return store_[PreparseDataConstants::kMagicOffset]; } |
- unsigned version() { return store_[PreparseDataConstants::kVersionOffset]; } |
private: |
- // Disable copying and assigning; because of owns_store they won't be correct. |
- ScriptData(const ScriptData&); |
- ScriptData& operator=(const ScriptData&); |
- |
- friend class v8::ScriptCompiler; |
- Vector<unsigned> store_; |
- unsigned char* symbol_data_; |
- unsigned char* symbol_data_end_; |
- int function_index_; |
- bool owns_store_; |
+ bool IsSane(); |
+ unsigned Magic(); |
+ unsigned Version(); |
+ int FunctionsSize(); |
+ int Length() const { |
+ // Script data length is already checked to be a multiple of unsigned size. |
+ return script_data_->length() / sizeof(unsigned); |
+ } |
- unsigned Read(int position) const; |
- unsigned* ReadAddress(int position) const; |
- // Reads a number from the current symbols |
- int ReadNumber(byte** source); |
+ ScriptData* script_data_; |
+ int function_index_; |
- // Read strings written by ParserRecorder::WriteString. |
- static const char* ReadString(unsigned* start, int* chars); |
+ DISALLOW_COPY_AND_ASSIGN(ParseData); |
}; |
- |
// ---------------------------------------------------------------------------- |
// REGEXP PARSING |
@@ -646,23 +612,10 @@ class Parser : public ParserBase<ParserTraits> { |
FunctionLiteral* DoParseProgram(CompilationInfo* info, |
Handle<String> source); |
- // Report syntax error |
- void ReportInvalidCachedData(const AstRawString* name, bool* ok); |
- |
- void SetCachedData(ScriptData** data, |
- CachedDataMode cached_data_mode) { |
- cached_data_mode_ = cached_data_mode; |
- if (cached_data_mode == NO_CACHED_DATA) { |
- cached_data_ = NULL; |
- } else { |
- ASSERT(data != NULL); |
- cached_data_ = data; |
- } |
- } |
+ void SetCachedData(); |
bool inside_with() const { return scope_->inside_with(); } |
- ScriptData** cached_data() const { return cached_data_; } |
- CachedDataMode cached_data_mode() const { return cached_data_mode_; } |
+ CachedDataMode cached_data_mode() const { return info_->cached_data_mode(); } |
Scope* DeclarationScope(VariableMode mode) { |
return IsLexicalVariableMode(mode) |
? scope_ : scope_->DeclarationScope(); |
@@ -809,7 +762,7 @@ class Parser : public ParserBase<ParserTraits> { |
PreParser* reusable_preparser_; |
Scope* original_scope_; // for ES5 function declarations in sloppy eval |
Target* target_stack_; // for break, continue statements |
- ScriptData** cached_data_; |
+ ParseData* cached_parse_data_; |
CachedDataMode cached_data_mode_; |
AstValueFactory* ast_value_factory_; |