Chromium Code Reviews| Index: src/runtime.cc |
| diff --git a/src/runtime.cc b/src/runtime.cc |
| index 306042f4ea65601e0e4ed3c5fe57ee08937be87c..8b212a6c2f778482648db26cee25601b96296ed5 100644 |
| --- a/src/runtime.cc |
| +++ b/src/runtime.cc |
| @@ -875,11 +875,17 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayBufferIsView) { |
| void Runtime::ArrayIdToTypeAndSize( |
| - int arrayId, ExternalArrayType* array_type, size_t* element_size) { |
| + int arrayId, |
| + ExternalArrayType* array_type, |
| + ElementsKind* external_elements_kind, |
| + ElementsKind* fixed_elements_kind, |
| + size_t* element_size) { |
| switch (arrayId) { |
| #define ARRAY_ID_CASE(Type, type, TYPE, ctype, size) \ |
| case ARRAY_ID_##TYPE: \ |
| *array_type = kExternal##Type##Array; \ |
| + *external_elements_kind = EXTERNAL_##TYPE##_ELEMENTS; \ |
| + *fixed_elements_kind = TYPE##_ELEMENTS; \ |
| *element_size = size; \ |
| break; |
| @@ -897,7 +903,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitialize) { |
| ASSERT(args.length() == 5); |
| CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0); |
| CONVERT_SMI_ARG_CHECKED(arrayId, 1); |
| - CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, buffer, 2); |
| + CONVERT_ARG_HANDLE_CHECKED(Object, maybe_buffer, 2); |
| CONVERT_ARG_HANDLE_CHECKED(Object, byte_offset_object, 3); |
| CONVERT_ARG_HANDLE_CHECKED(Object, byte_length_object, 4); |
| @@ -909,9 +915,14 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitialize) { |
| ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization. |
| size_t element_size = 1; // Bogus initialization. |
| - Runtime::ArrayIdToTypeAndSize(arrayId, &array_type, &element_size); |
| + ElementsKind external_elements_kind = EXTERNAL_INT8_ELEMENTS; |
| + ElementsKind fixed_elements_kind = INT8_ELEMENTS; |
| + Runtime::ArrayIdToTypeAndSize(arrayId, |
| + &array_type, |
| + &external_elements_kind, |
| + &fixed_elements_kind, |
| + &element_size); |
| - holder->set_buffer(*buffer); |
| holder->set_byte_offset(*byte_offset_object); |
| holder->set_byte_length(*byte_length_object); |
| @@ -928,14 +939,33 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitialize) { |
| Handle<Object> length_obj = isolate->factory()->NewNumberFromSize(length); |
| holder->set_length(*length_obj); |
| - holder->set_weak_next(buffer->weak_first_view()); |
| - buffer->set_weak_first_view(*holder); |
| - |
| - Handle<ExternalArray> elements = |
| - isolate->factory()->NewExternalArray( |
| - static_cast<int>(length), array_type, |
| - static_cast<uint8_t*>(buffer->backing_store()) + byte_offset); |
| - holder->set_elements(*elements); |
| + if (!maybe_buffer->IsNull()) { |
| + Handle<JSArrayBuffer> buffer(JSArrayBuffer::cast(*maybe_buffer)); |
| + holder->set_buffer(*buffer); |
| + holder->set_weak_next(buffer->weak_first_view()); |
| + buffer->set_weak_first_view(*holder); |
| + |
| + Handle<ExternalArray> elements = |
| + isolate->factory()->NewExternalArray( |
| + static_cast<int>(length), array_type, |
| + static_cast<uint8_t*>(buffer->backing_store()) + byte_offset); |
| + Handle<Map> map = |
| + isolate->factory()->GetElementsTransitionMap( |
| + holder, external_elements_kind); |
| +#ifdef DEBUG |
| + holder->map()->Print(); |
|
mvstanton
2014/03/03 10:37:49
Remove this debugging code.
Dmitry Lomov (no reviews)
2014/03/10 09:20:35
Done.
|
| + map->Print(); |
| +#endif |
| + holder->set_map_and_elements(*map, *elements); |
| + ASSERT(IsExternalArrayElementsKind(holder->map()->elements_kind())); |
| + } else { |
| + holder->set_buffer(Smi::FromInt(0)); |
| + holder->set_weak_next(isolate->heap()->undefined_value()); |
| + Handle<FixedTypedArrayBase> elements = |
| + isolate->factory()->NewFixedTypedArray( |
| + static_cast<int>(length), array_type); |
| + holder->set_elements(*elements); |
| + } |
| return isolate->heap()->undefined_value(); |
| } |
| @@ -961,7 +991,13 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitializeFromArrayLike) { |
| ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization. |
| size_t element_size = 1; // Bogus initialization. |
| - Runtime::ArrayIdToTypeAndSize(arrayId, &array_type, &element_size); |
| + ElementsKind external_elements_kind; |
| + ElementsKind fixed_elements_kind; |
| + Runtime::ArrayIdToTypeAndSize(arrayId, |
| + &array_type, |
| + &external_elements_kind, |
| + &fixed_elements_kind, |
| + &element_size); |
| Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer(); |
| size_t length = NumberToSize(isolate, *length_obj); |
| @@ -1010,7 +1046,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitializeFromArrayLike) { |
| isolate->factory()->NewExternalArray( |
| static_cast<int>(length), array_type, |
| static_cast<uint8_t*>(buffer->backing_store())); |
| - holder->set_elements(*elements); |
| + Handle<Map> map = |
| + isolate->factory()->GetElementsTransitionMap( |
| + holder, external_elements_kind); |
| + holder->set_map_and_elements(*map, *elements); |
| if (source->IsJSTypedArray()) { |
| Handle<JSTypedArray> typed_array(JSTypedArray::cast(*source)); |
| @@ -1018,7 +1057,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitializeFromArrayLike) { |
| if (typed_array->type() == holder->type()) { |
| uint8_t* backing_store = |
| static_cast<uint8_t*>( |
| - JSArrayBuffer::cast(typed_array->buffer())->backing_store()); |
| + typed_array->GetBuffer()->backing_store()); |
| size_t source_byte_offset = |
| NumberToSize(isolate, typed_array->byte_offset()); |
| memcpy( |
|
mvstanton
2014/03/03 10:37:49
Could the memcpy code in this block be encapsulate
Dmitry Lomov (no reviews)
2014/03/10 09:20:35
Maybe, but maybe in separate CL?
mvstanton
2014/03/11 10:43:51
Yep, okay. It seems weird to me to see primitive m
|
| @@ -1047,13 +1086,24 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitializeFromArrayLike) { |
| return typed_array->accessor(); \ |
| } |
| -TYPED_ARRAY_GETTER(Buffer, buffer) |
| TYPED_ARRAY_GETTER(ByteLength, byte_length) |
| TYPED_ARRAY_GETTER(ByteOffset, byte_offset) |
| TYPED_ARRAY_GETTER(Length, length) |
| #undef TYPED_ARRAY_GETTER |
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayGetBuffer) { |
| + HandleScope scope(isolate); |
| + ASSERT(args.length() == 1); |
| + CONVERT_ARG_HANDLE_CHECKED(Object, holder, 0); |
| + if (!holder->IsJSTypedArray()) |
| + return isolate->Throw(*isolate->factory()->NewTypeError( |
| + "not_typed_array", HandleVector<Object>(NULL, 0))); |
| + Handle<JSTypedArray> typed_array(JSTypedArray::cast(*holder)); |
| + return *typed_array->GetBuffer(); |
| +} |
| + |
| + |
| // Return codes for Runtime_TypedArraySetFastCases. |
| // Should be synchronized with typedarray.js natives. |
| enum TypedArraySetResultCodes { |
| @@ -1099,10 +1149,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArraySetFastCases) { |
| size_t source_offset = NumberToSize(isolate, source->byte_offset()); |
| uint8_t* target_base = |
| static_cast<uint8_t*>( |
| - JSArrayBuffer::cast(target->buffer())->backing_store()) + target_offset; |
| + target->GetBuffer()->backing_store()) + target_offset; |
| uint8_t* source_base = |
| static_cast<uint8_t*>( |
| - JSArrayBuffer::cast(source->buffer())->backing_store()) + source_offset; |
| + source->GetBuffer()->backing_store()) + source_offset; |
| // Typed arrays of the same type: use memmove. |
| if (target->type() == source->type()) { |
| @@ -1118,8 +1168,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArraySetFastCases) { |
| target_base + target_byte_length > source_base)) { |
| // We do not support overlapping ArrayBuffers |
| ASSERT( |
| - JSArrayBuffer::cast(target->buffer())->backing_store() == |
| - JSArrayBuffer::cast(source->buffer())->backing_store()); |
| + target->GetBuffer()->backing_store() == |
| + source->GetBuffer()->backing_store()); |
| return Smi::FromInt(TYPED_ARRAY_SET_TYPED_ARRAY_OVERLAPPING); |
| } else { // Non-overlapping typed arrays |
| return Smi::FromInt(TYPED_ARRAY_SET_TYPED_ARRAY_NONOVERLAPPING); |
| @@ -1127,6 +1177,11 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArraySetFastCases) { |
| } |
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInHeapThreshold) { |
| + return Smi::FromInt(FLAG_typed_array_in_heap_threshold); |
| +} |
| + |
| + |
| RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewInitialize) { |
| HandleScope scope(isolate); |
| ASSERT(args.length() == 4); |
| @@ -14618,6 +14673,17 @@ TYPED_ARRAYS(TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION) |
| #undef TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION |
| +#define FIXED_TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION(Type, type, TYPE, ctype, s) \ |
| + RUNTIME_FUNCTION(MaybeObject*, Runtime_HasFixed##Type##Elements) { \ |
| + CONVERT_ARG_CHECKED(JSObject, obj, 0); \ |
| + return isolate->heap()->ToBoolean(obj->HasFixed##Type##Elements()); \ |
| + } |
| + |
| +TYPED_ARRAYS(FIXED_TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION) |
| + |
| +#undef FIXED_TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION |
| + |
| + |
| RUNTIME_FUNCTION(MaybeObject*, Runtime_HaveSameMap) { |
| SealHandleScope shs(isolate); |
| ASSERT(args.length() == 2); |