OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/objects.h" | 5 #include "src/objects.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <iomanip> | 8 #include <iomanip> |
9 #include <memory> | 9 #include <memory> |
10 #include <sstream> | 10 #include <sstream> |
(...skipping 12090 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12101 | 12101 |
12102 if (!found) { | 12102 if (!found) { |
12103 // We didn't find the code in here. It must be osr'd code. | 12103 // We didn't find the code in here. It must be osr'd code. |
12104 isolate->EvictOSROptimizedCode(optimized_code, reason); | 12104 isolate->EvictOSROptimizedCode(optimized_code, reason); |
12105 } | 12105 } |
12106 } | 12106 } |
12107 | 12107 |
12108 // static | 12108 // static |
12109 void JSFunction::EnsureLiterals(Handle<JSFunction> function) { | 12109 void JSFunction::EnsureLiterals(Handle<JSFunction> function) { |
12110 Handle<SharedFunctionInfo> shared(function->shared()); | 12110 Handle<SharedFunctionInfo> shared(function->shared()); |
12111 Handle<Context> native_context(function->context()->native_context()); | |
12112 Isolate* isolate = shared->GetIsolate(); | 12111 Isolate* isolate = shared->GetIsolate(); |
12113 | 12112 |
12114 Cell* cell = function->feedback_vector_cell(); | 12113 FeedbackVectorState state = function->GetFeedbackVectorState(isolate); |
12115 if (cell == isolate->heap()->undefined_cell()) { | 12114 switch (state) { |
12116 if (FLAG_trace_strong_rooted_literals) { | 12115 case TOP_LEVEL_SCRIPT_NEEDS_VECTOR: { |
12117 PrintF("EnsureLiterals: Installing literals cell in %s %p\n", | 12116 // A top level script didn't get it's literals installed. |
12118 shared->DebugName()->ToCString().get(), | 12117 Handle<FeedbackVector> feedback_vector = |
12119 reinterpret_cast<void*>(*function)); | 12118 FeedbackVector::New(isolate, shared); |
| 12119 Handle<Cell> new_cell = isolate->factory()->NewCell(feedback_vector); |
| 12120 function->set_feedback_vector_cell(*new_cell); |
| 12121 break; |
12120 } | 12122 } |
12121 // Top level code didn't get it's literals installed. | 12123 case NEEDS_VECTOR: { |
12122 Handle<FeedbackVector> feedback_vector = | 12124 Handle<FeedbackVector> feedback_vector = |
12123 FeedbackVector::New(isolate, shared); | 12125 FeedbackVector::New(isolate, shared); |
12124 Handle<Cell> new_cell = isolate->factory()->NewCell(feedback_vector); | 12126 function->feedback_vector_cell()->set_value(*feedback_vector); |
12125 function->set_feedback_vector_cell(*new_cell); | 12127 break; |
12126 } else if (!cell->value()->IsFeedbackVector() || | |
12127 !function->has_feedback_vector()) { | |
12128 DCHECK(cell != isolate->heap()->undefined_cell()); | |
12129 if (FLAG_trace_strong_rooted_literals) { | |
12130 PrintF("EnsureLiterals: Update literals cell in %s %p\n", | |
12131 shared->DebugName()->ToCString().get(), | |
12132 reinterpret_cast<void*>(*function)); | |
12133 } | 12128 } |
12134 Handle<FeedbackVector> feedback_vector = | 12129 case HAS_VECTOR: |
12135 FeedbackVector::New(isolate, shared); | 12130 // Nothing to do. |
12136 // Re-get the feedback_vector() value as GC may have occurred. | 12131 break; |
12137 function->feedback_vector_cell()->set_value(*feedback_vector); | |
12138 } else { | |
12139 if (FLAG_trace_strong_rooted_literals) { | |
12140 PrintF("EnsureLiterals: did nothing for %s %p\n", | |
12141 shared->DebugName()->ToCString().get(), | |
12142 reinterpret_cast<void*>(*function)); | |
12143 } | |
12144 } | 12132 } |
12145 } | 12133 } |
12146 | 12134 |
12147 static void GetMinInobjectSlack(Map* map, void* data) { | 12135 static void GetMinInobjectSlack(Map* map, void* data) { |
12148 int slack = map->unused_property_fields(); | 12136 int slack = map->unused_property_fields(); |
12149 if (*reinterpret_cast<int*>(data) > slack) { | 12137 if (*reinterpret_cast<int*>(data) > slack) { |
12150 *reinterpret_cast<int*>(data) = slack; | 12138 *reinterpret_cast<int*>(data) = slack; |
12151 } | 12139 } |
12152 } | 12140 } |
12153 | 12141 |
(...skipping 8049 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20203 // depend on this. | 20191 // depend on this. |
20204 return DICTIONARY_ELEMENTS; | 20192 return DICTIONARY_ELEMENTS; |
20205 } | 20193 } |
20206 DCHECK_LE(kind, LAST_ELEMENTS_KIND); | 20194 DCHECK_LE(kind, LAST_ELEMENTS_KIND); |
20207 return kind; | 20195 return kind; |
20208 } | 20196 } |
20209 } | 20197 } |
20210 | 20198 |
20211 } // namespace internal | 20199 } // namespace internal |
20212 } // namespace v8 | 20200 } // namespace v8 |
OLD | NEW |