#ifndef SRC_ALLOCATED_BUFFER_H_ #define SRC_ALLOCATED_BUFFER_H_ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS #include "base_object.h" #include "uv.h" #include "v8.h" #include "env.h" namespace node { class Environment; // Disables zero-filling for ArrayBuffer allocations in this scope. This is // similar to how we implement Buffer.allocUnsafe() in JS land. class NoArrayBufferZeroFillScope{ public: inline explicit NoArrayBufferZeroFillScope(IsolateData* isolate_data); inline ~NoArrayBufferZeroFillScope(); private: NodeArrayBufferAllocator* node_allocator_; friend class Environment; }; // A unique-pointer-ish object that is compatible with the JS engine's // ArrayBuffer::Allocator. // TODO(addaleax): We may want to start phasing this out as it's only a // thin wrapper around v8::BackingStore at this point struct AllocatedBuffer { public: // Utilities that allocate memory using the Isolate's ArrayBuffer::Allocator. // In particular, using AllocateManaged() will provide a RAII-style object // with easy conversion to `Buffer` and `ArrayBuffer` objects. inline static AllocatedBuffer AllocateManaged(Environment* env, size_t size); AllocatedBuffer() = default; inline AllocatedBuffer( Environment* env, std::unique_ptr bs); // For this constructor variant, `buffer` *must* come from an earlier call // to .release inline AllocatedBuffer(Environment* env, uv_buf_t buffer); inline void Resize(size_t len); inline uv_buf_t release(); inline char* data(); inline const char* data() const; inline size_t size() const; inline void clear(); inline v8::MaybeLocal ToBuffer(); inline v8::Local ToArrayBuffer(); AllocatedBuffer(AllocatedBuffer&& other) = default; AllocatedBuffer& operator=(AllocatedBuffer&& other) = default; AllocatedBuffer(const AllocatedBuffer& other) = delete; AllocatedBuffer& operator=(const AllocatedBuffer& other) = delete; private: Environment* env_ = nullptr; std::unique_ptr backing_store_; friend class Environment; }; } // namespace node #endif // NODE_WANT_INTERNALS #endif // SRC_ALLOCATED_BUFFER_H_