@@ -8290,7 +8290,9 @@ ZEND_VM_COLD_CONST_HANDLER(121, ZEND_STRLEN, CONST|TMPVAR|CV, ANY)
8290
8290
value = GET_OP1_ZVAL_PTR_UNDEF (BP_VAR_R );
8291
8291
if (EXPECTED (Z_TYPE_P (value ) == IS_STRING )) {
8292
8292
ZVAL_LONG (EX_VAR (opline -> result .var ), Z_STRLEN_P (value ));
8293
- FREE_OP1 ();
8293
+ if (OP1_TYPE & (IS_TMP_VAR |IS_VAR )) {
8294
+ zval_ptr_dtor_str (value );
8295
+ }
8294
8296
ZEND_VM_NEXT_OPCODE ();
8295
8297
} else {
8296
8298
bool strict ;
@@ -8901,33 +8903,69 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(189, ZEND_IN_ARRAY, CONST|TMP|VAR|CV, CONST, NUM
8901
8903
HashTable * ht = Z_ARRVAL_P (RT_CONSTANT (opline , opline -> op2 ));
8902
8904
zval * result ;
8903
8905
8904
- SAVE_OPLINE ();
8905
- op1 = GET_OP1_ZVAL_PTR_DEREF (BP_VAR_R );
8906
+ op1 = GET_OP1_ZVAL_PTR_UNDEF (BP_VAR_R );
8906
8907
if (EXPECTED (Z_TYPE_P (op1 ) == IS_STRING )) {
8907
8908
result = zend_hash_find_ex (ht , Z_STR_P (op1 ), OP1_TYPE == IS_CONST );
8908
- } else if (opline -> extended_value ) {
8909
+ if (OP1_TYPE & (IS_TMP_VAR |IS_VAR )) {
8910
+ zval_ptr_dtor_str (op1 );
8911
+ }
8912
+ ZEND_VM_SMART_BRANCH (result , 0 );
8913
+ }
8914
+
8915
+ if (opline -> extended_value ) {
8909
8916
if (EXPECTED (Z_TYPE_P (op1 ) == IS_LONG )) {
8910
8917
result = zend_hash_index_find (ht , Z_LVAL_P (op1 ));
8911
- } else {
8912
- result = NULL ;
8918
+ ZEND_VM_SMART_BRANCH (result , 0 );
8919
+ }
8920
+ SAVE_OPLINE ();
8921
+ if ((OP1_TYPE & (IS_VAR |IS_CV )) && Z_TYPE_P (op1 ) == IS_REFERENCE ) {
8922
+ op1 = Z_REFVAL_P (op1 );
8923
+ if (EXPECTED (Z_TYPE_P (op1 ) == IS_STRING )) {
8924
+ result = zend_hash_find_ex (ht , Z_STR_P (op1 ), 0 );
8925
+ FREE_OP1 ();
8926
+ ZEND_VM_SMART_BRANCH (result , 0 );
8927
+ } else if (EXPECTED (Z_TYPE_P (op1 ) == IS_LONG )) {
8928
+ result = zend_hash_index_find (ht , Z_LVAL_P (op1 ));
8929
+ FREE_OP1 ();
8930
+ ZEND_VM_SMART_BRANCH (result , 0 );
8931
+ }
8932
+ } else if (OP1_TYPE == IS_CV && UNEXPECTED (Z_TYPE_P (op1 ) == IS_UNDEF )) {
8933
+ ZVAL_UNDEFINED_OP1 ();
8913
8934
}
8914
8935
} else if (Z_TYPE_P (op1 ) <= IS_FALSE ) {
8936
+ if (OP1_TYPE == IS_CV && UNEXPECTED (Z_TYPE_P (op1 ) == IS_UNDEF )) {
8937
+ SAVE_OPLINE ();
8938
+ ZVAL_UNDEFINED_OP1 ();
8939
+ if (UNEXPECTED (EG (exception ) != NULL )) {
8940
+ HANDLE_EXCEPTION ();
8941
+ }
8942
+ }
8915
8943
result = zend_hash_find_ex (ht , ZSTR_EMPTY_ALLOC (), 1 );
8944
+ ZEND_VM_SMART_BRANCH (result , 0 );
8916
8945
} else {
8917
8946
zend_string * key ;
8918
8947
zval key_tmp , * val ;
8919
8948
8920
- result = NULL ;
8949
+ if ((OP1_TYPE & (IS_VAR |IS_CV )) && Z_TYPE_P (op1 ) == IS_REFERENCE ) {
8950
+ op1 = Z_REFVAL_P (op1 );
8951
+ if (EXPECTED (Z_TYPE_P (op1 ) == IS_STRING )) {
8952
+ result = zend_hash_find_ex (ht , Z_STR_P (op1 ), 0 );
8953
+ FREE_OP1 ();
8954
+ ZEND_VM_SMART_BRANCH (result , 0 );
8955
+ }
8956
+ }
8957
+
8958
+ SAVE_OPLINE ();
8921
8959
ZEND_HASH_FOREACH_STR_KEY_VAL (ht , key , val ) {
8922
8960
ZVAL_STR (& key_tmp , key );
8923
8961
if (zend_compare (op1 , & key_tmp ) == 0 ) {
8924
- result = val ;
8925
- break ;
8962
+ FREE_OP1 () ;
8963
+ ZEND_VM_SMART_BRANCH ( 1 , 1 ) ;
8926
8964
}
8927
8965
} ZEND_HASH_FOREACH_END ();
8928
8966
}
8929
8967
FREE_OP1 ();
8930
- ZEND_VM_SMART_BRANCH (result , 1 );
8968
+ ZEND_VM_SMART_BRANCH (0 , 1 );
8931
8969
}
8932
8970
8933
8971
ZEND_VM_COLD_CONST_HANDLER (190 , ZEND_COUNT , CONST |TMPVAR |CV , UNUSED )
0 commit comments