diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index 24b77d7d3493..0a60976e7c6f 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -372,30 +372,64 @@ static zend_always_inline bool zend_ast_is_decl(const zend_ast *ast) { static zend_always_inline bool zend_ast_is_list(const zend_ast *ast) { return (ast->kind >> ZEND_AST_IS_LIST_SHIFT) & 1; } -static zend_always_inline zend_ast_list *zend_ast_get_list(zend_ast *ast) { - ZEND_ASSERT(zend_ast_is_list(ast)); - return (zend_ast_list *) ast; -} -static zend_always_inline zval *zend_ast_get_zval(zend_ast *ast) { - ZEND_ASSERT(ast->kind == ZEND_AST_ZVAL); - return &((zend_ast_zval *) ast)->val; +#if __cplusplus +extern "C++" { + static inline const zend_ast_list *zend_ast_get_list(const zend_ast *ast) { + ZEND_ASSERT(zend_ast_is_list(ast)); + return reinterpret_cast(ast); + } + static inline zend_ast_list *zend_ast_get_list(zend_ast *ast) { + ZEND_ASSERT(zend_ast_is_list(ast)); + return reinterpret_cast(ast); + } + static inline const zval *zend_ast_get_zval(const zend_ast *ast) { + ZEND_ASSERT(ast->kind == ZEND_AST_ZVAL || ast->kind == ZEND_AST_CONSTANT); + return &reinterpret_cast(ast)->val; + } + static inline zval *zend_ast_get_zval(zend_ast *ast) { + ZEND_ASSERT(ast->kind == ZEND_AST_ZVAL || ast->kind == ZEND_AST_CONSTANT); + return &reinterpret_cast(ast)->val; + } + static inline const zend_ast_op_array *zend_ast_get_op_array(const zend_ast *ast) { + ZEND_ASSERT(ast->kind == ZEND_AST_OP_ARRAY); + return reinterpret_cast(ast); + } + static inline zend_ast_op_array *zend_ast_get_op_array(zend_ast *ast) { + ZEND_ASSERT(ast->kind == ZEND_AST_OP_ARRAY); + return reinterpret_cast(ast); + } } -static zend_always_inline zend_string *zend_ast_get_str(zend_ast *ast) { +#else +# define zend_ast_get_list(ast) (ZEND_ASSERT(zend_ast_is_list(ast)), _Generic( \ + (ast), \ + const zend_ast *: ((const zend_ast_list *) ast), \ + zend_ast *: ((zend_ast_list *) ast) \ + )) + +# define zend_ast_get_zval(ast) (ZEND_ASSERT((ast)->kind == ZEND_AST_ZVAL || (ast)->kind == ZEND_AST_CONSTANT), _Generic( \ + (ast), \ + const zend_ast *: (&((const zend_ast_zval *) ast)->val), \ + zend_ast *: (&((zend_ast_zval *) ast)->val) \ + )) + +# define zend_ast_get_op_array(ast) (ZEND_ASSERT((ast)->kind == ZEND_AST_OP_ARRAY), _Generic( \ + (ast), \ + const zend_ast *: ((const zend_ast_op_array *) ast), \ + zend_ast *: ((zend_ast_op_array *) ast) \ + )) +#endif + +static zend_always_inline zend_string *zend_ast_get_str(const zend_ast *ast) { const zval *zv = zend_ast_get_zval(ast); ZEND_ASSERT(Z_TYPE_P(zv) == IS_STRING); return Z_STR_P(zv); } -static zend_always_inline zend_ast_op_array *zend_ast_get_op_array(zend_ast *ast) { - ZEND_ASSERT(ast->kind == ZEND_AST_OP_ARRAY); - return (zend_ast_op_array *) ast; -} - -static zend_always_inline zend_string *zend_ast_get_constant_name(zend_ast *ast) { - ZEND_ASSERT(ast->kind == ZEND_AST_CONSTANT); - ZEND_ASSERT(Z_TYPE(((zend_ast_zval *) ast)->val) == IS_STRING); - return Z_STR(((zend_ast_zval *) ast)->val); +static zend_always_inline zend_string *zend_ast_get_constant_name(const zend_ast *ast) { + const zval *zv = zend_ast_get_zval(ast); + ZEND_ASSERT(Z_TYPE_P(zv) == IS_STRING); + return Z_STR_P(zv); } static zend_always_inline uint32_t zend_ast_get_num_children(const zend_ast *ast) { diff --git a/Zend/zend_portability.h b/Zend/zend_portability.h index ccad24682fdb..73c0e07a28c9 100644 --- a/Zend/zend_portability.h +++ b/Zend/zend_portability.h @@ -98,9 +98,7 @@ # pragma clang diagnostic ignored "-Wassume" # define ZEND_ASSUME(c) __builtin_assume(c) #elif defined(PHP_HAVE_BUILTIN_UNREACHABLE) && defined(PHP_HAVE_BUILTIN_EXPECT) -# define ZEND_ASSUME(c) do { \ - if (__builtin_expect(!(c), 0)) __builtin_unreachable(); \ - } while (0) +# define ZEND_ASSUME(c) ((void)(__builtin_expect(!(c), 0) ? __builtin_unreachable() : (void)false)) #else # define ZEND_ASSUME(c) #endif