Chromium Code Reviews| Index: src/factory.cc |
| diff --git a/src/factory.cc b/src/factory.cc |
| index 0adc8730f5f31b01dc406963988bed5ad7005390..087cbdfddc3d8f1bc681fac1d541167d355dcffb 100644 |
| --- a/src/factory.cc |
| +++ b/src/factory.cc |
| @@ -1716,8 +1716,22 @@ Handle<JSDataView> Factory::NewJSDataView() { |
| } |
| -static JSFunction* GetTypedArrayFun(ExternalArrayType type, |
| - Isolate* isolate) { |
| +namespace { |
| + |
| +ElementsKind GetExternalArrayElementsKind(ExternalArrayType type) { |
| + switch (type) { |
| +#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ |
| + case kExternal##Type##Array: \ |
| + return EXTERNAL_##TYPE##_ELEMENTS; |
| + TYPED_ARRAYS(TYPED_ARRAY_CASE) |
| + } |
| + UNREACHABLE(); |
| + return FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND; |
| +#undef TYPED_ARRAY_CASE |
| +} |
| + |
| + |
| +JSFunction* GetTypedArrayFun(ExternalArrayType type, Isolate* isolate) { |
| Context* native_context = isolate->context()->native_context(); |
| switch (type) { |
| #define TYPED_ARRAY_FUN(Type, type, TYPE, ctype, size) \ |
| @@ -1733,6 +1747,8 @@ static JSFunction* GetTypedArrayFun(ExternalArrayType type, |
| } |
| } |
| +} // namespace |
| + |
| Handle<JSTypedArray> Factory::NewJSTypedArray(ExternalArrayType type) { |
| Handle<JSFunction> typed_array_fun_handle(GetTypedArrayFun(type, isolate())); |
| @@ -1744,6 +1760,27 @@ Handle<JSTypedArray> Factory::NewJSTypedArray(ExternalArrayType type) { |
| } |
| +Handle<JSTypedArray> Factory::NewJSTypedArray(ExternalArrayType type, |
| + Handle<JSArrayBuffer> buffer, |
| + size_t length) { |
| + DCHECK(length <= static_cast<size_t>(kMaxInt)); |
| + Handle<JSTypedArray> array = NewJSTypedArray(type); |
| + array->set_buffer(*buffer); |
| + array->set_weak_next(buffer->weak_first_view()); |
| + buffer->set_weak_first_view(*array); |
| + array->set_byte_offset(Smi::FromInt(0)); |
| + array->set_byte_length(buffer->byte_length()); |
| + array->set_length(*NewNumberFromSize(length)); |
|
Michael Starzinger
2014/10/02 08:33:06
This is not handle-safe I think, GCMole will shout
|
| + Handle<ExternalArray> elements = |
| + NewExternalArray(static_cast<int>(length), type, buffer->backing_store()); |
| + JSObject::SetMapAndElements(array, |
| + JSObject::GetElementsTransitionMap( |
| + array, GetExternalArrayElementsKind(type)), |
| + elements); |
| + return array; |
| +} |
| + |
| + |
| Handle<JSProxy> Factory::NewJSProxy(Handle<Object> handler, |
| Handle<Object> prototype) { |
| // Allocate map. |