summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-04-18 14:27:22 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-04-18 14:27:22 +0000
commit5b54488e780490ae367f58286401e6a717c1e4d5 (patch)
treec78692608235dd627ce3eab435b94ec9aeccc1e0 /parse.y
parent609a6ebac54746adc36422dce417cdb02d126886 (diff)
parse.y: shared substring of source
* parse.y (lex_get_str): return shared sub-string of entire source string instead of a partial copy. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45629 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y22
1 files changed, 11 insertions, 11 deletions
diff --git a/parse.y b/parse.y
index 680242daa0..5b90bd2909 100644
--- a/parse.y
+++ b/parse.y
@@ -5416,21 +5416,21 @@ must_be_ascii_compatible(VALUE s)
static VALUE
lex_get_str(struct parser_params *parser, VALUE s)
{
- char *beg, *end, *pend;
- rb_encoding *enc = must_be_ascii_compatible(s);
+ char *beg, *end, *start;
+ long len;
beg = RSTRING_PTR(s);
+ len = RSTRING_LEN(s);
+ start = beg;
if (lex_gets_ptr) {
- if (RSTRING_LEN(s) == lex_gets_ptr) return Qnil;
+ if (len == lex_gets_ptr) return Qnil;
beg += lex_gets_ptr;
+ len -= lex_gets_ptr;
}
- pend = RSTRING_PTR(s) + RSTRING_LEN(s);
- end = beg;
- while (end < pend) {
- if (*end++ == '\n') break;
- }
- lex_gets_ptr = end - RSTRING_PTR(s);
- return rb_enc_str_new(beg, end - beg, enc);
+ end = memchr(beg, '\n', len);
+ if (end) len = ++end - beg;
+ lex_gets_ptr += len;
+ return rb_str_subseq(s, beg - start, len);
}
static VALUE
@@ -5465,7 +5465,7 @@ parser_compile_string(volatile VALUE vparser, VALUE fname, VALUE s, int line)
TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, parser);
lex_gets = lex_get_str;
lex_gets_ptr = 0;
- lex_input = s;
+ lex_input = rb_str_new_frozen(s);
lex_pbeg = lex_p = lex_pend = 0;
compile_for_eval = rb_parse_in_eval();