mirror of
https://github.com/golang/go
synced 2024-11-26 04:07:59 -07:00
os: report Windows exit status in hex
We print things like “exit status 3221225477” but the standard Windows form is 0xc0000005. This CL is part of a stack adding windows/arm64 support (#36439), intended to land in the Go 1.17 cycle. This CL is, however, not windows/arm64-specific. It is cleanup meant to make the port (and future ports) easier. Change-Id: Iefe447d4d1781b53bef9619f68d386f2866b2934 Reviewed-on: https://go-review.googlesource.com/c/go/+/288792 Trust: Russ Cox <rsc@golang.org> Trust: Jason A. Donenfeld <Jason@zx2c4.com> Reviewed-by: Alex Brainman <alex.brainman@gmail.com> Reviewed-by: Cherry Zhang <cherryyz@google.com> Reviewed-by: Jason A. Donenfeld <Jason@zx2c4.com> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
eb982727e3
commit
e7ee3c1fa8
@ -102,7 +102,12 @@ func (p *ProcessState) String() string {
|
||||
res := ""
|
||||
switch {
|
||||
case status.Exited():
|
||||
res = "exit status " + itoa(status.ExitStatus())
|
||||
code := status.ExitStatus()
|
||||
if runtime.GOOS == "windows" && code >= 1<<16 { // windows uses large hex numbers
|
||||
res = "exit status " + uitox(uint(code))
|
||||
} else { // unix systems use small decimal integers
|
||||
res = "exit status " + itoa(code) // unix
|
||||
}
|
||||
case status.Signaled():
|
||||
res = "signal: " + status.Signal().String()
|
||||
case status.Stopped():
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
package os
|
||||
|
||||
// Convert integer to decimal string
|
||||
// itoa converts val (an int) to a decimal string.
|
||||
func itoa(val int) string {
|
||||
if val < 0 {
|
||||
return "-" + uitoa(uint(-val))
|
||||
@ -14,7 +14,7 @@ func itoa(val int) string {
|
||||
return uitoa(uint(val))
|
||||
}
|
||||
|
||||
// Convert unsigned integer to decimal string
|
||||
// uitoa converts val (a uint) to a decimal string.
|
||||
func uitoa(val uint) string {
|
||||
if val == 0 { // avoid string allocation
|
||||
return "0"
|
||||
@ -31,3 +31,35 @@ func uitoa(val uint) string {
|
||||
buf[i] = byte('0' + val)
|
||||
return string(buf[i:])
|
||||
}
|
||||
|
||||
// itox converts val (an int) to a hexdecimal string.
|
||||
func itox(val int) string {
|
||||
if val < 0 {
|
||||
return "-" + uitox(uint(-val))
|
||||
}
|
||||
return uitox(uint(val))
|
||||
}
|
||||
|
||||
const hex = "0123456789abcdef"
|
||||
|
||||
// uitox converts val (a uint) to a hexdecimal string.
|
||||
func uitox(val uint) string {
|
||||
if val == 0 { // avoid string allocation
|
||||
return "0x0"
|
||||
}
|
||||
var buf [20]byte // big enough for 64bit value base 16 + 0x
|
||||
i := len(buf) - 1
|
||||
for val >= 16 {
|
||||
q := val / 16
|
||||
buf[i] = hex[val%16]
|
||||
i--
|
||||
val = q
|
||||
}
|
||||
// val < 16
|
||||
buf[i] = hex[val%16]
|
||||
i--
|
||||
buf[i] = 'x'
|
||||
i--
|
||||
buf[i] = '0'
|
||||
return string(buf[i:])
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user