|
@@ -17,6 +17,18 @@ void DataViewPrototype::initialize(GlobalObject& global_object)
|
|
|
{
|
|
|
auto& vm = this->vm();
|
|
|
Object::initialize(global_object);
|
|
|
+ u8 attr = Attribute::Writable | Attribute::Configurable;
|
|
|
+
|
|
|
+ define_native_function(vm.names.getBigInt64, get_big_int_64, 1, attr);
|
|
|
+ define_native_function(vm.names.getBigUint64, get_big_uint_64, 1, attr);
|
|
|
+ define_native_function(vm.names.getFloat32, get_float_32, 1, attr);
|
|
|
+ define_native_function(vm.names.getFloat64, get_float_64, 1, attr);
|
|
|
+ define_native_function(vm.names.getInt8, get_int_8, 1, attr);
|
|
|
+ define_native_function(vm.names.getInt16, get_int_16, 1, attr);
|
|
|
+ define_native_function(vm.names.getInt32, get_int_32, 1, attr);
|
|
|
+ define_native_function(vm.names.getUint8, get_uint_8, 1, attr);
|
|
|
+ define_native_function(vm.names.getUint16, get_uint_16, 1, attr);
|
|
|
+ define_native_function(vm.names.getUint32, get_uint_32, 1, attr);
|
|
|
|
|
|
define_native_accessor(vm.names.buffer, buffer_getter, {}, Attribute::Configurable);
|
|
|
define_native_accessor(vm.names.byteLength, byte_length_getter, {}, Attribute::Configurable);
|
|
@@ -40,6 +52,99 @@ static DataView* typed_this(VM& vm, GlobalObject& global_object)
|
|
|
return static_cast<DataView*>(&this_value.as_object());
|
|
|
}
|
|
|
|
|
|
+// 25.3.1.1 GetViewValue ( view, requestIndex, isLittleEndian, type ), https://tc39.es/ecma262/#sec-getviewvalue
|
|
|
+template<typename T>
|
|
|
+static Value get_view_value(GlobalObject& global_object, Value request_index, Value is_little_endian)
|
|
|
+{
|
|
|
+ auto& vm = global_object.vm();
|
|
|
+ auto* view = typed_this(vm, global_object);
|
|
|
+ if (!view)
|
|
|
+ return {};
|
|
|
+
|
|
|
+ auto get_index = request_index.to_index(global_object);
|
|
|
+ if (vm.exception())
|
|
|
+ return {};
|
|
|
+ auto little_endian = is_little_endian.to_boolean();
|
|
|
+
|
|
|
+ auto buffer = view->viewed_array_buffer();
|
|
|
+ if (buffer->is_detached()) {
|
|
|
+ vm.throw_exception<TypeError>(global_object, ErrorType::DetachedArrayBuffer);
|
|
|
+ return {};
|
|
|
+ }
|
|
|
+
|
|
|
+ auto view_offset = view->byte_offset();
|
|
|
+ auto view_size = view->byte_length();
|
|
|
+
|
|
|
+ auto element_size = sizeof(T);
|
|
|
+ if (get_index + element_size > view_size) {
|
|
|
+ vm.throw_exception<RangeError>(global_object, ErrorType::DataViewOutOfRangeByteOffset, get_index, view_size);
|
|
|
+ return {};
|
|
|
+ }
|
|
|
+
|
|
|
+ auto buffer_index = get_index + view_offset;
|
|
|
+ return buffer->get_value<T>(buffer_index, false, ArrayBuffer::Order::Unordered, little_endian);
|
|
|
+}
|
|
|
+
|
|
|
+// 25.3.4.5 DataView.prototype.getBigInt64 ( byteOffset [ , littleEndian ] ), https://tc39.es/ecma262/#sec-dataview.prototype.getbigint64
|
|
|
+JS_DEFINE_NATIVE_FUNCTION(DataViewPrototype::get_big_int_64)
|
|
|
+{
|
|
|
+ return get_view_value<i64>(global_object, vm.argument(0), vm.argument(1));
|
|
|
+}
|
|
|
+
|
|
|
+// 25.3.4.6 DataView.prototype.getBigUint64 ( byteOffset [ , littleEndian ] ), https://tc39.es/ecma262/#sec-dataview.prototype.getbiguint64
|
|
|
+JS_DEFINE_NATIVE_FUNCTION(DataViewPrototype::get_big_uint_64)
|
|
|
+{
|
|
|
+ return get_view_value<u64>(global_object, vm.argument(0), vm.argument(1));
|
|
|
+}
|
|
|
+
|
|
|
+// 25.3.4.7 DataView.prototype.getFloat32 ( byteOffset [ , littleEndian ] ), https://tc39.es/ecma262/#sec-dataview.prototype.getfloat32
|
|
|
+JS_DEFINE_NATIVE_FUNCTION(DataViewPrototype::get_float_32)
|
|
|
+{
|
|
|
+ return get_view_value<float>(global_object, vm.argument(0), vm.argument(1));
|
|
|
+}
|
|
|
+
|
|
|
+// 25.3.4.8 DataView.prototype.getFloat64 ( byteOffset [ , littleEndian ] ), https://tc39.es/ecma262/#sec-dataview.prototype.getfloat64
|
|
|
+JS_DEFINE_NATIVE_FUNCTION(DataViewPrototype::get_float_64)
|
|
|
+{
|
|
|
+ return get_view_value<double>(global_object, vm.argument(0), vm.argument(1));
|
|
|
+}
|
|
|
+
|
|
|
+// 25.3.4.9 DataView.prototype.getInt8 ( byteOffset ), https://tc39.es/ecma262/#sec-dataview.prototype.getint8
|
|
|
+JS_DEFINE_NATIVE_FUNCTION(DataViewPrototype::get_int_8)
|
|
|
+{
|
|
|
+ return get_view_value<i8>(global_object, vm.argument(0), Value(true));
|
|
|
+}
|
|
|
+
|
|
|
+// 25.3.4.10 DataView.prototype.getInt16 ( byteOffset [ , littleEndian ] ), https://tc39.es/ecma262/#sec-dataview.prototype.getint16
|
|
|
+JS_DEFINE_NATIVE_FUNCTION(DataViewPrototype::get_int_16)
|
|
|
+{
|
|
|
+ return get_view_value<i16>(global_object, vm.argument(0), vm.argument(1));
|
|
|
+}
|
|
|
+
|
|
|
+// 25.3.4.11 DataView.prototype.getInt32 ( byteOffset [ , littleEndian ] ), https://tc39.es/ecma262/#sec-dataview.prototype.getint32
|
|
|
+JS_DEFINE_NATIVE_FUNCTION(DataViewPrototype::get_int_32)
|
|
|
+{
|
|
|
+ return get_view_value<i32>(global_object, vm.argument(0), vm.argument(1));
|
|
|
+}
|
|
|
+
|
|
|
+// 25.3.4.12 DataView.prototype.getUint8 ( byteOffset ), https://tc39.es/ecma262/#sec-dataview.prototype.getuint8
|
|
|
+JS_DEFINE_NATIVE_FUNCTION(DataViewPrototype::get_uint_8)
|
|
|
+{
|
|
|
+ return get_view_value<u8>(global_object, vm.argument(0), Value(true));
|
|
|
+}
|
|
|
+
|
|
|
+// 25.3.4.13 DataView.prototype.getUint16 ( byteOffset [ , littleEndian ] ), https://tc39.es/ecma262/#sec-dataview.prototype.getuint16
|
|
|
+JS_DEFINE_NATIVE_FUNCTION(DataViewPrototype::get_uint_16)
|
|
|
+{
|
|
|
+ return get_view_value<u16>(global_object, vm.argument(0), vm.argument(1));
|
|
|
+}
|
|
|
+
|
|
|
+// 25.3.4.14 DataView.prototype.getUint32 ( byteOffset [ , littleEndian ] ), https://tc39.es/ecma262/#sec-dataview.prototype.getuint32
|
|
|
+JS_DEFINE_NATIVE_FUNCTION(DataViewPrototype::get_uint_32)
|
|
|
+{
|
|
|
+ return get_view_value<u32>(global_object, vm.argument(0), vm.argument(1));
|
|
|
+}
|
|
|
+
|
|
|
// 25.3.4.1 get DataView.prototype.buffer, https://tc39.es/ecma262/#sec-get-dataview.prototype.buffer
|
|
|
JS_DEFINE_NATIVE_GETTER(DataViewPrototype::buffer_getter)
|
|
|
{
|