[前][次][番号順一覧][スレッド一覧]

ruby-changes:30769

From: nobu <ko1@a...>
Date: Fri, 6 Sep 2013 00:05:29 +0900 (JST)
Subject: [ruby-changes:30769] nobu:r42848 (trunk): class.c: remove recursion

nobu	2013-09-06 00:05:20 +0900 (Fri, 06 Sep 2013)

  New Revision: 42848

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=42848

  Log:
    class.c: remove recursion
    
    * class.c (rewrite_cref_stack): remove recursion.

  Modified files:
    trunk/ChangeLog
    trunk/class.c
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 42847)
+++ ChangeLog	(revision 42848)
@@ -1,3 +1,7 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Fri Sep  6 00:05:14 2013  Nobuyoshi Nakada  <nobu@r...>
+
+	* class.c (rewrite_cref_stack): remove recursion.
+
 Thu Sep  5 18:05:00 2013  Charlie Somerville  <charliesome@r...>
 
 	* string.c (fstring_cmp): take string encoding into account when
Index: class.c
===================================================================
--- class.c	(revision 42847)
+++ class.c	(revision 42848)
@@ -231,22 +231,23 @@ rb_class_new(VALUE super) https://github.com/ruby/ruby/blob/trunk/class.c#L231
     return rb_class_boot(super);
 }
 
-static NODE*
-rewrite_cref_stack(NODE *node, VALUE old_klass, VALUE new_klass)
+static void
+rewrite_cref_stack(NODE *node, VALUE old_klass, VALUE new_klass, NODE **new_cref_ptr)
 {
     NODE *new_node;
-    if (!node) {
-	return NULL;
-    }
-    if (node->nd_clss == old_klass) {
-	new_node = NEW_CREF(new_klass);
-	new_node->nd_next = node->nd_next;
-    }
-    else {
+    while (node) {
+	if (node->nd_clss == old_klass) {
+	    new_node = NEW_CREF(new_klass);
+	    new_node->nd_next = node->nd_next;
+	    *new_cref_ptr = new_node;
+	    return;
+	}
 	new_node = NEW_CREF(node->nd_clss);
-	new_node->nd_next = rewrite_cref_stack(node->nd_next, old_klass, new_klass);
+	node = node->nd_next;
+	*new_cref_ptr = new_node;
+	new_cref_ptr = &new_node->nd_next;
     }
-    return new_node;
+    *new_cref_ptr = NULL;
 }
 
 static void
@@ -255,9 +256,11 @@ clone_method(VALUE klass, ID mid, const https://github.com/ruby/ruby/blob/trunk/class.c#L256
     VALUE newiseqval;
     if (me->def && me->def->type == VM_METHOD_TYPE_ISEQ) {
 	rb_iseq_t *iseq;
+	NODE *new_cref;
 	newiseqval = rb_iseq_clone(me->def->body.iseq->self, klass);
 	GetISeqPtr(newiseqval, iseq);
-	OBJ_WRITE(iseq->self, &iseq->cref_stack, rewrite_cref_stack(me->def->body.iseq->cref_stack, me->klass, klass));
+	rewrite_cref_stack(me->def->body.iseq->cref_stack, me->klass, klass, &new_cref);
+	OBJ_WRITE(iseq->self, &iseq->cref_stack, new_cref);
 	rb_add_method(klass, mid, VM_METHOD_TYPE_ISEQ, iseq, me->flag);
 	RB_GC_GUARD(newiseqval);
     }

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]