1
0
mirror of https://github.com/golang/go synced 2024-11-17 13:54:46 -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:
Russ Cox 2021-01-30 07:27:24 -05:00
parent eb982727e3
commit e7ee3c1fa8
2 changed files with 40 additions and 3 deletions

View File

@ -102,7 +102,12 @@ func (p *ProcessState) String() string {
res := "" res := ""
switch { switch {
case status.Exited(): 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(): case status.Signaled():
res = "signal: " + status.Signal().String() res = "signal: " + status.Signal().String()
case status.Stopped(): case status.Stopped():

View File

@ -6,7 +6,7 @@
package os package os
// Convert integer to decimal string // itoa converts val (an int) to a decimal string.
func itoa(val int) string { func itoa(val int) string {
if val < 0 { if val < 0 {
return "-" + uitoa(uint(-val)) return "-" + uitoa(uint(-val))
@ -14,7 +14,7 @@ func itoa(val int) string {
return uitoa(uint(val)) return uitoa(uint(val))
} }
// Convert unsigned integer to decimal string // uitoa converts val (a uint) to a decimal string.
func uitoa(val uint) string { func uitoa(val uint) string {
if val == 0 { // avoid string allocation if val == 0 { // avoid string allocation
return "0" return "0"
@ -31,3 +31,35 @@ func uitoa(val uint) string {
buf[i] = byte('0' + val) buf[i] = byte('0' + val)
return string(buf[i:]) 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:])
}