summaryrefslogtreecommitdiff
path: root/vm_backtrace.c
diff options
context:
space:
mode:
authorÉtienne Barrié <etienne.barrie@gmail.com>2023-11-17 10:24:02 +0100
committerJean Boussier <jean.boussier@gmail.com>2023-11-20 15:23:56 +0100
commit46ef74f270d022068def440ab6208e1648030847 (patch)
tree028f4d21851690fbd289bf24947e9a390fa6a3de /vm_backtrace.c
parent83c385719d95c178790e52f78e2b247d1476eb5e (diff)
Embed Thread::Backtrace::Location into Thread::Backtrace
Co-authored-by: Jean Boussier <byroot@ruby-lang.org>
Diffstat (limited to 'vm_backtrace.c')
-rw-r--r--vm_backtrace.c26
1 files changed, 10 insertions, 16 deletions
diff --git a/vm_backtrace.c b/vm_backtrace.c
index 6f986341aa..c411a4b08b 100644
--- a/vm_backtrace.c
+++ b/vm_backtrace.c
@@ -454,10 +454,10 @@ location_inspect_m(VALUE self)
}
typedef struct rb_backtrace_struct {
- rb_backtrace_location_t *backtrace;
int backtrace_size;
VALUE strary;
VALUE locary;
+ rb_backtrace_location_t backtrace[1];
} rb_backtrace_t;
static void
@@ -474,13 +474,6 @@ backtrace_mark(void *ptr)
}
static void
-backtrace_free(void *ptr)
-{
- rb_backtrace_t *bt = (rb_backtrace_t *)ptr;
- ruby_xfree(bt->backtrace);
-}
-
-static void
location_update_entry(rb_backtrace_location_t *fi)
{
switch (fi->type) {
@@ -513,13 +506,12 @@ backtrace_update(void *ptr)
static size_t
backtrace_memsize(const void *ptr)
{
- rb_backtrace_t *bt = (rb_backtrace_t *)ptr;
- return sizeof(rb_backtrace_location_t) * bt->backtrace_size;
+ return 0;
}
static const rb_data_type_t backtrace_data_type = {
"backtrace",
- {backtrace_mark, backtrace_free, backtrace_memsize, backtrace_update},
+ {backtrace_mark, RUBY_DEFAULT_FREE, backtrace_memsize, backtrace_update},
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_EMBEDDABLE
};
@@ -592,9 +584,8 @@ rb_ec_partial_backtrace_object(const rb_execution_context_t *ec, long start_fram
const rb_control_frame_t *cfp = ec->cfp;
const rb_control_frame_t *end_cfp = RUBY_VM_END_CONTROL_FRAME(ec);
ptrdiff_t size;
- rb_backtrace_t *bt;
- VALUE btobj = backtrace_alloc(rb_cBacktrace);
- TypedData_Get_Struct(btobj, rb_backtrace_t, &backtrace_data_type, bt);
+ rb_backtrace_t *bt = NULL;
+ VALUE btobj = Qnil;
rb_backtrace_location_t *loc = NULL;
unsigned long cfunc_counter = 0;
@@ -624,8 +615,11 @@ rb_ec_partial_backtrace_object(const rb_execution_context_t *ec, long start_fram
}
}
+ size_t memsize = offsetof(rb_backtrace_t, backtrace) + num_frames * sizeof(rb_backtrace_location_t);
+ btobj = rb_data_typed_object_zalloc(rb_cBacktrace, memsize, &backtrace_data_type);
+ TypedData_Get_Struct(btobj, rb_backtrace_t, &backtrace_data_type, bt);
+
bt->backtrace_size = 0;
- bt->backtrace = ZALLOC_N(rb_backtrace_location_t, num_frames);
if (num_frames == 0) {
if (start_too_large) *start_too_large = 0;
return btobj;
@@ -739,7 +733,7 @@ rb_backtrace_to_str_ary(VALUE self)
void
rb_backtrace_use_iseq_first_lineno_for_last_location(VALUE self)
{
- const rb_backtrace_t *bt;
+ rb_backtrace_t *bt;
rb_backtrace_location_t *loc;
TypedData_Get_Struct(self, rb_backtrace_t, &backtrace_data_type, bt);