OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 "v8.h" | 5 #include "v8.h" |
6 | 6 |
7 #include "accessors.h" | 7 #include "accessors.h" |
8 #include "allocation-site-scopes.h" | 8 #include "allocation-site-scopes.h" |
9 #include "api.h" | 9 #include "api.h" |
10 #include "arguments.h" | 10 #include "arguments.h" |
(...skipping 10192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10203 maps->set(next_kind, *new_map); | 10203 maps->set(next_kind, *new_map); |
10204 current_map = new_map; | 10204 current_map = new_map; |
10205 } | 10205 } |
10206 native_context->set_js_array_maps(*maps); | 10206 native_context->set_js_array_maps(*maps); |
10207 return initial_map; | 10207 return initial_map; |
10208 } | 10208 } |
10209 | 10209 |
10210 | 10210 |
10211 void JSFunction::SetInstancePrototype(Handle<JSFunction> function, | 10211 void JSFunction::SetInstancePrototype(Handle<JSFunction> function, |
10212 Handle<Object> value) { | 10212 Handle<Object> value) { |
| 10213 Isolate* isolate = function->GetIsolate(); |
| 10214 |
10213 ASSERT(value->IsJSReceiver()); | 10215 ASSERT(value->IsJSReceiver()); |
10214 | 10216 |
10215 // First some logic for the map of the prototype to make sure it is in fast | 10217 // First some logic for the map of the prototype to make sure it is in fast |
10216 // mode. | 10218 // mode. |
10217 if (value->IsJSObject()) { | 10219 if (value->IsJSObject()) { |
10218 JSObject::OptimizeAsPrototype(Handle<JSObject>::cast(value)); | 10220 JSObject::OptimizeAsPrototype(Handle<JSObject>::cast(value)); |
10219 } | 10221 } |
10220 | 10222 |
10221 // Now some logic for the maps of the objects that are created by using this | 10223 // Now some logic for the maps of the objects that are created by using this |
10222 // function as a constructor. | 10224 // function as a constructor. |
10223 if (function->has_initial_map()) { | 10225 if (function->has_initial_map()) { |
10224 // If the function has allocated the initial map replace it with a | 10226 // If the function has allocated the initial map replace it with a |
10225 // copy containing the new prototype. Also complete any in-object | 10227 // copy containing the new prototype. Also complete any in-object |
10226 // slack tracking that is in progress at this point because it is | 10228 // slack tracking that is in progress at this point because it is |
10227 // still tracking the old copy. | 10229 // still tracking the old copy. |
10228 if (function->shared()->IsInobjectSlackTrackingInProgress()) { | 10230 if (function->shared()->IsInobjectSlackTrackingInProgress()) { |
10229 function->shared()->CompleteInobjectSlackTracking(); | 10231 function->shared()->CompleteInobjectSlackTracking(); |
10230 } | 10232 } |
10231 Handle<Map> new_map = Map::Copy(handle(function->initial_map())); | 10233 Handle<Map> initial_map(function->initial_map(), isolate); |
| 10234 Handle<Map> new_map = Map::Copy(initial_map); |
10232 new_map->set_prototype(*value); | 10235 new_map->set_prototype(*value); |
10233 | 10236 |
10234 // If the function is used as the global Array function, cache the | 10237 // If the function is used as the global Array function, cache the |
10235 // initial map (and transitioned versions) in the native context. | 10238 // initial map (and transitioned versions) in the native context. |
10236 Context* native_context = function->context()->native_context(); | 10239 Context* native_context = function->context()->native_context(); |
10237 Object* array_function = native_context->get(Context::ARRAY_FUNCTION_INDEX); | 10240 Object* array_function = native_context->get(Context::ARRAY_FUNCTION_INDEX); |
10238 if (array_function->IsJSFunction() && | 10241 if (array_function->IsJSFunction() && |
10239 *function == JSFunction::cast(array_function)) { | 10242 *function == JSFunction::cast(array_function)) { |
10240 CacheInitialJSArrayMaps(handle(native_context), new_map); | 10243 CacheInitialJSArrayMaps(handle(native_context, isolate), new_map); |
10241 } | 10244 } |
10242 | 10245 |
10243 function->set_initial_map(*new_map); | 10246 function->set_initial_map(*new_map); |
| 10247 |
| 10248 // Deoptimize all code that embeds the previous initial map. |
| 10249 initial_map->dependent_code()->DeoptimizeDependentCodeGroup( |
| 10250 isolate, DependentCode::kInitialMapChangedGroup); |
10244 } else { | 10251 } else { |
10245 // Put the value in the initial map field until an initial map is | 10252 // Put the value in the initial map field until an initial map is |
10246 // needed. At that point, a new initial map is created and the | 10253 // needed. At that point, a new initial map is created and the |
10247 // prototype is put into the initial map where it belongs. | 10254 // prototype is put into the initial map where it belongs. |
10248 function->set_prototype_or_initial_map(*value); | 10255 function->set_prototype_or_initial_map(*value); |
10249 } | 10256 } |
10250 function->GetHeap()->ClearInstanceofCache(); | 10257 isolate->heap()->ClearInstanceofCache(); |
10251 } | 10258 } |
10252 | 10259 |
10253 | 10260 |
10254 void JSFunction::SetPrototype(Handle<JSFunction> function, | 10261 void JSFunction::SetPrototype(Handle<JSFunction> function, |
10255 Handle<Object> value) { | 10262 Handle<Object> value) { |
10256 ASSERT(function->should_have_prototype()); | 10263 ASSERT(function->should_have_prototype()); |
10257 Handle<Object> construct_prototype = value; | 10264 Handle<Object> construct_prototype = value; |
10258 | 10265 |
10259 // If the value is not a JSReceiver, store the value in the map's | 10266 // If the value is not a JSReceiver, store the value in the map's |
10260 // constructor field so it can be accessed. Also, set the prototype | 10267 // constructor field so it can be accessed. Also, set the prototype |
(...skipping 7048 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17309 #define ERROR_MESSAGES_TEXTS(C, T) T, | 17316 #define ERROR_MESSAGES_TEXTS(C, T) T, |
17310 static const char* error_messages_[] = { | 17317 static const char* error_messages_[] = { |
17311 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 17318 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
17312 }; | 17319 }; |
17313 #undef ERROR_MESSAGES_TEXTS | 17320 #undef ERROR_MESSAGES_TEXTS |
17314 return error_messages_[reason]; | 17321 return error_messages_[reason]; |
17315 } | 17322 } |
17316 | 17323 |
17317 | 17324 |
17318 } } // namespace v8::internal | 17325 } } // namespace v8::internal |
OLD | NEW |