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 3397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3408 if (kind != to_kind) { | 3408 if (kind != to_kind) { |
3409 current_map = Map::CopyAsElementsKind( | 3409 current_map = Map::CopyAsElementsKind( |
3410 current_map, to_kind, INSERT_TRANSITION); | 3410 current_map, to_kind, INSERT_TRANSITION); |
3411 } | 3411 } |
3412 | 3412 |
3413 ASSERT(current_map->elements_kind() == to_kind); | 3413 ASSERT(current_map->elements_kind() == to_kind); |
3414 return current_map; | 3414 return current_map; |
3415 } | 3415 } |
3416 | 3416 |
3417 | 3417 |
3418 Handle<Map> JSObject::GetElementsTransitionMap(Handle<JSObject> object, | 3418 Handle<Map> Map::TransitionElementsTo(Handle<Map> map, |
3419 ElementsKind to_kind) { | 3419 ElementsKind to_kind) { |
3420 Isolate* isolate = object->GetIsolate(); | 3420 ElementsKind from_kind = map->elements_kind(); |
3421 Handle<Map> current_map(object->map()); | 3421 if (from_kind == to_kind) return map; |
3422 ElementsKind from_kind = current_map->elements_kind(); | |
3423 if (from_kind == to_kind) return current_map; | |
3424 | 3422 |
| 3423 Isolate* isolate = map->GetIsolate(); |
3425 Context* native_context = isolate->context()->native_context(); | 3424 Context* native_context = isolate->context()->native_context(); |
3426 Object* maybe_array_maps = native_context->js_array_maps(); | 3425 Object* maybe_array_maps = native_context->js_array_maps(); |
3427 if (maybe_array_maps->IsFixedArray()) { | 3426 if (maybe_array_maps->IsFixedArray()) { |
3428 DisallowHeapAllocation no_gc; | 3427 DisallowHeapAllocation no_gc; |
3429 FixedArray* array_maps = FixedArray::cast(maybe_array_maps); | 3428 FixedArray* array_maps = FixedArray::cast(maybe_array_maps); |
3430 if (array_maps->get(from_kind) == *current_map) { | 3429 if (array_maps->get(from_kind) == *map) { |
3431 Object* maybe_transitioned_map = array_maps->get(to_kind); | 3430 Object* maybe_transitioned_map = array_maps->get(to_kind); |
3432 if (maybe_transitioned_map->IsMap()) { | 3431 if (maybe_transitioned_map->IsMap()) { |
3433 return handle(Map::cast(maybe_transitioned_map)); | 3432 return handle(Map::cast(maybe_transitioned_map)); |
3434 } | 3433 } |
3435 } | 3434 } |
3436 } | 3435 } |
3437 | 3436 |
3438 return GetElementsTransitionMapSlow(object, to_kind); | 3437 return TransitionElementsToSlow(map, to_kind); |
3439 } | 3438 } |
3440 | 3439 |
3441 | 3440 |
3442 Handle<Map> JSObject::GetElementsTransitionMapSlow(Handle<JSObject> object, | 3441 Handle<Map> Map::TransitionElementsToSlow(Handle<Map> map, |
3443 ElementsKind to_kind) { | 3442 ElementsKind to_kind) { |
3444 Handle<Map> start_map(object->map()); | 3443 ElementsKind from_kind = map->elements_kind(); |
3445 ElementsKind from_kind = start_map->elements_kind(); | |
3446 | 3444 |
3447 if (from_kind == to_kind) { | 3445 if (from_kind == to_kind) { |
3448 return start_map; | 3446 return map; |
3449 } | 3447 } |
3450 | 3448 |
3451 bool allow_store_transition = | 3449 bool allow_store_transition = |
3452 // Only remember the map transition if there is not an already existing | 3450 // Only remember the map transition if there is not an already existing |
3453 // non-matching element transition. | 3451 // non-matching element transition. |
3454 !start_map->IsUndefined() && !start_map->is_shared() && | 3452 !map->IsUndefined() && !map->is_shared() && |
3455 IsTransitionElementsKind(from_kind); | 3453 IsTransitionElementsKind(from_kind); |
3456 | 3454 |
3457 // Only store fast element maps in ascending generality. | 3455 // Only store fast element maps in ascending generality. |
3458 if (IsFastElementsKind(to_kind)) { | 3456 if (IsFastElementsKind(to_kind)) { |
3459 allow_store_transition &= | 3457 allow_store_transition &= |
3460 IsTransitionableFastElementsKind(from_kind) && | 3458 IsTransitionableFastElementsKind(from_kind) && |
3461 IsMoreGeneralElementsKindTransition(from_kind, to_kind); | 3459 IsMoreGeneralElementsKindTransition(from_kind, to_kind); |
3462 } | 3460 } |
3463 | 3461 |
3464 if (!allow_store_transition) { | 3462 if (!allow_store_transition) { |
3465 return Map::CopyAsElementsKind(start_map, to_kind, OMIT_TRANSITION); | 3463 return Map::CopyAsElementsKind(map, to_kind, OMIT_TRANSITION); |
3466 } | 3464 } |
3467 | 3465 |
3468 return Map::AsElementsKind(start_map, to_kind); | 3466 return Map::AsElementsKind(map, to_kind); |
3469 } | 3467 } |
3470 | 3468 |
3471 | 3469 |
3472 // static | 3470 // static |
3473 Handle<Map> Map::AsElementsKind(Handle<Map> map, ElementsKind kind) { | 3471 Handle<Map> Map::AsElementsKind(Handle<Map> map, ElementsKind kind) { |
3474 Handle<Map> closest_map(FindClosestElementsTransition(*map, kind)); | 3472 Handle<Map> closest_map(FindClosestElementsTransition(*map, kind)); |
3475 | 3473 |
3476 if (closest_map->elements_kind() == kind) { | 3474 if (closest_map->elements_kind() == kind) { |
3477 return closest_map; | 3475 return closest_map; |
3478 } | 3476 } |
3479 | 3477 |
3480 return AddMissingElementsTransitions(closest_map, kind); | 3478 return AddMissingElementsTransitions(closest_map, kind); |
3481 } | 3479 } |
3482 | 3480 |
3483 | 3481 |
| 3482 Handle<Map> JSObject::GetElementsTransitionMap(Handle<JSObject> object, |
| 3483 ElementsKind to_kind) { |
| 3484 Handle<Map> map(object->map()); |
| 3485 return Map::TransitionElementsTo(map, to_kind); |
| 3486 } |
| 3487 |
| 3488 |
3484 void JSObject::LocalLookupRealNamedProperty(Handle<Name> name, | 3489 void JSObject::LocalLookupRealNamedProperty(Handle<Name> name, |
3485 LookupResult* result) { | 3490 LookupResult* result) { |
3486 DisallowHeapAllocation no_gc; | 3491 DisallowHeapAllocation no_gc; |
3487 if (IsJSGlobalProxy()) { | 3492 if (IsJSGlobalProxy()) { |
3488 Object* proto = GetPrototype(); | 3493 Object* proto = GetPrototype(); |
3489 if (proto->IsNull()) return result->NotFound(); | 3494 if (proto->IsNull()) return result->NotFound(); |
3490 ASSERT(proto->IsJSGlobalObject()); | 3495 ASSERT(proto->IsJSGlobalObject()); |
3491 return JSObject::cast(proto)->LocalLookupRealNamedProperty(name, result); | 3496 return JSObject::cast(proto)->LocalLookupRealNamedProperty(name, result); |
3492 } | 3497 } |
3493 | 3498 |
(...skipping 13626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17120 | 17125 |
17121 | 17126 |
17122 Handle<JSArrayBuffer> JSTypedArray::MaterializeArrayBuffer( | 17127 Handle<JSArrayBuffer> JSTypedArray::MaterializeArrayBuffer( |
17123 Handle<JSTypedArray> typed_array) { | 17128 Handle<JSTypedArray> typed_array) { |
17124 | 17129 |
17125 Handle<Map> map(typed_array->map()); | 17130 Handle<Map> map(typed_array->map()); |
17126 Isolate* isolate = typed_array->GetIsolate(); | 17131 Isolate* isolate = typed_array->GetIsolate(); |
17127 | 17132 |
17128 ASSERT(IsFixedTypedArrayElementsKind(map->elements_kind())); | 17133 ASSERT(IsFixedTypedArrayElementsKind(map->elements_kind())); |
17129 | 17134 |
| 17135 Handle<Map> new_map = Map::TransitionElementsTo( |
| 17136 map, |
| 17137 FixedToExternalElementsKind(map->elements_kind())); |
| 17138 |
17130 Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer(); | 17139 Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer(); |
17131 Handle<FixedTypedArrayBase> fixed_typed_array( | 17140 Handle<FixedTypedArrayBase> fixed_typed_array( |
17132 FixedTypedArrayBase::cast(typed_array->elements())); | 17141 FixedTypedArrayBase::cast(typed_array->elements())); |
17133 Runtime::SetupArrayBufferAllocatingData(isolate, buffer, | 17142 Runtime::SetupArrayBufferAllocatingData(isolate, buffer, |
17134 fixed_typed_array->DataSize(), false); | 17143 fixed_typed_array->DataSize(), false); |
17135 memcpy(buffer->backing_store(), | 17144 memcpy(buffer->backing_store(), |
17136 fixed_typed_array->DataPtr(), | 17145 fixed_typed_array->DataPtr(), |
17137 fixed_typed_array->DataSize()); | 17146 fixed_typed_array->DataSize()); |
17138 Handle<ExternalArray> new_elements = | 17147 Handle<ExternalArray> new_elements = |
17139 isolate->factory()->NewExternalArray( | 17148 isolate->factory()->NewExternalArray( |
17140 fixed_typed_array->length(), typed_array->type(), | 17149 fixed_typed_array->length(), typed_array->type(), |
17141 static_cast<uint8_t*>(buffer->backing_store())); | 17150 static_cast<uint8_t*>(buffer->backing_store())); |
17142 Handle<Map> new_map = JSObject::GetElementsTransitionMap( | |
17143 typed_array, | |
17144 FixedToExternalElementsKind(map->elements_kind())); | |
17145 | 17151 |
17146 buffer->set_weak_first_view(*typed_array); | 17152 buffer->set_weak_first_view(*typed_array); |
17147 ASSERT(typed_array->weak_next() == isolate->heap()->undefined_value()); | 17153 ASSERT(typed_array->weak_next() == isolate->heap()->undefined_value()); |
17148 typed_array->set_buffer(*buffer); | 17154 typed_array->set_buffer(*buffer); |
17149 JSObject::SetMapAndElements(typed_array, new_map, new_elements); | 17155 JSObject::SetMapAndElements(typed_array, new_map, new_elements); |
17150 | 17156 |
17151 return buffer; | 17157 return buffer; |
17152 } | 17158 } |
17153 | 17159 |
17154 | 17160 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17226 #define ERROR_MESSAGES_TEXTS(C, T) T, | 17232 #define ERROR_MESSAGES_TEXTS(C, T) T, |
17227 static const char* error_messages_[] = { | 17233 static const char* error_messages_[] = { |
17228 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 17234 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
17229 }; | 17235 }; |
17230 #undef ERROR_MESSAGES_TEXTS | 17236 #undef ERROR_MESSAGES_TEXTS |
17231 return error_messages_[reason]; | 17237 return error_messages_[reason]; |
17232 } | 17238 } |
17233 | 17239 |
17234 | 17240 |
17235 } } // namespace v8::internal | 17241 } } // namespace v8::internal |
OLD | NEW |