diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-11-10 11:40:33 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-11-10 11:40:33 +0000 |
commit | 6e610f5ea717c824b232fc5f3052dd9d5c1a25e3 (patch) | |
tree | 4cb0cbda17385e07d2fb4745af9f0fafa2e5aedd /parse.y | |
parent | 907ae13cf6c8b65039e19a86d3c8fd51a3cd868f (diff) |
Parse the source in SCRIPT_LINES__ as array
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65653 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 38 |
1 files changed, 31 insertions, 7 deletions
@@ -201,7 +201,10 @@ struct parser_params { const char *pcur; const char *pend; const char *ptok; - long gets_ptr; + union { + long ptr; + VALUE (*call)(VALUE, int); + } gets_; enum lex_state_e state; /* track the nest level of any parens "()[]{}" */ int paren_nest; @@ -4971,14 +4974,14 @@ lex_get_str(struct parser_params *p, VALUE s) beg = RSTRING_PTR(s); len = RSTRING_LEN(s); start = beg; - if (p->lex.gets_ptr) { - if (len == p->lex.gets_ptr) return Qnil; - beg += p->lex.gets_ptr; - len -= p->lex.gets_ptr; + if (p->lex.gets_.ptr) { + if (len == p->lex.gets_.ptr) return Qnil; + beg += p->lex.gets_.ptr; + len -= p->lex.gets_.ptr; } end = memchr(beg, '\n', len); if (end) len = ++end - beg; - p->lex.gets_ptr += len; + p->lex.gets_.ptr += len; return rb_str_subseq(s, beg - start, len); } @@ -5009,7 +5012,7 @@ parser_compile_string(VALUE vparser, VALUE fname, VALUE s, int line) TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, p); p->lex.gets = lex_get_str; - p->lex.gets_ptr = 0; + p->lex.gets_.ptr = 0; p->lex.input = rb_str_new_frozen(s); p->lex.pbeg = p->lex.pcur = p->lex.pend = 0; @@ -5085,6 +5088,27 @@ rb_parser_compile_file_path(VALUE vparser, VALUE fname, VALUE file, int start) return yycompile(vparser, p, fname, start); } + +static VALUE +lex_generic_gets(struct parser_params *p, VALUE input) +{ + return (*p->lex.gets_.call)(input, p->line_count); +} + +rb_ast_t* +rb_parser_compile_generic(VALUE vparser, VALUE (*lex_gets)(VALUE, int), VALUE fname, VALUE input, int start) +{ + struct parser_params *p; + + TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, p); + + p->lex.gets = lex_generic_gets; + p->lex.gets_.call = lex_gets; + p->lex.input = input; + p->lex.pbeg = p->lex.pcur = p->lex.pend = 0; + + return yycompile(vparser, p, fname, start); +} #endif /* !RIPPER */ #define STR_FUNC_ESCAPE 0x01 |