Chromium Code Reviews| Index: src/parser.cc |
| diff --git a/src/parser.cc b/src/parser.cc |
| index d305528015791287e6b2b825555a52076ab7e90c..f8292d0c450e7dabf82224694eed7e36f2d9d398 100644 |
| --- a/src/parser.cc |
| +++ b/src/parser.cc |
| @@ -909,12 +909,16 @@ class ParserRecorder: public ParserLog { |
| virtual void LogMessage(Scanner::Location loc, |
| const char* message, |
| Vector<const char*> args); |
| - void WriteString(Vector<const char> str); |
| - static const char* ReadString(unsigned* start, int* chars); |
| - List<unsigned>* store() { return &store_; } |
| + Vector<unsigned> ExtractData() { |
| + return store_.ToVector(); |
| + } |
| private: |
| bool has_error_; |
| - List<unsigned> store_; |
| + Collector<unsigned> store_; |
| + Vector<unsigned> preamble_; |
| + |
| + Collector<unsigned>* store() { return &store_; } |
| + void WriteString(Vector<const char> str); |
| }; |
| @@ -936,12 +940,11 @@ FunctionEntry ScriptDataImpl::GetFunctionEnd(int start) { |
| bool ScriptDataImpl::SanityCheck() { |
| - if (store_.length() < static_cast<int>(ScriptDataImpl::kHeaderSize)) |
| - return false; |
| - if (magic() != ScriptDataImpl::kMagicNumber) |
| - return false; |
| - if (version() != ScriptDataImpl::kCurrentVersion) |
| + if (store_.length() < static_cast<int>(ScriptDataImpl::kHeaderSize)) { |
| return false; |
| + } |
| + if (magic() != ScriptDataImpl::kMagicNumber) return false; |
| + if (version() != ScriptDataImpl::kCurrentVersion) return false; |
| return true; |
| } |
| @@ -959,26 +962,28 @@ FunctionEntry ScriptDataImpl::nth(int n) { |
| ParserRecorder::ParserRecorder() |
| - : has_error_(false), store_(4) { |
| - Vector<unsigned> preamble = store()->AddBlock(0, ScriptDataImpl::kHeaderSize); |
| - preamble[ScriptDataImpl::kMagicOffset] = ScriptDataImpl::kMagicNumber; |
| - preamble[ScriptDataImpl::kVersionOffset] = ScriptDataImpl::kCurrentVersion; |
| - preamble[ScriptDataImpl::kHasErrorOffset] = false; |
| + : has_error_(false), store_(ScriptDataImpl::kHeaderSize) { |
|
Mads Ager (chromium)
2010/08/24 14:25:54
Four space indent.
|
| + preamble_ = store()->AddBlock(ScriptDataImpl::kHeaderSize, 0); |
| + preamble_[ScriptDataImpl::kMagicOffset] = ScriptDataImpl::kMagicNumber; |
| + preamble_[ScriptDataImpl::kVersionOffset] = ScriptDataImpl::kCurrentVersion; |
| + preamble_[ScriptDataImpl::kHasErrorOffset] = false; |
| } |
| void ParserRecorder::WriteString(Vector<const char> str) { |
| store()->Add(str.length()); |
| - for (int i = 0; i < str.length(); i++) |
| + for (int i = 0; i < str.length(); i++) { |
| store()->Add(str[i]); |
| + } |
| } |
| -const char* ParserRecorder::ReadString(unsigned* start, int* chars) { |
| +const char* ScriptDataImpl::ReadString(unsigned* start, int* chars) { |
| int length = start[0]; |
| char* result = NewArray<char>(length + 1); |
| - for (int i = 0; i < length; i++) |
| + for (int i = 0; i < length; i++) { |
| result[i] = start[i + 1]; |
| + } |
| result[length] = '\0'; |
| if (chars != NULL) *chars = length; |
| return result; |
| @@ -988,14 +993,18 @@ const char* ParserRecorder::ReadString(unsigned* start, int* chars) { |
| void ParserRecorder::LogMessage(Scanner::Location loc, const char* message, |
| Vector<const char*> args) { |
| if (has_error_) return; |
| - store()->Rewind(ScriptDataImpl::kHeaderSize); |
| - store()->at(ScriptDataImpl::kHasErrorOffset) = true; |
| + store()->Reset(); |
| + preamble_ = store()->AddBlock(ScriptDataImpl::kHeaderSize, 0); |
| + preamble_[ScriptDataImpl::kMagicOffset] = ScriptDataImpl::kMagicNumber; |
| + preamble_[ScriptDataImpl::kVersionOffset] = ScriptDataImpl::kCurrentVersion; |
| + preamble_[ScriptDataImpl::kHasErrorOffset] = true; |
| store()->Add(loc.beg_pos); |
| store()->Add(loc.end_pos); |
| store()->Add(args.length()); |
| WriteString(CStrVector(message)); |
| - for (int i = 0; i < args.length(); i++) |
| + for (int i = 0; i < args.length(); i++) { |
| WriteString(CStrVector(args[i])); |
| + } |
| } |
| @@ -1008,7 +1017,7 @@ Scanner::Location ScriptDataImpl::MessageLocation() { |
| const char* ScriptDataImpl::BuildMessage() { |
| unsigned* start = ReadAddress(3); |
| - return ParserRecorder::ReadString(start, NULL); |
| + return ReadString(start, NULL); |
| } |
| @@ -1018,7 +1027,7 @@ Vector<const char*> ScriptDataImpl::BuildArgs() { |
| int pos = ScriptDataImpl::kHeaderSize + Read(3); |
| for (int i = 0; i < arg_count; i++) { |
| int count = 0; |
| - array[i] = ParserRecorder::ReadString(ReadAddress(pos), &count); |
| + array[i] = ReadString(ReadAddress(pos), &count); |
| pos += count + 1; |
| } |
| return Vector<const char*>(array, arg_count); |
| @@ -1037,7 +1046,7 @@ unsigned* ScriptDataImpl::ReadAddress(int position) { |
| FunctionEntry ParserRecorder::LogFunction(int start) { |
| if (has_error_) return FunctionEntry(); |
| - FunctionEntry result(store()->AddBlock(0, FunctionEntry::kSize)); |
| + FunctionEntry result(store()->AddBlock(FunctionEntry::kSize, 0)); |
| result.set_start_pos(start); |
| return result; |
| } |
| @@ -5233,10 +5242,9 @@ ScriptDataImpl* PreParse(Handle<String> source, |
| Bootstrapper::IsActive(); |
| PreParser parser(no_script, allow_natives_syntax, extension); |
| if (!parser.PreParseProgram(source, stream)) return NULL; |
| - // The list owns the backing store so we need to clone the vector. |
| - // That way, the result will be exactly the right size rather than |
| - // the expected 50% too large. |
| - Vector<unsigned> store = parser.recorder()->store()->ToVector().Clone(); |
| + // Extract the accumulated data from the recorder as a single |
| + // contiguous vector that we are responsible for disposing. |
| + Vector<unsigned> store = parser.recorder()->ExtractData(); |
| return new ScriptDataImpl(store); |
| } |