@@ -240,19 +240,21 @@ ZEND_API void zend_clear_exception(void) /* {{{ */
240240}
241241/* }}} */
242242
243- static zend_object * zend_default_exception_new (zend_class_entry * class_type ) /* {{{ */
243+ static zend_object * zend_default_exception_new_ex (zend_class_entry * class_type , bool skip_top_traces ) /* {{{ */
244244{
245245 zval tmp ;
246246 zval trace ;
247247 zend_class_entry * base_ce ;
248248 zend_string * filename ;
249249
250250 zend_object * object = zend_objects_new (class_type );
251+ object -> handlers = & default_exception_handlers ;
252+
251253 object_properties_init (object , class_type );
252254
253255 if (EG (current_execute_data )) {
254256 zend_fetch_debug_backtrace (& trace ,
255- 0 ,
257+ skip_top_traces ,
256258 EG (exception_ignore_args ) ? DEBUG_BACKTRACE_IGNORE_ARGS : 0 , 0 );
257259 } else {
258260 array_init (& trace );
@@ -280,6 +282,18 @@ static zend_object *zend_default_exception_new(zend_class_entry *class_type) /*
280282}
281283/* }}} */
282284
285+ static zend_object * zend_default_exception_new (zend_class_entry * class_type ) /* {{{ */
286+ {
287+ return zend_default_exception_new_ex (class_type , 0 );
288+ }
289+ /* }}} */
290+
291+ static zend_object * zend_error_exception_new (zend_class_entry * class_type ) /* {{{ */
292+ {
293+ return zend_default_exception_new_ex (class_type , 0 );
294+ }
295+ /* }}} */
296+
283297/* {{{ Clone the exception object */
284298ZEND_COLD ZEND_METHOD (Exception , __clone )
285299{
@@ -725,11 +739,6 @@ ZEND_METHOD(Exception, __toString)
725739}
726740/* }}} */
727741
728- static void zend_init_exception_class_entry (zend_class_entry * ce ) {
729- ce -> create_object = zend_default_exception_new ;
730- ce -> default_object_handlers = & default_exception_handlers ;
731- }
732-
733742void zend_register_default_exception (void ) /* {{{ */
734743{
735744 zend_ce_throwable = register_class_Throwable (zend_ce_stringable );
@@ -739,37 +748,37 @@ void zend_register_default_exception(void) /* {{{ */
739748 default_exception_handlers .clone_obj = NULL ;
740749
741750 zend_ce_exception = register_class_Exception (zend_ce_throwable );
742- zend_init_exception_class_entry ( zend_ce_exception ) ;
751+ zend_ce_exception -> create_object = zend_default_exception_new ;
743752
744753 zend_ce_error_exception = register_class_ErrorException (zend_ce_exception );
745- zend_init_exception_class_entry ( zend_ce_error_exception ) ;
754+ zend_ce_error_exception -> create_object = zend_error_exception_new ;
746755
747756 zend_ce_error = register_class_Error (zend_ce_throwable );
748- zend_init_exception_class_entry ( zend_ce_error ) ;
757+ zend_ce_error -> create_object = zend_default_exception_new ;
749758
750759 zend_ce_compile_error = register_class_CompileError (zend_ce_error );
751- zend_init_exception_class_entry ( zend_ce_compile_error ) ;
760+ zend_ce_compile_error -> create_object = zend_default_exception_new ;
752761
753762 zend_ce_parse_error = register_class_ParseError (zend_ce_compile_error );
754- zend_init_exception_class_entry ( zend_ce_parse_error ) ;
763+ zend_ce_parse_error -> create_object = zend_default_exception_new ;
755764
756765 zend_ce_type_error = register_class_TypeError (zend_ce_error );
757- zend_init_exception_class_entry ( zend_ce_type_error ) ;
766+ zend_ce_type_error -> create_object = zend_default_exception_new ;
758767
759768 zend_ce_argument_count_error = register_class_ArgumentCountError (zend_ce_type_error );
760- zend_init_exception_class_entry ( zend_ce_argument_count_error ) ;
769+ zend_ce_argument_count_error -> create_object = zend_default_exception_new ;
761770
762771 zend_ce_value_error = register_class_ValueError (zend_ce_error );
763- zend_init_exception_class_entry ( zend_ce_value_error ) ;
772+ zend_ce_value_error -> create_object = zend_default_exception_new ;
764773
765774 zend_ce_arithmetic_error = register_class_ArithmeticError (zend_ce_error );
766- zend_init_exception_class_entry ( zend_ce_arithmetic_error ) ;
775+ zend_ce_arithmetic_error -> create_object = zend_default_exception_new ;
767776
768777 zend_ce_division_by_zero_error = register_class_DivisionByZeroError (zend_ce_arithmetic_error );
769- zend_init_exception_class_entry ( zend_ce_division_by_zero_error ) ;
778+ zend_ce_division_by_zero_error -> create_object = zend_default_exception_new ;
770779
771780 zend_ce_unhandled_match_error = register_class_UnhandledMatchError (zend_ce_error );
772- zend_init_exception_class_entry ( zend_ce_unhandled_match_error ) ;
781+ zend_ce_unhandled_match_error -> create_object = zend_default_exception_new ;
773782
774783 INIT_CLASS_ENTRY (zend_ce_unwind_exit , "UnwindExit" , NULL );
775784
0 commit comments