-
Notifications
You must be signed in to change notification settings - Fork 29.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
src: extract AllocatedBuffer from env.h
Cleanup up env.h by removing things that are not specific to `Environment`. PR-URL: #33291 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: David Carlier <devnexen@gmail.com>
- Loading branch information
1 parent
a8824ae
commit d8f040e
Showing
23 changed files
with
241 additions
and
161 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,110 @@ | ||
#ifndef SRC_ALLOCATED_BUFFER_INL_H_ | ||
#define SRC_ALLOCATED_BUFFER_INL_H_ | ||
|
||
#include "allocated_buffer.h" | ||
#include "base_object-inl.h" | ||
#include "node_buffer.h" | ||
#include "env-inl.h" | ||
#include "uv.h" | ||
#include "v8.h" | ||
#include "util-inl.h" | ||
#include "node_internals.h" | ||
|
||
namespace node { | ||
|
||
AllocatedBuffer AllocatedBuffer::AllocateManaged( | ||
Environment* env, | ||
size_t size, | ||
int flags) { | ||
char* data = flags & ALLOCATE_MANAGED_UNCHECKED ? | ||
env->AllocateUnchecked(size) : | ||
env->Allocate(size); | ||
if (data == nullptr) size = 0; | ||
return AllocatedBuffer(env, uv_buf_init(data, size)); | ||
} | ||
|
||
inline AllocatedBuffer::AllocatedBuffer(Environment* env, uv_buf_t buf) | ||
: env_(env), buffer_(buf) {} | ||
|
||
inline void AllocatedBuffer::Resize(size_t len) { | ||
// The `len` check is to make sure we don't end up with `nullptr` as our base. | ||
char* new_data = env_->Reallocate(buffer_.base, buffer_.len, | ||
len > 0 ? len : 1); | ||
CHECK_NOT_NULL(new_data); | ||
buffer_ = uv_buf_init(new_data, len); | ||
} | ||
|
||
inline uv_buf_t AllocatedBuffer::release() { | ||
uv_buf_t ret = buffer_; | ||
buffer_ = uv_buf_init(nullptr, 0); | ||
return ret; | ||
} | ||
|
||
inline char* AllocatedBuffer::data() { | ||
return buffer_.base; | ||
} | ||
|
||
inline const char* AllocatedBuffer::data() const { | ||
return buffer_.base; | ||
} | ||
|
||
inline size_t AllocatedBuffer::size() const { | ||
return buffer_.len; | ||
} | ||
|
||
inline AllocatedBuffer::AllocatedBuffer(Environment* env) | ||
: env_(env), buffer_(uv_buf_init(nullptr, 0)) {} | ||
|
||
inline AllocatedBuffer::AllocatedBuffer(AllocatedBuffer&& other) | ||
: AllocatedBuffer() { | ||
*this = std::move(other); | ||
} | ||
|
||
inline AllocatedBuffer& AllocatedBuffer::operator=(AllocatedBuffer&& other) { | ||
clear(); | ||
env_ = other.env_; | ||
buffer_ = other.release(); | ||
return *this; | ||
} | ||
|
||
inline AllocatedBuffer::~AllocatedBuffer() { | ||
clear(); | ||
} | ||
|
||
inline void AllocatedBuffer::clear() { | ||
uv_buf_t buf = release(); | ||
if (buf.base != nullptr) { | ||
CHECK_NOT_NULL(env_); | ||
env_->Free(buf.base, buf.len); | ||
} | ||
} | ||
|
||
inline v8::MaybeLocal<v8::Object> AllocatedBuffer::ToBuffer() { | ||
CHECK_NOT_NULL(env_); | ||
v8::MaybeLocal<v8::Object> obj = Buffer::New(env_, data(), size(), false); | ||
if (!obj.IsEmpty()) release(); | ||
return obj; | ||
} | ||
|
||
inline v8::Local<v8::ArrayBuffer> AllocatedBuffer::ToArrayBuffer() { | ||
CHECK_NOT_NULL(env_); | ||
uv_buf_t buf = release(); | ||
auto callback = [](void* data, size_t length, void* deleter_data){ | ||
CHECK_NOT_NULL(deleter_data); | ||
|
||
static_cast<v8::ArrayBuffer::Allocator*>(deleter_data) | ||
->Free(data, length); | ||
}; | ||
std::unique_ptr<v8::BackingStore> backing = | ||
v8::ArrayBuffer::NewBackingStore(buf.base, | ||
buf.len, | ||
callback, | ||
env_->isolate() | ||
->GetArrayBufferAllocator()); | ||
return v8::ArrayBuffer::New(env_->isolate(), | ||
std::move(backing)); | ||
} | ||
|
||
} // namespace node | ||
|
||
#endif // SRC_ALLOCATED_BUFFER_INL_H_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
#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" | ||
|
||
namespace node { | ||
|
||
class Environment; | ||
|
||
// A unique-pointer-ish object that is compatible with the JS engine's | ||
// ArrayBuffer::Allocator. | ||
struct AllocatedBuffer { | ||
public: | ||
enum AllocateManagedFlags { | ||
ALLOCATE_MANAGED_FLAG_NONE, | ||
ALLOCATE_MANAGED_UNCHECKED | ||
}; | ||
|
||
// 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, | ||
int flags = ALLOCATE_MANAGED_FLAG_NONE); | ||
|
||
explicit inline AllocatedBuffer(Environment* env = nullptr); | ||
inline AllocatedBuffer(Environment* env, uv_buf_t buf); | ||
inline ~AllocatedBuffer(); | ||
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<v8::Object> ToBuffer(); | ||
inline v8::Local<v8::ArrayBuffer> ToArrayBuffer(); | ||
|
||
inline AllocatedBuffer(AllocatedBuffer&& other); | ||
inline AllocatedBuffer& operator=(AllocatedBuffer&& other); | ||
AllocatedBuffer(const AllocatedBuffer& other) = delete; | ||
AllocatedBuffer& operator=(const AllocatedBuffer& other) = delete; | ||
|
||
private: | ||
Environment* env_; | ||
// We do not pass this to libuv directly, but uv_buf_t is a convenient way | ||
// to represent a chunk of memory, and plays nicely with other parts of core. | ||
uv_buf_t buffer_; | ||
|
||
friend class Environment; | ||
}; | ||
|
||
} // namespace node | ||
|
||
#endif // NODE_WANT_INTERNALS | ||
|
||
#endif // SRC_ALLOCATED_BUFFER_H_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.