mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* parse.y (lex_get_str, lex_io_gets, rb_parser_compile_string):
must be ascii compatible. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@24569 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
9d7ff244c3
commit
b5e6b46e90
3 changed files with 48 additions and 15 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Mon Aug 17 14:35:03 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* parse.y (lex_get_str, lex_io_gets, rb_parser_compile_string):
|
||||||
|
must be ascii compatible.
|
||||||
|
|
||||||
Mon Aug 17 10:37:41 2009 NARUSE, Yui <naruse@ruby-lang.org>
|
Mon Aug 17 10:37:41 2009 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
* regparse.c (add_code_range_to_buf0): added with checkdup argument.
|
* regparse.c (add_code_range_to_buf0): added with checkdup argument.
|
||||||
|
|
51
parse.y
51
parse.y
|
@ -5031,10 +5031,21 @@ yycompile(struct parser_params *parser, const char *f, int line)
|
||||||
}
|
}
|
||||||
#endif /* !RIPPER */
|
#endif /* !RIPPER */
|
||||||
|
|
||||||
|
static rb_encoding *
|
||||||
|
must_be_ascii_compatible(VALUE s)
|
||||||
|
{
|
||||||
|
rb_encoding *enc = rb_enc_get(s);
|
||||||
|
if (!rb_enc_asciicompat(enc)) {
|
||||||
|
rb_raise(rb_eArgError, "invalid source encoding");
|
||||||
|
}
|
||||||
|
return enc;
|
||||||
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
lex_get_str(struct parser_params *parser, VALUE s)
|
lex_get_str(struct parser_params *parser, VALUE s)
|
||||||
{
|
{
|
||||||
char *beg, *end, *pend;
|
char *beg, *end, *pend;
|
||||||
|
rb_encoding *enc = must_be_ascii_compatible(s);
|
||||||
|
|
||||||
beg = RSTRING_PTR(s);
|
beg = RSTRING_PTR(s);
|
||||||
if (lex_gets_ptr) {
|
if (lex_gets_ptr) {
|
||||||
|
@ -5047,18 +5058,20 @@ lex_get_str(struct parser_params *parser, VALUE s)
|
||||||
if (*end++ == '\n') break;
|
if (*end++ == '\n') break;
|
||||||
}
|
}
|
||||||
lex_gets_ptr = end - RSTRING_PTR(s);
|
lex_gets_ptr = end - RSTRING_PTR(s);
|
||||||
return rb_enc_str_new(beg, end - beg, rb_enc_get(s));
|
return rb_enc_str_new(beg, end - beg, enc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
lex_getline(struct parser_params *parser)
|
lex_getline(struct parser_params *parser)
|
||||||
{
|
{
|
||||||
VALUE line = (*parser->parser_lex_gets)(parser, parser->parser_lex_input);
|
VALUE line = (*parser->parser_lex_gets)(parser, parser->parser_lex_input);
|
||||||
|
if (NIL_P(line)) return line;
|
||||||
|
must_be_ascii_compatible(line);
|
||||||
#ifndef RIPPER
|
#ifndef RIPPER
|
||||||
if (ruby_debug_lines && !NIL_P(line)) {
|
if (ruby_debug_lines) {
|
||||||
rb_ary_push(ruby_debug_lines, line);
|
rb_ary_push(ruby_debug_lines, line);
|
||||||
}
|
}
|
||||||
if (ruby_coverage && !NIL_P(line)) {
|
if (ruby_coverage) {
|
||||||
rb_ary_push(ruby_coverage, Qnil);
|
rb_ary_push(ruby_coverage, Qnil);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -5068,16 +5081,8 @@ lex_getline(struct parser_params *parser)
|
||||||
static const rb_data_type_t parser_data_type;
|
static const rb_data_type_t parser_data_type;
|
||||||
|
|
||||||
#ifndef RIPPER
|
#ifndef RIPPER
|
||||||
NODE*
|
static NODE*
|
||||||
rb_compile_string(const char *f, VALUE s, int line)
|
parser_compile_string(volatile VALUE vparser, const char *f, VALUE s, int line)
|
||||||
{
|
|
||||||
VALUE volatile vparser = rb_parser_new();
|
|
||||||
|
|
||||||
return rb_parser_compile_string(vparser, f, s, line);
|
|
||||||
}
|
|
||||||
|
|
||||||
NODE*
|
|
||||||
rb_parser_compile_string(volatile VALUE vparser, const char *f, VALUE s, int line)
|
|
||||||
{
|
{
|
||||||
struct parser_params *parser;
|
struct parser_params *parser;
|
||||||
NODE *node;
|
NODE *node;
|
||||||
|
@ -5096,16 +5101,32 @@ rb_parser_compile_string(volatile VALUE vparser, const char *f, VALUE s, int lin
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NODE*
|
||||||
|
rb_compile_string(const char *f, VALUE s, int line)
|
||||||
|
{
|
||||||
|
must_be_ascii_compatible(s);
|
||||||
|
return parser_compile_string(rb_parser_new(), f, s, line);
|
||||||
|
}
|
||||||
|
|
||||||
|
NODE*
|
||||||
|
rb_parser_compile_string(volatile VALUE vparser, const char *f, VALUE s, int line)
|
||||||
|
{
|
||||||
|
must_be_ascii_compatible(s);
|
||||||
|
return parser_compile_string(vparser, f, s, line);
|
||||||
|
}
|
||||||
|
|
||||||
NODE*
|
NODE*
|
||||||
rb_compile_cstr(const char *f, const char *s, int len, int line)
|
rb_compile_cstr(const char *f, const char *s, int len, int line)
|
||||||
{
|
{
|
||||||
return rb_compile_string(f, rb_str_new(s, len), line);
|
VALUE str = rb_str_new(s, len);
|
||||||
|
return parser_compile_string(rb_parser_new(), f, str, line);
|
||||||
}
|
}
|
||||||
|
|
||||||
NODE*
|
NODE*
|
||||||
rb_parser_compile_cstr(volatile VALUE vparser, const char *f, const char *s, int len, int line)
|
rb_parser_compile_cstr(volatile VALUE vparser, const char *f, const char *s, int len, int line)
|
||||||
{
|
{
|
||||||
return rb_parser_compile_string(vparser, f, rb_str_new(s, len), line);
|
VALUE str = rb_str_new(s, len);
|
||||||
|
return parser_compile_string(vparser, f, str, line);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
|
|
|
@ -408,4 +408,11 @@ class TestEval < Test::Unit::TestCase
|
||||||
assert_equal("0", f.read.chomp)
|
assert_equal("0", f.read.chomp)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_eval_ascii_incompatible
|
||||||
|
assert_raise(ArgumentError) {eval("__ENCODING__".encode("utf-16be"))}
|
||||||
|
assert_raise(ArgumentError) {eval("__ENCODING__".encode("utf-16le"))}
|
||||||
|
assert_raise(ArgumentError) {eval("__ENCODING__".encode("utf-32be"))}
|
||||||
|
assert_raise(ArgumentError) {eval("__ENCODING__".encode("utf-32le"))}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue