Resource **pp = p;
while (*pp) {
Resource *cur = *pp;
- cur->destroy(aTHX_ cur->data);
+ if (cur->destroy) {
+ cur->destroy(aTHX_ cur->data);
+ }
cur->data = (void *)"no";
cur->destroy = NULL;
*pp = cur->next;
}
}
-static void sentinel_register(Sentinel sen, void *data, void (*destroy)(pTHX_ void *)) {
+static Resource *sentinel_register(Sentinel sen, void *data, void (*destroy)(pTHX_ void *)) {
Resource *cur;
Newx(cur, 1, Resource);
cur->destroy = destroy;
cur->next = *sen;
*sen = cur;
+
+ return cur;
+}
+
+static void sentinel_disarm(Resource *p) {
+ p->destroy = NULL;
}
static void my_sv_refcnt_dec_void(pTHX_ void *p) {
return sv;
}
-static void my_safefree(void *p) {
- Safefree(p);
-}
-
-#define SENTINEL_ALLOC(SEN, P, N, T) STMT_START { \
- Newx(P, N, T); \
- sentinel_register(SEN, P, my_safefree); \
-} STMT_END
-
-#define SENTINEL_MDUP(SEN, P, O, N, T) STMT_START { \
- void *const _sentinel_mdup_tmp_ = (P); \
- SENTINEL_ALLOC(SEN, P, N, T); \
- memcpy(P, _sentinel_mdup_tmp_, O * sizeof (T)); \
-} STMT_END
-
-#define SENTINEL_REALLOC(SEN, P, N, T) STMT_START { \
- assert((N) > 0); \
- if (!(P)) { \
- SENTINEL_ALLOC(SEN, P, N, T); \
- } else { \
- Resource **_sentinel_realloc_tmp_ = (SEN); \
- for (;;) { \
- assert(*_sentinel_realloc_tmp_ != NULL); \
- if ((*_sentinel_realloc_tmp_)->data == (P)) { \
- Renew((*_sentinel_realloc_tmp_)->data, N, T); \
- (P) = (*_sentinel_realloc_tmp_)->data; \
- break; \
- } \
- _sentinel_realloc_tmp_ = &(*_sentinel_realloc_tmp_)->next; \
- } \
- } \
-} STMT_END
-
static int kw_flags(pTHX_ Sentinel sen, const char *kw_ptr, STRLEN kw_len, KWSpec *spec) {
HV *hints;
SV *sv, **psv;
static void my_sv_cat_c(pTHX_ SV *sv, U32 c) {
char ds[UTF8_MAXBYTES + 1], *d;
- d = uvchr_to_utf8(ds, c);
+ d = (char *)uvchr_to_utf8((U8 *)ds, c);
if (d - ds > 1) {
sv_utf8_upgrade(sv);
}
PUSHs(name);
PUTBACK;
- n = call_pv("Moose::Util::TypeConstraints::find_or_parse_type_constraint", G_SCALAR);
+ n = call_pv("Moose::Util::TypeConstraints::find_or_create_isa_type_constraint", G_SCALAR);
SPAGAIN;
assert(n == 1);
+ /* don't warn about n being unused if assert() is compiled out */
+ n = n;
+
t = sentinel_mortalize(sen, SvREFCNT_inc(POPs));
PUTBACK;
) {
I32 c;
char sigil;
- SV *name, *typeobj, *typename;
+ SV *name;
assert(!*pinit);
*pflags = 0;
if (c == '(') {
I32 floor;
OP *expr;
+ Resource *expr_sentinel;
lex_read_unichar(0);
- floor = start_subparse(FALSE, CVf_ANON);
+ floor = start_subparse(FALSE, 0);
+ SAVEFREESV(PL_compcv);
+ CvSPECIAL_on(PL_compcv);
if (!(expr = parse_fullexpr(PARSE_OPTIONAL))) {
croak("In %"SVf": invalid type expression", SVfARG(declarator));
}
- sentinel_register(sen, expr, free_op_void);
+ expr_sentinel = sentinel_register(sen, expr, free_op_void);
lex_read_space(0);
c = lex_peek_unichar(0);
lex_read_unichar(0);
lex_read_space(0);
+ SvREFCNT_inc_simple_void(PL_compcv);
+ sentinel_disarm(expr_sentinel);
*ptype = my_eval(aTHX_ sen, floor, expr);
+ *ptype = reify_type(aTHX_ sen, declarator, *ptype);
if (!sv_isobject(*ptype)) {
croak("In %"SVf": (%"SVf") doesn't look like a type object", SVfARG(declarator), SVfARG(*ptype));
}
c = lex_peek_unichar(0);
} else if (my_is_uni_xidfirst(aTHX_ c)) {
- typename = parse_type(aTHX_ sen, declarator);
+ *ptype = parse_type(aTHX_ sen, declarator);
my_require(aTHX_ "Moose/Util/TypeConstraints.pm");
- typeobj = reify_type(aTHX_ sen, declarator, typename);
- *ptype = typeobj;
+ *ptype = reify_type(aTHX_ sen, declarator, *ptype);
c = lex_peek_unichar(0);
}
static OP *mktypecheck(pTHX_ const SV *declarator, int nr, SV *name, PADOFFSET padoff, SV *type) {
/* $type->check($value) or Carp::croak "...: " . $type->get_message($value) */
- OP *chk, *cond, *err, *msg, *xcroak;
+ OP *chk, *err, *msg, *xcroak;
err = mkconstsv(aTHX_ newSVpvf("In %"SVf": parameter %d (%"SVf"): ", SVfARG(declarator), nr, SVfARG(name)));
{
size_t n;
char *p = SvPV(declarator, n);
char *q = memchr(p, ' ', n);
- mPUSHp(p, q ? q - p : n);
+ mPUSHp(p, q ? (size_t)(q - p) : n);
}
if (!ps) {
if (SvTRUE(kws->shift)) {
*init_sentinel = NULL;
param_spec->named_optional.used++;
} else {
+ Param *p;
+
if (param_spec->positional_optional.used) {
croak("In %"SVf": can't combine optional positional (%"SVf") and required named (%"SVf") parameters", SVfARG(declarator), SVfARG(param_spec->positional_optional.data[0].param.name), SVfARG(name));
}
- Param *p = pv_extend(¶m_spec->named_required);
+ p = pv_extend(¶m_spec->named_required);
p->name = name;
p->padoff = padoff;
p->type = type;
/* check number of arguments */
if (spec->flags & FLAG_CHECK_NARGS) {
int amin, amax;
- size_t named;
amin = args_min(aTHX_ param_spec, spec);
if (amin > 0) {
if (param_spec->slurpy.type) {
/* $type->valid($_) or croak $type->get_message($_) for @rest / values %rest */
- OP *body, *list, *loop;
+ OP *check, *list, *loop;
- body = mktypecheck(aTHX_ declarator, base, param_spec->slurpy.name, NOT_IN_PAD, param_spec->slurpy.type);
+ check = mktypecheck(aTHX_ declarator, base, param_spec->slurpy.name, NOT_IN_PAD, param_spec->slurpy.type);
if (SvPV_nolen(param_spec->slurpy.name)[0] == '@') {
list = my_var_g(aTHX_ OP_PADAV, 0, param_spec->slurpy.padoff);
list = newUNOP(OP_VALUES, 0, list);
}
- loop = newFOROP(0, NULL, list, body, NULL);
+ loop = newFOROP(0, NULL, list, check, NULL);
*prelude_sentinel = op_append_list(OP_LINESEQ, *prelude_sentinel, newSTATEOP(0, NULL, loop));
}
fp__cv_root(sv)
SV * sv
PREINIT:
- CV *cv;
+ CV *xcv;
HV *hv;
GV *gv;
CODE:
- cv = sv_2cv(sv, &hv, &gv, 0);
- RETVAL = PTR2UV(cv ? CvROOT(cv) : NULL);
+ xcv = sv_2cv(sv, &hv, &gv, 0);
+ RETVAL = PTR2UV(xcv ? CvROOT(xcv) : NULL);
OUTPUT:
RETVAL