Chromium Code Reviews| Index: src/parser.cc |
| diff --git a/src/parser.cc b/src/parser.cc |
| index 515eff3fb5428ff53ab0012fa51e38f379b4c109..771906e0851570690ab8ae64f12140819a1b6286 100644 |
| --- a/src/parser.cc |
| +++ b/src/parser.cc |
| @@ -37,6 +37,7 @@ |
| #include "parser.h" |
| #include "platform.h" |
| #include "preparser.h" |
| +#include "prescanner.h" |
| #include "runtime.h" |
| #include "scopeinfo.h" |
| #include "string-stream.h" |
| @@ -4637,6 +4638,58 @@ int ScriptDataImpl::ReadNumber(byte** source) { |
| } |
| +static ScriptDataImpl* DoPreParse(UTF16Buffer* stream, |
| + bool allow_lazy, |
| + PartialParserRecorder* recorder) { |
| + typedef preparser::Scanner<UTF16Buffer, UTF8Buffer> PreScanner; |
| + PreScanner scanner; |
| + scanner.Initialize(stream); |
| + preparser::PreParser<PreScanner, PartialParserRecorder> preparser; |
| + if (!preparser.PreParseProgram(&scanner, recorder, allow_lazy)) { |
| + Top::StackOverflow(); |
| + return NULL; |
| + } |
| + |
| + // Extract the accumulated data from the recorder as a single |
| + // contiguous vector that we are responsible for disposing. |
| + Vector<unsigned> store = recorder->ExtractData(); |
| + return new ScriptDataImpl(store); |
| +} |
| + |
| + |
| +// Create an UTF16Buffer for the preparser to use as input, |
| +// and preparse the source. |
| +static ScriptDataImpl* DoPreParse(Handle<String> source, |
| + unibrow::CharacterStream* stream, |
| + bool allow_lazy, |
| + PartialParserRecorder* recorder) { |
| + if (source.is_null()) { |
| + CharacterStreamUTF16Buffer buffer; |
| + int length = stream->Length(); |
| + buffer.Initialize(source, stream, 0, length); |
| + return DoPreParse(&buffer, allow_lazy, recorder); |
| + } |
|
Søren Thygesen Gjesse
2010/11/17 10:37:46
How about using
if ... else if ... else if ... el
Lasse Reichstein
2010/11/17 13:08:39
Done.
|
| + if (source->IsExternalAsciiString()) { |
| + ExternalStringUTF16Buffer<ExternalAsciiString, char> buffer; |
| + int length = source->length(); |
| + buffer.Initialize(Handle<ExternalAsciiString>::cast(source), 0, length); |
| + return DoPreParse(&buffer, allow_lazy, recorder); |
| + } |
| + if (source->IsExternalTwoByteString()) { |
| + ExternalStringUTF16Buffer<ExternalTwoByteString, uint16_t> buffer; |
| + int length = source->length(); |
| + buffer.Initialize(Handle<ExternalTwoByteString>::cast(source), 0, length); |
| + return DoPreParse(&buffer, allow_lazy, recorder); |
| + } |
| + CharacterStreamUTF16Buffer buffer; |
| + SafeStringInputBuffer input; |
| + input.Reset(0, source.location()); |
| + int length = source->length(); |
| + buffer.Initialize(source, &input, 0, length); |
| + return DoPreParse(&buffer, allow_lazy, recorder); |
| +} |
| + |
| + |
| // Preparse, but only collect data that is immediately useful, |
| // even if the preparser data is only used once. |
| ScriptDataImpl* ParserApi::PartialPreParse(Handle<String> source, |
| @@ -4649,19 +4702,9 @@ ScriptDataImpl* ParserApi::PartialPreParse(Handle<String> source, |
| // If we don't allow lazy compilation, the log data will be empty. |
| return NULL; |
| } |
| - preparser::PreParser<Scanner, PartialParserRecorder> parser; |
| - Scanner scanner; |
| - scanner.Initialize(source, stream, JAVASCRIPT); |
| PartialParserRecorder recorder; |
| - if (!parser.PreParseProgram(&scanner, &recorder, allow_lazy)) { |
| - Top::StackOverflow(); |
| - return NULL; |
| - } |
| - // Extract the accumulated data from the recorder as a single |
| - // contiguous vector that we are responsible for disposing. |
| - Vector<unsigned> store = recorder.ExtractData(); |
| - return new ScriptDataImpl(store); |
| + return DoPreParse(source, stream, allow_lazy, &recorder); |
| } |
| @@ -4669,19 +4712,9 @@ ScriptDataImpl* ParserApi::PreParse(Handle<String> source, |
| unibrow::CharacterStream* stream, |
| v8::Extension* extension) { |
| Handle<Script> no_script; |
| - preparser::PreParser<Scanner, CompleteParserRecorder> parser; |
| - Scanner scanner; |
| - scanner.Initialize(source, stream, JAVASCRIPT); |
| bool allow_lazy = FLAG_lazy && (extension == NULL); |
| CompleteParserRecorder recorder; |
| - if (!parser.PreParseProgram(&scanner, &recorder, allow_lazy)) { |
| - Top::StackOverflow(); |
| - return NULL; |
| - } |
| - // Extract the accumulated data from the recorder as a single |
| - // contiguous vector that we are responsible for disposing. |
| - Vector<unsigned> store = recorder.ExtractData(); |
| - return new ScriptDataImpl(store); |
| + return DoPreParse(source, stream, allow_lazy, &recorder); |
| } |