From 39fe7e6f8e9fb9af5456e861018963eb1f38a6c6 Mon Sep 17 00:00:00 2001 From: Alan Donovan Date: Tue, 14 Jan 2014 21:47:31 -0500 Subject: [PATCH] go.tools/ssa/interp: fix windows build. - Add missing import. - platform-specific files syswrite() wrapper presents standard API to syscall.Write, even on Windows where first arg is a Handle. Fixes golang/go#7100 R=gri, minux.ma, alex.brainman CC=golang-codereviews https://golang.org/cl/52250043 --- ssa/interp/external_plan9.go | 6 ++++++ ssa/interp/external_unix.go | 4 ++++ ssa/interp/external_windows.go | 5 +++++ ssa/interp/ops.go | 4 ++-- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/ssa/interp/external_plan9.go b/ssa/interp/external_plan9.go index 6afb6437..19d638a9 100644 --- a/ssa/interp/external_plan9.go +++ b/ssa/interp/external_plan9.go @@ -5,6 +5,8 @@ package interp import ( + "syscall" + "code.google.com/p/go.tools/ssa" ) @@ -43,3 +45,7 @@ func ext۰syscall۰Write(fn *ssa.Function, args []value) value { func ext۰syscall۰RawSyscall(fn *ssa.Function, args []value) value { return tuple{^uintptr(0), uintptr(0), uintptr(0)} } + +func syswrite(fd int, b []byte) (int, error) { + return syscall.Write(fd, b) +} diff --git a/ssa/interp/external_unix.go b/ssa/interp/external_unix.go index e6dbdd3e..8b6f4a7d 100644 --- a/ssa/interp/external_unix.go +++ b/ssa/interp/external_unix.go @@ -130,3 +130,7 @@ func ext۰syscall۰Write(fn *ssa.Function, args []value) value { func ext۰syscall۰RawSyscall(fn *ssa.Function, args []value) value { return tuple{uintptr(0), uintptr(0), uintptr(syscall.ENOSYS)} } + +func syswrite(fd int, b []byte) (int, error) { + return syscall.Write(fd, b) +} diff --git a/ssa/interp/external_windows.go b/ssa/interp/external_windows.go index 77a04949..9d3e1c20 100644 --- a/ssa/interp/external_windows.go +++ b/ssa/interp/external_windows.go @@ -5,6 +5,8 @@ package interp import ( + "syscall" + "code.google.com/p/go.tools/ssa" ) @@ -41,3 +43,6 @@ func ext۰syscall۰Write(fn *ssa.Function, args []value) value { func ext۰syscall۰RawSyscall(fn *ssa.Function, args []value) value { return tuple{uintptr(0), uintptr(0), uintptr(syscall.ENOSYS)} } +func syswrite(fd int, b []byte) (int, error) { + panic("syswrite not yet implemented") +} diff --git a/ssa/interp/ops.go b/ssa/interp/ops.go index 3af2b336..7842dda7 100644 --- a/ssa/interp/ops.go +++ b/ssa/interp/ops.go @@ -10,7 +10,6 @@ import ( "go/token" "strings" "sync" - "syscall" "unsafe" "code.google.com/p/go.tools/go/exact" @@ -910,12 +909,13 @@ var capturedOutputMu sync.Mutex // The print/println built-ins and the write() system call funnel // through here so they can be captured by the test driver. func write(fd int, b []byte) (int, error) { + // TODO(adonovan): fix: on Windows, std{out,err} are not 1, 2. if CapturedOutput != nil && (fd == 1 || fd == 2) { capturedOutputMu.Lock() CapturedOutput.Write(b) // ignore errors capturedOutputMu.Unlock() } - return syscall.Write(fd, b) + return syswrite(fd, b) } // callBuiltin interprets a call to builtin fn with arguments args,