Skip to content

Commit b9a9e0f

Browse files
committed
refactor(zend): address review feedback
Signed-off-by: azjezz <azjezz@protonmail.com>
1 parent 006bfdc commit b9a9e0f

7 files changed

Lines changed: 43 additions & 23 deletions

File tree

Zend/zend_ast.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2109,14 +2109,14 @@ static ZEND_COLD void zend_ast_export_generic_call_type_argument_list(smart_str
21092109

21102110
static ZEND_COLD void zend_ast_export_generic_type_parameter(smart_str *str, zend_ast *ast, int indent)
21112111
{
2112-
switch (ast->attr) {
2113-
case 1:
2112+
switch ((zend_generic_variance) ast->attr) {
2113+
case ZEND_GENERIC_VARIANCE_COVARIANT:
21142114
smart_str_appendc(str, '+');
21152115
break;
2116-
case 2:
2116+
case ZEND_GENERIC_VARIANCE_CONTRAVARIANT:
21172117
smart_str_appendc(str, '-');
21182118
break;
2119-
default:
2119+
case ZEND_GENERIC_VARIANCE_INVARIANT:
21202120
break;
21212121
}
21222122
smart_str_append(str, zend_ast_get_str(ast->child[0]));

Zend/zend_compile.c

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ void zend_init_compiler_data_structures(void) /* {{{ */
438438
}
439439
/* }}} */
440440

441-
static void zend_generic_scope_push(zend_generic_parameter_list *params, uint8_t origin) /* {{{ */
441+
static void zend_generic_scope_push(zend_generic_parameter_list *params, zend_generic_origin origin) /* {{{ */
442442
{
443443
zend_generic_scope_entry *entry = emalloc(sizeof(zend_generic_scope_entry));
444444
entry->params = params;
@@ -466,7 +466,7 @@ static void zend_generic_scope_pop(void) /* {{{ */
466466
/* }}} */
467467

468468
static zend_generic_parameter *zend_generic_lookup_full(
469-
zend_string *name, uint8_t *origin_out, uint32_t *index_out) /* {{{ */
469+
zend_string *name, zend_generic_origin *origin_out, uint32_t *index_out) /* {{{ */
470470
{
471471
zend_string *lc_name = zend_string_tolower(name);
472472
for (zend_generic_scope_entry *e = CG(generic_scope); e; e = e->outer) {
@@ -497,7 +497,9 @@ static zend_generic_parameter *zend_generic_lookup_full(
497497
static int zend_generic_lookup_forward(const zend_string *name) /* {{{ */
498498
{
499499
zend_generic_scope_entry *e = CG(generic_scope);
500-
if (!e) return -1;
500+
if (!e) {
501+
return -1;
502+
}
501503
zend_generic_parameter_list *params = e->params;
502504
for (uint32_t i = e->visible_count; i < params->count; i++) {
503505
if (zend_string_equals(params->parameters[i].name, name)) {
@@ -566,12 +568,12 @@ static zend_generic_parameter_list *zend_compile_generic_type_parameter_list(zen
566568
}
567569

568570
params->parameters[i].name = zend_string_copy(name);
569-
params->parameters[i].variance = (uint8_t) param_ast->attr;
571+
params->parameters[i].variance = (zend_generic_variance) param_ast->attr;
570572
}
571573

572574
params->count = list->children;
573575

574-
zend_generic_scope_push(params, /* origin */ 0);
576+
zend_generic_scope_push(params, ZEND_GENERIC_ORIGIN_CLASS_LIKE);
575577
CG(generic_scope)->visible_count = 0;
576578

577579
for (uint32_t i = 0; i < list->children; i++) {
@@ -607,7 +609,9 @@ static zend_generic_parameter_list *zend_compile_generic_type_parameter_list(zen
607609
* reference or a named type with type arguments) that need pre-erasure capture. */
608610
static bool zend_type_ast_has_generic_content(zend_ast *ast)
609611
{
610-
if (!ast) return false;
612+
if (!ast) {
613+
return false;
614+
}
611615
zend_ast_attr orig = ast->attr;
612616
ast->attr &= ~ZEND_TYPE_NULLABLE;
613617
bool result = false;
@@ -666,8 +670,12 @@ static zend_type zend_compile_pre_erasure_typename(zend_ast *ast)
666670
if (name_ast->kind == ZEND_AST_TYPE) {
667671
const char *cname;
668672
switch (name_ast->attr) {
669-
case IS_ARRAY: cname = "array"; break;
670-
case IS_STATIC: cname = "static"; break;
673+
case IS_ARRAY:
674+
cname = "array";
675+
break;
676+
case IS_STATIC:
677+
cname = "static";
678+
break;
671679
default:
672680
ZEND_UNREACHABLE();
673681
}
@@ -690,7 +698,7 @@ static zend_type zend_compile_pre_erasure_typename(zend_ast *ast)
690698
/* Builtin pseudo-type: same as erased. */
691699
result = (zend_type) ZEND_TYPE_INIT_CODE(ast->attr, 0, 0);
692700
} else if (ast->kind == ZEND_AST_ZVAL) {
693-
uint8_t origin;
701+
zend_generic_origin origin;
694702
uint32_t index;
695703
zend_generic_parameter *param = NULL;
696704
if ((ast->attr & ZEND_NAME_NOT_FQ) == ZEND_NAME_NOT_FQ) {
@@ -743,7 +751,7 @@ static zend_type zend_compile_pre_erasure_typename(zend_ast *ast)
743751
return result;
744752
}
745753

746-
/* Ensure op_array->generic_types or ce->generic_types is allocated. */
754+
/* Ensure op_array->generic_types is allocated, then return it. */
747755
static zend_generic_type_table *zend_generic_get_or_create_op_array_table(zend_op_array *op_array)
748756
{
749757
if (!op_array->generic_types) {
@@ -752,6 +760,7 @@ static zend_generic_type_table *zend_generic_get_or_create_op_array_table(zend_o
752760
return op_array->generic_types;
753761
}
754762

763+
/* Ensure ce->generic_types is allocated, then return it. */
755764
static zend_generic_type_table *zend_generic_get_or_create_class_table(zend_class_entry *ce)
756765
{
757766
if (!ce->generic_types) {
@@ -9302,7 +9311,7 @@ static zend_op_array *zend_compile_func_decl_ex(
93029311
* See GENERICS.md §6.9. */
93039312
if (generic_params_ast) {
93049313
op_array->generic_parameters = zend_compile_generic_type_parameter_list(generic_params_ast);
9305-
zend_generic_scope_push(op_array->generic_parameters, /* origin */ 1);
9314+
zend_generic_scope_push(op_array->generic_parameters, ZEND_GENERIC_ORIGIN_FUNCTION_LIKE);
93069315
generic_scope_pushed = true;
93079316
}
93089317

@@ -10120,7 +10129,7 @@ static void zend_compile_class_decl(znode *result, const zend_ast *ast, bool top
1012010129
if (decl->child[5]) {
1012110130
ZEND_ASSERT(!(decl->flags & ZEND_ACC_ANON_CLASS));
1012210131
ce->generic_parameters = zend_compile_generic_type_parameter_list(decl->child[5]);
10123-
zend_generic_scope_push(ce->generic_parameters, /* origin */ 0);
10132+
zend_generic_scope_push(ce->generic_parameters, ZEND_GENERIC_ORIGIN_CLASS_LIKE);
1012410133
}
1012510134

1012610135
if (extends_ast) {

Zend/zend_compile.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,20 @@ typedef struct _zend_file_context {
121121
HashTable seen_symbols;
122122
} zend_file_context;
123123

124+
C23_ENUM(zend_generic_variance, uint8_t) {
125+
ZEND_GENERIC_VARIANCE_INVARIANT = 0,
126+
ZEND_GENERIC_VARIANCE_COVARIANT = 1,
127+
ZEND_GENERIC_VARIANCE_CONTRAVARIANT = 2,
128+
};
129+
130+
C23_ENUM(zend_generic_origin, uint8_t) {
131+
ZEND_GENERIC_ORIGIN_CLASS_LIKE = 0, /* class, interface, trait, enum */
132+
ZEND_GENERIC_ORIGIN_FUNCTION_LIKE = 1, /* function, method, closure, arrow function */
133+
};
134+
124135
typedef struct _zend_generic_parameter {
125136
zend_string *name; /* type-parameter name */
126-
uint8_t variance; /* 0=invariant, 1=covariant, 2=contravariant */
137+
zend_generic_variance variance;
127138
zend_type bound; /* runtime erased; ZEND_TYPE_NONE if unbounded */
128139
zend_type bound_pre_erasure; /* pre-erasure; ZEND_TYPE_NONE if same as `bound` */
129140
zend_type default_type; /* runtime erased; ZEND_TYPE_NONE if no default */
@@ -154,7 +165,7 @@ typedef struct _zend_generic_scope_entry {
154165
uint32_t visible_count; /* number of parameters in `params` already declared */
155166
struct _zend_generic_parameter *self_compiling; /* param whose bound/default is being compiled, or NULL */
156167
HashTable *shadowing_classes; /* lc_names of class-likes declared inside this scope; lazy-allocated */
157-
uint8_t origin; /* 0 = class/interface/trait, 1 = function/method/closure/arrow-fn */
168+
zend_generic_origin origin;
158169
struct _zend_generic_scope_entry *outer;
159170
} zend_generic_scope_entry;
160171

Zend/zend_extensions.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ You can use the following macro to check the extension API version for compatibi
4343

4444
/* The first number is the engine version and the rest is the date (YYYYMMDD).
4545
* This way engine 2/3 API no. is always greater than engine 1 API no.. */
46-
#define ZEND_EXTENSION_API_NO 420260506
46+
#define ZEND_EXTENSION_API_NO 420250926
4747

4848
typedef struct _zend_extension_version_info {
4949
int zend_extension_api_no;

Zend/zend_modules.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
#define ZEND_MODULE_INFO_FUNC_ARGS zend_module_entry *zend_module
3131
#define ZEND_MODULE_INFO_FUNC_ARGS_PASSTHRU zend_module
3232

33-
#define ZEND_MODULE_API_NO 20260506
33+
#define ZEND_MODULE_API_NO 20250926
3434
#ifdef ZTS
3535
#define USING_ZTS 1
3636
#else

Zend/zend_types.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ typedef struct {
131131
typedef struct _zend_type_parameter_ref {
132132
zend_string *name; /* type-parameter source name (e.g. "T") */
133133
uint32_t index; /* position in declaring entity's parameter list */
134-
uint8_t origin; /* 0 = class, 1 = function/method/closure/arrow-fn */
134+
uint8_t origin; /* one of zend_generic_origin (see zend_compile.h) */
135135
} zend_type_parameter_ref;
136136

137137
/* List of pre-erasure type arguments attached to a named pre-erasure zend_type. */

ext/reflection/php_reflection.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8580,7 +8580,7 @@ ZEND_METHOD(ReflectionTypeParameterReference, getTypeParameter)
85808580
zval declaring_zv;
85818581
ZVAL_UNDEF(&declaring_zv);
85828582

8583-
if (tp->origin == 0 /* class */) {
8583+
if (tp->origin == ZEND_GENERIC_ORIGIN_CLASS_LIKE) {
85848584
if (!ref->declaring_class) {
85858585
zend_throw_error(NULL,
85868586
"Type parameter reference has no declaring class context");
@@ -8589,7 +8589,7 @@ ZEND_METHOD(ReflectionTypeParameterReference, getTypeParameter)
85898589

85908590
list = ref->declaring_class->generic_parameters;
85918591
zend_reflection_class_factory(ref->declaring_class, &declaring_zv);
8592-
} else /* function */ {
8592+
} else {
85938593
if (!ref->declaring_fn) {
85948594
zend_throw_error(NULL,
85958595
"Type parameter reference has no declaring function context");

0 commit comments

Comments
 (0)