1 /* Implement runtime actions for CHILL.
2 Copyright (C) 1992,1993 Free Software Foundation, Inc.
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
27 extern void cause_exception (char *exname
, char *file
, int lineno
, int user_arg
);
28 extern void unhandled_exception (char *exname
, char *file
, int lineno
, int user_arg
);
30 /* An action with a handler:
31 BODY ON (e1, e2): H12; (e3): H3; ELSE HE; END;
34 struct __ch_handler __tmp;
35 static struct __ch_handler_excepts _H[4] =
40 { __ch_else_except, 3 },
42 __ch_link_handler(&__tmp);
44 switch (setmp(&__tmp.jbuf))
46 case 0: BODY; __ch_unlink_handler(&__tmp); break;
53 /* this part contains all neccessary functions to handle exceptions in CHILL */
55 /* These two trivial function aren't inlines, to allow for
56 more flexibility (e.g. a per-thread exception stack). */
58 extern void __setexceptionStack (TExceptionHandlerStack
*new);
59 extern TExceptionHandlerStack
* __getexceptionStack (void);
62 __ch_link_handler (handler
)
63 struct __ch_handler
*handler
;
65 handler
->prev
= __getexceptionStack ();
66 __setexceptionStack (handler
);
70 __ch_unlink_handler (handler
)
71 struct __ch_handler
*handler
;
73 __setexceptionStack (handler
->prev
);
77 * function __cause_exception
80 * exnum name string of exception to raise
81 * file filename of CAUSE statement
82 * lineno linenumber of CAUSE statement
83 * user_arg user specified argument
86 * never leave function with longjmp or abort
89 * search exceptionstack for last handler of caused exception,
90 * call userdefined function to signal exception,
91 * jump to handler with longjmp or call unhandled_exception
96 __cause_exception (ex
, file
, lineno
, user_arg
)
102 register struct __ch_handler
*handler
= __getexceptionStack();
104 /* call user defined cause function */
105 cause_exception (ex
, file
, lineno
, user_arg
);
107 for ( ; handler
!= NULL
; handler
= handler
->prev
)
109 register struct __ch_handled_excepts
*list
= handler
->handlers
;
110 for ( ; list
->code
!= 0; list
++ )
112 if (list
->ex
== __ch_else_except
|| EX_EQ(list
->ex
, ex
)) /* found */
114 __setexceptionStack (handler
->prev
);
115 longjmp(handler
->jbuf
, list
->code
);
120 /* no handler found -- call unhandled_exception */
121 unhandled_exception (ex
, file
, lineno
, user_arg
);
126 * function __cause_ex1
129 * exnum name string of exception to raise
130 * file filename of CAUSE statement
131 * lineno linenumber of CAUSE statement
134 * never leave function with longjmp or abort
137 * This is the function the compiler generated code calls.
138 * Search exceptionstack for last handler of caused exception,
139 * call userdefined function to signal exception,
140 * jump to handler with longjmp or call unhandled_exception
145 __cause_ex1 (ex
, file
, lineno
)
150 __cause_exception (ex
, file
, lineno
, 0);