@@ -142,6 +142,30 @@ struct napi_env__ {
142142 (!try_catch.HasCaught() ? napi_ok \
143143 : napi_set_last_error((env), napi_pending_exception))
144144
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+
145169namespace {
146170namespace v8impl {
147171
@@ -3063,31 +3087,40 @@ napi_status napi_create_typedarray(napi_env env,
30633087
30643088 switch (type) {
30653089 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);
30673092 break ;
30683093 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);
30703096 break ;
30713097 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);
30733100 break ;
30743101 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);
30763104 break ;
30773105 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);
30793108 break ;
30803109 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);
30823112 break ;
30833113 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);
30853116 break ;
30863117 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);
30883120 break ;
30893121 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);
30913124 break ;
30923125 default :
30933126 return napi_set_last_error (env, napi_invalid_arg);
0 commit comments