问题标签 [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.
c - 如何自省 Perl API 中的正则表达式
我正在处理一些需要序列化 Perl 正则表达式的代码,包括任何正则表达式标志。仅支持标志的子集,因此我需要检测不支持的标志(如/u
regex 对象中的时间)。
当前版本的代码是这样做的:
然后手动处理string
char-by-char 以查找标志。
这里的问题是正则表达式标志的字符串化(我认为在 Perl 5.14 中)从 eg(?i-xsm:foo)
更改为(?^i:foo)
,这使得解析很痛苦。
我可以检查 的版本perl
,或者只是编写解析器来处理这两种情况,但有些事情告诉我必须有一种更好的自省方法可用。
c++ - C++ 调用 perl 代码 - eval_sv 未将参数传递给脚本
我有下面的示例程序,它将参数推送到 Perl 堆栈,然后调用“eval_sv”。示例 perl 语句被执行,但我无法检索从 C++ 作为 Perl 参数传递的变量。请让我知道我在以下程序中缺少什么
程序的输出
你好世界
测试
100测试完成
此行不打印 $a 和 $b 的值
这是我的代码:
c++ - 混合静态库和共享库时的链接器依赖关系
我对 Linux 上的链接有以下疑问:
假设我有一个使用 Qt 的类 Foo。要构建这个类,我必须使用 qmake 来生成 Makefile。
稍后我想将这个类 Foo 用于 Perl 模块,它是一个共享库。但是,要构建它,我必须使用 Perl 的 MakeMaker 来生成它自己的 Makefile。
我现在这样做的方式是将类 Foo 构建为静态库,并且在构建 Perl 模块的共享库时,我将它与 Foo 的静态库链接。
问题是在构建 Perl 模块的共享库时,我必须将它与 Foo 的静态库所链接的所有 Qt 库链接。
所以问题是:
这种方法还有意义吗?!
是否可以在构建 Perl 模块的共享库时以不必指定所有依赖项的方式构建 Foo 的静态库?(因为将所有这些依赖项添加到模块的 Makefile 有点困难)
如果 Foo 的库是共享的,而不是静态的,会有什么不同吗?
perl - 如何在 Perl XS 代码中使用伪文件句柄?
我正在尝试为能够使用任何提供write(ctx, buffer, count)
/read(ctx, buffer, count)
接口的序列化/反序列化库编写 XS 胶水代码。我希望能够使用我得到的伪文件句柄
所以使用FILE*
映射似乎不起作用。由于我没有找到任何好的文档,所以我四处寻找并得到了以下 XS 片段:
它似乎做了我想要的,但这是处理 Perl 可能认为 XS 代码中的文件句柄的所有内容的正确方法吗?
c - 示例 C 程序正在运行,但现有的多线程 C++ 程序在 Perl 5.16.0 的 Perl_sv_upgrade 中中止
在 Perl 5.16.0 中,示例 C 程序正在运行,但现有的多线程程序在Perl_sv_upgrade
. 多线程程序在 Perl 5.8.8 中运行良好。相同的代码可以在 Linux 和 Solaris 上使用 Perl 5.16.0。
比较sv
Linux 和 Hp-PA 之间的参数值显示该sv
值是NULL
在 Hp-PA 的情况下。以前有没有人注意到这个问题。请告诉我?
调试并查看值后的 Linux 堆栈跟踪sv
:
在分析 gdb 中的中止时看到 sv 值后的 HP-PA 堆栈跟踪:
perl - 为什么这个返回 PerlIO* 的 XS 代码会泄漏?
我正在尝试编写一些 XS 代码,将库作为可以写入的流接口公开给 Perl 代码。下面的
get_stream
函数应该是一个构造函数,它准备并返回一个 PerlIO 对象。我认为我只需要
Write
andClose
方法,所以我将所有其他函数槽留空。
当我像这样使用提供的界面时......
...mylib_write
函数被调用,所以到目前为止我还没有完全搞砸。(我通过插入调试 printf 语句验证了这一点。)但是,我希望 PerlIO 对象在
$fh
超出范围时关闭,就像使用open
. 但目前,该mylib_close
函数仅在解释器关闭期间调用。
直接调用close
工作正常,设置$fh
为undef
不行。
更新:按照 ikegami 的建议,我使用Devel::Peek::Dump
并sv_dump
发现句柄返回get_stream
函数是一个“RV”,它指向一个SV = PVGV(...)
. glob ( PVGV
) 的引用计数器设置为 3,这似乎不正确。
我添加了
治愈症状:
在块结束时超出范围时close
调用该函数。$fh
但是我仍然不太了解潜在的问题。
这是为该OUTPUT
部分生成的 C 代码:
GV 的引用计数如何最终达到 3?
c - perlembed/perlcall 示例无限内存增长 - valgrind 表示不可能发生泄漏
全部。一段时间以来,我一直在努力解决这个问题……我正在尝试整理一个基本上是 perlembed + perlcall 的示例,并且或多或少地从 evpsgi 中“借用”了它。问题是每 1000 次迭代它的大小就会增长大约 1MB。在长期运行的进程(这是我正在使用的用例)中运行时,这并不是最好的情况。
正如标题所述,如果我使用 valgrind 运行,它会报告没有泄漏的可能。我用 --trace-malloc=yes 运行,似乎只有在大量调用中最后才调用 free 。我知道这可能是 perl 的 MO,但如果它至少重新使用内存并且在操作系统终止进程之前不会增长,那就太好了。
sv_2mortal 的条目提到了一些关于缓冲区可被“窃取”的内容,但我已经在代码中添加了对 sv_2mortal 的调用,但没有任何变化。
事不宜迟,这里是代码。请原谅它的货物崇拜。提前致谢!
perl - 泄漏,同时祝福 XS 代码中的空引用
我正在尝试做一个与此等效的 XS:
这种构造函数应该在调用时“自动激活”它的基础RefTestPP->new()
,或者使用给定的引用作为基础,比如RefTestPP->new({ stuff => 123 });
.
但是,我遇到了无法解释的泄漏。这是我的RefTest.xs
文件:
RefTest.t
以及检测泄漏的文件:
(正确编译所需的其余文件是由 生成的默认文件h2xs -A -n RefTest
)
重点是:
- 作为参数传递给构造函数的基引用永远不会泄漏;
- 在XS 代码中创建的基础
sv_2mortal(newRV_noinc((SV *) newHV()))
也不会泄漏; - 使用创建的 base
newRV_noinc(sv_2mortal((SV *) newHV()))
将泄漏(并最终Attempt to free unreferenced scalar: SV 0xdeadbeef
在全局销毁期间导致臭名昭著的消息)。
sv_2mortal(newRV_noinc(...))
有什么不同的理由newRV_noinc(sv_2mortal(...))
吗?我只是做错了吗?
perl - 如何使用 Perl XS 代码中的绑定文件句柄?
以下最小示例定义了一个包装器PerlIO_write
:
write_fh
在使用创建的文件句柄上使用该函数open $fh, '<', \$buf
可以按预期工作。但是,使用以下代码段创建的绑定文件句柄不会转换为 PerlIO 句柄:
My::TIEFH
包含所需的方法并按print
$fh $str
预期通过作品对其进行写入。
我需要做什么才能从 XS 土地写入绑定的文件句柄?
perl - 支持自动激活文件句柄作为 Perl XS 例程的参数
问题
如何在 XS 函数中支持自动激活的文件句柄参数?
我正在 XS 包装一个返回文件描述符的 C 函数,我想以open()的方式将该文件描述符呈现为 perl 文件句柄参数。例如,
到目前为止我所做的
现在我在 XS 函数之上使用 perl 包装器:
这很好用(tm),但是,我想再次将实现完全移到 XS 中。
到目前为止,我已经尝试过sv_2io
一个类型映射为的参数SV *
,但这会在未定义的标量上引发异常。我没有尝试将第一个参数映射到 a FILE *
orPerlIO *
对象,因为我不知道如何“fdreopen”(如果您愿意的话)这些对象。