X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=indirect.xs;h=f8312ac889a9fe5982ee33dcc28d35d0bbe7fd02;hb=3b879bdf6ec7035d353f6c6fdeff405633dbf493;hp=53b23f60ce7bff4cd1918fafda55278f5e877d1e;hpb=3336d670f357e35805f53357a5b72dbb5676a535;p=perl%2Fmodules%2Findirect.git diff --git a/indirect.xs b/indirect.xs index 53b23f6..f8312ac 100644 --- a/indirect.xs +++ b/indirect.xs @@ -112,6 +112,14 @@ STATIC const char *indirect_find(pTHX_ SV *sv, const char *s) { STRLEN len; const char *p = NULL, *r = SvPV_const(sv, len); + if (len >= 1 && *r == '$') { + ++r; + --len; + s = strchr(s, '$'); + if (!s) + return NULL; + } + p = strstr(s, r); while (p) { p += len; @@ -175,15 +183,15 @@ STATIC OP *indirect_ck_rv2sv(pTHX_ OP *o) { const char *stash = HvNAME_get(PL_curstash); STRLEN stashlen = HvNAMELEN_get(PL_curstash); - if ((len < stashlen + 2) || name != strstr(name, stash)) { + if ((len < stashlen + 2) || strnNE(name, stash, stashlen) + || name[stashlen] != ':' || name[stashlen+1] != ':') { /* Failed again ? Try to remove main */ stash = "main"; stashlen = 4; - if ((len < stashlen + 2) || name != strstr(name, stash)) + if ((len < stashlen + 2) || strnNE(name, stash, stashlen) + || name[stashlen] != ':' || name[stashlen+1] != ':') goto done; } - if (name[stashlen] != ':' || name[stashlen+1] != ':') - goto done; sv_setpvn(sv, "$", 1); stashlen += 2; @@ -214,10 +222,13 @@ STATIC OP *indirect_ck_padany(pTHX_ OP *o) { const char *s = PL_parser->oldbufptr, *t = PL_parser->bufptr - 1; while (s < t && isSPACE(*s)) ++s; - while (t > s && isSPACE(*t)) --t; - sv = sv_2mortal(newSVpvn(s, t - s + 1)); - - indirect_map_store(o, s, sv); + if (*s == '$' && ++s <= t) { + while (s < t && isSPACE(*s)) ++s; + while (s < t && isSPACE(*t)) --t; + sv = sv_2mortal(newSVpvn("$", 1)); + sv_catpvn_nomg(sv, s, t - s + 1); + indirect_map_store(o, s, sv); + } } return o;