X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=xs-src%2FMouse.xs;h=34e9950ac5acaa4e71373e258cc064f2c261d13a;hb=e0f85c26bdd81d42111bd1a2d2dfe4bded913320;hp=16db0c4144dad08f392d4e48ae497f9dd37ff26d;hpb=66aa0bfc0c984993d7931be70600d96a079b8738;p=gitmo%2FMouse.git diff --git a/xs-src/Mouse.xs b/xs-src/Mouse.xs index 16db0c4..34e9950 100644 --- a/xs-src/Mouse.xs +++ b/xs-src/Mouse.xs @@ -184,7 +184,7 @@ mouse_get_xc_wo_check(pTHX_ SV* const metaclass) { } 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) { @@ -436,8 +436,8 @@ mouse_get_modifier_storage(pTHX_ 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); @@ -558,9 +558,8 @@ PPCODE: 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]); @@ -592,7 +591,7 @@ CODE: 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); } @@ -624,6 +623,19 @@ CODE: 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: @@ -651,7 +663,8 @@ ALIAS: 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; @@ -719,7 +732,8 @@ CODE: /* 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); }