Skip to content

Commit 5852873

Browse files
committed
merge revision(s) r49685,r49687: [Backport ruby#10885]
* vm_insnhelper.c (rb_vm_rewrite_cref_stack): copy nd_refinements of orignal crefs. It fixes segmentation fault when calling refined method in duplicate module. [ruby-dev:48878] [Bug ruby#10885] * vm_core.h, class.c: change accordingly. * test/ruby/test_refinement.rb: add a test for above. of original crefs. It fixes segmentation fault when calling git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@49995 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent 838f246 commit 5852873

6 files changed

Lines changed: 63 additions & 21 deletions

File tree

ChangeLog

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
Wed Mar 18 02:03:02 2015 Kazuki Tsujimoto <kazuki@callcc.net>
2+
3+
* vm_insnhelper.c (rb_vm_rewrite_cref_stack): copy nd_refinements
4+
of original crefs. It fixes segmentation fault when calling
5+
refined method in duplicate module. [ruby-dev:48878] [Bug #10885]
6+
7+
* vm_core.h, class.c: change accordingly.
8+
9+
* test/ruby/test_refinement.rb: add a test for above.
10+
111
Wed Mar 18 01:58:18 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
212

313
* ext/sdbm/_sdbm.c: include ruby/ruby.h for PRIdPTRDIFF when a

class.c

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -232,25 +232,6 @@ rb_class_new(VALUE super)
232232
return rb_class_boot(super);
233233
}
234234

235-
static void
236-
rewrite_cref_stack(NODE *node, VALUE old_klass, VALUE new_klass, NODE **new_cref_ptr)
237-
{
238-
NODE *new_node;
239-
while (node) {
240-
if (node->nd_clss == old_klass) {
241-
new_node = NEW_CREF(new_klass);
242-
RB_OBJ_WRITE(new_node, &new_node->nd_next, node->nd_next);
243-
*new_cref_ptr = new_node;
244-
return;
245-
}
246-
new_node = NEW_CREF(node->nd_clss);
247-
node = node->nd_next;
248-
*new_cref_ptr = new_node;
249-
new_cref_ptr = &new_node->nd_next;
250-
}
251-
*new_cref_ptr = NULL;
252-
}
253-
254235
static void
255236
clone_method(VALUE klass, ID mid, const rb_method_entry_t *me)
256237
{
@@ -260,7 +241,7 @@ clone_method(VALUE klass, ID mid, const rb_method_entry_t *me)
260241
NODE *new_cref;
261242
newiseqval = rb_iseq_clone(me->def->body.iseq->self, klass);
262243
GetISeqPtr(newiseqval, iseq);
263-
rewrite_cref_stack(me->def->body.iseq->cref_stack, me->klass, klass, &new_cref);
244+
rb_vm_rewrite_cref_stack(me->def->body.iseq->cref_stack, me->klass, klass, &new_cref);
264245
RB_OBJ_WRITE(iseq->self, &iseq->cref_stack, new_cref);
265246
rb_add_method(klass, mid, VM_METHOD_TYPE_ISEQ, iseq, me->flag);
266247
RB_GC_GUARD(newiseqval);

test/ruby/test_refinement.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1358,6 +1358,34 @@ def test_instance_methods_not_include_superclass_method
13581358
:foo, bug10826)
13591359
end
13601360

1361+
def test_call_refined_method_in_duplicate_module
1362+
bug10885 = '[ruby-dev:48878]'
1363+
assert_in_out_err([], <<-INPUT, [], [], bug10885)
1364+
module M
1365+
refine Object do
1366+
def raise
1367+
# do nothing
1368+
end
1369+
end
1370+
1371+
class << self
1372+
using M
1373+
def m0
1374+
raise
1375+
end
1376+
end
1377+
1378+
using M
1379+
def M.m1
1380+
raise
1381+
end
1382+
end
1383+
1384+
M.dup.m0
1385+
M.dup.m1
1386+
INPUT
1387+
end
1388+
13611389
private
13621390

13631391
def eval_using(mod, s)

version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#define RUBY_VERSION "2.1.5"
22
#define RUBY_RELEASE_DATE "2015-03-18"
3-
#define RUBY_PATCHLEVEL 316
3+
#define RUBY_PATCHLEVEL 317
44

55
#define RUBY_RELEASE_YEAR 2015
66
#define RUBY_RELEASE_MONTH 3

vm_core.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -896,6 +896,8 @@ void rb_gc_mark_machine_stack(rb_thread_t *th);
896896

897897
int rb_autoloading_value(VALUE mod, ID id, VALUE* value);
898898

899+
void rb_vm_rewrite_cref_stack(NODE *node, VALUE old_klass, VALUE new_klass, NODE **new_cref_ptr);
900+
899901
#define sysstack_error GET_VM()->special_exceptions[ruby_error_sysstack]
900902

901903
#define RUBY_CONST_ASSERT(expr) (1/!!(expr)) /* expr must be a compile-time constant */

vm_insnhelper.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,27 @@ rb_vm_get_cref(const rb_iseq_t *iseq, const VALUE *ep)
278278
return cref;
279279
}
280280

281+
void
282+
rb_vm_rewrite_cref_stack(NODE *node, VALUE old_klass, VALUE new_klass, NODE **new_cref_ptr)
283+
{
284+
NODE *new_node;
285+
while (node) {
286+
if (node->nd_clss == old_klass) {
287+
new_node = NEW_CREF(new_klass);
288+
COPY_CREF_OMOD(new_node, node);
289+
RB_OBJ_WRITE(new_node, &new_node->nd_next, node->nd_next);
290+
*new_cref_ptr = new_node;
291+
return;
292+
}
293+
new_node = NEW_CREF(node->nd_clss);
294+
COPY_CREF_OMOD(new_node, node);
295+
node = node->nd_next;
296+
*new_cref_ptr = new_node;
297+
new_cref_ptr = &new_node->nd_next;
298+
}
299+
*new_cref_ptr = NULL;
300+
}
301+
281302
static NODE *
282303
vm_cref_push(rb_thread_t *th, VALUE klass, int noex, rb_block_t *blockptr)
283304
{

0 commit comments

Comments
 (0)