Function-Parameters
view release on metacpan or search on metacpan
Parameters.xs view on Meta::CPAN
/* 7, 8 */ {
if (ps->slurpy.name) {
PUSHs(ps->slurpy.name);
if (ps->slurpy.type) {
PUSHs(ps->slurpy.type);
} else {
PUSHmortal;
}
} else {
PUSHmortal;
PUSHmortal;
}
}
PUTBACK;
call_pv(MY_PKG "::_register_info", G_VOID);
FREETMPS;
LEAVE;
}
static int parse_fun(pTHX_ Sentinel sen, OP **pop, const char *keyword_ptr, STRLEN keyword_len, const KWSpec *spec) {
ParamSpec *param_spec;
SV *declarator;
I32 floor_ix;
int save_ix;
SV *saw_name;
OpGuard *prelude_sentinel;
SV *proto;
OpGuard *attrs_sentinel;
OP *body;
unsigned builtin_attrs;
I32 c;
declarator = sentinel_mortalize(sen, newSVpvn(keyword_ptr, keyword_len));
if (lex_bufutf8()) {
SvUTF8_on(declarator);
}
lex_read_space(0);
builtin_attrs = 0;
/* function name */
saw_name = NULL;
if ((spec->flags & FLAG_NAME_OK) && (saw_name = my_scan_word(aTHX_ sen, TRUE))) {
if (PL_parser->expect != XSTATE) {
/* bail out early so we don't predeclare $saw_name */
Perl_croak(aTHX_ "In %"SVf": I was expecting a parameter list, not \"%"SVf"\"", SVfARG(declarator), SVfARG(saw_name));
}
sv_catpvs(declarator, " ");
sv_catsv(declarator, saw_name);
if (
sv_eq_pvs(saw_name, "BEGIN") ||
sv_eq_pvs(saw_name, "END") ||
sv_eq_pvs(saw_name, "INIT") ||
sv_eq_pvs(saw_name, "CHECK") ||
sv_eq_pvs(saw_name, "UNITCHECK")
) {
builtin_attrs |= MY_ATTR_SPECIAL;
}
lex_read_space(0);
} else if (!(spec->flags & FLAG_ANON_OK)) {
Perl_croak(aTHX_ "I was expecting a function name, not \"%.*s\"", (int)(PL_parser->bufend - PL_parser->bufptr), PL_parser->bufptr);
} else {
sv_catpvs(declarator, " (anon)");
}
/* we're a subroutine declaration */
floor_ix = start_subparse(FALSE, saw_name ? 0 : CVf_ANON);
SAVEFREESV(PL_compcv);
/* create outer block: '{' */
save_ix = block_start(TRUE);
/* initialize synthetic optree */
Newx(prelude_sentinel, 1, OpGuard);
op_guard_init(prelude_sentinel);
sentinel_register(sen, prelude_sentinel, free_op_guard_void);
/* parameters */
c = lex_peek_unichar(0);
if (c != '(') {
Perl_croak(aTHX_ "In %"SVf": I was expecting a parameter list, not \"%c\"", SVfARG(declarator), (int)c);
}
lex_read_unichar(0);
lex_read_space(0);
Newx(param_spec, 1, ParamSpec);
ps_init(param_spec);
sentinel_register(sen, param_spec, ps_free_void);
{
OpGuard *init_sentinel;
Newx(init_sentinel, 1, OpGuard);
op_guard_init(init_sentinel);
sentinel_register(sen, init_sentinel, free_op_guard_void);
while ((c = lex_peek_unichar(0)) != ')') {
int flags;
SV *name, *type;
char sigil;
PADOFFSET padoff;
padoff = parse_param(aTHX_ sen, declarator, spec, param_spec, &flags, &name, init_sentinel, &type);
if (padoff != NOT_IN_PAD) {
intro_my();
}
sigil = SvPV_nolen(name)[0];
/* internal consistency */
if (flags & PARAM_NAMED) {
if (padoff == NOT_IN_PAD) {
( run in 1.881 second using v1.01-cache-2.11-cpan-39bf76dae61 )