X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2Findirect.git;a=blobdiff_plain;f=indirect.xs;h=8ff064bc0796a52d89683502c6467986542bedb1;hp=f36c179e8537e024c75b414f90bb1e4d1eeefc2f;hb=502e3aac65b9da2d9a22dbc91995e0b68221f6bb;hpb=122a05bdb9134d5f644ac55e2db7e9479f9f2d0e diff --git a/indirect.xs b/indirect.xs index f36c179..8ff064b 100644 --- a/indirect.xs +++ b/indirect.xs @@ -479,11 +479,27 @@ STATIC void indirect_map_delete(pTHX_ const OP *o) { /* --- Check functions ----------------------------------------------------- */ +STATIC STRLEN indirect_nextline(const char *s, STRLEN len) { + STRLEN i; + + for (i = 0; i < len; ++i) { + if (s[i] == '\n') { + ++i; + while (i < len && s[i] == '\r') + ++i; + break; + } + } + + return i; +} + 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, *r = SvPV_const(sv, len); + const char *p, *r, *t, *u; + r = SvPV_const(sv, len); if (len >= 1 && *r == '$') { ++r; --len; @@ -505,7 +521,17 @@ STATIC int indirect_find(pTHX_ SV *sv, const char *s, STRLEN *pos) { ++p; } - *pos = p - SvPVX_const(PL_linestr); + t = SvPV_const(PL_linestr, len); + u = t; + while (t <= p) { + STRLEN i = indirect_nextline(t, len); + if (i >= len) + break; + u = t; + t += i; + len -= i; + } + *pos = p - u; return 1; } @@ -784,7 +810,8 @@ STATIC OP *indirect_ck_entersub(pTHX_ OP *o) { /* 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) { + if ( moi->line < ooi->line + || (moi->line == ooi->line && moi->pos <= ooi->pos)) { SV *file; dSP;