标签: xs

0 加一个指针是什么意思?

我在 Perl 的源代码中发现了以下宏:

#define GvGP(gv) (0+(gv)->sv_u.svu_gp)
Run Code Online (Sandbox Code Playgroud)

其中sv_u.svu_gp声明为:

GP* svu_gp
Run Code Online (Sandbox Code Playgroud)

在一个工会sv_u

我找不到任何定义GP。但是,我对 0 加指针的含义更加困惑。请问有人可以赐教吗?

c perl xs

20
推荐指数
2
解决办法
1675
查看次数

如何使用B :: Hook来操作perl解析器

我正在寻找perl解析器操作.看起来各种B::Hooks模块都是人们使用的.我在想:

  1. 对于没有XS经验的人来说,最好的起点.任何相关的博客文章?

  2. 创建新运算符需要做多少工作,例如:

    $a~>one~>two~>three

~>会工作,->但它不会试图打电话,undef而只是简单地返回undef到LHS.

虽然源过滤器可以工作 - 我更感兴趣的是看看如何在更深层次上操作解析器.

perl xs

15
推荐指数
1
解决办法
214
查看次数

如何在C中用Perl 5.12创建qr?

这在5.8和5.10中一直在为我工作,但在5.12中我的代码创建了这个奇怪的非qr对象:

# running "print Dumper($regex)"
$VAR1 = bless( do{\(my $o = '')}, 'Regexp' );
Run Code Online (Sandbox Code Playgroud)

打印qr //不是由我的代码创建的,如下所示:

# running "print Dumper(qr/foo/i)"
$VAR1 = qr/(?i-xsm:foo)/;
Run Code Online (Sandbox Code Playgroud)

我的代码基本上是:

REGEXP *rx = re_compile(pattern, flags);
SV *regex = sv_2mortal(newSVpv("",0));

sv_magic(regex, (SV*)rx, PERL_MAGIC_qr, 0, 0);

stash = gv_stashpv("Regexp", 0);
sv_bless(newRV((SV*)regex), stash);
Run Code Online (Sandbox Code Playgroud)

任何人都知道如何从5.12中的字符串正确创建一个正则表达式?

regex perl xs qr-operator

14
推荐指数
3
解决办法
358
查看次数

如何追踪XS .so文件?

我有一个小的Perl程序.该程序加载一个模块.该模块使用XSLoader加载.so文件.这个Perl在Linux上运行,用gcc构建-DDEBUGGING,随后是.so文件.我可以重新编译.

执行Perl程序时,如何跟踪.so文件中的C函数?我需要按照它们运行的​​顺序知道函数的名称.拥有函数参数也会很好.

debugging perl trace shared-libraries xs

13
推荐指数
1
解决办法
390
查看次数

我怎样才能使用Perl的C++类?

我有一组用C++编写的类.从Perl脚本调用它们的最佳方法是什么?谢谢.

c++ perl xs

12
推荐指数
3
解决办法
3889
查看次数

Perl XS和Inline :: C

使用XS和Inline :: C模块有什么区别?有人在这个问题中提到了这一点,让我很好奇.

perl perl-module xs

12
推荐指数
1
解决办法
972
查看次数

如何在Perl API中反省正则表达式

我正在研究一些需要序列化Perl正则表达式的代码,包括任何正则表达式标志.只支持一部分标志,因此我需要检测何时不支持的标志/u位于正则表达式对象中.

当前版本的代码执行此操作:

static void serialize_regex_flags(buffer *buf, SV *sv) {
  char flags[] = {0,0,0,0,0,0};
  unsigned int i = 0, f = 0;
  STRLEN string_length;
  char *string = SvPV(sv, string_length);
Run Code Online (Sandbox Code Playgroud)

然后手动处理stringchar-by-char以查找标志.

这里的问题是正则表达式标志的字符串化从(例如在Perl 5.14中)从例如(?i-xsm:foo)改变(?^i:foo),这使解析成为一种痛苦.

我可以查看版本perl,或者只是编写解析器来处理这两种情况,但有些东西告诉我必须有一种更好的内省方法.

c regex perl introspection xs

11
推荐指数
1
解决办法
306
查看次数

有没有办法从XS访问perl中的特殊标记?

在perl的特殊标记一样__PACKAGE__,__SUB__,__FILE__,__LINE__存在并可以从脚本.

我可能会得到的值__PACKAGE__XS作为HvNAME( PL_currstash ),我想.
但如何访问他人?

是否有特殊的界面来访问所有这些XS?我爱:CTX->package,CTX->sub等等.

perl xs perlapi

11
推荐指数
1
解决办法
199
查看次数

如何在Perl XS中将数组传递给C函数?

如何通过引用C XS模块传递Perl数组?

my @array = ( 1..20 );

XSTEST::test_array_passing(\@array);
Run Code Online (Sandbox Code Playgroud)

我在XS中做什么让它看到阵列?

perl xs

10
推荐指数
2
解决办法
2670
查看次数

安全地释放XS代码中的资源(在范围退出时运行析构函数)

我正在写一个XS模块.我分配了一些资源(例如malloc()或者SvREFCNT_inc()),然后执行一些涉及Perl API的操作,然后释放资源.这在普通的C中很好,因为C没有例外,但是使用Perl API的代码可能会croak()阻止正常的清理和泄漏资源.因此,除了相当简单的情况外,似乎不可能编写正确的XS代码.

当我croak()自己可以清理到目前为止分配的任何资源时,我可能会调用croak()直接的函数来回避我编写的任何清理代码.

伪代码来说明我的担忧:

static void some_other_function(pTHX_ Data* d) {
  ...
  if (perhaps) croak("Could not frobnicate the data");
}

MODULE = Example  PACKAGE = Example

void
xs(UV n)
  CODE:
  {
    /* Allocate resources needed for this function */
    Data* object_graph;
    Newx(object_graph, 1, Data);
    Data_init(object_graph, n);

    /* Call functions which use the Perl API */
    some_other_function(aTHX_ object_graph);

    /* Clean up before returning.
     * Not run if above code croak()s!
     * …
Run Code Online (Sandbox Code Playgroud)

c perl destructor perl-xs xs

9
推荐指数
1
解决办法
163
查看次数