Skip to content

Commit 5042fc7

Browse files
author
Gabriel Schulhof
committed
napi: revamp buffer API
* There are now three creation functions: 1. Create such that node owns the pointer 2. Create such that the caller owns the pointer 3. Create such that node owns the pointer and copies the data into it * napi_buffer_has_instance() is now called napi_is_buffer() * napi_buffer_data() and napi_buffer_length() are now merged into napi_get_buffer_info() * There is now a test for this api under test/addons-abi Fixes #108 Closes #109
1 parent 654da16 commit 5042fc7

26 files changed

Lines changed: 252 additions & 65 deletions

File tree

src/node_jsvmapi.cc

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1951,52 +1951,74 @@ napi_status napi_get_and_clear_last_exception(napi_env e, napi_value* result) {
19511951
return napi_ok;
19521952
}
19531953

1954-
napi_status napi_buffer_new(napi_env e, char* data, size_t size, napi_value* result) {
1954+
napi_status napi_create_buffer(napi_env e, size_t size, char** data,
1955+
napi_value* result) {
19551956
NAPI_PREAMBLE(e);
1957+
CHECK_ARG(data);
19561958
CHECK_ARG(result);
19571959

1958-
auto maybe = node::Buffer::New(v8impl::V8IsolateFromJsEnv(e), data, size);
1960+
auto maybe = node::Buffer::New(v8impl::V8IsolateFromJsEnv(e), size);
19591961

19601962
CHECK_MAYBE_EMPTY(maybe, napi_generic_failure);
19611963

1962-
*result = v8impl::JsValueFromV8LocalValue(maybe.ToLocalChecked());
1964+
v8::Local<v8::Object> jsBuffer = maybe.ToLocalChecked();
1965+
1966+
*result = v8impl::JsValueFromV8LocalValue(jsBuffer);
1967+
*data = node::Buffer::Data(jsBuffer);
1968+
19631969
return GET_RETURN_STATUS();
19641970
}
19651971

1966-
napi_status napi_buffer_copy(napi_env e, const char* data,
1967-
size_t size, napi_value* result) {
1972+
napi_status napi_create_external_buffer(napi_env e, size_t size, char* data,
1973+
napi_finalize finalize_cb,
1974+
napi_value* result) {
19681975
NAPI_PREAMBLE(e);
19691976
CHECK_ARG(result);
19701977

1971-
auto maybe = node::Buffer::Copy(v8impl::V8IsolateFromJsEnv(e), data, size);
1978+
auto maybe = node::Buffer::New(v8impl::V8IsolateFromJsEnv(e), data, size,
1979+
(node::Buffer::FreeCallback)finalize_cb, nullptr);
19721980

19731981
CHECK_MAYBE_EMPTY(maybe, napi_generic_failure);
19741982

19751983
*result = v8impl::JsValueFromV8LocalValue(maybe.ToLocalChecked());
19761984
return GET_RETURN_STATUS();
19771985
}
19781986

1979-
napi_status napi_buffer_has_instance(napi_env e, napi_value v, bool* result) {
1987+
napi_status napi_create_buffer_copy(napi_env e, const char* data,
1988+
size_t size, napi_value* result) {
19801989
NAPI_PREAMBLE(e);
19811990
CHECK_ARG(result);
19821991

1983-
*result = node::Buffer::HasInstance(v8impl::V8LocalValueFromJsValue(v));
1992+
auto maybe = node::Buffer::Copy(v8impl::V8IsolateFromJsEnv(e), data, size);
1993+
1994+
CHECK_MAYBE_EMPTY(maybe, napi_generic_failure);
1995+
1996+
*result = v8impl::JsValueFromV8LocalValue(maybe.ToLocalChecked());
19841997
return GET_RETURN_STATUS();
19851998
}
19861999

1987-
napi_status napi_buffer_data(napi_env e, napi_value v, char** result) {
2000+
napi_status napi_is_buffer(napi_env e, napi_value v, bool* result) {
19882001
NAPI_PREAMBLE(e);
19892002
CHECK_ARG(result);
19902003

1991-
*result = node::Buffer::Data(v8impl::V8LocalValueFromJsValue(v).As<v8::Object>());
2004+
*result = node::Buffer::HasInstance(v8impl::V8LocalValueFromJsValue(v));
19922005
return GET_RETURN_STATUS();
19932006
}
19942007

1995-
napi_status napi_buffer_length(napi_env e, napi_value v, size_t* result) {
2008+
napi_status napi_get_buffer_info(napi_env e, napi_value v, char** data,
2009+
size_t* length) {
19962010
NAPI_PREAMBLE(e);
1997-
CHECK_ARG(result);
19982011

1999-
*result = node::Buffer::Length(v8impl::V8LocalValueFromJsValue(v));
2012+
v8::Local<v8::Object> buffer =
2013+
v8impl::V8LocalValueFromJsValue(v).As<v8::Object>();
2014+
2015+
if (data) {
2016+
*data = node::Buffer::Data(buffer);
2017+
}
2018+
if (length) {
2019+
*length = node::Buffer::Length(buffer);
2020+
}
2021+
20002022
return GET_RETURN_STATUS();
20012023
}
20022024

src/node_jsvmapi.h

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -315,17 +315,21 @@ NODE_EXTERN napi_status napi_is_exception_pending(napi_env e, bool* result);
315315
NODE_EXTERN napi_status napi_get_and_clear_last_exception(napi_env e, napi_value* result);
316316

317317
// Methods to provide node::Buffer functionality with napi types
318-
NODE_EXTERN napi_status napi_buffer_new(napi_env e,
319-
char* data,
320-
size_t size,
321-
napi_value* result);
322-
NODE_EXTERN napi_status napi_buffer_copy(napi_env e,
323-
const char* data,
324-
size_t size,
325-
napi_value* result);
326-
NODE_EXTERN napi_status napi_buffer_has_instance(napi_env e, napi_value v, bool* result);
327-
NODE_EXTERN napi_status napi_buffer_data(napi_env e, napi_value v, char** result);
328-
NODE_EXTERN napi_status napi_buffer_length(napi_env e, napi_value v, size_t* result);
318+
NODE_EXTERN napi_status napi_create_buffer(napi_env e,
319+
size_t size,
320+
char** data,
321+
napi_value* result);
322+
NODE_EXTERN napi_status napi_create_external_buffer(napi_env e,
323+
size_t size,
324+
char* data,
325+
napi_finalize finalize_cb,
326+
napi_value* result);
327+
NODE_EXTERN napi_status napi_create_buffer_copy(napi_env e,
328+
const char* data,
329+
size_t size,
330+
napi_value* result);
331+
NODE_EXTERN napi_status napi_is_buffer(napi_env e, napi_value v, bool* result);
332+
NODE_EXTERN napi_status napi_get_buffer_info(napi_env e, napi_value v, char** data, size_t* length);
329333

330334
// Methods to work with array buffers and typed arrays
331335
NODE_EXTERN napi_status napi_is_arraybuffer(napi_env env, napi_value value, bool* result);
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
2-
require('../../common');
2+
var common = require('../../common');
33
var assert = require('assert');
4-
var addon = require('./build/Release/binding');
4+
var addon = require(`./build/${common.buildType}/binding`);
55

66
assert.equal(addon.hello(), 'world');
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
2-
require('../../common');
2+
var common = require('../../common');
33
var assert = require('assert');
4-
var addon = require('./build/Release/binding');
4+
var addon = require(`./build/${common.buildType}/binding`);
55

66
assert.equal(addon.add(3, 5), 8);

test/addons-abi/3_callbacks/test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use strict';
2-
require('../../common');
2+
var common = require('../../common');
33
var assert = require('assert');
4-
var addon = require('./build/Release/binding');
4+
var addon = require(`./build/${common.buildType}/binding`);
55

66
addon.RunCallback(function(msg) {
77
assert.equal(msg, 'hello world');

test/addons-abi/4_object_factory/test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use strict';
2-
require('../../common');
2+
var common = require('../../common');
33
var assert = require('assert');
4-
var addon = require('./build/Release/binding');
4+
var addon = require(`./build/${common.buildType}/binding`);
55

66
var obj1 = addon('hello');
77
var obj2 = addon('world');
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use strict';
2-
require('../../common');
2+
var common = require('../../common');
33
var assert = require('assert');
4-
var addon = require('./build/Release/binding');
4+
var addon = require(`./build/${common.buildType}/binding`);
55

66
var fn = addon();
77
assert.equal(fn(), 'hello world'); // 'hello world'

test/addons-abi/6_object_wrap/test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use strict';
2-
require('../../common');
2+
var common = require('../../common');
33
var assert = require('assert');
4-
var addon = require('./build/Release/binding');
4+
var addon = require(`./build/${common.buildType}/binding`);
55

66
var obj = new addon.MyObject(9);
77
assert.equal(obj.value, 9);

test/addons-abi/7_factory_wrap/test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use strict';
2-
require('../../common');
2+
var common = require('../../common');
33
var assert = require('assert');
4-
var createObject = require('./build/Release/binding');
4+
var createObject = require(`./build/${common.buildType}/binding`);
55

66
var obj = createObject(10);
77
assert.equal(obj.plusOne(), 11);

test/addons-abi/8_passing_wrapped/test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use strict';
2-
require('../../common');
2+
var common = require('../../common');
33
var assert = require('assert');
4-
var addon = require('./build/Release/binding');
4+
var addon = require(`./build/${common.buildType}/binding`);
55

66
var obj1 = addon.createObject(10);
77
var obj2 = addon.createObject(20);

0 commit comments

Comments
 (0)