assert(args);
assert(SvTYPE(args) == SVt_PVHV);
- ENTER;
- SAVETMPS;
+ if(mg_find((SV*)args, PERL_MAGIC_tied)){
+ croak("You cannot use tied HASH reference as initializing arguments");
+ }
if(!ignore_triggers){
triggers_queue = newAV_mortal();
set_slot(object, newSVpvs_flags("__METACLASS__", SVs_TEMP), meta);
}
- FREETMPS;
- LEAVE;
}
static SV*
PUSHs(args);
PUTBACK;
- call_sv(AvARRAY(buildall)[i], G_VOID | G_DISCARD);
+ call_sv(AvARRAY(buildall)[i], G_VOID);
+
+ /* discard a scalar which G_VOID returns */
+ SPAGAIN;
+ (void)POPs;
+ PUTBACK;
}
}
BOOT:
INSTALL_SIMPLE_READER(Class, roles);
INSTALL_SIMPLE_PREDICATE_WITH_KEY(Class, is_anon_class, anon_serial_id);
+ INSTALL_SIMPLE_READER(Class, is_immutable);
INSTALL_CLASS_HOLDER(Class, method_metaclass, "Mouse::Meta::Method");
INSTALL_CLASS_HOLDER(Class, attribute_metaclass, "Mouse::Meta::Attribute");
AV* demolishall;
I32 len, i;
- PERL_UNUSED_VAR(ix);
-
if(!IsObject(object)){
- croak("You must not call DESTROY as a class method");
+ croak("You must not call %s as a class method",
+ ix == 0 ? "DESTROY" : "DEMOLISHALL");
}
if(SvOK(meta)){
XPUSHs(object);
PUTBACK;
- call_sv(AvARRAY(demolishall)[i], G_VOID | G_DISCARD | G_EVAL);
- if(SvTRUE(ERRSV)){
+ call_sv(AvARRAY(demolishall)[i], G_VOID | G_EVAL);
+
+ /* discard a scalar which G_VOID returns */
+ SPAGAIN;
+ (void)POPs;
+ PUTBACK;
+
+ if(sv_true(ERRSV)){
SV* const e = newSVsv(ERRSV);
FREETMPS;
if(!IsHashRef(args)){
croak("You must pass a HASH reference to BUILDALL");
}
- if(mg_find(SvRV(args), PERL_MAGIC_tied)){
- croak("You cannot use tie HASH reference as args");
- }
mouse_buildall(aTHX_ xc, self, args);
}