X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2Findirect.git;a=blobdiff_plain;f=indirect.xs;h=8ff064bc0796a52d89683502c6467986542bedb1;hp=4f7ac3a9721c19e5abd772d107920c3eb52fa419;hb=502e3aac;hpb=47795ecd50880244edb1da0a9253bf228d9e9293 diff --git a/indirect.xs b/indirect.xs index 4f7ac3a..8ff064b 100644 --- a/indirect.xs +++ b/indirect.xs @@ -35,8 +35,12 @@ # define SvPVX_const SvPVX #endif -#ifndef SvREFCNT_inc_simple_NN -# define SvREFCNT_inc_simple_NN SvREFCNT_inc +#ifndef SvREFCNT_inc_simple_void_NN +# ifdef SvREFCNT_inc_simple_NN +# define SvREFCNT_inc_simple_void_NN SvREFCNT_inc_simple_NN +# else +# define SvREFCNT_inc_simple_void_NN SvREFCNT_inc +# endif #endif #ifndef sv_catpvn_nomg @@ -338,7 +342,7 @@ STATIC SV *indirect_tag(pTHX_ SV *value) { value = SvRV(value); if (SvTYPE(value) >= SVt_PVCV) { code = value; - SvREFCNT_inc_simple_NN(code); + SvREFCNT_inc_simple_void_NN(code); } } @@ -475,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; @@ -501,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; } @@ -780,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;