5 #include "src/builtins/builtins-utils-inl.h" 6 #include "src/builtins/builtins.h" 7 #include "src/conversions.h" 8 #include "src/counters.h" 9 #include "src/heap/factory.h" 10 #include "src/isolate.h" 11 #include "src/objects-inl.h" 12 #include "src/objects/js-array-buffer-inl.h" 21 BUILTIN(DataViewConstructor) {
22 HandleScope scope(isolate);
23 if (args.new_target()->IsUndefined(isolate)) {
24 THROW_NEW_ERROR_RETURN_FAILURE(
25 isolate, NewTypeError(MessageTemplate::kConstructorNotFunction,
26 isolate->factory()->NewStringFromAsciiChecked(
30 Handle<JSFunction> target = args.target();
31 Handle<JSReceiver> new_target = Handle<JSReceiver>::cast(args.new_target());
32 Handle<Object> buffer = args.atOrUndefined(isolate, 1);
33 Handle<Object> byte_offset = args.atOrUndefined(isolate, 2);
34 Handle<Object> byte_length = args.atOrUndefined(isolate, 3);
39 if (!buffer->IsJSArrayBuffer()) {
40 THROW_NEW_ERROR_RETURN_FAILURE(
41 isolate, NewTypeError(MessageTemplate::kDataViewNotArrayBuffer));
43 Handle<JSArrayBuffer> array_buffer = Handle<JSArrayBuffer>::cast(buffer);
46 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
48 Object::ToIndex(isolate, byte_offset, MessageTemplate::kInvalidOffset));
49 size_t view_byte_offset = byte_offset->Number();
56 size_t const buffer_byte_length = array_buffer->byte_length();
59 if (view_byte_offset > buffer_byte_length) {
60 THROW_NEW_ERROR_RETURN_FAILURE(
61 isolate, NewRangeError(MessageTemplate::kInvalidOffset, byte_offset));
64 size_t view_byte_length;
65 if (byte_length->IsUndefined(isolate)) {
68 view_byte_length = buffer_byte_length - view_byte_offset;
74 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
76 Object::ToIndex(isolate, byte_length,
77 MessageTemplate::kInvalidDataViewLength));
78 if (view_byte_offset + byte_length->Number() > buffer_byte_length) {
79 THROW_NEW_ERROR_RETURN_FAILURE(
80 isolate, NewRangeError(MessageTemplate::kInvalidDataViewLength));
82 view_byte_length = byte_length->Number();
88 Handle<JSObject> result;
89 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
91 JSObject::New(target, new_target, Handle<AllocationSite>::null()));
92 for (
int i = 0;
i < ArrayBufferView::kEmbedderFieldCount; ++
i) {
93 Handle<JSDataView>::cast(result)->SetEmbedderField(
i, Smi::kZero);
97 Handle<JSDataView>::cast(result)->set_buffer(*array_buffer);
100 Handle<JSDataView>::cast(result)->set_byte_length(view_byte_length);
103 Handle<JSDataView>::cast(result)->set_byte_offset(view_byte_offset);