diff options
author | Étienne Barrié <[email protected]> | 2023-11-17 10:24:02 +0100 |
---|---|---|
committer | Jean Boussier <[email protected]> | 2023-11-20 15:23:56 +0100 |
commit | 46ef74f270d022068def440ab6208e1648030847 (patch) | |
tree | 028f4d21851690fbd289bf24947e9a390fa6a3de /vm_backtrace.c | |
parent | 83c385719d95c178790e52f78e2b247d1476eb5e (diff) |
Embed Thread::Backtrace::Location into Thread::Backtrace
Co-authored-by: Jean Boussier <[email protected]>
Diffstat (limited to 'vm_backtrace.c')
-rw-r--r-- | vm_backtrace.c | 26 |
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); |