Chromium Code Reviews| Index: src/parser.cc |
| diff --git a/src/parser.cc b/src/parser.cc |
| index d0e01fc371521e28b744cae920a07387912aa3f0..cdf4c5fcc27a4cc9ea6367f5b15fa130c91474a4 100644 |
| --- a/src/parser.cc |
| +++ b/src/parser.cc |
| @@ -224,6 +224,34 @@ Handle<String> Parser::LookupCachedSymbol(int symbol_id) { |
| } |
| +ScriptDataImpl::ScriptDataImpl(const char* data, int length) |
| + : owns_store_(false) { |
| + // The length is obviously invalid. |
| + if (length % sizeof(unsigned) != 0) { |
|
Sven Panne
2014/04/07 12:44:44
Why do we silently return here? Wouldn't an ASSERT
marja
2014/04/09 12:53:55
This data is coming in via the API, maybe the orig
Sven Panne
2014/04/11 08:18:22
I think that silently (not) doing something is qui
|
| + return; |
| + } |
| + |
| + // Copy the data to ensure it is properly aligned. |
|
Sven Panne
2014/04/07 12:44:44
This comment doesn't really belong here.
marja
2014/04/09 12:53:55
Done.
|
| + int deserialized_data_length = length / sizeof(unsigned); |
| + // If aligned, don't create a copy of the data. |
| + if (reinterpret_cast<intptr_t>(data) % sizeof(unsigned) == 0) { |
|
Sven Panne
2014/04/07 12:44:44
I think restructuring this function makes things c
marja
2014/04/09 12:53:55
Done.
|
| + store_ = |
| + Vector<unsigned>(reinterpret_cast<unsigned*>(const_cast<char*>(data)), |
| + length / static_cast<int>(sizeof(unsigned))); |
| + return; |
| + } |
| + |
| + // Copy the data to align it. |
| + unsigned* deserialized_data = i::NewArray<unsigned>(deserialized_data_length); |
| + i::CopyBytes(reinterpret_cast<char*>(deserialized_data), |
| + data, static_cast<size_t>(length)); |
| + |
| + // ScriptDataImpl will own the buffer. |
| + store_ = i::Vector<unsigned>(deserialized_data, deserialized_data_length); |
| + owns_store_ = true; |
| +} |
| + |
| + |
| FunctionEntry ScriptDataImpl::GetFunctionEntry(int start) { |
| // The current pre-data entry must be a FunctionEntry with the given |
| // start position. |
| @@ -4600,33 +4628,6 @@ int ScriptDataImpl::ReadNumber(byte** source) { |
| } |
| -// Create a Scanner for the preparser to use as input, and preparse the source. |
| -ScriptDataImpl* PreParserApi::PreParse(Isolate* isolate, |
| - Utf16CharacterStream* source) { |
| - CompleteParserRecorder recorder; |
| - HistogramTimerScope timer(isolate->counters()->pre_parse()); |
| - Scanner scanner(isolate->unicode_cache()); |
| - intptr_t stack_limit = isolate->stack_guard()->real_climit(); |
| - PreParser preparser(&scanner, &recorder, stack_limit); |
| - preparser.set_allow_lazy(true); |
| - preparser.set_allow_generators(FLAG_harmony_generators); |
| - preparser.set_allow_for_of(FLAG_harmony_iteration); |
| - preparser.set_allow_harmony_scoping(FLAG_harmony_scoping); |
| - preparser.set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals); |
| - scanner.Initialize(source); |
| - PreParser::PreParseResult result = preparser.PreParseProgram(); |
| - if (result == PreParser::kPreParseStackOverflow) { |
| - isolate->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); |
| -} |
| - |
| - |
| bool RegExpParser::ParseRegExp(FlatStringReader* input, |
| bool multiline, |
| RegExpCompileData* result, |