X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Op.xs;h=44e09161c202aa34779166e0536374faae26df79;hb=772cb7d7f89fd1065b1736845c835a26e2d5b097;hp=285c1e9768ae593cc7f2c51b7697ad88fad20f77;hpb=0eb003f3bbeeada878cab10f7dabc020c775b666;p=perl%2Fmodules%2FSub-Op.git diff --git a/Op.xs b/Op.xs index 285c1e9..44e0916 100644 --- a/Op.xs +++ b/Op.xs @@ -13,6 +13,10 @@ #define SO_HAS_PERL(R, V, S) (PERL_REVISION > (R) || (PERL_REVISION == (R) && (PERL_VERSION > (V) || (PERL_VERSION == (V) && (PERL_SUBVERSION >= (S)))))) +#ifndef GvCV_set +# define GvCV_set(G, C) (GvCV(G) = (C)) +#endif + /* ... Thread safety and multiplicity ...................................... */ #ifndef SO_MULTIPLICITY @@ -99,7 +103,7 @@ void sub_op_init(sub_op_config_t *c) { c->namelen = 0; c->proto = NULL; c->protolen = 0; - c->check = 0; + c->call = 0; c->ref = 0; c->ud = NULL; @@ -115,33 +119,32 @@ void sub_op_register(pTHX_ const sub_op_config_t *c, U32 flags) { (void) hv_store(MY_CXT.map, c->name, c->namelen, newSViv(PTR2IV(c)), 0); } +STATIC const char *so_strndup(pTHX_ const char *s, STRLEN len) { +#define so_strndup(S, L) so_strndup(aTHX_ (S), (L)) + const char *d; + + if (!s) + return NULL; + + d = PerlMemShared_malloc(len + 1); + Copy(s, d, len, char); + ((char *) d)[len] = '\0'; + + return d; +} + sub_op_config_t *sub_op_dup(pTHX_ const sub_op_config_t *orig) { - STRLEN len; sub_op_config_t *dupe = PerlMemShared_malloc(sizeof *dupe); - len = orig->namelen; - if (orig->name) { - dupe->name = PerlMemShared_malloc(len + 1); - Copy(orig->name, dupe->name, len, char); - ((char *) dupe->name)[len] = '\0'; - } else { - dupe->name = NULL; - } - dupe->namelen = len; - - len = orig->protolen; - if (orig->proto) { - dupe->proto = PerlMemShared_malloc(len + 1); - Copy(orig->proto, dupe->proto, len, char); - ((char *) dupe->proto)[len] = '\0'; - } else { - dupe->proto = NULL; - } - dupe->protolen = len; + dupe->name = so_strndup(orig->name, orig->namelen); + dupe->namelen = orig->namelen; + + dupe->proto = so_strndup(orig->proto, orig->protolen); + dupe->protolen = orig->protolen; - dupe->check = orig->check; - dupe->ref = orig->ref; - dupe->ud = orig->ud; + dupe->call = orig->call; + dupe->ref = orig->ref; + dupe->ud = orig->ud; return dupe; } @@ -285,11 +288,11 @@ STATIC OP *so_ck_entersub(pTHX_ OP *o) { if (gv && SvTYPE(gv) >= SVt_PVGV && (cv = GvCV(gv)) == MY_CXT.placeholder) { SvREFCNT_dec(cv); - GvCV(gv) = NULL; + GvCV_set(gv, NULL); } - if (c->check) - o = CALL_FPTR(c->check)(aTHX_ o, c->ud); + if (c->call) + o = CALL_FPTR(c->call)(aTHX_ o, c->ud); } } @@ -390,7 +393,7 @@ STATIC OP *so_ck_gelem(pTHX_ OP *o) { if (gv && SvTYPE(gv) >= SVt_PVGV && (cv = GvCV(gv)) == MY_CXT.placeholder) { SvREFCNT_dec(cv); - GvCV(gv) = NULL; + GvCV_set(gv, NULL); } } }