]> granicus.if.org Git - php/commitdiff
Centralize exceptions code in zend_exceptions.[ch].
authorZeev Suraski <zeev@php.net>
Thu, 12 Feb 2004 10:38:14 +0000 (10:38 +0000)
committerZeev Suraski <zeev@php.net>
Thu, 12 Feb 2004 10:38:14 +0000 (10:38 +0000)
Remove zend_default_classes.h (use zend_exceptions.h instead)

NOTE:  This currently breaks the build, fixes to php-src and pecl coming
       soon

Zend/ZendTS.dsp
Zend/zend.c
Zend/zend_default_classes.c
Zend/zend_exceptions.c
Zend/zend_exceptions.h
Zend/zend_execute.c
Zend/zend_execute.h
Zend/zend_execute_API.c
Zend/zend_reflection_api.c
ext/reflection/php_reflection.c

index 0dde7230a679f11a281b11dc020ecc76a9ba61ee..76b4e46e5f4aa02f4b9e3af13d19635de3c5f913 100644 (file)
@@ -160,11 +160,11 @@ SOURCE=.\zend_default_classes.c
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\zend_interfaces.c\r
+SOURCE=.\zend_dynamic_array.c\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\zend_dynamic_array.c\r
+SOURCE=.\zend_exceptions.c\r
 # End Source File\r
 # Begin Source File\r
 \r
@@ -204,6 +204,10 @@ SOURCE=.\zend_ini_scanner.c
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=.\zend_interfaces.c\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=.\zend_iterators.c\r
 # End Source File\r
 # Begin Source File\r
@@ -320,15 +324,15 @@ SOURCE=.\zend_default_classes.h
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\zend_interfaces.h\r
+SOURCE=.\zend_dynamic_array.h\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\zend_dynamic_array.h\r
+SOURCE=.\zend_errors.h\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\zend_errors.h\r
+SOURCE=.\zend_exceptions.h\r
 # End Source File\r
 # Begin Source File\r
 \r
@@ -376,6 +380,10 @@ SOURCE=.\zend_ini_scanner.h
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=.\zend_interfaces.h\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=.\zend_istdiostream.h\r
 # End Source File\r
 # Begin Source File\r
index 2592ea7866fd978f8c805a50ca3408fb1649ca2e..179c7b9cd6fc1d3571897860016a60ff05d36c9b 100644 (file)
@@ -25,7 +25,7 @@
 #include "zend_constants.h"
 #include "zend_list.h"
 #include "zend_API.h"
-#include "zend_default_classes.h"
+#include "zend_exceptions.h"
 #include "zend_builtin_functions.h"
 #include "zend_ini.h"
 
index 1195d5c8b28eea7bbea50bee52860f726a0b10bb..e31cf14fa0fb6ff8a08d045bd218372837926efc 100644 (file)
 #include "zend_reflection_api.h"
 #include "zend_builtin_functions.h"
 #include "zend_interfaces.h"
