0
0
Fork 0
mirror of https://github.com/denoland/rusty_v8.git synced 2025-02-02 04:37:35 -05:00

Fix remaining Local::from_raw() misuse, and correct some lifetimes (#388)

This commit is contained in:
Bert Belder 2020-05-31 18:45:00 +02:00
parent c114c46e15
commit 405a874c36
No known key found for this signature in database
GPG key ID: 7A77887B2E2ED461
13 changed files with 89 additions and 64 deletions

View file

@ -24,7 +24,7 @@ impl ArrayBufferView {
/// Returns underlying ArrayBuffer. /// Returns underlying ArrayBuffer.
pub fn buffer<'sc>( pub fn buffer<'sc>(
&self, &self,
scope: &'_ mut impl ToLocal<'sc>, scope: &mut impl ToLocal<'sc>,
) -> Option<Local<'sc, ArrayBuffer>> { ) -> Option<Local<'sc, ArrayBuffer>> {
unsafe { scope.to_local(v8__ArrayBufferView__Buffer(self)) } unsafe { scope.to_local(v8__ArrayBufferView__Buffer(self)) }
} }

View file

@ -320,14 +320,18 @@ impl Isolate {
/// exception has been scheduled it is illegal to invoke any JavaScript /// exception has been scheduled it is illegal to invoke any JavaScript
/// operation; the caller must return immediately and only after the exception /// operation; the caller must return immediately and only after the exception
/// has been handled does it become legal to invoke JavaScript operations. /// has been handled does it become legal to invoke JavaScript operations.
pub fn throw_exception<'sc>( ///
/// This function always returns the `undefined` value.
pub fn throw_exception(
&mut self, &mut self,
exception: Local<Value>, exception: Local<Value>,
) -> Local<'sc, Value> { ) -> Local<'_, Value> {
unsafe { let result = unsafe {
let ptr = v8__Isolate__ThrowException(self, &*exception); Local::from_raw(v8__Isolate__ThrowException(self, &*exception))
Local::from_raw(ptr).unwrap()
} }
.unwrap();
debug_assert!(result.is_undefined());
result
} }
/// Runs the default MicrotaskQueue until it gets empty. /// Runs the default MicrotaskQueue until it gets empty.

View file

@ -3,6 +3,7 @@
use crate::Context; use crate::Context;
use crate::Local; use crate::Local;
use crate::String; use crate::String;
use crate::ToLocal;
use crate::Value; use crate::Value;
extern "C" { extern "C" {
@ -19,17 +20,19 @@ extern "C" {
/// Tries to parse the string `json_string` and returns it as value if /// Tries to parse the string `json_string` and returns it as value if
/// successful. /// successful.
pub fn parse<'sc>( pub fn parse<'sc>(
context: Local<'sc, Context>, scope: &mut impl ToLocal<'sc>,
json_string: Local<'sc, String>, context: Local<'_, Context>,
json_string: Local<'_, String>,
) -> Option<Local<'sc, Value>> { ) -> Option<Local<'sc, Value>> {
unsafe { Local::from_raw(v8__JSON__Parse(&*context, &*json_string)) } unsafe { scope.to_local(v8__JSON__Parse(&*context, &*json_string)) }
} }
/// Tries to stringify the JSON-serializable object `json_object` and returns /// Tries to stringify the JSON-serializable object `json_object` and returns
/// it as string if successful. /// it as string if successful.
pub fn stringify<'sc>( pub fn stringify<'sc>(
scope: &mut impl ToLocal<'sc>,
context: Local<'sc, Context>, context: Local<'sc, Context>,
json_object: Local<'sc, Value>, json_object: Local<'sc, Value>,
) -> Option<Local<'sc, String>> { ) -> Option<Local<'sc, String>> {
unsafe { Local::from_raw(v8__JSON__Stringify(&*context, &*json_object)) } unsafe { scope.to_local(v8__JSON__Stringify(&*context, &*json_object)) }
} }

View file

@ -32,7 +32,6 @@ use crate::Value;
/// Some(resolved_module) /// Some(resolved_module)
/// } /// }
/// ``` /// ```
///
// System V AMD64 ABI: Local<Module> returned in a register. // System V AMD64 ABI: Local<Module> returned in a register.
#[cfg(not(target_os = "windows"))] #[cfg(not(target_os = "windows"))]
@ -147,7 +146,9 @@ impl Module {
/// For a module in kErrored status, this returns the corresponding exception. /// For a module in kErrored status, this returns the corresponding exception.
pub fn get_exception(&self) -> Local<Value> { pub fn get_exception(&self) -> Local<Value> {
unsafe { Local::from_raw(v8__Module__GetException(self)).unwrap() } // Note: the returned value is not actually stored in a HandleScope,
// therefore we don't need a scope object here.
unsafe { Local::from_raw(v8__Module__GetException(self)) }.unwrap()
} }
/// Returns the number of modules requested by this module. /// Returns the number of modules requested by this module.
@ -160,6 +161,8 @@ impl Module {
/// Returns the ith module specifier in this module. /// Returns the ith module specifier in this module.
/// i must be < self.get_module_requests_length() and >= 0. /// i must be < self.get_module_requests_length() and >= 0.
pub fn get_module_request(&self, i: usize) -> Local<String> { pub fn get_module_request(&self, i: usize) -> Local<String> {
// Note: the returned value is not actually stored in a HandleScope,
// therefore we don't need a scope object here.
unsafe { unsafe {
Local::from_raw(v8__Module__GetModuleRequest(self, i.try_into().unwrap())) Local::from_raw(v8__Module__GetModuleRequest(self, i.try_into().unwrap()))
} }
@ -189,6 +192,8 @@ impl Module {
/// ///
/// The module's status must be at least kInstantiated. /// The module's status must be at least kInstantiated.
pub fn get_module_namespace(&self) -> Local<Value> { pub fn get_module_namespace(&self) -> Local<Value> {
// Note: the returned value is not actually stored in a HandleScope,
// therefore we don't need a scope object here.
unsafe { Local::from_raw(v8__Module__GetModuleNamespace(self)).unwrap() } unsafe { Local::from_raw(v8__Module__GetModuleNamespace(self)).unwrap() }
} }

View file

@ -91,10 +91,11 @@ impl Promise {
/// See `Self::then2`. /// See `Self::then2`.
pub fn catch<'sc>( pub fn catch<'sc>(
&self, &self,
context: Local<'sc, Context>, scope: &mut impl ToLocal<'sc>,
handler: Local<'sc, Function>, context: Local<Context>,
handler: Local<Function>,
) -> Option<Local<'sc, Promise>> { ) -> Option<Local<'sc, Promise>> {
unsafe { Local::from_raw(v8__Promise__Catch(&*self, &*context, &*handler)) } unsafe { scope.to_local(v8__Promise__Catch(&*self, &*context, &*handler)) }
} }
/// Register a resolution handler with a promise. /// Register a resolution handler with a promise.
@ -102,10 +103,11 @@ impl Promise {
/// See `Self::then2`. /// See `Self::then2`.
pub fn then<'sc>( pub fn then<'sc>(
&self, &self,
context: Local<'sc, Context>, scope: &mut impl ToLocal<'sc>,
handler: Local<'sc, Function>, context: Local<Context>,
handler: Local<Function>,
) -> Option<Local<'sc, Promise>> { ) -> Option<Local<'sc, Promise>> {
unsafe { Local::from_raw(v8__Promise__Then(&*self, &*context, &*handler)) } unsafe { scope.to_local(v8__Promise__Then(&*self, &*context, &*handler)) }
} }
/// Register a resolution/rejection handler with a promise. /// Register a resolution/rejection handler with a promise.
@ -114,12 +116,13 @@ impl Promise {
/// invoked at the end of turn. /// invoked at the end of turn.
pub fn then2<'sc>( pub fn then2<'sc>(
&self, &self,
context: Local<'sc, Context>, scope: &mut impl ToLocal<'sc>,
on_fulfilled: Local<'sc, Function>, context: Local<Context>,
on_rejected: Local<'sc, Function>, on_fulfilled: Local<Function>,
on_rejected: Local<Function>,
) -> Option<Local<'sc, Promise>> { ) -> Option<Local<'sc, Promise>> {
unsafe { unsafe {
Local::from_raw(v8__Promise__Then2( scope.to_local(v8__Promise__Then2(
&*self, &*self,
&*context, &*context,
&*on_fulfilled, &*on_fulfilled,
@ -182,9 +185,8 @@ pub struct PromiseRejectMessage<'msg>([usize; 3], PhantomData<&'msg ()>);
impl<'msg> PromiseRejectMessage<'msg> { impl<'msg> PromiseRejectMessage<'msg> {
pub fn get_promise(&self) -> Local<'msg, Promise> { pub fn get_promise(&self) -> Local<'msg, Promise> {
unsafe { unsafe { Local::from_raw(v8__PromiseRejectMessage__GetPromise(self)) }
Local::from_raw(v8__PromiseRejectMessage__GetPromise(self)).unwrap() .unwrap()
}
} }
pub fn get_event(&self) -> PromiseRejectEvent { pub fn get_event(&self) -> PromiseRejectEvent {
@ -192,8 +194,7 @@ impl<'msg> PromiseRejectMessage<'msg> {
} }
pub fn get_value(&self) -> Local<'msg, Value> { pub fn get_value(&self) -> Local<'msg, Value> {
unsafe { unsafe { Local::from_raw(v8__PromiseRejectMessage__GetValue(self)) }
Local::from_raw(v8__PromiseRejectMessage__GetValue(self)).unwrap() .unwrap()
}
} }
} }

View file

@ -156,12 +156,16 @@ pub trait ToLocal<'s>: InIsolate {
} }
fn get_current_context(&mut self) -> Option<Local<'s, Context>> { fn get_current_context(&mut self) -> Option<Local<'s, Context>> {
unsafe { Local::from_raw(v8__Isolate__GetCurrentContext(self.isolate())) } unsafe {
let ptr = v8__Isolate__GetCurrentContext(self.isolate());
self.to_local(ptr)
}
} }
fn get_entered_or_microtask_context(&mut self) -> Option<Local<'s, Context>> { fn get_entered_or_microtask_context(&mut self) -> Option<Local<'s, Context>> {
unsafe { unsafe {
Local::from_raw(v8__Isolate__GetEnteredOrMicrotaskContext(self.isolate())) let ptr = v8__Isolate__GetEnteredOrMicrotaskContext(self.isolate());
self.to_local(ptr)
} }
} }
} }

View file

@ -1,12 +1,12 @@
// Copyright 2019-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2019-2020 the Deno authors. All rights reserved. MIT license.
//! For compiling scripts. use std::mem::MaybeUninit;
use crate::InIsolate;
use crate::Isolate; use crate::Isolate;
use crate::Local; use crate::Local;
use crate::Module; use crate::Module;
use crate::ScriptOrigin; use crate::ScriptOrigin;
use crate::String; use crate::String;
use std::mem::MaybeUninit; use crate::ToLocal;
extern "C" { extern "C" {
fn v8__ScriptCompiler__Source__CONSTRUCT( fn v8__ScriptCompiler__Source__CONSTRUCT(
@ -77,10 +77,10 @@ pub enum NoCacheReason {
/// ///
/// Corresponds to the ParseModule abstract operation in the ECMAScript /// Corresponds to the ParseModule abstract operation in the ECMAScript
/// specification. /// specification.
pub fn compile_module<'a>( pub fn compile_module<'sc>(
scope: &mut impl InIsolate, scope: &mut impl ToLocal<'sc>,
source: Source, source: Source,
) -> Option<Local<'a, Module>> { ) -> Option<Local<'sc, Module>> {
compile_module2( compile_module2(
scope, scope,
source, source,
@ -90,18 +90,19 @@ pub fn compile_module<'a>(
} }
/// Same as compile_module with more options. /// Same as compile_module with more options.
pub fn compile_module2<'a>( pub fn compile_module2<'sc>(
scope: &mut impl InIsolate, scope: &mut impl ToLocal<'sc>,
mut source: Source, mut source: Source,
options: CompileOptions, options: CompileOptions,
no_cache_reason: NoCacheReason, no_cache_reason: NoCacheReason,
) -> Option<Local<'a, Module>> { ) -> Option<Local<'sc, Module>> {
unsafe { unsafe {
Local::from_raw(v8__ScriptCompiler__CompileModule( let ptr = v8__ScriptCompiler__CompileModule(
scope.isolate(), scope.isolate(),
&mut source, &mut source,
options, options,
no_cache_reason, no_cache_reason,
)) );
scope.to_local(ptr)
} }
} }

View file

@ -17,7 +17,7 @@ extern "C" {
impl ScriptOrModule { impl ScriptOrModule {
/// The name that was passed by the embedder as ResourceName to the /// The name that was passed by the embedder as ResourceName to the
/// ScriptOrigin. This can be either a v8::String or v8::Undefined. /// ScriptOrigin. This can be either a v8::String or v8::Undefined.
pub fn get_resource_name(&self) -> Local<'_, Value> { pub fn get_resource_name(&self) -> Local<Value> {
unsafe { unsafe {
let ptr = v8__ScriptOrModule__GetResourceName(self); let ptr = v8__ScriptOrModule__GetResourceName(self);
Local::from_raw(ptr).unwrap() Local::from_raw(ptr).unwrap()
@ -26,7 +26,7 @@ impl ScriptOrModule {
/// The options that were passed by the embedder as HostDefinedOptions to the /// The options that were passed by the embedder as HostDefinedOptions to the
/// ScriptOrigin. /// ScriptOrigin.
pub fn get_host_defined_options(&self) -> Local<'_, PrimitiveArray> { pub fn get_host_defined_options(&self) -> Local<PrimitiveArray> {
unsafe { unsafe {
let ptr = v8__ScriptOrModule__GetHostDefinedOptions(self); let ptr = v8__ScriptOrModule__GetHostDefinedOptions(self);
Local::from_raw(ptr).unwrap() Local::from_raw(ptr).unwrap()

View file

@ -50,10 +50,11 @@ impl SharedArrayBuffer {
byte_length: usize, byte_length: usize,
) -> Option<Local<'sc, SharedArrayBuffer>> { ) -> Option<Local<'sc, SharedArrayBuffer>> {
unsafe { unsafe {
Local::from_raw(v8__SharedArrayBuffer__New__with_byte_length( let ptr = v8__SharedArrayBuffer__New__with_byte_length(
scope.isolate(), scope.isolate(),
byte_length, byte_length,
)) );
scope.to_local(ptr)
} }
} }

View file

@ -161,8 +161,15 @@ impl<'tc> TryCatch<'tc> {
/// it is illegal to execute any JavaScript operations after calling /// it is illegal to execute any JavaScript operations after calling
/// ReThrow; the caller must return immediately to where the exception /// ReThrow; the caller must return immediately to where the exception
/// is caught. /// is caught.
pub fn rethrow<'a>(&'_ mut self) -> Option<Local<'a, Value>> { ///
unsafe { Local::from_raw(v8__TryCatch__ReThrow(&mut self.0)) } /// This function returns the `undefined` value when successful, or `None` if
/// no exception was caught and therefore there was nothing to rethrow.
pub fn rethrow(&mut self) -> Option<Local<'_, Value>> {
let result = unsafe { Local::from_raw(v8__TryCatch__ReThrow(&mut self.0)) };
if let Some(value) = result {
debug_assert!(value.is_undefined())
}
result
} }
/// Returns true if verbosity is enabled. /// Returns true if verbosity is enabled.

View file

@ -1,7 +1,7 @@
use std::ops::DerefMut; // Copyright 2019-2020 the Deno authors. All rights reserved. MIT license.
use crate::ArrayBuffer; use crate::ArrayBuffer;
use crate::Local; use crate::Local;
use crate::ToLocal;
use crate::Uint8Array; use crate::Uint8Array;
extern "C" { extern "C" {
@ -14,12 +14,11 @@ extern "C" {
impl Uint8Array { impl Uint8Array {
pub fn new<'sc>( pub fn new<'sc>(
mut buf: Local<ArrayBuffer>, scope: &mut impl ToLocal<'sc>,
buf: Local<ArrayBuffer>,
byte_offset: usize, byte_offset: usize,
length: usize, length: usize,
) -> Option<Local<'sc, Uint8Array>> { ) -> Option<Local<'sc, Uint8Array>> {
unsafe { unsafe { scope.to_local(v8__Uint8Array__New(&*buf, byte_offset, length)) }
Local::from_raw(v8__Uint8Array__New(buf.deref_mut(), byte_offset, length))
}
} }
} }

View file

@ -424,7 +424,7 @@ impl Value {
scope: &mut impl ToLocal<'sc>, scope: &mut impl ToLocal<'sc>,
) -> Option<Local<'sc, BigInt>> { ) -> Option<Local<'sc, BigInt>> {
scope.get_current_context().and_then(|context| unsafe { scope.get_current_context().and_then(|context| unsafe {
Local::from_raw(v8__Value__ToBigInt(self, &*context)) scope.to_local(v8__Value__ToBigInt(self, &*context))
}) })
} }
@ -433,7 +433,7 @@ impl Value {
scope: &mut impl ToLocal<'sc>, scope: &mut impl ToLocal<'sc>,
) -> Option<Local<'sc, Number>> { ) -> Option<Local<'sc, Number>> {
scope.get_current_context().and_then(|context| unsafe { scope.get_current_context().and_then(|context| unsafe {
Local::from_raw(v8__Value__ToNumber(self, &*context)) scope.to_local(v8__Value__ToNumber(self, &*context))
}) })
} }
@ -442,7 +442,7 @@ impl Value {
scope: &mut impl ToLocal<'sc>, scope: &mut impl ToLocal<'sc>,
) -> Option<Local<'sc, String>> { ) -> Option<Local<'sc, String>> {
scope.get_current_context().and_then(|context| unsafe { scope.get_current_context().and_then(|context| unsafe {
Local::from_raw(v8__Value__ToString(self, &*context)) scope.to_local(v8__Value__ToString(self, &*context))
}) })
} }
@ -451,7 +451,7 @@ impl Value {
scope: &mut impl ToLocal<'sc>, scope: &mut impl ToLocal<'sc>,
) -> Option<Local<'sc, String>> { ) -> Option<Local<'sc, String>> {
scope.get_current_context().and_then(|context| unsafe { scope.get_current_context().and_then(|context| unsafe {
Local::from_raw(v8__Value__ToDetailString(self, &*context)) scope.to_local(v8__Value__ToDetailString(self, &*context))
}) })
} }
@ -460,7 +460,7 @@ impl Value {
scope: &mut impl ToLocal<'sc>, scope: &mut impl ToLocal<'sc>,
) -> Option<Local<'sc, Object>> { ) -> Option<Local<'sc, Object>> {
scope.get_current_context().and_then(|context| unsafe { scope.get_current_context().and_then(|context| unsafe {
Local::from_raw(v8__Value__ToObject(self, &*context)) scope.to_local(v8__Value__ToObject(self, &*context))
}) })
} }
@ -469,7 +469,7 @@ impl Value {
scope: &mut impl ToLocal<'sc>, scope: &mut impl ToLocal<'sc>,
) -> Option<Local<'sc, Integer>> { ) -> Option<Local<'sc, Integer>> {
scope.get_current_context().and_then(|context| unsafe { scope.get_current_context().and_then(|context| unsafe {
Local::from_raw(v8__Value__ToInteger(self, &*context)) scope.to_local(v8__Value__ToInteger(self, &*context))
}) })
} }
@ -478,7 +478,7 @@ impl Value {
scope: &mut impl ToLocal<'sc>, scope: &mut impl ToLocal<'sc>,
) -> Option<Local<'sc, Uint32>> { ) -> Option<Local<'sc, Uint32>> {
scope.get_current_context().and_then(|context| unsafe { scope.get_current_context().and_then(|context| unsafe {
Local::from_raw(v8__Value__ToUint32(self, &*context)) scope.to_local(v8__Value__ToUint32(self, &*context))
}) })
} }
@ -487,7 +487,7 @@ impl Value {
scope: &mut impl ToLocal<'sc>, scope: &mut impl ToLocal<'sc>,
) -> Option<Local<'sc, Int32>> { ) -> Option<Local<'sc, Int32>> {
scope.get_current_context().and_then(|context| unsafe { scope.get_current_context().and_then(|context| unsafe {
Local::from_raw(v8__Value__ToInt32(self, &*context)) scope.to_local(v8__Value__ToInt32(self, &*context))
}) })
} }

View file

@ -1070,10 +1070,10 @@ fn json() {
let mut cs = v8::ContextScope::new(scope, context); let mut cs = v8::ContextScope::new(scope, context);
let scope = cs.enter(); let scope = cs.enter();
let json_string = v8_str(scope, "{\"a\": 1, \"b\": 2}"); let json_string = v8_str(scope, "{\"a\": 1, \"b\": 2}");
let maybe_value = v8::json::parse(context, json_string); let maybe_value = v8::json::parse(scope, context, json_string);
assert!(maybe_value.is_some()); assert!(maybe_value.is_some());
let value = maybe_value.unwrap(); let value = maybe_value.unwrap();
let maybe_stringified = v8::json::stringify(context, value); let maybe_stringified = v8::json::stringify(scope, context, value);
assert!(maybe_stringified.is_some()); assert!(maybe_stringified.is_some());
let stringified = maybe_stringified.unwrap(); let stringified = maybe_stringified.unwrap();
let rust_str = stringified.to_rust_string_lossy(scope); let rust_str = stringified.to_rust_string_lossy(scope);
@ -1973,7 +1973,7 @@ fn uint8_array() {
let maybe_ab = result.buffer(scope); let maybe_ab = result.buffer(scope);
assert!(maybe_ab.is_some()); assert!(maybe_ab.is_some());
let ab = maybe_ab.unwrap(); let ab = maybe_ab.unwrap();
let uint8_array = v8::Uint8Array::new(ab, 0, 0); let uint8_array = v8::Uint8Array::new(scope, ab, 0, 0);
assert!(uint8_array.is_some()); assert!(uint8_array.is_some());
} }
} }