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