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