@@ -388,6 +388,58 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) {
388
388
}
389
389
}
390
390
break ;
391
+
392
+ #if ZEND_EXTENSION_API_NO >= PHP_5_5_X_API_NO
393
+ case ZEND_FETCH_R :
394
+ case ZEND_FETCH_W :
395
+ case ZEND_FETCH_RW :
396
+ case ZEND_FETCH_FUNC_ARG :
397
+ case ZEND_FETCH_IS :
398
+ case ZEND_FETCH_UNSET :
399
+ if (opline != op_array -> opcodes &&
400
+ (opline - 1 )-> opcode == ZEND_BEGIN_SILENCE &&
401
+ (opline -> extended_value & ZEND_FETCH_TYPE_MASK ) == ZEND_FETCH_LOCAL &&
402
+ opline -> op1_type == IS_CONST &&
403
+ opline -> op2_type == IS_UNUSED &&
404
+ Z_TYPE (ZEND_OP1_LITERAL (opline )) == IS_STRING &&
405
+ (Z_STRLEN (ZEND_OP1_LITERAL (opline )) != sizeof ("this" )- 1 ||
406
+ memcmp (Z_STRVAL (ZEND_OP1_LITERAL (opline )), "this" , sizeof ("this" )) != 0 )) {
407
+
408
+ int var = opline -> result .var ;
409
+ int level = 0 ;
410
+ zend_op * op = opline + 1 ;
411
+
412
+ while (op < end ) {
413
+ if (op -> opcode == ZEND_BEGIN_SILENCE ) {
414
+ level ++ ;
415
+ } else if (op -> opcode == ZEND_END_SILENCE ) {
416
+ if (level == 0 ) {
417
+ break ;
418
+ } else {
419
+ level -- ;
420
+ }
421
+ }
422
+ if (op -> op1_type == IS_VAR && op -> op1 .var == var ) {
423
+ op -> op1_type = IS_CV ;
424
+ op -> op1 .var = zend_optimizer_lookup_cv (op_array ,
425
+ Z_STRVAL (ZEND_OP1_LITERAL (opline )),
426
+ Z_STRLEN (ZEND_OP1_LITERAL (opline )));
427
+ MAKE_NOP (opline );
428
+ break ;
429
+ } else if (op -> op2_type == IS_VAR && op -> op2 .var == var ) {
430
+ op -> op2_type = IS_CV ;
431
+ op -> op2 .var = zend_optimizer_lookup_cv (op_array ,
432
+ Z_STRVAL (ZEND_OP1_LITERAL (opline )),
433
+ Z_STRLEN (ZEND_OP1_LITERAL (opline )));
434
+ MAKE_NOP (opline );
435
+ break ;
436
+ }
437
+ op ++ ;
438
+ }
439
+ }
440
+ break ;
441
+ #endif
442
+
391
443
}
392
444
opline ++ ;
393
445
i ++ ;
0 commit comments