Skip to content

Commit d3d8842

Browse files
committed
zend_ast: Keep const-ness for zend_ast_get*()
1 parent 6f0aa11 commit d3d8842

2 files changed

Lines changed: 52 additions & 20 deletions

File tree

Zend/zend_ast.h

Lines changed: 51 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -372,30 +372,64 @@ static zend_always_inline bool zend_ast_is_decl(const zend_ast *ast) {
372372
static zend_always_inline bool zend_ast_is_list(const zend_ast *ast) {
373373
return (ast->kind >> ZEND_AST_IS_LIST_SHIFT) & 1;
374374
}
375-
static zend_always_inline zend_ast_list *zend_ast_get_list(zend_ast *ast) {
376-
ZEND_ASSERT(zend_ast_is_list(ast));
377-
return (zend_ast_list *) ast;
378-
}
379375

380-
static zend_always_inline zval *zend_ast_get_zval(zend_ast *ast) {
381-
ZEND_ASSERT(ast->kind == ZEND_AST_ZVAL);
382-
return &((zend_ast_zval *) ast)->val;
376+
#if __cplusplus
377+
extern "C++" {
378+
static inline const zend_ast_list *zend_ast_get_list(const zend_ast *ast) {
379+
ZEND_ASSERT(zend_ast_is_list(ast));
380+
return reinterpret_cast<const zend_ast_list *>(ast);
381+
}
382+
static inline zend_ast_list *zend_ast_get_list(zend_ast *ast) {
383+
ZEND_ASSERT(zend_ast_is_list(ast));
384+
return reinterpret_cast<zend_ast_list *>(ast);
385+
}
386+
static inline const zval *zend_ast_get_zval(const zend_ast *ast) {
387+
ZEND_ASSERT(ast->kind == ZEND_AST_ZVAL || ast->kind == ZEND_AST_CONSTANT);
388+
return &reinterpret_cast<const zend_ast_zval *>(ast)->val;
389+
}
390+
static inline zval *zend_ast_get_zval(zend_ast *ast) {
391+
ZEND_ASSERT(ast->kind == ZEND_AST_ZVAL || ast->kind == ZEND_AST_CONSTANT);
392+
return &reinterpret_cast<zend_ast_zval *>(ast)->val;
393+
}
394+
static inline const zend_ast_op_array *zend_ast_get_op_array(const zend_ast *ast) {
395+
ZEND_ASSERT(ast->kind == ZEND_AST_OP_ARRAY);
396+
return reinterpret_cast<const zend_ast_op_array *>(ast);
397+
}
398+
static inline zend_ast_op_array *zend_ast_get_op_array(zend_ast *ast) {
399+
ZEND_ASSERT(ast->kind == ZEND_AST_OP_ARRAY);
400+
return reinterpret_cast<zend_ast_op_array *>(ast);
401+
}
383402
}
384-
static zend_always_inline zend_string *zend_ast_get_str(zend_ast *ast) {
403+
#else
404+
# define zend_ast_get_list(ast) (ZEND_ASSERT(zend_ast_is_list(ast)), _Generic( \
405+
(ast), \
406+
const zend_ast *: ((const zend_ast_list *) ast), \
407+
zend_ast *: ((zend_ast_list *) ast) \
408+
))
409+
410+
# define zend_ast_get_zval(ast) (ZEND_ASSERT((ast)->kind == ZEND_AST_ZVAL || (ast)->kind == ZEND_AST_CONSTANT), _Generic( \
411+
(ast), \
412+
const zend_ast *: (&((const zend_ast_zval *) ast)->val), \
413+
zend_ast *: (&((zend_ast_zval *) ast)->val) \
414+
))
415+
416+
# define zend_ast_get_op_array(ast) (ZEND_ASSERT((ast)->kind == ZEND_AST_OP_ARRAY), _Generic( \
417+
(ast), \
418+
const zend_ast *: ((const zend_ast_op_array *) ast), \
419+
zend_ast *: ((zend_ast_op_array *) ast) \
420+
))
421+
#endif
422+
423+
static zend_always_inline zend_string *zend_ast_get_str(const zend_ast *ast) {
385424
const zval *zv = zend_ast_get_zval(ast);
386425
ZEND_ASSERT(Z_TYPE_P(zv) == IS_STRING);
387426
return Z_STR_P(zv);
388427
}
389428

390-
static zend_always_inline zend_ast_op_array *zend_ast_get_op_array(zend_ast *ast) {
391-
ZEND_ASSERT(ast->kind == ZEND_AST_OP_ARRAY);
392-
return (zend_ast_op_array *) ast;
393-
}
394-
395-
static zend_always_inline zend_string *zend_ast_get_constant_name(zend_ast *ast) {
396-
ZEND_ASSERT(ast->kind == ZEND_AST_CONSTANT);
397-
ZEND_ASSERT(Z_TYPE(((zend_ast_zval *) ast)->val) == IS_STRING);
398-
return Z_STR(((zend_ast_zval *) ast)->val);
429+
static zend_always_inline zend_string *zend_ast_get_constant_name(const zend_ast *ast) {
430+
const zval *zv = zend_ast_get_zval(ast);
431+
ZEND_ASSERT(Z_TYPE_P(zv) == IS_STRING);
432+
return Z_STR_P(zv);
399433
}
400434

401435
static zend_always_inline uint32_t zend_ast_get_num_children(const zend_ast *ast) {

Zend/zend_portability.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,7 @@
9898
# pragma clang diagnostic ignored "-Wassume"
9999
# define ZEND_ASSUME(c) __builtin_assume(c)
100100
#elif defined(PHP_HAVE_BUILTIN_UNREACHABLE) && defined(PHP_HAVE_BUILTIN_EXPECT)
101-
# define ZEND_ASSUME(c) do { \
102-
if (__builtin_expect(!(c), 0)) __builtin_unreachable(); \
103-
} while (0)
101+
# define ZEND_ASSUME(c) ((void)(__builtin_expect(!(c), 0) ? __builtin_unreachable() : (void)false))
104102
#else
105103
# define ZEND_ASSUME(c)
106104
#endif

0 commit comments

Comments
 (0)