From 65afc5fbe53b56dff54b0ccf51a747ce1d561534 Mon Sep 17 00:00:00 2001 From: Sara Golemon Date: Wed, 13 Jun 2018 23:55:26 -0400 Subject: [PATCH 1/2] Implement strict switch --- Zend/tests/switch-strict.phpt | 31 +++++++++++++++++++++++++++++++ Zend/zend_compile.c | 14 +++++++++----- Zend/zend_language_parser.y | 8 ++++++++ 3 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 Zend/tests/switch-strict.phpt diff --git a/Zend/tests/switch-strict.phpt b/Zend/tests/switch-strict.phpt new file mode 100644 index 0000000000000..4fd53b3a315d5 --- /dev/null +++ b/Zend/tests/switch-strict.phpt @@ -0,0 +1,31 @@ +--TEST-- +Strict switch cases +--FILE-- +attr + && expr_node.op_type == IS_CONST && Z_TYPE(expr_node.u.constant) == IS_FALSE) { jmpnz_opnums[i] = zend_emit_cond_jump(ZEND_JMPZ, &cond_node, 0); - } else if (expr_node.op_type == IS_CONST + } else if (!case_ast->attr + && expr_node.op_type == IS_CONST && Z_TYPE(expr_node.u.constant) == IS_TRUE) { jmpnz_opnums[i] = zend_emit_cond_jump(ZEND_JMPNZ, &cond_node, 0); } else { - opline = zend_emit_op(NULL, - (expr_node.op_type & (IS_VAR|IS_TMP_VAR)) ? ZEND_CASE : ZEND_IS_EQUAL, - &expr_node, &cond_node); + zend_uchar equality_op = case_ast->attr; + if (!equality_op) { + equality_op = (expr_node.op_type & (IS_VAR|IS_TMP_VAR)) ? ZEND_CASE : ZEND_IS_EQUAL; + } + opline = zend_emit_op(NULL, equality_op, &expr_node, &cond_node); SET_NODE(opline->result, &case_node); if (opline->op1_type == IS_CONST) { Z_TRY_ADDREF_P(CT_CONSTANT(opline->op1)); diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 2776426feb104..4652b7a8ab04a 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -579,6 +579,14 @@ case_list: /* empty */ { $$ = zend_ast_create_list(0, ZEND_AST_SWITCH_LIST); } | case_list T_CASE expr case_separator inner_statement_list { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_SWITCH_CASE, $3, $5)); } + | case_list T_CASE T_IS_EQUAL expr case_separator inner_statement_list + { zend_ast *case_ast = zend_ast_create(ZEND_AST_SWITCH_CASE, $4, $6); + case_ast->attr = ZEND_IS_EQUAL; + $$ = zend_ast_list_add($1, case_ast); } + | case_list T_CASE T_IS_IDENTICAL expr case_separator inner_statement_list + { zend_ast *case_ast = zend_ast_create(ZEND_AST_SWITCH_CASE, $4, $6); + case_ast->attr = ZEND_IS_IDENTICAL; + $$ = zend_ast_list_add($1, case_ast); } | case_list T_DEFAULT case_separator inner_statement_list { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_SWITCH_CASE, NULL, $4)); } ; From 8175c7326b5aef208fd18c4438813f253d9f81ec Mon Sep 17 00:00:00 2001 From: Sara Golemon Date: Thu, 14 Jun 2018 00:45:11 -0400 Subject: [PATCH 2/2] Add a positive case to the tests --- Zend/tests/switch-strict.phpt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Zend/tests/switch-strict.phpt b/Zend/tests/switch-strict.phpt index 4fd53b3a315d5..739e8fe68343f 100644 --- a/Zend/tests/switch-strict.phpt +++ b/Zend/tests/switch-strict.phpt @@ -26,6 +26,16 @@ switch ($a) { default: echo "Default\n"; } + +switch ($a) { + case === 123: + echo "Should match\n"; + break; + default: + echo "Default\n"; +} + --EXPECT-- Should match Should match +Should match