| Index: src/builtins.cc
|
| diff --git a/src/builtins.cc b/src/builtins.cc
|
| index ce30b4ffa409e8d37f71ca397a4db255413a9e20..88dae2948c1f7491d4dc95c6dbed1d3e47c6631a 100644
|
| --- a/src/builtins.cc
|
| +++ b/src/builtins.cc
|
| @@ -2129,6 +2129,66 @@ BUILTIN(ObjectProtoToString) {
|
| }
|
|
|
|
|
| +// 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);
|
| + Handle<JSFunction> target = args.target();
|
| + Handle<JSReceiver> new_target = Handle<JSReceiver>::cast(args.new_target());
|
| + Handle<Object> length = args.atOrUndefined(isolate, 1);
|
| + DCHECK(*target == target->native_context()->array_buffer_fun() ||
|
| + *target == target->native_context()->shared_array_buffer_fun());
|
| + Handle<Object> number_length;
|
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, number_length,
|
| + Object::ToInteger(isolate, length));
|
| + if (number_length->Number() < 0.0) {
|
| + 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));
|
| + size_t byte_length;
|
| + if (!TryNumberToSize(isolate, *number_length, &byte_length)) {
|
| + THROW_NEW_ERROR_RETURN_FAILURE(
|
| + isolate, NewRangeError(MessageTemplate::kInvalidArrayBufferLength));
|
| + }
|
| + 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());
|
| +}
|
| +
|
| +
|
| // ES6 section 26.2.1.1 Proxy ( target, handler ) for the [[Call]] case.
|
| BUILTIN(ProxyConstructor) {
|
| HandleScope scope(isolate);
|
|
|