This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
add lex_start to the API
authorZefram <zefram@fysh.org>
Wed, 13 Oct 2010 20:48:49 +0000 (21:48 +0100)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 21 Oct 2010 12:52:57 +0000 (05:52 -0700)
lex_start() is added to the API, marked experimental, and documented.
It also gains a flags parameter for foreseeable future use.

embed.fnc
embed.h
global.sym
op.c
perl.c
pp_ctl.c
proto.h
toke.c

index 3fc1164..0fa5ff1 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -611,9 +611,8 @@ s   |OP*    |opt_scalarhv   |NN OP* rep_op
 s      |OP*    |is_inplace_av  |NN OP* o|NULLOK OP* oright
 #endif
 Ap     |void   |leave_scope    |I32 base
-: Used in various files
-p      |void   |lex_start      |NULLOK SV* line|NULLOK PerlIO *rsfp
 : Public lexer API
+AMpd   |void   |lex_start      |NULLOK SV* line|NULLOK PerlIO *rsfp|U32 flags
 AMpd   |bool   |lex_bufutf8
 AMpd   |char*  |lex_grow_linestr|STRLEN len
 AMpd   |void   |lex_stuff_pvn  |NN const char* pv|STRLEN len|U32 flags
diff --git a/embed.h b/embed.h
index bb34039..34b9866 100644 (file)
--- a/embed.h
+++ b/embed.h
 #define lex_read_space(a)      Perl_lex_read_space(aTHX_ a)
 #define lex_read_to(a)         Perl_lex_read_to(aTHX_ a)
 #define lex_read_unichar(a)    Perl_lex_read_unichar(aTHX_ a)
+#define lex_start(a,b,c)       Perl_lex_start(aTHX_ a,b,c)
 #define lex_stuff_pv(a,b)      Perl_lex_stuff_pv(aTHX_ a,b)
 #define lex_stuff_pvn(a,b,c)   Perl_lex_stuff_pvn(aTHX_ a,b,c)
 #define lex_stuff_sv(a,b)      Perl_lex_stuff_sv(aTHX_ a,b)
 #define is_gv_magical_sv(a,b)  Perl_is_gv_magical_sv(aTHX_ a,b)
 #define jmaybe(a)              Perl_jmaybe(aTHX_ a)
 #define keyword(a,b,c)         Perl_keyword(aTHX_ a,b,c)
-#define lex_start(a,b)         Perl_lex_start(aTHX_ a,b)
 #define list(a)                        Perl_list(aTHX_ a)
 #define localize(a,b)          Perl_localize(aTHX_ a,b)
 #define magic_clear_all_env(a,b)       Perl_magic_clear_all_env(aTHX_ a,b)
index cfa571f..a979dc7 100644 (file)
@@ -290,6 +290,7 @@ Perl_lex_peek_unichar
 Perl_lex_read_space
 Perl_lex_read_to
 Perl_lex_read_unichar
+Perl_lex_start
 Perl_lex_stuff_pv
 Perl_lex_stuff_pvn
 Perl_lex_stuff_sv
diff --git a/op.c b/op.c
index d814044..528ecac 100644 (file)
--- a/op.c
+++ b/op.c
@@ -4364,7 +4364,7 @@ Perl_vload_module(pTHX_ U32 flags, SV *name, SV *ver, va_list *args)
 
     ENTER;
     SAVEVPTR(PL_curcop);
-    lex_start(NULL, NULL);
+    lex_start(NULL, NULL, 0);
     utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0),
            veop, modname, imop);
     LEAVE;
diff --git a/perl.c b/perl.c
index 962b046..95517bb 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -2152,7 +2152,7 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
     }
 #endif
 
-    lex_start(linestr_sv, rsfp);
+    lex_start(linestr_sv, rsfp, 0);
     PL_subname = newSVpvs("main");
 
     if (add_read_e_script)
index f4773f2..dfbd3ad 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -2992,7 +2992,7 @@ Perl_sv_compile_2op(pTHX_ SV *sv, OP** startop, const char *code, PAD** padp)
     PERL_ARGS_ASSERT_SV_COMPILE_2OP;
 
     ENTER_with_name("eval");
-    lex_start(sv, NULL);
+    lex_start(sv, NULL, 0);
     SAVETMPS;
     /* switch to eval mode */
 
@@ -3764,7 +3764,7 @@ PP(pp_require)
 
     ENTER_with_name("eval");
     SAVETMPS;
-    lex_start(NULL, tryrsfp);
+    lex_start(NULL, tryrsfp, 0);
 
     SAVEHINTS();
     PL_hints = 0;
@@ -3859,7 +3859,7 @@ PP(pp_entereval)
     TAINT_PROPER("eval");
 
     ENTER_with_name("eval");
-    lex_start(sv, NULL);
+    lex_start(sv, NULL, 0);
     SAVETMPS;
 
     /* switch to eval mode */
diff --git a/proto.h b/proto.h
index 51107b5..3b962a7 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -1794,7 +1794,7 @@ PERL_CALLCONV void        Perl_lex_read_to(pTHX_ char* ptr)
        assert(ptr)
 
 PERL_CALLCONV I32      Perl_lex_read_unichar(pTHX_ U32 flags);
-PERL_CALLCONV void     Perl_lex_start(pTHX_ SV* line, PerlIO *rsfp);
+PERL_CALLCONV void     Perl_lex_start(pTHX_ SV* line, PerlIO *rsfp, U32 flags);
 PERL_CALLCONV void     Perl_lex_stuff_pv(pTHX_ const char* pv, U32 flags)
                        __attribute__nonnull__(pTHX_1);
 #define PERL_ARGS_ASSERT_LEX_STUFF_PV  \
diff --git a/toke.c b/toke.c
index 99aae57..878547e 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -643,26 +643,39 @@ S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen)
 }
 #endif
 
+/*
+=for apidoc Amx|void|lex_start|SV *line|PerlIO *rsfp|U32 flags
+
+Creates and initialises a new lexer/parser state object, supplying
+a context in which to lex and parse from a new source of Perl code.
+A pointer to the new state object is placed in L</PL_parser>.  An entry
+is made on the save stack so that upon unwinding the new state object
+will be destroyed and the former value of L</PL_parser> will be restored.
+Nothing else need be done to clean up the parsing context.
+
+The code to be parsed comes from I<line> and I<rsfp>.  I<line>, if
+non-null, provides a string (in SV form) containing code to be parsed.
+A copy of the string is made, so subsequent modification of I<line>
+does not affect parsing.  I<rsfp>, if non-null, provides an input stream
+from which code will be read to be parsed.  If both are non-null, the
+code in I<line> comes first and must consist of complete lines of input,
+and I<rsfp> supplies the remainder of the source.
 
+The I<flags> parameter is reserved for future use, and must always
+be zero.
 
-/*
- * Perl_lex_start
- *
- * Create a parser object and initialise its parser and lexer fields
- *
- * rsfp       is the opened file handle to read from (if any),
- *
- * line       holds any initial content already read from the file (or in
- *            the case of no file, such as an eval, the whole contents);
- */
+=cut
+*/
 
 void
-Perl_lex_start(pTHX_ SV *line, PerlIO *rsfp)
+Perl_lex_start(pTHX_ SV *line, PerlIO *rsfp, U32 flags)
 {
     dVAR;
     const char *s = NULL;
     STRLEN len;
     yy_parser *parser, *oparser;
+    if (flags)
+       Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_start");
 
     /* create and initialise a parser */