@@ -240,18 +240,17 @@ JL_DLLEXPORT jl_value_t *jl_backtrace_from_here(int returnsp, int skip)
240
240
return bt ;
241
241
}
242
242
243
+ // note: btout and bt2out must be GC roots
243
244
void decode_backtrace (uintptr_t * bt_data , size_t bt_size ,
244
245
jl_array_t * * btout , jl_array_t * * bt2out )
245
246
{
246
- jl_array_t * bt = NULL ;
247
- jl_array_t * bt2 = NULL ;
248
- JL_GC_PUSH2 (& bt , & bt2 );
247
+ jl_array_t * bt , * bt2 ;
249
248
if (array_ptr_void_type == NULL ) {
250
249
array_ptr_void_type = jl_apply_type2 ((jl_value_t * )jl_array_type , (jl_value_t * )jl_voidpointer_type , jl_box_long (1 ));
251
250
}
252
- bt = jl_alloc_array_1d (array_ptr_void_type , bt_size );
251
+ bt = * btout = jl_alloc_array_1d (array_ptr_void_type , bt_size );
253
252
memcpy (bt -> data , bt_data , bt_size * sizeof (void * ));
254
- bt2 = jl_alloc_array_1d (jl_array_any_type , 0 );
253
+ bt2 = * bt2out = jl_alloc_array_1d (jl_array_any_type , 0 );
255
254
// Scan the stack for any interpreter frames
256
255
size_t n = 0 ;
257
256
while (n < bt_size ) {
@@ -261,12 +260,9 @@ void decode_backtrace(uintptr_t *bt_data, size_t bt_size,
261
260
}
262
261
n ++ ;
263
262
}
264
- * btout = bt ;
265
- * bt2out = bt2 ;
266
- JL_GC_POP ();
267
263
}
268
264
269
- JL_DLLEXPORT void jl_get_backtrace (jl_array_t * * btout , jl_array_t * * bt2out )
265
+ JL_DLLEXPORT jl_value_t * jl_get_backtrace (void )
270
266
{
271
267
jl_excstack_t * s = jl_get_ptls_states ()-> current_task -> excstack ;
272
268
uintptr_t * bt_data = NULL ;
@@ -275,7 +271,12 @@ JL_DLLEXPORT void jl_get_backtrace(jl_array_t **btout, jl_array_t **bt2out)
275
271
bt_data = jl_excstack_bt_data (s , s -> top );
276
272
bt_size = jl_excstack_bt_size (s , s -> top );
277
273
}
278
- decode_backtrace (bt_data , bt_size , btout , bt2out );
274
+ jl_array_t * bt = NULL , * bt2 = NULL ;
275
+ JL_GC_PUSH2 (& bt , & bt2 );
276
+ decode_backtrace (bt_data , bt_size , & bt , & bt2 );
277
+ jl_svec_t * pair = jl_svec2 (bt , bt2 );
278
+ JL_GC_POP ();
279
+ return (jl_value_t * )pair ;
279
280
}
280
281
281
282
// Return data from the exception stack for `task` as an array of Any, starting
0 commit comments