| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 843 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 854 // the marking stack. Instead, we mark them as both marked and overflowed. | 854 // the marking stack. Instead, we mark them as both marked and overflowed. |
| 855 // When the stack is in the overflowed state, objects marked as overflowed | 855 // When the stack is in the overflowed state, objects marked as overflowed |
| 856 // have been reached and marked but their children have not been visited yet. | 856 // have been reached and marked but their children have not been visited yet. |
| 857 // After emptying the marking stack, we clear the overflow flag and traverse | 857 // After emptying the marking stack, we clear the overflow flag and traverse |
| 858 // the heap looking for objects marked as overflowed, push them on the stack, | 858 // the heap looking for objects marked as overflowed, push them on the stack, |
| 859 // and continue with marking. This process repeats until all reachable | 859 // and continue with marking. This process repeats until all reachable |
| 860 // objects have been marked. | 860 // objects have been marked. |
| 861 | 861 |
| 862 void CodeFlusher::ProcessJSFunctionCandidates() { | 862 void CodeFlusher::ProcessJSFunctionCandidates() { |
| 863 Code* lazy_compile = isolate_->builtins()->builtin(Builtins::kLazyCompile); | 863 Code* lazy_compile = isolate_->builtins()->builtin(Builtins::kLazyCompile); |
| 864 Object* undefined = isolate_->heap()->undefined_value(); |
| 864 | 865 |
| 865 JSFunction* candidate = jsfunction_candidates_head_; | 866 JSFunction* candidate = jsfunction_candidates_head_; |
| 866 JSFunction* next_candidate; | 867 JSFunction* next_candidate; |
| 867 while (candidate != NULL) { | 868 while (candidate != NULL) { |
| 868 next_candidate = GetNextCandidate(candidate); | 869 next_candidate = GetNextCandidate(candidate); |
| 870 ClearNextCandidate(candidate, undefined); |
| 869 | 871 |
| 870 SharedFunctionInfo* shared = candidate->shared(); | 872 SharedFunctionInfo* shared = candidate->shared(); |
| 871 | 873 |
| 872 Code* code = shared->code(); | 874 Code* code = shared->code(); |
| 873 MarkBit code_mark = Marking::MarkBitFrom(code); | 875 MarkBit code_mark = Marking::MarkBitFrom(code); |
| 874 if (!code_mark.Get()) { | 876 if (!code_mark.Get()) { |
| 875 shared->set_code(lazy_compile); | 877 shared->set_code(lazy_compile); |
| 876 candidate->set_code(lazy_compile); | 878 candidate->set_code(lazy_compile); |
| 877 } else { | 879 } else if (code == lazy_compile) { |
| 878 candidate->set_code(shared->code()); | 880 candidate->set_code(lazy_compile); |
| 879 } | 881 } |
| 880 | 882 |
| 881 // We are in the middle of a GC cycle so the write barrier in the code | 883 // We are in the middle of a GC cycle so the write barrier in the code |
| 882 // setter did not record the slot update and we have to do that manually. | 884 // setter did not record the slot update and we have to do that manually. |
| 883 Address slot = candidate->address() + JSFunction::kCodeEntryOffset; | 885 Address slot = candidate->address() + JSFunction::kCodeEntryOffset; |
| 884 Code* target = Code::cast(Code::GetObjectFromEntryAddress(slot)); | 886 Code* target = Code::cast(Code::GetObjectFromEntryAddress(slot)); |
| 885 isolate_->heap()->mark_compact_collector()-> | 887 isolate_->heap()->mark_compact_collector()-> |
| 886 RecordCodeEntrySlot(slot, target); | 888 RecordCodeEntrySlot(slot, target); |
| 887 | 889 |
| 888 Object** shared_code_slot = | 890 Object** shared_code_slot = |
| 889 HeapObject::RawField(shared, SharedFunctionInfo::kCodeOffset); | 891 HeapObject::RawField(shared, SharedFunctionInfo::kCodeOffset); |
| 890 isolate_->heap()->mark_compact_collector()-> | 892 isolate_->heap()->mark_compact_collector()-> |
| 891 RecordSlot(shared_code_slot, shared_code_slot, *shared_code_slot); | 893 RecordSlot(shared_code_slot, shared_code_slot, *shared_code_slot); |
| 892 | 894 |
| 893 candidate = next_candidate; | 895 candidate = next_candidate; |
| 894 } | 896 } |
| 895 | 897 |
| 896 jsfunction_candidates_head_ = NULL; | 898 jsfunction_candidates_head_ = NULL; |
| 897 } | 899 } |
| 898 | 900 |
| 899 | 901 |
| 900 void CodeFlusher::ProcessSharedFunctionInfoCandidates() { | 902 void CodeFlusher::ProcessSharedFunctionInfoCandidates() { |
| 901 Code* lazy_compile = isolate_->builtins()->builtin(Builtins::kLazyCompile); | 903 Code* lazy_compile = isolate_->builtins()->builtin(Builtins::kLazyCompile); |
| 902 | 904 |
| 903 SharedFunctionInfo* candidate = shared_function_info_candidates_head_; | 905 SharedFunctionInfo* candidate = shared_function_info_candidates_head_; |
| 904 SharedFunctionInfo* next_candidate; | 906 SharedFunctionInfo* next_candidate; |
| 905 while (candidate != NULL) { | 907 while (candidate != NULL) { |
| 906 next_candidate = GetNextCandidate(candidate); | 908 next_candidate = GetNextCandidate(candidate); |
| 907 SetNextCandidate(candidate, NULL); | 909 ClearNextCandidate(candidate); |
| 908 | 910 |
| 909 Code* code = candidate->code(); | 911 Code* code = candidate->code(); |
| 910 MarkBit code_mark = Marking::MarkBitFrom(code); | 912 MarkBit code_mark = Marking::MarkBitFrom(code); |
| 911 if (!code_mark.Get()) { | 913 if (!code_mark.Get()) { |
| 912 candidate->set_code(lazy_compile); | 914 candidate->set_code(lazy_compile); |
| 913 } | 915 } |
| 914 | 916 |
| 915 Object** code_slot = | 917 Object** code_slot = |
| 916 HeapObject::RawField(candidate, SharedFunctionInfo::kCodeOffset); | 918 HeapObject::RawField(candidate, SharedFunctionInfo::kCodeOffset); |
| 917 isolate_->heap()->mark_compact_collector()-> | 919 isolate_->heap()->mark_compact_collector()-> |
| (...skipping 2835 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3753 while (buffer != NULL) { | 3755 while (buffer != NULL) { |
| 3754 SlotsBuffer* next_buffer = buffer->next(); | 3756 SlotsBuffer* next_buffer = buffer->next(); |
| 3755 DeallocateBuffer(buffer); | 3757 DeallocateBuffer(buffer); |
| 3756 buffer = next_buffer; | 3758 buffer = next_buffer; |
| 3757 } | 3759 } |
| 3758 *buffer_address = NULL; | 3760 *buffer_address = NULL; |
| 3759 } | 3761 } |
| 3760 | 3762 |
| 3761 | 3763 |
| 3762 } } // namespace v8::internal | 3764 } } // namespace v8::internal |
| OLD | NEW |