@@ -5239,8 +5239,24 @@ void zend_compile_match(znode *result, zend_ast *ast) /* {{{ */
5239
5239
5240
5240
uint32_t num_conds = count_match_conds (arms );
5241
5241
zend_uchar jumptable_type = determine_match_jumptable_type (arms );
5242
+ zend_bool uses_jumptable = jumptable_type != IS_UNDEF && should_use_jumptable (num_conds , jumptable_type );
5242
5243
HashTable * jumptable = NULL ;
5243
- if (jumptable_type != IS_UNDEF && should_use_jumptable (num_conds , jumptable_type )) {
5244
+ uint32_t * jmpnz_opnums = NULL ;
5245
+
5246
+ for (uint32_t i = 0 ; i < arms -> children ; ++ i ) {
5247
+ zend_ast * arm_ast = arms -> child [i ];
5248
+
5249
+ if (!arm_ast -> child [0 ]) {
5250
+ if (has_default_arm ) {
5251
+ CG (zend_lineno ) = arm_ast -> lineno ;
5252
+ zend_error_noreturn (E_COMPILE_ERROR ,
5253
+ "Match expressions may only contain one default arm" );
5254
+ }
5255
+ has_default_arm = 1 ;
5256
+ }
5257
+ }
5258
+
5259
+ if (uses_jumptable ) {
5244
5260
znode jumptable_op ;
5245
5261
5246
5262
ALLOC_HASHTABLE (jumptable );
@@ -5255,53 +5271,51 @@ void zend_compile_match(znode *result, zend_ast *ast) /* {{{ */
5255
5271
Z_TRY_ADDREF_P (CT_CONSTANT (opline -> op1 ));
5256
5272
}
5257
5273
opnum_match = opline - CG (active_op_array )-> opcodes ;
5258
- }
5259
-
5260
- uint32_t cond_count = 0 ;
5261
- uint32_t * jmpnz_opnums = safe_emalloc (sizeof (uint32_t ), num_conds , 0 );
5262
- for (uint32_t i = 0 ; i < arms -> children ; ++ i ) {
5263
- zend_ast * arm_ast = arms -> child [i ];
5274
+ } else {
5275
+ jmpnz_opnums = safe_emalloc (sizeof (uint32_t ), num_conds , 0 );
5276
+ int cond_count = 0 ;
5277
+ for (uint32_t i = 0 ; i < arms -> children ; ++ i ) {
5278
+ zend_ast * arm_ast = arms -> child [i ];
5264
5279
5265
- if (!arm_ast -> child [0 ]) {
5266
- if (has_default_arm ) {
5267
- CG (zend_lineno ) = arm_ast -> lineno ;
5268
- zend_error_noreturn (E_COMPILE_ERROR ,
5269
- "Match expressions may only contain one default arm" );
5280
+ if (!arm_ast -> child [0 ]) {
5281
+ continue ;
5270
5282
}
5271
- has_default_arm = 1 ;
5272
- continue ;
5273
- }
5274
5283
5275
- zend_ast_list * conds = zend_ast_get_list (arm_ast -> child [0 ]);
5276
- for (uint32_t j = 0 ; j < conds -> children ; j ++ ) {
5277
- zend_ast * cond_ast = conds -> child [j ];
5284
+ zend_ast_list * conds = zend_ast_get_list (arm_ast -> child [0 ]);
5285
+ for (uint32_t j = 0 ; j < conds -> children ; j ++ ) {
5286
+ zend_ast * cond_ast = conds -> child [j ];
5278
5287
5279
- znode cond_node ;
5280
- zend_compile_expr (& cond_node , cond_ast );
5288
+ znode cond_node ;
5289
+ zend_compile_expr (& cond_node , cond_ast );
5281
5290
5282
- if (expr_node .op_type == IS_CONST
5283
- && Z_TYPE (expr_node .u .constant ) == IS_FALSE ) {
5284
- jmpnz_opnums [cond_count ] = zend_emit_cond_jump (ZEND_JMPZ , & cond_node , 0 );
5285
- } else if (expr_node .op_type == IS_CONST
5286
- && Z_TYPE (expr_node .u .constant ) == IS_TRUE ) {
5287
- jmpnz_opnums [cond_count ] = zend_emit_cond_jump (ZEND_JMPNZ , & cond_node , 0 );
5288
- } else {
5289
- zend_op * opline = zend_emit_op (NULL , ZEND_IS_IDENTICAL , & expr_node , & cond_node );
5290
- SET_NODE (opline -> result , & case_node );
5291
- if (opline -> op1_type == IS_CONST ) {
5292
- Z_TRY_ADDREF_P (CT_CONSTANT (opline -> op1 ));
5291
+ if (expr_node .op_type == IS_CONST
5292
+ && Z_TYPE (expr_node .u .constant ) == IS_FALSE ) {
5293
+ jmpnz_opnums [cond_count ] = zend_emit_cond_jump (ZEND_JMPZ , & cond_node , 0 );
5294
+ } else if (expr_node .op_type == IS_CONST
5295
+ && Z_TYPE (expr_node .u .constant ) == IS_TRUE ) {
5296
+ jmpnz_opnums [cond_count ] = zend_emit_cond_jump (ZEND_JMPNZ , & cond_node , 0 );
5297
+ } else {
5298
+ zend_op * opline = zend_emit_op (NULL , ZEND_IS_IDENTICAL , & expr_node , & cond_node );
5299
+ SET_NODE (opline -> result , & case_node );
5300
+ if (opline -> op1_type == IS_CONST ) {
5301
+ Z_TRY_ADDREF_P (CT_CONSTANT (opline -> op1 ));
5302
+ }
5303
+
5304
+ jmpnz_opnums [cond_count ] = zend_emit_cond_jump (ZEND_JMPNZ , & case_node , 0 );
5293
5305
}
5294
5306
5295
- jmpnz_opnums [ cond_count ] = zend_emit_cond_jump ( ZEND_JMPNZ , & case_node , 0 ) ;
5307
+ cond_count ++ ;
5296
5308
}
5297
-
5298
- cond_count ++ ;
5299
5309
}
5300
5310
}
5301
5311
5302
- uint32_t opnum_default_jmp = zend_emit_jump (0 );
5312
+ uint32_t opnum_default_jmp = 0 ;
5313
+ if (!uses_jumptable ) {
5314
+ opnum_default_jmp = zend_emit_jump (0 );
5315
+ }
5316
+
5303
5317
zend_bool is_first_case = 1 ;
5304
- cond_count = 0 ;
5318
+ uint32_t cond_count = 0 ;
5305
5319
5306
5320
for (uint32_t i = 0 ; i < arms -> children ; ++ i ) {
5307
5321
zend_ast * arm_ast = arms -> child [i ];
@@ -5312,7 +5326,10 @@ void zend_compile_match(znode *result, zend_ast *ast) /* {{{ */
5312
5326
5313
5327
for (uint32_t j = 0 ; j < conds -> children ; j ++ ) {
5314
5328
zend_ast * cond_ast = conds -> child [j ];
5315
- zend_update_jump_target_to_next (jmpnz_opnums [cond_count ]);
5329
+
5330
+ if (jmpnz_opnums != NULL ) {
5331
+ zend_update_jump_target_to_next (jmpnz_opnums [cond_count ]);
5332
+ }
5316
5333
5317
5334
if (jumptable ) {
5318
5335
zval * cond_zv = zend_ast_get_zval (cond_ast );
@@ -5331,7 +5348,9 @@ void zend_compile_match(znode *result, zend_ast *ast) /* {{{ */
5331
5348
cond_count ++ ;
5332
5349
}
5333
5350
} else {
5334
- zend_update_jump_target_to_next (opnum_default_jmp );
5351
+ if (!uses_jumptable ) {
5352
+ zend_update_jump_target_to_next (opnum_default_jmp );
5353
+ }
5335
5354
5336
5355
if (jumptable ) {
5337
5356
ZEND_ASSERT (opnum_match != (uint32_t )-1 );
@@ -5364,7 +5383,9 @@ void zend_compile_match(znode *result, zend_ast *ast) /* {{{ */
5364
5383
}
5365
5384
5366
5385
if (!has_default_arm ) {
5367
- zend_update_jump_target_to_next (opnum_default_jmp );
5386
+ if (!uses_jumptable ) {
5387
+ zend_update_jump_target_to_next (opnum_default_jmp );
5388
+ }
5368
5389
5369
5390
if (jumptable ) {
5370
5391
zend_op * opline = & CG (active_op_array )-> opcodes [opnum_match ];
@@ -5392,7 +5413,9 @@ void zend_compile_match(znode *result, zend_ast *ast) /* {{{ */
5392
5413
zval_ptr_dtor_nogc (& expr_node .u .constant );
5393
5414
}
5394
5415
5395
- efree (jmpnz_opnums );
5416
+ if (jmpnz_opnums != NULL ) {
5417
+ efree (jmpnz_opnums );
5418
+ }
5396
5419
}
5397
5420
/* }}} */
5398
5421
0 commit comments