我在 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 加指针的含义更加困惑。请问有人可以赐教吗?
我正在寻找perl解析器操作.看起来各种B::Hooks
模块都是人们使用的.我在想:
对于没有XS
经验的人来说,最好的起点.任何相关的博客文章?
创建新运算符需要做多少工作,例如:
$a~>one~>two~>three
~>
会工作,->
但它不会试图打电话,undef
而只是简单地返回undef
到LHS.
虽然源过滤器可以工作 - 我更感兴趣的是看看如何在更深层次上操作解析器.
这在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中的字符串正确创建一个正则表达式?
我有一个小的Perl程序.该程序加载一个模块.该模块使用XSLoader加载.so文件.这个Perl在Linux上运行,用gcc构建-DDEBUGGING
,随后是.so文件.我可以重新编译.
执行Perl程序时,如何跟踪.so文件中的C函数?我需要按照它们运行的顺序知道函数的名称.拥有函数参数也会很好.
我正在研究一些需要序列化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)
然后手动处理string
char-by-char以查找标志.
这里的问题是正则表达式标志的字符串化从(例如在Perl 5.14中)从例如(?i-xsm:foo)
改变(?^i:foo)
,这使解析成为一种痛苦.
我可以查看版本perl
,或者只是编写解析器来处理这两种情况,但有些东西告诉我必须有一种更好的内省方法.
在perl的特殊标记一样__PACKAGE__
,__SUB__
,__FILE__
,__LINE__
存在并可以从脚本.
我可能会得到的值__PACKAGE__
从XS
作为HvNAME( PL_currstash )
,我想.
但如何访问他人?
是否有特殊的界面来访问所有这些XS
?我爱:CTX->package
,CTX->sub
等等.
如何通过引用C XS模块传递Perl数组?
my @array = ( 1..20 );
XSTEST::test_array_passing(\@array);
Run Code Online (Sandbox Code Playgroud)
我在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) perl ×10
xs ×10
c ×3
regex ×2
c++ ×1
debugging ×1
destructor ×1
perl-module ×1
perl-xs ×1
perlapi ×1
qr-operator ×1
trace ×1