#define LEX_NORMAL 10
#define LEX_INTERPNORMAL 9
+/* please try not to have a line longer than this :) */
+
+#define DD_PREFERRED_LINESTR_SIZE 16384
+
/* flag to trigger removal of temporary declaree sub */
static int in_declare = 0;
}
int dd_toke_scan_str(pTHX_ int offset) {
- STRLEN remaining = sv_len(PL_linestr) - offset;
- SV* line_copy = newSVsv(PL_linestr);
+ char* old_pvx = SvPVX(PL_linestr);
+ SV* line_copy = sv_2mortal(newSVsv(PL_linestr));
char* base_s = SvPVX(PL_linestr) + offset;
char* s = scan_str(base_s, FALSE, FALSE);
- if (s != base_s && sv_len(PL_lex_stuff) > remaining) {
- int ret = (s - SvPVX(PL_linestr)) + remaining;
+ if(SvPVX(PL_linestr) != old_pvx)
+ croak("PL_linestr reallocated during scan_str, "
+ "Devel::Declare can't continue");
+ if (!s)
+ return 0;
+ if (s <= base_s) {
+ s += SvCUR(line_copy);
sv_catsv(line_copy, PL_linestr);
dd_set_linestr(aTHX_ SvPV_nolen(line_copy));
- SvREFCNT_dec(line_copy);
- return ret;
}
return s - base_s;
}
int dd_toke_skipspace(pTHX_ int offset) {
+ char* old_pvx = SvPVX(PL_linestr);
char* base_s = SvPVX(PL_linestr) + offset;
char* s = skipspace_force(base_s);
+ if(SvPVX(PL_linestr) != old_pvx)
+ croak("PL_linestr reallocated during skipspace, "
+ "Devel::Declare can't continue");
return s - base_s;
}
static void dd_block_start(pTHX_ int full)
{
PERL_UNUSED_VAR(full);
- if (SvLEN(PL_linestr) < 8192)
- (void) lex_grow_linestr(8192);
+ if (SvLEN(PL_linestr) < DD_PREFERRED_LINESTR_SIZE)
+ (void) lex_grow_linestr(DD_PREFERRED_LINESTR_SIZE);
}
#else /* !DD_GROW_VIA_BLOCKHOOK */
sv = sv_2mortal(newSVsv(sv));
sv_catpvn(sv, "\n;", 2);
}
- SvGROW(sv, 8192);
+ SvGROW(sv, DD_PREFERRED_LINESTR_SIZE);
}
PUSHs(sv);
#ifdef PERL_5_9_PLUS
static I32 dd_filter_realloc(pTHX_ int idx, SV *sv, int maxlen)
{
const I32 count = FILTER_READ(idx+1, sv, maxlen);
- SvGROW(sv, 8192); /* please try not to have a line longer than this :) */
+ SvGROW(sv, DD_PREFERRED_LINESTR_SIZE);
/* filter_del(dd_filter_realloc); */
return count;
}
OUTPUT:
RETVAL
-int
+SV*
toke_scan_str(int offset);
+ PREINIT:
+ int len;
CODE:
- RETVAL = dd_toke_scan_str(aTHX_ offset);
+ len = dd_toke_scan_str(aTHX_ offset);
+ RETVAL = len ? newSViv(len) : &PL_sv_undef;
OUTPUT:
RETVAL