| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
# You may distribute under the terms of either the GNU General Public License |
|
2
|
|
|
|
|
|
|
# or the Artistic License (the same terms as Perl itself) |
|
3
|
|
|
|
|
|
|
# |
|
4
|
|
|
|
|
|
|
# (C) Paul Evans, 2020-2021 -- leonerd@leonerd.org.uk |
|
5
|
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
package XS::Parse::Sublike 0.21; |
|
7
|
|
|
|
|
|
|
|
|
8
|
22
|
|
|
22
|
|
4657081
|
use v5.14; |
|
|
22
|
|
|
|
|
197
|
|
|
9
|
22
|
|
|
22
|
|
123
|
use warnings; |
|
|
22
|
|
|
|
|
55
|
|
|
|
22
|
|
|
|
|
2460
|
|
|
10
|
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
require XSLoader; |
|
12
|
|
|
|
|
|
|
XSLoader::load( __PACKAGE__, our $VERSION ); |
|
13
|
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
=encoding UTF-8 |
|
15
|
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
=head1 NAME |
|
17
|
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
C<XS::Parse::Sublike> - XS functions to assist in parsing C<sub>-like syntax |
|
19
|
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
21
|
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
This module provides some XS functions to assist in writing parsers for |
|
23
|
|
|
|
|
|
|
C<sub>-like syntax, primarily for authors of keyword plugins using the |
|
24
|
|
|
|
|
|
|
C<PL_keyword_plugin> hook mechanism. It is unlikely to be of much use to |
|
25
|
|
|
|
|
|
|
anyone else; and highly unlikely to be any use when writing perl code using |
|
26
|
|
|
|
|
|
|
these. Unless you are writing a keyword plugin using XS, this module is not |
|
27
|
|
|
|
|
|
|
for you. |
|
28
|
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
This module is also currently experimental, and the design is still evolving |
|
30
|
|
|
|
|
|
|
and subject to change. Later versions may break ABI compatibility, requiring |
|
31
|
|
|
|
|
|
|
changes or at least a rebuild of any module that depends on it. |
|
32
|
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
=head1 XS FUNCTIONS |
|
34
|
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
=head2 boot_xs_parse_sublike |
|
36
|
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
void boot_xs_parse_sublike(double ver) |
|
38
|
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
Call this function from your C<BOOT> section in order to initialise the module |
|
40
|
|
|
|
|
|
|
and parsing hooks. |
|
41
|
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
I<ver> should either be 0 or a decimal number for the module version |
|
43
|
|
|
|
|
|
|
requirement; e.g. |
|
44
|
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
boot_xs_parse_sublike(0.04); |
|
46
|
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
=head2 xs_parse_sublike |
|
48
|
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
int xs_parse_sublike(const struct XSParseSublikeHooks *hooks, void *hookdata, OP **op_ptr) |
|
50
|
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
This function performs the actual parsing of a C<sub>-like keyword. It expects |
|
52
|
|
|
|
|
|
|
the lexer to be at a position just after the introduction keyword has been |
|
53
|
|
|
|
|
|
|
consumed, and will proceed to parse an optional name, list of attributes, |
|
54
|
|
|
|
|
|
|
signature (if enabled by C<use feature 'signatures'>), and code body. The |
|
55
|
|
|
|
|
|
|
return value and C<op_ptr> can be used directly from the keyword plugin |
|
56
|
|
|
|
|
|
|
function. It is intended this function be invoked from it, and the result |
|
57
|
|
|
|
|
|
|
returned directly. |
|
58
|
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
For a more automated handling of keywords, see L</register_xs_parse_sublike>. |
|
60
|
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
I<hooks> should be a structure that can provide optional function pointers |
|
62
|
|
|
|
|
|
|
used to customise the parsing process at various stages. I<hookdata> is an |
|
63
|
|
|
|
|
|
|
opaque pointer which is passed through to each of the hook stage functions. |
|
64
|
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
=head2 register_xs_parse_sublike |
|
66
|
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
void register_xs_parse_sublike(const char *keyword, |
|
68
|
|
|
|
|
|
|
const struct XSParseSublikeHooks *hooks, void *hookdata) |
|
69
|
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
This function installs a set of parsing hooks to be associated with the given |
|
71
|
|
|
|
|
|
|
keyword. Such a keyword will then be handled automatically by a keyword parser |
|
72
|
|
|
|
|
|
|
installed by C<XS::Parse::Sublike> itself. |
|
73
|
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
When the keyword is encountered, the hook's C<permit> function is first tested |
|
75
|
|
|
|
|
|
|
to see if the keyword is permitted at this point. If the function returns true |
|
76
|
|
|
|
|
|
|
then the keyword is consumed and parsed as per L</xs_parse_sublike>. |
|
77
|
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
I<hookdata> is an opaque pointer which is passed through to each of the hook |
|
79
|
|
|
|
|
|
|
stage functions when they are invoked. |
|
80
|
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
=head2 xs_parse_sublike_any |
|
82
|
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
int xs_parse_sublike_any(const struct XSParseSublikeHooks *hooks, void *hookdata, |
|
84
|
|
|
|
|
|
|
OP **op_ptr) |
|
85
|
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
This function expects to consume an introduction keyword at the lexer position |
|
87
|
|
|
|
|
|
|
which is either C<sub> or the name of another C<sub>-like keyword, which has |
|
88
|
|
|
|
|
|
|
been previously registered using L</register_xs_parse_sublike>. It then |
|
89
|
|
|
|
|
|
|
proceeds to parse the subsequent syntax similar to how it would have parsed if |
|
90
|
|
|
|
|
|
|
encountered by the module's own keyword parser plugin, except that the second |
|
91
|
|
|
|
|
|
|
set of hooks given here also take effect. |
|
92
|
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
If a regular C<sub> is encountered, then this is parsed using the I<hooks> in |
|
94
|
|
|
|
|
|
|
a similar way to C<xs_parse_sublike()>. |
|
95
|
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
If a different registered C<sub>-like keyword is encountered, then parsing is |
|
97
|
|
|
|
|
|
|
performed using B<both> sets of hooks - the ones given to this function as |
|
98
|
|
|
|
|
|
|
well as the ones registered with the keyword. This allows their effects to |
|
99
|
|
|
|
|
|
|
combined. The hooks given by the I<hooks> argument are considered to be on the |
|
100
|
|
|
|
|
|
|
"outside" from those of the registered keyword "inside". The outside ones run |
|
101
|
|
|
|
|
|
|
first for all stages, except C<pre_blockend> which runs them inside-out. |
|
102
|
|
|
|
|
|
|
|
|
103
|
|
|
|
|
|
|
I<hookdata> is an opaque pointer which is passed through to each of the hook |
|
104
|
|
|
|
|
|
|
stage functions when they are invoked. |
|
105
|
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
Note that this function is now vaguely discouraged, in favour of using a |
|
107
|
|
|
|
|
|
|
prefixing keyword instead, by using the C<XS_PARSE_SUBLIKE_FLAG_PREFIX> flag. |
|
108
|
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
=head1 PARSE CONTEXT |
|
110
|
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
The various hook stages all share state about the ongoing parse process using |
|
112
|
|
|
|
|
|
|
various fields of the C<XSParseSublikeContext> structure. |
|
113
|
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
struct XSParseSublikeContext { |
|
115
|
|
|
|
|
|
|
SV *name; |
|
116
|
|
|
|
|
|
|
OP *attrs; |
|
117
|
|
|
|
|
|
|
OP *body; |
|
118
|
|
|
|
|
|
|
CV *cv; |
|
119
|
|
|
|
|
|
|
U32 actions; |
|
120
|
|
|
|
|
|
|
HV *moddata; |
|
121
|
|
|
|
|
|
|
} |
|
122
|
|
|
|
|
|
|
|
|
123
|
|
|
|
|
|
|
The C<actions> field will contain a bitmask of action flags that control the |
|
124
|
|
|
|
|
|
|
various steps that C<XS::Parse::Sublike> might take inbetween invoking hook |
|
125
|
|
|
|
|
|
|
stages. The initial value of this field is set after the name-parsing stage, |
|
126
|
|
|
|
|
|
|
depending on whether or not a name is found. Stage hook functions may modify |
|
127
|
|
|
|
|
|
|
the field to adjust the subsequent behaviour. |
|
128
|
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
At the current ABI version, a module will have to set the |
|
130
|
|
|
|
|
|
|
C<XS_PARSE_SUBLIKE_COMPAT_FLAG_DYNAMIC_ACTIONS> bit of the C<flags> field in |
|
131
|
|
|
|
|
|
|
order to make use of the I<actions> field. A future ABI version may remove |
|
132
|
|
|
|
|
|
|
this restriction. |
|
133
|
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
=over 4 |
|
135
|
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
=item XS_PARSE_SUBLIKE_ACTION_CVf_ANON |
|
137
|
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
If set, the C<start_subparse()> call will be set up for an anonymous function |
|
139
|
|
|
|
|
|
|
protosub; if not it will be set for a named function. This is set by default |
|
140
|
|
|
|
|
|
|
if a name was not found. |
|
141
|
|
|
|
|
|
|
|
|
142
|
|
|
|
|
|
|
=item XS_PARSE_SUBLIKE_ACTION_SET_CVNAME |
|
143
|
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
If set, the newly-constructed CV will have the given name set on it. This is |
|
145
|
|
|
|
|
|
|
set by default if a name was found. |
|
146
|
|
|
|
|
|
|
|
|
147
|
|
|
|
|
|
|
On Perl versions 5.22 and above, this flag can be set even if |
|
148
|
|
|
|
|
|
|
C<XS_PARSE_SUBLIKE_ACTION_INSTALL_SYMBOL> is not. In this case, the CV will |
|
149
|
|
|
|
|
|
|
not be reachable via the symbol table, even though it knows its own name and |
|
150
|
|
|
|
|
|
|
pretends that it is. On earlier versions of perl this flag will be ignored in |
|
151
|
|
|
|
|
|
|
that case. |
|
152
|
|
|
|
|
|
|
|
|
153
|
|
|
|
|
|
|
=item XS_PARSE_SUBLIKE_ACTION_INSTALL_SYMBOL |
|
154
|
|
|
|
|
|
|
|
|
155
|
|
|
|
|
|
|
If set, the newly-constructed CV will be installed into the symbol table at |
|
156
|
|
|
|
|
|
|
its given name. Note that it is not possible to enable this flag without also |
|
157
|
|
|
|
|
|
|
enabling C<XS_PARSE_SUBLIKE_ACTION_SET_CVNAME>. This is set by default if a |
|
158
|
|
|
|
|
|
|
name was found. |
|
159
|
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
=item XS_PARSE_SUBLIKE_ACTION_REFGEN_ANONCODE |
|
161
|
|
|
|
|
|
|
|
|
162
|
|
|
|
|
|
|
If set, the syntax will yield the C<OP_REFGEN> / C<OP_ANONCODE> optree |
|
163
|
|
|
|
|
|
|
fragment typical of anonymous code expressions; if not it will be C<OP_NULL>. |
|
164
|
|
|
|
|
|
|
This is set by default if a name was not found. |
|
165
|
|
|
|
|
|
|
|
|
166
|
|
|
|
|
|
|
=item XS_PARSE_SUBLIKE_ACTION_RET_EXPR |
|
167
|
|
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
If set, the syntax will parse like an expression; if not it will parse like a |
|
169
|
|
|
|
|
|
|
statement. This is set by default if a name was not found. |
|
170
|
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
=back |
|
172
|
|
|
|
|
|
|
|
|
173
|
|
|
|
|
|
|
The I<moddata> field will point towards an HV that modules can used to store |
|
174
|
|
|
|
|
|
|
extra data between stages. As a naming convention a module should prefix its |
|
175
|
|
|
|
|
|
|
keys with its own module name and a slash character, C<"Some::Module/field">. |
|
176
|
|
|
|
|
|
|
The field will point to a newly-created HV for every parse invocation, and |
|
177
|
|
|
|
|
|
|
will be released when each parse is complete. |
|
178
|
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
=head1 PARSE HOOKS |
|
180
|
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
The C<XSParseSublikeHooks> structure provides the following hook stages, which |
|
182
|
|
|
|
|
|
|
are invoked in the given order. |
|
183
|
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
The structure has a I<flags> field, which controls various optional parts of |
|
185
|
|
|
|
|
|
|
operation. The following flags are defined. |
|
186
|
|
|
|
|
|
|
|
|
187
|
|
|
|
|
|
|
=over 4 |
|
188
|
|
|
|
|
|
|
|
|
189
|
|
|
|
|
|
|
=item XS_PARSE_SUBLIKE_FLAG_FILTERATTRS |
|
190
|
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
If set, the optional C<filter_attr> stage will be invoked. |
|
192
|
|
|
|
|
|
|
|
|
193
|
|
|
|
|
|
|
=item XS_PARSE_SUBLIKE_FLAG_BODY_OPTIONAL |
|
194
|
|
|
|
|
|
|
|
|
195
|
|
|
|
|
|
|
If B<not> set, the I<require_parts> field will imply the |
|
196
|
|
|
|
|
|
|
C<XS_PARSE_SUBLIKE_PART_BODY> flag, making the body part required. By setting |
|
197
|
|
|
|
|
|
|
this flag this will no longer happen. If all hooks agree, then the body will |
|
198
|
|
|
|
|
|
|
become optional. |
|
199
|
|
|
|
|
|
|
|
|
200
|
|
|
|
|
|
|
=item XS_PARSE_SUBLIKE_FLAG_PREFIX |
|
201
|
|
|
|
|
|
|
|
|
202
|
|
|
|
|
|
|
If set, the keyword is considered to be a prefix that can be placed in front |
|
203
|
|
|
|
|
|
|
of C<sub> or another sub-like keyword, to add its set of hooks in addition to |
|
204
|
|
|
|
|
|
|
those of the following keyword. These prefices may be further stacked. |
|
205
|
|
|
|
|
|
|
|
|
206
|
|
|
|
|
|
|
=back |
|
207
|
|
|
|
|
|
|
|
|
208
|
|
|
|
|
|
|
In addition there are two C<U8> fields named I<require_parts> and |
|
209
|
|
|
|
|
|
|
I<skip_parts> which control the behaviour of various parts of the syntax which |
|
210
|
|
|
|
|
|
|
are usually optional. Any parts with bits set in I<require_parts> become |
|
211
|
|
|
|
|
|
|
non-optional, and an error if they are missing. Any parts with bits set in |
|
212
|
|
|
|
|
|
|
I<skip_parts> will skip the relevant part of the parsing process. |
|
213
|
|
|
|
|
|
|
|
|
214
|
|
|
|
|
|
|
When multiple sets of hooks are combined by the C<xs_parse_sublike_any> |
|
215
|
|
|
|
|
|
|
function, or as part of parsing prefixing keywords, these bitmasks are |
|
216
|
|
|
|
|
|
|
accumulated together with inclusive or. Any part required by any set of hooks |
|
217
|
|
|
|
|
|
|
will still be required; any step skipped by either will be skipped entirely. |
|
218
|
|
|
|
|
|
|
|
|
219
|
|
|
|
|
|
|
If the same bit is set in both fields then the relevant parsing step will not |
|
220
|
|
|
|
|
|
|
be performed but it will still be an error for that section to be missing. |
|
221
|
|
|
|
|
|
|
This is likely not useful. |
|
222
|
|
|
|
|
|
|
|
|
223
|
|
|
|
|
|
|
Note that for skipped parts, only the actual parsing steps are skipped. A hook |
|
224
|
|
|
|
|
|
|
function can still set the relevant fields in the context structure anyway to |
|
225
|
|
|
|
|
|
|
force a particular value for those parts. |
|
226
|
|
|
|
|
|
|
|
|
227
|
|
|
|
|
|
|
=over 4 |
|
228
|
|
|
|
|
|
|
|
|
229
|
|
|
|
|
|
|
=item XS_PARSE_SUBLIKE_PART_NAME |
|
230
|
|
|
|
|
|
|
|
|
231
|
|
|
|
|
|
|
The name of the function. |
|
232
|
|
|
|
|
|
|
|
|
233
|
|
|
|
|
|
|
=item XS_PARSE_SUBLIKE_PART_ATTRS |
|
234
|
|
|
|
|
|
|
|
|
235
|
|
|
|
|
|
|
The attributes of the function. |
|
236
|
|
|
|
|
|
|
|
|
237
|
|
|
|
|
|
|
This part can be skipped, but the bit is ignored when in I<require_parts>. It |
|
238
|
|
|
|
|
|
|
is always permitted to not provide any additional attributes to a function |
|
239
|
|
|
|
|
|
|
definition. |
|
240
|
|
|
|
|
|
|
|
|
241
|
|
|
|
|
|
|
=item XS_PARSE_SUBLIKE_PART_SIGNATURE |
|
242
|
|
|
|
|
|
|
|
|
243
|
|
|
|
|
|
|
The parameter signature of the function. |
|
244
|
|
|
|
|
|
|
|
|
245
|
|
|
|
|
|
|
This part can be skipped, but it is always permitted not to provide a |
|
246
|
|
|
|
|
|
|
signature for a function definition even if the bit it set in |
|
247
|
|
|
|
|
|
|
I<require_parts>. This is because such syntax only applies when |
|
248
|
|
|
|
|
|
|
C<use feature 'signatures'> is in effect, and only on supporting perl |
|
249
|
|
|
|
|
|
|
versions. |
|
250
|
|
|
|
|
|
|
|
|
251
|
|
|
|
|
|
|
However, setting the bit in I<require_parts> instead has the effect of |
|
252
|
|
|
|
|
|
|
enabling C<use feature 'signatures'> (at least on supporting perl versions), |
|
253
|
|
|
|
|
|
|
thus permitting the syntax to use a signature even if the signatures feature |
|
254
|
|
|
|
|
|
|
was not previously enabled. |
|
255
|
|
|
|
|
|
|
|
|
256
|
|
|
|
|
|
|
=item XS_PARSE_SUBLIKE_PART_BODY |
|
257
|
|
|
|
|
|
|
|
|
258
|
|
|
|
|
|
|
The actual body of the function, expressed as a brace-delimited block. |
|
259
|
|
|
|
|
|
|
|
|
260
|
|
|
|
|
|
|
This part cannot be skipped, but it can be made optional by omitting it from |
|
261
|
|
|
|
|
|
|
the I<require_parts> field. Instead of the block, it is permitted to place a |
|
262
|
|
|
|
|
|
|
single semicolon (C<;>) to act as a statement terminator; thus giving the same |
|
263
|
|
|
|
|
|
|
syntax as a subroutine forward declaration. |
|
264
|
|
|
|
|
|
|
|
|
265
|
|
|
|
|
|
|
In this case, the C<body> and C<cv> fields of the context structure will |
|
266
|
|
|
|
|
|
|
remain C<NULL>. |
|
267
|
|
|
|
|
|
|
|
|
268
|
|
|
|
|
|
|
This flag is currently implied on the I<require_parts> field if the hook does |
|
269
|
|
|
|
|
|
|
not supply the C<XS_PARSE_SUBLIKE_FLAG_BODY_OPTIONAL> flag; meaning that most |
|
270
|
|
|
|
|
|
|
use-cases will make it a required part. |
|
271
|
|
|
|
|
|
|
|
|
272
|
|
|
|
|
|
|
=back |
|
273
|
|
|
|
|
|
|
|
|
274
|
|
|
|
|
|
|
=head2 The C<permit> Stage |
|
275
|
|
|
|
|
|
|
|
|
276
|
|
|
|
|
|
|
const char *permit_hintkey |
|
277
|
|
|
|
|
|
|
bool (*permit)(pTHX_ void *hookdata) |
|
278
|
|
|
|
|
|
|
|
|
279
|
|
|
|
|
|
|
Called by the installed keyword parser hook which is used to handle keywords |
|
280
|
|
|
|
|
|
|
registered by L</register_xs_parse_sublike>. |
|
281
|
|
|
|
|
|
|
|
|
282
|
|
|
|
|
|
|
As a shortcut for the common case, the C<permit_hintkey> may point to a string |
|
283
|
|
|
|
|
|
|
to look up from the hints hash. If the given key name is not found in the |
|
284
|
|
|
|
|
|
|
hints hash then the keyword is not permitted. If the key is present then the |
|
285
|
|
|
|
|
|
|
C<permit> function is invoked as normal. |
|
286
|
|
|
|
|
|
|
|
|
287
|
|
|
|
|
|
|
If not rejected by a hint key that was not found in the hints hash, the |
|
288
|
|
|
|
|
|
|
function part of the stage is called next and should inspect whether the |
|
289
|
|
|
|
|
|
|
keyword is permitted at this time perhaps by inspecting other lexical clues, |
|
290
|
|
|
|
|
|
|
and return true only if the keyword is permitted. |
|
291
|
|
|
|
|
|
|
|
|
292
|
|
|
|
|
|
|
Both the string and the function are optional. Either or both may be present. |
|
293
|
|
|
|
|
|
|
If neither is present then the keyword is always permitted - which is likely |
|
294
|
|
|
|
|
|
|
not what you wanted to do. |
|
295
|
|
|
|
|
|
|
|
|
296
|
|
|
|
|
|
|
=head2 Parse Name |
|
297
|
|
|
|
|
|
|
|
|
298
|
|
|
|
|
|
|
At this point, the optional name is parsed and filled into the C<name> field |
|
299
|
|
|
|
|
|
|
of the context. |
|
300
|
|
|
|
|
|
|
|
|
301
|
|
|
|
|
|
|
=head2 The C<pre_subparse> Stage |
|
302
|
|
|
|
|
|
|
|
|
303
|
|
|
|
|
|
|
void (*pre_subparse)(pTHX_ struct XSParseSublikeContext *ctx, void *hookdata) |
|
304
|
|
|
|
|
|
|
|
|
305
|
|
|
|
|
|
|
Invoked just before C<start_subparse()> is called. |
|
306
|
|
|
|
|
|
|
|
|
307
|
|
|
|
|
|
|
=head2 Parse Attrs |
|
308
|
|
|
|
|
|
|
|
|
309
|
|
|
|
|
|
|
At this point the optional sub attributes are parsed and filled into the |
|
310
|
|
|
|
|
|
|
C<attrs> field of the context, then C<block_start()> is called. |
|
311
|
|
|
|
|
|
|
|
|
312
|
|
|
|
|
|
|
=head2 The optional C<filter_attr> Stage |
|
313
|
|
|
|
|
|
|
|
|
314
|
|
|
|
|
|
|
bool (*filter_attr)(pTHX_ struct XSParseSublikeContext *ctx, |
|
315
|
|
|
|
|
|
|
SV *attr, SV *val, void *hookdata); |
|
316
|
|
|
|
|
|
|
|
|
317
|
|
|
|
|
|
|
If the I<flags> field includes C<XS_PARSE_SUBLIKE_FLAG_FILTERATTRS> then each |
|
318
|
|
|
|
|
|
|
individual attribute is passed through this optional filter function |
|
319
|
|
|
|
|
|
|
immediately as each is parsed. I<attr> will be a string SV containing the name |
|
320
|
|
|
|
|
|
|
of the attribute, and I<val> will either be C<NULL>, or a string SV containing |
|
321
|
|
|
|
|
|
|
the contents of the parens after its name (without the parens themselves). |
|
322
|
|
|
|
|
|
|
|
|
323
|
|
|
|
|
|
|
If the filter returns C<true>, it indicates that it has in some way handled |
|
324
|
|
|
|
|
|
|
the attribute and it should not be added to the list given to C<newATTRSUB()>. |
|
325
|
|
|
|
|
|
|
If the filter returns C<false> it will be handled in the usual way; equivalent |
|
326
|
|
|
|
|
|
|
to the case where the filter function did not exist. |
|
327
|
|
|
|
|
|
|
|
|
328
|
|
|
|
|
|
|
=head2 The C<post_blockstart> Stage |
|
329
|
|
|
|
|
|
|
|
|
330
|
|
|
|
|
|
|
void (*post_blockstart)(pTHX_ struct XSParseSublikeContext *ctx, void *hookdata) |
|
331
|
|
|
|
|
|
|
|
|
332
|
|
|
|
|
|
|
Invoked after the C<block_start()> function has been called. This hook stage |
|
333
|
|
|
|
|
|
|
may wish to perform any alterations of C<PL_compcv> or related, inspect or |
|
334
|
|
|
|
|
|
|
alter the lexical pad, provide hints hash values, or any other tasks before |
|
335
|
|
|
|
|
|
|
the signature and code body are parsed. |
|
336
|
|
|
|
|
|
|
|
|
337
|
|
|
|
|
|
|
=head2 Parse Body |
|
338
|
|
|
|
|
|
|
|
|
339
|
|
|
|
|
|
|
At this point, the main body of the function is parsed and the optree is |
|
340
|
|
|
|
|
|
|
stored in the C<body> field of the context. If the perl version supports sub |
|
341
|
|
|
|
|
|
|
signatures and they are enabled and found, the body will be prefixed with the |
|
342
|
|
|
|
|
|
|
signature ops as well. |
|
343
|
|
|
|
|
|
|
|
|
344
|
|
|
|
|
|
|
=head2 The C<pre_blockend> Stage |
|
345
|
|
|
|
|
|
|
|
|
346
|
|
|
|
|
|
|
void (*pre_blockend)(pTHX_ struct XSParseSublikeContext *ctx, void *hookdata) |
|
347
|
|
|
|
|
|
|
|
|
348
|
|
|
|
|
|
|
Invoked just before the C<block_end()> function is invoked. The hook stage may |
|
349
|
|
|
|
|
|
|
wish to inspect or alter the optree stored in the C<body> context field. |
|
350
|
|
|
|
|
|
|
|
|
351
|
|
|
|
|
|
|
=head2 The C<post_newcv> Stage |
|
352
|
|
|
|
|
|
|
|
|
353
|
|
|
|
|
|
|
void (*post_newcv)(pTHX_ struct XSParseSublikeContext *ctx, void *hookdata) |
|
354
|
|
|
|
|
|
|
|
|
355
|
|
|
|
|
|
|
Invoked just after C<newATTRSUB()> has been invoked on the optree. The hook |
|
356
|
|
|
|
|
|
|
stage may wish to inspect or alter the CV stored in the C<cv> context field. |
|
357
|
|
|
|
|
|
|
|
|
358
|
|
|
|
|
|
|
=cut |
|
359
|
|
|
|
|
|
|
|
|
360
|
|
|
|
|
|
|
=head1 AUTHOR |
|
361
|
|
|
|
|
|
|
|
|
362
|
|
|
|
|
|
|
Paul Evans <leonerd@leonerd.org.uk> |
|
363
|
|
|
|
|
|
|
|
|
364
|
|
|
|
|
|
|
=cut |
|
365
|
|
|
|
|
|
|
|
|
366
|
|
|
|
|
|
|
0x55AA; |