summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/codegen.c8
-rw-r--r--src/parse.y8
-rw-r--r--src/re.h1
-rw-r--r--test/t/string.rb11
4 files changed, 16 insertions, 12 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 86cb5eb87..8cb571a28 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -1918,12 +1918,12 @@ codegen(codegen_scope *s, node *tree, int val)
int ai = mrb_gc_arena_save(s->mrb);
struct RClass* c = mrb_class_get(s->mrb, REGEXP_CLASS);
mrb_value args[2];
+ int off;
+
args[0] = mrb_str_new(s->mrb, p1, strlen(p1));
// TODO: Some regexp implementation does not have second argument
- //args[1] = mrb_str_new(s->mrb, p2, strlen(p2));
- int off = new_lit(s,
- mrb_class_new_instance(s->mrb, 1, args, c));
-
+ //args[1] = mrb_str_new(s->mrb, p2, strlen(p2))
+ off = new_lit(s, mrb_class_new_instance(s->mrb, 1, args, c));
mrb_gc_arena_restore(s->mrb, ai);
genop(s, MKOP_ABx(OP_LOADL, cursp(), off));
push();
diff --git a/src/parse.y b/src/parse.y
index afcc5aabc..365bc5f18 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -3447,8 +3447,9 @@ parse_string(parser_state *p, int term)
if (p->regexp) {
int f = 0;
int c;
- char* s;
- s = strndup(tok(p), toklen(p));
+ char *s = strndup(tok(p), toklen(p));
+ char flag[4] = { '\0' };
+
newtok(p);
while (c = nextc(p), ISALPHA(c)) {
switch (c) {
@@ -3466,7 +3467,6 @@ parse_string(parser_state *p, int term)
toklen(p) > 1 ? "s" : "", tok(p));
yyerror(p, msg);
}
- char flag[4] = {0};
if (f & 1) strcat(flag, "i");
if (f & 2) strcat(flag, "x");
if (f & 4) strcat(flag, "m");
@@ -5499,7 +5499,7 @@ parser_dump(mrb_state *mrb, node *tree, int offset)
break;
case NODE_REGX:
- printf("NODE_REGX /%s/\n", (char*)tree->car->cdr->car);
+ printf("NODE_REGX /%s/%s\n", (char*)tree->car, (char*)tree->cdr);
break;
case NODE_SYM:
diff --git a/src/re.h b/src/re.h
index 64dbd60dc..5632bc399 100644
--- a/src/re.h
+++ b/src/re.h
@@ -7,7 +7,6 @@
#ifndef RE_H
#define RE_H
-//#define REGEXP_CLASS "HsRegexp"
#define REGEXP_CLASS "Regexp"
#endif
diff --git a/test/t/string.rb b/test/t/string.rb
index b2a70266b..ef6b6fae0 100644
--- a/test/t/string.rb
+++ b/test/t/string.rb
@@ -193,9 +193,14 @@ assert('String#eql?', '15.2.10.5.17') do
end
assert('String#gsub', '15.2.10.5.18') do
- 'abcabc'.gsub('b', 'B') == 'aBcaBc' and
- 'abcabc'.gsub('b') { |w| w.capitalize } == 'aBcaBc' and
- '#a#a#'.gsub('#', '$') == '$a$a$'
+ assert_equal('aBcaBc', 'abcabc'.gsub('b', 'B'), 'gsub without block')
+ assert_equal('aBcaBc', 'abcabc'.gsub('b'){|w| w.capitalize }, 'gsub with block')
+ assert_equal('$a$a$', '#a#a#'.gsub('#', '$'), 'mruby/mruby#847')
+ assert_equal('$a$a$', '#a#a#'.gsub('#'){|w| '$' }, 'mruby/mruby#847 with block')
+ assert_equal('$$a$$', '##a##'.gsub('##', '$$'), 'mruby/mruby#847 another case')
+ assert_equal('$$a$$', '##a##'.gsub('##'){|w| '$$' }, 'mruby/mruby#847 another case with block')
+ assert_equal('A', 'a'.gsub('a', 'A'))
+ assert_equal('A', 'a'.gsub('a'){|w| w.capitalize })
end
assert('String#gsub!', '15.2.10.5.19') do