diff options
author | Trevor Norris <trev.norris@gmail.com> | 2015-02-20 10:32:29 -0700 |
---|---|---|
committer | Trevor Norris <trev.norris@gmail.com> | 2015-02-20 15:19:30 -0700 |
commit | 9deade432254ebb39a6afb468fad5586d24a5b50 (patch) | |
tree | c8cfe821a3c78185c0f583163f2b5114aac80015 | |
parent | bada87bd666f103cc00d63ace48ef300b0caaabf (diff) | |
download | node-9deade432254ebb39a6afb468fad5586d24a5b50.tar.gz |
smalloc: extend user API
node::Environment isn't accessible to user APIs, so extend smalloc to
also accept v8::Isolate.
Fixes: 75adde07 "src: remove `node_isolate` from source"
PR-URL: https://github.com/iojs/io.js/pull/905
Reviewed-by: Fedor Indutny <fedor@indutny.com>
-rw-r--r-- | src/smalloc.cc | 50 | ||||
-rw-r--r-- | src/smalloc.h | 47 | ||||
-rw-r--r-- | test/addons/smalloc-alloc/binding.cc | 30 | ||||
-rw-r--r-- | test/addons/smalloc-alloc/binding.gyp | 8 | ||||
-rw-r--r-- | test/addons/smalloc-alloc/test.js | 9 |
5 files changed, 137 insertions, 7 deletions
diff --git a/src/smalloc.cc b/src/smalloc.cc index 0cd8f3eb9..19972d910 100644 --- a/src/smalloc.cc +++ b/src/smalloc.cc @@ -537,6 +537,56 @@ RetainedObjectInfo* WrapperInfo(uint16_t class_id, Handle<Value> wrapper) { } +// User facing API. + +void Alloc(Isolate* isolate, + Handle<Object> obj, + size_t length, + enum ExternalArrayType type) { + Alloc(Environment::GetCurrent(isolate), obj, length, type); +} + + +void Alloc(Isolate* isolate, + Handle<Object> obj, + char* data, + size_t length, + enum ExternalArrayType type) { + Alloc(Environment::GetCurrent(isolate), obj, data, length, type); +} + + +void Alloc(Isolate* isolate, + Handle<Object> obj, + size_t length, + FreeCallback fn, + void* hint, + enum ExternalArrayType type) { + Alloc(Environment::GetCurrent(isolate), obj, length, fn, hint, type); +} + + +void Alloc(Isolate* isolate, + Handle<Object> obj, + char* data, + size_t length, + FreeCallback fn, + void* hint, + enum ExternalArrayType type) { + Alloc(Environment::GetCurrent(isolate), obj, data, length, fn, hint, type); +} + + +void AllocDispose(Isolate* isolate, Handle<Object> obj) { + AllocDispose(Environment::GetCurrent(isolate), obj); +} + + +bool HasExternalData(Isolate* isolate, Local<Object> obj) { + return HasExternalData(Environment::GetCurrent(isolate), obj); +} + + void Initialize(Handle<Object> exports, Handle<Value> unused, Handle<Context> context) { diff --git a/src/smalloc.h b/src/smalloc.h index 3321b4a89..835ebe184 100644 --- a/src/smalloc.h +++ b/src/smalloc.h @@ -70,30 +70,31 @@ NODE_EXTERN size_t ExternalArraySize(enum v8::ExternalArrayType type); * v8::kExternalFloatArray); * v8::Local<v8::Object> obj = v8::Object::New(); * char* data = static_cast<char*>(malloc(byte_length * array_length)); - * node::smalloc::Alloc(obj, data, byte_length, v8::kExternalFloatArray); + * node::smalloc::Alloc(isolate, obj, data, byte_length, + * v8::kExternalFloatArray); * obj->Set(v8::String::NewFromUtf8("length"), * v8::Integer::NewFromUnsigned(array_length)); * \code */ -NODE_EXTERN void Alloc(Environment* env, +NODE_EXTERN void Alloc(v8::Isolate* isolate, v8::Handle<v8::Object> obj, size_t length, enum v8::ExternalArrayType type = v8::kExternalUnsignedByteArray); -NODE_EXTERN void Alloc(Environment* env, +NODE_EXTERN void Alloc(v8::Isolate* isolate, v8::Handle<v8::Object> obj, char* data, size_t length, enum v8::ExternalArrayType type = v8::kExternalUnsignedByteArray); -NODE_EXTERN void Alloc(Environment* env, +NODE_EXTERN void Alloc(v8::Isolate* isolate, v8::Handle<v8::Object> obj, size_t length, FreeCallback fn, void* hint, enum v8::ExternalArrayType type = v8::kExternalUnsignedByteArray); -NODE_EXTERN void Alloc(Environment* env, +NODE_EXTERN void Alloc(v8::Isolate* isolate, v8::Handle<v8::Object> obj, char* data, size_t length, @@ -106,13 +107,45 @@ NODE_EXTERN void Alloc(Environment* env, * Free memory associated with an externally allocated object. If no external * memory is allocated to the object then nothing will happen. */ -NODE_EXTERN void AllocDispose(Environment* env, v8::Handle<v8::Object> obj); +NODE_EXTERN void AllocDispose(v8::Isolate* isolate, v8::Handle<v8::Object> obj); /** * Check if the Object has externally allocated memory. */ -NODE_EXTERN bool HasExternalData(Environment* env, v8::Local<v8::Object> obj); +NODE_EXTERN bool HasExternalData(v8::Isolate* isolate, + v8::Local<v8::Object> obj); + + +// Internal use +void Alloc(Environment* env, + v8::Handle<v8::Object> obj, + size_t length, + enum v8::ExternalArrayType type = + v8::kExternalUnsignedByteArray); +void Alloc(Environment* env, + v8::Handle<v8::Object> obj, + char* data, + size_t length, + enum v8::ExternalArrayType type = + v8::kExternalUnsignedByteArray); +void Alloc(Environment* env, + v8::Handle<v8::Object> obj, + size_t length, + FreeCallback fn, + void* hint, + enum v8::ExternalArrayType type = + v8::kExternalUnsignedByteArray); +void Alloc(Environment* env, + v8::Handle<v8::Object> obj, + char* data, + size_t length, + FreeCallback fn, + void* hint, + enum v8::ExternalArrayType type = + v8::kExternalUnsignedByteArray); +void AllocDispose(Environment* env, v8::Handle<v8::Object> obj); +bool HasExternalData(Environment* env, v8::Local<v8::Object> obj); } // namespace smalloc } // namespace node diff --git a/test/addons/smalloc-alloc/binding.cc b/test/addons/smalloc-alloc/binding.cc new file mode 100644 index 000000000..6efde5d6d --- /dev/null +++ b/test/addons/smalloc-alloc/binding.cc @@ -0,0 +1,30 @@ +#include <node.h> +#include <smalloc.h> +#include <v8.h> + +using namespace v8; + +void Alloc(const FunctionCallbackInfo<Value>& args) { + Isolate* isolate = args.GetIsolate(); + Local<Object> obj = Object::New(isolate); + size_t len = args[0]->Uint32Value(); + node::smalloc::Alloc(isolate, obj, len); + args.GetReturnValue().Set(obj); +} + +void Dispose(const FunctionCallbackInfo<Value>& args) { + node::smalloc::AllocDispose(args.GetIsolate(), args[0].As<Object>()); +} + +void HasExternalData(const FunctionCallbackInfo<Value>& args) { + args.GetReturnValue().Set( + node::smalloc::HasExternalData(args.GetIsolate(), args[0].As<Object>())); +} + +void init(Handle<Object> target) { + NODE_SET_METHOD(target, "alloc", Alloc); + NODE_SET_METHOD(target, "dispose", Dispose); + NODE_SET_METHOD(target, "hasExternalData", HasExternalData); +} + +NODE_MODULE(binding, init); diff --git a/test/addons/smalloc-alloc/binding.gyp b/test/addons/smalloc-alloc/binding.gyp new file mode 100644 index 000000000..3bfb84493 --- /dev/null +++ b/test/addons/smalloc-alloc/binding.gyp @@ -0,0 +1,8 @@ +{ + 'targets': [ + { + 'target_name': 'binding', + 'sources': [ 'binding.cc' ] + } + ] +} diff --git a/test/addons/smalloc-alloc/test.js b/test/addons/smalloc-alloc/test.js new file mode 100644 index 000000000..47197be63 --- /dev/null +++ b/test/addons/smalloc-alloc/test.js @@ -0,0 +1,9 @@ +var assert = require('assert'); +var binding = require('./build/Release/binding'); +var obj = binding.alloc(16); +for (var i = 0; i < 16; i++) { + assert.ok(typeof obj[i] == 'number'); +} +assert.ok(binding.hasExternalData(obj)); +binding.dispose(obj); +assert.ok(typeof obj[0] !== 'number'); |