diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | include/ruby/intern.h | 1 | ||||
-rw-r--r-- | parse.y | 25 | ||||
-rw-r--r-- | re.c | 6 |
4 files changed, 31 insertions, 10 deletions
@@ -1,3 +1,12 @@ +Thu Aug 2 23:36:23 2007 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * parse.y (reg_compile_gen): set error if failed to compile regexp + literal. [ruby-dev:31336] + + * re.c (rb_reg_compile): should not use regexp which could not get + initialized. [ruby-dev:31333] + return error message to let the parser know it. + Thu Aug 2 13:46:39 2007 Nobuyoshi Nakada <nobu@ruby-lang.org> * sprintf.c (rb_f_sprintf): should not check positional number as diff --git a/include/ruby/intern.h b/include/ruby/intern.h index 301337094a..7d5970762e 100644 --- a/include/ruby/intern.h +++ b/include/ruby/intern.h @@ -440,7 +440,6 @@ VALUE rb_reg_match_pre(VALUE); VALUE rb_reg_match_post(VALUE); VALUE rb_reg_match_last(VALUE); VALUE rb_reg_new(const char*, long, int); -VALUE rb_reg_compile(const char*, long, int, const char*, int); VALUE rb_reg_match(VALUE, VALUE); VALUE rb_reg_match2(VALUE); int rb_reg_options(VALUE); @@ -419,6 +419,8 @@ extern int rb_dvar_defined(ID); extern int rb_local_defined(ID); extern int rb_parse_in_eval(void); +static VALUE reg_compile_gen(struct parser_params*, const char *, long, int); +#define reg_compile(ptr,len,options) reg_compile_gen(parser, ptr, len, options) #else #define remove_begin(node) (node) #endif /* !RIPPER */ @@ -3611,18 +3613,16 @@ regexp : tREGEXP_BEG xstring_contents tREGEXP_END int options = $3; NODE *node = $2; if (!node) { - node = NEW_LIT(rb_reg_compile("", 0, options & ~RE_OPTION_ONCE, - ruby_sourcefile, ruby_sourceline)); + node = NEW_LIT(reg_compile("", 0, options)); } else switch (nd_type(node)) { case NODE_STR: { VALUE src = node->nd_lit; nd_set_type(node, NODE_LIT); - node->nd_lit = rb_reg_compile(RSTRING_PTR(src), - RSTRING_LEN(src), - options & ~RE_OPTION_ONCE, - ruby_sourcefile, ruby_sourceline); + node->nd_lit = reg_compile(RSTRING_PTR(src), + RSTRING_LEN(src), + options); } break; default: @@ -8101,6 +8101,19 @@ dvar_curr_gen(struct parser_params *parser, ID id) vtable_included(lvtbl->vars, id)); } +static VALUE +reg_compile_gen(struct parser_params* parser, const char *ptr, long len, int options) +{ + VALUE rb_reg_compile(const char *, long, int); + VALUE re = rb_reg_compile(ptr, len, (options) & ~RE_OPTION_ONCE); + + if (TYPE(re) == T_STRING) { + compile_error(PARSER_ARG "%s", RSTRING_PTR(re)); + return Qnil; + } + return re; +} + void rb_gc_mark_parser(void) { @@ -1521,14 +1521,14 @@ rb_reg_new(const char *s, long len, int options) } VALUE -rb_reg_compile(const char *s, long len, int options, const char *file, int line) +rb_reg_compile(const char *s, long len, int options) { VALUE re = rb_reg_s_alloc(rb_cRegexp); char err[ONIG_MAX_ERROR_MESSAGE_LEN]; if (rb_reg_initialize(re, s, len, options, err) != 0) { - VALUE desc = rb_reg_desc(s, len, re); - rb_compile_error(file, line, "%s: %s", err, RSTRING_PTR(desc)); + VALUE desc = rb_reg_desc(s, len, 0); + return rb_sprintf("%s: %s", err, RSTRING_PTR(desc)); } FL_SET(re, REG_LITERAL); return re; |