@@ -7034,6 +7034,49 @@ static void zend_pm_compile_range(zend_ast *ast, znode *result, znode *expr_node
70347034 }
70357035}
70367036
7037+ static void zend_pm_compile_comparison (zend_ast * ast , znode * result , znode * expr_node , bool consume_expr , uint32_t false_opnum , zend_pm_context * context )
7038+ {
7039+ zend_op * opline ;
7040+
7041+ uint32_t false_label = consume_expr ? zend_pm_label_create (context ) : false_opnum ;
7042+
7043+ opline = zend_emit_op_tmp (NULL , ZEND_IS_NUMERIC , expr_node , NULL );
7044+ SET_NODE (opline -> result , result );
7045+ zend_pm_emit_jmpz_ex (result , false_label );
7046+
7047+ znode expr_node_copy ;
7048+ zend_pm_copy_tmp (& expr_node_copy , expr_node , false);
7049+
7050+ zend_ast * const_ast = ast -> child [0 ];
7051+ znode const_node ;
7052+ const_node .op_type = IS_CONST ;
7053+ ZVAL_COPY (& const_node .u .constant , zend_ast_get_zval (const_ast ));
7054+
7055+ switch (ast -> attr ) {
7056+ case ZEND_COMPARISON_PATTERN_SMALLER :
7057+ opline = zend_emit_op_tmp (NULL , ZEND_IS_SMALLER , & expr_node_copy , & const_node );
7058+ break ;
7059+ case ZEND_COMPARISON_PATTERN_SMALLER_OR_EQUAL :
7060+ opline = zend_emit_op_tmp (NULL , ZEND_IS_SMALLER_OR_EQUAL , & expr_node_copy , & const_node );
7061+ break ;
7062+ case ZEND_COMPARISON_PATTERN_GREATER :
7063+ opline = zend_emit_op_tmp (NULL , ZEND_IS_SMALLER , & const_node , & expr_node_copy );
7064+ break ;
7065+ case ZEND_COMPARISON_PATTERN_GREATER_OR_EQUAL :
7066+ opline = zend_emit_op_tmp (NULL , ZEND_IS_SMALLER_OR_EQUAL , & const_node , & expr_node_copy );
7067+ break ;
7068+ EMPTY_SWITCH_DEFAULT_CASE ();
7069+ }
7070+ SET_NODE (opline -> result , result );
7071+ zend_pm_emit_jmpz_ex (result , false_label );
7072+
7073+ if (consume_expr ) {
7074+ zend_pm_label_set_next (context , false_label );
7075+ zend_emit_op (NULL , ZEND_FREE , expr_node , NULL );
7076+ zend_pm_emit_jmpz_ex (result , false_opnum );
7077+ }
7078+ }
7079+
70377080static void zend_compile_pattern (zend_ast * ast , znode * result , znode * expr_node , bool consume_expr , uint32_t false_opnum , zend_pm_context * context )
70387081{
70397082 bool create_label = false_opnum == (uint32_t )-1 ;
@@ -7069,6 +7112,9 @@ static void zend_compile_pattern(zend_ast *ast, znode *result, znode *expr_node,
70697112 case ZEND_AST_RANGE_INCLUSIVE :
70707113 zend_pm_compile_range (ast , result , expr_node , consume_expr , false_opnum , context , true);
70717114 break ;
7115+ case ZEND_AST_COMPARISON_PATTERN :
7116+ zend_pm_compile_comparison (ast , result , expr_node , consume_expr , false_opnum , context );
7117+ break ;
70727118 EMPTY_SWITCH_DEFAULT_CASE ();
70737119 }
70747120
0 commit comments