Update gen_stubs.php to generate C enums from internal enums, when the stub is annotated with @generate-c-enums. Enum values can be compared to the result of zend_enum_fetch_case_id(zend_object*).
The generated enums are added to separate files named {$extensionName}_decl.h, so that it's possible to include these from anywhere. _arginfo.h files would generate warnings if we tried to include them in a compilation unit that doesn't call the register_{$class} functions, for instance.
Introduce Z_PARAM_ENUM().
* Make ZEND_AST_CONST_ENUM_INIT a 4-children node
* Store enum case id in ZEND_AST_CONST_ENUM_INIT
* Store enum case id in instance
* Expose enum case_id internally
* Generate C enum for internal enums
* Introduce Z_PARAM_ENUM()
* Port extensions
RFC: https://wiki.php.net/rfc/partial_function_application_v2
For FCCs, the parser generates a normal function call AST node, the but argument
list is a ZEND_AST_CALLABLE_CONVERT / zend_ast_fcc node.
We extend this for PFAs so that zend_ast_fcc can represent arguments.
* Support PFA syntax in grammar
* Update zend_ast_fcc so that arguments can be represented
* Support serialization of zend_ast_fcc arguments in SHM / file cache
* Introduce zend_ast_arg_list_add(): Same as zend_ast_list_add(), but wraps the
list in a ZEND_AST_CALLABLE_CONVERT when adding any placeholder argument.
Technically the arg list wrapping is not required, but it results in simpler
code later as it will be very convenient in the compiler (determines whether a
function calls is a PFA/FCC), and for PFA-in-const-expr support. It also allows
to unify FCCs and PFAs in the grammar.
Closes GH-20717.
* zend_portability: Add `ZEND_ATTRIBUTE_NODISCARD`
* zend_ast: Mark `zend_ast_list_add()` as `ZEND_ATTRIBUTE_NODISCARD`
This actually caught a bug in the implementation of attributes on regular
constants: A list of 4 constants with an attribute did not correctly result in
an error, since the reallocated list wasn't stored anywhere.
* zend_portability: Support C++ for `ZEND_ATTRIBUTE_NODISCARD`
Co-authored-by: David CARLIER <devnexen@gmail.com>
---------
Co-authored-by: David CARLIER <devnexen@gmail.com>
The intent here was to assign the first found line. Instead this
always fell back to CG(zend_lineno).
Not sure if this line matters for anything in php-src, but the
issue was observed in https://github.com/nikic/php-ast/issues/247.
The VM assumes that an exception must be handled when the AST evaluation
returns FAILURE. However, the comparison functions always return SUCCESS
even if an exception happened. This can be fixed in
zend_ast_evaluate_inner() or we can make is_smaller_function() etc check
for the exception. I chose the former to avoid impact or API breaks.
Perhaps in the future the comparison functions should either return void
or return whether an exception happened, as to be not misleading.
Closes GH-18589.
As per the discussion in GH-17120, we are printing a placeholder value only.
The commit history of that PR also includes alternative implementations, should
a different decision be desirable.
Fixes GH-17096
Closes GH-17120
Given that the `ZEND_AST_OP_ARRAY` type already needed special handling in
various places, it makes sense to give it its own struct to avoid some of the
casts. As a side benefit, it is a little smaller than the `zend_ast_zval`
struct.
* zend_compile: Do not traverse children of ZEND_AST_CLOSURE in zend_compile_const_expr()
* Add assertions verifying that zend_ast_decl AST nodes are not treated as regular zend_ast nodes