Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(680)

Unified Diff: src/parser.cc

Issue 5063003: Add separate scanner only intended for preparsing. (Closed)
Patch Set: Address review comments. Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/prescanner.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« no previous file with comments | « no previous file | src/prescanner.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698