问题标签 [nativecall]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
156 浏览

raku - 本机调用。如何获取字符串作为 C 函数的参数

有一个 C 函数将一些字符串返回给提供的指针:

Perl6 版本是:

它返回正确的整数,但不是字符串:

0 -3(力量)

它只是一个错误还是这里有什么问题?

同样在

0 投票
3 回答
318 浏览

raku - 如何在 Perl6 NativeCall 结构中定义固定长度的字符串?

我有一个第三方 C 库,它定义了一个类似于:

还有一个函数,它接受一个指向这个结构的指针并填充它。我需要我的 Perl6 本机调用来提供该结构,然后读取结果。

到目前为止,我已经将 Perl6 中定义的结构定义为:

还有一个本地调用,例如:

我怎样才能使这项工作?

0 投票
2 回答
184 浏览

arrays - 在 Perl 6 NativeCall CStruct 中声明一个数组

有没有办法在 CStruct 中声明对象数组?

ACArray[uint8]将是一个char *指针,实际上并不在结构内保留空间。

而不是My::Struct.new,我可能自己制作内存(而不是My::Struct.new(),我使用 abuf8.allocate(xxx)并保留一个句柄,这样 GC 就不会收获它,nativecast它到 My::Struct),然后我必须使用指针数学来找到里面的字符串结构等,但似乎应该有一种更简单的方法。

即使它没有完全实现,一个简单的方式来说“在这里放 80 个字节,这里是一个指向它的指针”会非常好。

0 投票
1 回答
317 浏览

garbage-collection - Rakudo 内存/垃圾收集技术

我知道这个问题接近于实现特定的领域,但在这一点上,Rakudo/MoarVM 的特定答案也会对我有所帮助。

我正在研究一些 NativeCall 模块,并且想知道如何调试内存泄漏。一些内存是在 C 库中处理的,我在那里处理得很好。我知道域是我的责任,MoarVM 在那里无能为力。我可以在 MoarVM 域中做什么?检查悬空对象、循环引用等的最佳方法是什么?

有没有办法在一系列操作结束时,我认为我所有的 Perl 对象都超出了“运行垃圾收集并告诉我剩下的事情”的范围?

我可以运行一些 Rakudo/NQP/MoarVM 特定代码来帮助我吗?这不是在生产中发布,只是为了在我开发时进行测试/诊断。

MoarVM 中的垃圾收集提供了一个诱人的概述,但没有足够的信息让我用它做任何事情。

0 投票
1 回答
105 浏览

casting - Perl 6 nativecast() 在 GC 时是否会破坏带有 repr('CPointer') 的对象?

阅读指针的基本使用表明,当NativeCallC 函数返回指向具有类的对象的指针时repr('CPointer'),它将调用submethod DESTROY我可以放置函数的位置以释放 C 内存。(顺便说一句,这太棒了,而且是一项了不起的能力。)

如果我拿回了一个 generic Pointer,但后来决定把nativecast()它交给课堂怎么办?垃圾收集时也会正确DESTROY()吗?我认为(并希望)它会,但无法向自己证明这一点。

0 投票
1 回答
172 浏览

raku - 将函数指针放入 Perl6 NativeCall CStruct

试图与一个 C 库接口,该库采用一个结构,该结构带有一堆指向它在各个点调用的函数的指针。

像这样的东西:

我可以进行回调:

如果这可行,那就太酷了:

但事实并非如此。我正在尝试做一些事情:

并将它们设置为nativecast(Pointer, &foo-callback)或类似,但我似乎无法强迫它们在那里。

除了编写一个小 C 函数来获取所有 Perl 6 函数指针并将它们插入 C 中的结构之外,还有什么方法可以做到这一点?

0 投票
2 回答
241 浏览

raku - NativeCall 加载我不调用的库符号

我有两个库,我想调用第一个库中的例程,然后他们调用第二个库中的例程,但是由于这些符号未定义而崩溃。即使我不想调用它们,是否可以从库 XX 中说“加载这些符号”?

测试lib1.c:

测试lib2.c:

testit.p6:

错误:

如果我在调用sub2之前手动调用sub1,它可以正常工作,但我不想这样做..

0 投票
1 回答
231 浏览

c - 使用 fcntl 从标准输出创建新文件描述符在文件中失败

我有一个简单的测试文件,如下所示:

返回的文件描述符是-1,这不是我想要的。但是当我在 REPL 中运行相同的代码时,我得到了我正在寻找的东西:

为什么不像fcntl在 REPL 中那样在文件中创建新的文件描述符?

编辑:我正在运行 OpenBSD 6.2,Rakudo 2018.02

0 投票
1 回答
381 浏览

c - 如何使用 NativeCall 处理可变参数

我正在为 Editline 编写绑定;它的一个函数 ,history为库的这一部分完成了大部分工作,但有几个可能的签名:

第三个参数是一个标志,它确定history应该使用给定的参数调用哪个函数,但由于这些符号没有被导出,我无法使用它们来代替。如何找到使用该功能的方法?我不能使用 multi subs 或 usecglobal将其转换为 a Pointer,然后转换为具有正确签名的函数。

编辑:我知道is symbol,但我想知道是否有更好的方法来解决这个问题,因为有 9 个不同的签名要写。

0 投票
1 回答
154 浏览

posix - 如何在 NativeCall 接口中正确使用 CPointer 和 CStruct

我正在尝试NativeCall运行此示例:

它只是段错误,当您使用指针时会发生这种情况,而您不应该这样做。在这种情况下,可能是由于声明了p_timespec; 我实际上已将其声明为CPointer,尽管结构应该没问题。但是,从分段错误中,我无法理解真正的问题所在。有人可以帮忙吗?