@@ -3341,21 +3341,30 @@ napi_status NAPI_CDECL napi_create_dataview(napi_env env,
33413341 CHECK_ARG (env, result);
33423342
33433343 v8::Local<v8::Value> value = v8impl::V8LocalValueFromJsValue (arraybuffer);
3344- RETURN_STATUS_IF_FALSE (env, value->IsArrayBuffer (), napi_invalid_arg);
33453344
3346- v8::Local<v8::ArrayBuffer> buffer = value.As <v8::ArrayBuffer>();
3347- if (byte_length + byte_offset > buffer->ByteLength ()) {
3348- napi_throw_range_error (env,
3349- " ERR_NAPI_INVALID_DATAVIEW_ARGS" ,
3350- " byte_offset + byte_length should be less than or "
3351- " equal to the size in bytes of the array passed in" );
3352- return napi_set_last_error (env, napi_pending_exception);
3353- }
3354- v8::Local<v8::DataView> DataView =
3355- v8::DataView::New (buffer, byte_offset, byte_length);
3345+ auto create_dataview = [&](auto buffer) -> napi_status {
3346+ if (byte_length + byte_offset > buffer->ByteLength ()) {
3347+ napi_throw_range_error (
3348+ env,
3349+ " ERR_NAPI_INVALID_DATAVIEW_ARGS" ,
3350+ " byte_offset + byte_length should be less than or "
3351+ " equal to the size in bytes of the array passed in" );
3352+ return napi_set_last_error (env, napi_pending_exception);
3353+ }
33563354
3357- *result = v8impl::JsValueFromV8LocalValue (DataView);
3358- return GET_RETURN_STATUS (env);
3355+ v8::Local<v8::DataView> data_view =
3356+ v8::DataView::New (buffer, byte_offset, byte_length);
3357+ *result = v8impl::JsValueFromV8LocalValue (data_view);
3358+ return GET_RETURN_STATUS (env);
3359+ };
3360+
3361+ if (value->IsArrayBuffer ()) {
3362+ return create_dataview (value.As <v8::ArrayBuffer>());
3363+ } else if (value->IsSharedArrayBuffer ()) {
3364+ return create_dataview (value.As <v8::SharedArrayBuffer>());
3365+ } else {
3366+ return napi_set_last_error (env, napi_invalid_arg);
3367+ }
33593368}
33603369
33613370napi_status NAPI_CDECL napi_is_dataview (napi_env env,
0 commit comments