Skip to content

Commit c298096

Browse files
committed
fix(rs-port): make the handler return a metacall value
1 parent 67b5858 commit c298096

File tree

1 file changed

+39
-22
lines changed

1 file changed

+39
-22
lines changed

source/ports/rs_port/src/types/metacall_future.rs

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use super::{MetacallNull, MetacallValue};
22
use crate::{
33
bindings::{metacall_await_future, metacall_value_destroy, metacall_value_to_future},
4-
helpers, parsers,
4+
parsers,
55
};
66
use std::{
77
ffi::c_void,
@@ -13,7 +13,7 @@ use std::{
1313
/// and the second argument is the data that you may want to access when the function gets called.
1414
/// Checkout [MetacallFuture resolve](MetacallFuture#method.then) or
1515
/// [MetacallFuture reject](MetacallFuture#method.catch) for usage.
16-
pub type MetacallFutureHandler<T> = fn(Box<dyn MetacallValue>, T);
16+
pub type MetacallFutureHandler<T> = fn(Box<dyn MetacallValue>, T) -> Box<dyn MetacallValue>;
1717

1818
/// Represents MetacallFuture. Keep in mind that it's not supported to pass a future as an argument.
1919
///
@@ -125,11 +125,12 @@ unsafe extern "C" fn resolver<T: 'static + Debug>(
125125
) -> *mut c_void {
126126
let (resolve, _, data) = *Box::from_raw(upper_data as *mut MetacallFutureFFIData<T>);
127127
let user_data = std::ptr::read_unaligned(data);
128+
let result = (resolve.unwrap())(
128129
parsers::raw_to_metacallobj_untyped_leak::<T>(resolve_data),
129-
*user_data,
130+
user_data,
130131
);
131132

132-
ptr::null_mut()
133+
Box::into_raw(result) as *mut c_void
133134
}
134135
unsafe extern "C" fn rejecter<T: 'static + Debug>(
135136
reject_data: *mut c_void,
@@ -279,12 +280,13 @@ impl<T: 'static + Debug> MetacallFuture<T> {
279280
///}
280281
/// ```
281282
pub fn data(mut self, data: T) -> Self {
282-
pub fn data(mut self, data: impl MetacallValue) -> Self {
283+
dbg!(&data);
283284
unsafe { drop(Box::from_raw(self.data)) };
285+
dbg!(&self.data);
284286
self.data = Box::into_raw(Box::new(Some(data)));
285-
286-
self.data = Box::into_raw(Box::new(data) as Box<dyn MetacallValue>);
287-
287+
unsafe {
288+
dbg!(&*self.data);
289+
}
288290
self
289291
}
290292

@@ -293,6 +295,9 @@ impl<T: 'static + Debug> MetacallFuture<T> {
293295
let resolve_is_some = self.resolve.is_some();
294296
let reject_is_some = self.reject.is_some();
295297

298+
unsafe {
299+
dbg!(&*self.data);
300+
}
296301
unsafe {
297302
metacall_value_destroy(metacall_await_future(
298303
metacall_value_to_future(self.value),
@@ -359,7 +364,9 @@ impl<T> Drop for MetacallFuture<T> {
359364
mod tests {
360365
use std::fmt::Debug;
361366

362-
use crate::{loaders, metacall, metacall_no_arg, switch, MetacallFuture, MetacallValue};
367+
use crate::{
368+
loaders, metacall, metacall_no_arg, switch, MetacallFuture, MetacallNull, MetacallValue,
369+
};
363370
#[test]
364371
fn test_metacall_future() {
365372
let script = r#"
@@ -382,29 +389,36 @@ module.exports = {
382389

383390
let _metacall = switch::initialize().unwrap();
384391
loaders::from_memory("node", script).unwrap();
385-
386-
fn resolve<T: PartialEq<i16> + Debug>(result: Box<dyn MetacallValue>, data: T) {
387-
let result = result.downcast::<f64>().unwrap();
388-
392+
for _ in 0..1000000 {
393+
fn resolve<T: PartialEq<i64> + Debug>(
394+
result: Box<dyn MetacallValue>,
395+
data: T,
396+
) -> Box<dyn MetacallValue> {
397+
let result_f64 = result.clone().downcast::<f64>().unwrap();
398+
println!("data = {data:?}");
389399
assert_eq!(
390-
result, 2.0,
400+
result_f64, 2.0,
391401
"the result should be double of the passed value"
392402
);
393403
assert_eq!(data, 100, "data should be passed without change");
404+
result
394405
}
395-
fn reject<T>(_: Box<dyn MetacallValue>, _: T) {
406+
fn reject<T>(_: Box<dyn MetacallValue>, _: T) -> Box<dyn MetacallValue> {
396407
panic!("It shouldnt be rejected");
397408
}
398-
let future = metacall::<MetacallFuture<i16>>("doubleValueAfterTime", [1, 2000]).unwrap();
409+
let future =
410+
metacall::<MetacallFuture<i64>>("doubleValueAfterTime", [1, 2000]).unwrap();
399411
future
400-
.then(resolve::<i16>)
401-
.catch(reject::<i16>)
412+
.then(resolve::<i64>)
413+
.catch(reject::<i64>)
402414
.data(100)
403415
.await_fut();
416+
}
404417
}
405418

406419
#[test]
407420
fn test_metacall_future_data() {
421+
let _metacall = switch::initialize().unwrap();
408422
let script = r#"
409423
function func(value, delay) {
410424
return new Promise((resolve) => {
@@ -415,23 +429,26 @@ function func(value, delay) {
415429
module.exports = {
416430
func
417431
}
418-
419432
"#;
420-
let _metacall = switch::initialize().unwrap();
421433
loaders::from_memory("node", script).unwrap();
422-
423-
fn resolve<T: PartialEq<String> + Debug>(_: Box<dyn MetacallValue>, data: T) {
434+
for _ in 0..1000000 {
435+
fn resolve<T: PartialEq<String> + Debug>(
436+
_: Box<dyn MetacallValue>,
437+
data: T,
438+
) -> Box<dyn MetacallValue> {
424439
assert_eq!(
425440
data,
426441
String::from("USER_DATA"),
427442
"data should be passed without change"
428443
);
444+
Box::new(MetacallNull())
429445
}
430446

431447
let future = metacall_no_arg::<MetacallFuture<String>>("func").unwrap();
432448
future
433449
.then(resolve::<String>)
434450
.data(String::from("USER_DATA"))
435451
.await_fut();
452+
}
436453
}
437454
}

0 commit comments

Comments
 (0)