dumping ground for random patches and texts
 help / color / mirror / Atom feed
* [PATCH] move RB_GC_GUARD responsibility to rb_add_method_iseq
@ 2015-06-30 20:55 Eric Wong
  0 siblings, 0 replies; only message in thread
From: Eric Wong @ 2015-06-30 20:55 UTC (permalink / raw)
  To: spew

This simplifies all the callers and makes code easier to use
and review.  I was confused about the need for RB_GC_GUARD
in define_{aset,aref}_method of struct.c without reading
rb_add_method_iseq.

Likewise, do the same for rb_iseq_clone, where the GC guard
only seems neccesary iff RGenGC is disabled.

* vm_method.c (rb_add_method_iseq): add RB_GC_GUARD
* class.c (clone_method): remove RB_GC_GUARD
* struct.c (define_aref_method): ditto
  (define_aset_method): ditto
* vm.c (vm_define_method):
* iseq.c (rb_iseq_clone): add RB_GC_GUARD
---
 class.c     | 1 -
 iseq.c      | 2 ++
 struct.c    | 2 --
 vm.c        | 2 +-
 vm_method.c | 1 +
 5 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/class.c b/class.c
index 6ee1e08..6207fb7 100644
--- a/class.c
+++ b/class.c
@@ -249,7 +249,6 @@ clone_method(VALUE old_klass, VALUE new_klass, ID mid, const rb_method_entry_t *
 	newiseqval = rb_iseq_clone(me->def->body.iseq.iseqptr->self, new_klass);
 	rb_vm_rewrite_cref(me->def->body.iseq.cref, old_klass, new_klass, &new_cref);
 	rb_add_method_iseq(new_klass, mid, newiseqval, new_cref, METHOD_ENTRY_VISI(me));
-	RB_GC_GUARD(newiseqval);
     }
     else {
 	rb_method_entry_set(new_klass, mid, me, METHOD_ENTRY_VISI(me));
diff --git a/iseq.c b/iseq.c
index 037df44..48de119 100644
--- a/iseq.c
+++ b/iseq.c
@@ -1968,6 +1968,8 @@ rb_iseq_clone(VALUE iseqval, VALUE newcbase)
 	RB_OBJ_WRITTEN(iseq1->self, Qundef, iseq1->klass);
     }
 
+    RB_GC_GUARD(iseqval); /* seems necessary iff RGenGC is disabled */
+
     return newiseq;
 }
 
diff --git a/struct.c b/struct.c
index ff4501d..c3ac25d 100644
--- a/struct.c
+++ b/struct.c
@@ -186,7 +186,6 @@ define_aref_method(VALUE nstr, VALUE name, VALUE off)
     VALUE iseqval = rb_method_for_self_aref(name, off, rb_vm_opt_struct_aref);
 
     rb_add_method_iseq(nstr, SYM2ID(name), iseqval, NULL, METHOD_VISI_PUBLIC);
-    RB_GC_GUARD(iseqval);
 }
 
 static void
@@ -196,7 +195,6 @@ define_aset_method(VALUE nstr, VALUE name, VALUE off)
     VALUE iseqval = rb_method_for_self_aset(name, off, rb_vm_opt_struct_aset);
 
     rb_add_method_iseq(nstr, SYM2ID(name), iseqval, NULL, METHOD_VISI_PUBLIC);
-    RB_GC_GUARD(iseqval);
 }
 
 static VALUE
diff --git a/vm.c b/vm.c
index 69b594f..ad0d850 100644
--- a/vm.c
+++ b/vm.c
@@ -2288,7 +2288,7 @@ vm_define_method(rb_thread_t *th, VALUE obj, ID id, VALUE iseqval,
     GetISeqPtr(iseqval, miseq);
 
     if (miseq->klass) {
-	RB_GC_GUARD(iseqval) = rb_iseq_clone(iseqval, 0);
+	iseqval = rb_iseq_clone(iseqval, 0);
 	GetISeqPtr(iseqval, miseq);
     }
 
diff --git a/vm_method.c b/vm_method.c
index 43b5d2a..5a84396 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -562,6 +562,7 @@ rb_add_method_iseq(VALUE klass, ID mid, VALUE iseqval, rb_cref_t *cref, rb_metho
     iseq_body.iseqptr = iseq;
     iseq_body.cref = cref;
     rb_add_method(klass, mid, VM_METHOD_TYPE_ISEQ, &iseq_body, visi);
+    RB_GC_GUARD(iseqval);
 }
 
 static rb_method_entry_t *
-- 
EW

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2015-06-30 20:55 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-06-30 20:55 [PATCH] move RB_GC_GUARD responsibility to rb_add_method_iseq Eric Wong

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).