@@ -91,7 +91,7 @@ static void ddtrace_capture_string_value(zend_string *str, struct ddog_CaptureVa
9191 if (!value -> not_captured_reason .len ) {
9292 value -> value = (ddog_CharSlice ) {.ptr = ZSTR_VAL (str ), .len = ZSTR_LEN (str )};
9393 if (value -> value .len > config -> max_length ) {
94- char * integer = zend_arena_alloc (& DDTRACE_G (debugger_capture_arena ), 20 );
94+ char * integer = zend_arena_alloc (& DDTRACE_G (debugger_capture_arena ). arena , 20 );
9595 int len = sprintf (integer , "%" PRIuPTR , value -> value .len );
9696 value -> size = (ddog_CharSlice ) {.ptr = integer , .len = len };
9797 value -> value .len = config -> max_length ;
@@ -103,7 +103,7 @@ static void ddtrace_capture_string_value(zend_string *str, struct ddog_CaptureVa
103103static void ddtrace_capture_long_value (zend_long num , struct ddog_CaptureValue * value ) {
104104 value -> type = DDOG_CHARSLICE_C ("int" );
105105 if (!value -> not_captured_reason .len ) {
106- char * integer = zend_arena_alloc (& DDTRACE_G (debugger_capture_arena ), 20 );
106+ char * integer = zend_arena_alloc (& DDTRACE_G (debugger_capture_arena ). arena , 20 );
107107 int len = sprintf (integer , ZEND_LONG_FMT , num );
108108 value -> value = (ddog_CharSlice ) {.ptr = integer , .len = len };
109109 }
@@ -133,7 +133,7 @@ void ddtrace_create_capture_value(zval *zv, struct ddog_CaptureValue *value, con
133133 case IS_DOUBLE : {
134134 value -> type = DDOG_CHARSLICE_C ("float" );
135135 if (!value -> not_captured_reason .len ) {
136- char * num = zend_arena_alloc (& DDTRACE_G (debugger_capture_arena ), 20 );
136+ char * num = zend_arena_alloc (& DDTRACE_G (debugger_capture_arena ). arena , 20 );
137137 php_gcvt (Z_DVAL_P (zv ), (int ) EG (precision ), '.' , 'E' , num );
138138 value -> value = (ddog_CharSlice ) {.ptr = num , .len = strlen (num )};
139139 }
@@ -239,7 +239,7 @@ void ddtrace_create_capture_value(zval *zv, struct ddog_CaptureValue *value, con
239239 } else if (ZSTR_VAL (key )[1 ] == '*' ) { // skip \0*\0
240240 fieldname = (ddog_CharSlice ) {.ptr = ZSTR_VAL (key ) + 3 , .len = ZSTR_LEN (key ) - 3 };
241241 } else {
242- char * name = zend_arena_alloc (& DDTRACE_G (debugger_capture_arena ), ZSTR_LEN (key ));
242+ char * name = zend_arena_alloc (& DDTRACE_G (debugger_capture_arena ). arena , ZSTR_LEN (key ));
243243 int classname_len = strlen (ZSTR_VAL (key ) + 1 );
244244 memcpy (name , ZSTR_VAL (key ) + 1 , classname_len );
245245 name [classname_len ++ ] = ':' ;
@@ -254,12 +254,14 @@ void ddtrace_create_capture_value(zval *zv, struct ddog_CaptureValue *value, con
254254 } ZEND_HASH_FOREACH_END ();
255255 if (ce -> type == ZEND_INTERNAL_CLASS ) {
256256#if PHP_VERSION_ID < 70400
257- if (is_temp ) {
258- zend_hash_next_index_insert_ptr (& DDTRACE_G (debugger_capture_ephemerals ), ht );
259- }
260- #else
261- zend_hash_next_index_insert_ptr (& DDTRACE_G (debugger_capture_ephemerals ), ht );
257+ if (is_temp )
262258#endif
259+ {
260+ dd_refcounted_linked * node = zend_arena_alloc (& DDTRACE_G (debugger_capture_arena ).arena , sizeof (dd_refcounted_linked ));
261+ node -> value = (zend_refcounted * )ht ;
262+ node -> next = DDTRACE_G (debugger_capture_arena ).ephemerals ;
263+ DDTRACE_G (debugger_capture_arena ).ephemerals = node ;
264+ }
263265 }
264266 break ;
265267 }
@@ -281,10 +283,10 @@ void ddtrace_create_capture_value(zval *zv, struct ddog_CaptureValue *value, con
281283#define hash_len 16
282284
283285static ddog_DebuggerCapture * dd_create_frame_and_collect_locals (char * exception_id , char * exception_hash , int frame_num , ddog_CharSlice class_slice , ddog_CharSlice func_slice , zval * locals , zend_string * service_name , const ddog_CaptureConfiguration * capture_config , uint64_t time , ddog_SpanBytes * span ) {
284- char * snapshot_id = zend_arena_alloc (& DDTRACE_G (debugger_capture_arena ), uuid_len );
286+ char * snapshot_id = zend_arena_alloc (& DDTRACE_G (debugger_capture_arena ). arena , uuid_len );
285287 ddog_snapshot_format_new_uuid ((uint8_t (* )[uuid_len ])snapshot_id );
286288
287- char * msg = zend_arena_alloc (& DDTRACE_G (debugger_capture_arena ), 40 );
289+ char * msg = zend_arena_alloc (& DDTRACE_G (debugger_capture_arena ). arena , 40 );
288290 int len = sprintf (msg , "_dd.debug.error.%d.snapshot_id" , frame_num );
289291 ddog_add_span_meta (span , (ddog_CharSlice ){.ptr = msg , .len = len }, (ddog_CharSlice ){.ptr = snapshot_id , .len = uuid_len });
290292
@@ -368,14 +370,14 @@ static void ddtrace_collect_exception_debug_data(zend_object *exception, zend_st
368370 zend_string * key_locals = zend_string_init (ZEND_STRL ("locals" ), 0 );
369371 zval * locals = zai_exception_read_property (exception , key_locals );
370372
371- bool has_arena = DDTRACE_G (debugger_capture_arena );
373+ bool has_arena = DDTRACE_G (debugger_capture_arena ). arena ;
372374 if (!has_arena ) {
373- DDTRACE_G (debugger_capture_arena ) = zend_arena_create (65536 );
375+ DDTRACE_G (debugger_capture_arena ) = ( dd_capture_arena ){. arena = zend_arena_create (65536 ), . ephemerals = NULL } ;
374376 }
375377
376378 const ddog_CaptureConfiguration capture_config = ddog_capture_defaults ();
377379
378- char * exception_hash = zend_arena_alloc (& DDTRACE_G (debugger_capture_arena ), hash_len );
380+ char * exception_hash = zend_arena_alloc (& DDTRACE_G (debugger_capture_arena ). arena , hash_len );
379381 zend_ulong exception_long_hash = ddtrace_compute_exception_hash (exception );
380382 php_hash_bin2hex (exception_hash , (unsigned char * )& exception_long_hash , sizeof (exception_long_hash ));
381383
@@ -387,7 +389,7 @@ static void ddtrace_collect_exception_debug_data(zend_object *exception, zend_st
387389 goto cleanup ;
388390 }
389391
390- char * exception_id = zend_arena_alloc (& DDTRACE_G (debugger_capture_arena ), uuid_len );
392+ char * exception_id = zend_arena_alloc (& DDTRACE_G (debugger_capture_arena ). arena , uuid_len );
391393 ddog_snapshot_format_new_uuid ((uint8_t (* )[uuid_len ])exception_id );
392394
393395 ddog_add_str_span_meta_CharSlice (span , "_dd.debug.error.exception_capture_id" , (ddog_CharSlice ){.ptr = exception_id , .len = uuid_len });
@@ -439,11 +441,11 @@ static void ddtrace_collect_exception_debug_data(zend_object *exception, zend_st
439441 zend_string * name = func -> op_array .arg_info [idx ].name ;
440442 arg_name = (ddog_CharSlice ) {.ptr = ZSTR_VAL (name ), .len = ZSTR_LEN (name )};
441443 } else {
442- const char * name = func -> internal_function .arg_info [idx ].name ;
444+ const char * name = ( const char * ) func -> internal_function .arg_info [idx ].name ;
443445 arg_name = (ddog_CharSlice ) {.ptr = name , .len = strlen (name )};
444446 }
445447 } else {
446- char * integer = zend_arena_alloc (& DDTRACE_G (debugger_capture_arena ), 23 );
448+ char * integer = zend_arena_alloc (& DDTRACE_G (debugger_capture_arena ). arena , 23 );
447449 int len = sprintf (integer , "arg" ZEND_LONG_FMT , idx );
448450 arg_name = (ddog_CharSlice ){ .ptr = integer , .len = len };
449451 }
@@ -470,8 +472,9 @@ static void ddtrace_collect_exception_debug_data(zend_object *exception, zend_st
470472
471473cleanup :
472474 if (!has_arena ) {
473- zend_arena_destroy (DDTRACE_G (debugger_capture_arena ));
474- DDTRACE_G (debugger_capture_arena ) = NULL ;
475+ dd_free_capture_ephemerals (DDTRACE_G (debugger_capture_arena ).ephemerals );
476+ zend_arena_destroy (DDTRACE_G (debugger_capture_arena ).arena );
477+ DDTRACE_G (debugger_capture_arena ) = (dd_capture_arena ){0 };
475478 }
476479
477480 zend_string_release (key_locals );
0 commit comments