-
-zend_class_entry *default_exception_ce;
-static zend_object_handlers default_exception_handlers;
-ZEND_API void zend_throw_exception(zend_class_entry *exception_ce, char *message, long code TSRMLS_DC);
-
-static zend_object_value zend_default_exception_new(zend_class_entry *class_type TSRMLS_DC)
-{
-       zval tmp, obj;
-       zend_object *object;
-       zval *trace;
-
-       obj.value.obj = zend_objects_new(&object, class_type TSRMLS_CC);
-       obj.value.obj.handlers = &default_exception_handlers;
-
-       ALLOC_HASHTABLE(object->properties);
-       zend_hash_init(object->properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-       zend_hash_copy(object->properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *));
-
-       ALLOC_ZVAL(trace);
-       trace->is_ref = 0;
-       trace->refcount = 0;
-       zend_fetch_debug_backtrace(trace, 0 TSRMLS_CC);
-
-       zend_update_property_string(default_exception_ce, &obj, "file", sizeof("file")-1, zend_get_executed_filename(TSRMLS_C) TSRMLS_CC);
-       zend_update_property_long(default_exception_ce, &obj, "line", sizeof("line")-1, zend_get_executed_lineno(TSRMLS_C) TSRMLS_CC);
-       zend_update_property(default_exception_ce, &obj, "trace", sizeof("trace")-1, trace TSRMLS_CC);
-
-       return obj.value.obj;
-}
-
-ZEND_METHOD(exception, __clone)
-{
-       /* Should never be executable */
-       zend_throw_exception(NULL, "Cannot clone object using __clone()", 0 TSRMLS_CC);
-}
-
-ZEND_METHOD(exception, __construct)
-{
-       char  *message = NULL;
-       long   code = 0;
-       zval  *object;
-       int    argc = ZEND_NUM_ARGS(), message_len;
-
-       if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC, "|sl", &message, &message_len, &code) == FAILURE) {
-               zend_error(E_CORE_ERROR, "Wrong parameter count for exception([string $exception [, long $code ]])");
-       }
-
-       object = getThis();
-
-       if (message) {
-               zend_update_property_string(default_exception_ce, object, "message", sizeof("message")-1, message TSRMLS_CC);
-       }
-
-       if (code) {
-               zend_update_property_long(default_exception_ce, object, "code", sizeof("code")-1, code TSRMLS_CC);
-       }
-}
-
-#define DEFAULT_0_PARAMS \
-       if (ZEND_NUM_ARGS() > 0) { \
-               ZEND_WRONG_PARAM_COUNT(); \
-       }
-
-static void _default_exception_get_entry(zval *object, char *name, int name_len, zval *return_value TSRMLS_DC)
-{
-       zval *value;
-
-       value = zend_read_property(default_exception_ce, object, name, name_len, 0 TSRMLS_CC);
-
-       *return_value = *value;
-       zval_copy_ctor(return_value);
-}
-
-ZEND_METHOD(exception, getFile)
-{
-       DEFAULT_0_PARAMS;
-
-       _default_exception_get_entry(getThis(), "file", sizeof("file")-1, return_value TSRMLS_CC);
-}
-
-ZEND_METHOD(exception, getLine)
-{
-       DEFAULT_0_PARAMS;
-
-       _default_exception_get_entry(getThis(), "line", sizeof("line")-1, return_value TSRMLS_CC);
-}
-
-ZEND_METHOD(exception, getMessage)
-{
-       DEFAULT_0_PARAMS;
-
-       _default_exception_get_entry(getThis(), "message", sizeof("message")-1, return_value TSRMLS_CC);
-}
-
-ZEND_METHOD(exception, getCode)
-{
-       DEFAULT_0_PARAMS;
-
-       _default_exception_get_entry(getThis(), "code", sizeof("code")-1, return_value TSRMLS_CC);
-}
-
-ZEND_METHOD(exception, getTrace)
-{
-       DEFAULT_0_PARAMS;
-
-       _default_exception_get_entry(getThis(), "trace", sizeof("trace")-1, return_value TSRMLS_CC);
-}
-
-/* {{{ ZEND_METHOD(exception, gettraceasstring) */
-#define TRACE_APPEND_CHR(chr)                                            \
-       *str = (char*)erealloc(*str, *len + 1 + 1);                          \
-       (*str)[(*len)++] = chr
-
-#define TRACE_APPEND_STRL(val, vallen)                                   \
-       {                                                                    \
-           int l = vallen;                                                  \
-               *str = (char*)erealloc(*str, *len + l + 1);                      \
-               memcpy((*str) + *len, val, l);                                   \
-               *len += l;                                                       \
-       }
-
-#define TRACE_APPEND_STR(val)                                            \
-       TRACE_APPEND_STRL(val, sizeof(val)-1)
-
-#define TRACE_APPEND_KEY(key)                                            \
-       if (zend_hash_find(ht, key, sizeof(key), (void**)&tmp) == SUCCESS) { \
-           TRACE_APPEND_STRL(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));           \
-       }
-
-static int _build_trace_args(zval **arg, int num_args, va_list args, zend_hash_key *hash_key)
-{
-       char **str;
-       int *len;
-
-       str = va_arg(args, char**);
-       len = va_arg(args, int*);
-
-       /* the trivial way would be to do:
-        * conver_to_string_ex(arg);
-        * append it and kill the now tmp arg.
-        * but that could cause some E_NOTICE and also damn long lines.
-        */
-
-       switch (Z_TYPE_PP(arg)) {
-               case IS_NULL:
-                       TRACE_APPEND_STR("NULL, ");
-                       break;
-               case IS_STRING: {
-                       int l_added;
-                       TRACE_APPEND_CHR('\'');
-                       if (Z_STRLEN_PP(arg) > 15) {
-                               TRACE_APPEND_STRL(Z_STRVAL_PP(arg), 15);
-                               TRACE_APPEND_STR("...', ");
-                               l_added = 15 + 6 + 1; /* +1 because of while (--l_added) */
-                       } else {
-                               l_added = Z_STRLEN_PP(arg);
-                               TRACE_APPEND_STRL(Z_STRVAL_PP(arg), l_added);
-                               TRACE_APPEND_STR("', ");
-                               l_added += 3 + 1;
-                       }
-                       while (--l_added) {
-                               if ((*str)[*len - l_added] < 32) {
-                                       (*str)[*len - l_added] = '?';
-                               }
-                       }
-                       break;
-               }
-               case IS_BOOL:
-                       if (Z_LVAL_PP(arg)) {
-                               TRACE_APPEND_STR("true, ");
-                       } else {
-                               TRACE_APPEND_STR("false, ");
-                       }
-                       break;
-               case IS_RESOURCE:
-                       TRACE_APPEND_STR("Resource id #");
-                       /* break; */
-               case IS_LONG: {
-                       long lval = Z_LVAL_PP(arg);
-                       char s_tmp[MAX_LENGTH_OF_LONG + 1];
-                       int l_tmp = zend_sprintf(s_tmp, "%ld", lval);  /* SAFE */
-                       TRACE_APPEND_STRL(s_tmp, l_tmp);
-                       TRACE_APPEND_STR(", ");
-                       break;
-               }
-               case IS_DOUBLE: {
-                       double dval = Z_DVAL_PP(arg);
-                       char *s_tmp;
-                       int l_tmp;
-                       TSRMLS_FETCH();
-
-                       s_tmp = emalloc(MAX_LENGTH_OF_DOUBLE + EG(precision) + 1);
-                       l_tmp = zend_sprintf(s_tmp, "%.*G", (int) EG(precision), dval);  /* SAFE */
-                       TRACE_APPEND_STRL(s_tmp, l_tmp);
-                       /* %G already handles removing trailing zeros from the fractional part, yay */
-                       efree(s_tmp);
-                       TRACE_APPEND_STR(", ");
-                       break;
-               }
-               case IS_ARRAY:
-                       TRACE_APPEND_STR("Array, ");
-                       break;
-               case IS_OBJECT: {
-                       TSRMLS_FETCH();
-
-                       TRACE_APPEND_STR("Object(");
-                       TRACE_APPEND_STRL(Z_OBJCE_PP(arg)->name, strlen(Z_OBJCE_PP(arg)->name));
-                       TRACE_APPEND_STR("), ");
-                       break;
-               }
-               default:
-                       break;
-       }
-       return ZEND_HASH_APPLY_KEEP;
-}
-
-static int _build_trace_string(zval **frame, int num_args, va_list args, zend_hash_key *hash_key)
-{
-       char *s_tmp, **str;
-       int *len, *num;
-       long line;
-       HashTable *ht = Z_ARRVAL_PP(frame);
-       zval **file, **tmp;
-
-       str = va_arg(args, char**);
-       len = va_arg(args, int*);
-       num = va_arg(args, int*);
-
-       s_tmp = emalloc(1 + MAX_LENGTH_OF_LONG + 1 + 1);
-       sprintf(s_tmp, "#%d ", (*num)++);
-       TRACE_APPEND_STRL(s_tmp, strlen(s_tmp));
-       efree(s_tmp);
-       if (zend_hash_find(ht, "file", sizeof("file"), (void**)&file) == SUCCESS) {
-               if (zend_hash_find(ht, "line", sizeof("line"), (void**)&tmp) == SUCCESS) {
-                       line = Z_LVAL_PP(tmp);
-               } else {
-                       line = 0;
-               }
-               s_tmp = emalloc(Z_STRLEN_PP(file) + MAX_LENGTH_OF_LONG + 2 + 1);
-               sprintf(s_tmp, "%s(%ld): ", Z_STRVAL_PP(file), line);
-               TRACE_APPEND_STRL(s_tmp, strlen(s_tmp));
-               efree(s_tmp);
-       } else {
-               TRACE_APPEND_STR("[internal function]: ");
-       }
-       TRACE_APPEND_KEY("class");
-       TRACE_APPEND_KEY("type");
-       TRACE_APPEND_KEY("function");
-       TRACE_APPEND_CHR('(');
-       if (zend_hash_find(ht, "args", sizeof("args"), (void**)&tmp) == SUCCESS) {
-               int last_len = *len;
-               zend_hash_apply_with_arguments(Z_ARRVAL_PP(tmp), (apply_func_args_t)_build_trace_args, 2, str, len);
-               if (last_len != *len) {
-                       *len -= 2; /* remove last ', ' */
-               }
-       }
-       TRACE_APPEND_STR(")\n");
-       return ZEND_HASH_APPLY_KEEP;
-}
-
-ZEND_METHOD(exception, getTraceAsString)
-{
-       zval *trace;
-       char *res = estrdup(""), **str = &res, *s_tmp;
-       int res_len = 0, *len = &res_len, num = 0;
-       
-       trace = zend_read_property(default_exception_ce, getThis(), "trace", sizeof("trace")-1, 1 TSRMLS_CC);
-       zend_hash_apply_with_arguments(Z_ARRVAL_P(trace), (apply_func_args_t)_build_trace_string, 3, str, len, &num);
-
-       s_tmp = emalloc(1 + MAX_LENGTH_OF_LONG + 7 + 1);
-       sprintf(s_tmp, "#%d {main}", num);
-       TRACE_APPEND_STRL(s_tmp, strlen(s_tmp));
-       efree(s_tmp);
-
-       res[res_len] = '\0';    
-       RETURN_STRINGL(res, res_len, 0); 
-}
-/* }}} */
-
-int zend_spprintf(char **message, int max_len, char *format, ...)
-{
-       va_list arg;
-       int len;
-
-       va_start(arg, format); 
-       len = zend_vspprintf(message, max_len, format, arg);
-       va_end(arg);
-       return len;
-}
-
-ZEND_METHOD(exception, __toString)
-{
-       zval message, file, line, *trace;
-       char *str;
-       int len;
-       zend_fcall_info fci;
-       zval fname;
-
-       _default_exception_get_entry(getThis(), "message", sizeof("message")-1, &message TSRMLS_CC);
-       _default_exception_get_entry(getThis(), "file", sizeof("file")-1, &file TSRMLS_CC);
-       _default_exception_get_entry(getThis(), "line", sizeof("line")-1, &line TSRMLS_CC);
-
-       convert_to_string(&message);
-       convert_to_string(&file);
-       convert_to_long(&line);
-
-       ZVAL_STRINGL(&fname, "gettraceasstring", sizeof("gettraceasstring")-1, 0);
-
-       fci.size = sizeof(fci);
-       fci.function_table = &Z_OBJCE_P(getThis())->function_table;
-       fci.function_name = &fname;
-       fci.symbol_table = NULL;
-       fci.object_pp = &getThis();
-       fci.retval_ptr_ptr = &trace;
-       fci.param_count = 0;
-       fci.params = NULL;
-       fci.no_separation = 1;
-
-       zend_call_function(&fci, NULL TSRMLS_CC);
-
-       if (Z_TYPE_P(trace) != IS_STRING) {
-               trace = NULL;
-       }
-
-       if (Z_STRLEN(message) > 0) {
-               len = zend_spprintf(&str, 0, "exception '%s' with message '%s' in %s:%ld\nStack trace:\n%s", 
-                                                       Z_OBJCE_P(getThis())->name, Z_STRVAL(message), Z_STRVAL(file), Z_LVAL(line), 
-                                                       (trace && Z_STRLEN_P(trace)) ? Z_STRVAL_P(trace) : "#0 {main}\n");
-       } else {
-               len = zend_spprintf(&str, 0, "exception '%s' in %s:%ld\nStack trace:\n%s", 
-                                                       Z_OBJCE_P(getThis())->name, Z_STRVAL(file), Z_LVAL(line), 
-                                                       (trace && Z_STRLEN_P(trace)) ? Z_STRVAL_P(trace) : "#0 {main}\n");
-       }
-
-       /* We store the result in the private property string so we can access
-        * the result in uncaught exception handlers without memleaks. */
-       zend_update_property_string(default_exception_ce, getThis(), "string", sizeof("string")-1, str TSRMLS_CC);
-
-       if (trace) {
-               zval_ptr_dtor(&trace);
-       }
-
-       zval_dtor(&message);
-       zval_dtor(&file);
-       zval_dtor(&line);
-
-       RETURN_STRINGL(str, len, 0);
-}
-
-/* All functions that may be used in uncaught exception handlers must be final
- * and must not throw exceptions. Otherwise we would need a facility to handle
- * such exceptions in that handler. 
- * Also all getXY() methods are final because thy serve as read only access to
- * their corresponding properties, no more, no less. If after all you need to 
- * override somthing then it is method __toString().
- * And never try to change the state of exceptions and never implement anything
- * that gives the user anything to accomplish this.
- */
-static zend_function_entry default_exception_functions[] = {
-       ZEND_ME(exception, __clone, NULL, ZEND_ACC_PRIVATE|ZEND_ACC_FINAL)
-       ZEND_ME(exception, __construct, NULL, 0)
-       ZEND_ME(exception, getMessage, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
-       ZEND_ME(exception, getCode, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
-       ZEND_ME(exception, getFile, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
-       ZEND_ME(exception, getLine, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
-       ZEND_ME(exception, getTrace, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
-       ZEND_ME(exception, getTraceAsString, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
-       ZEND_ME(exception, __toString, NULL, 0)
-       {NULL, NULL, NULL}
-};
-
-static void zend_register_default_exception(TSRMLS_D)
-{
-       zend_class_entry ce;
-
-       INIT_CLASS_ENTRY(ce, "exception", default_exception_functions);
-       default_exception_ce = zend_register_internal_class(&ce TSRMLS_CC);
-       default_exception_ce->create_object = zend_default_exception_new; 
-       memcpy(&default_exception_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
-       default_exception_handlers.clone_obj = NULL;
-
-       zend_declare_property_string(default_exception_ce, "message", sizeof("message")-1, "", ZEND_ACC_PROTECTED TSRMLS_CC);
-       zend_declare_property_string(default_exception_ce, "string", sizeof("string")-1, "", ZEND_ACC_PRIVATE TSRMLS_CC);
-       zend_declare_property_long(default_exception_ce, "code", sizeof("code")-1, 0, ZEND_ACC_PROTECTED TSRMLS_CC);
-       zend_declare_property_null(default_exception_ce, "file", sizeof("file")-1, ZEND_ACC_PROTECTED TSRMLS_CC);
-       zend_declare_property_null(default_exception_ce, "line", sizeof("line")-1, ZEND_ACC_PROTECTED TSRMLS_CC);
-       zend_declare_property_null(default_exception_ce, "trace", sizeof("trace")-1, ZEND_ACC_PRIVATE TSRMLS_CC);
-}
-
-ZEND_API zend_class_entry *zend_exception_get_default(void)
-{
-       return default_exception_ce;
-}
-
-ZEND_API void zend_throw_exception_ex(zend_class_entry *exception_ce, long code TSRMLS_DC, char *format, ...)
-{
-       zval *ex;
-       va_list arg;
-       char *message;
-
-       va_start(arg, format); 
-       zend_vspprintf(&message, 0, format, arg);
-       va_end(arg);
-
-       MAKE_STD_ZVAL(ex);
-       if (exception_ce) {
-               if (!instanceof_function(exception_ce, default_exception_ce TSRMLS_CC)) {
-                       zend_error(E_NOTICE, "Exceptions must be derived from exception");
-                       exception_ce = default_exception_ce;
-               }
-       } else {
-               exception_ce = default_exception_ce;
-       }
-       object_init_ex(ex, exception_ce);
-       
-
-       if (message) {
-               zend_update_property_string(default_exception_ce, ex, "message", sizeof("message")-1, message TSRMLS_CC);
-       }
-       if (code) {
-               zend_update_property_long(default_exception_ce, ex, "code", sizeof("code")-1, code TSRMLS_CC);
-       }
-
-       efree(message);
-
-       zend_throw_exception_internal(ex TSRMLS_CC);
-}
-
-
-ZEND_API void zend_throw_exception(zend_class_entry *exception_ce, char *message, long code TSRMLS_DC)
-{
-       zend_throw_exception_ex(exception_ce, code TSRMLS_CC, "%s", message);
-}
-
-
-static void zend_error_va(int type, const char *file, uint lineno, const char *format, ...)
-{
-       va_list args;
-       
-       va_start(args, format);
-       zend_error_cb(type, file, lineno, format, args);
-       va_end(args);
-}
-
-ZEND_API void zend_exception_error(zval *exception TSRMLS_DC)
-{
-       zend_class_entry *ce_exception = Z_OBJCE_P(exception);
-       if (instanceof_function(ce_exception, default_exception_ce TSRMLS_CC)) {
-               zval *str, *file, *line;
-               zval *old_exception = EG(exception);
-
-               EG(exception) = NULL;
-               
-               zend_call_method_with_0_params(&exception, ce_exception, NULL, "__tostring", &str);
-               if (!EG(exception)) {
-                       if (Z_TYPE_P(str) != IS_STRING) {
-                               zend_error(E_WARNING, "%s::__toString() must return a string", ce_exception->name);
-                       } else {
-                               zend_update_property_string(default_exception_ce, exception, "string", sizeof("string")-1, EG(exception) ? ce_exception->name : Z_STRVAL_P(str) TSRMLS_CC);
-                       }
-               }
-               zval_ptr_dtor(&str);
-       
-               if (EG(exception)) {
-                       /* do the best we can to inform about the inner exception */
-                       if (instanceof_function(ce_exception, default_exception_ce TSRMLS_CC)) {
-                               file = zend_read_property(default_exception_ce, EG(exception), "file", sizeof("file")-1, 1 TSRMLS_CC);
-                               line = zend_read_property(default_exception_ce, EG(exception), "line", sizeof("line")-1, 1 TSRMLS_CC);
-                       } else {
-                               file = NULL;
-                               line = NULL;
-                       }
-                       zend_error_va(E_WARNING, file ? Z_STRVAL_P(file) : NULL, line ? Z_LVAL_P(line) : 0, "Uncaught %s in exception handling during call to %s::__tostring()", Z_OBJCE_P(EG(exception))->name, ce_exception->name);
-               }
-
-               str = zend_read_property(default_exception_ce, exception, "string", sizeof("string")-1, 1 TSRMLS_CC);
-               file = zend_read_property(default_exception_ce, exception, "file", sizeof("file")-1, 1 TSRMLS_CC);
-               line = zend_read_property(default_exception_ce, exception, "line", sizeof("line")-1, 1 TSRMLS_CC);
-
-               EG(exception) = old_exception;
-
-               zend_error_va(E_ERROR, Z_STRVAL_P(file), Z_LVAL_P(line), "Uncaught %s\n  thrown", Z_STRVAL_P(str));
-       } else {
-               zend_error(E_ERROR, "Uncaught exception '%s'", ce_exception->name);
-       }
-}
-
-
-ZEND_API void zend_throw_exception_object(zval *exception TSRMLS_DC)
-{
-       zend_class_entry *exception_ce;
-
-       if (exception == NULL || exception->type != IS_OBJECT) {
-               zend_error(E_ERROR, "Need to supply an object when throwing an exception");
-       }
-
-       exception_ce = Z_OBJCE_P(exception);
-
-       if (!exception_ce || !instanceof_function(exception_ce, default_exception_ce TSRMLS_CC)) {
-               zend_error(E_ERROR, "Exceptions must valid objects that are derived from class Exception");
-       }
-       zend_throw_exception_internal(exception TSRMLS_CC);
-}
+#include "zend_exceptions.h"
 
 
 ZEND_API void zend_register_default_classes(TSRMLS_D)
index 1195d5c8b28eea7bbea50bee52860f726a0b10bb..cb87476a7546055ca16cfee4400bf61d130c4d5c 100644 (file)
    | obtain it through the world-wide-web, please send a note to          |
    | license@zend.com so we can mail you a copy immediately.              |
    +----------------------------------------------------------------------+
-   | Authors: Sterling Hughes <sterling@php.net>                          |
+   | Authors: Andi Gutmans <andi@zend.com>                                |
    |          Marcus Boerger <helly@php.net>                              |
+   |          Sterling Hughes <sterling@php.net>                          |
+   |          Zeev Suraski <zeev@zend.com>                                |
    +----------------------------------------------------------------------+
 */
 
@@ -29,6 +31,44 @@ zend_class_entry *default_exception_ce;
 static zend_object_handlers default_exception_handlers;
 ZEND_API void zend_throw_exception(zend_class_entry *exception_ce, char *message, long code TSRMLS_DC);
 
+
+void zend_throw_exception_internal(zval *exception TSRMLS_DC)
+{
+       if (exception != NULL) {
+               if (EG(exception)) {
+                       /* FIXME:  bail out? */
+                       return;
+               }
+               EG(exception) = exception;
+       }
+       if (!EG(current_execute_data)) {
+               zend_error(E_ERROR, "Exception thrown without a stack frame");
+       }
+
+       if ((EG(current_execute_data)->opline+1)->opcode == ZEND_HANDLE_EXCEPTION) {
+               /* no need to rethrow the exception */
+               return;
+       }
+       EG(opline_before_exception) = EG(current_execute_data)->opline;
+       EG(current_execute_data)->opline = &EG(active_op_array)->opcodes[EG(active_op_array)->last-1-1];
+}
+
+
+
+
+ZEND_API void zend_clear_exception(TSRMLS_D)
+{
+       if (!EG(exception)) {
+               return;
+       }
+       zval_ptr_dtor(&EG(exception));
+       EG(exception) = NULL;
+       EG(current_execute_data)->opline = EG(opline_before_exception);
+#if ZEND_DEBUG
+       EG(opline_before_exception) = NULL;
+#endif
+}
+
 static zend_object_value zend_default_exception_new(zend_class_entry *class_type TSRMLS_DC)
 {
        zval tmp, obj;
@@ -395,7 +435,7 @@ static zend_function_entry default_exception_functions[] = {
        {NULL, NULL, NULL}
 };
 
-static void zend_register_default_exception(TSRMLS_D)
+void zend_register_default_exception(TSRMLS_D)
 {
        zend_class_entry ce;
 
@@ -528,15 +568,6 @@ ZEND_API void zend_throw_exception_object(zval *exception TSRMLS_DC)
        zend_throw_exception_internal(exception TSRMLS_CC);
 }
 
-
-ZEND_API void zend_register_default_classes(TSRMLS_D)
-{
-       zend_register_interfaces(TSRMLS_C);
-       zend_register_default_exception(TSRMLS_C);
-       zend_register_reflection_api(TSRMLS_C);
-       zend_register_iterator_wrapper(TSRMLS_C);
-}
-
 /*
  * Local variables:
  * tab-width: 4
index 68dd208f2087edbc129e6456ec33c0326764c5de..b5653c8488b4effe672624f7c2d7e6d36663e488 100644 (file)
    | obtain it through the world-wide-web, please send a note to          |
    | license@zend.com so we can mail you a copy immediately.              |
    +----------------------------------------------------------------------+
-   | Authors: Sterling Hughes <sterling@php.net>                          |
+   | Authors: Andi Gutmans <andi@zend.com>                                |
    |          Marcus Boerger <helly@php.net>                              |
+   |          Sterling Hughes <sterling@php.net>                          |
+   |          Zeev Suraski <zeev@zend.com>                                |
    +----------------------------------------------------------------------+
 */
 
 /* $Id$ */
 
-#ifndef ZEND_DEFAULT_CLASSES_H
-#define ZEND_DEFAULT_CLASSES_H
+#ifndef ZEND_EXCEPTIONS_H
+#define ZEND_EXCEPTIONS_H
 
 BEGIN_EXTERN_C()
 
+void zend_throw_exception_internal(zval *exception TSRMLS_DC);
+
+void zend_register_default_exception(TSRMLS_D);
+
 ZEND_API zend_class_entry *zend_exception_get_default(void);
 ZEND_API void zend_register_default_classes(TSRMLS_D);
 
@@ -32,6 +38,7 @@ ZEND_API void zend_register_default_classes(TSRMLS_D);
 ZEND_API void zend_throw_exception(zend_class_entry *exception_ce, char *message, long code TSRMLS_DC);
 ZEND_API void zend_throw_exception_ex(zend_class_entry *exception_ce, long code TSRMLS_DC, char *format, ...);
 ZEND_API void zend_throw_exception_object(zval *exception TSRMLS_DC);
+ZEND_API void zend_clear_exception(TSRMLS_D);
 
 /* show an exception using zend_error(E_ERROR,...) */
 ZEND_API void zend_exception_error(zval *exception TSRMLS_DC);
index a27ef9cf2c7d8f1c4df0c00a3824f9db0d327f92..82afac35531bf7a1913ae9b9d5e29043342d08e7 100644 (file)
@@ -33,6 +33,7 @@
 #include "zend_extensions.h"
 #include "zend_fast_cache.h"
 #include "zend_ini.h"
+#include "zend_exceptions.h"
 
 #define get_zval_ptr(node, Ts, should_free, type) _get_zval_ptr(node, Ts, should_free TSRMLS_CC)
 #define get_zval_ptr_ptr(node, Ts, type) _get_zval_ptr_ptr(node, Ts TSRMLS_CC)
index 3f5d5cc4f8d82aefc0a7dbeb9b83e89b798e2528..ce7a99abb68e0b221ac00bddcddeea0e132aa925 100644 (file)
@@ -143,8 +143,6 @@ ZEND_API void zend_set_timeout(long seconds);
 ZEND_API void zend_unset_timeout(TSRMLS_D);
 ZEND_API void zend_timeout(int dummy);
 ZEND_API zend_class_entry *zend_fetch_class(char *class_name, uint class_name_len, int fetch_type TSRMLS_DC);
-void zend_throw_exception_internal(zval *exception TSRMLS_DC);
-ZEND_API void zend_clear_exception(TSRMLS_D);
 void zend_verify_abstract_class(zend_class_entry *ce TSRMLS_DC);
 
 #ifdef ZEND_WIN32
index 72dd623979abcfd22b10cb072efe677ad984dbda..37ec49417ac23a0bb1f1aa598fe68db453a0c6c0 100644 (file)
@@ -29,7 +29,7 @@
 #include "zend_ptr_stack.h"
 #include "zend_constants.h"
 #include "zend_extensions.h"
-#include "zend_default_classes.h"
+#include "zend_exceptions.h"
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
 #endif
@@ -1200,42 +1200,6 @@ check_fetch_type:
        return *pce;
 }
 
-void zend_throw_exception_internal(zval *exception TSRMLS_DC)
-{
-       if (exception != NULL) {
-               if (EG(exception)) {
-                       /* FIXME:  bail out? */
-                       return;
-               }
-               EG(exception) = exception;
-       }
-       if (!EG(current_execute_data)) {
-               zend_error(E_ERROR, "Exception thrown without a stack frame");
-       }
-
-       if ((EG(current_execute_data)->opline+1)->opcode == ZEND_HANDLE_EXCEPTION) {
-               /* no need to rethrow the exception */
-               return;
-       }
-       EG(opline_before_exception) = EG(current_execute_data)->opline;
-       EG(current_execute_data)->opline = &EG(active_op_array)->opcodes[EG(active_op_array)->last-1-1];
-}
-
-
-
-
-ZEND_API void zend_clear_exception(TSRMLS_D)
-{
-       if (!EG(exception)) {
-               return;
-       }
-       zval_ptr_dtor(&EG(exception));
-       EG(exception) = NULL;
-       EG(current_execute_data)->opline = EG(opline_before_exception);
-#if ZEND_DEBUG
-       EG(opline_before_exception) = NULL;
-#endif
-}
 
 
 #define MAX_ABSTRACT_INFO_CNT 3
index d923f811bade2d61afd2fa1fa1b5b7cbdb7154f7..437b0d83143771358c8d7df842039964b37fe35b 100644 (file)
@@ -22,7 +22,7 @@
 /* $Id$ */
 #include "zend.h"
 #include "zend_API.h"
-#include "zend_default_classes.h"
+#include "zend_exceptions.h"
 #include "zend_operators.h"
 #include "zend_constants.h"
 #include "zend_ini.h"
index d923f811bade2d61afd2fa1fa1b5b7cbdb7154f7..437b0d83143771358c8d7df842039964b37fe35b 100644 (file)
@@ -22,7 +22,7 @@
 /* $Id$ */
 #include "zend.h"
 #include "zend_API.h"
-#include "zend_default_classes.h"
+#include "zend_exceptions.h"
 #include "zend_operators.h"
 #include "zend_constants.h"
 #include "zend_ini.h"