diff options
Diffstat (limited to 'src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/gopherjs/gopherjs/compiler/natives/src/strings/strings.go')
-rw-r--r-- | src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/gopherjs/gopherjs/compiler/natives/src/strings/strings.go | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/gopherjs/gopherjs/compiler/natives/src/strings/strings.go b/src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/gopherjs/gopherjs/compiler/natives/src/strings/strings.go new file mode 100644 index 00000000000..09b1bb59748 --- /dev/null +++ b/src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/gopherjs/gopherjs/compiler/natives/src/strings/strings.go @@ -0,0 +1,67 @@ +// +build js + +package strings + +import ( + "unicode/utf8" + + "github.com/gopherjs/gopherjs/js" +) + +func IndexByte(s string, c byte) int { + return js.InternalObject(s).Call("indexOf", js.Global.Get("String").Call("fromCharCode", c)).Int() +} + +func Index(s, sep string) int { + return js.InternalObject(s).Call("indexOf", js.InternalObject(sep)).Int() +} + +func LastIndex(s, sep string) int { + return js.InternalObject(s).Call("lastIndexOf", js.InternalObject(sep)).Int() +} + +func Count(s, sep string) int { + n := 0 + // special cases + switch { + case len(sep) == 0: + return utf8.RuneCountInString(s) + 1 + case len(sep) > len(s): + return 0 + case len(sep) == len(s): + if sep == s { + return 1 + } + return 0 + } + + for { + pos := Index(s, sep) + if pos == -1 { + break + } + n++ + s = s[pos+len(sep):] + } + return n +} + +func (b *Builder) String() string { + // Upstream Builder.String relies on package unsafe. We can't do that. + // TODO: It's possible that the entire strings.Builder API can be implemented + // more efficiently for GOARCH=js specifically (avoid using []byte, instead + // use a String directly; or some JavaScript string builder API if one exists). + // But this is more work, defer doing it until there's a need shown via profiling, + // and there are benchmarks available (see https://github.com/golang/go/issues/18990#issuecomment-352068533). + return string(b.buf) +} + +func (b *Builder) copyCheck() { + if b.addr == nil { + // Upstream copyCheck uses noescape, which performs unsafe.Pointer manipulation. + // We can't do that, so skip it. See https://github.com/golang/go/commit/484586c81a0196e42ac52f651bc56017ca454280. + b.addr = b + } else if b.addr != b { + panic("strings: illegal use of non-zero Builder copied by value") + } +} |