1 /* go-defer.c -- manage the defer stack.
3 Copyright 2009 The Go Authors. All rights reserved.
4 Use of this source code is governed by a BSD-style
5 license that can be found in the LICENSE file. */
13 /* This function is called each time we need to defer a call. */
16 __go_defer (void *frame
, void (*pfn
) (void *), void *arg
)
18 struct __go_defer_stack
*n
;
20 if (__go_panic_defer
== NULL
)
21 __go_panic_defer
= ((struct __go_panic_defer_struct
*)
22 __go_alloc (sizeof (struct __go_panic_defer_struct
)));
24 n
= (struct __go_defer_stack
*) __go_alloc (sizeof (struct __go_defer_stack
));
25 n
->__next
= __go_panic_defer
->__defer
;
27 n
->__panic
= __go_panic_defer
->__panic
;
31 __go_panic_defer
->__defer
= n
;
34 /* This function is called when we want to undefer the stack. */
37 __go_undefer (void *frame
)
39 if (__go_panic_defer
== NULL
)
41 while (__go_panic_defer
->__defer
!= NULL
42 && __go_panic_defer
->__defer
->__frame
== frame
)
44 struct __go_defer_stack
*d
;
47 d
= __go_panic_defer
->__defer
;
54 __go_panic_defer
->__defer
= d
->__next
;
59 /* This function is called to record the address to which the deferred
60 function returns. This may in turn be checked by __go_can_recover.
61 The frontend relies on this function returning false. */
64 __go_set_defer_retaddr (void *retaddr
)
66 if (__go_panic_defer
!= NULL
&& __go_panic_defer
->__defer
!= NULL
)
67 __go_panic_defer
->__defer
->__retaddr
= retaddr
;