diff --git a/src/class.c b/src/class.c index 7a81c92..6d0db9c 100644 --- a/src/class.c +++ b/src/class.c @@ -81,15 +81,15 @@ int uopz_find_mock(zend_string *clazz, zend_object **object, zend_class_entry ** } if (Z_TYPE_P(found) == IS_STRING) { - *mock = zend_lookup_class(Z_STR_P(found)); + *mock = zend_fetch_class_by_name(Z_STR_P(found), NULL, ZEND_FETCH_CLASS_EXCEPTION); + return *mock ? SUCCESS : FAILURE; } else { *mock = Z_OBJCE_P(found); if (object) { *object = Z_OBJ_P(found); } + return SUCCESS; } - - return SUCCESS; } /* }}} */ /* {{{ */ diff --git a/src/handlers.c b/src/handlers.c index fe4f1e7..36cd33d 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -279,10 +279,12 @@ int uopz_vm_new(UOPZ_OPCODE_HANDLER_ARGS) { /* {{{ */ if (opline->op1_type == IS_CONST) { if (uopz_find_mock(Z_STR_P(EX_CONSTANT(opline->op1)), &obj, &ce) != SUCCESS) { - ce = zend_fetch_class_by_name( - Z_STR_P(EX_CONSTANT(opline->op1)), - Z_STR_P(EX_CONSTANT(opline->op1) + 1), - ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); + if (!EG(exception)) { + ce = zend_fetch_class_by_name( + Z_STR_P(EX_CONSTANT(opline->op1)), + Z_STR_P(EX_CONSTANT(opline->op1) + 1), + ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); + } if (ce == NULL) { ZVAL_UNDEF(EX_VAR(opline->result.var)); diff --git a/tests/004.phpt b/tests/004.phpt index e942278..b7779b2 100644 --- a/tests/004.phpt +++ b/tests/004.phpt @@ -29,6 +29,14 @@ uopz_unset_mock(Foo::class); uopz_set_mock(Bar::class, new Foo); var_dump(new Bar()); + +uopz_set_mock(Foo::class, DoesntExist::class); +try { + var_dump(new Foo); +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} + ?> --EXPECTF-- object(Bar)#%d (0) { @@ -37,3 +45,4 @@ int(1) int(-1) object(Foo)#%d (0) { } +Class "DoesntExist" not found