From c0a998d027eac8e9dc6d85b4b56c5e5bc87024a0 Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 24 Sep 2004 05:53:43 +0000 Subject: * parse.y (rb_parser_append_print): should handle prelude. [llama@u01.gate0] * parse.y (rb_parser_while_loop): ditto. * array.c (rb_ary_subseq): original object might be modified after sharing data creation. [ruby-dev:24327] * array.c (rb_ary_replace): ditto. * array.c (ary_make_shared): freeze shared array. [ruby-dev:24325] * struct.c (struct_members): always check struct size and size of members list in the class. [ruby-dev:24320] * string.c (rb_str_sub_bang): check if string is not modified during iteration. [ruby-dev:24315] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6957 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- re.c | 53 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 20 deletions(-) (limited to 're.c') diff --git a/re.c b/re.c index 2cc90ae312..8fbd3b568a 100644 --- a/re.c +++ b/re.c @@ -266,8 +266,6 @@ rb_reg_check(re) } } -extern int ruby_in_compile; - static void rb_reg_expr_str(str, s, len) VALUE str; @@ -520,15 +518,16 @@ rb_reg_to_s(re) } static void -rb_reg_raise(s, len, err, re) +rb_reg_raise(s, len, err, re, ce) const char *s; long len; const char *err; VALUE re; + int ce; { VALUE desc = rb_reg_desc(s, len, re); - if (ruby_in_compile) + if (ce) rb_compile_error("%s: %s", err, RSTRING(desc)->ptr); else rb_raise(rb_eRegexpError, "%s: %s", err, RSTRING(desc)->ptr); @@ -617,10 +616,11 @@ rb_reg_kcode_m(re) } static Regexp* -make_regexp(s, len, flags) +make_regexp(s, len, flags, ce) const char *s; long len; int flags; + int ce; { Regexp *rp; char err[ONIG_MAX_ERROR_MESSAGE_LEN]; @@ -636,7 +636,7 @@ make_regexp(s, len, flags) r = re_alloc_pattern(&rp); if (r) { re_error_code_to_str((UChar* )err, r); - rb_reg_raise(s, len, err, 0); + rb_reg_raise(s, len, err, 0, ce); } if (flags) { @@ -645,7 +645,7 @@ make_regexp(s, len, flags) r = re_compile_pattern(s, len, rp, err); if (r != 0) { - rb_reg_raise(s, len, err, 0); + rb_reg_raise(s, len, err, 0, ce); } return rp; } @@ -854,7 +854,7 @@ rb_reg_prepare_re(re) rb_reg_check(re); r = re_recompile_pattern(RREGEXP(re)->str, RREGEXP(re)->len, RREGEXP(re)->ptr, err); if (r != 0) { - rb_reg_raise(RREGEXP(re)->str, RREGEXP(re)->len, err, re); + rb_reg_raise(RREGEXP(re)->str, RREGEXP(re)->len, err, re, Qfalse); } } } @@ -921,15 +921,15 @@ rb_reg_search(re, str, pos, reverse) kcode_reset_option(); if (result < 0) { - if (result == ONIG_MISMATCH) { - rb_backref_set(Qnil); - return result; - } - else { - char err[ONIG_MAX_ERROR_MESSAGE_LEN]; - re_error_code_to_str((UChar* )err, result); - rb_reg_raise(RREGEXP(re)->str, RREGEXP(re)->len, err, 0); - } + if (result == ONIG_MISMATCH) { + rb_backref_set(Qnil); + return result; + } + else { + char err[ONIG_MAX_ERROR_MESSAGE_LEN]; + re_error_code_to_str((UChar* )err, result); + rb_reg_raise(RREGEXP(re)->str, RREGEXP(re)->len, err, 0, Qfalse); + } } match = rb_backref_get(); @@ -1322,7 +1322,7 @@ match_string(match) VALUE rb_cRegexp; static void -rb_reg_initialize(obj, s, len, options) +rb_reg_initialize(obj, s, len, options, ce) VALUE obj; const char *s; long len; @@ -1333,6 +1333,7 @@ rb_reg_initialize(obj, s, len, options) /* CODE_EUC = 32 */ /* CODE_SJIS = 48 */ /* CODE_UTF8 = 64 */ + int ce; /* call rb_compile_error() */ { struct RRegexp *re = RREGEXP(obj); @@ -1367,7 +1368,7 @@ rb_reg_initialize(obj, s, len, options) options |= RE_OPTION_IGNORECASE; FL_SET(re, REG_CASESTATE); } - re->ptr = make_regexp(s, len, options & 0xf); + re->ptr = make_regexp(s, len, options & 0xf, ce); re->str = ALLOC_N(char, len+1); memcpy(re->str, s, len); re->str[len] = '\0'; @@ -1400,7 +1401,19 @@ rb_reg_new(s, len, options) { VALUE re = rb_reg_s_alloc(rb_cRegexp); - rb_reg_initialize(re, s, len, options); + rb_reg_initialize(re, s, len, options, Qfalse); + return (VALUE)re; +} + +VALUE +rb_reg_compile(s, len, options) + const char *s; + long len; + int options; +{ + VALUE re = rb_reg_s_alloc(rb_cRegexp); + + rb_reg_initialize(re, s, len, options, Qtrue); return (VALUE)re; } -- cgit v1.2.3