Skip to content

Commit fff15c9

Browse files
committed
Add an index field to zend_type
1 parent dd46be2 commit fff15c9

File tree

2 files changed

+13
-10
lines changed

2 files changed

+13
-10
lines changed

Zend/zend_compile.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ static inline uint32_t zend_alloc_cache_slot(void) {
8484
return zend_alloc_cache_slots(1);
8585
}
8686

87-
const zend_type zend_mixed_type = { NULL, MAY_BE_ANY };
87+
const zend_type zend_mixed_type = { NULL, MAY_BE_ANY, 0 };
8888

8989
ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type);
9090
ZEND_API zend_op_array *(*zend_compile_string)(zend_string *source_string, const char *filename, zend_compile_position position);
@@ -7052,8 +7052,7 @@ static zend_type zend_compile_single_typename(zend_ast *ast)
70527052
for (uint32_t generic_param_index = 0; generic_param_index < ce->num_generic_parameters; generic_param_index++) {
70537053
const zend_generic_parameter *generic_param = &ce->generic_parameters[generic_param_index];
70547054
if (zend_string_equals(type_name, generic_param->name)) {
7055-
// TODO Add ZEND_TYPE_INIT_GENERIC() macro that takes an index
7056-
return (zend_type) ZEND_TYPE_INIT_PTR(zend_string_copy(type_name), _ZEND_TYPE_GENERIC_PARAM_NAME_BIT, /* allow null */ false, 0);
7055+
return (zend_type) ZEND_TYPE_INIT_GENERIC_PARAM(zend_string_copy(type_name), generic_param_index);
70577056
}
70587057
}
70597058
}

Zend/zend_types.h

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ typedef struct {
133133
* are only supported since C++20). */
134134
void *ptr;
135135
uint32_t type_mask;
136-
/* TODO: We could use the extra 32-bit of padding on 64-bit systems. */
136+
uint32_t generic_param_index;
137137
} zend_type;
138138

139139
typedef struct {
@@ -307,27 +307,28 @@ typedef struct {
307307
#endif
308308

309309
#define ZEND_TYPE_INIT_NONE(extra_flags) \
310-
_ZEND_TYPE_PREFIX { NULL, (extra_flags) }
310+
_ZEND_TYPE_PREFIX { NULL, (extra_flags), 0 }
311311

312312
#define ZEND_TYPE_INIT_MASK(_type_mask) \
313-
_ZEND_TYPE_PREFIX { NULL, (_type_mask) }
313+
_ZEND_TYPE_PREFIX { NULL, (_type_mask), 0 }
314314

315315
#define ZEND_TYPE_INIT_CODE(code, allow_null, extra_flags) \
316316
ZEND_TYPE_INIT_MASK(((code) == _IS_BOOL ? MAY_BE_BOOL : ( (code) == IS_ITERABLE ? _ZEND_TYPE_ITERABLE_BIT : ((code) == IS_MIXED ? MAY_BE_ANY : (1 << (code))))) \
317317
| ((allow_null) ? _ZEND_TYPE_NULLABLE_BIT : 0) | (extra_flags))
318318

319319
#define ZEND_TYPE_INIT_PTR(ptr, type_kind, allow_null, extra_flags) \
320320
_ZEND_TYPE_PREFIX { (void *) (ptr), \
321-
(type_kind) | ((allow_null) ? _ZEND_TYPE_NULLABLE_BIT : 0) | (extra_flags) }
321+
(type_kind) | ((allow_null) ? _ZEND_TYPE_NULLABLE_BIT : 0) | (extra_flags), \
322+
0 }
322323

323324
#define ZEND_TYPE_INIT_PTR_MASK(ptr, type_mask) \
324-
_ZEND_TYPE_PREFIX { (void *) (ptr), (type_mask) }
325+
_ZEND_TYPE_PREFIX { (void *) (ptr), (type_mask), 0 }
325326

326327
#define ZEND_TYPE_INIT_UNION(ptr, extra_flags) \
327-
_ZEND_TYPE_PREFIX { (void *) (ptr), (_ZEND_TYPE_LIST_BIT|_ZEND_TYPE_UNION_BIT) | (extra_flags) }
328+
_ZEND_TYPE_PREFIX { (void *) (ptr), (_ZEND_TYPE_LIST_BIT|_ZEND_TYPE_UNION_BIT) | (extra_flags), 0 }
328329

329330
#define ZEND_TYPE_INIT_INTERSECTION(ptr, extra_flags) \
330-
_ZEND_TYPE_PREFIX { (void *) (ptr), (_ZEND_TYPE_LIST_BIT|_ZEND_TYPE_INTERSECTION_BIT) | (extra_flags) }
331+
_ZEND_TYPE_PREFIX { (void *) (ptr), (_ZEND_TYPE_LIST_BIT|_ZEND_TYPE_INTERSECTION_BIT) | (extra_flags), 0 }
331332

332333
#define ZEND_TYPE_INIT_CLASS(class_name, allow_null, extra_flags) \
333334
ZEND_TYPE_INIT_PTR(class_name, _ZEND_TYPE_NAME_BIT, allow_null, extra_flags)
@@ -341,6 +342,9 @@ typedef struct {
341342
#define ZEND_TYPE_INIT_CLASS_CONST_MASK(class_name, type_mask) \
342343
ZEND_TYPE_INIT_PTR_MASK(class_name, (_ZEND_TYPE_LITERAL_NAME_BIT | (type_mask)))
343344

345+
#define ZEND_TYPE_INIT_GENERIC_PARAM(generic_name, index) \
346+
_ZEND_TYPE_PREFIX { (void *) (generic_name), _ZEND_TYPE_GENERIC_PARAM_NAME_BIT, index }
347+
344348
typedef union _zend_value {
345349
zend_long lval; /* long value */
346350
double dval; /* double value */

0 commit comments

Comments
 (0)