| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent a8824ae commit d8f040e
23 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -642,6 +642,8 @@ | |||
| 642 | 642 | 'src/aliased_buffer.h', | |
| 643 | 643 | 'src/aliased_struct.h', | |
| 644 | 644 | 'src/aliased_struct-inl.h', | |
| 645 | + 'src/allocated_buffer.h', | ||
| 646 | + 'src/allocated_buffer-inl.h' | ||
| 645 | 647 | 'src/async_wrap.h', | |
| 646 | 648 | 'src/async_wrap-inl.h', | |
| 647 | 649 | 'src/base_object.h', | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,110 @@ | |||
| 1 | + #ifndef SRC_ALLOCATED_BUFFER_INL_H_ | ||
| 2 | + #define SRC_ALLOCATED_BUFFER_INL_H_ | ||
| 3 | + | ||
| 4 | + #include "allocated_buffer.h" | ||
| 5 | + #include "base_object-inl.h" | ||
| 6 | + #include "node_buffer.h" | ||
| 7 | + #include "env-inl.h" | ||
| 8 | + #include "uv.h" | ||
| 9 | + #include "v8.h" | ||
| 10 | + #include "util-inl.h" | ||
| 11 | + #include "node_internals.h" | ||
| 12 | + | ||
| 13 | + namespace node { | ||
| 14 | + | ||
| 15 | + AllocatedBuffer AllocatedBuffer::AllocateManaged( | ||
| 16 | + Environment* env, | ||
| 17 | + size_t size, | ||
| 18 | + int flags) { | ||
| 19 | + char* data = flags & ALLOCATE_MANAGED_UNCHECKED ? | ||
| 20 | + env->AllocateUnchecked(size) : | ||
| 21 | + env->Allocate(size); | ||
| 22 | + if (data == nullptr) size = 0; | ||
| 23 | + return AllocatedBuffer(env, uv_buf_init(data, size)); | ||
| 24 | + } | ||
| 25 | + | ||
| 26 | + inline AllocatedBuffer::AllocatedBuffer(Environment* env, uv_buf_t buf) | ||
| 27 | + : env_(env), buffer_(buf) {} | ||
| 28 | + | ||
| 29 | + inline void AllocatedBuffer::Resize(size_t len) { | ||
| 30 | + // The `len` check is to make sure we don't end up with `nullptr` as our base. | ||
| 31 | + char* new_data = env_->Reallocate(buffer_.base, buffer_.len, | ||
| 32 | + len > 0 ? len : 1); | ||
| 33 | + CHECK_NOT_NULL(new_data); | ||
| 34 | + buffer_ = uv_buf_init(new_data, len); | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + inline uv_buf_t AllocatedBuffer::release() { | ||
| 38 | + uv_buf_t ret = buffer_; | ||
| 39 | + buffer_ = uv_buf_init(nullptr, 0); | ||
| 40 | + return ret; | ||
| 41 | + } | ||
| 42 | + | ||
| 43 | + inline char* AllocatedBuffer::data() { | ||
| 44 | + return buffer_.base; | ||
| 45 | + } | ||
| 46 | + | ||
| 47 | + inline const char* AllocatedBuffer::data() const { | ||
| 48 | + return buffer_.base; | ||
| 49 | + } | ||
| 50 | + | ||
| 51 | + inline size_t AllocatedBuffer::size() const { | ||
| 52 | + return buffer_.len; | ||
| 53 | + } | ||
| 54 | + | ||
| 55 | + inline AllocatedBuffer::AllocatedBuffer(Environment* env) | ||
| 56 | + : env_(env), buffer_(uv_buf_init(nullptr, 0)) {} | ||
| 57 | + | ||
| 58 | + inline AllocatedBuffer::AllocatedBuffer(AllocatedBuffer&& other) | ||
| 59 | + : AllocatedBuffer() { | ||
| 60 | + *this = std::move(other); | ||
| 61 | + } | ||
| 62 | + | ||
| 63 | + inline AllocatedBuffer& AllocatedBuffer::operator=(AllocatedBuffer&& other) { | ||
| 64 | + clear(); | ||
| 65 | + env_ = other.env_; | ||
| 66 | + buffer_ = other.release(); | ||
| 67 | + return *this; | ||
| 68 | + } | ||
| 69 | + | ||
| 70 | + inline AllocatedBuffer::~AllocatedBuffer() { | ||
| 71 | + clear(); | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + inline void AllocatedBuffer::clear() { | ||
| 75 | + uv_buf_t buf = release(); | ||
| 76 | + if (buf.base != nullptr) { | ||
| 77 | + CHECK_NOT_NULL(env_); | ||
| 78 | + env_->Free(buf.base, buf.len); | ||
| 79 | + } | ||
| 80 | + } | ||
| 81 | + | ||
| 82 | + inline v8::MaybeLocal<v8::Object> AllocatedBuffer::ToBuffer() { | ||
| 83 | + CHECK_NOT_NULL(env_); | ||
| 84 | + v8::MaybeLocal<v8::Object> obj = Buffer::New(env_, data(), size(), false); | ||
| 85 | + if (!obj.IsEmpty()) release(); | ||
| 86 | + return obj; | ||
| 87 | + } | ||
| 88 | + | ||
| 89 | + inline v8::Local<v8::ArrayBuffer> AllocatedBuffer::ToArrayBuffer() { | ||
| 90 | + CHECK_NOT_NULL(env_); | ||
| 91 | + uv_buf_t buf = release(); | ||
| 92 | + auto callback = [](void* data, size_t length, void* deleter_data){ | ||
| 93 | + CHECK_NOT_NULL(deleter_data); | ||
| 94 | + | ||
| 95 | + static_cast<v8::ArrayBuffer::Allocator*>(deleter_data) | ||
| 96 | + ->Free(data, length); | ||
| 97 | + }; | ||
| 98 | + std::unique_ptr<v8::BackingStore> backing = | ||
| 99 | + v8::ArrayBuffer::NewBackingStore(buf.base, | ||
| 100 | + buf.len, | ||
| 101 | + callback, | ||
| 102 | + env_->isolate() | ||
| 103 | + ->GetArrayBufferAllocator()); | ||
| 104 | + return v8::ArrayBuffer::New(env_->isolate(), | ||
| 105 | + std::move(backing)); | ||
| 106 | + } | ||
| 107 | + | ||
| 108 | + } // namespace node | ||
| 109 | + | ||
| 110 | + #endif // SRC_ALLOCATED_BUFFER_INL_H_ | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,63 @@ | |||
| 1 | + #ifndef SRC_ALLOCATED_BUFFER_H_ | ||
| 2 | + #define SRC_ALLOCATED_BUFFER_H_ | ||
| 3 | + | ||
| 4 | + #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS | ||
| 5 | + | ||
| 6 | + #include "base_object.h" | ||
| 7 | + #include "uv.h" | ||
| 8 | + #include "v8.h" | ||
| 9 | + | ||
| 10 | + namespace node { | ||
| 11 | + | ||
| 12 | + class Environment; | ||
| 13 | + | ||
| 14 | + // A unique-pointer-ish object that is compatible with the JS engine's | ||
| 15 | + // ArrayBuffer::Allocator. | ||
| 16 | + struct AllocatedBuffer { | ||
| 17 | + public: | ||
| 18 | + enum AllocateManagedFlags { | ||
| 19 | + ALLOCATE_MANAGED_FLAG_NONE, | ||
| 20 | + ALLOCATE_MANAGED_UNCHECKED | ||
| 21 | + }; | ||
| 22 | + | ||
| 23 | + // Utilities that allocate memory using the Isolate's ArrayBuffer::Allocator. | ||
| 24 | + // In particular, using AllocateManaged() will provide a RAII-style object | ||
| 25 | + // with easy conversion to `Buffer` and `ArrayBuffer` objects. | ||
| 26 | + inline static AllocatedBuffer AllocateManaged( | ||
| 27 | + Environment* env, | ||
| 28 | + size_t size, | ||
| 29 | + int flags = ALLOCATE_MANAGED_FLAG_NONE); | ||
| 30 | + | ||
| 31 | + explicit inline AllocatedBuffer(Environment* env = nullptr); | ||
| 32 | + inline AllocatedBuffer(Environment* env, uv_buf_t buf); | ||
| 33 | + inline ~AllocatedBuffer(); | ||
| 34 | + inline void Resize(size_t len); | ||
| 35 | + | ||
| 36 | + inline uv_buf_t release(); | ||
| 37 | + inline char* data(); | ||
| 38 | + inline const char* data() const; | ||
| 39 | + inline size_t size() const; | ||
| 40 | + inline void clear(); | ||
| 41 | + | ||
| 42 | + inline v8::MaybeLocal<v8::Object> ToBuffer(); | ||
| 43 | + inline v8::Local<v8::ArrayBuffer> ToArrayBuffer(); | ||
| 44 | + | ||
| 45 | + inline AllocatedBuffer(AllocatedBuffer&& other); | ||
| 46 | + inline AllocatedBuffer& operator=(AllocatedBuffer&& other); | ||
| 47 | + AllocatedBuffer(const AllocatedBuffer& other) = delete; | ||
| 48 | + AllocatedBuffer& operator=(const AllocatedBuffer& other) = delete; | ||
| 49 | + | ||
| 50 | + private: | ||
| 51 | + Environment* env_; | ||
| 52 | + // We do not pass this to libuv directly, but uv_buf_t is a convenient way | ||
| 53 | + // to represent a chunk of memory, and plays nicely with other parts of core. | ||
| 54 | + uv_buf_t buffer_; | ||
| 55 | + | ||
| 56 | + friend class Environment; | ||
| 57 | + }; | ||
| 58 | + | ||
| 59 | + } // namespace node | ||
| 60 | + | ||
| 61 | + #endif // NODE_WANT_INTERNALS | ||
| 62 | + | ||
| 63 | + #endif // SRC_ALLOCATED_BUFFER_H_ | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -867,68 +867,6 @@ inline void Environment::Free(char* data, size_t size) { | |||
| 867 | 867 | isolate_data()->allocator()->Free(data, size); | |
| 868 | 868 | } | |
| 869 | 869 | ||
| 870 | - inline AllocatedBuffer Environment::AllocateManaged(size_t size, bool checked) { | ||
| 871 | - char* data = checked ? Allocate(size) : AllocateUnchecked(size); | ||
| 872 | - if (data == nullptr) size = 0; | ||
| 873 | - return AllocatedBuffer(this, uv_buf_init(data, size)); | ||
| 874 | - } | ||
| 875 | - | ||
| 876 | - inline AllocatedBuffer::AllocatedBuffer(Environment* env, uv_buf_t buf) | ||
| 877 | - : env_(env), buffer_(buf) {} | ||
| 878 | - | ||
| 879 | - inline void AllocatedBuffer::Resize(size_t len) { | ||
| 880 | - // The `len` check is to make sure we don't end up with `nullptr` as our base. | ||
| 881 | - char* new_data = env_->Reallocate(buffer_.base, buffer_.len, | ||
| 882 | - len > 0 ? len : 1); | ||
| 883 | - CHECK_NOT_NULL(new_data); | ||
| 884 | - buffer_ = uv_buf_init(new_data, len); | ||
| 885 | - } | ||
| 886 | - | ||
| 887 | - inline uv_buf_t AllocatedBuffer::release() { | ||
| 888 | - uv_buf_t ret = buffer_; | ||
| 889 | - buffer_ = uv_buf_init(nullptr, 0); | ||
| 890 | - return ret; | ||
| 891 | - } | ||
| 892 | - | ||
| 893 | - inline char* AllocatedBuffer::data() { | ||
| 894 | - return buffer_.base; | ||
| 895 | - } | ||
| 896 | - | ||
| 897 | - inline const char* AllocatedBuffer::data() const { | ||
| 898 | - return buffer_.base; | ||
| 899 | - } | ||
| 900 | - | ||
| 901 | - inline size_t AllocatedBuffer::size() const { | ||
| 902 | - return buffer_.len; | ||
| 903 | - } | ||
| 904 | - | ||
| 905 | - inline AllocatedBuffer::AllocatedBuffer(Environment* env) | ||
| 906 | - : env_(env), buffer_(uv_buf_init(nullptr, 0)) {} | ||
| 907 | - | ||
| 908 | - inline AllocatedBuffer::AllocatedBuffer(AllocatedBuffer&& other) | ||
| 909 | - : AllocatedBuffer() { | ||
| 910 | - *this = std::move(other); | ||
| 911 | - } | ||
| 912 | - | ||
| 913 | - inline AllocatedBuffer& AllocatedBuffer::operator=(AllocatedBuffer&& other) { | ||
| 914 | - clear(); | ||
| 915 | - env_ = other.env_; | ||
| 916 | - buffer_ = other.release(); | ||
| 917 | - return *this; | ||
| 918 | - } | ||
| 919 | - | ||
| 920 | - inline AllocatedBuffer::~AllocatedBuffer() { | ||
| 921 | - clear(); | ||
| 922 | - } | ||
| 923 | - | ||
| 924 | - inline void AllocatedBuffer::clear() { | ||
| 925 | - uv_buf_t buf = release(); | ||
| 926 | - if (buf.base != nullptr) { | ||
| 927 | - CHECK_NOT_NULL(env_); | ||
| 928 | - env_->Free(buf.base, buf.len); | ||
| 929 | - } | ||
| 930 | - } | ||
| 931 | - | ||
| 932 | 870 | // It's a bit awkward to define this Buffer::New() overload here, but it | |
| 933 | 871 | // avoids a circular dependency with node_internals.h. | |
| 934 | 872 | namespace Buffer { | |
@@ -938,32 +876,6 @@ v8::MaybeLocal<v8::Object> New(Environment* env, | |||
| 938 | 876 | bool uses_malloc); | |
| 939 | 877 | } | |
| 940 | 878 | ||
| 941 | - inline v8::MaybeLocal<v8::Object> AllocatedBuffer::ToBuffer() { | ||
| 942 | - CHECK_NOT_NULL(env_); | ||
| 943 | - v8::MaybeLocal<v8::Object> obj = Buffer::New(env_, data(), size(), false); | ||
| 944 | - if (!obj.IsEmpty()) release(); | ||
| 945 | - return obj; | ||
| 946 | - } | ||
| 947 | - | ||
| 948 | - inline v8::Local<v8::ArrayBuffer> AllocatedBuffer::ToArrayBuffer() { | ||
| 949 | - CHECK_NOT_NULL(env_); | ||
| 950 | - uv_buf_t buf = release(); | ||
| 951 | - auto callback = [](void* data, size_t length, void* deleter_data){ | ||
| 952 | - CHECK_NOT_NULL(deleter_data); | ||
| 953 | - | ||
| 954 | - static_cast<v8::ArrayBuffer::Allocator*>(deleter_data) | ||
| 955 | - ->Free(data, length); | ||
| 956 | - }; | ||
| 957 | - std::unique_ptr<v8::BackingStore> backing = | ||
| 958 | - v8::ArrayBuffer::NewBackingStore(buf.base, | ||
| 959 | - buf.len, | ||
| 960 | - callback, | ||
| 961 | - env_->isolate() | ||
| 962 | - ->GetArrayBufferAllocator()); | ||
| 963 | - return v8::ArrayBuffer::New(env_->isolate(), | ||
| 964 | - std::move(backing)); | ||
| 965 | - } | ||
| 966 | - | ||
| 967 | 879 | inline void Environment::ThrowError(const char* errmsg) { | |
| 968 | 880 | ThrowError(v8::Exception::Error, errmsg); | |
| 969 | 881 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,5 +1,5 @@ | |||
| 1 | 1 | #include "env.h" | |
| 2 | - | ||
| 2 | + #include "allocated_buffer-inl.h" | ||
| 3 | 3 | #include "async_wrap.h" | |
| 4 | 4 | #include "base_object-inl.h" | |
| 5 | 5 | #include "debug_utils-inl.h" | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -472,6 +472,7 @@ constexpr size_t kFsStatsBufferLength = | |||
| 472 | 472 | V(url_constructor_function, v8::Function) | |
| 473 | 473 | ||
| 474 | 474 | class Environment; | |
| 475 | + struct AllocatedBuffer; | ||
| 475 | 476 | ||
| 476 | 477 | class IsolateData : public MemoryRetainer { | |
| 477 | 478 | public: | |
@@ -558,38 +559,6 @@ struct ContextInfo { | |||
| 558 | 559 | ||
| 559 | 560 | class EnabledDebugList; | |
| 560 | 561 | ||
| 561 | - // A unique-pointer-ish object that is compatible with the JS engine's | ||
| 562 | - // ArrayBuffer::Allocator. | ||
| 563 | - struct AllocatedBuffer { | ||
| 564 | - public: | ||
| 565 | - explicit inline AllocatedBuffer(Environment* env = nullptr); | ||
| 566 | - inline AllocatedBuffer(Environment* env, uv_buf_t buf); | ||
| 567 | - inline ~AllocatedBuffer(); | ||
| 568 | - inline void Resize(size_t len); | ||
| 569 | - | ||
| 570 | - inline uv_buf_t release(); | ||
| 571 | - inline char* data(); | ||
| 572 | - inline const char* data() const; | ||
| 573 | - inline size_t size() const; | ||
| 574 | - inline void clear(); | ||
| 575 | - | ||
| 576 | - inline v8::MaybeLocal<v8::Object> ToBuffer(); | ||
| 577 | - inline v8::Local<v8::ArrayBuffer> ToArrayBuffer(); | ||
| 578 | - | ||
| 579 | - inline AllocatedBuffer(AllocatedBuffer&& other); | ||
| 580 | - inline AllocatedBuffer& operator=(AllocatedBuffer&& other); | ||
| 581 | - AllocatedBuffer(const AllocatedBuffer& other) = delete; | ||
| 582 | - AllocatedBuffer& operator=(const AllocatedBuffer& other) = delete; | ||
| 583 | - | ||
| 584 | - private: | ||
| 585 | - Environment* env_; | ||
| 586 | - // We do not pass this to libuv directly, but uv_buf_t is a convenient way | ||
| 587 | - // to represent a chunk of memory, and plays nicely with other parts of core. | ||
| 588 | - uv_buf_t buffer_; | ||
| 589 | - | ||
| 590 | - friend class Environment; | ||
| 591 | - }; | ||
| 592 | - | ||
| 593 | 562 | class KVStore { | |
| 594 | 563 | public: | |
| 595 | 564 | KVStore() = default; | |
@@ -957,10 +926,6 @@ class Environment : public MemoryRetainer { | |||
| 957 | 926 | ||
| 958 | 927 | inline IsolateData* isolate_data() const; | |
| 959 | 928 | ||
| 960 | - // Utilities that allocate memory using the Isolate's ArrayBuffer::Allocator. | ||
| 961 | - // In particular, using AllocateManaged() will provide a RAII-style object | ||
| 962 | - // with easy conversion to `Buffer` and `ArrayBuffer` objects. | ||
| 963 | - inline AllocatedBuffer AllocateManaged(size_t size, bool checked = true); | ||
| 964 | 929 | inline char* Allocate(size_t size); | |
| 965 | 930 | inline char* AllocateUnchecked(size_t size); | |
| 966 | 931 | char* Reallocate(char* data, size_t old_size, size_t size); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -3,6 +3,7 @@ | |||
| 3 | 3 | #include "inspector_socket_server.h" | |
| 4 | 4 | #include "inspector/main_thread_interface.h" | |
| 5 | 5 | #include "inspector/node_string.h" | |
| 6 | + #include "allocated_buffer-inl.h" // Inlined functions needed by node_crypto.h. | ||
| 6 | 7 | #include "base_object-inl.h" | |
| 7 | 8 | #include "debug_utils-inl.h" | |
| 8 | 9 | #include "node.h" | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -41,6 +41,7 @@ | |||
| 41 | 41 | #include "node_version.h" | |
| 42 | 42 | ||
| 43 | 43 | #if HAVE_OPENSSL | |
| 44 | + #include "allocated_buffer-inl.h" // Inlined functions needed by node_crypto.h | ||
| 44 | 45 | #include "node_crypto.h" | |
| 45 | 46 | #endif | |
| 46 | 47 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments