Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 7 additions & 8 deletions src/binding.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2296,11 +2296,10 @@ int v8__Function__ScriptId(const v8::Function& self) {
return ptr_to_local(&self)->ScriptId();
}

const v8::ScriptOrigin* v8__Function__GetScriptOrigin(
const v8::Function& self) {
std::unique_ptr<v8::ScriptOrigin> u = std::make_unique<v8::ScriptOrigin>(
ptr_to_local(&self)->GetScriptOrigin());
return u.release();
void v8__Function__GetScriptOrigin(const v8::Function& self,
uninit_t<v8::ScriptOrigin>* out) {
construct_in_place<v8::ScriptOrigin>(out,
ptr_to_local(&self)->GetScriptOrigin());
}

const v8::Signature* v8__Signature__New(v8::Isolate* isolate,
Expand Down Expand Up @@ -2714,15 +2713,15 @@ void v8__ScriptOrigin__CONSTRUCT(
}

int v8__ScriptOrigin__ScriptId(const v8::ScriptOrigin& self) {
return ptr_to_local(&self)->ScriptId();
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also removed these ptr_to_local calls as v8::ScriptOrigin is not meant to be inside of a v8::Local<>, and at best this does nothing since Local::operator-> just returns the original pointer again.

return self.ScriptId();
}

const v8::Value* v8__ScriptOrigin__ResourceName(const v8::ScriptOrigin& self) {
return local_to_ptr(ptr_to_local(&self)->ResourceName());
return local_to_ptr(self.ResourceName());
}

const v8::Value* v8__ScriptOrigin__SourceMapUrl(const v8::ScriptOrigin& self) {
return local_to_ptr(ptr_to_local(&self)->SourceMapUrl());
return local_to_ptr(self.SourceMapUrl());
}

const v8::Value* v8__ScriptOrModule__GetResourceName(
Expand Down
17 changes: 12 additions & 5 deletions src/function.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use std::convert::TryFrom;
use std::marker::PhantomData;
use std::mem::MaybeUninit;
use std::ptr::NonNull;
use std::ptr::null;

Expand Down Expand Up @@ -58,9 +59,10 @@ unsafe extern "C" {
fn v8__Function__GetScriptColumnNumber(this: *const Function) -> int;
fn v8__Function__GetScriptLineNumber(this: *const Function) -> int;
fn v8__Function__ScriptId(this: *const Function) -> int;
fn v8__Function__GetScriptOrigin(
fn v8__Function__GetScriptOrigin<'a>(
this: *const Function,
) -> *const ScriptOrigin<'static>;
out: *mut MaybeUninit<ScriptOrigin<'a>>,
);

fn v8__Function__CreateCodeCache(
script: *const Function,
Expand Down Expand Up @@ -1085,10 +1087,15 @@ impl Function {
}

#[inline(always)]
pub fn get_script_origin(&self) -> &ScriptOrigin<'_> {
pub fn get_script_origin<'s>(
&self,
_scope: &PinScope<'s, '_>,
) -> ScriptOrigin<'s> {
unsafe {
let ptr = v8__Function__GetScriptOrigin(self);
&*ptr
let mut script_origin: MaybeUninit<ScriptOrigin<'_>> =
MaybeUninit::uninit();
v8__Function__GetScriptOrigin(self, &mut script_origin);
script_origin.assume_init()
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/script.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
use std::marker::PhantomData;
use std::mem::MaybeUninit;
use std::ptr::null;

Expand All @@ -16,7 +15,8 @@ use crate::scope::PinScope;
#[derive(Debug)]
pub struct ScriptOrigin<'s>(
[u8; crate::binding::v8__ScriptOrigin_SIZE],
PhantomData<&'s ()>,
// require pointer alignment
[&'s (); 0],
);

unsafe extern "C" {
Expand Down
10 changes: 7 additions & 3 deletions tests/test_api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4153,22 +4153,26 @@ fn function_script_origin_and_id() {

if let Some(id) = prev_id {
assert_eq!(script_id, id + 1);
assert_eq!(script_id, f_function_obj.get_script_origin().script_id(),);
assert_eq!(
script_id,
f_function_obj.get_script_origin(scope).script_id(),
);
}
prev_id = Some(script_id);

// Verify source map URL matches
assert_eq!(
"source_map_url",
f_function_obj
.get_script_origin()
.get_script_origin(scope)
.source_map_url()
.unwrap()
.to_rust_string_lossy(scope)
);

// Verify resource name matches in script origin
let resource_name_val = f_function_obj.get_script_origin().resource_name();
let resource_name_val =
f_function_obj.get_script_origin(scope).resource_name();
assert!(resource_name_val.is_some());
assert_eq!(
resource_name_val.unwrap().to_rust_string_lossy(scope),
Expand Down