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 1029 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1040 | 1040 |
1041 | 1041 |
1042 // Finds all references to original and replaces them with substitution. | 1042 // Finds all references to original and replaces them with substitution. |
1043 static void ReplaceCodeObject(Handle<Code> original, | 1043 static void ReplaceCodeObject(Handle<Code> original, |
1044 Handle<Code> substitution) { | 1044 Handle<Code> substitution) { |
1045 // Perform a full GC in order to ensure that we are not in the middle of an | 1045 // Perform a full GC in order to ensure that we are not in the middle of an |
1046 // incremental marking phase when we are replacing the code object. | 1046 // incremental marking phase when we are replacing the code object. |
1047 // Since we are not in an incremental marking phase we can write pointers | 1047 // Since we are not in an incremental marking phase we can write pointers |
1048 // to code objects (that are never in new space) without worrying about | 1048 // to code objects (that are never in new space) without worrying about |
1049 // write barriers. | 1049 // write barriers. |
1050 HEAP->CollectAllGarbage(Heap::kMakeHeapIterableMask, | 1050 Heap* heap = original->GetHeap(); |
| 1051 heap->CollectAllGarbage(Heap::kMakeHeapIterableMask, |
1051 "liveedit.cc ReplaceCodeObject"); | 1052 "liveedit.cc ReplaceCodeObject"); |
1052 | 1053 |
1053 ASSERT(!HEAP->InNewSpace(*substitution)); | 1054 ASSERT(!heap->InNewSpace(*substitution)); |
1054 | 1055 |
1055 AssertNoAllocation no_allocations_please; | 1056 AssertNoAllocation no_allocations_please; |
1056 | 1057 |
1057 ReplacingVisitor visitor(*original, *substitution); | 1058 ReplacingVisitor visitor(*original, *substitution); |
1058 | 1059 |
1059 // Iterate over all roots. Stack frames may have pointer into original code, | 1060 // Iterate over all roots. Stack frames may have pointer into original code, |
1060 // so temporary replace the pointers with offset numbers | 1061 // so temporary replace the pointers with offset numbers |
1061 // in prologue/epilogue. | 1062 // in prologue/epilogue. |
1062 HEAP->IterateRoots(&visitor, VISIT_ALL); | 1063 heap->IterateRoots(&visitor, VISIT_ALL); |
1063 | 1064 |
1064 // Now iterate over all pointers of all objects, including code_target | 1065 // Now iterate over all pointers of all objects, including code_target |
1065 // implicit pointers. | 1066 // implicit pointers. |
1066 HeapIterator iterator; | 1067 HeapIterator iterator(heap); |
1067 for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { | 1068 for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { |
1068 obj->Iterate(&visitor); | 1069 obj->Iterate(&visitor); |
1069 } | 1070 } |
1070 } | 1071 } |
1071 | 1072 |
1072 | 1073 |
1073 // Patch function literals. | 1074 // Patch function literals. |
1074 // Name 'literals' is a misnomer. Rather it's a cache for complex object | 1075 // Name 'literals' is a misnomer. Rather it's a cache for complex object |
1075 // boilerplates and for a native context. We must clean cached values. | 1076 // boilerplates and for a native context. We must clean cached values. |
1076 // Additionally we may need to allocate a new array if number of literals | 1077 // Additionally we may need to allocate a new array if number of literals |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1122 } | 1123 } |
1123 | 1124 |
1124 private: | 1125 private: |
1125 // Iterates all function instances in the HEAP that refers to the | 1126 // Iterates all function instances in the HEAP that refers to the |
1126 // provided shared_info. | 1127 // provided shared_info. |
1127 template<typename Visitor> | 1128 template<typename Visitor> |
1128 static void IterateJSFunctions(SharedFunctionInfo* shared_info, | 1129 static void IterateJSFunctions(SharedFunctionInfo* shared_info, |
1129 Visitor* visitor) { | 1130 Visitor* visitor) { |
1130 AssertNoAllocation no_allocations_please; | 1131 AssertNoAllocation no_allocations_please; |
1131 | 1132 |
1132 HeapIterator iterator; | 1133 HeapIterator iterator(shared_info->GetHeap()); |
1133 for (HeapObject* obj = iterator.next(); obj != NULL; | 1134 for (HeapObject* obj = iterator.next(); obj != NULL; |
1134 obj = iterator.next()) { | 1135 obj = iterator.next()) { |
1135 if (obj->IsJSFunction()) { | 1136 if (obj->IsJSFunction()) { |
1136 JSFunction* function = JSFunction::cast(obj); | 1137 JSFunction* function = JSFunction::cast(obj); |
1137 if (function->shared() == shared_info) { | 1138 if (function->shared() == shared_info) { |
1138 visitor->visit(function); | 1139 visitor->visit(function); |
1139 } | 1140 } |
1140 } | 1141 } |
1141 } | 1142 } |
1142 } | 1143 } |
(...skipping 954 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2097 | 2098 |
2098 bool LiveEditFunctionTracker::IsActive(Isolate* isolate) { | 2099 bool LiveEditFunctionTracker::IsActive(Isolate* isolate) { |
2099 return false; | 2100 return false; |
2100 } | 2101 } |
2101 | 2102 |
2102 #endif // ENABLE_DEBUGGER_SUPPORT | 2103 #endif // ENABLE_DEBUGGER_SUPPORT |
2103 | 2104 |
2104 | 2105 |
2105 | 2106 |
2106 } } // namespace v8::internal | 2107 } } // namespace v8::internal |
OLD | NEW |