| Index: src/parser.cc
|
| diff --git a/src/parser.cc b/src/parser.cc
|
| index 5ec28577a8a22b2d52ba9c389614b68c7b5895d7..5ee217ca5c16a12f3142c0219c8cc0e013dbf486 100644
|
| --- a/src/parser.cc
|
| +++ b/src/parser.cc
|
| @@ -567,14 +567,15 @@ Parser::Parser(CompilationInfo* info,
|
|
|
| FunctionLiteral* Parser::ParseProgram() {
|
| ZoneScope zone_scope(zone(), DONT_DELETE_ON_EXIT);
|
| -
|
| HistogramTimerScope timer(isolate()->counters()->parse());
|
| Handle<String> source(String::cast(script_->source()));
|
| isolate()->counters()->total_parse_size()->Increment(source->length());
|
| + int64_t start = FLAG_trace_parse ? OS::Ticks() : 0;
|
| fni_ = new(zone()) FuncNameInferrer(isolate(), zone());
|
|
|
| // Initialize parser state.
|
| source->TryFlatten();
|
| + FunctionLiteral* result;
|
| if (source->IsExternalTwoByteString()) {
|
| // Notice that the stream is destroyed at the end of the branch block.
|
| // The last line of the blocks can't be moved outside, even though they're
|
| @@ -582,12 +583,27 @@ FunctionLiteral* Parser::ParseProgram() {
|
| ExternalTwoByteStringUtf16CharacterStream stream(
|
| Handle<ExternalTwoByteString>::cast(source), 0, source->length());
|
| scanner_.Initialize(&stream);
|
| - return DoParseProgram(info(), source, &zone_scope);
|
| + result = DoParseProgram(info(), source, &zone_scope);
|
| } else {
|
| GenericStringUtf16CharacterStream stream(source, 0, source->length());
|
| scanner_.Initialize(&stream);
|
| - return DoParseProgram(info(), source, &zone_scope);
|
| + result = DoParseProgram(info(), source, &zone_scope);
|
| }
|
| +
|
| + if (FLAG_trace_parse && result != NULL) {
|
| + double ms = static_cast<double>(OS::Ticks() - start) / 1000;
|
| + if (info()->is_eval()) {
|
| + PrintF("[parsing eval");
|
| + } else if (info()->script()->name()->IsString()) {
|
| + String* name = String::cast(info()->script()->name());
|
| + SmartArrayPointer<char> name_chars = name->ToCString();
|
| + PrintF("[parsing script: %s", *name_chars);
|
| + } else {
|
| + PrintF("[parsing script");
|
| + }
|
| + PrintF(" - took %0.3f ms]\n", ms);
|
| + }
|
| + return result;
|
| }
|
|
|
|
|
| @@ -668,24 +684,31 @@ FunctionLiteral* Parser::ParseLazy() {
|
| HistogramTimerScope timer(isolate()->counters()->parse_lazy());
|
| Handle<String> source(String::cast(script_->source()));
|
| isolate()->counters()->total_parse_size()->Increment(source->length());
|
| -
|
| + int64_t start = FLAG_trace_parse ? OS::Ticks() : 0;
|
| Handle<SharedFunctionInfo> shared_info = info()->shared_info();
|
| +
|
| // Initialize parser state.
|
| source->TryFlatten();
|
| + FunctionLiteral* result;
|
| if (source->IsExternalTwoByteString()) {
|
| ExternalTwoByteStringUtf16CharacterStream stream(
|
| Handle<ExternalTwoByteString>::cast(source),
|
| shared_info->start_position(),
|
| shared_info->end_position());
|
| - FunctionLiteral* result = ParseLazy(&stream, &zone_scope);
|
| - return result;
|
| + result = ParseLazy(&stream, &zone_scope);
|
| } else {
|
| GenericStringUtf16CharacterStream stream(source,
|
| shared_info->start_position(),
|
| shared_info->end_position());
|
| - FunctionLiteral* result = ParseLazy(&stream, &zone_scope);
|
| - return result;
|
| + result = ParseLazy(&stream, &zone_scope);
|
| }
|
| +
|
| + if (FLAG_trace_parse && result != NULL) {
|
| + double ms = static_cast<double>(OS::Ticks() - start) / 1000;
|
| + SmartArrayPointer<char> name_chars = result->name()->ToCString();
|
| + PrintF("[parsing function: %s - took %0.3f ms]\n", *name_chars, ms);
|
| + }
|
| + return result;
|
| }
|
|
|
|
|
|
|