gpt4 book ai didi

raku - 如何通过 Nativecall 回调传递 Perl 6 对象?

转载 作者:行者123 更新时间:2023-12-04 13:46:28 25 4
gpt4 key购买 nike

我正在使用 NativeCall 接口(interface)。

该库将多次调用我的回调函数。

这很好用。我可以用正确的方式声明我的回调
签名,将其作为 &callback 传递,库只调用 sub
美好的。

它还具有将有效负载 void *pointer 设置为任何内容的能力
我想要,它将包含在对我的回调函数的调用中。

例如,我可以在有效负载中隐藏一个 Perl Str 并成功往返吗?

sub set_userdata(Pointer) returns int32 is native { ... }

sub set_callback(&callback(Pointer $userdata --> int32)) returns int32 is native { ... }

sub callback(Pointer $userdata) returns int32 {
my Str $mystring = ???
...
}

my Str $my-userdata-string;

set_userdata(???);
set_callback(&callback);

似乎它可以与一些绑定(bind)咒语一起使用,“is rw”,nativecast() 和/或 .deref。

最佳答案

在这种情况下,您只能使用 native 表示(例如 CStructCArrayCPointer ),或者使用 Blob .您还有责任确保您保留对您作为 userdata 传递的内容的引用。从 Perl 6 的角度来看也是活着的,所以 GC 不会回收传递给 C 函数的内存。

内存管理是您不能将任何旧的 Perl 6 对象传递给 C 函数的原因:GC 无法通过无法自省(introspection)的某些 C 数据结构知道该对象是否仍可访问。在像 MoarVM 这样的 VM 中,对象也会随着时间的推移在内存中移动,这也是垃圾收集过程的一部分,这意味着 C 代码最终可能会得到一个过时的指针。

另一种策略是根本不传递指针,而是传递一个整数并使用它来索引对象数组。 (这就是 MoarVM 内部的 libuv 绑定(bind)跟踪 VM 级回调的方式,fwiw。)

关于raku - 如何通过 Nativecall 回调传递 Perl 6 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43370856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com