/* * Copyright (c) 2021, Idan Horowitz * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include namespace JS { class DataView : public Object { JS_OBJECT(DataView, Object); JS_DECLARE_ALLOCATOR(DataView); public: static NonnullGCPtr create(Realm&, ArrayBuffer*, ByteLength byte_length, size_t byte_offset); virtual ~DataView() override = default; ArrayBuffer* viewed_array_buffer() const { return m_viewed_array_buffer; } ByteLength const& byte_length() const { return m_byte_length; } size_t byte_offset() const { return m_byte_offset; } private: DataView(ArrayBuffer*, ByteLength byte_length, size_t byte_offset, Object& prototype); virtual void visit_edges(Visitor& visitor) override; GCPtr m_viewed_array_buffer; ByteLength m_byte_length { 0 }; size_t m_byte_offset { 0 }; }; // 25.3.1.1 DataView With Buffer Witness Records, https://tc39.es/ecma262/#sec-dataview-with-buffer-witness-records struct DataViewWithBufferWitness { NonnullGCPtr object; // [[Object]] ByteLength cached_buffer_byte_length; // [[CachedBufferByteLength]] }; DataViewWithBufferWitness make_data_view_with_buffer_witness_record(DataView const&, ArrayBuffer::Order); u32 get_view_byte_length(DataViewWithBufferWitness const&); bool is_view_out_of_bounds(DataViewWithBufferWitness const&); }