… | |
… | |
115 | } |
115 | } |
116 | |
116 | |
117 | void |
117 | void |
118 | attachable::sever_self () |
118 | attachable::sever_self () |
119 | { |
119 | { |
120 | if (self) |
120 | if (HV *self = this->self) |
121 | { |
121 | { |
122 | // keep a refcount because sv_unmagic might call attachable_free, |
122 | // keep a refcount because sv_unmagic might call attachable_free, |
123 | // which might clear self, causing sv_unmagic to crash on a now |
123 | // which might clear self, causing sv_unmagic to crash on a now |
124 | // invalid object. |
124 | // invalid object. |
125 | SvREFCNT_inc (self); |
125 | SvREFCNT_inc (self); |
126 | hv_clear (self); |
126 | hv_clear (self); |
127 | sv_unmagic ((SV *)self, PERL_MAGIC_ext); |
127 | sv_unmagic ((SV *)self, PERL_MAGIC_ext); |
128 | SvREFCNT_dec (self); |
128 | SvREFCNT_dec (self); |
129 | |
129 | |
130 | // self *must* be null now because thats sv_unmagic's job. |
130 | // self *must* be null now because thats sv_unmagic's job. |
131 | assert (!self); |
131 | assert (!this->self); |
132 | flags |= 0x80; // severed //D |
132 | flags |= 0x80; // severed //D |
133 | } |
133 | } |
134 | } |
134 | } |
135 | |
135 | |
136 | void |
136 | void |
… | |
… | |
1740 | CODE: |
1740 | CODE: |
1741 | RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext); |
1741 | RETVAL = SvROK (obj) && mg_find (SvRV (obj), PERL_MAGIC_ext); |
1742 | OUTPUT: |
1742 | OUTPUT: |
1743 | RETVAL |
1743 | RETVAL |
1744 | |
1744 | |
|
|
1745 | void |
|
|
1746 | debug_trace (attachable *obj, bool on = true) |
|
|
1747 | CODE: |
|
|
1748 | obj->flags &= ~attachable::F_DEBUG_TRACE; |
|
|
1749 | if (on) |
|
|
1750 | obj->flags |= attachable::F_DEBUG_TRACE; |
|
|
1751 | |
1745 | int mortals_size () |
1752 | int mortals_size () |
1746 | CODE: |
1753 | CODE: |
1747 | RETVAL = attachable::mortals.size (); |
1754 | RETVAL = attachable::mortals.size (); |
1748 | OUTPUT: RETVAL |
1755 | OUTPUT: RETVAL |
1749 | |
1756 | |