32
32
33
33
#define AST_DEFAULT_VERSION 10
34
34
35
+ /* Flag for BINARY_OP to use instead of AST_GREATER(_EQUAL) */
36
+ #define AST_BINARY_IS_GREATER 256
37
+ #define AST_BINARY_IS_GREATER_OR_EQUAL 257
38
+
35
39
static inline void ast_update_property (zval * object , zend_string * name , zval * value , void * * cache_slot ) {
36
40
zval name_zv ;
37
41
ZVAL_STR (& name_zv , name );
@@ -161,7 +165,7 @@ static void ast_create_virtual_node(zval *zv, zend_ast_kind kind, zend_ast *ast)
161
165
zend_hash_next_index_insert (Z_ARRVAL (tmp_zv ), & tmp_zv2 );
162
166
}
163
167
164
- static void ast_to_zval (zval * zv , zend_ast * ast ) {
168
+ static void ast_to_zval (zval * zv , zend_ast * ast , zend_long version ) {
165
169
zval tmp_zv ;
166
170
zend_bool is_decl ;
167
171
@@ -175,6 +179,14 @@ static void ast_to_zval(zval *zv, zend_ast *ast) {
175
179
return ;
176
180
}
177
181
182
+ if (version >= 20 ) {
183
+ if (ast -> kind == ZEND_AST_GREATER || ast -> kind == ZEND_AST_GREATER_EQUAL ) {
184
+ ast -> attr = ast -> kind == ZEND_AST_GREATER
185
+ ? AST_BINARY_IS_GREATER : AST_BINARY_IS_GREATER_OR_EQUAL ;
186
+ ast -> kind = ZEND_AST_BINARY_OP ;
187
+ }
188
+ }
189
+
178
190
is_decl = ast_kind_is_decl (ast -> kind );
179
191
object_init_ex (zv , is_decl ? ast_decl_ce : ast_node_ce );
180
192
@@ -239,7 +251,7 @@ static void ast_to_zval(zval *zv, zend_ast *ast) {
239
251
} else if (ast -> kind == ZEND_AST_CLOSURE_USES ) {
240
252
ast_create_virtual_node (& child_zv , AST_CLOSURE_VAR , child );
241
253
} else {
242
- ast_to_zval (& child_zv , child );
254
+ ast_to_zval (& child_zv , child , version );
243
255
}
244
256
245
257
zend_hash_next_index_insert (Z_ARRVAL (tmp_zv ), & child_zv );
@@ -248,7 +260,7 @@ static void ast_to_zval(zval *zv, zend_ast *ast) {
248
260
}
249
261
250
262
static int ast_check_version (zend_long version ) {
251
- if (version == 10 ) {
263
+ if (version == 10 || version == 20 ) {
252
264
return SUCCESS ;
253
265
}
254
266
@@ -293,7 +305,7 @@ PHP_FUNCTION(parse_file) {
293
305
return ;
294
306
}
295
307
296
- ast_to_zval (return_value , ast );
308
+ ast_to_zval (return_value , ast , version );
297
309
298
310
zend_string_free (code );
299
311
zend_ast_destroy (ast );
@@ -319,7 +331,7 @@ PHP_FUNCTION(parse_code) {
319
331
return ;
320
332
}
321
333
322
- ast_to_zval (return_value , ast );
334
+ ast_to_zval (return_value , ast , version );
323
335
324
336
zend_ast_destroy (ast );
325
337
zend_arena_destroy (arena );
@@ -455,6 +467,8 @@ PHP_MINIT_FUNCTION(ast) {
455
467
ast_register_flag_constant ("BINARY_IS_NOT_EQUAL" , ZEND_IS_NOT_EQUAL );
456
468
ast_register_flag_constant ("BINARY_IS_SMALLER" , ZEND_IS_SMALLER );
457
469
ast_register_flag_constant ("BINARY_IS_SMALLER_OR_EQUAL" , ZEND_IS_SMALLER_OR_EQUAL );
470
+ ast_register_flag_constant ("BINARY_IS_GREATER" , AST_BINARY_IS_GREATER );
471
+ ast_register_flag_constant ("BINARY_IS_GREATER_OR_EQUAL" , AST_BINARY_IS_GREATER_OR_EQUAL );
458
472
ast_register_flag_constant ("BINARY_SPACESHIP" , ZEND_SPACESHIP );
459
473
460
474
ast_register_flag_constant ("ASSIGN_BITWISE_OR" , ZEND_ASSIGN_BW_OR );
0 commit comments