| // Copyright 2012 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. | |
| #include "runtime.h" | |
| extern void gothrow(String) __attribute__((noreturn)); | |
| extern void gothrow(String) __asm__(GOSYM_PREFIX "runtime.throw"); | |
| void | |
| runtime_throw(const char *s) | |
| { | |
| gothrow(runtime_gostringnocopy((const byte *)s)); | |
| } | |
| void | |
| runtime_panicstring(const char *s) | |
| { | |
| G *gp; | |
| Eface err; | |
| gp = runtime_g(); | |
| if (gp == nil) { | |
| runtime_printf("panic: %s\n", s); | |
| runtime_throw("panic with no g"); | |
| } | |
| if (gp->m == nil) { | |
| runtime_printf("panic: %s\n", s); | |
| runtime_throw("panic with no m"); | |
| } | |
| if (gp->m->curg != gp) { | |
| runtime_printf("panic: %s\n", s); | |
| runtime_throw("panic on system stack"); | |
| } | |
| if (gp->m->mallocing != 0) { | |
| runtime_printf("panic: %s\n", s); | |
| runtime_throw("panic during malloc"); | |
| } | |
| if (gp->m->preemptoff.len != 0) { | |
| runtime_printf("panic: %s\n", s); | |
| runtime_printf("preempt off reason: %S\n", gp->m->preemptoff); | |
| runtime_throw("panic during preemptoff"); | |
| } | |
| if (gp->m->locks != 0) { | |
| runtime_printf("panic: %s\n", s); | |
| runtime_throw("panic holding locks"); | |
| } | |
| runtime_newErrorCString((uintptr) s, &err); | |
| runtime_panic(err); | |
| } | |
| extern void runtime_abort(void) __asm__(GOSYM_PREFIX "runtime.abort"); | |
| void | |
| runtime_abort() | |
| { | |
| abort(); | |
| } |