diff options
Diffstat (limited to 'cli/napi/js_native_api.rs')
-rw-r--r-- | cli/napi/js_native_api.rs | 134 |
1 files changed, 61 insertions, 73 deletions
diff --git a/cli/napi/js_native_api.rs b/cli/napi/js_native_api.rs index cbce113dc..6b31e1fd2 100644 --- a/cli/napi/js_native_api.rs +++ b/cli/napi/js_native_api.rs @@ -179,14 +179,15 @@ fn napi_get_last_error_info( } #[napi_sym] -fn napi_create_function( - env: &mut Env, +fn napi_create_function<'s>( + env: &'s mut Env, name: *const c_char, length: usize, - cb: napi_callback, + cb: Option<napi_callback>, cb_info: napi_callback_info, - result: *mut napi_value, + result: *mut napi_value<'s>, ) -> napi_status { + let env_ptr = env as *mut Env; check_arg!(env, result); check_arg!(env, cb); @@ -200,7 +201,9 @@ fn napi_create_function( }; unsafe { - *result = create_function(env, name, cb, cb_info).into(); + *result = + create_function(&mut env.scope(), env_ptr, name, cb.unwrap(), cb_info) + .into(); } napi_ok @@ -212,12 +215,13 @@ fn napi_define_class<'s>( env: &'s mut Env, utf8name: *const c_char, length: usize, - constructor: napi_callback, + constructor: Option<napi_callback>, callback_data: *mut c_void, property_count: usize, properties: *const napi_property_descriptor, result: *mut napi_value<'s>, ) -> napi_status { + let env_ptr = env as *mut Env; check_arg!(env, result); check_arg!(env, constructor); @@ -230,9 +234,13 @@ fn napi_define_class<'s>( Err(status) => return status, }; - let tpl = unsafe { - create_function_template(env, Some(name), constructor, callback_data) - }; + let tpl = create_function_template( + &mut env.scope(), + env_ptr, + Some(name), + constructor.unwrap(), + callback_data, + ); let napi_properties: &[napi_property_descriptor] = if property_count > 0 { unsafe { std::slice::from_raw_parts(properties, property_count) } @@ -248,28 +256,18 @@ fn napi_define_class<'s>( continue; } - let name = match unsafe { v8_name_from_property_descriptor(env, p) } { + let name = match unsafe { v8_name_from_property_descriptor(env_ptr, p) } { Ok(name) => name, Err(status) => return status, }; - let method = p.method; - let getter = p.getter; - let setter = p.setter; - - if getter.is_some() || setter.is_some() { - let getter: Option<v8::Local<v8::FunctionTemplate>> = if getter.is_some() - { - Some(unsafe { create_function_template(env, None, p.getter, p.data) }) - } else { - None - }; - let setter: Option<v8::Local<v8::FunctionTemplate>> = if setter.is_some() - { - Some(unsafe { create_function_template(env, None, p.setter, p.data) }) - } else { - None - }; + if p.getter.is_some() || p.setter.is_some() { + let getter = p.getter.map(|g| { + create_function_template(&mut env.scope(), env_ptr, None, g, p.data) + }); + let setter = p.setter.map(|s| { + create_function_template(&mut env.scope(), env_ptr, None, s, p.data) + }); let mut accessor_property = v8::PropertyAttribute::NONE; if getter.is_some() @@ -290,9 +288,14 @@ fn napi_define_class<'s>( let proto = tpl.prototype_template(&mut env.scope()); proto.set_accessor_property(name, getter, setter, accessor_property); - } else if method.is_some() { - let function = - unsafe { create_function_template(env, None, p.method, p.data) }; + } else if let Some(method) = p.method { + let function = create_function_template( + &mut env.scope(), + env_ptr, + None, + method, + p.data, + ); let proto = tpl.prototype_template(&mut env.scope()); proto.set(name, function.into()); } else { @@ -301,7 +304,6 @@ fn napi_define_class<'s>( } } - let env_ptr = env as *mut Env; let value: v8::Local<v8::Value> = tpl.get_function(&mut env.scope()).unwrap().into(); @@ -781,17 +783,19 @@ fn napi_define_properties( let configurable = property.attributes & napi_configurable != 0; if property.getter.is_some() || property.setter.is_some() { - let local_getter: v8::Local<v8::Value> = if property.getter.is_some() { - unsafe { - create_function(env_ptr, None, property.getter, property.data).into() - } + let local_getter: v8::Local<v8::Value> = if let Some(getter) = + property.getter + { + create_function(&mut env.scope(), env_ptr, None, getter, property.data) + .into() } else { v8::undefined(scope).into() }; - let local_setter: v8::Local<v8::Value> = if property.setter.is_some() { - unsafe { - create_function(env_ptr, None, property.setter, property.data).into() - } + let local_setter: v8::Local<v8::Value> = if let Some(setter) = + property.setter + { + create_function(&mut env.scope(), env_ptr, None, setter, property.data) + .into() } else { v8::undefined(scope).into() }; @@ -807,11 +811,15 @@ fn napi_define_properties( { return napi_invalid_arg; } - } else if property.method.is_some() { + } else if let Some(method) = property.method { let method: v8::Local<v8::Value> = { - let function = unsafe { - create_function(env_ptr, None, property.method, property.data) - }; + let function = create_function( + &mut env.scope(), + env_ptr, + None, + method, + property.data, + ); function.into() }; @@ -1692,18 +1700,16 @@ fn napi_call_function( } #[napi_sym] -fn napi_get_global(env: *mut Env, result: *mut napi_value) -> napi_status { - let env = check_env!(env); +fn napi_get_global(env_ptr: *mut Env, result: *mut napi_value) -> napi_status { + let env = check_env!(env_ptr); check_arg!(env, result); + let global = v8::Local::new(&mut env.scope(), &env.global); unsafe { - *result = std::mem::transmute::<NonNull<v8::Value>, v8::Local<v8::Value>>( - env.global, - ) - .into(); + *result = global.into(); } - return napi_clear_last_error(env); + return napi_clear_last_error(env_ptr); } #[napi_sym] @@ -2869,7 +2875,7 @@ fn napi_create_arraybuffer<'s>( if !data.is_null() { unsafe { - *data = get_array_buffer_ptr(buffer) as _; + *data = get_array_buffer_ptr(buffer); } } @@ -2915,7 +2921,7 @@ fn napi_create_external_arraybuffer<'s>( fn napi_get_arraybuffer_info( env: *mut Env, value: napi_value, - data: *mut *mut u8, + data: *mut *mut c_void, length: *mut usize, ) -> napi_status { let env = check_env!(env); @@ -3121,7 +3127,7 @@ fn napi_get_typedarray_info( fn napi_create_dataview<'s>( env: &'s mut Env, byte_length: usize, - arraybuffer: napi_value, + arraybuffer: napi_value<'s>, byte_offset: usize, result: *mut napi_value<'s>, ) -> napi_status { @@ -3144,26 +3150,8 @@ fn napi_create_dataview<'s>( } } - // let dataview = v8::DataView::new(&mut env, buffer, byte_offset, byte_length); - let dataview = { - let context = &mut env.scope().get_current_context(); - let global = context.global(&mut env.scope()); - let data_view_name = v8::String::new(&mut env.scope(), "DataView").unwrap(); - let data_view = - global.get(&mut env.scope(), data_view_name.into()).unwrap(); - let Ok(data_view) = v8::Local::<v8::Function>::try_from(data_view) else { - return napi_function_expected; - }; - let byte_offset = v8::Number::new(&mut env.scope(), byte_offset as f64); - let byte_length = v8::Number::new(&mut env.scope(), byte_length as f64); - let Some(dv) = data_view.new_instance( - &mut env.scope(), - &[buffer.into(), byte_offset.into(), byte_length.into()], - ) else { - return napi_generic_failure; - }; - dv - }; + let dataview = + v8::DataView::new(&mut env.scope(), buffer, byte_offset, byte_length); unsafe { *result = dataview.into(); |