/* GNU Objective C Runtime native exceptions
   Copyright (C) 2010-2021 Free Software Foundation, Inc.
   Contributed by Nicola Pero <nicola.pero@meta-innovation.com>

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.

GCC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.

You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
<http://www.gnu.org/licenses/>.  */

#ifndef __objc_exception_INCLUDE_GNU
#define __objc_exception_INCLUDE_GNU

#include "objc.h"
#include "objc-decls.h"

#ifdef __cplusplus
extern "C" {
#endif

/* 'objc_exception_throw' throws the exception 'exception', which is
   an exception object.

   Calls to 'objc_exception_throw' are automatically generated by the
   compiler: an Objective-C "@throw exception;" statement gets
   compiled into the equivalent of "objc_exception_throw
   (exception);".

   'objc_exception_throw' searches for a @catch() that can catch the
   exception.  By default, @catch (MyClass object) will catch all
   exception objects that are of class MyClass or of a subclass of
   MyClass; if the exception object is 'nil', then the exception can
   only be caught with a catch-all exception handler where no
   exception class is specified (such as @catch(id object)).  This
   behaviour can be customized by setting an 'objc_exception_matcher'
   function (using objc_set_exception_matcher(), see below); if one is
   set, it is used instead of the default one.

   If the exception is uncaught (there is no @catch() to catch it),
   the program aborts.  It is possible to customize this behaviour by
   setting an 'objc_uncaught_exception_handler' function (using
   objc_set_uncaught_exception_handler(), see below); if one is set,
   it is executed before abort() is called.  An uncaught exception
   handler is expected to never return.  */
objc_EXPORT void objc_exception_throw (id exception);

/* Compatibility note: the Apple/NeXT runtime seems to also have
   objc_exception_rethrow(), objc_begin_catch() and objc_end_catch().
   Currently the GNU runtime does not use them.  */

/* The following functions allow customizing to a certain extent the
   exception handling.  They are not thread safe and should be called
   during the program initialization before threads are started.  They
   are mostly reserved for "Foundation" libraries; in the case of
   GNUstep, GNUstep Base may be using these functions to improve the
   standard exception handling.  You probably shouldn't use these
   functions unless you are writing your own Foundation library.  */

/* Compatibility note: objc_set_exception_preprocessor() (available on
   the Apple/NeXT runtime) is not available on the GNU runtime.  */

/* An 'objc_exception_matcher' function is used to match an exception
   to a @catch clause.  'catch_class' is the class of objects caught
   by the @catch clause (for example, in "@catch (Object *o)", the
   catch_class is Object).  It should return 1 if the exception should
   be caught by a @catch with a catch_class argument, and 0 if
   not.  */
typedef int (*objc_exception_matcher)(Class catch_class, id exception);

/* Sets a new exception matcher function, and returns the previous
   exception matcher function.  This function is not safe to call in a
   multi-threaded environment because other threads may be trying to
   invoke the exception matcher while you change it!  */
objc_EXPORT objc_exception_matcher
objc_setExceptionMatcher (objc_exception_matcher new_matcher);


/* An 'objc_uncaught_exception_handler' function is a function that
   handles uncaught exceptions.  It should never return.  */
typedef void (*objc_uncaught_exception_handler)(id exception);

/* Sets a new uncaught exception handler function, and returns the
   previous exception handler function.  This function is not safe to
   call in a multi-threaded environment because other threads may be
   trying to invoke the uncaught exception handler while you change
   it.  */
objc_EXPORT objc_uncaught_exception_handler
objc_setUncaughtExceptionHandler (objc_uncaught_exception_handler new_handler);

#ifdef __cplusplus
}
#endif

#endif /* not __objc_exception_INCLUDE_GNU */
