@@ -8463,4 +8463,52 @@ ZEND_VM_TYPE_SPEC_HANDLER(ZEND_QM_ASSIGN, (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDE
8463
8463
ZEND_VM_NEXT_OPCODE ();
8464
8464
}
8465
8465
8466
+ ZEND_VM_TYPE_SPEC_HANDLER (ZEND_FETCH_DIM_R , (!(op2_info & (MAY_BE_UNDEF |MAY_BE_NULL |MAY_BE_STRING |MAY_BE_ARRAY |MAY_BE_OBJECT |MAY_BE_RESOURCE |MAY_BE_REF ))), ZEND_FETCH_DIM_R_INDEX , CONST |TMPVAR |CV , CONST |TMPVAR |CV )
8467
+ {
8468
+ USE_OPLINE
8469
+ zend_free_op free_op1 , free_op2 ;
8470
+ zval * container , * dim , * value ;
8471
+ zend_long offset ;
8472
+
8473
+ container = GET_OP1_ZVAL_PTR_UNDEF (BP_VAR_R );
8474
+ dim = GET_OP2_ZVAL_PTR_UNDEF (BP_VAR_R );
8475
+ if (EXPECTED (Z_TYPE_P (container ) == IS_ARRAY )) {
8476
+ ZEND_VM_C_LABEL (fetch_dim_r_index_array ):
8477
+ if (EXPECTED (Z_TYPE_P (dim ) == IS_LONG )) {
8478
+ offset = Z_LVAL_P (dim );
8479
+ } else {
8480
+ offset = zval_get_long (dim );
8481
+ }
8482
+ ZEND_HASH_INDEX_FIND (Z_ARRVAL_P (container ), offset , value , ZEND_VM_C_LABEL (fetch_dim_r_index_undef ));
8483
+ ZVAL_COPY (EX_VAR (opline -> result .var ), value );
8484
+ if (OP1_TYPE & (IS_TMP_VAR |IS_VAR )) {
8485
+ SAVE_OPLINE ();
8486
+ FREE_OP1 ();
8487
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION ();
8488
+ } else {
8489
+ ZEND_VM_NEXT_OPCODE ();
8490
+ }
8491
+ } else if (OP1_TYPE != IS_CONST && EXPECTED (Z_TYPE_P (container ) == IS_REFERENCE )) {
8492
+ container = Z_REFVAL_P (container );
8493
+ if (EXPECTED (Z_TYPE_P (container ) == IS_ARRAY )) {
8494
+ ZEND_VM_C_GOTO (fetch_dim_r_index_array );
8495
+ } else {
8496
+ ZEND_VM_C_GOTO (fetch_dim_r_index_slow );
8497
+ }
8498
+ } else {
8499
+ ZEND_VM_C_LABEL (fetch_dim_r_index_slow ):
8500
+ SAVE_OPLINE ();
8501
+ zend_fetch_dimension_address_read_R_slow (EX_VAR (opline -> result .var ), container , dim );
8502
+ FREE_OP1 ();
8503
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION ();
8504
+ }
8505
+
8506
+ ZEND_VM_C_LABEL (fetch_dim_r_index_undef ):
8507
+ ZVAL_NULL (EX_VAR (opline -> result .var ));
8508
+ SAVE_OPLINE ();
8509
+ zend_error (E_NOTICE , "Undefined offset: " ZEND_LONG_FMT , offset );
8510
+ FREE_OP1 ();
8511
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION ();
8512
+ }
8513
+
8466
8514
ZEND_VM_DEFINE_OP (137 , ZEND_OP_DATA );
0 commit comments