diff options
author | Nicholas Clark <nick@ccl4.org> | 2008-10-27 20:25:46 +0000 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2008-10-27 20:25:46 +0000 |
commit | b1bc3f345d4dfe19cd94c120c46649336b5cb92b (patch) | |
tree | bdfcef0c7875037af6a5fa8195d2203fe76e6b27 /hv.h | |
parent | bb5dd93d07e2d54d352e519c7b43ff2d3e5c5f36 (diff) | |
download | perl-b1bc3f345d4dfe19cd94c120c46649336b5cb92b.tar.gz |
Add a macro MUTABLE_PTR(p), which on (non-pedantic) gcc will not cast
away const, returning a void *. Add MUTABLE_SV(sv) which uses this, and
replace all (SV *) casts either with MUTABLE_SV(sv), or (const SV *).
This probably still needs some work - assigning to SvPVX() and SvRV()
is now likely to generate a casting error. The core doesn't do this.
But as-is it's finding bugs that can be fixed.
p4raw-id: //depot/perl@34605
Diffstat (limited to 'hv.h')
-rw-r--r-- | hv.h | 10 |
1 files changed, 5 insertions, 5 deletions
@@ -394,7 +394,7 @@ C<SV*>. #define HV_ITERNEXT_WANTPLACEHOLDERS 0x01 /* Don't skip placeholders. */ #define hv_iternext(hv) hv_iternext_flags(hv, 0) -#define hv_magic(hv, gv, how) sv_magic((SV*)(hv), (SV*)(gv), how, NULL, 0) +#define hv_magic(hv, gv, how) sv_magic(MUTABLE_SV(hv), MUTABLE_SV(gv), how, NULL, 0) /* available as a function in hv.c */ #define Perl_sharepvn(sv, len, hash) HEK_KEY(share_hek(sv, len, hash)) @@ -418,8 +418,8 @@ C<SV*>. ((HE *) hv_common((hv), (keysv), NULL, 0, 0, \ ((lval) ? HV_FETCH_LVALUE : 0), NULL, (hash))) #define hv_delete_ent(hv, key, flags, hash) \ - ((SV *) hv_common((hv), (key), NULL, 0, 0, (flags) | HV_DELETE, \ - NULL, (hash))) + (MUTABLE_SV(hv_common((hv), (key), NULL, 0, 0, (flags) | HV_DELETE, \ + NULL, (hash)))) #define hv_store_flags(hv, key, klen, val, hash, flags) \ ((SV**) hv_common((hv), NULL, (key), (klen), (flags), \ @@ -441,8 +441,8 @@ C<SV*>. : HV_FETCH_JUST_SV, NULL, 0)) #define hv_delete(hv, key, klen, flags) \ - ((SV*) hv_common_key_len((hv), (key), (klen), \ - (flags) | HV_DELETE, NULL, 0)) + (MUTABLE_SV(hv_common_key_len((hv), (key), (klen), \ + (flags) | HV_DELETE, NULL, 0))) /* This refcounted he structure is used for storing the hints used for lexical pragmas. Without threads, it's basically struct he + refcount. |