X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=Declare.xs;h=0474261ab56215931cb60cd2a60650fefe0d178a;hb=358aacb228a1788a407b975347048679af338e20;hp=6b188c3d28cd126658a25d9b377f22c127dc2832;hpb=41db92e3b7ca6cde5ddafd4d3f0c52dd8debea1e;p=p5sagit%2FDevel-Declare.git diff --git a/Declare.xs b/Declare.xs index 6b188c3..0474261 100644 --- a/Declare.xs +++ b/Declare.xs @@ -11,6 +11,11 @@ # define Newx(v,n,t) New(0,v,n,t) #endif /* !Newx */ +#define DD_DEBUGf_UPDATED_LINESTR 1 +#define DD_DEBUGf_TRACE 2 + +#define DD_DEBUG_UPDATED_LINESTR (dd_debug & DD_DEBUGf_UPDATED_LINESTR) +#define DD_DEBUG_TRACE (dd_debug & DD_DEBUGf_TRACE) static int dd_debug = 0; #define LEX_NORMAL 10 @@ -128,6 +133,17 @@ void dd_set_linestr(pTHX_ char* new_value) { SvCUR_set(PL_linestr, new_len); PL_bufend = SvPVX(PL_linestr) + new_len; + + if ( DD_DEBUG_UPDATED_LINESTR && PERLDB_LINE && PL_curstash != PL_debstash) { + // Cribbed from toke.c + SV * const sv = NEWSV(85,0); + + sv_upgrade(sv, SVt_PVMG); + sv_setpvn(sv,PL_bufptr,PL_bufend-PL_bufptr); + (void)SvIOK_on(sv); + SvIV_set(sv, 0); + av_store(CopFILEAV(&PL_compiling),(I32)CopLINE(&PL_compiling),sv); + } } char* dd_get_lex_stuff(pTHX) { @@ -204,7 +220,7 @@ int dd_toke_scan_str(pTHX_ int offset) { int dd_toke_skipspace(pTHX_ int offset) { char* base_s = SvPVX(PL_linestr) + offset; - char* s = skipspace(base_s); + char* s = skipspace_force(base_s); return s - base_s; } @@ -218,7 +234,7 @@ STATIC OP *dd_ck_rv2cv(pTHX_ OP *o, void *user_data) { PERL_UNUSED_VAR(user_data); if (in_declare) { - if (dd_debug) { + if (DD_DEBUG_TRACE) { printf("Deconstructing declare\n"); printf("PL_bufptr: %s\n", PL_bufptr); printf("bufend at: %i\n", PL_bufend - PL_bufptr); @@ -236,7 +252,7 @@ STATIC OP *dd_ck_rv2cv(pTHX_ OP *o, void *user_data) { FREETMPS; LEAVE; - if (dd_debug) { + if (DD_DEBUG_TRACE) { printf("PL_bufptr: %s\n", PL_bufptr); printf("bufend at: %i\n", PL_bufend - PL_bufptr); printf("linestr: %s\n", SvPVX(PL_linestr)); @@ -254,7 +270,7 @@ STATIC OP *dd_ck_rv2cv(pTHX_ OP *o, void *user_data) { if (!DD_AM_LEXING) return o; /* not lexing? */ - if (dd_debug) { + if (DD_DEBUG_TRACE) { printf("Checking GV %s -> %s\n", HvNAME(GvSTASH(kGVOP_gv)), GvNAME(kGVOP_gv)); } @@ -263,7 +279,7 @@ STATIC OP *dd_ck_rv2cv(pTHX_ OP *o, void *user_data) { if (dd_flags == -1) return o; - if (dd_debug) { + if (DD_DEBUG_TRACE) { printf("dd_flags are: %i\n", dd_flags); printf("PL_tokenbuf: %s\n", PL_tokenbuf); } @@ -286,7 +302,7 @@ OP* dd_pp_entereval(pTHX) { #endif sv = POPs; if (SvPOK(sv)) { - if (dd_debug) { + if (DD_DEBUG_TRACE) { printf("mangling eval sv\n"); } if (SvREADONLY(sv)) @@ -365,6 +381,37 @@ STATIC OP *dd_ck_const(pTHX_ OP *o, void *user_data) { break; } + if (strnEQ(PL_bufptr, "->", 2)) { + return o; + } + + { + char buf[256]; + STRLEN len; + char *s = PL_bufptr; + STRLEN old_offset = PL_bufptr - SvPVX(PL_linestr); + + s = scan_word(s, buf, sizeof buf, FALSE, &len); + if (strnEQ(buf, name, len)) { + char *d; + SV *inject = newSVpv("", 0); + sv_catpvn(inject, SvPV_nolen(PL_linestr), PL_bufptr - SvPVX(PL_linestr)); + sv_catpvn(inject, buf, len); + + d = peekspace(s); + sv_catpvn(inject, s, d - s); + + if ((PL_bufend - d) >= 2 && strnEQ(d, "=>", 2)) { + return o; + } + + sv_catpv(inject, d); + dd_set_linestr(aTHX_ SvPV_nolen(inject)); + PL_bufptr = SvPVX(PL_linestr) + old_offset; + SvREFCNT_dec (inject); + } + } + dd_linestr_callback(aTHX_ "const", name); return o; @@ -472,6 +519,13 @@ set_in_declare(int value) in_declare = value; BOOT: - if (getenv ("DD_DEBUG")) { - dd_debug = 1; +{ + char *endptr; + char *debug_str = getenv ("DD_DEBUG"); + if (debug_str) { + dd_debug = strtol (debug_str, &endptr, 10); + if (*endptr != '\0') { + dd_debug = 0; + } } +}