| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 51513fd commit ca10fda
5 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1019,6 +1019,18 @@ While using `N-API`, `Constructor.prototype` was not an object. | |||
| 1019 | 1019 | While calling `napi_create_dataview()`, a given `offset` was outside the bounds | |
| 1020 | 1020 | of the dataview or `offset + length` was larger than a length of given `buffer`. | |
| 1021 | 1021 | ||
| 1022 | + <a id="ERR_NAPI_INVALID_TYPEDARRAY_ALIGNMENT"></a> | ||
| 1023 | + ### ERR_NAPI_INVALID_TYPEDARRAY_ALIGNMENT | ||
| 1024 | + | ||
| 1025 | + While calling `napi_create_typedarray()`, the provided `offset` was not a | ||
| 1026 | + multiple of the element size. | ||
| 1027 | + | ||
| 1028 | + <a id="ERR_NAPI_INVALID_TYPEDARRAY_LENGTH"></a> | ||
| 1029 | + ### ERR_NAPI_INVALID_TYPEDARRAY_LENGTH | ||
| 1030 | + | ||
| 1031 | + While calling `napi_create_typedarray()`, `(length * size_of_element) + | ||
| 1032 | + byte_offset` was larger than the length of given `buffer`. | ||
| 1033 | + | ||
| 1022 | 1034 | <a id="ERR_NO_ICU"></a> | |
| 1023 | 1035 | ### ERR_NO_ICU | |
| 1024 | 1036 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -268,6 +268,9 @@ E('ERR_NAPI_CONS_PROTOTYPE_OBJECT', 'Constructor.prototype must be an object'); | |||
| 268 | 268 | E('ERR_NAPI_INVALID_DATAVIEW_ARGS', | |
| 269 | 269 | 'byte_offset + byte_length should be less than or eqaul to the size in ' + | |
| 270 | 270 | 'bytes of the array passed in'); | |
| 271 | + E('ERR_NAPI_INVALID_TYPEDARRAY_ALIGNMENT', 'start offset of %s should be a ' + | ||
| 272 | + 'multiple of %s'); | ||
| 273 | + E('ERR_NAPI_INVALID_TYPEDARRAY_LENGTH', 'Invalid typed array length'); | ||
| 271 | 274 | E('ERR_NO_CRYPTO', 'Node.js is not compiled with OpenSSL crypto support'); | |
| 272 | 275 | E('ERR_NO_ICU', '%s is not supported on Node.js compiled without ICU'); | |
| 273 | 276 | E('ERR_PARSE_HISTORY_DATA', 'Could not parse history data in %s'); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -142,6 +142,30 @@ struct napi_env__ { | |||
| 142 | 142 | (!try_catch.HasCaught() ? napi_ok \ | |
| 143 | 143 | : napi_set_last_error((env), napi_pending_exception)) | |
| 144 | 144 | ||
| 145 | + #define THROW_RANGE_ERROR_IF_FALSE(env, condition, error, message) \ | ||
| 146 | + do { \ | ||
| 147 | + if (!(condition)) { \ | ||
| 148 | + napi_throw_range_error((env), (error), (message)); \ | ||
| 149 | + return napi_set_last_error((env), napi_generic_failure); \ | ||
| 150 | + } \ | ||
| 151 | + } while (0) | ||
| 152 | + | ||
| 153 | + #define CREATE_TYPED_ARRAY( \ | ||
| 154 | + env, type, size_of_element, buffer, byte_offset, length, out) \ | ||
| 155 | + do { \ | ||
| 156 | + if ((size_of_element) > 1) { \ | ||
| 157 | + THROW_RANGE_ERROR_IF_FALSE( \ | ||
| 158 | + (env), (byte_offset) % (size_of_element) == 0, \ | ||
| 159 | + "ERR_NAPI_INVALID_TYPEDARRAY_ALIGNMENT", \ | ||
| 160 | + "start offset of "#type" should be a multiple of "#size_of_element); \ | ||
| 161 | + } \ | ||
| 162 | + THROW_RANGE_ERROR_IF_FALSE((env), (length) * (size_of_element) + \ | ||
| 163 | + (byte_offset) <= buffer->ByteLength(), \ | ||
| 164 | + "ERR_NAPI_INVALID_TYPEDARRAY_LENGTH", \ | ||
| 165 | + "Invalid typed array length"); \ | ||
| 166 | + (out) = v8::type::New((buffer), (byte_offset), (length)); \ | ||
| 167 | + } while (0) | ||
| 168 | + | ||
| 145 | 169 | namespace { | |
| 146 | 170 | namespace v8impl { | |
| 147 | 171 | ||
@@ -3063,31 +3087,40 @@ napi_status napi_create_typedarray(napi_env env, | |||
| 3063 | 3087 | ||
| 3064 | 3088 | switch (type) { | |
| 3065 | 3089 | case napi_int8_array: | |
| 3066 | - typedArray = v8::Int8Array::New(buffer, byte_offset, length); | ||
| 3090 | + CREATE_TYPED_ARRAY( | ||
| 3091 | + env, Int8Array, 1, buffer, byte_offset, length, typedArray); | ||
| 3067 | 3092 | break; | |
| 3068 | 3093 | case napi_uint8_array: | |
| 3069 | - typedArray = v8::Uint8Array::New(buffer, byte_offset, length); | ||
| 3094 | + CREATE_TYPED_ARRAY( | ||
| 3095 | + env, Uint8Array, 1, buffer, byte_offset, length, typedArray); | ||
| 3070 | 3096 | break; | |
| 3071 | 3097 | case napi_uint8_clamped_array: | |
| 3072 | - typedArray = v8::Uint8ClampedArray::New(buffer, byte_offset, length); | ||
| 3098 | + CREATE_TYPED_ARRAY( | ||
| 3099 | + env, Uint8ClampedArray, 1, buffer, byte_offset, length, typedArray); | ||
| 3073 | 3100 | break; | |
| 3074 | 3101 | case napi_int16_array: | |
| 3075 | - typedArray = v8::Int16Array::New(buffer, byte_offset, length); | ||
| 3102 | + CREATE_TYPED_ARRAY( | ||
| 3103 | + env, Int16Array, 2, buffer, byte_offset, length, typedArray); | ||
| 3076 | 3104 | break; | |
| 3077 | 3105 | case napi_uint16_array: | |
| 3078 | - typedArray = v8::Uint16Array::New(buffer, byte_offset, length); | ||
| 3106 | + CREATE_TYPED_ARRAY( | ||
| 3107 | + env, Uint16Array, 2, buffer, byte_offset, length, typedArray); | ||
| 3079 | 3108 | break; | |
| 3080 | 3109 | case napi_int32_array: | |
| 3081 | - typedArray = v8::Int32Array::New(buffer, byte_offset, length); | ||
| 3110 | + CREATE_TYPED_ARRAY( | ||
| 3111 | + env, Int32Array, 4, buffer, byte_offset, length, typedArray); | ||
| 3082 | 3112 | break; | |
| 3083 | 3113 | case napi_uint32_array: | |
| 3084 | - typedArray = v8::Uint32Array::New(buffer, byte_offset, length); | ||
| 3114 | + CREATE_TYPED_ARRAY( | ||
| 3115 | + env, Uint32Array, 4, buffer, byte_offset, length, typedArray); | ||
| 3085 | 3116 | break; | |
| 3086 | 3117 | case napi_float32_array: | |
| 3087 | - typedArray = v8::Float32Array::New(buffer, byte_offset, length); | ||
| 3118 | + CREATE_TYPED_ARRAY( | ||
| 3119 | + env, Float32Array, 4, buffer, byte_offset, length, typedArray); | ||
| 3088 | 3120 | break; | |
| 3089 | 3121 | case napi_float64_array: | |
| 3090 | - typedArray = v8::Float64Array::New(buffer, byte_offset, length); | ||
| 3122 | + CREATE_TYPED_ARRAY( | ||
| 3123 | + env, Float64Array, 8, buffer, byte_offset, length, typedArray); | ||
| 3091 | 3124 | break; | |
| 3092 | 3125 | default: | |
| 3093 | 3126 | return napi_set_last_error(env, napi_invalid_arg); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -55,3 +55,21 @@ arrayTypes.forEach((currentType) => { | |||
| 55 | 55 | assert.notStrictEqual(theArray, template); | |
| 56 | 56 | assert.strictEqual(theArray.buffer, buffer); | |
| 57 | 57 | }); | |
| 58 | + | ||
| 59 | + arrayTypes.forEach((currentType) => { | ||
| 60 | + const template = Reflect.construct(currentType, buffer); | ||
| 61 | + assert.throws(() => { | ||
| 62 | + test_typedarray.CreateTypedArray(template, buffer, 0, 136); | ||
| 63 | + }, /Invalid typed array length/); | ||
| 64 | + }); | ||
| 65 | + | ||
| 66 | + const nonByteArrayTypes = [ Int16Array, Uint16Array, Int32Array, Uint32Array, | ||
| 67 | + Float32Array, Float64Array ]; | ||
| 68 | + nonByteArrayTypes.forEach((currentType) => { | ||
| 69 | + const template = Reflect.construct(currentType, buffer); | ||
| 70 | + assert.throws(() => { | ||
| 71 | + test_typedarray.CreateTypedArray(template, buffer, | ||
| 72 | + currentType.BYTES_PER_ELEMENT + 1, 1); | ||
| 73 | + console.log(`start of offset ${currentType}`); | ||
| 74 | + }, /start offset of/); | ||
| 75 | + }); | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -97,11 +97,11 @@ napi_value External(napi_env env, napi_callback_info info) { | |||
| 97 | 97 | } | |
| 98 | 98 | ||
| 99 | 99 | napi_value CreateTypedArray(napi_env env, napi_callback_info info) { | |
| 100 | - size_t argc = 2; | ||
| 101 | - napi_value args[2]; | ||
| 100 | + size_t argc = 4; | ||
| 101 | + napi_value args[4]; | ||
| 102 | 102 | NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL)); | |
| 103 | 103 | ||
| 104 | - NAPI_ASSERT(env, argc == 2, "Wrong number of arguments"); | ||
| 104 | + NAPI_ASSERT(env, argc == 2 || argc == 4, "Wrong number of arguments"); | ||
| 105 | 105 | ||
| 106 | 106 | napi_value input_array = args[0]; | |
| 107 | 107 | napi_valuetype valuetype0; | |
@@ -136,6 +136,28 @@ napi_value CreateTypedArray(napi_env env, napi_callback_info info) { | |||
| 136 | 136 | NAPI_CALL(env, napi_get_typedarray_info( | |
| 137 | 137 | env, input_array, &type, &length, NULL, &in_array_buffer, &byte_offset)); | |
| 138 | 138 | ||
| 139 | + if (argc == 4) { | ||
| 140 | + napi_valuetype valuetype2; | ||
| 141 | + NAPI_CALL(env, napi_typeof(env, args[2], &valuetype2)); | ||
| 142 | + | ||
| 143 | + NAPI_ASSERT(env, valuetype2 == napi_number, | ||
| 144 | + "Wrong type of arguments. Expects a number as third argument."); | ||
| 145 | + | ||
| 146 | + uint32_t uint32_length; | ||
| 147 | + NAPI_CALL(env, napi_get_value_uint32(env, args[2], &uint32_length)); | ||
| 148 | + length = uint32_length; | ||
| 149 | + | ||
| 150 | + napi_valuetype valuetype3; | ||
| 151 | + NAPI_CALL(env, napi_typeof(env, args[3], &valuetype3)); | ||
| 152 | + | ||
| 153 | + NAPI_ASSERT(env, valuetype3 == napi_number, | ||
| 154 | + "Wrong type of arguments. Expects a number as third argument."); | ||
| 155 | + | ||
| 156 | + uint32_t uint32_byte_offset; | ||
| 157 | + NAPI_CALL(env, napi_get_value_uint32(env, args[3], &uint32_byte_offset)); | ||
| 158 | + byte_offset = uint32_byte_offset; | ||
| 159 | + } | ||
| 160 | + | ||
| 139 | 161 | napi_value output_array; | |
| 140 | 162 | NAPI_CALL(env, napi_create_typedarray( | |
| 141 | 163 | env, type, length, input_buffer, byte_offset, &output_array)); | |
| Back | FazBrowse Home | New Git URL |
0 commit comments