Commit 69c4e938 authored by Russ Cox's avatar Russ Cox

use append

R=gri, r, r2
CC=golang-dev
https://golang.org/cl/2743042
parent d8b5d039
......@@ -136,14 +136,6 @@ func (f *File) saveRef(x interface{}, context string) {
// so that we will be able to distinguish a "top-level C"
// from a local C.
if l, ok := sel.X.(*ast.Ident); ok && l.Name == "C" {
i := len(f.Ref)
if i >= cap(f.Ref) {
new := make([]*Ref, 2*i)
for j, v := range f.Ref {
new[j] = v
}
f.Ref = new
}
if context == "as2" {
context = "expr"
}
......@@ -155,12 +147,11 @@ func (f *File) saveRef(x interface{}, context string) {
}
f.Name[goname] = name
}
f.Ref = f.Ref[0 : i+1]
f.Ref[i] = &Ref{
f.Ref = append(f.Ref, &Ref{
Name: name,
Expr: n,
Context: context,
}
})
return
}
}
......@@ -186,20 +177,10 @@ func (f *File) saveExport(x interface{}, context string) {
error(c.Position, "export missing name")
}
if f.ExpFunc == nil {
f.ExpFunc = make([]*ExpFunc, 0, 8)
}
i := len(f.ExpFunc)
if i >= cap(f.ExpFunc) {
new := make([]*ExpFunc, i, 2*i)
copy(new, f.ExpFunc)
f.ExpFunc = new
}
f.ExpFunc = f.ExpFunc[0 : i+1]
f.ExpFunc[i] = &ExpFunc{
f.ExpFunc = append(f.ExpFunc, &ExpFunc{
Func: n,
ExpName: name,
}
})
break
}
}
......
......@@ -495,7 +495,7 @@ func (p *Package) gccCmd() []string {
// returns the corresponding DWARF data and any messages
// printed to standard error.
func (p *Package) gccDebug(stdin []byte) *dwarf.Data {
runGcc(stdin, concat(p.gccCmd(), p.GccOptions))
runGcc(stdin, append(p.gccCmd(), p.GccOptions...))
// Try to parse f as ELF and Mach-O and hope one works.
var f interface {
......@@ -521,7 +521,7 @@ func (p *Package) gccDebug(stdin []byte) *dwarf.Data {
// and its included files.
func (p *Package) gccDefines(stdin []byte) string {
base := []string{p.gccName(), p.gccMachine(), "-E", "-dM", "-xc", "-"}
stdout, _ := runGcc(stdin, concat(base, p.GccOptions))
stdout, _ := runGcc(stdin, append(base, p.GccOptions...))
return stdout
}
......@@ -530,7 +530,7 @@ func (p *Package) gccDefines(stdin []byte) string {
// gcc to fail.
func (p *Package) gccErrors(stdin []byte) string {
// TODO(rsc): require failure
args := concat(p.gccCmd(), p.GccOptions)
args := append(p.gccCmd(), p.GccOptions...)
if *debugGcc {
fmt.Fprintf(os.Stderr, "$ %s <<EOF\n", strings.Join(args, " "))
os.Stderr.Write(stdin)
......
......@@ -110,10 +110,3 @@ func slashToUnderscore(c int) int {
}
return c
}
func concat(a, b []string) []string {
c := make([]string, len(a)+len(b))
copy(c, a)
copy(c[len(a):], b)
return c
}
......@@ -318,11 +318,9 @@ func hgRename(dst, src string) os.Error {
return err
}
func copy(a []string) []string {
func dup(a []string) []string {
b := make([]string, len(a))
for i, s := range a {
b[i] = s
}
copy(b, a)
return b
}
......@@ -379,7 +377,7 @@ func run(argv []string, input []byte) (out string, err os.Error) {
return
Error:
err = &runError{copy(argv), err}
err = &runError{dup(argv), err}
return
}
......
......@@ -2736,6 +2736,7 @@ sub IsSymbolizedProfileFile {
sub CheckSymbolPage {
my $url = SymbolPageURL();
print STDERR "Read $url\n";
open(SYMBOL, "$CURL -s '$url' |");
my $line = <SYMBOL>;
$line =~ s/\r//g; # turn windows-looking lines into unix-looking lines
......@@ -2816,7 +2817,7 @@ sub ResolveRedirectionForCurl {
# $main::prog to have the correct program name.
sub ReadSymbols {
my $in = shift;
my $map = {};
my $map = shift;
while (<$in>) {
s/\r//g; # turn windows-looking lines into unix-looking lines
# Removes all the leading zeroes from the symbols, see comment below.
......@@ -2858,20 +2859,30 @@ sub FetchSymbols {
my @pcs = grep { !$seen{$_}++ } keys(%$pcset); # uniq
if (!defined($symbol_map)) {
my $post_data = join("+", sort((map {"0x" . "$_"} @pcs)));
open(POSTFILE, ">$main::tmpfile_sym");
print POSTFILE $post_data;
close(POSTFILE);
my $url = SymbolPageURL();
$url = ResolveRedirectionForCurl($url);
my $command_line = "$CURL -sd '\@$main::tmpfile_sym' '$url'";
# We use c++filt in case $SYMBOL_PAGE gives us mangled symbols.
my $cppfilt = $obj_tool_map{"c++filt"};
open(SYMBOL, "$command_line | $cppfilt |") or error($command_line);
$symbol_map = ReadSymbols(*SYMBOL{IO});
close(SYMBOL);
$symbol_map = {};
my @toask = @pcs;
while (@toask > 0) {
my $n = @toask;
if ($n > 49) { $n = 49; }
my @thisround = @toask[0..$n];
my $t = @toask;
print STDERR "$n $t\n";
@toask = @toask[($n+1)..(@toask-1)];
my $post_data = join("+", sort((map {"0x" . "$_"} @thisround)));
open(POSTFILE, ">$main::tmpfile_sym");
print POSTFILE $post_data;
close(POSTFILE);
print STDERR "SYMBL!\n";
my $url = SymbolPageURL();
$url = ResolveRedirectionForCurl($url);
my $command_line = "$CURL -sd '\@$main::tmpfile_sym' '$url'";
# We use c++filt in case $SYMBOL_PAGE gives us mangled symbols.
my $cppfilt = $obj_tool_map{"c++filt"};
open(SYMBOL, "$command_line | $cppfilt |") or error($command_line);
ReadSymbols(*SYMBOL{IO}, $symbol_map);
close(SYMBOL);
}
}
my $symbols = {};
......
......@@ -293,7 +293,6 @@ func (b *Reader) ReadBytes(delim byte) (line []byte, err os.Error) {
// accumulating full buffers.
var frag []byte
var full [][]byte
nfull := 0
err = nil
for {
......@@ -310,24 +309,12 @@ func (b *Reader) ReadBytes(delim byte) (line []byte, err os.Error) {
// Make a copy of the buffer.
buf := make([]byte, len(frag))
copy(buf, frag)
// Grow list if needed.
if full == nil {
full = make([][]byte, 16)
} else if nfull >= len(full) {
newfull := make([][]byte, len(full)*2)
copy(newfull, full)
full = newfull
}
// Save buffer
full[nfull] = buf
nfull++
full = append(full, buf)
}
// Allocate new buffer to hold the full pieces and the fragment.
n := 0
for i := 0; i < nfull; i++ {
for i := range full {
n += len(full[i])
}
n += len(frag)
......@@ -335,9 +322,8 @@ func (b *Reader) ReadBytes(delim byte) (line []byte, err os.Error) {
// Copy full pieces and fragment in.
buf := make([]byte, n)
n = 0
for i := 0; i < nfull; i++ {
copy(buf[n:], full[i])
n += len(full[i])
for i := range full {
n += copy(buf[n:], full[i])
}
copy(buf[n:], frag)
return buf, err
......
......@@ -545,7 +545,7 @@ func resize(n int) int {
// Add appends the contents of t to the end of s and returns the result.
// If s has enough capacity, it is extended in place; otherwise a
// new array is allocated and returned.
func Add(s, t []byte) []byte {
func Add(s, t []byte) []byte { // TODO
lens := len(s)
lent := len(t)
if lens+lent <= cap(s) {
......@@ -562,7 +562,7 @@ func Add(s, t []byte) []byte {
// AddByte appends byte t to the end of s and returns the result.
// If s has enough capacity, it is extended in place; otherwise a
// new array is allocated and returned.
func AddByte(s []byte, t byte) []byte {
func AddByte(s []byte, t byte) []byte { // TODO
lens := len(s)
if lens+1 <= cap(s) {
s = s[0 : lens+1]
......
......@@ -315,19 +315,6 @@ func (m *serverHelloMsg) marshal() []byte {
return x
}
func append(slice []string, elem string) []string {
if len(slice) < cap(slice) {
slice = slice[0 : len(slice)+1]
slice[len(slice)-1] = elem
return slice
}
fresh := make([]string, len(slice)+1, cap(slice)*2+1)
copy(fresh, slice)
fresh[len(slice)] = elem
return fresh
}
func (m *serverHelloMsg) unmarshal(data []byte) bool {
if len(data) < 42 {
return false
......
......@@ -187,19 +187,19 @@ func (n *Name) fillFromRDNSequence(rdns *rdnSequence) {
case 5:
n.SerialNumber = value
case 6:
n.Country = appendString(n.Country, value)
n.Country = append(n.Country, value)
case 7:
n.Locality = appendString(n.Locality, value)
n.Locality = append(n.Locality, value)
case 8:
n.Province = appendString(n.Province, value)
n.Province = append(n.Province, value)
case 9:
n.StreetAddress = appendString(n.StreetAddress, value)
n.StreetAddress = append(n.StreetAddress, value)
case 10:
n.Organization = appendString(n.Organization, value)
n.Organization = append(n.Organization, value)
case 11:
n.OrganizationalUnit = appendString(n.OrganizationalUnit, value)
n.OrganizationalUnit = append(n.OrganizationalUnit, value)
case 17:
n.PostalCode = appendString(n.PostalCode, value)
n.PostalCode = append(n.PostalCode, value)
}
}
}
......@@ -501,17 +501,6 @@ func parsePublicKey(algo PublicKeyAlgorithm, asn1Data []byte) (interface{}, os.E
panic("unreachable")
}
func appendString(in []string, v string) (out []string) {
if cap(in)-len(in) < 1 {
out = make([]string, len(in)+1, len(in)*2+1)
copy(out, in)
} else {
out = in[0 : len(in)+1]
}
out[len(in)] = v
return out
}
func parseCertificate(in *certificate) (*Certificate, os.Error) {
out := new(Certificate)
out.Raw = in.TBSCertificate.Raw
......@@ -601,10 +590,10 @@ func parseCertificate(in *certificate) (*Certificate, os.Error) {
}
switch v.Tag {
case 1:
out.EmailAddresses = appendString(out.EmailAddresses, string(v.Bytes))
out.EmailAddresses = append(out.EmailAddresses, string(v.Bytes))
parsedName = true
case 2:
out.DNSNames = appendString(out.DNSNames, string(v.Bytes))
out.DNSNames = append(out.DNSNames, string(v.Bytes))
parsedName = true
}
}
......
......@@ -451,14 +451,7 @@ func (d *Data) Type(off Offset) (Type, os.Error) {
f.ByteSize, _ = kid.Val(AttrByteSize).(int64)
f.BitOffset, _ = kid.Val(AttrBitOffset).(int64)
f.BitSize, _ = kid.Val(AttrBitSize).(int64)
n := len(t.Field)
if n >= cap(t.Field) {
fld := make([]*StructField, n, n*2)
copy(fld, t.Field)
t.Field = fld
}
t.Field = t.Field[0 : n+1]
t.Field[n] = f
t.Field = append(t.Field, f)
}
}
......@@ -554,14 +547,7 @@ func (d *Data) Type(off Offset) (Type, os.Error) {
case TagUnspecifiedParameters:
tkid = &DotDotDotType{}
}
n := len(t.ParamType)
if n >= cap(t.ParamType) {
param := make([]Type, n, n*2)
copy(param, t.ParamType)
t.ParamType = param
}
t.ParamType = t.ParamType[0 : n+1]
t.ParamType[n] = tkid
t.ParamType = append(t.ParamType, tkid)
}
case TagTypedef:
......
......@@ -302,15 +302,7 @@ func NewFile(r io.ReaderAt) (*File, os.Error) {
}
func (f *File) pushSection(sh *Section, r io.ReaderAt) {
n := len(f.Sections)
if n >= cap(f.Sections) {
m := (n + 1) * 2
new := make([]*Section, n, m)
copy(new, f.Sections)
f.Sections = new
}
f.Sections = f.Sections[0 : n+1]
f.Sections[n] = sh
f.Sections = append(f.Sections, sh)
sh.sr = io.NewSectionReader(r, int64(sh.Offset), int64(sh.Size))
sh.ReaderAt = sh.sr
}
......
......@@ -43,14 +43,7 @@ type codeBuf struct {
func newCodeBuf() *codeBuf { return &codeBuf{make(code, 0, 16)} }
func (b *codeBuf) push(instr func(*Thread)) {
n := len(b.instrs)
if n >= cap(b.instrs) {
a := make(code, n, n*2)
copy(a, b.instrs)
b.instrs = a
}
b.instrs = b.instrs[0 : n+1]
b.instrs[n] = instr
b.instrs = append(b.instrs, instr)
}
func (b *codeBuf) nextPC() uint { return uint(len(b.instrs)) }
......
......@@ -53,14 +53,7 @@ var rpcMethod []method
// s string
//
func Add(name, fmt string, handler Handler) {
n := len(rpcMethod)
if n >= cap(rpcMethod) {
a := make([]method, n, (n+4)*2)
copy(a, rpcMethod)
rpcMethod = a
}
rpcMethod = rpcMethod[0 : n+1]
rpcMethod[n] = method{name, fmt, handler}
rpcMethod = append(rpcMethod, method{name, fmt, handler})
}
// Serve accepts new SRPC connections from the file descriptor fd
......
......@@ -390,15 +390,7 @@ func (p *Process) causesToEvents() ([]Event, os.Error) {
// postEvent appends an event to the posted queue. These events will
// be processed before any currently pending events.
func (p *Process) postEvent(ev Event) {
n := len(p.posted)
m := n * 2
if m == 0 {
m = 4
}
posted := make([]Event, n+1, m)
copy(posted, p.posted)
posted[n] = ev
p.posted = posted
p.posted = append(p.posted, ev)
}
// processEvents processes events in the event queue until no events
......
......@@ -161,10 +161,7 @@ func (f *flagVar) String() string {
}
func (f *flagVar) Set(value string) bool {
n := make(flagVar, len(*f)+1)
copy(n, *f)
*f = n
(*f)[len(*f)-1] = value
*f = append(*f, value)
return true
}
......
......@@ -66,17 +66,9 @@ func (s *Scope) Insert(obj *Object) *Object {
func (s *Scope) append(obj *Object) {
n := len(s.Objects)
if n >= cap(s.Objects) {
new := make([]*Object, 2*n)
copy(new, s.Objects)
s.Objects = new
}
s.Objects = s.Objects[0 : n+1]
s.Objects[n] = obj
s.Objects = append(s.Objects, obj)
}
// ----------------------------------------------------------------------------
// Objects
......
......@@ -62,16 +62,7 @@ func CommentText(comment *ast.CommentGroup) string {
// Walk lines, stripping trailing white space and adding to list.
for _, l := range cl {
l = stripTrailingWhitespace(l)
// Add to list.
n := len(lines)
if n+1 >= cap(lines) {
newlines := make([]string, n, 2*cap(lines))
copy(newlines, lines)
lines = newlines
}
lines = lines[0 : n+1]
lines[n] = l
lines = append(lines, stripTrailingWhitespace(l))
}
}
......
......@@ -277,12 +277,9 @@ func (doc *docReader) addDecl(decl ast.Decl) {
func copyCommentList(list []*ast.Comment) []*ast.Comment {
nlist := make([]*ast.Comment, len(list))
copy(nlist, list)
return nlist
return append([]*ast.Comment(nil), list...)
}
var (
bug_markers = regexp.MustCompile("^/[/*][ \t]*BUG\\(.*\\):[ \t]*") // BUG(uid):
bug_content = regexp.MustCompile("[^ \n\r\t]+") // at least one non-whitespace char
......
......@@ -374,26 +374,15 @@ func (z *Tokenizer) Token() Token {
case Text:
t.Data = string(z.Text())
case StartTag, EndTag, SelfClosingTag:
var (
attr []Attribute
a int
)
var attr []Attribute
name, remaining := z.TagName()
for remaining {
var key, val []byte
key, val, remaining = z.TagAttr()
if a == len(attr) {
// Grow the attr slice.
n := 4 + 2*a
attr1 := make([]Attribute, n, n)
copy(attr1, attr)
attr = attr1
}
attr[a] = Attribute{string(key), string(val)}
a++
attr = append(attr, Attribute{string(key), string(val)})
}
t.Data = string(name)
t.Attr = attr[0:a]
t.Attr = attr
}
return t
}
......
......@@ -29,15 +29,7 @@ var formats []format
// Decode is the function that decodes the encoded image.
// DecodeConfig is the function that decodes just its configuration.
func RegisterFormat(name, magic string, decode func(io.Reader) (Image, os.Error), decodeConfig func(io.Reader) (Config, os.Error)) {
n := len(formats)
if n == cap(formats) {
x := make([]format, n+1, 2*n+4)
copy(x, formats)
formats = x
} else {
formats = formats[0 : n+1]
}
formats[n] = format{name, magic, decode, decodeConfig}
formats = append(formats, format{name, magic, decode, decodeConfig})
}
// A reader is an io.Reader that can also peek ahead.
......
......@@ -155,18 +155,7 @@ func (s *scanner) eof() int {
// pushParseState pushes a new parse state p onto the parse stack.
func (s *scanner) pushParseState(p int) {
n := len(s.parseState)
if n >= cap(s.parseState) {
if n == 0 {
s.parseState = make([]int, 0, 16)
} else {
ps := make([]int, n, 2*n)
copy(ps, s.parseState)
s.parseState = ps
}
}
s.parseState = s.parseState[0 : n+1]
s.parseState[n] = p
s.parseState = append(s.parseState, p)
}
// popParseState pops a parse state (already obtained) off the stack
......
......@@ -44,7 +44,7 @@ func readHosts() {
}
for i := 1; i < len(f); i++ {
h := f[i]
hs[h] = appendHost(hs[h], f[0])
hs[h] = append(hs[h], f[0])
}
}
// Update the data cache.
......@@ -55,18 +55,6 @@ func readHosts() {
}
}
func appendHost(hosts []string, address string) []string {
n := len(hosts)
if n+1 > cap(hosts) { // reallocate
a := make([]string, n, 2*n+1)
copy(a, hosts)
hosts = a
}
hosts = hosts[0 : n+1]
hosts[n] = address
return hosts
}
// lookupStaticHosts looks up the addresses for the given host from /etc/hosts.
func lookupStaticHost(host string) []string {
hosts.Lock()
......
......@@ -64,13 +64,7 @@ func (file *File) Readdirnames(count int) (names []string, err Error) {
continue
}
count--
if len(names) == cap(names) {
nnames := make([]string, len(names), 2*len(names))
copy(nnames, names)
names = nnames
}
names = names[0 : len(names)+1]
names[len(names)-1] = name
names = append(names, name)
}
}
return names, nil
......
......@@ -59,13 +59,7 @@ func (file *File) Readdirnames(count int) (names []string, err Error) {
continue
}
count--
if len(names) == cap(names) {
nnames := make([]string, len(names), 2*len(names))
copy(nnames, names)
names = nnames
}
names = names[0 : len(names)+1]
names[len(names)-1] = name
names = append(names, name)
}
}
return names, nil
......
......@@ -62,13 +62,7 @@ func (file *File) Readdirnames(count int) (names []string, err Error) {
continue
}
count--
if len(names) == cap(names) {
nnames := make([]string, len(names), 2*len(names))
copy(nnames, names)
names = nnames
}
names = names[0 : len(names)+1]
names[len(names)-1] = name
names = append(names, name)
}
}
return names, nil
......
......@@ -62,13 +62,7 @@ func (file *File) Readdirnames(count int) (names []string, err Error) {
continue
}
count--
if len(names) == cap(names) {
nnames := make([]string, len(names), 2*len(names))
copy(nnames, names)
names = nnames
}
names = names[0 : len(names)+1]
names[len(names)-1] = name
names = append(names, name)
}
}
return names, nil
......
......@@ -87,13 +87,7 @@ func Environ() []string {
if i <= from {
break
}
if len(r) == cap(r) {
nr := make([]string, len(r), 2*len(r))
copy(nr, r)
r = nr
}
r = r[0 : len(r)+1]
r[len(r)-1] = string(utf16.Decode(p[from:i]))
r = append(r, string(utf16.Decode(p[from:i])))
from = i + 1
}
}
......
......@@ -157,13 +157,7 @@ func (file *File) Readdir(count int) (fi []FileInfo, err Error) {
continue
}
count--
if len(fi) == cap(fi) {
nfi := make([]FileInfo, len(fi), 2*len(fi))
copy(nfi, fi)
fi = nfi
}
fi = fi[0 : len(fi)+1]
fi[len(fi)-1] = f
fi = append(fi, f)
}
return fi, nil
}
......
......@@ -816,15 +816,7 @@ func (a *matchArena) addState(s []state, inst instr, prefixed bool, match *match
return s
}
}
if l == cap(s) {
s1 := make([]state, 2*l)[0:l]
copy(s1, s)
s = s1
}
s = s[0 : l+1]
s[l].inst = inst
s[l].prefixed = prefixed
s[l].match = match
s = append(s, state{inst, prefixed, match})
match.ref++
if inst.kind() == _ALT {
s = a.addState(s, inst.(*_Alt).left, prefixed, a.copy(match), pos, end)
......@@ -1262,21 +1254,14 @@ func (re *Regexp) FindAll(b []byte, n int) [][]byte {
if n < 0 {
n = len(b) + 1
}
result := make([][]byte, startSize)
i := 0
result := make([][]byte, 0, startSize)
re.allMatches("", b, n, func(match []int) {
if i == cap(result) {
new := make([][]byte, 2*i)
copy(new, result)
result = new
}
result[i] = b[match[0]:match[1]]
i++
result = append(result, b[match[0]:match[1]])
})
if i == 0 {
if len(result) == 0 {
return nil
}
return result[0:i]
return result
}
// FindAllIndex is the 'All' version of FindIndex; it returns a slice of all
......@@ -1287,21 +1272,14 @@ func (re *Regexp) FindAllIndex(b []byte, n int) [][]int {
if n < 0 {
n = len(b) + 1
}
result := make([][]int, startSize)
i := 0
result := make([][]int, 0, startSize)
re.allMatches("", b, n, func(match []int) {
if i == cap(result) {
new := make([][]int, 2*i)
copy(new, result)
result = new
}
result[i] = match[0:2]
i++
result = append(result, match[0:2])
})
if i == 0 {
if len(result) == 0 {
return nil
}
return result[0:i]
return result
}
// FindAllString is the 'All' version of FindString; it returns a slice of all
......@@ -1312,21 +1290,14 @@ func (re *Regexp) FindAllString(s string, n int) []string {
if n < 0 {
n = len(s) + 1
}
result := make([]string, startSize)
i := 0
result := make([]string, 0, startSize)
re.allMatches(s, nil, n, func(match []int) {
if i == cap(result) {
new := make([]string, 2*i)
copy(new, result)
result = new
}
result[i] = s[match[0]:match[1]]
i++
result = append(result, s[match[0]:match[1]])
})
if i == 0 {
if len(result) == 0 {
return nil
}
return result[0:i]
return result
}
// FindAllStringIndex is the 'All' version of FindStringIndex; it returns a
......@@ -1337,21 +1308,14 @@ func (re *Regexp) FindAllStringIndex(s string, n int) [][]int {
if n < 0 {
n = len(s) + 1
}
result := make([][]int, startSize)
i := 0
result := make([][]int, 0, startSize)
re.allMatches(s, nil, n, func(match []int) {
if i == cap(result) {
new := make([][]int, 2*i)
copy(new, result)
result = new
}
result[i] = match[0:2]
i++
result = append(result, match[0:2])
})
if i == 0 {
if len(result) == 0 {
return nil
}
return result[0:i]
return result
}
// FindAllSubmatch is the 'All' version of FindSubmatch; it returns a slice
......@@ -1362,27 +1326,20 @@ func (re *Regexp) FindAllSubmatch(b []byte, n int) [][][]byte {
if n < 0 {
n = len(b) + 1
}
result := make([][][]byte, startSize)
i := 0
result := make([][][]byte, 0, startSize)
re.allMatches("", b, n, func(match []int) {
if i == cap(result) {
new := make([][][]byte, 2*i)
copy(new, result)
result = new
}
slice := make([][]byte, len(match)/2)
for j := range slice {
if match[2*j] >= 0 {
slice[j] = b[match[2*j]:match[2*j+1]]
}
}
result[i] = slice
i++
result = append(result, slice)
})
if i == 0 {
if len(result) == 0 {
return nil
}
return result[0:i]
return result
}
// FindAllSubmatchIndex is the 'All' version of FindSubmatchIndex; it returns
......@@ -1393,21 +1350,14 @@ func (re *Regexp) FindAllSubmatchIndex(b []byte, n int) [][]int {
if n < 0 {
n = len(b) + 1
}
result := make([][]int, startSize)
i := 0
result := make([][]int, 0, startSize)
re.allMatches("", b, n, func(match []int) {
if i == cap(result) {
new := make([][]int, 2*i)
copy(new, result)
result = new
}
result[i] = match
i++
result = append(result, match)
})
if i == 0 {
if len(result) == 0 {
return nil
}
return result[0:i]
return result
}
// FindAllStringSubmatch is the 'All' version of FindStringSubmatch; it
......@@ -1418,27 +1368,20 @@ func (re *Regexp) FindAllStringSubmatch(s string, n int) [][]string {
if n < 0 {
n = len(s) + 1
}
result := make([][]string, startSize)
i := 0
result := make([][]string, 0, startSize)
re.allMatches(s, nil, n, func(match []int) {
if i == cap(result) {
new := make([][]string, 2*i)
copy(new, result)
result = new
}
slice := make([]string, len(match)/2)
for j := range slice {
if match[2*j] >= 0 {
slice[j] = s[match[2*j]:match[2*j+1]]
}
}
result[i] = slice
i++
result = append(result, slice)
})
if i == 0 {
if len(result) == 0 {
return nil
}
return result[0:i]
return result
}
// FindAllStringSubmatchIndex is the 'All' version of
......@@ -1450,19 +1393,12 @@ func (re *Regexp) FindAllStringSubmatchIndex(s string, n int) [][]int {
if n < 0 {
n = len(s) + 1
}
result := make([][]int, startSize)
i := 0
result := make([][]int, 0, startSize)
re.allMatches(s, nil, n, func(match []int) {
if i == cap(result) {
new := make([][]int, 2*i)
copy(new, result)
result = new
}
result[i] = match
i++
result = append(result, match)
})
if i == 0 {
if len(result) == 0 {
return nil
}
return result[0:i]
return result
}
......@@ -318,13 +318,7 @@ func words(buf []byte) []string {
if start == p { // no text left
break
}
if i == cap(s) {
ns := make([]string, 2*cap(s))
copy(ns, s)
s = ns
}
s = s[0 : i+1]
s[i] = string(buf[start:p])
s = append(s, string(buf[start:p]))
}
return s
}
......
......@@ -167,17 +167,7 @@ func (cclass *_CharClass) print() {
func (cclass *_CharClass) addRange(a, b int) {
// range is a through b inclusive
n := len(cclass.ranges)
if n >= cap(cclass.ranges) {
nr := make([]int, n, 2*n)
copy(nr, cclass.ranges)
cclass.ranges = nr
}
cclass.ranges = cclass.ranges[0 : n+2]
cclass.ranges[n] = a
n++
cclass.ranges[n] = b
n++
cclass.ranges = append(cclass.ranges, a, b)
}
func (cclass *_CharClass) matches(c int) bool {
......@@ -249,15 +239,8 @@ func (nop *_Nop) kind() int { return _NOP }
func (nop *_Nop) print() { print("nop") }
func (re *Regexp) add(i instr) instr {
n := len(re.inst)
i.setIndex(len(re.inst))
if n >= cap(re.inst) {
ni := make([]instr, n, 2*n)
copy(ni, re.inst)
re.inst = ni
}
re.inst = re.inst[0 : n+1]
re.inst[n] = i
re.inst = append(re.inst, i)
return i
}
......
......@@ -493,15 +493,7 @@ func parseScript(line string, scripts map[string][]Script) {
}
}
name := matches[3]
s, ok := scripts[name]
if !ok || len(s) == cap(s) {
ns := make([]Script, len(s), len(s)+100)
copy(ns, s)
s = ns
}
s = s[0 : len(s)+1]
s[len(s)-1] = Script{uint32(lo), uint32(hi), name}
scripts[name] = s
scripts[name] = append(scripts[name], Script{uint32(lo), uint32(hi), name})
}
// The script tables have a lot of adjacent elements. Fold them together.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment