Skip to content

Commit a1f0b7a

Browse files
committed
Add ??? operator
1 parent 2602083 commit a1f0b7a

File tree

8 files changed

+4848
-4810
lines changed

8 files changed

+4848
-4810
lines changed

Zend/zend_ast.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,7 @@ ZEND_API void zend_ast_apply(zend_ast *ast, zend_ast_apply_func fn) {
573573
* 90 right = += -= *= /= .= %= &= |= ^= <<= >>= **=
574574
* 100 left ? :
575575
* 110 right ??
576+
* 115 right ???
576577
* 120 left ||
577578
* 130 left &&
578579
* 140 left |
@@ -1426,6 +1427,7 @@ static void zend_ast_export_ex(smart_str *str, zend_ast *ast, int priority, int
14261427
case ZEND_AST_YIELD_FROM:
14271428
PREFIX_OP("yield from ", 85, 86);
14281429
case ZEND_AST_COALESCE: BINARY_OP(" ?? ", 110, 111, 110);
1430+
case ZEND_AST_EXCEPTION_COALESCE: BINARY_OP(" ??? ", 110, 111, 110);
14291431
case ZEND_AST_STATIC:
14301432
smart_str_appends(str, "static $");
14311433
zend_ast_export_name(str, ast->child[0], 0, indent);

Zend/zend_ast.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ enum _zend_ast_kind {
115115
ZEND_AST_INSTANCEOF,
116116
ZEND_AST_YIELD,
117117
ZEND_AST_COALESCE,
118+
ZEND_AST_EXCEPTION_COALESCE,
118119

119120
ZEND_AST_STATIC,
120121
ZEND_AST_WHILE,

Zend/zend_compile.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7313,6 +7313,21 @@ void zend_compile_coalesce(znode *result, zend_ast *ast) /* {{{ */
73137313
}
73147314
/* }}} */
73157315

7316+
void zend_compile_exception_coalesce(znode *result, zend_ast *ast) /* {{{ */
7317+
{
7318+
zend_ast *expr_ast = ast->child[0];
7319+
zend_ast *default_ast = ast->child[1];
7320+
7321+
zend_ast *hack = zend_ast_create_ex(ZEND_AST_INCLUDE_OR_EVAL, ZEND_EVAL,
7322+
zend_ast_create_zval_from_str(
7323+
zend_ast_export("try { return ", expr_ast, "; } catch(\\Throwable $e) {}")));
7324+
7325+
ast->child[0] = hack;
7326+
7327+
zend_compile_coalesce(result, ast);
7328+
}
7329+
/* }}} */
7330+
73167331
void zend_compile_print(znode *result, zend_ast *ast) /* {{{ */
73177332
{
73187333
zend_op *opline;
@@ -8266,6 +8281,9 @@ void zend_compile_expr(znode *result, zend_ast *ast) /* {{{ */
82668281
case ZEND_AST_COALESCE:
82678282
zend_compile_coalesce(result, ast);
82688283
return;
8284+
case ZEND_AST_EXCEPTION_COALESCE:
8285+
zend_compile_exception_coalesce(result, ast);
8286+
return;
82698287
case ZEND_AST_PRINT:
82708288
zend_compile_print(result, ast);
82718289
return;

Zend/zend_language_parser.y

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
6464
%left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL T_POW_EQUAL
6565
%left '?' ':'
6666
%right T_COALESCE
67+
%right T_EXCEPTION_COALESCE
6768
%left T_BOOLEAN_OR
6869
%left T_BOOLEAN_AND
6970
%left '|'
@@ -219,6 +220,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
219220
%token T_NS_SEPARATOR "\\ (T_NS_SEPARATOR)"
220221
%token T_ELLIPSIS "... (T_ELLIPSIS)"
221222
%token T_COALESCE "?? (T_COALESCE)"
223+
%token T_EXCEPTION_COALESCE "??? (T_EXCEPTION_COALESCE)"
222224
%token T_POW "** (T_POW)"
223225
%token T_POW_EQUAL "**= (T_POW_EQUAL)"
224226

@@ -961,6 +963,8 @@ expr_without_variable:
961963
{ $$ = zend_ast_create(ZEND_AST_CONDITIONAL, $1, NULL, $4); }
962964
| expr T_COALESCE expr
963965
{ $$ = zend_ast_create(ZEND_AST_COALESCE, $1, $3); }
966+
| expr T_EXCEPTION_COALESCE expr
967+
{ $$ = zend_ast_create(ZEND_AST_EXCEPTION_COALESCE, $1, $3); }
964968
| internal_functions_in_yacc { $$ = $1; }
965969
| T_INT_CAST expr { $$ = zend_ast_create_cast(IS_LONG, $2); }
966970
| T_DOUBLE_CAST expr { $$ = zend_ast_create_cast(IS_DOUBLE, $2); }

0 commit comments

Comments
 (0)