@@ -7430,6 +7430,65 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_
74307430 ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
74317431}
74327432
7433+ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
7434+ {
7435+ USE_OPLINE
7436+ zend_class_entry *ce, *catch_ce;
7437+ zend_object *exception;
7438+
7439+ SAVE_OPLINE();
7440+ /* Check whether an exception has been thrown, if not, jump over code */
7441+ zend_exception_restore();
7442+ if (EG(exception) == NULL) {
7443+ ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
7444+ ZEND_VM_CONTINUE();
7445+ }
7446+ catch_ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
7447+ if (UNEXPECTED(catch_ce == NULL)) {
7448+ catch_ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD);
7449+
7450+ CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), catch_ce);
7451+ }
7452+ ce = EG(exception)->ce;
7453+
7454+ #ifdef HAVE_DTRACE
7455+ if (DTRACE_EXCEPTION_CAUGHT_ENABLED()) {
7456+ DTRACE_EXCEPTION_CAUGHT((char *)ce->name);
7457+ }
7458+ #endif /* HAVE_DTRACE */
7459+
7460+ if (ce != catch_ce) {
7461+ if (!catch_ce || !instanceof_function(ce, catch_ce)) {
7462+ if (opline->result.num) {
7463+ zend_throw_exception_internal(NULL);
7464+ HANDLE_EXCEPTION();
7465+ }
7466+ ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
7467+ ZEND_VM_CONTINUE();
7468+ }
7469+ }
7470+
7471+ exception = EG(exception);
7472+
7473+ if (EXPECTED(IS_UNUSED == IS_CV)) {
7474+ zval_ptr_dtor(EX_VAR(opline->op2.var));
7475+ ZVAL_OBJ(EX_VAR(opline->op2.var), EG(exception));
7476+ }
7477+
7478+ if (UNEXPECTED(EG(exception) != exception)) {
7479+ if (EXPECTED(IS_UNUSED == IS_CV)) {
7480+ GC_REFCOUNT(EG(exception))++;
7481+ }
7482+ HANDLE_EXCEPTION();
7483+ } else {
7484+ if (UNEXPECTED(IS_UNUSED == IS_UNUSED)) {
7485+ GC_REFCOUNT(EG(exception))--;
7486+ }
7487+ EG(exception) = NULL;
7488+ ZEND_VM_NEXT_OPCODE();
7489+ }
7490+ }
7491+
74337492static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
74347493{
74357494 USE_OPLINE
@@ -9315,12 +9374,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_CV_HANDLER(ZE
93159374 }
93169375
93179376 exception = EG(exception);
9318- zval_ptr_dtor(EX_VAR(opline->op2.var));
9319- ZVAL_OBJ(EX_VAR(opline->op2.var), EG(exception));
9377+
9378+ if (EXPECTED(IS_CV == IS_CV)) {
9379+ zval_ptr_dtor(EX_VAR(opline->op2.var));
9380+ ZVAL_OBJ(EX_VAR(opline->op2.var), EG(exception));
9381+ }
9382+
93209383 if (UNEXPECTED(EG(exception) != exception)) {
9321- GC_REFCOUNT(EG(exception))++;
9384+ if (EXPECTED(IS_CV == IS_CV)) {
9385+ GC_REFCOUNT(EG(exception))++;
9386+ }
93229387 HANDLE_EXCEPTION();
93239388 } else {
9389+ if (UNEXPECTED(IS_CV == IS_UNUSED)) {
9390+ GC_REFCOUNT(EG(exception))--;
9391+ }
93249392 EG(exception) = NULL;
93259393 ZEND_VM_NEXT_OPCODE();
93269394 }
@@ -57749,7 +57817,7 @@ void zend_init_opcodes_handlers(void)
5774957817 ZEND_NULL_HANDLER,
5775057818 ZEND_NULL_HANDLER,
5775157819 ZEND_NULL_HANDLER,
57752- ZEND_NULL_HANDLER ,
57820+ ZEND_CATCH_SPEC_CONST_UNUSED_HANDLER ,
5775357821 ZEND_CATCH_SPEC_CONST_CV_HANDLER,
5775457822 ZEND_NULL_HANDLER,
5775557823 ZEND_NULL_HANDLER,
0 commit comments