问题标签 [xs]
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.
perl - Perl 的 XSUB 怎么会死?
我为一个包含大约 80 个函数的 C 库编写了一个 Perl XS 包装器。现在我的一般策略是用 C 函数中的错误替换,PL_sv_undef
调用 Perl 代码必须明确检查返回是否不是undef
。(对于某些 C 函数,它更复杂,因为我将它们的输出转换为HV
/AV
并使用空列表来报告错误。)
现在,当我开始使用该库编写更大的 Perl 脚本时,我想简化错误处理并使用例如通常eval {}
/die
类似异常的机制来处理错误。
目前,我的 XS 中的一个简单 XSUB 看起来像这样:
我已经看到一些模块具有全局标志,例如“RaiseError”到die
错误但找不到任何我可以借用的示例。我发现的几个模块处理的是内部的“RaiseError”标志.pm
,而不是内部的.xs
,因此允许使用 Perl 的die
. .pm
在我的情况下,由于许多功能需要特殊的错误检查,所以很难在其中实现。这也会导致代码重复,因为 XS 中已经存在检查。
perlxs
我在/perlguts
文档中没有发现任何相关内容。特别是,我Perl_croak()
在.c
my 生成的中看到了对 的调用.xs
,但未能找到该函数的任何文档。
Perl 的 XS 模拟是die
什么?或者 XSUB 如何向 Perl 运行时报告函数失败并且没有 RETVAL 可返回?如何正确设置$@
?
perl - 阻止 Perl XS 模块默默地退回到纯 perl
似乎 CPAN 上的一些(很多?)模块部分是使用 XS 在 C 中实现的,如果需要,可以回退到纯 perl 实现。虽然这很聪明,但它显然会损害性能,我想知道它会发生,以便我可以解决问题。
有没有一种通用的方法来停止或检测这种类型的回退?
有关此行为的示例,请查看(非常方便)Date::Simple(代码片段)
c - 如何在 C 代码中构建 Perl 哈希?
我希望在 Perl 中嵌入 C 代码。在这段 C 代码中,我想将一个巨大的文件读入内存,进行一些更改并构建一个哈希(自定义的)。我希望从我的 Perl 代码中访问这个散列。可能吗?我怎样才能达到目标?
c++ - 如何使用 PERL XS 调用接收 STL 向量的 C++ 函数
我一直在使用 PerlXS 围绕 C++ 对象编写 perl 包装器。通常我的 fcn 接受一个字符串/整数等,我可以毫无问题地制作它们。我只是在 .xs 文件中编写这样的代码
这次; 我需要一个接收 stl 向量的函数
我收到此错误:
perl - 如何将 CV 分配给包含操作码列表的包?
我一直在玩 bleadperl 中的新 parse_block 功能,
我可以将几个语句解析成一个列表,它会生成下面的树:
我需要从我的关键字插件返回一个指向 optree 结构的指针,目前它只包含操作的裸列表。我想将这些操作包装在子例程中并将其分配给存储中的符号。
所以我想我想做这样的事情:
大概我需要在列表的开头和结尾添加 entersub、leasesub,但我不确定如何在 XS 中构建它?我也不知道如何将生成的 optree 转换为 CV?
我可以找到为 xsubs 生成 CV 的示例,但不能从 optrees 中找到。
谢谢你的帮助。
perl - 从 XS 访问存储在 perl 对象(祝福哈希)中的值
我有一个像这样的 perl 对象(对哈希的祝福引用)。
在 XS 代码中我有 $o 引用的其他地方,我需要获取$o->{internal_data}
.
perl(api|xstut|guts|???) 中可能有一些章节。我只是找不到它。
提前感谢您的任何提示。
--kmx
perl - 从 Perl XS 扩展打印到标准输出
我最近开始尝试使用 XS 编写 Perl (v5.8.8) 扩展。我正在编写的方法之一是收集一堆数据并将其发送给客户端。我想编写一些对输出进行断言的单元测试,但我遇到了一个问题:PerlIO 方法似乎没有像print
Perl 中的调用那样通过相同的通道传递数据。通常,您可以绑定到 STDOUT 文件处理程序并拦截结果,但 PerlIO 方法似乎完全绕过了这一点。
我在下面粘贴了一个示例,但我的测试的基本要点是:Tie
在 to 中STDOUT
,运行代码untie
,返回收集的字符串。这样做,我可以捕获print
语句,但不能捕获PerlIO_*
来自我的模块的调用。我尝试过使用PerlIO_write
, PerlIO_puts
,PerlIO_printf
等。没有骰子。
从头开始,这是我正在做的最小复制:
把这个放到IOTest.xs
:
这进入了一个名为test.pl
(有趣的部分在底部附近,其他所有内容仅用于捕获标准输出)的文件:
构建和测试只是一个问题:
我看到的输出是:
显然,我期待“oink!” 夹在“之前”和“之后”之间,但这似乎没有发生。
有任何想法吗?
perl - system/perl 升级后如何缓解 local::lib 问题?
我们的系统管理员最近升级了我的操作系统和 perl(到 5.12.3)。当我加载 local::lib 环境变量时,它似乎破坏了任何依赖 xs 的东西:
有一个简单的解决方法吗?
perl - Perl XS 和内联::C
使用 XS 和 Inline::C 模块有什么区别?有人在这个问题中提到了这一点,这让我很好奇。