OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
370 } | 370 } |
371 } | 371 } |
372 } | 372 } |
373 | 373 |
374 // Notify debugger | 374 // Notify debugger |
375 isolate->debugger()->OnBeforeCompile(script); | 375 isolate->debugger()->OnBeforeCompile(script); |
376 #endif | 376 #endif |
377 | 377 |
378 // Only allow non-global compiles for eval. | 378 // Only allow non-global compiles for eval. |
379 ASSERT(info->is_eval() || info->is_global()); | 379 ASSERT(info->is_eval() || info->is_global()); |
380 | 380 ParsingFlags flags = kNoParsingFlags; |
381 if (!ParserApi::Parse(info)) return Handle<SharedFunctionInfo>::null(); | 381 if (info->pre_parse_data() != NULL || |
| 382 String::cast(script->source())->length() > FLAG_min_preparse_length) { |
| 383 flags = kAllowLazy; |
| 384 } |
| 385 if (!ParserApi::Parse(info, flags)) { |
| 386 return Handle<SharedFunctionInfo>::null(); |
| 387 } |
382 | 388 |
383 // Measure how long it takes to do the compilation; only take the | 389 // Measure how long it takes to do the compilation; only take the |
384 // rest of the function into account to avoid overlap with the | 390 // rest of the function into account to avoid overlap with the |
385 // parsing statistics. | 391 // parsing statistics. |
386 HistogramTimer* rate = info->is_eval() | 392 HistogramTimer* rate = info->is_eval() |
387 ? info->isolate()->counters()->compile_eval() | 393 ? info->isolate()->counters()->compile_eval() |
388 : info->isolate()->counters()->compile(); | 394 : info->isolate()->counters()->compile(); |
389 HistogramTimerScope timer(rate); | 395 HistogramTimerScope timer(rate); |
390 | 396 |
391 // Compile the code. | 397 // Compile the code. |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
446 | 452 |
447 return result; | 453 return result; |
448 } | 454 } |
449 | 455 |
450 | 456 |
451 Handle<SharedFunctionInfo> Compiler::Compile(Handle<String> source, | 457 Handle<SharedFunctionInfo> Compiler::Compile(Handle<String> source, |
452 Handle<Object> script_name, | 458 Handle<Object> script_name, |
453 int line_offset, | 459 int line_offset, |
454 int column_offset, | 460 int column_offset, |
455 v8::Extension* extension, | 461 v8::Extension* extension, |
456 ScriptDataImpl* input_pre_data, | 462 ScriptDataImpl* pre_data, |
457 Handle<Object> script_data, | 463 Handle<Object> script_data, |
458 NativesFlag natives) { | 464 NativesFlag natives) { |
459 Isolate* isolate = source->GetIsolate(); | 465 Isolate* isolate = source->GetIsolate(); |
460 int source_length = source->length(); | 466 int source_length = source->length(); |
461 isolate->counters()->total_load_size()->Increment(source_length); | 467 isolate->counters()->total_load_size()->Increment(source_length); |
462 isolate->counters()->total_compile_size()->Increment(source_length); | 468 isolate->counters()->total_compile_size()->Increment(source_length); |
463 | 469 |
464 // The VM is in the COMPILER state until exiting this function. | 470 // The VM is in the COMPILER state until exiting this function. |
465 VMState state(isolate, COMPILER); | 471 VMState state(isolate, COMPILER); |
466 | 472 |
(...skipping 10 matching lines...) Expand all Loading... |
477 | 483 |
478 if (result.is_null()) { | 484 if (result.is_null()) { |
479 // No cache entry found. Do pre-parsing, if it makes sense, and compile | 485 // No cache entry found. Do pre-parsing, if it makes sense, and compile |
480 // the script. | 486 // the script. |
481 // Building preparse data that is only used immediately after is only a | 487 // Building preparse data that is only used immediately after is only a |
482 // saving if we might skip building the AST for lazily compiled functions. | 488 // saving if we might skip building the AST for lazily compiled functions. |
483 // I.e., preparse data isn't relevant when the lazy flag is off, and | 489 // I.e., preparse data isn't relevant when the lazy flag is off, and |
484 // for small sources, odds are that there aren't many functions | 490 // for small sources, odds are that there aren't many functions |
485 // that would be compiled lazily anyway, so we skip the preparse step | 491 // that would be compiled lazily anyway, so we skip the preparse step |
486 // in that case too. | 492 // in that case too. |
487 ScriptDataImpl* pre_data = input_pre_data; | |
488 int flags = kNoParsingFlags; | 493 int flags = kNoParsingFlags; |
489 if ((natives == NATIVES_CODE) || FLAG_allow_natives_syntax) { | 494 if ((natives == NATIVES_CODE) || FLAG_allow_natives_syntax) { |
490 flags |= kAllowNativesSyntax; | 495 flags |= kAllowNativesSyntax; |
491 } | 496 } |
492 if (natives != NATIVES_CODE && FLAG_harmony_scoping) { | 497 if (natives != NATIVES_CODE && FLAG_harmony_scoping) { |
493 flags |= kHarmonyScoping; | 498 flags |= EXTENDED_MODE; |
494 } | |
495 if (pre_data == NULL | |
496 && source_length >= FLAG_min_preparse_length) { | |
497 if (source->IsExternalTwoByteString()) { | |
498 ExternalTwoByteStringUC16CharacterStream stream( | |
499 Handle<ExternalTwoByteString>::cast(source), 0, source->length()); | |
500 pre_data = ParserApi::PartialPreParse(&stream, extension, flags); | |
501 } else { | |
502 GenericStringUC16CharacterStream stream(source, 0, source->length()); | |
503 pre_data = ParserApi::PartialPreParse(&stream, extension, flags); | |
504 } | |
505 } | 499 } |
506 | 500 |
507 // Create a script object describing the script to be compiled. | 501 // Create a script object describing the script to be compiled. |
508 Handle<Script> script = FACTORY->NewScript(source); | 502 Handle<Script> script = FACTORY->NewScript(source); |
509 if (natives == NATIVES_CODE) { | 503 if (natives == NATIVES_CODE) { |
510 script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); | 504 script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); |
511 } | 505 } |
512 if (!script_name.is_null()) { | 506 if (!script_name.is_null()) { |
513 script->set_name(*script_name); | 507 script->set_name(*script_name); |
514 script->set_line_offset(Smi::FromInt(line_offset)); | 508 script->set_line_offset(Smi::FromInt(line_offset)); |
515 script->set_column_offset(Smi::FromInt(column_offset)); | 509 script->set_column_offset(Smi::FromInt(column_offset)); |
516 } | 510 } |
517 | 511 |
518 script->set_data(script_data.is_null() ? HEAP->undefined_value() | 512 script->set_data(script_data.is_null() ? HEAP->undefined_value() |
519 : *script_data); | 513 : *script_data); |
520 | 514 |
521 // Compile the function and add it to the cache. | 515 // Compile the function and add it to the cache. |
522 CompilationInfo info(script); | 516 CompilationInfo info(script); |
523 info.MarkAsGlobal(); | 517 info.MarkAsGlobal(); |
524 info.SetExtension(extension); | 518 info.SetExtension(extension); |
525 info.SetPreParseData(pre_data); | 519 info.SetPreParseData(pre_data); |
526 result = MakeFunctionInfo(&info); | 520 result = MakeFunctionInfo(&info); |
527 if (extension == NULL && !result.is_null()) { | 521 if (extension == NULL && !result.is_null()) { |
528 compilation_cache->PutScript(source, result); | 522 compilation_cache->PutScript(source, result); |
529 } | 523 } |
530 | |
531 // Get rid of the pre-parsing data (if necessary). | |
532 if (input_pre_data == NULL && pre_data != NULL) { | |
533 delete pre_data; | |
534 } | |
535 } | 524 } |
536 | 525 |
537 if (result.is_null()) isolate->ReportPendingMessages(); | 526 if (result.is_null()) isolate->ReportPendingMessages(); |
538 return result; | 527 return result; |
539 } | 528 } |
540 | 529 |
541 | 530 |
542 Handle<SharedFunctionInfo> Compiler::CompileEval(Handle<String> source, | 531 Handle<SharedFunctionInfo> Compiler::CompileEval(Handle<String> source, |
543 Handle<Context> context, | 532 Handle<Context> context, |
544 bool is_global, | 533 bool is_global, |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
597 // The VM is in the COMPILER state until exiting this function. | 586 // The VM is in the COMPILER state until exiting this function. |
598 VMState state(isolate, COMPILER); | 587 VMState state(isolate, COMPILER); |
599 | 588 |
600 PostponeInterruptsScope postpone(isolate); | 589 PostponeInterruptsScope postpone(isolate); |
601 | 590 |
602 Handle<SharedFunctionInfo> shared = info->shared_info(); | 591 Handle<SharedFunctionInfo> shared = info->shared_info(); |
603 int compiled_size = shared->end_position() - shared->start_position(); | 592 int compiled_size = shared->end_position() - shared->start_position(); |
604 isolate->counters()->total_compile_size()->Increment(compiled_size); | 593 isolate->counters()->total_compile_size()->Increment(compiled_size); |
605 | 594 |
606 // Generate the AST for the lazily compiled function. | 595 // Generate the AST for the lazily compiled function. |
607 if (ParserApi::Parse(info)) { | 596 if (ParserApi::Parse(info, kNoParsingFlags)) { |
608 // Measure how long it takes to do the lazy compilation; only take the | 597 // Measure how long it takes to do the lazy compilation; only take the |
609 // rest of the function into account to avoid overlap with the lazy | 598 // rest of the function into account to avoid overlap with the lazy |
610 // parsing statistics. | 599 // parsing statistics. |
611 HistogramTimerScope timer(isolate->counters()->compile_lazy()); | 600 HistogramTimerScope timer(isolate->counters()->compile_lazy()); |
612 | 601 |
613 // After parsing we know the function's language mode. Remember it. | 602 // After parsing we know the function's language mode. Remember it. |
614 LanguageMode language_mode = info->function()->language_mode(); | 603 LanguageMode language_mode = info->function()->language_mode(); |
615 info->SetLanguageMode(language_mode); | 604 info->SetLanguageMode(language_mode); |
616 shared->set_language_mode(language_mode); | 605 shared->set_language_mode(language_mode); |
617 | 606 |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
797 } | 786 } |
798 } | 787 } |
799 | 788 |
800 GDBJIT(AddCode(Handle<String>(shared->DebugName()), | 789 GDBJIT(AddCode(Handle<String>(shared->DebugName()), |
801 Handle<Script>(info->script()), | 790 Handle<Script>(info->script()), |
802 Handle<Code>(info->code()), | 791 Handle<Code>(info->code()), |
803 info)); | 792 info)); |
804 } | 793 } |
805 | 794 |
806 } } // namespace v8::internal | 795 } } // namespace v8::internal |
OLD | NEW |