| /* go-panic.h -- declare the go panic functions. |
| |
| Copyright 2009 The Go Authors. All rights reserved. |
| Use of this source code is governed by a BSD-style |
| license that can be found in the LICENSE file. */ |
| |
| #ifndef LIBGO_GO_PANIC_H |
| #define LIBGO_GO_PANIC_H |
| |
| #include "interface.h" |
| |
| struct __go_string; |
| struct __go_type_descriptor; |
| struct __go_defer_stack; |
| |
| /* The stack of panic calls. */ |
| |
| struct __go_panic_stack |
| { |
| /* The next entry in the stack. */ |
| struct __go_panic_stack *__next; |
| |
| /* The value associated with this panic. */ |
| struct __go_empty_interface __arg; |
| |
| /* Whether this panic has been recovered. */ |
| _Bool __was_recovered; |
| |
| /* Whether this panic was pushed on the stack because of an |
| exception thrown in some other language. */ |
| _Bool __is_foreign; |
| }; |
| |
| /* The panic and defer stacks, grouped together into a single thread |
| local variable for convenience for systems without TLS. */ |
| |
| struct __go_panic_defer_struct |
| { |
| /* The list of defers to execute. */ |
| struct __go_defer_stack *__defer; |
| |
| /* The list of currently active panics. There will be more than one |
| if a deferred function calls panic. */ |
| struct __go_panic_stack *__panic; |
| |
| /* The current exception being thrown when unwinding after a call to |
| panic . This is really struct _UnwindException *. */ |
| void *__exception; |
| |
| /* Whether the current exception is from some other language. */ |
| _Bool __is_foreign; |
| }; |
| |
| #ifdef __rtems__ |
| #define __thread |
| #endif |
| |
| extern __thread struct __go_panic_defer_struct *__go_panic_defer; |
| |
| #ifdef __rtems__ |
| #undef __thread |
| #endif |
| |
| extern void __go_panic (struct __go_empty_interface) |
| __attribute__ ((noreturn)); |
| |
| extern void __go_panic_msg (const char* msg) |
| __attribute__ ((noreturn)); |
| |
| extern void __go_print_string (struct __go_string); |
| |
| extern struct __go_empty_interface __go_recover (void); |
| |
| extern void __go_unwind_stack (void); |
| |
| /* Functions defined in libgo/go/runtime/error.go. */ |
| |
| extern void newTypeAssertionError(const struct __go_type_descriptor *pt1, |
| const struct __go_type_descriptor *pt2, |
| const struct __go_type_descriptor *pt3, |
| const struct __go_string *ps1, |
| const struct __go_string *ps2, |
| const struct __go_string *ps3, |
| const struct __go_string *pmeth, |
| struct __go_empty_interface *ret) |
| __asm__ ("libgo_runtime.runtime.NewTypeAssertionError"); |
| |
| extern void newErrorString(struct __go_string, struct __go_empty_interface *) |
| __asm__ ("libgo_runtime.runtime.NewErrorString"); |
| |
| extern void printany(struct __go_empty_interface) |
| __asm__ ("libgo_runtime.runtime.Printany"); |
| |
| #endif /* !defined(LIBGO_GO_PANIC_H) */ |