]> granicus.if.org Git - php/commitdiff
- Be more gracious in reflection API
authorMarcus Boerger <helly@php.net>
Sun, 13 Feb 2005 23:04:49 +0000 (23:04 +0000)
committerMarcus Boerger <helly@php.net>
Sun, 13 Feb 2005 23:04:49 +0000 (23:04 +0000)
Zend/zend_execute_API.c
Zend/zend_reflection_api.c
ext/reflection/php_reflection.c

index 85919fde93e4f24ba40771f464004fe8644c3fdd..305d20dc17c5246378bb5acfc8c8f6dc5664bcd9 100644 (file)
@@ -952,15 +952,15 @@ ZEND_API int zend_lookup_class(char *name, int name_length, zend_class_entry ***
                return FAILURE;
        }
 
-       if (EG(exception)) {
+       if (EG(exception) && exception) {
                free_alloca(lc_name);
                zend_error(E_ERROR, "Function %s(%s) threw an exception of type '%s'", ZEND_AUTOLOAD_FUNC_NAME, name, Z_OBJCE_P(EG(exception))->name);
                return FAILURE;
        }
-       EG(exception) = exception;
-
-       /* If an exception is thrown retval_ptr will be NULL but we bailout before we reach this point */
-       zval_ptr_dtor(&retval_ptr);
+       if (!EG(exception)) {
+               EG(exception) = exception;
+               zval_ptr_dtor(&retval_ptr);
+       }
 
        retval = zend_hash_find(EG(class_table), lc_name, name_length + 1, (void **) ce);
        free_alloca(lc_name);
index 75ef5917a3bbd9a83efd592990b1b3d5fa010dee..395c7a754c8405d4917510583acb763461fc0c25 100644 (file)
@@ -1027,15 +1027,19 @@ static void _reflection_export(INTERNAL_FUNCTION_PARAMETERS, zend_class_entry *c
 
        result = zend_call_function(&fci, &fcc TSRMLS_CC);
        
+       if (retval_ptr) {
+               zval_ptr_dtor(&retval_ptr);
+       }
+
        RETURN_ON_EXCEPTION
 
-       if (result == FAILURE) {
+       if (EG(exception)) {
                zval_dtor(&reflector);
-               _DO_THROW("Could not create reflector");
+               return;
        }
-
-       if (retval_ptr) {
-               zval_ptr_dtor(&retval_ptr);
+       if (result == FAILURE || EG(exception)) {
+               zval_dtor(&reflector);
+               _DO_THROW("Could not create reflector");
        }
 
        /* Call static reflection::export */
@@ -2263,7 +2267,9 @@ static void reflection_class_object_ctor(INTERNAL_FUNCTION_PARAMETERS, int is_ob
        } else { 
                convert_to_string_ex(&argument);
                if (zend_lookup_class(Z_STRVAL_P(argument), Z_STRLEN_P(argument), &ce TSRMLS_CC) == FAILURE) {
-                       zend_throw_exception_ex(reflection_exception_ptr, -1 TSRMLS_CC, "Class %s does not exist", Z_STRVAL_P(argument));
+                       if (!EG(exception)) {
+                               zend_throw_exception_ex(reflection_exception_ptr, -1 TSRMLS_CC, "Class %s does not exist", Z_STRVAL_P(argument));
+                       }
                        return;
                }
 
index 75ef5917a3bbd9a83efd592990b1b3d5fa010dee..395c7a754c8405d4917510583acb763461fc0c25 100644 (file)
@@ -1027,15 +1027,19 @@ static void _reflection_export(INTERNAL_FUNCTION_PARAMETERS, zend_class_entry *c
 
        result = zend_call_function(&fci, &fcc TSRMLS_CC);
        
+       if (retval_ptr) {
+               zval_ptr_dtor(&retval_ptr);
+       }
+
        RETURN_ON_EXCEPTION
 
-       if (result == FAILURE) {
+       if (EG(exception)) {
                zval_dtor(&reflector);
-               _DO_THROW("Could not create reflector");
+               return;
        }
-
-       if (retval_ptr) {
-               zval_ptr_dtor(&retval_ptr);
+       if (result == FAILURE || EG(exception)) {
+               zval_dtor(&reflector);
+               _DO_THROW("Could not create reflector");
        }
 
        /* Call static reflection::export */
@@ -2263,7 +2267,9 @@ static void reflection_class_object_ctor(INTERNAL_FUNCTION_PARAMETERS, int is_ob
        } else { 
                convert_to_string_ex(&argument);
                if (zend_lookup_class(Z_STRVAL_P(argument), Z_STRLEN_P(argument), &ce TSRMLS_CC) == FAILURE) {
-                       zend_throw_exception_ex(reflection_exception_ptr, -1 TSRMLS_CC, "Class %s does not exist", Z_STRVAL_P(argument));
+                       if (!EG(exception)) {
+                               zend_throw_exception_ex(reflection_exception_ptr, -1 TSRMLS_CC, "Class %s does not exist", Z_STRVAL_P(argument));
+                       }
                        return;
                }