gpt4 book ai didi

perl - 如何将 CV 分配给带有操作码列表的包?

转载 作者:行者123 更新时间:2023-12-01 06:18:23 24 4
gpt4 key购买 nike

我一直在玩 bleadperl 中的新 parse_block 功能,

我可以将几个语句解析成一个列表,它会生成下面的树:

LISTOP (0x1002a00c0) leave [1] 
OP (0x1002d6220) enter
COP (0x1002a0b80) nextstate
OP (0x10028c0f0) null
LISTOP (0x1002a0170) print
OP (0x1002b1a90) pushmark
SVOP (0x100327ee0) const PV (0x100826ec0) "hello\n"
COP (0x1002a0c50) nextstate
LISTOP (0x100324ee0) print
OP (0x100327880) pushmark
SVOP (0x100324eb0) const PV (0x100897688) "world\n"

我需要从我的关键字插件返回一个指向 optree 结构的指针,它目前只包含 ops 的空列表。我想将这些操作包装在一个子程序中,并将其分配给存储中的一个符号。

所以我想我想做这样的事情:
$ perl  -MO=Terse -e "*foo = sub { print 'my listops here' }"

LISTOP (0x10022b5e0) leave [1]
OP (0x10022b620) enter
COP (0x10022b590) nextstate
BINOP (0x100202090) sassign
UNOP (0x1002083d0) refgen
UNOP (0x100208360) null [146]
OP (0x1002083a0) pushmark
SVOP (0x100208330) anoncode [1] CV (0x100826d40)
UNOP (0x1002085a0) rv2gv
SVOP (0x100208550) gv GV (0x100826d28) *foo

大概我需要在列表的开头和结尾添加 entersub、leavesub,但我不确定如何在 XS 中构建它?我也不知道如何将生成的 optree 转换为 CV?

我可以找到为 xsubs 生成简历的示例,但不能从 opttrees 中找到。

谢谢你的帮助。

最佳答案

我会看看 eval 在内部做了什么,因为这本质上就是它的作用。特别是,op.c 和 Perl_newPROG( OP *o) 可能是一个很好的起点:

void
Perl_newPROG(pTHX_ OP *o)
{
...
PL_eval_root = newUNOP(OP_LEAVEEVAL,
((PL_in_eval & EVAL_KEEPERR)
? OPf_SPECIAL : 0), o);
PL_eval_start = op_linklist(PL_eval_root);
PL_eval_root->op_private |= OPpREFCOUNTED;
OpREFCNT_set(PL_eval_root, 1);
PL_eval_root->op_next = 0;
CALL_PEEP(PL_eval_start);
...

关于perl - 如何将 CV 分配给带有操作码列表的包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4552775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com