diff options
-rw-r--r-- | doc/api/n-api.md | 84 | ||||
-rw-r--r-- | src/node_api.cc | 66 | ||||
-rw-r--r-- | src/node_api.h | 15 | ||||
-rw-r--r-- | test/addons-napi/test_dataview/binding.gyp | 8 | ||||
-rw-r--r-- | test/addons-napi/test_dataview/test.js | 14 | ||||
-rw-r--r-- | test/addons-napi/test_dataview/test_dataview.c | 49 |
6 files changed, 236 insertions, 0 deletions
diff --git a/doc/api/n-api.md b/doc/api/n-api.md index 924e39e9b7..724d0f91ed 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -1331,6 +1331,40 @@ JavaScript TypedArray Objects are described in [Section 22.2](https://tc39.github.io/ecma262/#sec-typedarray-objects) of the ECMAScript Language Specification. + +#### *napi_create_dataview* +<!-- YAML +added: REPLACEME +--> + +```C +napi_status napi_create_dataview(napi_env env, + size_t byte_length, + napi_value arraybuffer, + size_t byte_offset, + napi_value* result) + +``` + +- `[in] env`: The environment that the API is invoked under. +- `[in] length`: Number of elements in the DataView. +- `[in] arraybuffer`: ArrayBuffer underlying the DataView. +- `[in] byte_offset`: The byte offset within the ArrayBuffer from which to + start projecting the DataView. +- `[out] result`: A `napi_value` representing a JavaScript DataView. + +Returns `napi_ok` if the API succeeded. + +This API creates a JavaScript DataView object over an existing ArrayBuffer. +DataView objects provide an array-like view over an underlying data buffer, +but one which allows items of different size and type in the ArrayBuffer. + +It is required that `byte_length + byte_offset` is less than or equal to the +size in bytes of the array passed in. If not, a RangeError exception is raised. + +JavaScript DataView Objects are described in +[Section 24.3][] of the ECMAScript Language Specification. + ### Functions to convert from C types to N-API #### *napi_create_number* <!-- YAML @@ -1552,6 +1586,36 @@ This API returns various properties of a typed array. *Warning*: Use caution while using this API since the underlying data buffer is managed by the VM + + +#### *napi_get_dataview_info* +<!-- YAML +added: REPLACEME +--> + +```C +napi_status napi_get_dataview_info(napi_env env, + napi_value dataview, + size_t* byte_length, + void** data, + napi_value* arraybuffer, + size_t* byte_offset) +``` + +- `[in] env`: The environment that the API is invoked under. +- `[in] dataview`: `napi_value` representing the DataView whose + properties to query. +- `[out] byte_length`: Number of bytes in the DataView. +- `[out] data`: The data buffer underlying the DataView. +- `[out] arraybuffer`: ArrayBuffer underlying the DataView. +- `[out] byte_offset`: The byte offset within the data buffer from which + to start projecting the DataView. + +Returns `napi_ok` if the API succeeded. + +This API returns various properties of a DataView. + + #### *napi_get_value_bool* <!-- YAML added: v8.0.0 @@ -2019,6 +2083,25 @@ Returns `napi_ok` if the API succeeded. This API checks if the Object passsed in is a typed array. + + +### *napi_is_dataview* +<!-- YAML +added: REPLACEME +--> + +```C +napi_status napi_is_dataview(napi_env env, napi_value value, bool* result) +``` + +- `[in] env`: The environment that the API is invoked under. +- `[in] value`: The JavaScript value to check. +- `[out] result`: Whether the given `napi_value` represents a DataView. + +Returns `napi_ok` if the API succeeded. + +This API checks if the Object passed in is a DataView. + ### *napi_strict_equals* <!-- YAML added: v8.0.0 @@ -3165,6 +3248,7 @@ support it: [Object Wrap]: #n_api_object_wrap [Section 9.1.6]: https://tc39.github.io/ecma262/#sec-ordinary-object-internal-methods-and-internal-slots-defineownproperty-p-desc [Section 12.5.5]: https://tc39.github.io/ecma262/#sec-typeof-operator +[Section 24.3]: https://tc39.github.io/ecma262/#sec-dataview-objects [Working with JavaScript Functions]: #n_api_working_with_javascript_functions [Working with JavaScript Properties]: #n_api_working_with_javascript_properties [Working with JavaScript Values]: #n_api_working_with_javascript_values diff --git a/src/node_api.cc b/src/node_api.cc index 7a0332848b..a8fd789955 100644 --- a/src/node_api.cc +++ b/src/node_api.cc @@ -3016,6 +3016,72 @@ napi_status napi_get_typedarray_info(napi_env env, return napi_clear_last_error(env); } +napi_status napi_create_dataview(napi_env env, + size_t byte_length, + napi_value arraybuffer, + size_t byte_offset, + napi_value* result) { + NAPI_PREAMBLE(env); + CHECK_ARG(env, arraybuffer); + CHECK_ARG(env, result); + + v8::Local<v8::Value> value = v8impl::V8LocalValueFromJsValue(arraybuffer); + RETURN_STATUS_IF_FALSE(env, value->IsArrayBuffer(), napi_invalid_arg); + + v8::Local<v8::ArrayBuffer> buffer = value.As<v8::ArrayBuffer>(); + v8::Local<v8::DataView> DataView = v8::DataView::New(buffer, byte_offset, + byte_length); + + *result = v8impl::JsValueFromV8LocalValue(DataView); + return GET_RETURN_STATUS(env); +} + +napi_status napi_is_dataview(napi_env env, napi_value value, bool* result) { + CHECK_ENV(env); + CHECK_ARG(env, value); + CHECK_ARG(env, result); + + v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value); + *result = val->IsDataView(); + + return napi_clear_last_error(env); +} + +napi_status napi_get_dataview_info(napi_env env, + napi_value dataview, + size_t* byte_length, + void** data, + napi_value* arraybuffer, + size_t* byte_offset) { + CHECK_ENV(env); + CHECK_ARG(env, dataview); + + v8::Local<v8::Value> value = v8impl::V8LocalValueFromJsValue(dataview); + RETURN_STATUS_IF_FALSE(env, value->IsDataView(), napi_invalid_arg); + + v8::Local<v8::DataView> array = value.As<v8::DataView>(); + + if (byte_length != nullptr) { + *byte_length = array->ByteLength(); + } + + v8::Local<v8::ArrayBuffer> buffer = array->Buffer(); + if (data != nullptr) { + *data = static_cast<uint8_t*>(buffer->GetContents().Data()) + + array->ByteOffset(); + } + + if (arraybuffer != nullptr) { + *arraybuffer = v8impl::JsValueFromV8LocalValue(buffer); + } + + if (byte_offset != nullptr) { + *byte_offset = array->ByteOffset(); + } + + return napi_clear_last_error(env); +} + napi_status napi_get_version(napi_env env, uint32_t* result) { CHECK_ENV(env); CHECK_ARG(env, result); diff --git a/src/node_api.h b/src/node_api.h index f4d097ad10..5a2ba946ec 100644 --- a/src/node_api.h +++ b/src/node_api.h @@ -494,6 +494,21 @@ NAPI_EXTERN napi_status napi_get_typedarray_info(napi_env env, napi_value* arraybuffer, size_t* byte_offset); +NAPI_EXTERN napi_status napi_create_dataview(napi_env env, + size_t length, + napi_value arraybuffer, + size_t byte_offset, + napi_value* result); +NAPI_EXTERN napi_status napi_is_dataview(napi_env env, + napi_value value, + bool* result); +NAPI_EXTERN napi_status napi_get_dataview_info(napi_env env, + napi_value dataview, + size_t* bytelength, + void** data, + napi_value* arraybuffer, + size_t* byte_offset); + // Methods to manage simple async operations NAPI_EXTERN napi_status napi_create_async_work(napi_env env, diff --git a/test/addons-napi/test_dataview/binding.gyp b/test/addons-napi/test_dataview/binding.gyp new file mode 100644 index 0000000000..bf014dc9e7 --- /dev/null +++ b/test/addons-napi/test_dataview/binding.gyp @@ -0,0 +1,8 @@ +{ + "targets": [ + { + "target_name": "test_dataview", + "sources": [ "test_dataview.c" ] + } + ] +} diff --git a/test/addons-napi/test_dataview/test.js b/test/addons-napi/test_dataview/test.js new file mode 100644 index 0000000000..87cf8159ab --- /dev/null +++ b/test/addons-napi/test_dataview/test.js @@ -0,0 +1,14 @@ +'use strict'; +const common = require('../../common'); +const assert = require('assert'); + +// Testing api calls for arrays +const test_dataview = require(`./build/${common.buildType}/test_dataview`); + +//create dataview +const buffer = new ArrayBuffer(128); +const template = Reflect.construct(DataView, [buffer]); + +const theDataview = test_dataview.CreateDataView(template); +assert.ok(theDataview instanceof DataView, + 'The new variable should be of type Dataview'); diff --git a/test/addons-napi/test_dataview/test_dataview.c b/test/addons-napi/test_dataview/test_dataview.c new file mode 100644 index 0000000000..4060e4d266 --- /dev/null +++ b/test/addons-napi/test_dataview/test_dataview.c @@ -0,0 +1,49 @@ +#include <node_api.h> +#include <string.h> +#include "../common.h" + +napi_value CreateDataView(napi_env env, napi_callback_info info) { + size_t argc = 1; + napi_value args [1]; + NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL)); + + NAPI_ASSERT(env, argc == 1, "Wrong number of arguments"); + + napi_valuetype valuetype; + napi_value input_dataview = args[0]; + + NAPI_CALL(env, napi_typeof(env, input_dataview, &valuetype)); + NAPI_ASSERT(env, valuetype == napi_object, + "Wrong type of arguments. Expects a DataView as the first " + "argument."); + + bool is_dataview; + NAPI_CALL(env, napi_is_dataview(env, input_dataview, &is_dataview)); + NAPI_ASSERT(env, is_dataview, + "Wrong type of arguments. Expects a DataView as the first " + "argument."); + size_t byte_offset = 0; + size_t length = 0; + napi_value buffer; + NAPI_CALL(env, + napi_get_dataview_info(env, input_dataview, &length, NULL, + &buffer, &byte_offset)); + + napi_value output_dataview; + NAPI_CALL(env, + napi_create_dataview(env, length, buffer, + byte_offset, &output_dataview)); + + return output_dataview; +} + +void Init(napi_env env, napi_value exports, napi_value module, void* priv) { + napi_property_descriptor descriptors[] = { + DECLARE_NAPI_PROPERTY("CreateDataView", CreateDataView) + }; + + NAPI_CALL_RETURN_VOID(env, napi_define_properties( + env, exports, sizeof(descriptors) / sizeof(*descriptors), descriptors)); +} + +NAPI_MODULE(addon, Init) |