X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2Findirect.git;a=blobdiff_plain;f=indirect.xs;h=dedc58bb453c9003a10980dc27dda2a774dde32a;hp=f22ecb315e9d3101b7363b0592985ca4e41f6501;hb=e3609d4f5df9ec09d582f3e60b92e6e8263cd6cd;hpb=6429fd7545e28fe43dd128c3ce6bb2ccf031e514 diff --git a/indirect.xs b/indirect.xs index f22ecb3..dedc58b 100644 --- a/indirect.xs +++ b/indirect.xs @@ -450,7 +450,7 @@ STATIC void indirect_map_delete(pTHX_ const OP *o) { STATIC int indirect_find(pTHX_ SV *sv, const char *s, STRLEN *pos) { #define indirect_find(N, S, P) indirect_find(aTHX_ (N), (S), (P)) STRLEN len; - const char *p = NULL, *r = SvPV_const(sv, len); + const char *p, *r = SvPV_const(sv, len); if (len >= 1 && *r == '$') { ++r; @@ -460,15 +460,18 @@ STATIC int indirect_find(pTHX_ SV *sv, const char *s, STRLEN *pos) { return 0; } - p = strstr(s, r); - while (p) { - p += len; - if (!isALNUM(*p)) + p = s; + while (1) { + p = strstr(p, r); + if (!p) + return 0; + if (!isALNUM(p[len])) break; - p = strstr(p + 1, r); + /* p points to a word that has r as prefix, skip the rest of the word */ + p += len + 1; + while (isALNUM(*p)) + ++p; } - if (!p) - return 0; *pos = p - SvPVX_const(PL_linestr); @@ -697,16 +700,6 @@ done: /* ... ck_entersub ......................................................... */ -STATIC int indirect_is_indirect(const indirect_op_info_t *moi, const indirect_op_info_t *ooi) { - if (moi->pos > ooi->pos) - return 0; - - if (moi->pos == ooi->pos) - return moi->len == ooi->len && !memcmp(moi->buf, ooi->buf, moi->len); - - return 1; -} - STATIC OP *(*indirect_old_ck_entersub)(pTHX_ OP *) = 0; STATIC OP *indirect_ck_entersub(pTHX_ OP *o) { @@ -756,7 +749,10 @@ STATIC OP *indirect_ck_entersub(pTHX_ OP *o) { if (!ooi) goto done; - if (indirect_is_indirect(moi, ooi)) { + /* When positions are identical, the method and the object must have the + * same name. But it also means that it is an indirect call, as "foo->foo" + * results in different positions. */ + if (moi->pos <= ooi->pos) { SV *file; dSP;