summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-03-11 10:22:17 +0900
committerGitHub <[email protected]>2017-03-11 10:22:17 +0900
commit7590482d4873474f7a435f2533831358bca80a97 (patch)
tree53e250597a3adcce9a38edb49e6e15d5c4652020
parent4b3e6cf1691da5a9c87ef4d55004f7ea8b3e383d (diff)
parent431f474ba34a485281692ab08df16d4f7daa8750 (diff)
downloadmruby-7590482d4873474f7a435f2533831358bca80a97.tar.gz
mruby-7590482d4873474f7a435f2533831358bca80a97.zip
Merge branch 'master' into string-gsub
-rw-r--r--mrblib/string.rb2
-rw-r--r--src/class.c10
-rw-r--r--src/vm.c3
-rw-r--r--test/t/string.rb1
4 files changed, 13 insertions, 3 deletions
diff --git a/mrblib/string.rb b/mrblib/string.rb
index 0f65c9c97..7add360a8 100644
--- a/mrblib/string.rb
+++ b/mrblib/string.rb
@@ -34,6 +34,8 @@ class String
m
when "'"
post
+ when "1", "2", "3", "4", "5", "6", "7", "8", "9"
+ ""
else
self[j, 2]
end
diff --git a/src/class.c b/src/class.c
index 0922b3cff..fdb10d271 100644
--- a/src/class.c
+++ b/src/class.c
@@ -330,8 +330,14 @@ mrb_class_get(mrb_state *mrb, const char *name)
MRB_API struct RClass *
mrb_exc_get(mrb_state *mrb, const char *name)
{
- struct RClass *exc = mrb_class_get_under(mrb, mrb->object_class, name);
- struct RClass *e = exc;
+ struct RClass *exc, *e;
+ mrb_value c = mrb_const_get(mrb, mrb_obj_value(mrb->object_class),
+ mrb_intern_cstr(mrb, name));
+
+ if (mrb_type(c) != MRB_TT_CLASS) {
+ mrb_raise(mrb, mrb->eException_class, "exception corrupted");
+ }
+ exc = e = mrb_class_ptr(c);
while (e) {
if (e == mrb->eException_class)
diff --git a/src/vm.c b/src/vm.c
index e9c8b81bc..37f62584b 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -569,6 +569,7 @@ eval_under(mrb_state *mrb, mrb_value self, mrb_value blk, struct RClass *c)
p = mrb_proc_ptr(blk);
ci->proc = p;
ci->argc = 1;
+ ci->mid = ci[-1].mid;
if (MRB_PROC_CFUNC_P(p)) {
stack_extend(mrb, 3, 0);
mrb->c->stack[0] = self;
@@ -1345,7 +1346,7 @@ RETRY_TRY_BLOCK:
int a = GETARG_A(i);
int n = GETARG_C(i);
- if (mid == 0 || !mrb->c->ci->target_class) {
+ if (mid == 0 || !ci->target_class) {
mrb_value exc;
exc = mrb_exc_new_str_lit(mrb, E_NOMETHOD_ERROR, "super called outside of method");
diff --git a/test/t/string.rb b/test/t/string.rb
index e39eefb60..25c599ad4 100644
--- a/test/t/string.rb
+++ b/test/t/string.rb
@@ -365,6 +365,7 @@ assert('String#gsub', '15.2.10.5.18') do
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 })
+ assert_equal("<a><><>", 'a'.gsub('a', '<\0><\1><\2>'))
assert_equal(".h.e.l.l.o.", "hello".gsub("", "."))
end