Chromium Code Reviews| Index: src/builtins.cc |
| diff --git a/src/builtins.cc b/src/builtins.cc |
| index ba6eec3306b1d7cb8e022b4d8378d8f69e175579..3712af0da0f10b13e0d70a35aac5d5e66eb02577 100644 |
| --- a/src/builtins.cc |
| +++ b/src/builtins.cc |
| @@ -1744,6 +1744,66 @@ BUILTIN(SymbolConstructor_ConstructStub) { |
| } |
| +// ES6 section 24.1.2.1 ArrayBuffer( length ) for the [[Call]] case. |
| +BUILTIN(ArrayBufferConstructor) { |
| + HandleScope scope(isolate); |
| + Handle<JSFunction> target = args.target(); |
| + DCHECK(*target == target->native_context()->array_buffer_fun() || |
| + *target == target->native_context()->shared_array_buffer_fun()); |
| + THROW_NEW_ERROR_RETURN_FAILURE( |
| + isolate, NewTypeError(MessageTemplate::kConstructorNotFunction, |
| + handle(target->shared()->name(), isolate))); |
| +} |
| + |
| + |
| +// ES6 section 24.1.2.1 ArrayBuffer( length ) for the [[Construct]] case. |
| +BUILTIN(ArrayBufferConstructor_ConstructStub) { |
| + HandleScope scope(isolate); |
| + DCHECK_EQ(2, args.length()); |
| + Handle<JSFunction> target = args.target(); |
| + Handle<JSReceiver> new_target = Handle<JSReceiver>::cast(args.new_target()); |
| + Handle<Object> length = args.at<Object>(1); |
| + DCHECK(*target == target->native_context()->array_buffer_fun() || |
| + *target == target->native_context()->shared_array_buffer_fun()); |
| + // The ConstructStub is executed in the context of the caller, so we need |
| + // to enter the callee context first before raising an exception. |
| + isolate->set_context(args.target()->context()); |
| + Handle<Object> number_length; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, number_length, |
|
Camillo Bruni
2015/12/03 14:58:28
shouldn't the byteLength conversion happen after c
Benedikt Meurer
2015/12/03 15:24:56
No, for builtins the creation happens later.
|
| + Object::ToNumber(length)); |
| + size_t byte_length; |
| + if (!TryNumberToSize(isolate, *number_length, &byte_length)) { |
| + THROW_NEW_ERROR_RETURN_FAILURE( |
| + isolate, NewRangeError(MessageTemplate::kInvalidArrayBufferLength)); |
| + } |
| + Handle<Map> initial_map; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, initial_map, |
| + JSFunction::GetDerivedMap(isolate, target, new_target)); |
| + Handle<JSArrayBuffer> result = Handle<JSArrayBuffer>::cast( |
| + isolate->factory()->NewJSObjectFromMap(initial_map)); |
| + SharedFlag shared_flag = |
| + (*target == target->native_context()->array_buffer_fun()) |
| + ? SharedFlag::kNotShared |
| + : SharedFlag::kShared; |
| + if (!JSArrayBuffer::SetupAllocatingData(result, isolate, byte_length, true, |
| + shared_flag)) { |
| + THROW_NEW_ERROR_RETURN_FAILURE( |
| + isolate, NewRangeError(MessageTemplate::kArrayBufferAllocationFailed)); |
| + } |
| + return *result; |
| +} |
| + |
| + |
| +// ES6 section 24.1.3.1 ArrayBuffer.isView ( arg ) |
| +BUILTIN(ArrayBufferIsView) { |
| + SealHandleScope shs(isolate); |
| + DCHECK_EQ(2, args.length()); |
| + Object* arg = args[1]; |
| + return isolate->heap()->ToBoolean(arg->IsJSArrayBufferView()); |
| +} |
| + |
| + |
| namespace { |
| // ES6 section 9.5.15 ProxyCreate (target, handler) |