Skip to content

Commit a736d86

Browse files
authored
feat(op2): #[cppgc] return values (#672)
1 parent 8765f38 commit a736d86

File tree

6 files changed

+118
-12
lines changed

6 files changed

+118
-12
lines changed

core/runtime/ops.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1854,10 +1854,9 @@ mod tests {
18541854
}
18551855

18561856
#[op2]
1857-
pub fn op_test_make_cppgc_resource<'s>(
1858-
scope: &'s mut v8::HandleScope,
1859-
) -> v8::Local<'s, v8::Object> {
1860-
crate::cppgc::make_cppgc_object(scope, TestResource { value: 42 })
1857+
#[cppgc]
1858+
pub fn op_test_make_cppgc_resource() -> TestResource {
1859+
TestResource { value: 42 }
18611860
}
18621861

18631862
#[op2(fast)]

ops/op2/dispatch_fast.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -876,7 +876,8 @@ fn map_retval_to_v8_fastcall_type(
876876
| Arg::V8Local(_)
877877
| Arg::OptionV8Local(_)
878878
| Arg::OptionV8Global(_)
879-
| Arg::OptionV8Ref(..) => return Ok(None),
879+
| Arg::OptionV8Ref(..)
880+
| Arg::CppGcResource(..) => return Ok(None),
880881
Arg::Buffer(..) | Arg::OptionBuffer(..) => return Ok(None),
881882
Arg::External(..) => V8FastCallType::Pointer,
882883
_ => return Err("a fast return value"),

ops/op2/dispatch_slow.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,10 @@ pub fn return_value_infallible(
715715
ArgMarker::Number => {
716716
gs_quote!(generator_state(result) => (deno_core::_ops::RustToV8Marker::<deno_core::_ops::NumberMarker, _>::from(#result)))
717717
}
718+
ArgMarker::Cppgc => {
719+
generator_state.needs_scope = true;
720+
gs_quote!(generator_state(scope, result) => (deno_core::v8::Local::<deno_core::v8::Value>::from(deno_core::cppgc::make_cppgc_object(&mut #scope, #result))))
721+
}
718722
ArgMarker::None => gs_quote!(generator_state(result) => (#result)),
719723
};
720724
let res = match ret_type.slow_retval() {
@@ -777,6 +781,9 @@ pub fn return_value_v8_value(
777781
ArgMarker::Number => {
778782
quote!(deno_core::_ops::RustToV8Marker::<deno_core::_ops::NumberMarker, _>::from(#result))
779783
}
784+
ArgMarker::Cppgc => {
785+
quote!(deno_core::cppgc::make_cppgc_object(&mut #scope, #result))
786+
}
780787
ArgMarker::None => quote!(#result),
781788
};
782789
let res = match ret_type.slow_retval() {

ops/op2/signature.rs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,7 @@ impl Arg {
476476
Arg::OptionBuffer(.., BufferSource::TypedArray) => {
477477
ArgSlowRetval::V8LocalFalliable
478478
}
479+
Arg::CppGcResource(_) => ArgSlowRetval::V8LocalNoScope,
479480
_ => ArgSlowRetval::None,
480481
}
481482
}
@@ -491,6 +492,7 @@ impl Arg {
491492
Arg::SerdeV8(_) => ArgMarker::Serde,
492493
Arg::Numeric(NumericArg::__SMI__, _) => ArgMarker::Smi,
493494
Arg::Numeric(_, NumericFlag::Number) => ArgMarker::Number,
495+
Arg::CppGcResource(_) => ArgMarker::Cppgc,
494496
_ => ArgMarker::None,
495497
}
496498
}
@@ -527,6 +529,8 @@ pub enum ArgMarker {
527529
Number,
528530
/// This buffer type should be serialized as an ArrayBuffer.
529531
ArrayBuffer,
532+
/// This type should be wrapped as a cppgc V8 object.
533+
Cppgc,
530534
}
531535

532536
#[derive(Debug)]
@@ -1449,12 +1453,17 @@ fn parse_type_state(ty: &Type) -> Result<Arg, ArgError> {
14491453
Ok(s)
14501454
}
14511455

1452-
fn parse_cppgc(ty: &Type) -> Result<Arg, ArgError> {
1453-
match ty {
1454-
Type::Reference(of) if of.mutability.is_none() => match &*of.elem {
1455-
Type::Path(of) => Ok(Arg::CppGcResource(stringify_token(&of.path))),
1456-
_ => Err(ArgError::InvalidCppGcType(stringify_token(ty))),
1457-
},
1456+
fn parse_cppgc(position: Position, ty: &Type) -> Result<Arg, ArgError> {
1457+
match (position, ty) {
1458+
(Position::Arg, Type::Reference(of)) if of.mutability.is_none() => {
1459+
match &*of.elem {
1460+
Type::Path(of) => Ok(Arg::CppGcResource(stringify_token(&of.path))),
1461+
_ => Err(ArgError::InvalidCppGcType(stringify_token(ty))),
1462+
}
1463+
}
1464+
(Position::RetVal, Type::Path(of)) => {
1465+
Ok(Arg::CppGcResource(stringify_token(&of.path)))
1466+
}
14581467
_ => Err(ArgError::ExpectedCppGcReference(stringify_token(ty))),
14591468
}
14601469
}
@@ -1469,7 +1478,7 @@ pub(crate) fn parse_type(
14691478

14701479
if let Some(primary) = attrs.primary {
14711480
match primary {
1472-
AttributeModifier::CppGcResource => return parse_cppgc(ty),
1481+
AttributeModifier::CppGcResource => return parse_cppgc(position, ty),
14731482
AttributeModifier::Serde => match ty {
14741483
Type::Tuple(of) => {
14751484
return Ok(Arg::SerdeV8(stringify_token(of)));

ops/op2/test_cases/sync/cppgc_resource.out

Lines changed: 82 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ops/op2/test_cases/sync/cppgc_resource.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,11 @@ deno_ops_compile_test_runner::prelude!();
44

55
#[op2(fast)]
66
fn op_file(#[cppgc] _file: &std::fs::File) {}
7+
8+
struct Wrap;
9+
10+
#[op2]
11+
#[cppgc]
12+
fn op_make_cppgc_object() -> Wrap {
13+
Wrap
14+
}

0 commit comments

Comments
 (0)