【问题标题】:From Perl XS code, how do I recursively call myself?从 Perl XS 代码中,我如何递归调用自己?
【发布时间】:2013-04-19 06:04:08
【问题描述】:

我在 Pure Perl 中有一个复杂的编码函数,我将其转换为 XS 以希望获得性能提升。

我正在转换为 XS 的函数需要递归调用自身。我可以看到如何使用 call_sv [感谢“man perlcall”] 来调用纯 Perl 函数。

但是我到底如何在 XS 中调用自己(或任何其他 XS 函数)?

(P.S.效率非常可取...)

有人可以给我一个提示吗?还是一个例子?拜拜拜拜!

更新:第一个答案是绝对正确的。调用递归纯 C 函数就可以了。

【问题讨论】:

标签: perl xs


【解决方案1】:

不要。 XS 是一种为 C 函数提供 Perl 接口的机制。不要从 C 函数调用 XS 函数(你会使用 call_sv 或类似的);从 XS 函数调用 C 函数。

编写递归 C 函数并将其保留在 XS 代码之外(在 MODULE = 行之前或在单独的 .c 中)。从瘦 XS 包装器中调用它。

【讨论】:

  • 啊...确实我非常考虑过这种方法。问题是我使用 croak 作为我的异常处理机制,而纯 C 不允许我这样做,对吗?
  • 此外,解析函数由 Perl 哈希结构(用于编码)驱动并正在构建哈希结构(用于解码)。所以我在整个代码中解析和使用 SV 结构。将 main 函数放在 XS 中意味着 XS 将处理我的所有头文件,并且我可以使用 mortals 来确保我的 SV 缓冲区被正确引用计数。所以放弃 XS 将是我最后的选择!
  • @the.jxc:您可以在 C 函数中使用 Perl C API 中的 Perl 数据结构和函数,这不是问题。
  • @salva:是的,甚至引用计数我想我也能应付。真正的挑战是“呱呱”。
  • @the.jxc:这也没有问题,您可以在 C 函数中使用 croak。就个人而言,我喜欢使用THX 宏集显式传递perl 上下文,然后将croak 称为Perl_croak(aTHX_ format, ...),但我认为仅调用croak(fmt, ...) 也应该可以。
猜你喜欢
  • 2011-01-05
  • 2014-03-02
  • 1970-01-01
  • 2019-10-04
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
相关资源
最近更新 更多