diff options
author | Jeff Law <law@gcc.gnu.org> | 1998-09-04 19:11:54 -0600 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1998-09-04 19:11:54 -0600 |
commit | b79f73df6aed1b1411b1b505bc5dd48e9ed78609 (patch) | |
tree | e2a997b294961a00f5d259edefbef93b8501c089 /libchill/exh.c | |
parent | 1802393487391d209c472f42c92cc2ba4d34469f (diff) | |
download | gcc-b79f73df6aed1b1411b1b505bc5dd48e9ed78609.zip gcc-b79f73df6aed1b1411b1b505bc5dd48e9ed78609.tar.gz gcc-b79f73df6aed1b1411b1b505bc5dd48e9ed78609.tar.bz2 |
* Chill runtime moved into toplevel libchill.
* Makefile.in Revamped due to move. Add multilib support.
* configure.in: Similarly. Use autoconf.
* powerset.h: Do not depend on BITS_PER_UNIT.
From-SVN: r22238
Diffstat (limited to 'libchill/exh.c')
-rw-r--r-- | libchill/exh.c | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/libchill/exh.c b/libchill/exh.c new file mode 100644 index 0000000..59f7434 --- /dev/null +++ b/libchill/exh.c @@ -0,0 +1,152 @@ +/* Implement runtime actions for CHILL. + Copyright (C) 1992,1993 Free Software Foundation, Inc. + Author: Wilfried Moser + +This file is part of GNU CC. + +GNU CC 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 2, or (at your option) +any later version. + +GNU CC 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. + +You should have received a copy of the GNU General Public License +along with GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#define __CHILL_LIB__ + +#include "config.h" +#include <stdio.h> +#include <setjmp.h> +#include "rtltypes.h" + +extern void cause_exception (char *exname, char *file, int lineno, int user_arg); +extern void unhandled_exception (char *exname, char *file, int lineno, int user_arg); + +/* An action with a handler: + BODY ON (e1, e2): H12; (e3): H3; ELSE HE; END; + is translated into: + + struct __ch_handler __tmp; + static struct __ch_handler_excepts _H[4] = + { + { <<e1>>, 1 }, + { <<e2>>, 1 }, + { <<e3>>, 2 }, + { __ch_else_except, 3 }, + }; + __ch_link_handler(&__tmp); + __tmp.handlers = _H; + switch (setmp(&__tmp.jbuf)) + { + case 0: BODY; __ch_unlink_handler(&__tmp); break; + case 1: H12; break; + case 2: H3; break; + case 3: HE; break; + } +*/ + +/* this part contains all neccessary functions to handle exceptions in CHILL */ + +/* These two trivial function aren't inlines, to allow for + more flexibility (e.g. a per-thread exception stack). */ + +extern void __setexceptionStack (TExceptionHandlerStack *new); +extern TExceptionHandlerStack * __getexceptionStack (void); + +void +__ch_link_handler (handler) + struct __ch_handler *handler; +{ + handler->prev = __getexceptionStack (); + __setexceptionStack (handler); +} + + void +__ch_unlink_handler (handler) + struct __ch_handler *handler; +{ + __setexceptionStack (handler->prev); +} + +/* + * function __cause_exception + * + * parameters: + * exnum name string of exception to raise + * file filename of CAUSE statement + * lineno linenumber of CAUSE statement + * user_arg user specified argument + * + * returns: + * never leave function with longjmp or abort + * + * abstract: + * search exceptionstack for last handler of caused exception, + * call userdefined function to signal exception, + * jump to handler with longjmp or call unhandled_exception + * + */ + +void +__cause_exception (ex, file, lineno, user_arg) + char *ex; + char *file; + int lineno; + int user_arg; +{ + register struct __ch_handler *handler = __getexceptionStack(); + + /* call user defined cause function */ + cause_exception (ex, file, lineno, user_arg); + + for ( ; handler != NULL; handler = handler->prev) + { + register struct __ch_handled_excepts *list = handler->handlers; + for ( ; list->code != 0; list++ ) + { + if (list->ex == __ch_else_except || EX_EQ(list->ex, ex)) /* found */ + { + __setexceptionStack (handler->prev); + longjmp(handler->jbuf, list->code); + } + } + } + + /* no handler found -- call unhandled_exception */ + unhandled_exception (ex, file, lineno, user_arg); + abort (); +} + +/* + * function __cause_ex1 + * + * parameters: + * exnum name string of exception to raise + * file filename of CAUSE statement + * lineno linenumber of CAUSE statement + * + * returns: + * never leave function with longjmp or abort + * + * abstract: + * This is the function the compiler generated code calls. + * Search exceptionstack for last handler of caused exception, + * call userdefined function to signal exception, + * jump to handler with longjmp or call unhandled_exception + * + */ + +void +__cause_ex1 (ex, file, lineno) + char *ex; + char *file; + int lineno; +{ + __cause_exception (ex, file, lineno, 0); +} |