@@ -3298,21 +3298,30 @@ napi_status NAPI_CDECL napi_create_dataview(napi_env env,
32983298 CHECK_ARG (env, result);
32993299
33003300 v8::Local<v8::Value> value = v8impl::V8LocalValueFromJsValue (arraybuffer);
3301- RETURN_STATUS_IF_FALSE (env, value->IsArrayBuffer (), napi_invalid_arg);
33023301
3303- v8::Local<v8::ArrayBuffer> buffer = value.As <v8::ArrayBuffer>();
3304- if (byte_length + byte_offset > buffer->ByteLength ()) {
3305- napi_throw_range_error (env,
3306- " ERR_NAPI_INVALID_DATAVIEW_ARGS" ,
3307- " byte_offset + byte_length should be less than or "
3308- " equal to the size in bytes of the array passed in" );
3309- return napi_set_last_error (env, napi_pending_exception);
3310- }
3311- v8::Local<v8::DataView> DataView =
3312- v8::DataView::New (buffer, byte_offset, byte_length);
3302+ auto create_dataview = [&](auto buffer) -> napi_status {
3303+ if (byte_length + byte_offset > buffer->ByteLength ()) {
3304+ napi_throw_range_error (
3305+ env,
3306+ " ERR_NAPI_INVALID_DATAVIEW_ARGS" ,
3307+ " byte_offset + byte_length should be less than or "
3308+ " equal to the size in bytes of the array passed in" );
3309+ return napi_set_last_error (env, napi_pending_exception);
3310+ }
33133311
3314- *result = v8impl::JsValueFromV8LocalValue (DataView);
3315- return GET_RETURN_STATUS (env);
3312+ v8::Local<v8::DataView> data_view =
3313+ v8::DataView::New (buffer, byte_offset, byte_length);
3314+ *result = v8impl::JsValueFromV8LocalValue (data_view);
3315+ return GET_RETURN_STATUS (env);
3316+ };
3317+
3318+ if (value->IsArrayBuffer ()) {
3319+ return create_dataview (value.As <v8::ArrayBuffer>());
3320+ } else if (value->IsSharedArrayBuffer ()) {
3321+ return create_dataview (value.As <v8::SharedArrayBuffer>());
3322+ } else {
3323+ return napi_set_last_error (env, napi_invalid_arg);
3324+ }
33163325}
33173326
33183327napi_status NAPI_CDECL napi_is_dataview (napi_env env,
0 commit comments