Skip to content

Commit

Permalink
os: report Windows exit status in hex
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
rsc committed Feb 19, 2021
1 parent eb98272 commit e7ee3c1
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 3 deletions.
7 changes: 6 additions & 1 deletion src/os/exec_posix.go
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand Down
36 changes: 34 additions & 2 deletions src/os/str.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@

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))
}
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"
Expand All @@ -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:])
}

0 comments on commit e7ee3c1

Please sign in to comment.