}
static int
-mouse_xc_is_fresh(aTHX_ AV* const xc) {
+mouse_xc_is_fresh(pTHX_ AV* const xc) {
HV* const stash = MOUSE_xc_stash(xc);
SV* const gen = MOUSE_xc_gen(xc);
if(SvUVX(gen) != 0U && MOUSE_xc_flags(xc) & MOUSEf_XC_IS_IMMUTABLE) {
return (AV*)SvRV(storage_ref);
}
-static void
-XS_Mouse_value_holder(pTHX_ CV* const cv PERL_UNUSED_DECL) {
+static
+XSPROTO(XS_Mouse_value_holder) {
dVAR; dXSARGS;
SV* const value = (SV*)XSANY.any_ptr;
assert(value);
linearized_isa() */
HV* const stash = mouse_get_namespace(aTHX_ self);
AV* const linearized_isa = mro_get_linear_isa(stash);
- I32 len;
+ I32 const len = AvFILLp(linearized_isa) + 1;
I32 i;
- len = AvFILLp(linearized_isa) + 1;
EXTEND(SP, len);
for(i = 0; i < len; i++){
PUSHs(AvARRAY(linearized_isa)[i]);
object = mouse_instance_create(aTHX_ MOUSE_xc_stash(xc));
mouse_class_initialize_object(aTHX_ meta, object, args, FALSE);
- mouse_buildall(aTHX_ xc, object, sv_2mortal(newRV_inc((SV*)args))); /* BUILDALL */
+ mouse_buildall(aTHX_ xc, object, sv_2mortal(newRV_inc((SV*)args)));
ST(0) = object; /* because object is mortal, we should return it as is */
XSRETURN(1);
}
mouse_class_initialize_object(aTHX_ meta, object, args, is_cloning);
}
+void
+_invalidate_metaclass_cache(SV* meta)
+CODE:
+{
+ AV* const xc = mouse_get_xc_if_fresh(aTHX_ meta);
+ if(xc) {
+ SV* const gen = MOUSE_xc_gen(xc);
+ sv_setuv(gen, 0U);
+ }
+ delete_slot(meta, newSVpvs_flags("_mouse_cache_", SVs_TEMP));
+}
+
+
MODULE = Mouse PACKAGE = Mouse::Meta::Role
BOOT:
get_after_method_modifiers = MOUSE_M_AFTER
PPCODE:
{
- AV* const storage = mouse_get_modifier_storage(aTHX_ self, (enum mouse_modifier_t)ix, name);
+ AV* const storage = mouse_get_modifier_storage(aTHX_ self,
+ (enum mouse_modifier_t)ix, name);
I32 const len = av_len(storage) + 1;
if(GIMME_V == G_ARRAY) {
I32 i;
/* new_object */
object = mouse_instance_create(aTHX_ MOUSE_xc_stash(xc));
mouse_class_initialize_object(aTHX_ meta, object, (HV*)SvRV(args), FALSE);
- mouse_buildall(aTHX_ xc, object, args); /* BUILDALL */
+ /* BUILDALL */
+ mouse_buildall(aTHX_ xc, object, args);
ST(0) = object; /* because object is mortal, we should return it as is */
XSRETURN(1);
}