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,