X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=xs-src%2FMouse.xs;h=1b124c7c21e6abd6665847d0cf38f028881a5dae;hb=f1575d9f6d73252e751770a6c7ac717237059f29;hp=831e522b8d60430a78b20b96197e014a53dbc369;hpb=91ee66cbb155fe48f641868aebc1c6215446e2c0;p=gitmo%2FMouse.git diff --git a/xs-src/Mouse.xs b/xs-src/Mouse.xs index 831e522..1b124c7 100644 --- a/xs-src/Mouse.xs +++ b/xs-src/Mouse.xs @@ -315,7 +315,7 @@ mouse_class_initialize_object(pTHX_ SV* const meta, SV* const object, HV* const value = mouse_xa_apply_type_constraint(aTHX_ xa, value, flags); } value = set_slot(object, slot, value); - if(SvROK(value) && flags & MOUSEf_ATTR_IS_WEAK_REF){ + if(flags & MOUSEf_ATTR_IS_WEAK_REF && SvROK(value)){ weaken_slot(object, slot); } if(flags & MOUSEf_ATTR_HAS_TRIGGER){ @@ -337,8 +337,16 @@ mouse_class_initialize_object(pTHX_ SV* const meta, SV* const object, HV* const mouse_xa_set_default(aTHX_ xa, object); } } - /* don't check while cloning (or reblesseing) */ - else if(!is_cloning && flags & MOUSEf_ATTR_IS_REQUIRED) { + else if(is_cloning) { + if(flags & MOUSEf_ATTR_IS_WEAK_REF){ + SV* const value = get_slot(object, slot); + if(SvROK(value)) { + weaken_slot(object, slot); + } + } + } + /* don't check "required" while cloning (or reblesseing) */ + else if(flags & MOUSEf_ATTR_IS_REQUIRED) { mouse_throw_error(attr, NULL, "Attribute (%"SVf") is required", slot); } } @@ -517,7 +525,7 @@ CODE: /* *{$package . '::' . $name} -> *gv */ gv = gv_fetchpv(form("%"SVf"::%"SVf, package, name), GV_ADDMULTI, SVt_PVCV); mouse_install_sub(aTHX_ gv, code_ref); - //CvMETHOD_on((CV*)SvRV(code_ref)); + /* CvMETHOD_on((CV*)SvRV(code_ref)); */ (void)set_slot(methods, name, code); /* $self->{methods}{$name} = $code */ } @@ -558,9 +566,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 +599,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); } @@ -664,7 +671,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; @@ -732,7 +740,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); }