mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-03 18:47:47 +00:00
564b1b3312
This reduces complexity in the compiler without affecting binary sizes too much. Cortex-M0: no changes Linux x64: no changes WebAssembly: some testcases (calls, coroutines, map) are slightly bigger
65 lines
1.7 KiB
Go
65 lines
1.7 KiB
Go
package runtime
|
|
|
|
// trap is a compiler hint that this function cannot be executed. It is
|
|
// translated into either a trap instruction or a call to abort().
|
|
//go:export llvm.trap
|
|
func trap()
|
|
|
|
// Builtin function panic(msg), used as a compiler intrinsic.
|
|
func _panic(message interface{}) {
|
|
printstring("panic: ")
|
|
printitf(message)
|
|
printnl()
|
|
abort()
|
|
}
|
|
|
|
// Cause a runtime panic, which is (currently) always a string.
|
|
func runtimePanic(msg string) {
|
|
printstring("panic: runtime error: ")
|
|
println(msg)
|
|
abort()
|
|
}
|
|
|
|
// Try to recover a panicking goroutine.
|
|
func _recover() interface{} {
|
|
// Deferred functions are currently not executed during panic, so there is
|
|
// no way this can return anything besides nil.
|
|
return nil
|
|
}
|
|
|
|
// Check for bounds in *ssa.Index, *ssa.IndexAddr and *ssa.Lookup.
|
|
func lookupBoundsCheck(length uintptr, index int) {
|
|
if index < 0 || index >= int(length) {
|
|
runtimePanic("index out of range")
|
|
}
|
|
}
|
|
|
|
// Check for bounds in *ssa.Index, *ssa.IndexAddr and *ssa.Lookup.
|
|
// Supports 64-bit indexes.
|
|
func lookupBoundsCheckLong(length uintptr, index int64) {
|
|
if index < 0 || index >= int64(length) {
|
|
runtimePanic("index out of range")
|
|
}
|
|
}
|
|
|
|
// Check for bounds in *ssa.Slice.
|
|
func sliceBoundsCheck(capacity, low, high uintptr) {
|
|
if !(0 <= low && low <= high && high <= capacity) {
|
|
runtimePanic("slice out of range")
|
|
}
|
|
}
|
|
|
|
// Check for bounds in *ssa.Slice. Supports 64-bit indexes.
|
|
func sliceBoundsCheck64(capacity uintptr, low, high uint64) {
|
|
if !(0 <= low && low <= high && high <= uint64(capacity)) {
|
|
runtimePanic("slice out of range")
|
|
}
|
|
}
|
|
|
|
// Check for bounds in *ssa.MakeSlice.
|
|
func sliceBoundsCheckMake(length, capacity uint) {
|
|
if !(0 <= length && length <= capacity) {
|
|
runtimePanic("slice size out of range")
|
|
}
|
|
}
|