blob: fd79bc8dd63749d29447d62c167028288134bd85 [file] [log] [blame]
// Copyright 2014 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.
package runtime
import (
"unsafe"
)
// these 4 functions are complicated enough that we will share
// the print logic with the C printf.
var (
printstring_m,
printuint_m,
printhex_m,
printfloat_m mFunction
)
func printstring(s string) {
mp := acquirem()
mp.scalararg[0] = uintptr(len(s))
mp.ptrarg[0] = (*stringStruct)(unsafe.Pointer(&s)).str
onM(&printstring_m)
releasem(mp)
}
func printuint(x uint64) {
mp := acquirem()
*(*uint64)(unsafe.Pointer(&mp.scalararg[0])) = x
onM(&printuint_m)
releasem(mp)
}
func printhex(x uintptr) {
mp := acquirem()
mp.scalararg[0] = uintptr(x)
onM(&printhex_m)
releasem(mp)
}
func printfloat(x float64) {
mp := acquirem()
*(*float64)(unsafe.Pointer(&mp.scalararg[0])) = x
onM(&printfloat_m)
releasem(mp)
}
// all other print functions are expressible as combinations
// of the above 4 functions.
func printnl() {
printstring("\n")
}
func printsp() {
printstring(" ")
}
func printbool(b bool) {
if b {
printstring("true")
} else {
printstring("false")
}
}
func printpointer(p unsafe.Pointer) {
printhex(uintptr(p))
}
func printint(x int64) {
if x < 0 {
printstring("-")
x = -x
}
printuint(uint64(x))
}
func printcomplex(x complex128) {
printstring("(")
printfloat(real(x))
printfloat(imag(x))
printstring("i)")
}
func printiface(i interface {
f()
}) {
printstring("(")
printhex((*[2]uintptr)(unsafe.Pointer(&i))[0])
printstring(",")
printhex((*[2]uintptr)(unsafe.Pointer(&i))[1])
printstring(")")
}
func printeface(e interface{}) {
printstring("(")
printhex((*[2]uintptr)(unsafe.Pointer(&e))[0])
printstring(",")
printhex((*[2]uintptr)(unsafe.Pointer(&e))[1])
printstring(")")
}
func printslice(b []byte) {
printstring("[")
printint(int64(len(b)))
printstring("/")
printint(int64(cap(b)))
printstring("]")
printhex((*[3]uintptr)(unsafe.Pointer(&b))[0])
}