OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 611 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
622 HistogramTimerScope timer(isolate->counters()->compile_lazy()); | 622 HistogramTimerScope timer(isolate->counters()->compile_lazy()); |
623 | 623 |
624 // Compile the code. | 624 // Compile the code. |
625 if (!MakeCode(info)) { | 625 if (!MakeCode(info)) { |
626 if (!isolate->has_pending_exception()) { | 626 if (!isolate->has_pending_exception()) { |
627 isolate->StackOverflow(); | 627 isolate->StackOverflow(); |
628 } | 628 } |
629 } else { | 629 } else { |
630 ASSERT(!info->code().is_null()); | 630 ASSERT(!info->code().is_null()); |
631 Handle<Code> code = info->code(); | 631 Handle<Code> code = info->code(); |
| 632 // Set optimizable to false if this is disallowed by the shared |
| 633 // function info, e.g., we might have flushed the code and must |
| 634 // reset this bit when lazy compiling the code again. |
| 635 if (shared->optimization_disabled()) code->set_optimizable(false); |
| 636 |
632 Handle<JSFunction> function = info->closure(); | 637 Handle<JSFunction> function = info->closure(); |
633 RecordFunctionCompilation(Logger::LAZY_COMPILE_TAG, info, shared); | 638 RecordFunctionCompilation(Logger::LAZY_COMPILE_TAG, info, shared); |
634 | 639 |
635 if (info->IsOptimizing()) { | 640 if (info->IsOptimizing()) { |
636 function->ReplaceCode(*code); | 641 function->ReplaceCode(*code); |
637 } else { | 642 } else { |
638 // Update the shared function info with the compiled code and the | 643 // Update the shared function info with the compiled code and the |
639 // scope info. Please note, that the order of the shared function | 644 // scope info. Please note, that the order of the shared function |
640 // info initialization is important since set_scope_info might | 645 // info initialization is important since set_scope_info might |
641 // trigger a GC, causing the ASSERT below to be invalid if the code | 646 // trigger a GC, causing the ASSERT below to be invalid if the code |
(...skipping 16 matching lines...) Expand all Loading... |
658 // these are not set when the function is set up as a lazily | 663 // these are not set when the function is set up as a lazily |
659 // compiled function. | 664 // compiled function. |
660 shared->SetThisPropertyAssignmentsInfo( | 665 shared->SetThisPropertyAssignmentsInfo( |
661 lit->has_only_simple_this_property_assignments(), | 666 lit->has_only_simple_this_property_assignments(), |
662 *lit->this_property_assignments()); | 667 *lit->this_property_assignments()); |
663 | 668 |
664 // Check the function has compiled code. | 669 // Check the function has compiled code. |
665 ASSERT(shared->is_compiled()); | 670 ASSERT(shared->is_compiled()); |
666 shared->set_code_age(0); | 671 shared->set_code_age(0); |
667 | 672 |
668 if (V8::UseCrankshaft() && info->AllowOptimize()) { | 673 if (info->AllowOptimize() && !shared->optimization_disabled()) { |
669 // If we're asked to always optimize, we compile the optimized | 674 // If we're asked to always optimize, we compile the optimized |
670 // version of the function right away - unless the debugger is | 675 // version of the function right away - unless the debugger is |
671 // active as it makes no sense to compile optimized code then. | 676 // active as it makes no sense to compile optimized code then. |
672 if (FLAG_always_opt && | 677 if (FLAG_always_opt && |
673 !Isolate::Current()->debug()->has_break_points()) { | 678 !Isolate::Current()->debug()->has_break_points()) { |
674 CompilationInfo optimized(function); | 679 CompilationInfo optimized(function); |
675 optimized.SetOptimizing(AstNode::kNoNumber); | 680 optimized.SetOptimizing(AstNode::kNoNumber); |
676 return CompileLazy(&optimized); | 681 return CompileLazy(&optimized); |
677 } else if (isolate->compilation_cache()->ShouldOptimizeEagerly( | 682 } else if (isolate->compilation_cache()->ShouldOptimizeEagerly( |
678 function)) { | 683 function)) { |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
820 shared->DebugName())); | 825 shared->DebugName())); |
821 } | 826 } |
822 } | 827 } |
823 | 828 |
824 GDBJIT(AddCode(name, | 829 GDBJIT(AddCode(name, |
825 Handle<Script>(info->script()), | 830 Handle<Script>(info->script()), |
826 Handle<Code>(info->code()))); | 831 Handle<Code>(info->code()))); |
827 } | 832 } |
828 | 833 |
829 } } // namespace v8::internal | 834 } } // namespace v8::internal |
OLD | NEW |