summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-01-11 02:31:02 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-01-11 02:31:02 +0000
commit9029464175c8c6933acef07bcdb6f49fc13d3803 (patch)
tree19bea7fb141873f9264f9b47ec7bbdacf5283862 /string.c
parenta3aa4da7733f3c9a955f9cfc430624b34f185cf3 (diff)
string.c: replacement and block
* string.c (rb_enc_str_scrub): only one of replacement and block is allowed. [ruby-core:79038] [Bug #13119] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57304 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r--string.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/string.c b/string.c
index 962848e4a7..6eaf218e33 100644
--- a/string.c
+++ b/string.c
@@ -9206,9 +9206,15 @@ rb_enc_str_scrub(rb_encoding *enc, VALUE str, VALUE repl)
int encidx;
VALUE buf = Qnil;
const char *rep;
- long replen;
+ long replen = -1;
int tainted = 0;
+ if (rb_block_given_p()) {
+ if (!NIL_P(repl))
+ rb_raise(rb_eArgError, "both of block and replacement given");
+ replen = 0;
+ }
+
if (ENC_CODERANGE_CLEAN_P(cr))
return Qnil;
@@ -9232,9 +9238,8 @@ rb_enc_str_scrub(rb_encoding *enc, VALUE str, VALUE repl)
const char *e = RSTRING_END(str);
const char *p1 = p;
int rep7bit_p;
- if (rb_block_given_p()) {
+ if (!replen) {
rep = NULL;
- replen = 0;
rep7bit_p = FALSE;
}
else if (!NIL_P(repl)) {
@@ -9345,9 +9350,8 @@ rb_enc_str_scrub(rb_encoding *enc, VALUE str, VALUE repl)
const char *e = RSTRING_END(str);
const char *p1 = p;
long mbminlen = rb_enc_mbminlen(enc);
- if (rb_block_given_p()) {
+ if (!replen) {
rep = NULL;
- replen = 0;
}
else if (!NIL_P(repl)) {
rep = RSTRING_PTR(repl);