mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
parse.y: enable encoding pragma in ripper
* parse.y (magic_comment_encoding): enable in ripper, since the encoding is necessary to parse non-default encoding scripts. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48668 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
689f0dd2af
commit
11dc42c20c
3 changed files with 14 additions and 6 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Tue Dec 2 02:53:00 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* parse.y (magic_comment_encoding): enable in ripper, since the
|
||||||
|
encoding is necessary to parse non-default encoding scripts.
|
||||||
|
|
||||||
Tue Dec 2 02:30:25 2014 NARUSE, Yui <naruse@ruby-lang.org>
|
Tue Dec 2 02:30:25 2014 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
* lib/uri/generic.rb (URI::Generic.build):
|
* lib/uri/generic.rb (URI::Generic.build):
|
||||||
|
|
12
parse.y
12
parse.y
|
@ -6845,7 +6845,6 @@ comment_at_top(struct parser_params *parser)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef RIPPER
|
|
||||||
typedef long (*rb_magic_comment_length_t)(struct parser_params *parser, const char *name, long len);
|
typedef long (*rb_magic_comment_length_t)(struct parser_params *parser, const char *name, long len);
|
||||||
typedef void (*rb_magic_comment_setter_t)(struct parser_params *parser, const char *name, const char *val);
|
typedef void (*rb_magic_comment_setter_t)(struct parser_params *parser, const char *name, const char *val);
|
||||||
|
|
||||||
|
@ -6858,6 +6857,7 @@ magic_comment_encoding(struct parser_params *parser, const char *name, const cha
|
||||||
parser_set_encode(parser, val);
|
parser_set_encode(parser, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef RIPPER
|
||||||
static int
|
static int
|
||||||
parser_get_bool(struct parser_params *parser, const char *name, const char *val)
|
parser_get_bool(struct parser_params *parser, const char *name, const char *val)
|
||||||
{
|
{
|
||||||
|
@ -6883,6 +6883,7 @@ parser_set_token_info(struct parser_params *parser, const char *name, const char
|
||||||
int b = parser_get_bool(parser, name, val);
|
int b = parser_get_bool(parser, name, val);
|
||||||
if (b >= 0) parser->parser_token_info_enabled = b;
|
if (b >= 0) parser->parser_token_info_enabled = b;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
struct magic_comment {
|
struct magic_comment {
|
||||||
const char *name;
|
const char *name;
|
||||||
|
@ -6893,9 +6894,10 @@ struct magic_comment {
|
||||||
static const struct magic_comment magic_comments[] = {
|
static const struct magic_comment magic_comments[] = {
|
||||||
{"coding", magic_comment_encoding, parser_encode_length},
|
{"coding", magic_comment_encoding, parser_encode_length},
|
||||||
{"encoding", magic_comment_encoding, parser_encode_length},
|
{"encoding", magic_comment_encoding, parser_encode_length},
|
||||||
|
#ifndef RIPPER
|
||||||
{"warn_indent", parser_set_token_info},
|
{"warn_indent", parser_set_token_info},
|
||||||
};
|
|
||||||
#endif
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
magic_comment_marker(const char *str, long len)
|
magic_comment_marker(const char *str, long len)
|
||||||
|
@ -6948,9 +6950,7 @@ parser_magic_comment(struct parser_params *parser, const char *str, long len)
|
||||||
|
|
||||||
/* %r"([^\\s\'\":;]+)\\s*:\\s*(\"(?:\\\\.|[^\"])*\"|[^\"\\s;]+)[\\s;]*" */
|
/* %r"([^\\s\'\":;]+)\\s*:\\s*(\"(?:\\\\.|[^\"])*\"|[^\"\\s;]+)[\\s;]*" */
|
||||||
while (len > 0) {
|
while (len > 0) {
|
||||||
#ifndef RIPPER
|
|
||||||
const struct magic_comment *p = magic_comments;
|
const struct magic_comment *p = magic_comments;
|
||||||
#endif
|
|
||||||
char *s;
|
char *s;
|
||||||
int i;
|
int i;
|
||||||
long n = 0;
|
long n = 0;
|
||||||
|
@ -7003,19 +7003,19 @@ parser_magic_comment(struct parser_params *parser, const char *str, long len)
|
||||||
for (i = 0; i < n; ++i) {
|
for (i = 0; i < n; ++i) {
|
||||||
if (s[i] == '-') s[i] = '_';
|
if (s[i] == '-') s[i] = '_';
|
||||||
}
|
}
|
||||||
#ifndef RIPPER
|
|
||||||
do {
|
do {
|
||||||
if (STRNCASECMP(p->name, s, n) == 0) {
|
if (STRNCASECMP(p->name, s, n) == 0) {
|
||||||
n = vend - vbeg;
|
n = vend - vbeg;
|
||||||
if (p->length) {
|
if (p->length) {
|
||||||
n = (*p->length)(parser, vbeg, n);
|
n = (*p->length)(parser, vbeg, n);
|
||||||
}
|
}
|
||||||
|
if (p->func != magic_comment_encoding) break;
|
||||||
str_copy(val, vbeg, n);
|
str_copy(val, vbeg, n);
|
||||||
(*p->func)(parser, s, RSTRING_PTR(val));
|
(*p->func)(parser, s, RSTRING_PTR(val));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} while (++p < magic_comments + numberof(magic_comments));
|
} while (++p < magic_comments + numberof(magic_comments));
|
||||||
#else
|
#ifdef RIPPER
|
||||||
str_copy(val, vbeg, vend - vbeg);
|
str_copy(val, vbeg, vend - vbeg);
|
||||||
dispatch2(magic_comment, name, val);
|
dispatch2(magic_comment, name, val);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -21,6 +21,9 @@ class TestRipper::Ripper < Test::Unit::TestCase
|
||||||
ripper = Ripper.new('# coding: iso-8859-15')
|
ripper = Ripper.new('# coding: iso-8859-15')
|
||||||
ripper.parse
|
ripper.parse
|
||||||
assert_equal Encoding::ISO_8859_15, ripper.encoding
|
assert_equal Encoding::ISO_8859_15, ripper.encoding
|
||||||
|
ripper = Ripper.new('# -*- coding: iso-8859-15 -*-')
|
||||||
|
ripper.parse
|
||||||
|
assert_equal Encoding::ISO_8859_15, ripper.encoding
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_end_seen_eh
|
def test_end_seen_eh
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue