问题标签 [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.

0 投票
1 回答
380 浏览

perl - 如何在使用 XS 的 Perl 程序中使用 Ada 模块?

我最近开始学习 Ada 并且知道 Ada 和 C 目标文件可以链接在一起以构建多语言程序或库,是否可以使用 XS 从 Perl 调用 Ada 代码?

0 投票
2 回答
214 浏览

c - Perl XS:对象的转储值是什么意思 - t_obj 是 - $VAR1 = bless( do{\(my $o = 41032464)}, 'Math::Test1' );

我尝试使用 Perl XS 编写使用 C API 的 perl 代码。我得到对象的转储输出为 -

t_obj 是 - $VAR1 = bless(do{(my $o = 41032464)}, 'Math::Test1' );

我编写了一个名为 Math::Test1 的简单库用于练习,尽管我的模块与此不同且更复杂。

看起来从 perl 到 C 的转换很好,但是当我将数据从 C 中返回到 perl 时,数据处于这种令人困惑的形式,而我期望对象的属性带有一些附加信息。

粘贴我的代码 -

测试1.xs

类型图

数学/Test1.pm

t/t.pl(测试文件)

输出

==========CONSTRUCTOR=========
结构成员是 5 和 4
t_obj 是 - $VAR1 = bless( do{(my $o = 29924112)}, 'Math::Test1 ');
==========显示=========
初始化:节
号为 5 和 4
代码:节
==========添加======== =
加法是 9

我关心的是为什么对象有 bless(do{(my $o = 29924112)}, 'Math::Test1');
我是否错误地解释了输出或 typemap OUTPUT 部分需要更正。

请就此提出您的建议。

0 投票
1 回答
223 浏览

perl - 为什么 sv_setref_pv() 将其 void * 参数存储在 IV 槽中?

在查看 Perl API 时,我想知道为什么

  • sv_setref_iv()将其IV参数存储在IV插槽中,
  • sv_setref_nv()将其NV参数存储在NV插槽中,
  • 但是sv_setref_pv()将其void *参数存储在IV插槽中,而不是PV插槽中?

我有一种预感(CUR 和 LEN 字段对于这样的变量没有意义),但我想听听懂 XS 的人的意见 :-)

0 投票
1 回答
96 浏览

perl - 使用 ExtUtils::Constants 访问系统常量

我正在尝试使用 ExtUtils::Constant 从系统头文件中导出 C 常量。

根据文档,我在 Makefile.PL 中有:

然后在 Bar.xs 中:

但是,当我运行测试时:

我得到:

如果 EPOLLOUT 作为常数存在,情况就不是这样了;即它是一个无效的标识符。

这应该怎么做?我一点也不惊讶这未能将 EPOLLOUT 设置为正确的值——文档还说 ExtUtils::Constant “不包含扫描头文件以提取这些常量的例程”——但是.xs生成的代码已经结束我的头,我有点惊讶 Foo::Bar::EPOLLOUT 没有被识别为具有 undef 值的标识符,而且它没有让我对下一步尝试什么感到困惑。

我会考虑另一个使用 ExtUtils::Constant 的 perl 模块的来源,但我能想到的唯一一个导出系统定义的是 POSIX,它是核心(如果其他人知道,请发表评论)。

24 小时后:现在交叉发布在Perl Monks上。

0 投票
1 回答
183 浏览

perl - 如何子类化 DBI 以隐藏用户凭据?

我想对模块进行子类化以使用 C 代码DBI隐藏子例程。connect例如,我有:

我想编写一些调用上述子例程并在 Perl 中DBI->connect返回句柄的 C 代码。$dbh

是否可以这样做,如果可以,有人可以提供一个例子或指出一些来源吗?

0 投票
1 回答
436 浏览

c - 调用带参数的 perl 例程

我需要在我的 C 程序中调用 perl 例程。perl 例程采用以下参数:$a, $b, $c,其中$a$b是整数,$c是字符串(可能包含二进制字符)。根据perlcall,这是拨打电话的方法。

好像只能用call_argv(...),但是有两个问题

  • 如何将整数传递给 perl 例程
  • 如何将(二进制)字符串传递给perl?

希望有这样的功能

0 投票
2 回答
641 浏览

c++ - 如何使用 XS 接口 c++ 和 perl?

这是学校的事情。

这是问题所在:

我们正在开发一个炸弹人克隆,我们必须实现一个脚本界面,允许用户制作自己的“人工智能”。我们选择使用 Perl。现在,我像这样构建 perl 模块:

以下是文件(测试目的):

SaibApi.xs:

SaibApi.hpp

Makefike.PL:

为清楚起见,我排除了类型映射文件。

该模块已正确构建,我能够在 perl 中实例化 SaibApi 类。现在我们的问题是,显然没有办法同时在 c++ 和 perl 中实例化该类。我们试图做的是给用户一个简单的 API,允许通过简单的方法从我们的 C++ 代码中获取对象(很多 std::list 包含地图、玩家等......)。

例如:

我们做了很多研究,但是关于 XS 的文档有点稀缺。我们现在被困住了。如何同时在 c++ 和 perl 中实例化类,允许_lol在 c++ 部分中设置并在 perl 部分中打印它而无需使用该SetLol()方法?如果不可能,还有什么选择?

0 投票
0 回答
997 浏览

perl - 在 Perl 中加载 DLL

我有一个给定的 32 位 DLL(dds.dll)和一个头文件(dds.h,C++ 风格)。我确实有来源,但我不想更改它。我在使用 cygwin 的 Windows 上。

我想通过 XS 访问 DLL 中的函数,而不是直接通过 Perl。我是 XS 的新手。

[我不知道如何使用Win32::API. DLL 函数具有结构输入和*struct输入(后者被函数修改),我不知道Win32::API::Struct. 我想这也是一种方法,但我现在已经放弃了。]

我可以在 Perl 和 XS 之间传递整数列表,这样那部分就可以工作了。我的计划是#include "dll.h"在 XS 代码中传入整数的平面列表,将列表转换为 XS 中的结构,将结构和其他参数传递给 DLL 函数,将生成的结构转换为整数的平面列表,然后返回Perl 的列表。

我已将 XSLoader.pm 减少到我需要的最低限度,部分是为了了解发生了什么。它适用于我自己的 XS 生成的 .dll。

我试过以同样的方式加载 dds.dll,但实际上我认为它没有意义。我过去了dl_require_symbolsdl_undef_symbols()也可以。然后dl_find_symbol looks对于某种启动符号并没有找到它。我想 XS 创建了一个引导函数,它使 Perl 通过 可以看到 XS 函数dl_install_xsub(),但是普通的 DLL 没有这个。

无论如何,我不想让 dds.dll 函数在 Perl 中直接可见。我想让 dds.dll 函数对 XS 代码可见。这听起来像一个简单的链接步骤,但我无法弄清楚。

如果有更简单的方法,我也赞成。任何帮助表示赞赏。

0 投票
2 回答
61 浏览

xs - XS PPCODE 不正常

我正在使用 XS 在 Windows 上的 Cygwin 下使用 g++ 从我的 Perl 项目中调用第三方 DLL。其中一个 DLL 函数将结构作为参数,并以指向结构的指针的形式返回其主要结果。现在我传入一个包含 28 个整数的平面列表并填充第一个结构。然后我调用该函数。然后我想将生成的结构展平为最多 54 个整数的列表。

(这看起来像很多整数,但DLL函数相当复杂,需要很长时间才能运行,所以我认为值得。除非有人有更好的主意?)

这是接近工作。我可以说结果大多是明智的。但是有两个奇怪的问题。

  1. 当我打印出相同的变量时,我会得到不同的结果,具体取决于它是否在“for”循环中!我在下面展示这个。我已经盯着这个很久了。

  2. 一旦我到达第一个 XPUSH,我就会得到“内存不足”。

这是XS代码。

这是DLL头文件的相关部分。

这是输出。返回码没问题。节点和卡不是。如果你眯着眼睛,你可能会注意到 0 和 768 也出现在输出表中,所以可能存在某种偏移。

第一个奇怪的是,主表前后的两个'0'行与主表中的'0'行不同。但是,主表中的数据与预期的一样,包括第 10-12 行中的垃圾。

第二个问题是 XPUSH 没有按预期工作。

0 投票
3 回答
329 浏览

perl - exposing c function on perl using XS

I have multiple c functions on this format :

where int is the return type;

result[] contains string which the function fill

what is the best to write such function as XS and expose it on perl to:

  1. get the return value of the function

  2. get the char result[] value on perl

I tried the below but the below only return the return value

Any help will be appreciated ?