compiler,runtime: fix multiple definitions of a single function
strings.IndexByte was implemented in the runtime up to Go 1.11. It is implemented using a direct call to internal/bytealg.IndexByte since Go 1.12. Make sure we remain compatible with both.
Этот коммит содержится в:
родитель
7e6a54ac62
коммит
f2cd4d12e8
5 изменённых файлов: 26 добавлений и 3 удалений
|
@ -820,6 +820,9 @@ func (c *Compiler) parseFunc(frame *Frame) {
|
|||
if c.DumpSSA {
|
||||
fmt.Printf("\nfunc %s:\n", frame.fn.Function)
|
||||
}
|
||||
if !frame.fn.LLVMFn.IsDeclaration() {
|
||||
panic("function is already defined: " + frame.fn.LLVMFn.Name())
|
||||
}
|
||||
if !frame.fn.IsExported() {
|
||||
frame.fn.LLVMFn.SetLinkage(llvm.InternalLinkage)
|
||||
frame.fn.LLVMFn.SetUnnamedAddr(true)
|
||||
|
|
|
@ -166,9 +166,10 @@ func decodeUTF8(s string, index uintptr) (rune, uintptr) {
|
|||
}
|
||||
}
|
||||
|
||||
// indexByte returns the index of the first instance of c in s, or -1 if c is not present in s.
|
||||
//go:linkname indexByte strings.IndexByte
|
||||
func indexByte(s string, c byte) int {
|
||||
// indexByteString returns the index of the first instance of c in s, or -1 if c
|
||||
// is not present in s.
|
||||
//go:linkname indexByteString internal/bytealg.IndexByteString
|
||||
func indexByteString(s string, c byte) int {
|
||||
for i := 0; i < len(s); i++ {
|
||||
if s[i] == c {
|
||||
return i
|
||||
|
|
12
src/runtime/strings_go111.go
Обычный файл
12
src/runtime/strings_go111.go
Обычный файл
|
@ -0,0 +1,12 @@
|
|||
// +build !go1.12
|
||||
|
||||
package runtime
|
||||
|
||||
// indexByte provides compatibility with Go 1.11.
|
||||
// See the following:
|
||||
// https://github.com/tinygo-org/tinygo/issues/351
|
||||
// https://github.com/golang/go/commit/ad4a58e31501bce5de2aad90a620eaecdc1eecb8
|
||||
//go:linkname indexByte strings.IndexByte
|
||||
func indexByte(s string, c byte) int {
|
||||
return indexByteString(s, c)
|
||||
}
|
6
testdata/stdlib.go
предоставленный
6
testdata/stdlib.go
предоставленный
|
@ -4,12 +4,18 @@ import (
|
|||
"fmt"
|
||||
"math/rand"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// package os, fmt
|
||||
fmt.Println("stdin: ", os.Stdin.Fd())
|
||||
fmt.Println("stdout:", os.Stdout.Fd())
|
||||
fmt.Println("stderr:", os.Stderr.Fd())
|
||||
|
||||
// package math/rand
|
||||
fmt.Println("pseudorandom number:", rand.Int31())
|
||||
|
||||
// package strings
|
||||
fmt.Println("strings.IndexByte:", strings.IndexByte("asdf", 'd'))
|
||||
}
|
||||
|
|
1
testdata/stdlib.txt
предоставленный
1
testdata/stdlib.txt
предоставленный
|
@ -2,3 +2,4 @@ stdin: 0
|
|||
stdout: 1
|
||||
stderr: 2
|
||||
pseudorandom number: 1298498081
|
||||
strings.IndexByte: 2
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче