Skip to content

Commit 6488bc8

Browse files
committed
Use AST_BINARY_OP instead of AST_GREATER(_EQUAL)
Version 20
1 parent 00ab923 commit 6488bc8

File tree

4 files changed

+65
-5
lines changed

4 files changed

+65
-5
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,8 @@ ast\flags\BINARY_IS_EQUAL
225225
ast\flags\BINARY_IS_NOT_EQUAL
226226
ast\flags\BINARY_IS_SMALLER
227227
ast\flags\BINARY_IS_SMALLER_OR_EQUAL
228+
ast\flags\BINARY_IS_GREATER // since version 20
229+
ast\flags\BINARY_IS_GREATER_OR_EQUAL // since version 20
228230
ast\flags\BINARY_SPACESHIP
229231
230232
// Used by ast\AST_ASSIGN_OP (exclusive)

ast.c

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@
3232

3333
#define AST_DEFAULT_VERSION 10
3434

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+
3539
static inline void ast_update_property(zval *object, zend_string *name, zval *value, void **cache_slot) {
3640
zval name_zv;
3741
ZVAL_STR(&name_zv, name);
@@ -161,7 +165,7 @@ static void ast_create_virtual_node(zval *zv, zend_ast_kind kind, zend_ast *ast)
161165
zend_hash_next_index_insert(Z_ARRVAL(tmp_zv), &tmp_zv2);
162166
}
163167

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) {
165169
zval tmp_zv;
166170
zend_bool is_decl;
167171

@@ -175,6 +179,14 @@ static void ast_to_zval(zval *zv, zend_ast *ast) {
175179
return;
176180
}
177181

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+
178190
is_decl = ast_kind_is_decl(ast->kind);
179191
object_init_ex(zv, is_decl ? ast_decl_ce : ast_node_ce);
180192

@@ -239,7 +251,7 @@ static void ast_to_zval(zval *zv, zend_ast *ast) {
239251
} else if (ast->kind == ZEND_AST_CLOSURE_USES) {
240252
ast_create_virtual_node(&child_zv, AST_CLOSURE_VAR, child);
241253
} else {
242-
ast_to_zval(&child_zv, child);
254+
ast_to_zval(&child_zv, child, version);
243255
}
244256

245257
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) {
248260
}
249261

250262
static int ast_check_version(zend_long version) {
251-
if (version == 10) {
263+
if (version == 10 || version == 20) {
252264
return SUCCESS;
253265
}
254266

@@ -293,7 +305,7 @@ PHP_FUNCTION(parse_file) {
293305
return;
294306
}
295307

296-
ast_to_zval(return_value, ast);
308+
ast_to_zval(return_value, ast, version);
297309

298310
zend_string_free(code);
299311
zend_ast_destroy(ast);
@@ -319,7 +331,7 @@ PHP_FUNCTION(parse_code) {
319331
return;
320332
}
321333

322-
ast_to_zval(return_value, ast);
334+
ast_to_zval(return_value, ast, version);
323335

324336
zend_ast_destroy(ast);
325337
zend_arena_destroy(arena);
@@ -455,6 +467,8 @@ PHP_MINIT_FUNCTION(ast) {
455467
ast_register_flag_constant("BINARY_IS_NOT_EQUAL", ZEND_IS_NOT_EQUAL);
456468
ast_register_flag_constant("BINARY_IS_SMALLER", ZEND_IS_SMALLER);
457469
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);
458472
ast_register_flag_constant("BINARY_SPACESHIP", ZEND_SPACESHIP);
459473

460474
ast_register_flag_constant("ASSIGN_BITWISE_OR", ZEND_ASSIGN_BW_OR);

tests/binop_greater.phpt

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
--TEST--
2+
AST_GREATER(_EQUAL) converted to AST_BINARY_OP
3+
--FILE--
4+
<?php
5+
6+
require __DIR__ . '/../util.php';
7+
8+
$code = <<<'PHP'
9+
<?php
10+
$a > $b;
11+
$a >= $b;
12+
PHP;
13+
14+
echo ast_dump(ast\parse_code($code, $version=10)), "\n";
15+
echo ast_dump(ast\parse_code($code, $version=20)), "\n";
16+
17+
?>
18+
--EXPECT--
19+
AST_STMT_LIST
20+
0: AST_GREATER
21+
0: AST_VAR
22+
0: "a"
23+
1: AST_VAR
24+
0: "b"
25+
1: AST_GREATER_EQUAL
26+
0: AST_VAR
27+
0: "a"
28+
1: AST_VAR
29+
0: "b"
30+
AST_STMT_LIST
31+
0: AST_BINARY_OP
32+
flags: BINARY_IS_GREATER (256)
33+
0: AST_VAR
34+
0: "a"
35+
1: AST_VAR
36+
0: "b"
37+
1: AST_BINARY_OP
38+
flags: BINARY_IS_GREATER_OR_EQUAL (257)
39+
0: AST_VAR
40+
0: "a"
41+
1: AST_VAR
42+
0: "b"

util.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ function get_flag_info() : array {
7777
flags\BINARY_IS_NOT_EQUAL => 'BINARY_IS_NOT_EQUAL',
7878
flags\BINARY_IS_SMALLER => 'BINARY_IS_SMALLER',
7979
flags\BINARY_IS_SMALLER_OR_EQUAL => 'BINARY_IS_SMALLER_OR_EQUAL',
80+
flags\BINARY_IS_GREATER => 'BINARY_IS_GREATER',
81+
flags\BINARY_IS_GREATER_OR_EQUAL => 'BINARY_IS_GREATER_OR_EQUAL',
8082
flags\BINARY_SPACESHIP => 'BINARY_SPACESHIP',
8183
],
8284
ast\AST_ASSIGN_OP => [

0 commit comments

Comments
 (0)