@@ -2903,6 +2903,9 @@ static HashTable *interned_type_tree = NULL;
2903
2903
ZEND_API void zend_type_free_interned_trees (void ) {
2904
2904
zend_type_node * tree = NULL ;
2905
2905
ZEND_HASH_FOREACH_PTR (interned_type_tree , tree ) {
2906
+ if (tree -> kind != ZEND_TYPE_SIMPLE ) {
2907
+ pefree (tree -> compound .types , 1 );
2908
+ }
2906
2909
pefree (tree , 1 );
2907
2910
} ZEND_HASH_FOREACH_END ();
2908
2911
pefree (interned_type_tree , 1 );
@@ -3055,6 +3058,9 @@ static zend_type_node *intern_type_node(zend_type_node *node) {
3055
3058
3056
3059
if ((existing = zend_hash_index_find_ptr (interned_type_tree , hash ))) {
3057
3060
if (zend_type_node_equals (existing , node )) {
3061
+ if (node -> kind != ZEND_TYPE_SIMPLE ) {
3062
+ pefree (node -> compound .types , 1 );
3063
+ }
3058
3064
pefree (node , 1 );
3059
3065
return existing ; // reuse interned node
3060
3066
}
@@ -3085,15 +3091,17 @@ ZEND_API zend_type_node *zend_type_to_interned_tree(const zend_type type) {
3085
3091
3086
3092
zend_type * subtype ;
3087
3093
3094
+ children = pemalloc (list -> num_types * sizeof (zend_type_node * ), 1 );
3095
+
3088
3096
ZEND_TYPE_LIST_FOREACH (list , subtype ) {
3089
3097
zend_type_node * child = zend_type_to_interned_tree (* subtype );
3090
3098
3091
3099
if (child -> kind == kind ) {
3092
3100
for (uint32_t i = 0 ; i < child -> compound .num_types ; i ++ ) {
3093
- ADD_TO_TYPE_TREE ( children , num_children , child -> compound .types [i ]) ;
3101
+ children [ num_children ++ ] = child -> compound .types [i ];
3094
3102
}
3095
3103
} else {
3096
- ADD_TO_TYPE_TREE ( children , num_children , child ) ;
3104
+ children [ num_children ++ ] = child ;
3097
3105
}
3098
3106
} ZEND_TYPE_LIST_FOREACH_END ();
3099
3107
0 commit comments