私は bleadperl の新しい parse_block 機能で遊んでいます。
いくつかのステートメントを解析して listop にすることができます。これにより、以下のツリーが生成されます。
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
おそらく、listops の最初と最後に entersub、leavesub を追加する必要がありますが、XS でこれをどのように構築するのかわかりません。また、結果の optree を CV に変換する方法もわかりませんか?
xsub の CV を生成する例を見つけることができますが、optree からはできません。
ご協力いただきありがとうございます。