summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--vm_backtrace.c20
2 files changed, 20 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index e28ae43c2b..8f87a5f929 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Fri Nov 30 07:34:28 2012 Koichi Sasada <ko1@atdot.net>
+
+ * vm_backtrace.c: add GC guards.
+
Fri Nov 30 07:21:33 2012 Koichi Sasada <ko1@atdot.net>
[EXPERIMENTAL: NEED DISCUSS]
diff --git a/vm_backtrace.c b/vm_backtrace.c
index 6a43fbf943..97b38bc603 100644
--- a/vm_backtrace.c
+++ b/vm_backtrace.c
@@ -499,6 +499,8 @@ backtrace_to_str_ary(VALUE self, long lev, long n)
{
rb_backtrace_t *bt;
int size;
+ VALUE r;
+
GetCoreDataFromValue(self, rb_backtrace_t, bt);
size = bt->backtrace_size;
@@ -509,7 +511,9 @@ backtrace_to_str_ary(VALUE self, long lev, long n)
return Qnil;
}
- return backtrace_collect(bt, lev, n, location_to_str_dmyarg, 0);
+ r = backtrace_collect(bt, lev, n, location_to_str_dmyarg, 0);
+ RB_GC_GUARD_PTR(&self);
+ return r;
}
VALUE
@@ -542,6 +546,8 @@ backtrace_to_location_ary(VALUE self, long lev, long n)
{
rb_backtrace_t *bt;
int size;
+ VALUE r;
+
GetCoreDataFromValue(self, rb_backtrace_t, bt);
size = bt->backtrace_size;
@@ -552,7 +558,9 @@ backtrace_to_location_ary(VALUE self, long lev, long n)
return Qnil;
}
- return backtrace_collect(bt, lev, n, location_create, (void *)self);
+ r = backtrace_collect(bt, lev, n, location_create, (void *)self);
+ RB_GC_GUARD_PTR(&self);
+ return r;
}
static VALUE
@@ -706,7 +714,9 @@ vm_backtrace_to_ary(rb_thread_t *th, int argc, VALUE *argv, int lev_default, int
VALUE level, vn;
long lev, n;
VALUE btval = backtrace_object(th);
+ VALUE r;
rb_backtrace_t *bt;
+
GetCoreDataFromValue(btval, rb_backtrace_t, bt);
rb_scan_args(argc, argv, "02", &level, &vn);
@@ -755,11 +765,13 @@ vm_backtrace_to_ary(rb_thread_t *th, int argc, VALUE *argv, int lev_default, int
}
if (to_str) {
- return backtrace_to_str_ary(btval, lev, n);
+ r = backtrace_to_str_ary(btval, lev, n);
}
else {
- return backtrace_to_location_ary(btval, lev, n);
+ r = backtrace_to_location_ary(btval, lev, n);
}
+ RB_GC_GUARD_PTR(&btval);
+ return r;
}
static VALUE