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

ruby-changes:61049

From: Aaron <ko1@a...>
Date: Fri, 8 May 2020 03:43:10 +0900 (JST)
Subject: [ruby-changes:61049] 2d27632c3c (master): Add compaction support for backtrace objects

https://git.ruby-lang.org/ruby.git/commit/?id=2d27632c3c

From 2d27632c3c6a0a6a3be5a27f1ec8b1061fcb370e Mon Sep 17 00:00:00 2001
From: Aaron Patterson <tenderlove@r...>
Date: Thu, 7 May 2020 10:15:35 -0700
Subject: Add compaction support for backtrace objects

This just introduces compaction support for backtrace objects.

diff --git a/vm_backtrace.c b/vm_backtrace.c
index 448a58b..ac77c6d 100644
--- a/vm_backtrace.c
+++ b/vm_backtrace.c
@@ -123,7 +123,7 @@ location_mark_entry(rb_backtrace_location_t *fi) https://github.com/ruby/ruby/blob/trunk/vm_backtrace.c#L123
     switch (fi->type) {
       case LOCATION_TYPE_ISEQ:
       case LOCATION_TYPE_ISEQ_CALCED:
-	rb_gc_mark((VALUE)fi->body.iseq.iseq);
+	rb_gc_mark_movable((VALUE)fi->body.iseq.iseq);
 	break;
       case LOCATION_TYPE_CFUNC:
       case LOCATION_TYPE_IFUNC:
@@ -417,8 +417,8 @@ backtrace_mark(void *ptr) https://github.com/ruby/ruby/blob/trunk/vm_backtrace.c#L417
     for (i=0; i<s; i++) {
 	location_mark_entry(&bt->backtrace[i]);
     }
-    rb_gc_mark(bt->strary);
-    rb_gc_mark(bt->locary);
+    rb_gc_mark_movable(bt->strary);
+    rb_gc_mark_movable(bt->locary);
 }
 
 static void
@@ -429,6 +429,34 @@ backtrace_free(void *ptr) https://github.com/ruby/ruby/blob/trunk/vm_backtrace.c#L429
    ruby_xfree(bt);
 }
 
+static void
+location_update_entry(rb_backtrace_location_t *fi)
+{
+    switch (fi->type) {
+      case LOCATION_TYPE_ISEQ:
+      case LOCATION_TYPE_ISEQ_CALCED:
+	fi->body.iseq.iseq = (rb_iseq_t*)rb_gc_location((VALUE)fi->body.iseq.iseq);
+	break;
+      case LOCATION_TYPE_CFUNC:
+      case LOCATION_TYPE_IFUNC:
+      default:
+	break;
+    }
+}
+
+static void
+backtrace_update(void *ptr)
+{
+    rb_backtrace_t *bt = (rb_backtrace_t *)ptr;
+    size_t i, s = bt->backtrace_size;
+
+    for (i=0; i<s; i++) {
+	location_update_entry(&bt->backtrace[i]);
+    }
+    bt->strary = rb_gc_location(bt->strary);
+    bt->locary = rb_gc_location(bt->locary);
+}
+
 static size_t
 backtrace_memsize(const void *ptr)
 {
@@ -438,7 +466,7 @@ backtrace_memsize(const void *ptr) https://github.com/ruby/ruby/blob/trunk/vm_backtrace.c#L466
 
 static const rb_data_type_t backtrace_data_type = {
     "backtrace",
-    {backtrace_mark, backtrace_free, backtrace_memsize,},
+    {backtrace_mark, backtrace_free, backtrace_memsize, backtrace_update},
     0, 0, RUBY_TYPED_FREE_IMMEDIATELY
 };
 
-- 
cgit v0.10.2


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

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