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:
parent
eb982727e3
commit
e7ee3c1fa8
@ -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():
|
||||||
|
@ -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:])
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user