From 4ce6b74f45736db3db72bfc0cec506d1fb6770db Mon Sep 17 00:00:00 2001 From: akr Date: Thu, 14 Feb 2008 03:34:12 +0000 Subject: * re.c (rb_reg_preprocess_dregexp): use non-preprocessed regexp source for result. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@15465 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- re.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) (limited to 're.c') diff --git a/re.c b/re.c index 61e3a57df..cd9302430 100644 --- a/re.c +++ b/re.c @@ -1953,6 +1953,7 @@ static VALUE rb_reg_preprocess_dregexp(VALUE ary) { rb_encoding *fixed_enc = 0; + rb_encoding *regexp_enc = 0; onig_errmsg_buffer err = ""; int i; VALUE result = 0; @@ -1967,31 +1968,33 @@ rb_reg_preprocess_dregexp(VALUE ary) VALUE str = argv[i]; VALUE buf; char *p, *end; - rb_encoding *enc; + rb_encoding *src_enc; StringValue(str); p = RSTRING_PTR(str); end = p + RSTRING_LEN(str); - enc = rb_enc_get(str); + src_enc = rb_enc_get(str); - buf = rb_reg_preprocess(p, end, enc, &fixed_enc, err); - RB_GC_GUARD(str); + buf = rb_reg_preprocess(p, end, src_enc, &fixed_enc, err); if (buf == Qnil) rb_raise(rb_eArgError, "%s", err); - if (i == 0) { - /* The encoding of the first fragment is the encoding - * given by the regexp option or script encoding. */ - if (fixed_enc == 0) { - rb_enc_copy(buf, str); + if (fixed_enc != 0) { + if (regexp_enc != 0 && regexp_enc != fixed_enc) { + rb_raise(rb_eArgError, "encoding mismatch in dynamic regexp : %s and %s", + rb_enc_name(regexp_enc), rb_enc_name(fixed_enc)); } + regexp_enc = fixed_enc; } if (!result) - result = buf; + result = rb_str_new3(str); else - rb_str_buf_append(result, buf); + rb_str_buf_append(result, str); + } + if (regexp_enc) { + rb_enc_associate(result, regexp_enc); } return result; -- cgit