@@ -669,6 +669,104 @@ inline IsolateData* Environment::isolate_data() const {
669669 return isolate_data_;
670670}
671671
672+ inline char * Environment::AllocateUnchecked (size_t size) {
673+ return static_cast <char *>(
674+ isolate_data ()->allocator ()->AllocateUninitialized (size));
675+ }
676+
677+ inline char * Environment::Allocate (size_t size) {
678+ char * ret = AllocateUnchecked (size);
679+ CHECK_NE (ret, nullptr );
680+ return ret;
681+ }
682+
683+ inline void Environment::Free (char * data, size_t size) {
684+ if (data != nullptr )
685+ isolate_data ()->allocator ()->Free (data, size);
686+ }
687+
688+ inline AllocatedBuffer Environment::AllocateManaged (size_t size, bool checked) {
689+ char * data = checked ? Allocate (size) : AllocateUnchecked (size);
690+ if (data == nullptr ) size = 0 ;
691+ return AllocatedBuffer (this , uv_buf_init (data, size));
692+ }
693+
694+ inline AllocatedBuffer::AllocatedBuffer (Environment* env, uv_buf_t buf)
695+ : env_(env), buffer_(buf) {}
696+
697+ inline void AllocatedBuffer::Resize (size_t len) {
698+ char * new_data = env_->Reallocate (buffer_.base , buffer_.len , len);
699+ CHECK_IMPLIES (len > 0 , new_data != nullptr );
700+ buffer_ = uv_buf_init (new_data, len);
701+ }
702+
703+ inline uv_buf_t AllocatedBuffer::release () {
704+ uv_buf_t ret = buffer_;
705+ buffer_ = uv_buf_init (nullptr , 0 );
706+ return ret;
707+ }
708+
709+ inline char * AllocatedBuffer::data () {
710+ return buffer_.base ;
711+ }
712+
713+ inline const char * AllocatedBuffer::data () const {
714+ return buffer_.base ;
715+ }
716+
717+ inline size_t AllocatedBuffer::size () const {
718+ return buffer_.len ;
719+ }
720+
721+ inline AllocatedBuffer::AllocatedBuffer (Environment* env)
722+ : env_(env), buffer_(uv_buf_init(nullptr , 0 )) {}
723+
724+ inline AllocatedBuffer::AllocatedBuffer (AllocatedBuffer&& other)
725+ : AllocatedBuffer() {
726+ *this = std::move (other);
727+ }
728+
729+ inline AllocatedBuffer& AllocatedBuffer::operator =(AllocatedBuffer&& other) {
730+ clear ();
731+ env_ = other.env_ ;
732+ buffer_ = other.release ();
733+ return *this ;
734+ }
735+
736+ inline AllocatedBuffer::~AllocatedBuffer () {
737+ clear ();
738+ }
739+
740+ inline void AllocatedBuffer::clear () {
741+ uv_buf_t buf = release ();
742+ env_->Free (buf.base , buf.len );
743+ }
744+
745+ // It's a bit awkward to define this Buffer::New() overload here, but it
746+ // avoids a circular dependency with node_internals.h.
747+ namespace Buffer {
748+ v8::MaybeLocal<v8::Object> New (Environment* env,
749+ char * data,
750+ size_t length,
751+ bool uses_malloc);
752+ }
753+
754+ inline v8::MaybeLocal<v8::Object> AllocatedBuffer::ToBuffer () {
755+ CHECK_NOT_NULL (env_);
756+ v8::MaybeLocal<v8::Object> obj = Buffer::New (env_, data (), size (), false );
757+ if (!obj.IsEmpty ()) release ();
758+ return obj;
759+ }
760+
761+ inline v8::Local<v8::ArrayBuffer> AllocatedBuffer::ToArrayBuffer () {
762+ CHECK_NOT_NULL (env_);
763+ uv_buf_t buf = release ();
764+ return v8::ArrayBuffer::New (env_->isolate (),
765+ buf.base ,
766+ buf.len ,
767+ v8::ArrayBufferCreationMode::kInternalized );
768+ }
769+
672770inline void Environment::ThrowError (const char * errmsg) {
673771 ThrowError (v8::Exception::Error, errmsg);
674772}
0 commit comments