aboutsummaryrefslogtreecommitdiff
path: root/libgo/go/internal
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2020-01-02 15:05:27 -0800
committerIan Lance Taylor <iant@golang.org>2020-01-21 23:53:22 -0800
commit5a8ea165926cb0737ab03bc48c18dc5198ab5305 (patch)
tree962dc3357c57f019f85658f99e2e753e30201c27 /libgo/go/internal
parent6ac6529e155c9baa0aaaed7aca06bd38ebda5b43 (diff)
downloadgcc-5a8ea165926cb0737ab03bc48c18dc5198ab5305.zip
gcc-5a8ea165926cb0737ab03bc48c18dc5198ab5305.tar.gz
gcc-5a8ea165926cb0737ab03bc48c18dc5198ab5305.tar.bz2
libgo: update to Go1.14beta1
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/214297
Diffstat (limited to 'libgo/go/internal')
-rw-r--r--libgo/go/internal/bytealg/compare_generic.go2
-rw-r--r--libgo/go/internal/bytealg/compare_native.go2
-rw-r--r--libgo/go/internal/bytealg/count_generic.go2
-rw-r--r--libgo/go/internal/bytealg/count_native.go2
-rw-r--r--libgo/go/internal/bytealg/indexbyte_generic.go2
-rw-r--r--libgo/go/internal/bytealg/indexbyte_native.go2
-rw-r--r--libgo/go/internal/cfg/cfg.go1
-rw-r--r--libgo/go/internal/cpu/cpu.go2
-rw-r--r--libgo/go/internal/cpu/cpu_no_init.go1
-rw-r--r--libgo/go/internal/cpu/cpu_riscv64.go (renamed from libgo/go/internal/cpu/cpu_amd64p32.go)4
-rw-r--r--libgo/go/internal/cpu/cpu_x86.go6
-rw-r--r--libgo/go/internal/cpu/cpu_x86_test.go2
-rw-r--r--libgo/go/internal/fmtsort/sort.go14
-rw-r--r--libgo/go/internal/fmtsort/sort_test.go2
-rw-r--r--libgo/go/internal/goroot/gc.go15
-rw-r--r--libgo/go/internal/goversion/goversion.go2
-rw-r--r--libgo/go/internal/obscuretestdata/obscuretestdata.go51
-rw-r--r--libgo/go/internal/poll/export_posix_test.go2
-rw-r--r--libgo/go/internal/poll/fd_fsync_posix.go2
-rw-r--r--libgo/go/internal/poll/fd_poll_js.go (renamed from libgo/go/internal/poll/fd_poll_nacljs.go)2
-rw-r--r--libgo/go/internal/poll/fd_posix.go2
-rw-r--r--libgo/go/internal/poll/fd_posix_test.go2
-rw-r--r--libgo/go/internal/poll/fd_unix.go2
-rw-r--r--libgo/go/internal/poll/hook_unix.go2
-rw-r--r--libgo/go/internal/poll/sendfile_windows.go61
-rw-r--r--libgo/go/internal/poll/sys_cloexec.go2
-rw-r--r--libgo/go/internal/reflectlite/reflect_mirror_test.go131
-rw-r--r--libgo/go/internal/reflectlite/set_test.go9
-rw-r--r--libgo/go/internal/reflectlite/type.go6
-rw-r--r--libgo/go/internal/reflectlite/value.go12
-rw-r--r--libgo/go/internal/singleflight/singleflight_test.go2
-rw-r--r--libgo/go/internal/syscall/unix/getrandom_linux_generic.go10
-rw-r--r--libgo/go/internal/syscall/unix/nonblocking_nacl.go9
-rw-r--r--libgo/go/internal/syscall/windows/mksyscall.go2
-rw-r--r--libgo/go/internal/syscall/windows/registry/mksyscall.go2
-rw-r--r--libgo/go/internal/syscall/windows/registry/registry_test.go80
-rw-r--r--libgo/go/internal/syscall/windows/registry/value.go11
-rw-r--r--libgo/go/internal/syscall/windows/reparse_windows.go10
-rw-r--r--libgo/go/internal/syscall/windows/syscall_windows.go20
-rw-r--r--libgo/go/internal/testenv/testenv.go10
-rw-r--r--libgo/go/internal/testenv/testenv_notwin.go2
41 files changed, 326 insertions, 179 deletions
diff --git a/libgo/go/internal/bytealg/compare_generic.go b/libgo/go/internal/bytealg/compare_generic.go
index c72bf12..a29e8e7 100644
--- a/libgo/go/internal/bytealg/compare_generic.go
+++ b/libgo/go/internal/bytealg/compare_generic.go
@@ -3,7 +3,7 @@
// license that can be found in the LICENSE file.
// +build ignore_for_gccgo
-// +build !386,!amd64,!amd64p32,!s390x,!arm,!arm64,!ppc64,!ppc64le,!mips,!mipsle,!wasm
+// +build !386,!amd64,!s390x,!arm,!arm64,!ppc64,!ppc64le,!mips,!mipsle,!wasm,!mips64,!mips64le
package bytealg
diff --git a/libgo/go/internal/bytealg/compare_native.go b/libgo/go/internal/bytealg/compare_native.go
index 844d6698..b189998 100644
--- a/libgo/go/internal/bytealg/compare_native.go
+++ b/libgo/go/internal/bytealg/compare_native.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// -build 386 amd64 amd64p32 s390x arm arm64 ppc64 ppc64le mips mipsle wasm
+// -build 386 amd64 s390x arm arm64 ppc64 ppc64le mips mipsle wasm mips64 mips64le
package bytealg
diff --git a/libgo/go/internal/bytealg/count_generic.go b/libgo/go/internal/bytealg/count_generic.go
index bdec269..e95cd1c 100644
--- a/libgo/go/internal/bytealg/count_generic.go
+++ b/libgo/go/internal/bytealg/count_generic.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// -build !amd64,!arm,!arm64,!ppc64le,!ppc64
+// -build !amd64,!arm,!arm64,!ppc64le,!ppc64,!s390x
package bytealg
diff --git a/libgo/go/internal/bytealg/count_native.go b/libgo/go/internal/bytealg/count_native.go
index e084e43..16ff348 100644
--- a/libgo/go/internal/bytealg/count_native.go
+++ b/libgo/go/internal/bytealg/count_native.go
@@ -3,7 +3,7 @@
// license that can be found in the LICENSE file.
// +build ignore_for_gccgo
-// +build amd64 arm arm64 ppc64le ppc64
+// +build amd64 arm arm64 ppc64le ppc64 s390x
package bytealg
diff --git a/libgo/go/internal/bytealg/indexbyte_generic.go b/libgo/go/internal/bytealg/indexbyte_generic.go
index d39dfa8..a863d81 100644
--- a/libgo/go/internal/bytealg/indexbyte_generic.go
+++ b/libgo/go/internal/bytealg/indexbyte_generic.go
@@ -3,7 +3,7 @@
// license that can be found in the LICENSE file.
// +build ignore_for_gccgo
-// +build !386,!amd64,!amd64p32,!s390x,!arm,!arm64,!ppc64,!ppc64le,!mips,!mipsle,!mips64,!mips64le,!wasm
+// +build !386,!amd64,!s390x,!arm,!arm64,!ppc64,!ppc64le,!mips,!mipsle,!mips64,!mips64le,!riscv64,!wasm
package bytealg
diff --git a/libgo/go/internal/bytealg/indexbyte_native.go b/libgo/go/internal/bytealg/indexbyte_native.go
index 5cf6fed..20da788 100644
--- a/libgo/go/internal/bytealg/indexbyte_native.go
+++ b/libgo/go/internal/bytealg/indexbyte_native.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// -build 386 amd64 amd64p32 s390x arm arm64 ppc64 ppc64le mips mipsle mips64 mips64le wasm
+// -build 386 amd64 s390x arm arm64 ppc64 ppc64le mips mipsle mips64 mips64le riscv64 wasm
package bytealg
diff --git a/libgo/go/internal/cfg/cfg.go b/libgo/go/internal/cfg/cfg.go
index 4c2cf8e..0d227ec 100644
--- a/libgo/go/internal/cfg/cfg.go
+++ b/libgo/go/internal/cfg/cfg.go
@@ -43,6 +43,7 @@ const KnownEnv = `
GOGCCFLAGS
GOHOSTARCH
GOHOSTOS
+ GOINSECURE
GOMIPS
GOMIPS64
GONOPROXY
diff --git a/libgo/go/internal/cpu/cpu.go b/libgo/go/internal/cpu/cpu.go
index 76fc878..f326b06 100644
--- a/libgo/go/internal/cpu/cpu.go
+++ b/libgo/go/internal/cpu/cpu.go
@@ -160,7 +160,7 @@ type option struct {
// processOptions enables or disables CPU feature values based on the parsed env string.
// The env string is expected to be of the form cpu.feature1=value1,cpu.feature2=value2...
-// where feature names is one of the architecture specifc list stored in the
+// where feature names is one of the architecture specific list stored in the
// cpu packages options variable and values are either 'on' or 'off'.
// If env contains cpu.all=off then all cpu features referenced through the options
// variable are disabled. Other feature names and values result in warning messages.
diff --git a/libgo/go/internal/cpu/cpu_no_init.go b/libgo/go/internal/cpu/cpu_no_init.go
index 777ea9d..d4b2be8 100644
--- a/libgo/go/internal/cpu/cpu_no_init.go
+++ b/libgo/go/internal/cpu/cpu_no_init.go
@@ -4,7 +4,6 @@
// +build !386
// +build !amd64
-// +build !amd64p32
// +build !arm
// +build !arm64
// +build !ppc64
diff --git a/libgo/go/internal/cpu/cpu_amd64p32.go b/libgo/go/internal/cpu/cpu_riscv64.go
index 177b14e..c49cab7 100644
--- a/libgo/go/internal/cpu/cpu_amd64p32.go
+++ b/libgo/go/internal/cpu/cpu_riscv64.go
@@ -1,7 +1,7 @@
-// Copyright 2018 The Go Authors. All rights reserved.
+// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package cpu
-const GOARCH = "amd64p32"
+const CacheLinePadSize = 32
diff --git a/libgo/go/internal/cpu/cpu_x86.go b/libgo/go/internal/cpu/cpu_x86.go
index fc9b9d3..eceeb44 100644
--- a/libgo/go/internal/cpu/cpu_x86.go
+++ b/libgo/go/internal/cpu/cpu_x86.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build 386 amd64 amd64p32
+// +build 386 amd64
package cpu
@@ -53,8 +53,8 @@ func doinit() {
{Name: "sse42", Feature: &X86.HasSSE42},
{Name: "ssse3", Feature: &X86.HasSSSE3},
- // These capabilities should always be enabled on amd64(p32):
- {Name: "sse2", Feature: &X86.HasSSE2, Required: GOARCH == "amd64" || GOARCH == "amd64p32"},
+ // These capabilities should always be enabled on amd64:
+ {Name: "sse2", Feature: &X86.HasSSE2, Required: GOARCH == "amd64"},
}
maxID, _, _, _ := cpuid(0, 0)
diff --git a/libgo/go/internal/cpu/cpu_x86_test.go b/libgo/go/internal/cpu/cpu_x86_test.go
index 9e93d1a..61db93b 100644
--- a/libgo/go/internal/cpu/cpu_x86_test.go
+++ b/libgo/go/internal/cpu/cpu_x86_test.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build 386 amd64 amd64p32
+// +build 386 amd64
package cpu_test
diff --git a/libgo/go/internal/fmtsort/sort.go b/libgo/go/internal/fmtsort/sort.go
index 70a305a..b01229bd 100644
--- a/libgo/go/internal/fmtsort/sort.go
+++ b/libgo/go/internal/fmtsort/sort.go
@@ -53,12 +53,16 @@ func Sort(mapValue reflect.Value) *SortedMap {
if mapValue.Type().Kind() != reflect.Map {
return nil
}
- key := make([]reflect.Value, mapValue.Len())
- value := make([]reflect.Value, len(key))
+ // Note: this code is arranged to not panic even in the presence
+ // of a concurrent map update. The runtime is responsible for
+ // yelling loudly if that happens. See issue 33275.
+ n := mapValue.Len()
+ key := make([]reflect.Value, 0, n)
+ value := make([]reflect.Value, 0, n)
iter := mapValue.MapRange()
- for i := 0; iter.Next(); i++ {
- key[i] = iter.Key()
- value[i] = iter.Value()
+ for iter.Next() {
+ key = append(key, iter.Key())
+ value = append(value, iter.Value())
}
sorted := &SortedMap{
Key: key,
diff --git a/libgo/go/internal/fmtsort/sort_test.go b/libgo/go/internal/fmtsort/sort_test.go
index e060d4b..aaa0004 100644
--- a/libgo/go/internal/fmtsort/sort_test.go
+++ b/libgo/go/internal/fmtsort/sort_test.go
@@ -119,7 +119,7 @@ var sortTests = []sortTest{
"PTR0:0 PTR1:1 PTR2:2",
},
{
- map[toy]string{toy{7, 2}: "72", toy{7, 1}: "71", toy{3, 4}: "34"},
+ map[toy]string{{7, 2}: "72", {7, 1}: "71", {3, 4}: "34"},
"{3 4}:34 {7 1}:71 {7 2}:72",
},
{
diff --git a/libgo/go/internal/goroot/gc.go b/libgo/go/internal/goroot/gc.go
index 9d846d8..0f541d7 100644
--- a/libgo/go/internal/goroot/gc.go
+++ b/libgo/go/internal/goroot/gc.go
@@ -121,18 +121,9 @@ func (gd *gccgoDirs) isStandard(path string) bool {
}
for _, dir := range gd.dirs {
- full := filepath.Join(dir, path)
- pkgdir, pkg := filepath.Split(full)
- for _, p := range [...]string{
- full,
- full + ".gox",
- pkgdir + "lib" + pkg + ".so",
- pkgdir + "lib" + pkg + ".a",
- full + ".o",
- } {
- if fi, err := os.Stat(p); err == nil && !fi.IsDir() {
- return true
- }
+ full := filepath.Join(dir, path) + ".gox"
+ if fi, err := os.Stat(full); err == nil && !fi.IsDir() {
+ return true
}
}
diff --git a/libgo/go/internal/goversion/goversion.go b/libgo/go/internal/goversion/goversion.go
index 8f9c7c9..c5783337 100644
--- a/libgo/go/internal/goversion/goversion.go
+++ b/libgo/go/internal/goversion/goversion.go
@@ -10,4 +10,4 @@ package goversion
//
// When incrementing this, also add to the list at src/go/build/doc.go
// (search for "onward").
-const Version = 13
+const Version = 14
diff --git a/libgo/go/internal/obscuretestdata/obscuretestdata.go b/libgo/go/internal/obscuretestdata/obscuretestdata.go
new file mode 100644
index 0000000..512f375
--- /dev/null
+++ b/libgo/go/internal/obscuretestdata/obscuretestdata.go
@@ -0,0 +1,51 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package obscuretestdata contains functionality used by tests to more easily
+// work with testdata that must be obscured primarily due to
+// golang.org/issue/34986.
+package obscuretestdata
+
+import (
+ "encoding/base64"
+ "io"
+ "io/ioutil"
+ "os"
+)
+
+// DecodeToTempFile decodes the named file to a temporary location.
+// If successful, it returns the path of the decoded file.
+// The caller is responsible for ensuring that the temporary file is removed.
+func DecodeToTempFile(name string) (path string, err error) {
+ f, err := os.Open(name)
+ if err != nil {
+ return "", err
+ }
+ defer f.Close()
+
+ tmp, err := ioutil.TempFile("", "obscuretestdata-decoded-")
+ if err != nil {
+ return "", err
+ }
+ if _, err := io.Copy(tmp, base64.NewDecoder(base64.StdEncoding, f)); err != nil {
+ tmp.Close()
+ os.Remove(tmp.Name())
+ return "", err
+ }
+ if err := tmp.Close(); err != nil {
+ os.Remove(tmp.Name())
+ return "", err
+ }
+ return tmp.Name(), nil
+}
+
+// ReadFile reads the named file and returns its decoded contents.
+func ReadFile(name string) ([]byte, error) {
+ f, err := os.Open(name)
+ if err != nil {
+ return nil, err
+ }
+ defer f.Close()
+ return ioutil.ReadAll(base64.NewDecoder(base64.StdEncoding, f))
+}
diff --git a/libgo/go/internal/poll/export_posix_test.go b/libgo/go/internal/poll/export_posix_test.go
index 8c78394..8ab4fd6 100644
--- a/libgo/go/internal/poll/export_posix_test.go
+++ b/libgo/go/internal/poll/export_posix_test.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build aix darwin dragonfly freebsd hurd linux nacl netbsd openbsd solaris windows
+// +build aix darwin dragonfly freebsd hurd linux netbsd openbsd solaris windows
// Export guts for testing on posix.
// Since testing imports os and os imports internal/poll,
diff --git a/libgo/go/internal/poll/fd_fsync_posix.go b/libgo/go/internal/poll/fd_fsync_posix.go
index f76f9ec..67b76f8 100644
--- a/libgo/go/internal/poll/fd_fsync_posix.go
+++ b/libgo/go/internal/poll/fd_fsync_posix.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build aix dragonfly freebsd hurd js,wasm linux nacl netbsd openbsd solaris
+// +build aix dragonfly freebsd hurd js,wasm linux netbsd openbsd solaris
package poll
diff --git a/libgo/go/internal/poll/fd_poll_nacljs.go b/libgo/go/internal/poll/fd_poll_js.go
index 0871f34..2bfeb0a 100644
--- a/libgo/go/internal/poll/fd_poll_nacljs.go
+++ b/libgo/go/internal/poll/fd_poll_js.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build nacl js,wasm
+// +build js,wasm
package poll
diff --git a/libgo/go/internal/poll/fd_posix.go b/libgo/go/internal/poll/fd_posix.go
index 7d452df..9eaec36 100644
--- a/libgo/go/internal/poll/fd_posix.go
+++ b/libgo/go/internal/poll/fd_posix.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build aix darwin dragonfly freebsd hurd js,wasm linux nacl netbsd openbsd solaris windows
+// +build aix darwin dragonfly freebsd hurd js,wasm linux netbsd openbsd solaris windows
package poll
diff --git a/libgo/go/internal/poll/fd_posix_test.go b/libgo/go/internal/poll/fd_posix_test.go
index cf2669a..dfcfd5c 100644
--- a/libgo/go/internal/poll/fd_posix_test.go
+++ b/libgo/go/internal/poll/fd_posix_test.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build aix darwin dragonfly freebsd hurd linux nacl netbsd openbsd solaris windows
+// +build aix darwin dragonfly freebsd hurd linux netbsd openbsd solaris windows
package poll_test
diff --git a/libgo/go/internal/poll/fd_unix.go b/libgo/go/internal/poll/fd_unix.go
index bdaf962..6b8e476 100644
--- a/libgo/go/internal/poll/fd_unix.go
+++ b/libgo/go/internal/poll/fd_unix.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build aix darwin dragonfly freebsd hurd js,wasm linux nacl netbsd openbsd solaris
+// +build aix darwin dragonfly freebsd hurd js,wasm linux netbsd openbsd solaris
package poll
diff --git a/libgo/go/internal/poll/hook_unix.go b/libgo/go/internal/poll/hook_unix.go
index 9678cb5..7bb6f88 100644
--- a/libgo/go/internal/poll/hook_unix.go
+++ b/libgo/go/internal/poll/hook_unix.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build aix darwin dragonfly freebsd hurd js,wasm linux nacl netbsd openbsd solaris
+// +build aix darwin dragonfly freebsd hurd js,wasm linux netbsd openbsd solaris
package poll
diff --git a/libgo/go/internal/poll/sendfile_windows.go b/libgo/go/internal/poll/sendfile_windows.go
index 0fe9b9b..5674af4 100644
--- a/libgo/go/internal/poll/sendfile_windows.go
+++ b/libgo/go/internal/poll/sendfile_windows.go
@@ -4,10 +4,13 @@
package poll
-import "syscall"
+import (
+ "io"
+ "syscall"
+)
// SendFile wraps the TransmitFile call.
-func SendFile(fd *FD, src syscall.Handle, n int64) (int64, error) {
+func SendFile(fd *FD, src syscall.Handle, n int64) (written int64, err error) {
if fd.kind == kindPipe {
// TransmitFile does not work with pipes
return 0, syscall.ESPIPE
@@ -19,26 +22,60 @@ func SendFile(fd *FD, src syscall.Handle, n int64) (int64, error) {
defer fd.writeUnlock()
o := &fd.wop
- o.qty = uint32(n)
o.handle = src
// TODO(brainman): skip calling syscall.Seek if OS allows it
- curpos, err := syscall.Seek(o.handle, 0, 1)
+ curpos, err := syscall.Seek(o.handle, 0, io.SeekCurrent)
if err != nil {
return 0, err
}
- o.o.Offset = uint32(curpos)
- o.o.OffsetHigh = uint32(curpos >> 32)
+ if n <= 0 { // We don't know the size of the file so infer it.
+ // Find the number of bytes offset from curpos until the end of the file.
+ n, err = syscall.Seek(o.handle, -curpos, io.SeekEnd)
+ if err != nil {
+ return
+ }
+ // Now seek back to the original position.
+ if _, err = syscall.Seek(o.handle, curpos, io.SeekStart); err != nil {
+ return
+ }
+ }
+
+ // TransmitFile can be invoked in one call with at most
+ // 2,147,483,646 bytes: the maximum value for a 32-bit integer minus 1.
+ // See https://docs.microsoft.com/en-us/windows/win32/api/mswsock/nf-mswsock-transmitfile
+ const maxChunkSizePerCall = int64(0x7fffffff - 1)
+
+ for n > 0 {
+ chunkSize := maxChunkSizePerCall
+ if chunkSize > n {
+ chunkSize = n
+ }
+
+ o.qty = uint32(chunkSize)
+ o.o.Offset = uint32(curpos)
+ o.o.OffsetHigh = uint32(curpos >> 32)
+
+ nw, err := wsrv.ExecIO(o, func(o *operation) error {
+ return syscall.TransmitFile(o.fd.Sysfd, o.handle, o.qty, 0, &o.o, nil, syscall.TF_WRITE_BEHIND)
+ })
+ if err != nil {
+ return written, err
+ }
+
+ curpos += int64(nw)
- done, err := wsrv.ExecIO(o, func(o *operation) error {
- return syscall.TransmitFile(o.fd.Sysfd, o.handle, o.qty, 0, &o.o, nil, syscall.TF_WRITE_BEHIND)
- })
- if err == nil {
// Some versions of Windows (Windows 10 1803) do not set
// file position after TransmitFile completes.
// So just use Seek to set file position.
- _, err = syscall.Seek(o.handle, curpos+int64(done), 0)
+ if _, err = syscall.Seek(o.handle, curpos, io.SeekStart); err != nil {
+ return written, err
+ }
+
+ n -= int64(nw)
+ written += int64(nw)
}
- return int64(done), err
+
+ return
}
diff --git a/libgo/go/internal/poll/sys_cloexec.go b/libgo/go/internal/poll/sys_cloexec.go
index 64e4612..7b87f13 100644
--- a/libgo/go/internal/poll/sys_cloexec.go
+++ b/libgo/go/internal/poll/sys_cloexec.go
@@ -5,7 +5,7 @@
// This file implements sysSocket and accept for platforms that do not
// provide a fast path for setting SetNonblock and CloseOnExec.
-// +build aix darwin js,wasm nacl solaris
+// +build aix darwin js,wasm solaris
package poll
diff --git a/libgo/go/internal/reflectlite/reflect_mirror_test.go b/libgo/go/internal/reflectlite/reflect_mirror_test.go
new file mode 100644
index 0000000..fbb6fb3
--- /dev/null
+++ b/libgo/go/internal/reflectlite/reflect_mirror_test.go
@@ -0,0 +1,131 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package reflectlite_test
+
+import (
+ "fmt"
+ "go/ast"
+ "go/parser"
+ "go/token"
+ "os"
+ "path/filepath"
+ "runtime"
+ "strings"
+ "sync"
+ "testing"
+)
+
+var typeNames = []string{
+ "rtype",
+ "uncommonType",
+ "arrayType",
+ "chanType",
+ "funcType",
+ "interfaceType",
+ "mapType",
+ "ptrType",
+ "sliceType",
+ "structType",
+}
+
+type visitor struct {
+ m map[string]map[string]bool
+}
+
+func newVisitor() visitor {
+ v := visitor{}
+ v.m = make(map[string]map[string]bool)
+
+ return v
+}
+func (v visitor) filter(name string) bool {
+ for _, typeName := range typeNames {
+ if typeName == name {
+ return true
+ }
+ }
+ return false
+}
+
+func (v visitor) Visit(n ast.Node) ast.Visitor {
+ switch x := n.(type) {
+ case *ast.TypeSpec:
+ if v.filter(x.Name.String()) {
+ if st, ok := x.Type.(*ast.StructType); ok {
+ v.m[x.Name.String()] = make(map[string]bool)
+ for _, field := range st.Fields.List {
+ k := fmt.Sprintf("%s", field.Type)
+ if len(field.Names) > 0 {
+ k = field.Names[0].Name
+ }
+ v.m[x.Name.String()][k] = true
+ }
+ }
+ }
+ }
+ return v
+}
+
+func loadTypes(path, pkgName string, v visitor) {
+ fset := token.NewFileSet()
+
+ filter := func(fi os.FileInfo) bool {
+ return strings.HasSuffix(fi.Name(), ".go")
+ }
+ pkgs, err := parser.ParseDir(fset, path, filter, 0)
+ if err != nil {
+ panic(err)
+ }
+
+ pkg := pkgs[pkgName]
+
+ for _, f := range pkg.Files {
+ ast.Walk(v, f)
+ }
+}
+
+func TestMirrorWithReflect(t *testing.T) {
+ reflectDir := filepath.Join(runtime.GOROOT(), "src", "reflect")
+ if _, err := os.Stat(reflectDir); os.IsNotExist(err) {
+ // On some mobile builders, the test binary executes on a machine without a
+ // complete GOROOT source tree.
+ t.Skipf("GOROOT source not present")
+ }
+
+ var wg sync.WaitGroup
+ rl, r := newVisitor(), newVisitor()
+
+ for _, tc := range []struct {
+ path, pkg string
+ v visitor
+ }{
+ {".", "reflectlite", rl},
+ {reflectDir, "reflect", r},
+ } {
+ tc := tc
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ loadTypes(tc.path, tc.pkg, tc.v)
+ }()
+ }
+ wg.Wait()
+
+ if len(rl.m) != len(r.m) {
+ t.Fatalf("number of types mismatch, reflect: %d, reflectlite: %d", len(r.m), len(rl.m))
+ }
+
+ for typName := range r.m {
+ if len(r.m[typName]) != len(rl.m[typName]) {
+ t.Errorf("type %s number of fields mismatch, reflect: %d, reflectlite: %d", typName, len(r.m[typName]), len(rl.m[typName]))
+ continue
+ }
+ for field := range r.m[typName] {
+ if _, ok := rl.m[typName][field]; !ok {
+ t.Errorf(`Field mismatch, reflect have "%s", relectlite does not.`, field)
+ }
+ }
+ }
+}
diff --git a/libgo/go/internal/reflectlite/set_test.go b/libgo/go/internal/reflectlite/set_test.go
index 817e4be..a610499 100644
--- a/libgo/go/internal/reflectlite/set_test.go
+++ b/libgo/go/internal/reflectlite/set_test.go
@@ -39,6 +39,8 @@ var implementsTests = []struct {
{new(notASTExpr), new(ast.Expr), false},
{new(ast.Expr), new(notASTExpr), false},
{new(*notAnExpr), new(notASTExpr), true},
+ {new(mapError), new(error), true},
+ {new(*mapError), new(error), true},
}
type notAnExpr struct{}
@@ -53,6 +55,13 @@ type notASTExpr interface {
exprNode()
}
+type mapError map[string]string
+
+func (mapError) Error() string { return "mapError" }
+
+var _ error = mapError{}
+var _ error = new(mapError)
+
func TestImplements(t *testing.T) {
for _, tt := range implementsTests {
xv := TypeOf(tt.x).Elem()
diff --git a/libgo/go/internal/reflectlite/type.go b/libgo/go/internal/reflectlite/type.go
index 35cf1a4..e700a55 100644
--- a/libgo/go/internal/reflectlite/type.go
+++ b/libgo/go/internal/reflectlite/type.go
@@ -351,6 +351,10 @@ func (t *rtype) PkgPath() string {
return t.uncommonType.PkgPath()
}
+func (t *rtype) hasName() bool {
+ return t.uncommonType != nil && t.uncommonType.name != nil
+}
+
func (t *rtype) Name() string {
return t.uncommonType.Name()
}
@@ -574,7 +578,7 @@ func directlyAssignable(T, V *rtype) bool {
// Otherwise at least one of T and V must not be defined
// and they must have the same kind.
- if T.Name() != "" && V.Name() != "" || T.Kind() != V.Kind() {
+ if T.hasName() && V.hasName() || T.Kind() != V.Kind() {
return false
}
diff --git a/libgo/go/internal/reflectlite/value.go b/libgo/go/internal/reflectlite/value.go
index bfc321f..9a14d18 100644
--- a/libgo/go/internal/reflectlite/value.go
+++ b/libgo/go/internal/reflectlite/value.go
@@ -180,16 +180,6 @@ type emptyInterface struct {
word unsafe.Pointer
}
-// nonEmptyInterface is the header for an interface value with methods.
-type nonEmptyInterface struct {
- // see ../runtime/iface.go:/Itab
- itab *struct {
- typ *rtype // dynamic concrete type
- fun [100000]unsafe.Pointer // method table
- }
- word unsafe.Pointer
-}
-
// mustBeExported panics if f records that the value was obtained using
// an unexported field.
func (f flag) mustBeExported() {
@@ -316,7 +306,7 @@ func (v Value) IsNil() bool {
// IsValid reports whether v represents a value.
// It returns false if v is the zero Value.
// If IsValid returns false, all other methods except String panic.
-// Most functions and methods never return an invalid value.
+// Most functions and methods never return an invalid Value.
// If one does, its documentation states the conditions explicitly.
func (v Value) IsValid() bool {
return v.flag != 0
diff --git a/libgo/go/internal/singleflight/singleflight_test.go b/libgo/go/internal/singleflight/singleflight_test.go
index 5e6f1b3..6404a17 100644
--- a/libgo/go/internal/singleflight/singleflight_test.go
+++ b/libgo/go/internal/singleflight/singleflight_test.go
@@ -28,7 +28,7 @@ func TestDo(t *testing.T) {
func TestDoErr(t *testing.T) {
var g Group
- someErr := errors.New("Some error")
+ someErr := errors.New("some error")
v, err, _ := g.Do("key", func() (interface{}, error) {
return nil, someErr
})
diff --git a/libgo/go/internal/syscall/unix/getrandom_linux_generic.go b/libgo/go/internal/syscall/unix/getrandom_linux_generic.go
index f70ada3..95748d5 100644
--- a/libgo/go/internal/syscall/unix/getrandom_linux_generic.go
+++ b/libgo/go/internal/syscall/unix/getrandom_linux_generic.go
@@ -2,15 +2,15 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build linux,arm64 linux,nios2 linux,riscv64
+// +build linux
+// +build arm64 nios2 riscv64
package unix
// Linux getrandom system call number.
// See GetRandom in getrandom_linux.go.
//
-// This file is named "generic" because at a certain point Linux
-// started standardizing on system call numbers across
-// architectures. So far this means only arm64 uses the standard
-// numbers.
+// This file is named "generic" because at a certain point Linux started
+// standardizing on system call numbers across architectures. So far this means
+// only arm64 and riscv64 use the standard numbers.
const randomTrap uintptr = 278
diff --git a/libgo/go/internal/syscall/unix/nonblocking_nacl.go b/libgo/go/internal/syscall/unix/nonblocking_nacl.go
deleted file mode 100644
index ff67c75..0000000
--- a/libgo/go/internal/syscall/unix/nonblocking_nacl.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package unix
-
-func IsNonblock(fd int) (nonblocking bool, err error) {
- return false, nil
-}
diff --git a/libgo/go/internal/syscall/windows/mksyscall.go b/libgo/go/internal/syscall/windows/mksyscall.go
index 0bf87dc..95e36f7 100644
--- a/libgo/go/internal/syscall/windows/mksyscall.go
+++ b/libgo/go/internal/syscall/windows/mksyscall.go
@@ -6,4 +6,4 @@
package windows
-//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall_windows.go security_windows.go psapi_windows.go symlink_windows.go
+//go:generate go run golang.org/x/sys/windows/mkwinsyscall -output zsyscall_windows.go syscall_windows.go security_windows.go psapi_windows.go symlink_windows.go
diff --git a/libgo/go/internal/syscall/windows/registry/mksyscall.go b/libgo/go/internal/syscall/windows/registry/mksyscall.go
index fa8e27e..cb4906a 100644
--- a/libgo/go/internal/syscall/windows/registry/mksyscall.go
+++ b/libgo/go/internal/syscall/windows/registry/mksyscall.go
@@ -6,4 +6,4 @@
package registry
-//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall.go
+//go:generate go run golang.org/x/sys/windows/mkwinsyscall -output zsyscall_windows.go syscall.go
diff --git a/libgo/go/internal/syscall/windows/registry/registry_test.go b/libgo/go/internal/syscall/windows/registry/registry_test.go
index c77329c..8227232 100644
--- a/libgo/go/internal/syscall/windows/registry/registry_test.go
+++ b/libgo/go/internal/syscall/windows/registry/registry_test.go
@@ -522,86 +522,6 @@ func TestValues(t *testing.T) {
deleteValues(t, k)
}
-func walkKey(t *testing.T, k registry.Key, kname string) {
- names, err := k.ReadValueNames(-1)
- if err != nil {
- t.Fatalf("reading value names of %s failed: %v", kname, err)
- }
- for _, name := range names {
- _, valtype, err := k.GetValue(name, nil)
- if err != nil {
- t.Fatalf("reading value type of %s of %s failed: %v", name, kname, err)
- }
- switch valtype {
- case registry.NONE:
- case registry.SZ:
- _, _, err := k.GetStringValue(name)
- if err != nil {
- t.Error(err)
- }
- case registry.EXPAND_SZ:
- s, _, err := k.GetStringValue(name)
- if err != nil {
- t.Error(err)
- }
- _, err = registry.ExpandString(s)
- if err != nil {
- t.Error(err)
- }
- case registry.DWORD, registry.QWORD:
- _, _, err := k.GetIntegerValue(name)
- if err != nil {
- t.Error(err)
- }
- case registry.BINARY:
- _, _, err := k.GetBinaryValue(name)
- if err != nil {
- t.Error(err)
- }
- case registry.MULTI_SZ:
- _, _, err := k.GetStringsValue(name)
- if err != nil {
- t.Error(err)
- }
- case registry.FULL_RESOURCE_DESCRIPTOR, registry.RESOURCE_LIST, registry.RESOURCE_REQUIREMENTS_LIST:
- // TODO: not implemented
- default:
- t.Fatalf("value type %d of %s of %s failed: %v", valtype, name, kname, err)
- }
- }
-
- names, err = k.ReadSubKeyNames(-1)
- if err != nil {
- t.Fatalf("reading sub-keys of %s failed: %v", kname, err)
- }
- for _, name := range names {
- func() {
- subk, err := registry.OpenKey(k, name, registry.ENUMERATE_SUB_KEYS|registry.QUERY_VALUE)
- if err != nil {
- if err == syscall.ERROR_ACCESS_DENIED {
- // ignore error, if we are not allowed to access this key
- return
- }
- t.Fatalf("opening sub-keys %s of %s failed: %v", name, kname, err)
- }
- defer subk.Close()
-
- walkKey(t, subk, kname+`\`+name)
- }()
- }
-}
-
-func TestWalkFullRegistry(t *testing.T) {
- if testing.Short() {
- t.Skip("skipping long running test in short mode")
- }
- walkKey(t, registry.CLASSES_ROOT, "CLASSES_ROOT")
- walkKey(t, registry.CURRENT_USER, "CURRENT_USER")
- walkKey(t, registry.LOCAL_MACHINE, "LOCAL_MACHINE")
- walkKey(t, registry.USERS, "USERS")
- walkKey(t, registry.CURRENT_CONFIG, "CURRENT_CONFIG")
-}
-
func TestExpandString(t *testing.T) {
got, err := registry.ExpandString("%PATH%")
if err != nil {
diff --git a/libgo/go/internal/syscall/windows/registry/value.go b/libgo/go/internal/syscall/windows/registry/value.go
index 71d4e15..bf8ab00 100644
--- a/libgo/go/internal/syscall/windows/registry/value.go
+++ b/libgo/go/internal/syscall/windows/registry/value.go
@@ -108,7 +108,7 @@ func (k Key) GetStringValue(name string) (val string, valtype uint32, err error)
if len(data) == 0 {
return "", typ, nil
}
- u := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:]
+ u := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[: len(data)/2 : len(data)/2]
return syscall.UTF16ToString(u), typ, nil
}
@@ -185,8 +185,7 @@ func ExpandString(value string) (string, error) {
return "", err
}
if n <= uint32(len(r)) {
- u := (*[1 << 29]uint16)(unsafe.Pointer(&r[0]))[:]
- return syscall.UTF16ToString(u), nil
+ return syscall.UTF16ToString(r[:n]), nil
}
r = make([]uint16, n)
}
@@ -208,7 +207,7 @@ func (k Key) GetStringsValue(name string) (val []string, valtype uint32, err err
if len(data) == 0 {
return nil, typ, nil
}
- p := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:len(data)/2]
+ p := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[: len(data)/2 : len(data)/2]
if len(p) == 0 {
return nil, typ, nil
}
@@ -296,7 +295,7 @@ func (k Key) setStringValue(name string, valtype uint32, value string) error {
if err != nil {
return err
}
- buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2]
+ buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[: len(v)*2 : len(v)*2]
return k.setValue(name, valtype, buf)
}
@@ -326,7 +325,7 @@ func (k Key) SetStringsValue(name string, value []string) error {
ss += s + "\x00"
}
v := utf16.Encode([]rune(ss + "\x00"))
- buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2]
+ buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[: len(v)*2 : len(v)*2]
return k.setValue(name, MULTI_SZ, buf)
}
diff --git a/libgo/go/internal/syscall/windows/reparse_windows.go b/libgo/go/internal/syscall/windows/reparse_windows.go
index 610b733..6e11139 100644
--- a/libgo/go/internal/syscall/windows/reparse_windows.go
+++ b/libgo/go/internal/syscall/windows/reparse_windows.go
@@ -60,8 +60,9 @@ type SymbolicLinkReparseBuffer struct {
// Path returns path stored in rb.
func (rb *SymbolicLinkReparseBuffer) Path() string {
- p := (*[0xffff]uint16)(unsafe.Pointer(&rb.PathBuffer[0]))
- return syscall.UTF16ToString(p[rb.SubstituteNameOffset/2 : (rb.SubstituteNameOffset+rb.SubstituteNameLength)/2])
+ n1 := rb.SubstituteNameOffset / 2
+ n2 := (rb.SubstituteNameOffset + rb.SubstituteNameLength) / 2
+ return syscall.UTF16ToString((*[0xffff]uint16)(unsafe.Pointer(&rb.PathBuffer[0]))[n1:n2:n2])
}
type MountPointReparseBuffer struct {
@@ -83,6 +84,7 @@ type MountPointReparseBuffer struct {
// Path returns path stored in rb.
func (rb *MountPointReparseBuffer) Path() string {
- p := (*[0xffff]uint16)(unsafe.Pointer(&rb.PathBuffer[0]))
- return syscall.UTF16ToString(p[rb.SubstituteNameOffset/2 : (rb.SubstituteNameOffset+rb.SubstituteNameLength)/2])
+ n1 := rb.SubstituteNameOffset / 2
+ n2 := (rb.SubstituteNameOffset + rb.SubstituteNameLength) / 2
+ return syscall.UTF16ToString((*[0xffff]uint16)(unsafe.Pointer(&rb.PathBuffer[0]))[n1:n2:n2])
}
diff --git a/libgo/go/internal/syscall/windows/syscall_windows.go b/libgo/go/internal/syscall/windows/syscall_windows.go
index 099e91e..dc64111 100644
--- a/libgo/go/internal/syscall/windows/syscall_windows.go
+++ b/libgo/go/internal/syscall/windows/syscall_windows.go
@@ -7,9 +7,29 @@ package windows
import (
"sync"
"syscall"
+ "unicode/utf16"
"unsafe"
)
+// UTF16PtrToString is like UTF16ToString, but takes *uint16
+// as a parameter instead of []uint16.
+// max is how many times p can be advanced looking for the null terminator.
+// If max is hit, the string is truncated at that point.
+func UTF16PtrToString(p *uint16, max int) string {
+ if p == nil {
+ return ""
+ }
+ // Find NUL terminator.
+ end := unsafe.Pointer(p)
+ n := 0
+ for *(*uint16)(end) != 0 && n < max {
+ end = unsafe.Pointer(uintptr(end) + unsafe.Sizeof(*p))
+ n++
+ }
+ s := (*[(1 << 30) - 1]uint16)(unsafe.Pointer(p))[:n:n]
+ return string(utf16.Decode(s))
+}
+
const (
ERROR_SHARING_VIOLATION syscall.Errno = 32
ERROR_LOCK_VIOLATION syscall.Errno = 33
diff --git a/libgo/go/internal/testenv/testenv.go b/libgo/go/internal/testenv/testenv.go
index 3460054..c2e9d98 100644
--- a/libgo/go/internal/testenv/testenv.go
+++ b/libgo/go/internal/testenv/testenv.go
@@ -50,7 +50,7 @@ func HasGoBuild() bool {
return false
}
switch runtime.GOOS {
- case "android", "nacl", "js":
+ case "android", "js":
return false
case "darwin":
if strings.HasPrefix(runtime.GOARCH, "arm") {
@@ -136,7 +136,7 @@ func GoTool() (string, error) {
// using os.StartProcess or (more commonly) exec.Command.
func HasExec() bool {
switch runtime.GOOS {
- case "nacl", "js":
+ case "js":
return false
case "darwin":
if strings.HasPrefix(runtime.GOARCH, "arm") {
@@ -149,8 +149,6 @@ func HasExec() bool {
// HasSrc reports whether the entire source tree is available under GOROOT.
func HasSrc() bool {
switch runtime.GOOS {
- case "nacl":
- return false
case "darwin":
if strings.HasPrefix(runtime.GOARCH, "arm") {
return false
@@ -192,14 +190,14 @@ func MustHaveExecPath(t testing.TB, path string) {
// HasExternalNetwork reports whether the current system can use
// external (non-localhost) networks.
func HasExternalNetwork() bool {
- return !testing.Short() && runtime.GOOS != "nacl" && runtime.GOOS != "js"
+ return !testing.Short() && runtime.GOOS != "js"
}
// MustHaveExternalNetwork checks that the current system can use
// external (non-localhost) networks.
// If not, MustHaveExternalNetwork calls t.Skip with an explanation.
func MustHaveExternalNetwork(t testing.TB) {
- if runtime.GOOS == "nacl" || runtime.GOOS == "js" {
+ if runtime.GOOS == "js" {
t.Skipf("skipping test: no external network on %s", runtime.GOOS)
}
if testing.Short() {
diff --git a/libgo/go/internal/testenv/testenv_notwin.go b/libgo/go/internal/testenv/testenv_notwin.go
index d8ce6cd..ccb5d55 100644
--- a/libgo/go/internal/testenv/testenv_notwin.go
+++ b/libgo/go/internal/testenv/testenv_notwin.go
@@ -12,7 +12,7 @@ import (
func hasSymlink() (ok bool, reason string) {
switch runtime.GOOS {
- case "android", "nacl", "plan9":
+ case "android", "plan9":
return false, ""
}