Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index 515eff3fb5428ff53ab0012fa51e38f379b4c109..a9ba0e716914fc5ff215efaf0dcdad43337c3dd8 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,57 @@ 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); |
+ } else 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); |
+ } else 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); |
+ } else { |
+ 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 +4701,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 +4711,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); |
} |