X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2Findirect.git;a=blobdiff_plain;f=indirect.xs;h=3bd5e6cef5addca2a46f23de0f07979c1152d5dc;hp=3257b26847c9fb471753de15a9433e6f5355c7b2;hb=07fb4eb28539b53578b1421e348c12c921d180f1;hpb=f8f57e18d37518ed81956e1bdadb5757dec206d5 diff --git a/indirect.xs b/indirect.xs index 3257b26..3bd5e6c 100644 --- a/indirect.xs +++ b/indirect.xs @@ -523,27 +523,12 @@ 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 *name_sv, const char *line_bufptr, STRLEN *name_pos) { #define indirect_find(NSV, LBP, NP) indirect_find(aTHX_ (NSV), (LBP), (NP)) STRLEN name_len, line_len; const char *name, *name_end; const char *line, *line_end; - const char *p, *t, *u; + const char *p; line = SvPV_const(PL_linestr, line_len); line_end = line + line_len; @@ -572,26 +557,7 @@ STATIC int indirect_find(pTHX_ SV *name_sv, const char *line_bufptr, STRLEN *nam ++p; } - t = line; - u = t; - - /* If we're inside a string-like environment, we don't need to be smart for - * finding the positions of the tokens : as the line number will always be - * the line where the string began (or at least I hope so), and the line - * buffer points to the beginning of the string (likewise), we can just take - * the offset in this string as the position. */ - if (!PL_lex_inwhat) { - while (t <= p) { - STRLEN i = indirect_nextline(t, line_len); - if (i >= line_len) - break; - u = t; - t += i; - line_len -= i; - } - } - - *name_pos = p - u; + *name_pos = p - line; return 1; } @@ -610,6 +576,25 @@ STATIC OP *indirect_ck_const(pTHX_ OP *o) { STRLEN pos; if (indirect_find(sv, PL_oldbufptr, &pos)) { + STRLEN len; + + /* If the constant is equal to the current package name, try to look for + * a "__PACKAGE__" coming before what we got. We only need to check this + * when we already had a match because __PACKAGE__ can only appear in + * direct method calls ("new __PACKAGE__" is a syntax error). */ + len = SvCUR(sv); + if (len == HvNAMELEN_get(PL_curstash) + && memcmp(SvPVX(sv), HvNAME_get(PL_curstash), len) == 0) { + STRLEN pos_pkg; + SV *pkg = sv_newmortal(); + sv_setpvn(pkg, "__PACKAGE__", sizeof("__PACKAGE__")-1); + + if (indirect_find(pkg, PL_oldbufptr, &pos_pkg) && pos_pkg < pos) { + sv = pkg; + pos = pos_pkg; + } + } + indirect_map_store(o, pos, sv, CopLINE(&PL_compiling)); return o; }