问题标签 [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.
raku - 本机调用。如何获取字符串作为 C 函数的参数
有一个 C 函数将一些字符串返回给提供的指针:
Perl6 版本是:
它返回正确的整数,但不是字符串:
0 -3(力量)
它只是一个错误还是这里有什么问题?
同样在
raku - 如何在 Perl6 NativeCall 结构中定义固定长度的字符串?
我有一个第三方 C 库,它定义了一个类似于:
还有一个函数,它接受一个指向这个结构的指针并填充它。我需要我的 Perl6 本机调用来提供该结构,然后读取结果。
到目前为止,我已经将 Perl6 中定义的结构定义为:
还有一个本地调用,例如:
我怎样才能使这项工作?
arrays - 在 Perl 6 NativeCall CStruct 中声明一个数组
有没有办法在 CStruct 中声明对象数组?
ACArray[uint8]
将是一个char *
指针,实际上并不在结构内保留空间。
而不是My::Struct.new
,我可能自己制作内存(而不是My::Struct.new()
,我使用 abuf8.allocate(xxx)
并保留一个句柄,这样 GC 就不会收获它,nativecast
它到 My::Struct),然后我必须使用指针数学来找到里面的字符串结构等,但似乎应该有一种更简单的方法。
即使它没有完全实现,一个简单的方式来说“在这里放 80 个字节,这里是一个指向它的指针”会非常好。
garbage-collection - Rakudo 内存/垃圾收集技术
我知道这个问题接近于实现特定的领域,但在这一点上,Rakudo/MoarVM 的特定答案也会对我有所帮助。
我正在研究一些 NativeCall 模块,并且想知道如何调试内存泄漏。一些内存是在 C 库中处理的,我在那里处理得很好。我知道域是我的责任,MoarVM 在那里无能为力。我可以在 MoarVM 域中做什么?检查悬空对象、循环引用等的最佳方法是什么?
有没有办法在一系列操作结束时,我认为我所有的 Perl 对象都超出了“运行垃圾收集并告诉我剩下的事情”的范围?
我可以运行一些 Rakudo/NQP/MoarVM 特定代码来帮助我吗?这不是在生产中发布,只是为了在我开发时进行测试/诊断。
MoarVM 中的垃圾收集提供了一个诱人的概述,但没有足够的信息让我用它做任何事情。
casting - Perl 6 nativecast() 在 GC 时是否会破坏带有 repr('CPointer') 的对象?
阅读指针的基本使用表明,当NativeCall
C 函数返回指向具有类的对象的指针时repr('CPointer')
,它将调用submethod DESTROY
我可以放置函数的位置以释放 C 内存。(顺便说一句,这太棒了,而且是一项了不起的能力。)
如果我拿回了一个 generic Pointer
,但后来决定把nativecast()
它交给课堂怎么办?垃圾收集时也会正确DESTROY()
吗?我认为(并希望)它会,但无法向自己证明这一点。
raku - 将函数指针放入 Perl6 NativeCall CStruct
试图与一个 C 库接口,该库采用一个结构,该结构带有一堆指向它在各个点调用的函数的指针。
像这样的东西:
我可以进行回调:
如果这可行,那就太酷了:
但事实并非如此。我正在尝试做一些事情:
并将它们设置为nativecast(Pointer, &foo-callback)
或类似,但我似乎无法强迫它们在那里。
除了编写一个小 C 函数来获取所有 Perl 6 函数指针并将它们插入 C 中的结构之外,还有什么方法可以做到这一点?
raku - NativeCall 加载我不调用的库符号
我有两个库,我想调用第一个库中的例程,然后他们调用第二个库中的例程,但是由于这些符号未定义而崩溃。即使我不想调用它们,是否可以从库 XX 中说“加载这些符号”?
测试lib1.c:
测试lib2.c:
testit.p6:
错误:
如果我在调用sub2
之前手动调用sub1
,它可以正常工作,但我不想这样做..
c - 使用 fcntl 从标准输出创建新文件描述符在文件中失败
我有一个简单的测试文件,如下所示:
返回的文件描述符是-1,这不是我想要的。但是当我在 REPL 中运行相同的代码时,我得到了我正在寻找的东西:
为什么不像fcntl
在 REPL 中那样在文件中创建新的文件描述符?
编辑:我正在运行 OpenBSD 6.2,Rakudo 2018.02
posix - 如何在 NativeCall 接口中正确使用 CPointer 和 CStruct
我正在尝试NativeCall
运行此示例:
它只是段错误,当您使用指针时会发生这种情况,而您不应该这样做。在这种情况下,可能是由于声明了p_timespec
; 我实际上已将其声明为CPointer
,尽管结构应该没问题。但是,从分段错误中,我无法理解真正的问题所在。有人可以帮忙吗?