微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

perl6 – 如何通过Nativecall回调传递Perl 6对象?

我正在使用NativeCall接口.

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

这很好.我可以用右边声明我的回调
签名,将其作为&回调传递,并且库只调用sub
精细.

它还能够将有效负载void *指针设置为任何东西
我想,它将包括在我的回调函数调用中.

我可以隐藏一个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);

看起来它可能适用于一些绑定,“是rw”,nativecast()和/或.deref.

解决方法

在这种情况下(例如CStruct,CArray和CPointer)或Blob,您只能使用本机表示.您还有责任确保从Perl 6的角度保持对作为userdata alive传递的内容的引用,因此GC不会回收传递给C函数的内存.

内存管理是你不能将任何旧的Perl 6对象传递给C函数的原因:GC无法知道对象是否仍然可以通过它无法反省的某些C数据结构到达.在像moarvm这样的VM中,对象随着时间的推移在内存中移动,这也是垃圾收集过程的一部分,这意味着C代码可能最终会出现过时的指针.

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

原文地址:https://www.jb51.cc/Perl/171406.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