mirror of https://github.com/golang/go.git
[dev.ssa] Merge remote-tracking branch 'origin/master' into dev.ssa
Change-Id: I0f9b6777fd1cb121ad21bce0f2c52f142be2eb6f
This commit is contained in:
commit
0767461ecf
|
|
@ -122,7 +122,7 @@ Brian G. Merrell <bgmerrell@gmail.com>
|
|||
Brian Gitonga Marete <marete@toshnix.com>
|
||||
Brian Ketelsen <bketelsen@gmail.com>
|
||||
Brian Slesinsky <skybrian@google.com>
|
||||
Burcu Dogan <jbd@google.com>
|
||||
Burcu Dogan <jbd@google.com> <burcujdogan@gmail.com>
|
||||
Caine Tighe <arctanofyourface@gmail.com>
|
||||
Caleb Spare <cespare@gmail.com>
|
||||
Carl Chatfield <carlchatfield@gmail.com>
|
||||
|
|
|
|||
693
api/next.txt
693
api/next.txt
|
|
@ -1,3 +1,53 @@
|
|||
pkg archive/zip, method (*Writer) SetOffset(int64)
|
||||
pkg bufio, method (*Reader) Discard(int) (int, error)
|
||||
pkg bufio, method (ReadWriter) Discard(int) (int, error)
|
||||
pkg bytes, method (*Buffer) Cap() int
|
||||
pkg bytes, method (*Reader) Size() int64
|
||||
pkg crypto, type Decrypter interface { Decrypt, Public }
|
||||
pkg crypto, type Decrypter interface, Decrypt(io.Reader, []uint8, DecrypterOpts) ([]uint8, error)
|
||||
pkg crypto, type Decrypter interface, Public() PublicKey
|
||||
pkg crypto, type DecrypterOpts interface {}
|
||||
pkg crypto/elliptic, type CurveParams struct, Name string
|
||||
pkg crypto/rsa, method (*PrivateKey) Decrypt(io.Reader, []uint8, crypto.DecrypterOpts) ([]uint8, error)
|
||||
pkg crypto/rsa, type OAEPOptions struct
|
||||
pkg crypto/rsa, type OAEPOptions struct, Hash crypto.Hash
|
||||
pkg crypto/rsa, type OAEPOptions struct, Label []uint8
|
||||
pkg crypto/rsa, type PKCS1v15DecryptOptions struct
|
||||
pkg crypto/rsa, type PKCS1v15DecryptOptions struct, SessionKeyLen int
|
||||
pkg crypto/tls, const TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 49196
|
||||
pkg crypto/tls, const TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 uint16
|
||||
pkg crypto/tls, const TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 49200
|
||||
pkg crypto/tls, const TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 uint16
|
||||
pkg crypto/x509/pkix, type Name struct, ExtraNames []AttributeTypeAndValue
|
||||
pkg database/sql, method (*DB) Stats() DBStats
|
||||
pkg database/sql, type DBStats struct
|
||||
pkg database/sql, type DBStats struct, OpenConnections int
|
||||
pkg debug/dwarf, method (*Data) LineReader(*Entry) (*LineReader, error)
|
||||
pkg debug/dwarf, method (*LineReader) Next(*LineEntry) error
|
||||
pkg debug/dwarf, method (*LineReader) Reset()
|
||||
pkg debug/dwarf, method (*LineReader) Seek(LineReaderPos)
|
||||
pkg debug/dwarf, method (*LineReader) SeekPC(uint64, *LineEntry) error
|
||||
pkg debug/dwarf, method (*LineReader) Tell() LineReaderPos
|
||||
pkg debug/dwarf, type LineEntry struct
|
||||
pkg debug/dwarf, type LineEntry struct, Address uint64
|
||||
pkg debug/dwarf, type LineEntry struct, BasicBlock bool
|
||||
pkg debug/dwarf, type LineEntry struct, Column int
|
||||
pkg debug/dwarf, type LineEntry struct, Discriminator int
|
||||
pkg debug/dwarf, type LineEntry struct, EndSequence bool
|
||||
pkg debug/dwarf, type LineEntry struct, EpilogueBegin bool
|
||||
pkg debug/dwarf, type LineEntry struct, File *LineFile
|
||||
pkg debug/dwarf, type LineEntry struct, ISA int
|
||||
pkg debug/dwarf, type LineEntry struct, IsStmt bool
|
||||
pkg debug/dwarf, type LineEntry struct, Line int
|
||||
pkg debug/dwarf, type LineEntry struct, OpIndex int
|
||||
pkg debug/dwarf, type LineEntry struct, PrologueEnd bool
|
||||
pkg debug/dwarf, type LineFile struct
|
||||
pkg debug/dwarf, type LineFile struct, Length int
|
||||
pkg debug/dwarf, type LineFile struct, Mtime uint64
|
||||
pkg debug/dwarf, type LineFile struct, Name string
|
||||
pkg debug/dwarf, type LineReader struct
|
||||
pkg debug/dwarf, type LineReaderPos struct
|
||||
pkg debug/dwarf, var ErrUnknownPC error
|
||||
pkg debug/elf, const R_PPC64_ADDR14 = 7
|
||||
pkg debug/elf, const R_PPC64_ADDR14 R_PPC64
|
||||
pkg debug/elf, const R_PPC64_ADDR14_BRNTAKEN = 9
|
||||
|
|
@ -167,3 +217,646 @@ pkg debug/elf, const R_PPC64_TPREL64 R_PPC64
|
|||
pkg debug/elf, method (R_PPC64) GoString() string
|
||||
pkg debug/elf, method (R_PPC64) String() string
|
||||
pkg debug/elf, type R_PPC64 int
|
||||
pkg encoding/base64, const NoPadding = -1
|
||||
pkg encoding/base64, const NoPadding int32
|
||||
pkg encoding/base64, const StdPadding = 61
|
||||
pkg encoding/base64, const StdPadding int32
|
||||
pkg encoding/base64, method (Encoding) WithPadding(int32) *Encoding
|
||||
pkg encoding/base64, var RawStdEncoding *Encoding
|
||||
pkg encoding/base64, var RawURLEncoding *Encoding
|
||||
pkg encoding/json, type UnmarshalTypeError struct, Offset int64
|
||||
pkg flag, func UnquoteUsage(*Flag) (string, string)
|
||||
pkg go/ast, type EmptyStmt struct, Implicit bool
|
||||
pkg go/exact, const Bool = 1
|
||||
pkg go/exact, const Bool Kind
|
||||
pkg go/exact, const Complex = 5
|
||||
pkg go/exact, const Complex Kind
|
||||
pkg go/exact, const Float = 4
|
||||
pkg go/exact, const Float Kind
|
||||
pkg go/exact, const Int = 3
|
||||
pkg go/exact, const Int Kind
|
||||
pkg go/exact, const String = 2
|
||||
pkg go/exact, const String Kind
|
||||
pkg go/exact, const Unknown = 0
|
||||
pkg go/exact, const Unknown Kind
|
||||
pkg go/exact, func BinaryOp(Value, token.Token, Value) Value
|
||||
pkg go/exact, func BitLen(Value) int
|
||||
pkg go/exact, func BoolVal(Value) bool
|
||||
pkg go/exact, func Bytes(Value) []uint8
|
||||
pkg go/exact, func Compare(Value, token.Token, Value) bool
|
||||
pkg go/exact, func Denom(Value) Value
|
||||
pkg go/exact, func Float32Val(Value) (float32, bool)
|
||||
pkg go/exact, func Float64Val(Value) (float64, bool)
|
||||
pkg go/exact, func Imag(Value) Value
|
||||
pkg go/exact, func Int64Val(Value) (int64, bool)
|
||||
pkg go/exact, func MakeBool(bool) Value
|
||||
pkg go/exact, func MakeFloat64(float64) Value
|
||||
pkg go/exact, func MakeFromBytes([]uint8) Value
|
||||
pkg go/exact, func MakeFromLiteral(string, token.Token) Value
|
||||
pkg go/exact, func MakeImag(Value) Value
|
||||
pkg go/exact, func MakeInt64(int64) Value
|
||||
pkg go/exact, func MakeString(string) Value
|
||||
pkg go/exact, func MakeUint64(uint64) Value
|
||||
pkg go/exact, func MakeUnknown() Value
|
||||
pkg go/exact, func Num(Value) Value
|
||||
pkg go/exact, func Real(Value) Value
|
||||
pkg go/exact, func Shift(Value, token.Token, uint) Value
|
||||
pkg go/exact, func Sign(Value) int
|
||||
pkg go/exact, func StringVal(Value) string
|
||||
pkg go/exact, func Uint64Val(Value) (uint64, bool)
|
||||
pkg go/exact, func UnaryOp(token.Token, Value, int) Value
|
||||
pkg go/exact, type Kind int
|
||||
pkg go/exact, type Value interface, Kind() Kind
|
||||
pkg go/exact, type Value interface, String() string
|
||||
pkg go/exact, type Value interface, unexported methods
|
||||
pkg go/types, const Bool = 1
|
||||
pkg go/types, const Bool BasicKind
|
||||
pkg go/types, const Byte = 8
|
||||
pkg go/types, const Byte BasicKind
|
||||
pkg go/types, const Complex128 = 16
|
||||
pkg go/types, const Complex128 BasicKind
|
||||
pkg go/types, const Complex64 = 15
|
||||
pkg go/types, const Complex64 BasicKind
|
||||
pkg go/types, const FieldVal = 0
|
||||
pkg go/types, const FieldVal SelectionKind
|
||||
pkg go/types, const Float32 = 13
|
||||
pkg go/types, const Float32 BasicKind
|
||||
pkg go/types, const Float64 = 14
|
||||
pkg go/types, const Float64 BasicKind
|
||||
pkg go/types, const Int = 2
|
||||
pkg go/types, const Int BasicKind
|
||||
pkg go/types, const Int16 = 4
|
||||
pkg go/types, const Int16 BasicKind
|
||||
pkg go/types, const Int32 = 5
|
||||
pkg go/types, const Int32 BasicKind
|
||||
pkg go/types, const Int64 = 6
|
||||
pkg go/types, const Int64 BasicKind
|
||||
pkg go/types, const Int8 = 3
|
||||
pkg go/types, const Int8 BasicKind
|
||||
pkg go/types, const Invalid = 0
|
||||
pkg go/types, const Invalid BasicKind
|
||||
pkg go/types, const IsBoolean = 1
|
||||
pkg go/types, const IsBoolean BasicInfo
|
||||
pkg go/types, const IsComplex = 16
|
||||
pkg go/types, const IsComplex BasicInfo
|
||||
pkg go/types, const IsConstType = 59
|
||||
pkg go/types, const IsConstType BasicInfo
|
||||
pkg go/types, const IsFloat = 8
|
||||
pkg go/types, const IsFloat BasicInfo
|
||||
pkg go/types, const IsInteger = 2
|
||||
pkg go/types, const IsInteger BasicInfo
|
||||
pkg go/types, const IsNumeric = 26
|
||||
pkg go/types, const IsNumeric BasicInfo
|
||||
pkg go/types, const IsOrdered = 42
|
||||
pkg go/types, const IsOrdered BasicInfo
|
||||
pkg go/types, const IsString = 32
|
||||
pkg go/types, const IsString BasicInfo
|
||||
pkg go/types, const IsUnsigned = 4
|
||||
pkg go/types, const IsUnsigned BasicInfo
|
||||
pkg go/types, const IsUntyped = 64
|
||||
pkg go/types, const IsUntyped BasicInfo
|
||||
pkg go/types, const MethodExpr = 2
|
||||
pkg go/types, const MethodExpr SelectionKind
|
||||
pkg go/types, const MethodVal = 1
|
||||
pkg go/types, const MethodVal SelectionKind
|
||||
pkg go/types, const RecvOnly = 2
|
||||
pkg go/types, const RecvOnly ChanDir
|
||||
pkg go/types, const Rune = 5
|
||||
pkg go/types, const Rune BasicKind
|
||||
pkg go/types, const SendOnly = 1
|
||||
pkg go/types, const SendOnly ChanDir
|
||||
pkg go/types, const SendRecv = 0
|
||||
pkg go/types, const SendRecv ChanDir
|
||||
pkg go/types, const String = 17
|
||||
pkg go/types, const String BasicKind
|
||||
pkg go/types, const Uint = 7
|
||||
pkg go/types, const Uint BasicKind
|
||||
pkg go/types, const Uint16 = 9
|
||||
pkg go/types, const Uint16 BasicKind
|
||||
pkg go/types, const Uint32 = 10
|
||||
pkg go/types, const Uint32 BasicKind
|
||||
pkg go/types, const Uint64 = 11
|
||||
pkg go/types, const Uint64 BasicKind
|
||||
pkg go/types, const Uint8 = 8
|
||||
pkg go/types, const Uint8 BasicKind
|
||||
pkg go/types, const Uintptr = 12
|
||||
pkg go/types, const Uintptr BasicKind
|
||||
pkg go/types, const UnsafePointer = 18
|
||||
pkg go/types, const UnsafePointer BasicKind
|
||||
pkg go/types, const UntypedBool = 19
|
||||
pkg go/types, const UntypedBool BasicKind
|
||||
pkg go/types, const UntypedComplex = 23
|
||||
pkg go/types, const UntypedComplex BasicKind
|
||||
pkg go/types, const UntypedFloat = 22
|
||||
pkg go/types, const UntypedFloat BasicKind
|
||||
pkg go/types, const UntypedInt = 20
|
||||
pkg go/types, const UntypedInt BasicKind
|
||||
pkg go/types, const UntypedNil = 25
|
||||
pkg go/types, const UntypedNil BasicKind
|
||||
pkg go/types, const UntypedRune = 21
|
||||
pkg go/types, const UntypedRune BasicKind
|
||||
pkg go/types, const UntypedString = 24
|
||||
pkg go/types, const UntypedString BasicKind
|
||||
pkg go/types, func AssertableTo(*Interface, Type) bool
|
||||
pkg go/types, func AssignableTo(Type, Type) bool
|
||||
pkg go/types, func Check(string, *token.FileSet, []*ast.File) (*Package, error)
|
||||
pkg go/types, func Comparable(Type) bool
|
||||
pkg go/types, func ConvertibleTo(Type, Type) bool
|
||||
pkg go/types, func DefPredeclaredTestFuncs()
|
||||
pkg go/types, func Eval(string, *Package, *Scope) (TypeAndValue, error)
|
||||
pkg go/types, func EvalNode(*token.FileSet, ast.Expr, *Package, *Scope) (TypeAndValue, error)
|
||||
pkg go/types, func ExprString(ast.Expr) string
|
||||
pkg go/types, func Id(*Package, string) string
|
||||
pkg go/types, func Identical(Type, Type) bool
|
||||
pkg go/types, func Implements(Type, *Interface) bool
|
||||
pkg go/types, func IsInterface(Type) bool
|
||||
pkg go/types, func LookupFieldOrMethod(Type, bool, *Package, string) (Object, []int, bool)
|
||||
pkg go/types, func MissingMethod(Type, *Interface, bool) (*Func, bool)
|
||||
pkg go/types, func New(string) Type
|
||||
pkg go/types, func NewArray(Type, int64) *Array
|
||||
pkg go/types, func NewChan(ChanDir, Type) *Chan
|
||||
pkg go/types, func NewChecker(*Config, *token.FileSet, *Package, *Info) *Checker
|
||||
pkg go/types, func NewConst(token.Pos, *Package, string, Type, exact.Value) *Const
|
||||
pkg go/types, func NewField(token.Pos, *Package, string, Type, bool) *Var
|
||||
pkg go/types, func NewFunc(token.Pos, *Package, string, *Signature) *Func
|
||||
pkg go/types, func NewInterface([]*Func, []*Named) *Interface
|
||||
pkg go/types, func NewLabel(token.Pos, *Package, string) *Label
|
||||
pkg go/types, func NewMap(Type, Type) *Map
|
||||
pkg go/types, func NewMethodSet(Type) *MethodSet
|
||||
pkg go/types, func NewNamed(*TypeName, Type, []*Func) *Named
|
||||
pkg go/types, func NewPackage(string, string) *Package
|
||||
pkg go/types, func NewParam(token.Pos, *Package, string, Type) *Var
|
||||
pkg go/types, func NewPkgName(token.Pos, *Package, string, *Package) *PkgName
|
||||
pkg go/types, func NewPointer(Type) *Pointer
|
||||
pkg go/types, func NewScope(*Scope, string) *Scope
|
||||
pkg go/types, func NewSignature(*Scope, *Var, *Tuple, *Tuple, bool) *Signature
|
||||
pkg go/types, func NewSlice(Type) *Slice
|
||||
pkg go/types, func NewStruct([]*Var, []string) *Struct
|
||||
pkg go/types, func NewTuple(...*Var) *Tuple
|
||||
pkg go/types, func NewTypeName(token.Pos, *Package, string, Type) *TypeName
|
||||
pkg go/types, func NewVar(token.Pos, *Package, string, Type) *Var
|
||||
pkg go/types, func ObjectString(*Package, Object) string
|
||||
pkg go/types, func SelectionString(*Package, *Selection) string
|
||||
pkg go/types, func TypeString(*Package, Type) string
|
||||
pkg go/types, func WriteExpr(*bytes.Buffer, ast.Expr)
|
||||
pkg go/types, func WriteSignature(*bytes.Buffer, *Package, *Signature)
|
||||
pkg go/types, func WriteType(*bytes.Buffer, *Package, Type)
|
||||
pkg go/types, method (*Array) Elem() Type
|
||||
pkg go/types, method (*Array) Len() int64
|
||||
pkg go/types, method (*Array) String() string
|
||||
pkg go/types, method (*Array) Underlying() Type
|
||||
pkg go/types, method (*Basic) Info() BasicInfo
|
||||
pkg go/types, method (*Basic) Kind() BasicKind
|
||||
pkg go/types, method (*Basic) Name() string
|
||||
pkg go/types, method (*Basic) String() string
|
||||
pkg go/types, method (*Basic) Underlying() Type
|
||||
pkg go/types, method (*Builtin) Exported() bool
|
||||
pkg go/types, method (*Builtin) Id() string
|
||||
pkg go/types, method (*Builtin) Name() string
|
||||
pkg go/types, method (*Builtin) Parent() *Scope
|
||||
pkg go/types, method (*Builtin) Pkg() *Package
|
||||
pkg go/types, method (*Builtin) Pos() token.Pos
|
||||
pkg go/types, method (*Builtin) String() string
|
||||
pkg go/types, method (*Builtin) Type() Type
|
||||
pkg go/types, method (*Chan) Dir() ChanDir
|
||||
pkg go/types, method (*Chan) Elem() Type
|
||||
pkg go/types, method (*Chan) String() string
|
||||
pkg go/types, method (*Chan) Underlying() Type
|
||||
pkg go/types, method (*Checker) Files([]*ast.File) error
|
||||
pkg go/types, method (*Config) Check(string, *token.FileSet, []*ast.File, *Info) (*Package, error)
|
||||
pkg go/types, method (*Const) Exported() bool
|
||||
pkg go/types, method (*Const) Id() string
|
||||
pkg go/types, method (*Const) Name() string
|
||||
pkg go/types, method (*Const) Parent() *Scope
|
||||
pkg go/types, method (*Const) Pkg() *Package
|
||||
pkg go/types, method (*Const) Pos() token.Pos
|
||||
pkg go/types, method (*Const) String() string
|
||||
pkg go/types, method (*Const) Type() Type
|
||||
pkg go/types, method (*Const) Val() exact.Value
|
||||
pkg go/types, method (*Func) Exported() bool
|
||||
pkg go/types, method (*Func) FullName() string
|
||||
pkg go/types, method (*Func) Id() string
|
||||
pkg go/types, method (*Func) Name() string
|
||||
pkg go/types, method (*Func) Parent() *Scope
|
||||
pkg go/types, method (*Func) Pkg() *Package
|
||||
pkg go/types, method (*Func) Pos() token.Pos
|
||||
pkg go/types, method (*Func) Scope() *Scope
|
||||
pkg go/types, method (*Func) String() string
|
||||
pkg go/types, method (*Func) Type() Type
|
||||
pkg go/types, method (*Info) ObjectOf(*ast.Ident) Object
|
||||
pkg go/types, method (*Info) TypeOf(ast.Expr) Type
|
||||
pkg go/types, method (*Initializer) String() string
|
||||
pkg go/types, method (*Interface) Complete() *Interface
|
||||
pkg go/types, method (*Interface) Embedded(int) *Named
|
||||
pkg go/types, method (*Interface) Empty() bool
|
||||
pkg go/types, method (*Interface) ExplicitMethod(int) *Func
|
||||
pkg go/types, method (*Interface) Method(int) *Func
|
||||
pkg go/types, method (*Interface) NumEmbeddeds() int
|
||||
pkg go/types, method (*Interface) NumExplicitMethods() int
|
||||
pkg go/types, method (*Interface) NumMethods() int
|
||||
pkg go/types, method (*Interface) String() string
|
||||
pkg go/types, method (*Interface) Underlying() Type
|
||||
pkg go/types, method (*Label) Exported() bool
|
||||
pkg go/types, method (*Label) Id() string
|
||||
pkg go/types, method (*Label) Name() string
|
||||
pkg go/types, method (*Label) Parent() *Scope
|
||||
pkg go/types, method (*Label) Pkg() *Package
|
||||
pkg go/types, method (*Label) Pos() token.Pos
|
||||
pkg go/types, method (*Label) String() string
|
||||
pkg go/types, method (*Label) Type() Type
|
||||
pkg go/types, method (*Map) Elem() Type
|
||||
pkg go/types, method (*Map) Key() Type
|
||||
pkg go/types, method (*Map) String() string
|
||||
pkg go/types, method (*Map) Underlying() Type
|
||||
pkg go/types, method (*MethodSet) At(int) *Selection
|
||||
pkg go/types, method (*MethodSet) Len() int
|
||||
pkg go/types, method (*MethodSet) Lookup(*Package, string) *Selection
|
||||
pkg go/types, method (*MethodSet) String() string
|
||||
pkg go/types, method (*MethodSetCache) MethodSet(Type) *MethodSet
|
||||
pkg go/types, method (*Named) AddMethod(*Func)
|
||||
pkg go/types, method (*Named) Method(int) *Func
|
||||
pkg go/types, method (*Named) NumMethods() int
|
||||
pkg go/types, method (*Named) Obj() *TypeName
|
||||
pkg go/types, method (*Named) SetUnderlying(Type)
|
||||
pkg go/types, method (*Named) String() string
|
||||
pkg go/types, method (*Named) Underlying() Type
|
||||
pkg go/types, method (*Nil) Exported() bool
|
||||
pkg go/types, method (*Nil) Id() string
|
||||
pkg go/types, method (*Nil) Name() string
|
||||
pkg go/types, method (*Nil) Parent() *Scope
|
||||
pkg go/types, method (*Nil) Pkg() *Package
|
||||
pkg go/types, method (*Nil) Pos() token.Pos
|
||||
pkg go/types, method (*Nil) String() string
|
||||
pkg go/types, method (*Nil) Type() Type
|
||||
pkg go/types, method (*Package) Complete() bool
|
||||
pkg go/types, method (*Package) Imports() []*Package
|
||||
pkg go/types, method (*Package) MarkComplete()
|
||||
pkg go/types, method (*Package) Name() string
|
||||
pkg go/types, method (*Package) Path() string
|
||||
pkg go/types, method (*Package) Scope() *Scope
|
||||
pkg go/types, method (*Package) SetImports([]*Package)
|
||||
pkg go/types, method (*Package) String() string
|
||||
pkg go/types, method (*PkgName) Exported() bool
|
||||
pkg go/types, method (*PkgName) Id() string
|
||||
pkg go/types, method (*PkgName) Imported() *Package
|
||||
pkg go/types, method (*PkgName) Name() string
|
||||
pkg go/types, method (*PkgName) Parent() *Scope
|
||||
pkg go/types, method (*PkgName) Pkg() *Package
|
||||
pkg go/types, method (*PkgName) Pos() token.Pos
|
||||
pkg go/types, method (*PkgName) String() string
|
||||
pkg go/types, method (*PkgName) Type() Type
|
||||
pkg go/types, method (*Pointer) Elem() Type
|
||||
pkg go/types, method (*Pointer) String() string
|
||||
pkg go/types, method (*Pointer) Underlying() Type
|
||||
pkg go/types, method (*Scope) Child(int) *Scope
|
||||
pkg go/types, method (*Scope) Insert(Object) Object
|
||||
pkg go/types, method (*Scope) Len() int
|
||||
pkg go/types, method (*Scope) Lookup(string) Object
|
||||
pkg go/types, method (*Scope) LookupParent(string) (*Scope, Object)
|
||||
pkg go/types, method (*Scope) Names() []string
|
||||
pkg go/types, method (*Scope) NumChildren() int
|
||||
pkg go/types, method (*Scope) Parent() *Scope
|
||||
pkg go/types, method (*Scope) String() string
|
||||
pkg go/types, method (*Scope) WriteTo(io.Writer, int, bool)
|
||||
pkg go/types, method (*Selection) Index() []int
|
||||
pkg go/types, method (*Selection) Indirect() bool
|
||||
pkg go/types, method (*Selection) Kind() SelectionKind
|
||||
pkg go/types, method (*Selection) Obj() Object
|
||||
pkg go/types, method (*Selection) Recv() Type
|
||||
pkg go/types, method (*Selection) String() string
|
||||
pkg go/types, method (*Selection) Type() Type
|
||||
pkg go/types, method (*Signature) Params() *Tuple
|
||||
pkg go/types, method (*Signature) Recv() *Var
|
||||
pkg go/types, method (*Signature) Results() *Tuple
|
||||
pkg go/types, method (*Signature) String() string
|
||||
pkg go/types, method (*Signature) Underlying() Type
|
||||
pkg go/types, method (*Signature) Variadic() bool
|
||||
pkg go/types, method (*Slice) Elem() Type
|
||||
pkg go/types, method (*Slice) String() string
|
||||
pkg go/types, method (*Slice) Underlying() Type
|
||||
pkg go/types, method (*StdSizes) Alignof(Type) int64
|
||||
pkg go/types, method (*StdSizes) Offsetsof([]*Var) []int64
|
||||
pkg go/types, method (*StdSizes) Sizeof(Type) int64
|
||||
pkg go/types, method (*Struct) Field(int) *Var
|
||||
pkg go/types, method (*Struct) NumFields() int
|
||||
pkg go/types, method (*Struct) String() string
|
||||
pkg go/types, method (*Struct) Tag(int) string
|
||||
pkg go/types, method (*Struct) Underlying() Type
|
||||
pkg go/types, method (*Tuple) At(int) *Var
|
||||
pkg go/types, method (*Tuple) Len() int
|
||||
pkg go/types, method (*Tuple) String() string
|
||||
pkg go/types, method (*Tuple) Underlying() Type
|
||||
pkg go/types, method (*TypeName) Exported() bool
|
||||
pkg go/types, method (*TypeName) Id() string
|
||||
pkg go/types, method (*TypeName) Name() string
|
||||
pkg go/types, method (*TypeName) Parent() *Scope
|
||||
pkg go/types, method (*TypeName) Pkg() *Package
|
||||
pkg go/types, method (*TypeName) Pos() token.Pos
|
||||
pkg go/types, method (*TypeName) String() string
|
||||
pkg go/types, method (*TypeName) Type() Type
|
||||
pkg go/types, method (*Var) Anonymous() bool
|
||||
pkg go/types, method (*Var) Exported() bool
|
||||
pkg go/types, method (*Var) Id() string
|
||||
pkg go/types, method (*Var) IsField() bool
|
||||
pkg go/types, method (*Var) Name() string
|
||||
pkg go/types, method (*Var) Parent() *Scope
|
||||
pkg go/types, method (*Var) Pkg() *Package
|
||||
pkg go/types, method (*Var) Pos() token.Pos
|
||||
pkg go/types, method (*Var) String() string
|
||||
pkg go/types, method (*Var) Type() Type
|
||||
pkg go/types, method (Checker) ObjectOf(*ast.Ident) Object
|
||||
pkg go/types, method (Checker) TypeOf(ast.Expr) Type
|
||||
pkg go/types, method (Error) Error() string
|
||||
pkg go/types, method (TypeAndValue) Addressable() bool
|
||||
pkg go/types, method (TypeAndValue) Assignable() bool
|
||||
pkg go/types, method (TypeAndValue) HasOk() bool
|
||||
pkg go/types, method (TypeAndValue) IsBuiltin() bool
|
||||
pkg go/types, method (TypeAndValue) IsNil() bool
|
||||
pkg go/types, method (TypeAndValue) IsType() bool
|
||||
pkg go/types, method (TypeAndValue) IsValue() bool
|
||||
pkg go/types, method (TypeAndValue) IsVoid() bool
|
||||
pkg go/types, type Array struct
|
||||
pkg go/types, type Basic struct
|
||||
pkg go/types, type BasicInfo int
|
||||
pkg go/types, type BasicKind int
|
||||
pkg go/types, type Builtin struct
|
||||
pkg go/types, type Chan struct
|
||||
pkg go/types, type ChanDir int
|
||||
pkg go/types, type Checker struct
|
||||
pkg go/types, type Checker struct, embedded *Info
|
||||
pkg go/types, type Config struct
|
||||
pkg go/types, type Config struct, DisableUnusedImportCheck bool
|
||||
pkg go/types, type Config struct, Error func(error)
|
||||
pkg go/types, type Config struct, FakeImportC bool
|
||||
pkg go/types, type Config struct, IgnoreFuncBodies bool
|
||||
pkg go/types, type Config struct, Import Importer
|
||||
pkg go/types, type Config struct, Packages map[string]*Package
|
||||
pkg go/types, type Config struct, Sizes Sizes
|
||||
pkg go/types, type Const struct
|
||||
pkg go/types, type Error struct
|
||||
pkg go/types, type Error struct, Fset *token.FileSet
|
||||
pkg go/types, type Error struct, Msg string
|
||||
pkg go/types, type Error struct, Pos token.Pos
|
||||
pkg go/types, type Error struct, Soft bool
|
||||
pkg go/types, type Func struct
|
||||
pkg go/types, type Importer func(map[string]*Package, string) (*Package, error)
|
||||
pkg go/types, type Info struct
|
||||
pkg go/types, type Info struct, Defs map[*ast.Ident]Object
|
||||
pkg go/types, type Info struct, Implicits map[ast.Node]Object
|
||||
pkg go/types, type Info struct, InitOrder []*Initializer
|
||||
pkg go/types, type Info struct, Scopes map[ast.Node]*Scope
|
||||
pkg go/types, type Info struct, Selections map[*ast.SelectorExpr]*Selection
|
||||
pkg go/types, type Info struct, Types map[ast.Expr]TypeAndValue
|
||||
pkg go/types, type Info struct, Uses map[*ast.Ident]Object
|
||||
pkg go/types, type Initializer struct
|
||||
pkg go/types, type Initializer struct, Lhs []*Var
|
||||
pkg go/types, type Initializer struct, Rhs ast.Expr
|
||||
pkg go/types, type Interface struct
|
||||
pkg go/types, type Label struct
|
||||
pkg go/types, type Map struct
|
||||
pkg go/types, type MethodSet struct
|
||||
pkg go/types, type MethodSetCache struct
|
||||
pkg go/types, type Named struct
|
||||
pkg go/types, type Nil struct
|
||||
pkg go/types, type Object interface, Exported() bool
|
||||
pkg go/types, type Object interface, Id() string
|
||||
pkg go/types, type Object interface, Name() string
|
||||
pkg go/types, type Object interface, Parent() *Scope
|
||||
pkg go/types, type Object interface, Pkg() *Package
|
||||
pkg go/types, type Object interface, Pos() token.Pos
|
||||
pkg go/types, type Object interface, String() string
|
||||
pkg go/types, type Object interface, Type() Type
|
||||
pkg go/types, type Object interface, unexported methods
|
||||
pkg go/types, type Package struct
|
||||
pkg go/types, type PkgName struct
|
||||
pkg go/types, type Pointer struct
|
||||
pkg go/types, type Scope struct
|
||||
pkg go/types, type Selection struct
|
||||
pkg go/types, type SelectionKind int
|
||||
pkg go/types, type Signature struct
|
||||
pkg go/types, type Sizes interface { Alignof, Offsetsof, Sizeof }
|
||||
pkg go/types, type Sizes interface, Alignof(Type) int64
|
||||
pkg go/types, type Sizes interface, Offsetsof([]*Var) []int64
|
||||
pkg go/types, type Sizes interface, Sizeof(Type) int64
|
||||
pkg go/types, type Slice struct
|
||||
pkg go/types, type StdSizes struct
|
||||
pkg go/types, type StdSizes struct, MaxAlign int64
|
||||
pkg go/types, type StdSizes struct, WordSize int64
|
||||
pkg go/types, type Struct struct
|
||||
pkg go/types, type Tuple struct
|
||||
pkg go/types, type Type interface { String, Underlying }
|
||||
pkg go/types, type Type interface, String() string
|
||||
pkg go/types, type Type interface, Underlying() Type
|
||||
pkg go/types, type TypeAndValue struct
|
||||
pkg go/types, type TypeAndValue struct, Type Type
|
||||
pkg go/types, type TypeAndValue struct, Value exact.Value
|
||||
pkg go/types, type TypeName struct
|
||||
pkg go/types, type Var struct
|
||||
pkg go/types, var DefaultImport Importer
|
||||
pkg go/types, var GcCompatibilityMode bool
|
||||
pkg go/types, var Typ [26]*Basic
|
||||
pkg go/types, var Universe *Scope
|
||||
pkg go/types, var UniverseByte *Basic
|
||||
pkg go/types, var UniverseRune *Basic
|
||||
pkg go/types, var Unsafe *Package
|
||||
pkg html/template, method (*Template) Option(...string) *Template
|
||||
pkg image, const YCbCrSubsampleRatio410 = 5
|
||||
pkg image, const YCbCrSubsampleRatio410 YCbCrSubsampleRatio
|
||||
pkg image, const YCbCrSubsampleRatio411 = 4
|
||||
pkg image, const YCbCrSubsampleRatio411 YCbCrSubsampleRatio
|
||||
pkg image, func NewCMYK(Rectangle) *CMYK
|
||||
pkg image, method (*CMYK) At(int, int) color.Color
|
||||
pkg image, method (*CMYK) Bounds() Rectangle
|
||||
pkg image, method (*CMYK) CMYKAt(int, int) color.CMYK
|
||||
pkg image, method (*CMYK) ColorModel() color.Model
|
||||
pkg image, method (*CMYK) Opaque() bool
|
||||
pkg image, method (*CMYK) PixOffset(int, int) int
|
||||
pkg image, method (*CMYK) Set(int, int, color.Color)
|
||||
pkg image, method (*CMYK) SetCMYK(int, int, color.CMYK)
|
||||
pkg image, method (*CMYK) SubImage(Rectangle) Image
|
||||
pkg image, method (Rectangle) At(int, int) color.Color
|
||||
pkg image, method (Rectangle) Bounds() Rectangle
|
||||
pkg image, method (Rectangle) ColorModel() color.Model
|
||||
pkg image, type CMYK struct
|
||||
pkg image, type CMYK struct, Pix []uint8
|
||||
pkg image, type CMYK struct, Rect Rectangle
|
||||
pkg image, type CMYK struct, Stride int
|
||||
pkg image/color, func CMYKToRGB(uint8, uint8, uint8, uint8) (uint8, uint8, uint8)
|
||||
pkg image/color, func RGBToCMYK(uint8, uint8, uint8) (uint8, uint8, uint8, uint8)
|
||||
pkg image/color, method (CMYK) RGBA() (uint32, uint32, uint32, uint32)
|
||||
pkg image/color, type CMYK struct
|
||||
pkg image/color, type CMYK struct, C uint8
|
||||
pkg image/color, type CMYK struct, K uint8
|
||||
pkg image/color, type CMYK struct, M uint8
|
||||
pkg image/color, type CMYK struct, Y uint8
|
||||
pkg image/color, var CMYKModel Model
|
||||
pkg log, func Output(int, string) error
|
||||
pkg log, method (*Logger) SetOutput(io.Writer)
|
||||
pkg math/big, const Above = 1
|
||||
pkg math/big, const Above Accuracy
|
||||
pkg math/big, const AwayFromZero = 3
|
||||
pkg math/big, const AwayFromZero RoundingMode
|
||||
pkg math/big, const Below = -1
|
||||
pkg math/big, const Below Accuracy
|
||||
pkg math/big, const Exact = 0
|
||||
pkg math/big, const Exact Accuracy
|
||||
pkg math/big, const MaxExp = 2147483647
|
||||
pkg math/big, const MaxExp ideal-int
|
||||
pkg math/big, const MaxPrec = 4294967295
|
||||
pkg math/big, const MaxPrec ideal-int
|
||||
pkg math/big, const MinExp = -2147483648
|
||||
pkg math/big, const MinExp ideal-int
|
||||
pkg math/big, const ToNearestAway = 1
|
||||
pkg math/big, const ToNearestAway RoundingMode
|
||||
pkg math/big, const ToNearestEven = 0
|
||||
pkg math/big, const ToNearestEven RoundingMode
|
||||
pkg math/big, const ToNegativeInf = 4
|
||||
pkg math/big, const ToNegativeInf RoundingMode
|
||||
pkg math/big, const ToPositiveInf = 5
|
||||
pkg math/big, const ToPositiveInf RoundingMode
|
||||
pkg math/big, const ToZero = 2
|
||||
pkg math/big, const ToZero RoundingMode
|
||||
pkg math/big, func NewFloat(float64) *Float
|
||||
pkg math/big, func ParseFloat(string, int, uint, RoundingMode) (*Float, int, error)
|
||||
pkg math/big, func ScanFloat(io.ByteScanner, int, uint, RoundingMode) (*Float, int, error)
|
||||
pkg math/big, method (*Float) Abs(*Float) *Float
|
||||
pkg math/big, method (*Float) Acc() Accuracy
|
||||
pkg math/big, method (*Float) Add(*Float, *Float) *Float
|
||||
pkg math/big, method (*Float) Append([]uint8, uint8, int) []uint8
|
||||
pkg math/big, method (*Float) Cmp(*Float) int
|
||||
pkg math/big, method (*Float) Copy(*Float) *Float
|
||||
pkg math/big, method (*Float) Float32() (float32, Accuracy)
|
||||
pkg math/big, method (*Float) Float64() (float64, Accuracy)
|
||||
pkg math/big, method (*Float) Format(uint8, int) string
|
||||
pkg math/big, method (*Float) Int(*Int) (*Int, Accuracy)
|
||||
pkg math/big, method (*Float) Int64() (int64, Accuracy)
|
||||
pkg math/big, method (*Float) IsInf() bool
|
||||
pkg math/big, method (*Float) IsInt() bool
|
||||
pkg math/big, method (*Float) MantExp(*Float) int
|
||||
pkg math/big, method (*Float) MinPrec() uint
|
||||
pkg math/big, method (*Float) Mode() RoundingMode
|
||||
pkg math/big, method (*Float) Mul(*Float, *Float) *Float
|
||||
pkg math/big, method (*Float) Neg(*Float) *Float
|
||||
pkg math/big, method (*Float) Parse(string, int) (*Float, int, error)
|
||||
pkg math/big, method (*Float) Prec() uint
|
||||
pkg math/big, method (*Float) Quo(*Float, *Float) *Float
|
||||
pkg math/big, method (*Float) Rat(*Rat) (*Rat, Accuracy)
|
||||
pkg math/big, method (*Float) Scan(io.ByteScanner, int) (*Float, int, error)
|
||||
pkg math/big, method (*Float) Set(*Float) *Float
|
||||
pkg math/big, method (*Float) SetFloat64(float64) *Float
|
||||
pkg math/big, method (*Float) SetInf(bool) *Float
|
||||
pkg math/big, method (*Float) SetInt(*Int) *Float
|
||||
pkg math/big, method (*Float) SetInt64(int64) *Float
|
||||
pkg math/big, method (*Float) SetMantExp(*Float, int) *Float
|
||||
pkg math/big, method (*Float) SetMode(RoundingMode) *Float
|
||||
pkg math/big, method (*Float) SetPrec(uint) *Float
|
||||
pkg math/big, method (*Float) SetRat(*Rat) *Float
|
||||
pkg math/big, method (*Float) SetString(string) (*Float, bool)
|
||||
pkg math/big, method (*Float) SetUint64(uint64) *Float
|
||||
pkg math/big, method (*Float) Sign() int
|
||||
pkg math/big, method (*Float) Signbit() bool
|
||||
pkg math/big, method (*Float) String() string
|
||||
pkg math/big, method (*Float) Sub(*Float, *Float) *Float
|
||||
pkg math/big, method (*Float) Uint64() (uint64, Accuracy)
|
||||
pkg math/big, method (Accuracy) String() string
|
||||
pkg math/big, method (ErrNaN) Error() string
|
||||
pkg math/big, method (RoundingMode) String() string
|
||||
pkg math/big, type Accuracy int8
|
||||
pkg math/big, type ErrNaN struct
|
||||
pkg math/big, type Float struct
|
||||
pkg math/big, type RoundingMode uint8
|
||||
pkg mime, func ExtensionsByType(string) ([]string, error)
|
||||
pkg mime/quotedprintable, func NewReader(io.Reader) io.Reader
|
||||
pkg mime/quotedprintable, func NewWriter(io.Writer) *Writer
|
||||
pkg mime/quotedprintable, method (*Writer) Close() error
|
||||
pkg mime/quotedprintable, method (*Writer) Write([]uint8) (int, error)
|
||||
pkg mime/quotedprintable, type Writer struct
|
||||
pkg mime/quotedprintable, type Writer struct, Binary bool
|
||||
pkg net/http/fcgi, var ErrConnClosed error
|
||||
pkg net/http/fcgi, var ErrRequestAborted error
|
||||
pkg net/http/pprof, func Trace(http.ResponseWriter, *http.Request)
|
||||
pkg net/smtp, method (*Client) TLSConnectionState() (tls.ConnectionState, bool)
|
||||
pkg os/signal, func Ignore(...os.Signal)
|
||||
pkg os/signal, func Reset(...os.Signal)
|
||||
pkg runtime, func ReadTrace() []uint8
|
||||
pkg runtime, func StartTrace() error
|
||||
pkg runtime, func StopTrace()
|
||||
pkg runtime/pprof, func StartTrace(io.Writer) error
|
||||
pkg runtime/pprof, func StopTrace()
|
||||
pkg strings, func Compare(string, string) int
|
||||
pkg strings, method (*Reader) Size() int64
|
||||
pkg syscall (darwin-386), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (darwin-386), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (darwin-386), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (darwin-386-cgo), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (darwin-386-cgo), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (darwin-386-cgo), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (darwin-amd64), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (darwin-amd64), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (darwin-amd64), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (darwin-amd64-cgo), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (darwin-amd64-cgo), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (darwin-amd64-cgo), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (freebsd-386), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (freebsd-386), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (freebsd-386), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (freebsd-386-cgo), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (freebsd-386-cgo), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (freebsd-386-cgo), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (freebsd-amd64), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (freebsd-amd64), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (freebsd-amd64), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (freebsd-amd64-cgo), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (freebsd-amd64-cgo), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (freebsd-amd64-cgo), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (freebsd-arm), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (freebsd-arm), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (freebsd-arm), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (freebsd-arm-cgo), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (freebsd-arm-cgo), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (freebsd-arm-cgo), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (linux-386), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (linux-386), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (linux-386-cgo), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (linux-386-cgo), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (linux-amd64), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (linux-amd64), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (linux-amd64-cgo), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (linux-amd64-cgo), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (linux-arm), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (linux-arm), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (linux-arm-cgo), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (linux-arm-cgo), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (netbsd-386), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (netbsd-386), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (netbsd-386), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (netbsd-386-cgo), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (netbsd-386-cgo), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (netbsd-386-cgo), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (netbsd-amd64), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (netbsd-amd64), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (netbsd-amd64), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (netbsd-amd64-cgo), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (netbsd-amd64-cgo), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (netbsd-amd64-cgo), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (netbsd-arm), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (netbsd-arm), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (netbsd-arm), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (netbsd-arm-cgo), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (netbsd-arm-cgo), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (netbsd-arm-cgo), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (openbsd-386), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (openbsd-386), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (openbsd-386), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (openbsd-386-cgo), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (openbsd-386-cgo), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (openbsd-386-cgo), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (openbsd-amd64), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (openbsd-amd64), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (openbsd-amd64), type SysProcAttr struct, Pgid int
|
||||
pkg syscall (openbsd-amd64-cgo), type SysProcAttr struct, Ctty int
|
||||
pkg syscall (openbsd-amd64-cgo), type SysProcAttr struct, Foreground bool
|
||||
pkg syscall (openbsd-amd64-cgo), type SysProcAttr struct, Pgid int
|
||||
pkg text/template, method (*Template) DefinedTemplates() string
|
||||
pkg text/template, method (*Template) Option(...string) *Template
|
||||
pkg time, method (Time) AppendFormat([]uint8, string) []uint8
|
||||
|
|
|
|||
|
|
@ -250,11 +250,16 @@ projects at once within a single <code>$GOPATH</code> root directory.</p>
|
|||
<h2>Limitations</h2>
|
||||
|
||||
<p>As mentioned above, the go command is not a general-purpose build
|
||||
tool. In particular, it does not have any facility for generating Go
|
||||
source files during a build. Instead, if you want to use a tool like
|
||||
yacc or the protocol buffer compiler, you will need to write a
|
||||
tool.
|
||||
In particular, it does not have any facility for generating Go
|
||||
source files <em>during</em> a build, although it does provide
|
||||
<a href="/cmd/go/#hdr-Generate_Go_files_by_processing_source"><code>go</code>
|
||||
<code>generate</code></a>,
|
||||
which can automate the creation of Go files <em>before</em>
|
||||
the build, such as by running <code>yacc</code>.
|
||||
For more advanced build setups, you may need to write a
|
||||
makefile (or a configuration file for the build tool of your choice)
|
||||
to generate the Go files and then check those generated source files
|
||||
to run whatever tool creates the Go files and then check those generated source files
|
||||
into your repository. This is more work for you, the package author,
|
||||
but it is significantly less work for your users, who can use
|
||||
"<code>go get</code>" without needing to obtain and build
|
||||
|
|
|
|||
|
|
@ -10,7 +10,13 @@ Go 1.4 required to build (https://golang.org/cl/2470, https://golang.org/cl/2993
|
|||
|
||||
New Ports:
|
||||
darwin/arm, a.k.a iOS. (https://golang.org/cl/2118, 2119, 3273, 2121, 2122, ..., 2127)
|
||||
linux/arm64
|
||||
darwin/arm64
|
||||
linux/arm64 (cgo is supported, but only with external linking)
|
||||
openbsd/arm (no cgo or external linking)
|
||||
The port to Snow Leopard (OS X 10.6) is no longer actively maintained.
|
||||
|
||||
Runtime:
|
||||
goroutine scheduling order changed; never guaranteed by language, but can break tests that implicitly assume a specific execution order
|
||||
|
||||
Removed Ports:
|
||||
dragonfly/386 (https://golang.org/cl/7543)
|
||||
|
|
@ -19,37 +25,72 @@ API additions and behavior changes:
|
|||
|
||||
archive/zip: add (*Writer).SetOffset method (https://golang.org/cl/7445)
|
||||
bufio: add Reader.Discard (https://golang.org/cl/2260)
|
||||
bytes: add Buffer.Cap (https://golang.org/cl/8342)
|
||||
bytes, strings: add Reader.Size (https://golang.org/cl/3199)
|
||||
bytes, strings: add LastIndexByte (https://golang.org/cl/9500)
|
||||
crypto/cipher: clarify what will happen if len(src) != len(dst) for the Stream interface. (https://golang.org/cl/1754)
|
||||
crypto/elliptic: add Name field to CurveParams struct (https://golang.org/cl/2133)
|
||||
crypto/elliptic: Unmarshaling points now automatically checks that the point is on the curve (https://golang.org/cl/2421)
|
||||
crypto/tls: change default minimum version to TLS 1.0. (https://golang.org/cl/1791)
|
||||
crypto/tls: including Certificate Transparency SCTs in the handshake is now supported (https://golang.org/cl/8988)
|
||||
crypto/tls: session ticket keys can now be rotated at runtime (https://golang.org/cl/9072)
|
||||
crypto/tls: servers will now always call GetCertificate to pick a certificate for a connection when Certificates is empty (https://golang.org/cl/8792)
|
||||
crypto/x509: wildcards are now only accepted as the first label (https://golang.org/cl/5691)
|
||||
crypto/x509: unknown critical extensions now cause errors in Verify, not when parsing (https://golang.org/cl/9390)
|
||||
database/sql: add Stats (https://golang.org/cl/7950)
|
||||
encoding/base64: add unpadded encodings (https://golang.org/cl/1511)
|
||||
flag: new nicer format for PrintDefaults (https://go-review.googlesource.com/7330)
|
||||
flag: new nicer format for PrintDefaults (https://golang.org/cl/7330)
|
||||
fmt: empty slices now print nothing with %x (bug fix) (https://golang.org/cl/8864)
|
||||
fmt: reflect.Value now prints what it holds (https://golang.org/cl/8731)
|
||||
go/ast: add Implicit field to ast.EmptyStmt; changed meaning of ast.EmptyStmt.Semicolon position (https://golang.org/cl/5720)
|
||||
go/build: reserved GOARCHes for common architectures (https://golang.org/cl/9644)
|
||||
io: add CopyBuffer, Copy with user-provided buffer (https://golang.org/cl/8730)
|
||||
log: add SetOutput functions (https://golang.org/cl/2686, https://golang.org/cl/3023)
|
||||
log: add LUTC flag (https://golang.org/cl/8761)
|
||||
math/big: add arbitrary precision Floats (many cl's)
|
||||
math/big: add Jacobi and Int.ModSqrt (https://golang.org/cl/1886)
|
||||
mime: add ExtensionByType (https://golang.org/cl/7444)
|
||||
mime/quotedprintable: new package (https://golang.org/cl/5940 + others)
|
||||
net: add Source field to OpError (https://go-review.googlesource.com/9231)
|
||||
net: fix inconsistent errors (https://golang.org/cl/9236)
|
||||
net/http: support for setting trailers from a server Handler (https://golang.org/cl/2157)
|
||||
net/http: ignore the Unix epoch time in ServeContent (https://golang.org/cl/7915)
|
||||
net/http/cgi: fix REMOTE_ADDR, REMOTE_HOST, add REMOTE_PORT (https://golang.org/cl/4933)
|
||||
net/smtp: add TLSConnectionState accessor (https://golang.org/cl/2151)
|
||||
os: add LookupEnv (https://golang.org/cl/9791)
|
||||
os/signal: add Ignore and Reset (https://golang.org/cl/3580)
|
||||
reflect: add ArrayOf (https://golang.org/cl/4111)
|
||||
reflect: add FuncOf (https://golang.org/cl/1996)
|
||||
runtime, syscall: use SYSCALL instruction on FreeBSD (Go 1.5 now requires FreeBSD 8-STABLE+) (https://golang.org/cl/3020)
|
||||
runtime, syscall: use get_random_bytes syscall for NaCl (Go 1.5 now requires NaCl SDK pepper-39 or above) (https://golang.org/cl/1755)
|
||||
strings: add Compare(x, y string) int, for symmetry with bytes.Compare (https://golang.org/cl/2828)
|
||||
syscall: Add Foreground and Pgid to SysProcAttr (https://golang.org/cl/5130)
|
||||
syscall: add missing Syscall9 for darwin/amd64 (https://golang.org/cl/6555)
|
||||
testing/quick: support generation of arrays (https://golang.org/cl/3865)
|
||||
text/template: add Options method (https://golang.org/cl/8462)
|
||||
text/template: huge integers are now parse errors (https://golang.org/cl/9651)
|
||||
time: add time.AppendFormat(https://golang.org/cl/1760)
|
||||
|
||||
Tools:
|
||||
|
||||
build: external linking support for windows (https://golang.org/cl/7163, 7282, 7283, 7284, 7534, 7535)
|
||||
cmd/cover: tool now lives in the standard repository (https://golang.org/cl/9560)
|
||||
cmd/gc: constant arithmetic is based on math/big (https://golang.org/cl/7830, 7851, 7857, 8426, 7858, 7912, 8171)
|
||||
cmd/go, go/build: add ${SRCDIR} variable expansion to cgo lines (https://golang.org/cl/1756)
|
||||
cmd/go: add $DOLLAR to generate's variables (https://golang.org/cl/8091)
|
||||
cmd/go: std wildcard now excludes commands in main repo (https://golang.org/cl/5550)
|
||||
cmd/go: .swig/.swigcxx files now require SWIG 3.0.6 or later
|
||||
cmd/go: add -run flag to go generate (https://golang.org/cl/9005)
|
||||
cmd/go: add $GOLINE to generate's variables (https://golang.org/cl/9007)
|
||||
cmd/go: add go doc (https://golang.org/cl/9227)
|
||||
cmd/vet: better validation of struct tags (https://golang.org/cl/2685)
|
||||
cmd/ld: no longer record build timestamp in Windows PE file header (https://golang.org/cl/3740)
|
||||
cmd/go: add -toolexec build option
|
||||
cmd/go: drop -ccflags build option
|
||||
cmd/go: add -asmflags build option
|
||||
cmd/go: add -buildmode build option
|
||||
cmd/gc: add -dynlink option (for amd64 only)
|
||||
cmd/ld: add -buildmode option
|
||||
cmd/trace: new command to view traces (https://golang.org/cl/3601)
|
||||
|
||||
Performance:
|
||||
|
|
@ -75,6 +116,10 @@ regexp: port RE2's bitstate backtracker to the regexp package (https://golang.or
|
|||
|
||||
Assembler:
|
||||
|
||||
New cmd/asm tool (now use go tool asm, not go tool 6a)
|
||||
|
||||
Assembler now supports -dynlink option.
|
||||
|
||||
ARM assembly syntax has had some features removed.
|
||||
|
||||
- mentioning SP or PC as a hardware register
|
||||
|
|
|
|||
|
|
@ -1046,7 +1046,7 @@ unexpected ways, the simplest solution is to copy it to your local repository.
|
|||
(This is the approach Google takes internally.)
|
||||
Store the copy under a new import path that identifies it as a local copy.
|
||||
For example, you might copy "original.com/pkg" to "you.com/external/original.com/pkg".
|
||||
Keith Rarick's <a href="https://github.com/kr/goven">goven</a> is one tool to help automate this process.
|
||||
<a href="https://godoc.org/golang.org/x/tools/cmd/gomvpkg">gomvpkg</a> is one tool to help automate this process.
|
||||
</p>
|
||||
|
||||
<h2 id="Pointers">Pointers and Allocation</h2>
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
// skip
|
||||
|
||||
// Copyright 2012 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 rand
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
// skip
|
||||
|
||||
// Copyright 2012 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 rand2
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
// skip
|
||||
|
||||
// Copyright 2012 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 print
|
||||
|
||||
// #include <stdio.h>
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
// skip
|
||||
|
||||
// Copyright 2012 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 print
|
||||
|
||||
// #include <stdio.h>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
// cmpout
|
||||
|
||||
// Copyright 2011 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.
|
||||
|
|
|
|||
|
|
@ -1,3 +0,0 @@
|
|||
0
|
||||
3210
|
||||
2
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
// cmpout
|
||||
|
||||
// Copyright 2011 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.
|
||||
|
|
|
|||
|
|
@ -1,12 +0,0 @@
|
|||
Calling g.
|
||||
Printing in g 0
|
||||
Printing in g 1
|
||||
Printing in g 2
|
||||
Printing in g 3
|
||||
Panicking!
|
||||
Defer in g 3
|
||||
Defer in g 2
|
||||
Defer in g 1
|
||||
Defer in g 0
|
||||
Recovered in f 4
|
||||
Returned normally from f.
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
// cmpout
|
||||
|
||||
// Copyright 2009 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.
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
1.00YB 9.09TB
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
// compile
|
||||
|
||||
// Copyright 2009 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.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
// cmpout
|
||||
|
||||
// Copyright 2009 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.
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
[-1 2 6 16 44]
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
// skip
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
// compile
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
// compile
|
||||
|
||||
// Copyright 2011 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.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
// compile
|
||||
|
||||
// Copyright 2011 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.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
// compile
|
||||
|
||||
// Copyright 2011 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.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
// compile
|
||||
|
||||
// Copyright 2011 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.
|
||||
|
|
|
|||
|
|
@ -1,6 +1,3 @@
|
|||
// compile
|
||||
// this file will output a list of filenames in cwd, not suitable for cmpout
|
||||
|
||||
// Copyright 2011 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.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
// compile
|
||||
|
||||
// Copyright 2011 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.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
// compile
|
||||
|
||||
// Copyright 2011 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.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
// compile
|
||||
|
||||
// Copyright 2012 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.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
// cmpout
|
||||
|
||||
// Copyright 2012 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.
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
X is 2 Y is 1
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
// cmpout
|
||||
|
||||
// Copyright 2012 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.
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
3 4 false
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
// cmpout
|
||||
|
||||
// Copyright 2012 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.
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
3 4 true
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
// cmpout
|
||||
|
||||
// Copyright 2012 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.
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
image.Point{X:2, Y:1}
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
// cmpout
|
||||
|
||||
// Copyright 2012 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.
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
{255 0 0 255}
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
// cmpout
|
||||
|
||||
// Copyright 2012 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.
|
||||
|
|
|
|||
|
|
@ -1,2 +0,0 @@
|
|||
8 4
|
||||
true
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
// compile
|
||||
|
||||
// Copyright 2012 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.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
// cmpout
|
||||
|
||||
// Copyright 2012 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.
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
type: float64
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
// run
|
||||
|
||||
// Copyright 2012 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.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
// cmpout
|
||||
|
||||
// Copyright 2012 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.
|
||||
|
|
|
|||
|
|
@ -1,2 +0,0 @@
|
|||
the circle's area 24.227111172875365
|
||||
the reciprocal of i is 0.3601008282319049
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
// compile
|
||||
|
||||
// Copyright 2012 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.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
// run
|
||||
|
||||
// Copyright 2012 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.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
// compile
|
||||
|
||||
// Copyright 2012 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.
|
||||
|
|
|
|||
125
doc/progs/run
125
doc/progs/run
|
|
@ -1,125 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
# Copyright 2009 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.
|
||||
|
||||
set -e
|
||||
|
||||
goos=$(go env GOOS)
|
||||
|
||||
defer_panic_recover="
|
||||
defer
|
||||
defer2
|
||||
"
|
||||
|
||||
effective_go="
|
||||
eff_bytesize
|
||||
eff_qr
|
||||
eff_sequence
|
||||
eff_unused2
|
||||
"
|
||||
|
||||
error_handling="
|
||||
error
|
||||
error2
|
||||
error3
|
||||
error4
|
||||
"
|
||||
|
||||
law_of_reflection="
|
||||
interface
|
||||
interface2
|
||||
"
|
||||
|
||||
c_go_cgo="
|
||||
cgo1
|
||||
cgo2
|
||||
cgo3
|
||||
cgo4
|
||||
"
|
||||
# cgo1 and cgo2 don't run on freebsd, srandom has a different signature
|
||||
if [ "$goos" == "freebsd" ]; then
|
||||
c_go_cgo="cgo3 cgo4"
|
||||
fi
|
||||
# cgo1 and cgo2 don't run on netbsd, srandom has a different signature
|
||||
# cgo3 and cgo4 don't run on netbsd, since cgo cannot handle stdout correctly
|
||||
if [ "$goos" == "netbsd" ]; then
|
||||
c_go_cgo=""
|
||||
fi
|
||||
# cgo3 and cgo4 don't run on openbsd, since cgo cannot handle stdout correctly
|
||||
if [ "$goos" == "openbsd" ]; then
|
||||
c_go_cgo="cgo1 cgo2"
|
||||
fi
|
||||
if [ "$CGO_ENABLED" != 1 ]; then
|
||||
c_go_cgo=""
|
||||
fi
|
||||
|
||||
timeout="
|
||||
timeout1
|
||||
timeout2
|
||||
"
|
||||
|
||||
gobs="
|
||||
gobs1
|
||||
gobs2
|
||||
"
|
||||
|
||||
json="
|
||||
json1
|
||||
json2
|
||||
json3
|
||||
json4
|
||||
json5
|
||||
"
|
||||
|
||||
image_package="
|
||||
image_package1
|
||||
image_package2
|
||||
image_package3
|
||||
image_package4
|
||||
image_package5
|
||||
image_package6
|
||||
"
|
||||
|
||||
all=$(echo $defer_panic_recover $effective_go $error_handling $law_of_reflection $c_go_cgo $timeout $gobs $json $image_package slices go1)
|
||||
|
||||
for i in $all; do
|
||||
go build $i.go
|
||||
done
|
||||
|
||||
# Write to temporary file to avoid mingw bash bug.
|
||||
TMPFILE="${TMPDIR:-/tmp}/gotest3.$USER"
|
||||
|
||||
function testit {
|
||||
./$1 >"$TMPFILE" 2>&1 || true
|
||||
x=$(echo $(cat "$TMPFILE")) # extra echo canonicalizes
|
||||
if ! echo "$x" | grep "$2" > /dev/null
|
||||
then
|
||||
echo $1 failed: '"'$x'"' is not '"'$2'"'
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
testit defer '^0 3210 2$'
|
||||
testit defer2 '^Calling g. Printing in g 0 Printing in g 1 Printing in g 2 Printing in g 3 Panicking! Defer in g 3 Defer in g 2 Defer in g 1 Defer in g 0 Recovered in f 4 Returned normally from f.$'
|
||||
|
||||
testit eff_bytesize '^1.00YB 9.09TB$'
|
||||
testit eff_sequence '^\[-1 2 6 16 44\]$'
|
||||
|
||||
testit go1 '^Christmas is a holiday: true Sleeping for 0.123s.*go1.go already exists$'
|
||||
|
||||
testit interface2 "^type: float64$"
|
||||
|
||||
testit json1 "^$"
|
||||
testit json2 "the reciprocal of i is"
|
||||
testit json3 "Age is int 6"
|
||||
testit json4 "^$"
|
||||
|
||||
testit image_package1 "^X is 2 Y is 1$"
|
||||
testit image_package2 "^3 4 false$"
|
||||
testit image_package3 "^3 4 true$"
|
||||
testit image_package4 "^image.Point{X:2, Y:1}$"
|
||||
testit image_package5 "^{255 0 0 255}$"
|
||||
testit image_package6 "^8 4 true$"
|
||||
|
||||
rm -f $all "$TMPFILE"
|
||||
|
|
@ -0,0 +1,230 @@
|
|||
// Copyright 2015 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.
|
||||
|
||||
// run runs the docs tests found in this directory.
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"runtime"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const usage = `go run run.go [tests]
|
||||
|
||||
run.go runs the docs tests in this directory.
|
||||
If no tests are provided, it runs all tests.
|
||||
Tests may be specified without their .go suffix.
|
||||
`
|
||||
|
||||
func main() {
|
||||
flag.Usage = func() {
|
||||
fmt.Fprintf(os.Stderr, usage)
|
||||
flag.PrintDefaults()
|
||||
os.Exit(2)
|
||||
}
|
||||
|
||||
flag.Parse()
|
||||
if flag.NArg() == 0 {
|
||||
// run all tests
|
||||
fixcgo()
|
||||
} else {
|
||||
// run specified tests
|
||||
onlyTest(flag.Args()...)
|
||||
}
|
||||
|
||||
tmpdir, err := ioutil.TempDir("", "go-progs")
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// ratec limits the number of tests running concurrently.
|
||||
// None of the tests are intensive, so don't bother
|
||||
// trying to manually adjust for slow builders.
|
||||
ratec := make(chan bool, runtime.NumCPU())
|
||||
errc := make(chan error, len(tests))
|
||||
|
||||
for _, tt := range tests {
|
||||
tt := tt
|
||||
ratec <- true
|
||||
go func() {
|
||||
errc <- test(tmpdir, tt.file, tt.want)
|
||||
<-ratec
|
||||
}()
|
||||
}
|
||||
|
||||
var rc int
|
||||
for range tests {
|
||||
if err := <-errc; err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
rc = 1
|
||||
}
|
||||
}
|
||||
os.Remove(tmpdir)
|
||||
os.Exit(rc)
|
||||
}
|
||||
|
||||
// test builds the test in the given file.
|
||||
// If want is non-empty, test also runs the test
|
||||
// and checks that the output matches the regexp want.
|
||||
func test(tmpdir, file, want string) error {
|
||||
// Build the program.
|
||||
prog := filepath.Join(tmpdir, file)
|
||||
cmd := exec.Command("go", "build", "-o", prog, file+".go")
|
||||
out, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
return fmt.Errorf("go build %s.go failed: %v\nOutput:\n%s", file, err, out)
|
||||
}
|
||||
defer os.Remove(prog)
|
||||
|
||||
// Only run the test if we have output to check.
|
||||
if want == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
cmd = exec.Command(prog)
|
||||
out, err = cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
return fmt.Errorf("%s failed: %v\nOutput:\n%s", file, err, out)
|
||||
}
|
||||
|
||||
// Canonicalize output.
|
||||
out = bytes.TrimRight(out, "\n")
|
||||
out = bytes.Replace(out, []byte{'\n'}, []byte{' '}, -1)
|
||||
|
||||
// Check the result.
|
||||
match, err := regexp.Match(want, out)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to parse regexp %q: %v", want, err)
|
||||
}
|
||||
if !match {
|
||||
return fmt.Errorf("%s.go:\n%q\ndoes not match %s", file, out, want)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
type testcase struct {
|
||||
file string
|
||||
want string
|
||||
}
|
||||
|
||||
var tests = []testcase{
|
||||
// defer_panic_recover
|
||||
{"defer", `^0 3210 2$`},
|
||||
{"defer2", `^Calling g. Printing in g 0 Printing in g 1 Printing in g 2 Printing in g 3 Panicking! Defer in g 3 Defer in g 2 Defer in g 1 Defer in g 0 Recovered in f 4 Returned normally from f.$`},
|
||||
|
||||
// effective_go
|
||||
{"eff_bytesize", `^1.00YB 9.09TB$`},
|
||||
{"eff_qr", ""},
|
||||
{"eff_sequence", `^\[-1 2 6 16 44\]$`},
|
||||
{"eff_unused2", ""},
|
||||
|
||||
// error_handling
|
||||
{"error", ""},
|
||||
{"error2", ""},
|
||||
{"error3", ""},
|
||||
{"error4", ""},
|
||||
|
||||
// law_of_reflection
|
||||
{"interface", ""},
|
||||
{"interface2", `^type: float64$`},
|
||||
|
||||
// c_go_cgo
|
||||
{"cgo1", ""},
|
||||
{"cgo2", ""},
|
||||
{"cgo3", ""},
|
||||
{"cgo4", ""},
|
||||
|
||||
// timeout
|
||||
{"timeout1", ""},
|
||||
{"timeout2", ""},
|
||||
|
||||
// gobs
|
||||
{"gobs1", ""},
|
||||
{"gobs2", ""},
|
||||
|
||||
// json
|
||||
{"json1", `^$`},
|
||||
{"json2", `the reciprocal of i is`},
|
||||
{"json3", `Age is int 6`},
|
||||
{"json4", `^$`},
|
||||
{"json5", ""},
|
||||
|
||||
// image_package
|
||||
{"image_package1", `^X is 2 Y is 1$`},
|
||||
{"image_package2", `^3 4 false$`},
|
||||
{"image_package3", `^3 4 true$`},
|
||||
{"image_package4", `^image.Point{X:2, Y:1}$`},
|
||||
{"image_package5", `^{255 0 0 255}$`},
|
||||
{"image_package6", `^8 4 true$`},
|
||||
|
||||
// other
|
||||
{"go1", `^Christmas is a holiday: true .*go1.go already exists$`},
|
||||
{"slices", ""},
|
||||
}
|
||||
|
||||
func onlyTest(files ...string) {
|
||||
var new []testcase
|
||||
NextFile:
|
||||
for _, file := range files {
|
||||
file = strings.TrimSuffix(file, ".go")
|
||||
for _, tt := range tests {
|
||||
if tt.file == file {
|
||||
new = append(new, tt)
|
||||
continue NextFile
|
||||
}
|
||||
}
|
||||
fmt.Fprintf(os.Stderr, "test %s.go not found\n", file)
|
||||
os.Exit(1)
|
||||
}
|
||||
tests = new
|
||||
}
|
||||
|
||||
func skipTest(file string) {
|
||||
for i, tt := range tests {
|
||||
if tt.file == file {
|
||||
copy(tests[i:], tests[i+1:])
|
||||
tests = tests[:len(tests)-1]
|
||||
return
|
||||
}
|
||||
}
|
||||
panic("delete(" + file + "): not found")
|
||||
}
|
||||
|
||||
func fixcgo() {
|
||||
if os.Getenv("CGO_ENABLED") != "1" {
|
||||
skipTest("cgo1")
|
||||
skipTest("cgo2")
|
||||
skipTest("cgo3")
|
||||
skipTest("cgo4")
|
||||
return
|
||||
}
|
||||
|
||||
switch runtime.GOOS {
|
||||
case "freebsd":
|
||||
// cgo1 and cgo2 don't run on freebsd, srandom has a different signature
|
||||
skipTest("cgo1")
|
||||
skipTest("cgo2")
|
||||
case "netbsd":
|
||||
// cgo1 and cgo2 don't run on netbsd, srandom has a different signature
|
||||
skipTest("cgo1")
|
||||
skipTest("cgo2")
|
||||
// cgo3 and cgo4 don't run on netbsd, since cgo cannot handle stdout correctly, see issue #10715.
|
||||
skipTest("cgo3")
|
||||
skipTest("cgo4")
|
||||
case "openbsd", "solaris":
|
||||
// cgo3 and cgo4 don't run on openbsd and solaris, since cgo cannot handle stdout correctly, see issue #10715.
|
||||
skipTest("cgo3")
|
||||
skipTest("cgo4")
|
||||
}
|
||||
}
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
// compile
|
||||
|
||||
// Copyright 2012 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.
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
// compile
|
||||
|
||||
// Copyright 2012 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 timeout
|
||||
|
||||
import (
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
// compile
|
||||
|
||||
// Copyright 2012 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 query
|
||||
|
||||
type Conn string
|
||||
|
|
|
|||
|
|
@ -1,15 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
# Copyright 2012 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.
|
||||
|
||||
set -e
|
||||
|
||||
rm -f *.out *.rej *.orig [568].out
|
||||
|
||||
for i in *.go; do
|
||||
if grep -q '^// cmpout$' $i; then
|
||||
echo $i
|
||||
go run $i &> ${i/.go/.out}
|
||||
fi
|
||||
done
|
||||
|
|
@ -9,7 +9,6 @@ void callback(void *f);
|
|||
void callGoFoo(void);
|
||||
void callGoStackCheck(void);
|
||||
void callPanic(void);
|
||||
void callCgoAllocate(void);
|
||||
int callGoReturnVal(void);
|
||||
int returnAfterGrow(void);
|
||||
int returnAfterGrowFromGo(void);
|
||||
|
|
@ -17,7 +16,6 @@ int returnAfterGrowFromGo(void);
|
|||
import "C"
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path"
|
||||
"runtime"
|
||||
"strings"
|
||||
|
|
@ -211,23 +209,6 @@ func testPanicFromC(t *testing.T) {
|
|||
C.callPanic()
|
||||
}
|
||||
|
||||
func testAllocateFromC(t *testing.T) {
|
||||
if strings.Contains(os.Getenv("GODEBUG"), "wbshadow=") {
|
||||
// This test is writing pointers to Go heap objects from C.
|
||||
// As such, those writes have no write barriers, and
|
||||
// wbshadow=2 mode correctly discovers that and crashes.
|
||||
// Disable test if any wbshadow mode is enabled.
|
||||
// TODO(rsc): I am not sure whether the test is fundamentally
|
||||
// incompatible with concurrent collection and should be
|
||||
// turned off or rewritten entirely. The test is attempting to
|
||||
// mimic some SWIG behavior, so it is important to work
|
||||
// through what we expect before trying SWIG and C++
|
||||
// with the concurrent collector.
|
||||
t.Skip("test is incompatible with wbshadow=")
|
||||
}
|
||||
C.callCgoAllocate() // crashes or exits on failure
|
||||
}
|
||||
|
||||
// Test that C code can return a value if it calls a Go function that
|
||||
// causes a stack copy.
|
||||
func testReturnAfterGrow(t *testing.T) {
|
||||
|
|
|
|||
|
|
@ -23,58 +23,3 @@ callPanic(void)
|
|||
crosscall2(_cgo_panic, &a, sizeof a);
|
||||
*(int*)1 = 1;
|
||||
}
|
||||
|
||||
/* Test calling cgo_allocate from C. This is what SWIG does. */
|
||||
|
||||
typedef struct List List;
|
||||
struct List
|
||||
{
|
||||
List *next;
|
||||
int x;
|
||||
};
|
||||
|
||||
void
|
||||
callCgoAllocate(void)
|
||||
{
|
||||
int i;
|
||||
struct { size_t n; void *ret; } a;
|
||||
List *l, *head, **tail;
|
||||
|
||||
// Make sure this doesn't crash.
|
||||
// And make sure it returns non-nil.
|
||||
a.n = 0;
|
||||
a.ret = 0;
|
||||
crosscall2(_cgo_allocate, &a, sizeof a);
|
||||
if(a.ret == 0) {
|
||||
fprintf(stderr, "callCgoAllocate: alloc 0 returned nil\n");
|
||||
exit(2);
|
||||
}
|
||||
|
||||
head = 0;
|
||||
tail = &head;
|
||||
for(i=0; i<100; i++) {
|
||||
a.n = sizeof *l;
|
||||
crosscall2(_cgo_allocate, &a, sizeof a);
|
||||
l = a.ret;
|
||||
l->x = i;
|
||||
l->next = 0;
|
||||
*tail = l;
|
||||
tail = &l->next;
|
||||
}
|
||||
|
||||
gc();
|
||||
|
||||
l = head;
|
||||
for(i=0; i<100; i++) {
|
||||
if(l->x != i) {
|
||||
fprintf(stderr, "callCgoAllocate: lost memory\n");
|
||||
exit(2);
|
||||
}
|
||||
l = l->next;
|
||||
}
|
||||
if(l != 0) {
|
||||
fprintf(stderr, "callCgoAllocate: lost memory\n");
|
||||
exit(2);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -19,52 +19,3 @@ callPanic(void)
|
|||
{
|
||||
_cgo_panic("panic from C");
|
||||
}
|
||||
|
||||
/* Test calling cgo_allocate from C. This is what SWIG does. */
|
||||
|
||||
typedef struct List List;
|
||||
struct List
|
||||
{
|
||||
List *next;
|
||||
int x;
|
||||
};
|
||||
|
||||
void
|
||||
callCgoAllocate(void)
|
||||
{
|
||||
int i;
|
||||
List *l, *head, **tail;
|
||||
|
||||
// Make sure this doesn't crash.
|
||||
// And make sure it returns non-nil.
|
||||
if(_cgo_allocate(0) == 0) {
|
||||
fprintf(stderr, "callCgoAllocate: alloc 0 returned nil\n");
|
||||
exit(2);
|
||||
}
|
||||
|
||||
head = 0;
|
||||
tail = &head;
|
||||
for(i=0; i<100; i++) {
|
||||
l = _cgo_allocate(sizeof *l);
|
||||
l->x = i;
|
||||
l->next = 0;
|
||||
*tail = l;
|
||||
tail = &l->next;
|
||||
}
|
||||
|
||||
gc();
|
||||
|
||||
l = head;
|
||||
for(i=0; i<100; i++) {
|
||||
if(l->x != i) {
|
||||
fprintf(stderr, "callCgoAllocate: lost memory\n");
|
||||
exit(2);
|
||||
}
|
||||
l = l->next;
|
||||
}
|
||||
if(l != 0) {
|
||||
fprintf(stderr, "callCgoAllocate: lost memory\n");
|
||||
exit(2);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@ func TestCallbackPanic(t *testing.T) { testCallbackPanic(t) }
|
|||
func TestCallbackPanicLoop(t *testing.T) { testCallbackPanicLoop(t) }
|
||||
func TestCallbackPanicLocked(t *testing.T) { testCallbackPanicLocked(t) }
|
||||
func TestPanicFromC(t *testing.T) { testPanicFromC(t) }
|
||||
func TestAllocateFromC(t *testing.T) { testAllocateFromC(t) }
|
||||
func TestZeroArgCallback(t *testing.T) { testZeroArgCallback(t) }
|
||||
func TestBlocking(t *testing.T) { testBlocking(t) }
|
||||
func Test1328(t *testing.T) { test1328(t) }
|
||||
|
|
|
|||
|
|
@ -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 darwin dragonfly freebsd linux netbsd openbsd
|
||||
// +build darwin dragonfly freebsd linux netbsd openbsd solaris
|
||||
|
||||
#include <pthread.h>
|
||||
#include "_cgo_export.h"
|
||||
|
|
|
|||
|
|
@ -13,6 +13,12 @@ int vabs(int x) {
|
|||
puts("testLibgcc is disabled on ARM because 5l cannot handle thumb library.");
|
||||
return (x < 0) ? -x : x;
|
||||
}
|
||||
#elif defined(__arm64__) && defined(__clang__)
|
||||
#include <stdio.h>
|
||||
int vabs(int x) {
|
||||
puts("testLibgcc is disabled on ARM64 with clang due to lack of libgcc.");
|
||||
return (x < 0) ? -x : x;
|
||||
}
|
||||
#else
|
||||
int __absvsi2(int); // dummy prototype for libgcc function
|
||||
// we shouldn't name the function abs, as gcc might use
|
||||
|
|
|
|||
|
|
@ -1,3 +1,9 @@
|
|||
// Copyright 2014 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.
|
||||
|
||||
// +build !gccgo
|
||||
|
||||
#include "textflag.h"
|
||||
|
||||
TEXT ·RewindAndSetgid(SB),NOSPLIT,$0-0
|
||||
|
|
|
|||
|
|
@ -1,4 +1,9 @@
|
|||
// Copyright 2014 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.
|
||||
|
||||
// +build amd64 amd64p32
|
||||
// +build !gccgo
|
||||
|
||||
#include "textflag.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,9 @@
|
|||
// Copyright 2014 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.
|
||||
|
||||
// +build !gccgo
|
||||
|
||||
#include "textflag.h"
|
||||
|
||||
TEXT cas<>(SB),NOSPLIT,$0
|
||||
|
|
|
|||
|
|
@ -0,0 +1,39 @@
|
|||
// Copyright 2014 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.
|
||||
|
||||
// +build !gccgo
|
||||
|
||||
#include "textflag.h"
|
||||
|
||||
TEXT ·RewindAndSetgid(SB),NOSPLIT,$-8-0
|
||||
// Save link register
|
||||
MOVD R30, R9
|
||||
|
||||
// Rewind stack pointer so anything that happens on the stack
|
||||
// will clobber the test pattern created by the caller
|
||||
ADD $(1024 * 8), RSP
|
||||
|
||||
// Ask signaller to setgid
|
||||
MOVD $·Baton(SB), R0
|
||||
MOVD $1, R1
|
||||
storeloop:
|
||||
LDAXRW (R0), R2
|
||||
STLXRW R1, (R0), R3
|
||||
CBNZ R3, storeloop
|
||||
|
||||
// Wait for setgid completion
|
||||
MOVW $0, R1
|
||||
MOVW $0, R2
|
||||
loop:
|
||||
LDAXRW (R0), R3
|
||||
CMPW R1, R3
|
||||
BNE loop
|
||||
STLXRW R2, (R0), R3
|
||||
CBNZ R3, loop
|
||||
|
||||
// Restore stack
|
||||
SUB $(1024 * 8), RSP
|
||||
|
||||
MOVD R9, R30
|
||||
RET
|
||||
|
|
@ -1,4 +1,9 @@
|
|||
// Copyright 2014 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.
|
||||
|
||||
// +build ppc64 ppc64le
|
||||
// +build !gccgo
|
||||
|
||||
#include "textflag.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,24 @@
|
|||
// Copyright 2014 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.
|
||||
|
||||
// +build gccgo
|
||||
|
||||
package issue9400
|
||||
|
||||
import (
|
||||
"runtime"
|
||||
"sync/atomic"
|
||||
)
|
||||
|
||||
// The test for the gc compiler resets the stack pointer so that the
|
||||
// stack gets modified. We don't have a way to do that for gccgo
|
||||
// without writing more assembly code, which we haven't bothered to
|
||||
// do. So this is not much of a test.
|
||||
|
||||
func RewindAndSetgid() {
|
||||
atomic.StoreInt32(&Baton, 1)
|
||||
for atomic.LoadInt32(&Baton) != 0 {
|
||||
runtime.Gosched()
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
// Copyright 2015 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.
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "p.h"
|
||||
#include "libgo.h"
|
||||
|
||||
int main(void) {
|
||||
int32_t res;
|
||||
|
||||
if (!DidInitRun()) {
|
||||
fprintf(stderr, "ERROR: buildmode=c-archive init should run\n");
|
||||
return 2;
|
||||
}
|
||||
|
||||
if (DidMainRun()) {
|
||||
fprintf(stderr, "ERROR: buildmode=c-archive should not run main\n");
|
||||
return 2;
|
||||
}
|
||||
|
||||
res = FromPkg();
|
||||
if (res != 1024) {
|
||||
fprintf(stderr, "ERROR: FromPkg()=%d, want 1024\n", res);
|
||||
return 2;
|
||||
}
|
||||
|
||||
CheckArgs();
|
||||
|
||||
fprintf(stderr, "PASS\n");
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
// Copyright 2015 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 main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
_ "p"
|
||||
)
|
||||
|
||||
import "C"
|
||||
|
||||
var initCh = make(chan int, 1)
|
||||
var ranMain bool
|
||||
|
||||
func init() {
|
||||
// emulate an exceedingly slow package initialization function
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
initCh <- 42
|
||||
}
|
||||
|
||||
func main() { ranMain = true }
|
||||
|
||||
//export DidInitRun
|
||||
func DidInitRun() bool {
|
||||
select {
|
||||
case x := <-initCh:
|
||||
if x != 42 {
|
||||
// Just in case initCh was not correctly made.
|
||||
println("want init value of 42, got: ", x)
|
||||
syscall.Exit(2)
|
||||
}
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
//export DidMainRun
|
||||
func DidMainRun() bool { return ranMain }
|
||||
|
||||
//export CheckArgs
|
||||
func CheckArgs() {
|
||||
if len(os.Args) != 3 || os.Args[1] != "arg1" || os.Args[2] != "arg2" {
|
||||
fmt.Printf("CheckArgs: want [_, arg1, arg2], got: %v\n", os.Args)
|
||||
os.Exit(2)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
// Copyright 2015 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 p
|
||||
|
||||
import "C"
|
||||
|
||||
//export FromPkg
|
||||
func FromPkg() int32 { return 1024 }
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
#!/usr/bin/env bash
|
||||
# Copyright 2015 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.
|
||||
|
||||
set -e
|
||||
|
||||
ccargs=
|
||||
if [ "$(go env GOOS)" == "darwin" ]; then
|
||||
ccargs="-Wl,-no_pie"
|
||||
# For darwin/arm.
|
||||
# TODO(crawshaw): Can we do better?
|
||||
ccargs="$ccargs -framework CoreFoundation -framework Foundation"
|
||||
fi
|
||||
ccargs="$ccargs -I pkg/$(go env GOOS)_$(go env GOARCH)"
|
||||
|
||||
# TODO(crawshaw): Consider a go env for exec script name.
|
||||
bin=./testp
|
||||
exec_script=go_$(go env GOOS)_$(go env GOARCH)_exec
|
||||
if [ "$(which $exec_script)" != "" ]; then
|
||||
bin="$exec_script ./testp"
|
||||
fi
|
||||
|
||||
rm -rf libgo.a libgo.h testp pkg
|
||||
|
||||
# Installing first will create the header files we want.
|
||||
|
||||
GOPATH=$(pwd) go install -buildmode=c-archive libgo
|
||||
$(go env CC) $(go env GOGCCFLAGS) $ccargs -o testp main.c pkg/$(go env GOOS)_$(go env GOARCH)/libgo.a
|
||||
$bin arg1 arg2
|
||||
rm -f libgo.a libgo.h testp
|
||||
|
||||
# Test building libgo other than installing it.
|
||||
# Header files are now present.
|
||||
|
||||
GOPATH=$(pwd) go build -buildmode=c-archive src/libgo/libgo.go
|
||||
$(go env CC) $(go env GOGCCFLAGS) $ccargs -o testp main.c libgo.a
|
||||
$bin arg1 arg2
|
||||
rm -f libgo.a libgo.h testp
|
||||
|
||||
GOPATH=$(pwd) go build -buildmode=c-archive -o libgo.a libgo
|
||||
$(go env CC) $(go env GOGCCFLAGS) $ccargs -o testp main.c libgo.a
|
||||
$bin arg1 arg2
|
||||
rm -rf libgo.a libgo.h testp pkg
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
// Copyright 2015 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.
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "p.h"
|
||||
#include "libgo.h"
|
||||
|
||||
// Tests libgo.so to export the following functions.
|
||||
// int8_t DidInitRun();
|
||||
// int8_t DidMainRun();
|
||||
// int32_t FromPkg();
|
||||
int main(void) {
|
||||
int8_t ran_init = DidInitRun();
|
||||
if (!ran_init) {
|
||||
fprintf(stderr, "ERROR: DidInitRun returned unexpected results: %d\n",
|
||||
ran_init);
|
||||
return 1;
|
||||
}
|
||||
int8_t ran_main = DidMainRun();
|
||||
if (ran_main) {
|
||||
fprintf(stderr, "ERROR: DidMainRun returned unexpected results: %d\n",
|
||||
ran_main);
|
||||
return 1;
|
||||
}
|
||||
int32_t from_pkg = FromPkg();
|
||||
if (from_pkg != 1024) {
|
||||
fprintf(stderr, "ERROR: FromPkg=%d, want %d\n", from_pkg, 1024);
|
||||
return 1;
|
||||
}
|
||||
// test.bash looks for "PASS" to ensure this program has reached the end.
|
||||
printf("PASS\n");
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
// Copyright 2015 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.
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
int check_int8(void* handle, const char* fname, int8_t want) {
|
||||
int8_t (*fn)();
|
||||
fn = (int8_t (*)())dlsym(handle, fname);
|
||||
if (!fn) {
|
||||
fprintf(stderr, "ERROR: missing %s: %s\n", fname, dlerror());
|
||||
return 1;
|
||||
}
|
||||
signed char ret = fn();
|
||||
if (ret != want) {
|
||||
fprintf(stderr, "ERROR: %s=%d, want %d\n", fname, ret, want);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int check_int32(void* handle, const char* fname, int32_t want) {
|
||||
int32_t (*fn)();
|
||||
fn = (int32_t (*)())dlsym(handle, fname);
|
||||
if (!fn) {
|
||||
fprintf(stderr, "ERROR: missing %s: %s\n", fname, dlerror());
|
||||
return 1;
|
||||
}
|
||||
int32_t ret = fn();
|
||||
if (ret != want) {
|
||||
fprintf(stderr, "ERROR: %s=%d, want %d\n", fname, ret, want);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Tests libgo.so to export the following functions.
|
||||
// int8_t DidInitRun() // returns true
|
||||
// int8_t DidMainRun() // returns true
|
||||
// int32_t FromPkg() // returns 1024
|
||||
int main(int argc, char** argv) {
|
||||
void* handle = dlopen(argv[1], RTLD_LAZY | RTLD_GLOBAL);
|
||||
if (!handle) {
|
||||
fprintf(stderr, "ERROR: failed to open the shared library: %s\n",
|
||||
dlerror());
|
||||
return 2;
|
||||
}
|
||||
|
||||
int ret = 0;
|
||||
ret = check_int8(handle, "DidInitRun", 1);
|
||||
if (ret != 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = check_int8(handle, "DidMainRun", 0);
|
||||
if (ret != 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = check_int32(handle, "FromPkg", 1024);
|
||||
if (ret != 0) {
|
||||
return ret;
|
||||
}
|
||||
// test.bash looks for "PASS" to ensure this program has reached the end.
|
||||
printf("PASS\n");
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
// Copyright 2015 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.
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define fd (10)
|
||||
|
||||
// Tests libgo2.so, which does not export any functions.
|
||||
// Read a string from the file descriptor and print it.
|
||||
int main(void) {
|
||||
int i;
|
||||
ssize_t n;
|
||||
char buf[20];
|
||||
struct timespec ts;
|
||||
|
||||
// The descriptor will be initialized in a thread, so we have to
|
||||
// give a chance to get opened.
|
||||
for (i = 0; i < 100; i++) {
|
||||
n = read(fd, buf, sizeof buf);
|
||||
if (n >= 0)
|
||||
break;
|
||||
if (errno != EBADF) {
|
||||
fprintf(stderr, "BUG: read: %s\n", strerror(errno));
|
||||
return 2;
|
||||
}
|
||||
|
||||
// An EBADF error means that the shared library has not opened the
|
||||
// descriptor yet.
|
||||
ts.tv_sec = 0;
|
||||
ts.tv_nsec = 1000000;
|
||||
nanosleep(&ts, NULL);
|
||||
}
|
||||
|
||||
if (n < 0) {
|
||||
fprintf(stderr, "BUG: failed to read any data from pipe\n");
|
||||
return 2;
|
||||
}
|
||||
|
||||
if (n == 0) {
|
||||
fprintf(stderr, "BUG: unexpected EOF\n");
|
||||
return 2;
|
||||
}
|
||||
|
||||
if (n == sizeof buf) {
|
||||
n--;
|
||||
}
|
||||
buf[n] = '\0';
|
||||
printf("%s\n", buf);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
// Copyright 2015 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.
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
// Tests "main.main" is exported on android/arm,
|
||||
// which golang.org/x/mobile/app depends on.
|
||||
int main(int argc, char** argv) {
|
||||
void* handle = dlopen(argv[1], RTLD_LAZY | RTLD_GLOBAL);
|
||||
if (!handle) {
|
||||
fprintf(stderr, "ERROR: failed to open the shared library: %s\n",
|
||||
dlerror());
|
||||
return 2;
|
||||
}
|
||||
|
||||
uintptr_t main_fn = (uintptr_t)dlsym(handle, "main.main");
|
||||
if (!main_fn) {
|
||||
fprintf(stderr, "ERROR: missing main.main: %s\n", dlerror());
|
||||
return 2;
|
||||
}
|
||||
|
||||
// TODO(hyangah): check that main.main can run.
|
||||
|
||||
printf("PASS\n");
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
// Copyright 2015 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 main
|
||||
|
||||
import (
|
||||
_ "p"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
import "C"
|
||||
|
||||
var initCh = make(chan int, 1)
|
||||
var ranMain bool
|
||||
|
||||
func init() {
|
||||
// emulate an exceedingly slow package initialization function
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
initCh <- 42
|
||||
}
|
||||
|
||||
func main() {
|
||||
ranMain = true
|
||||
}
|
||||
|
||||
//export DidInitRun
|
||||
func DidInitRun() bool {
|
||||
select {
|
||||
case x := <-initCh:
|
||||
if x != 42 {
|
||||
// Just in case initCh was not correctly made.
|
||||
println("want init value of 42, got: ", x)
|
||||
syscall.Exit(2)
|
||||
}
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
//export DidMainRun
|
||||
func DidMainRun() bool {
|
||||
return ranMain
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
// Copyright 2015 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.
|
||||
|
||||
// +build darwin dragonfly freebsd linux netbsd openbsd solaris
|
||||
|
||||
package main
|
||||
|
||||
// Test a shared library created by -buildmode=c-shared that does not
|
||||
// export anything.
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
// To test this we want to communicate between the main program and
|
||||
// the shared library without using any exported symbols. The init
|
||||
// function creates a pipe and Dups the read end to a known number
|
||||
// that the C code can also use.
|
||||
|
||||
const (
|
||||
fd = 10
|
||||
)
|
||||
|
||||
func init() {
|
||||
var p [2]int
|
||||
if e := syscall.Pipe(p[0:]); e != nil {
|
||||
fmt.Fprintf(os.Stderr, "pipe: %v\n", e)
|
||||
os.Exit(2)
|
||||
}
|
||||
|
||||
if e := syscall.Dup2(p[0], fd); e != nil {
|
||||
fmt.Fprintf(os.Stderr, "dup2: %v\n", e)
|
||||
os.Exit(2)
|
||||
}
|
||||
|
||||
const str = "PASS"
|
||||
if n, e := syscall.Write(p[1], []byte(str)); e != nil || n != len(str) {
|
||||
fmt.Fprintf(os.Stderr, "write: %d %v\n", n, e)
|
||||
os.Exit(2)
|
||||
}
|
||||
|
||||
if e := syscall.Close(p[1]); e != nil {
|
||||
fmt.Fprintf(os.Stderr, "close: %v\n", e)
|
||||
os.Exit(2)
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
// Copyright 2015 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 p
|
||||
|
||||
import "C"
|
||||
|
||||
//export FromPkg
|
||||
func FromPkg() int32 { return 1024 }
|
||||
|
|
@ -0,0 +1,114 @@
|
|||
#!/usr/bin/env bash
|
||||
# Copyright 2015 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.
|
||||
|
||||
# For testing Android, this script requires adb to push and run compiled
|
||||
# binaries on a target device.
|
||||
|
||||
set -e
|
||||
|
||||
if [ ! -f src/libgo/libgo.go ]; then
|
||||
cwd=$(pwd)
|
||||
echo 'misc/cgo/testcshared/test.bash is running in $cwd' 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
goos=$(go env GOOS)
|
||||
|
||||
# Temporary directory on the android device.
|
||||
androidpath=/data/local/tmp/testcshared-$$
|
||||
|
||||
function cleanup() {
|
||||
rm -rf libgo.so libgo2.so libgo.h testp testp2 testp3 pkg
|
||||
|
||||
rm -rf $(go env GOROOT)/pkg/$(go env GOOS)_$(go env GOARCH)_testcshared_shared
|
||||
|
||||
if [ "$(go env GOOS)" == "android" ]; then
|
||||
adb shell rm -rf $androidpath
|
||||
fi
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
if [ "$goos" == "android" ]; then
|
||||
adb shell mkdir -p "$androidpath"
|
||||
fi
|
||||
|
||||
function run() {
|
||||
case "$goos" in
|
||||
"android")
|
||||
local args=$@
|
||||
for ((i=0; i < ${#args}; i++)); do
|
||||
args[$i]=${args[$i]//.\//${androidpath}\/}
|
||||
args[$i]=${args[$i]//=./=${androidpath}}
|
||||
done
|
||||
output=$(adb shell ${args} | tr -d '\r')
|
||||
case $output in
|
||||
*PASS) echo "PASS";;
|
||||
*) echo "$output";;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
echo $(env $@)
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
function binpush() {
|
||||
bin=${1}
|
||||
if [ "$goos" == "android" ]; then
|
||||
adb push "$bin" "${androidpath}/${bin}" 2>/dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
rm -rf pkg
|
||||
|
||||
suffix="-installsuffix testcshared"
|
||||
|
||||
# Create the header files.
|
||||
GOPATH=$(pwd) go install -buildmode=c-shared $suffix libgo
|
||||
|
||||
GOPATH=$(pwd) go build -buildmode=c-shared $suffix -o libgo.so src/libgo/libgo.go
|
||||
binpush libgo.so
|
||||
|
||||
# test0: exported symbols in shared lib are accessible.
|
||||
# TODO(iant): using _shared here shouldn't really be necessary.
|
||||
$(go env CC) $(go env GOGCCFLAGS) -I pkg/$(go env GOOS)_$(go env GOARCH)_testcshared_shared -o testp main0.c libgo.so
|
||||
binpush testp
|
||||
output=$(run LD_LIBRARY_PATH=. ./testp)
|
||||
if [ "$output" != "PASS" ]; then
|
||||
echo "FAIL test0 got ${output}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# test1: .so can be dynamically loaded and exported symbols are accessible.
|
||||
$(go env CC) $(go env GOGCCFLAGS) -o testp main1.c -ldl
|
||||
binpush testp
|
||||
output=$(run ./testp ./libgo.so)
|
||||
if [ "$output" != "PASS" ]; then
|
||||
echo "FAIL test1 got ${output}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# test2: tests libgo2.so which does not export any functions.
|
||||
GOPATH=$(pwd) go build -buildmode=c-shared $suffix -o libgo2.so src/libgo2/libgo2.go
|
||||
binpush libgo2.so
|
||||
$(go env CC) $(go env GOGCCFLAGS) -o testp2 main2.c -Wl,--no-as-needed libgo2.so
|
||||
binpush testp2
|
||||
output=$(run LD_LIBRARY_PATH=. ./testp2)
|
||||
if [ "$output" != "PASS" ]; then
|
||||
echo "FAIL test2 got ${output}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# test3: tests main.main is exported on android.
|
||||
if [ "$goos" == "android" ]; then
|
||||
$(go env CC) $(go env GOGCCFLAGS) -o testp3 main3.c -ldl
|
||||
binpush testp3
|
||||
output=$(run ./testp ./libgo.so)
|
||||
if [ "$output" != "PASS" ]; then
|
||||
echo "FAIL test3 got ${output}"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
echo "ok"
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package dep
|
||||
|
||||
var V int = 1
|
||||
|
||||
func F() int {
|
||||
return V
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package main
|
||||
|
||||
import "dep"
|
||||
|
||||
func main() {
|
||||
dep.V = dep.F() + 1
|
||||
}
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
package main
|
||||
|
||||
func main() {
|
||||
}
|
||||
|
|
@ -0,0 +1,110 @@
|
|||
#!/usr/bin/env bash
|
||||
# Copyright 2015 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.
|
||||
|
||||
# Test that -buildmode=shared can produce a shared library and that
|
||||
# -linkshared can link against it to produce a working executable.
|
||||
|
||||
set -eu
|
||||
|
||||
export GOPATH="$(pwd)"
|
||||
|
||||
die () {
|
||||
echo $@
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Because go install -buildmode=shared $standard_library_package always
|
||||
# installs into $GOROOT, here are some gymnastics to come up with a
|
||||
# unique installsuffix to use in this test that we can clean up
|
||||
# afterwards.
|
||||
rootdir="$(dirname $(go list -f '{{.Target}}' runtime))"
|
||||
template="${rootdir}_XXXXXXXX_dynlink"
|
||||
std_install_dir=$(mktemp -d "$template")
|
||||
|
||||
cleanup () {
|
||||
rm -rf $std_install_dir ./bin/ ./pkg/
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
mysuffix=$(echo $std_install_dir | sed -e 's/.*_\([^_]*\)_dynlink/\1/')
|
||||
|
||||
# This is the smallest set of packages we can link into a shared
|
||||
# library (runtime/cgo is built implicitly). Check they are built into
|
||||
# a library with the expected name.
|
||||
minpkgs="runtime sync/atomic"
|
||||
soname=libruntime,sync-atomic.so
|
||||
|
||||
go install -installsuffix="$mysuffix" -buildmode=shared $minpkgs || die "install -buildmode=shared failed"
|
||||
|
||||
if [ ! -f "$std_install_dir/$soname" ]; then
|
||||
echo "$std_install_dir/$soname not found!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# The install command should have created a "shlibname" file for the
|
||||
# listed packages (and runtime/cgo) indicating the name of the shared
|
||||
# library containing it.
|
||||
for pkg in $minpkgs runtime/cgo; do
|
||||
if [ ! -f "$std_install_dir/$pkg.shlibname" ]; then
|
||||
die "no shlibname file for $pkg"
|
||||
fi
|
||||
if [ "$(cat "$std_install_dir/$pkg.shlibname")" != "$soname" ]; then
|
||||
die "shlibname file for $pkg has wrong contents"
|
||||
fi
|
||||
done
|
||||
|
||||
# Build a trivial program that links against the shared library we
|
||||
# just made and check it runs.
|
||||
go install -installsuffix="$mysuffix" -linkshared trivial || die "build -linkshared failed"
|
||||
./bin/trivial || die "./bin/trivial failed"
|
||||
|
||||
# And check that it is actually dynamically linked against the library
|
||||
# we hope it is linked against.
|
||||
|
||||
ensure_ldd () {
|
||||
a="$(ldd $1)" || die "ldd $1 failed: $a"
|
||||
{ echo "$a" | grep -q "$2"; } || die "$1 does not appear to be linked against $2"
|
||||
}
|
||||
|
||||
ensure_ldd ./bin/trivial $std_install_dir/$soname
|
||||
|
||||
# Build a GOPATH package into a shared library that links against the above one.
|
||||
rootdir="$(dirname $(go list -installsuffix="$mysuffix" -linkshared -f '{{.Target}}' dep))"
|
||||
go install -installsuffix="$mysuffix" -buildmode=shared -linkshared dep
|
||||
ensure_ldd $rootdir/libdep.so $std_install_dir/$soname
|
||||
|
||||
|
||||
# And exe that links against both
|
||||
go install -installsuffix="$mysuffix" -linkshared exe
|
||||
ensure_ldd ./bin/exe $rootdir/libdep.so
|
||||
ensure_ldd ./bin/exe $std_install_dir/$soname
|
||||
|
||||
# Now, test rebuilding of shared libraries when they are stale.
|
||||
|
||||
will_check_rebuilt () {
|
||||
for f in $@; do cp $f $f.bak; done
|
||||
}
|
||||
|
||||
assert_rebuilt () {
|
||||
find $1 -newer $1.bak | grep -q . || die "$1 was not rebuilt"
|
||||
}
|
||||
|
||||
assert_not_rebuilt () {
|
||||
find $1 -newer $1.bak | grep . && die "$1 was rebuilt" || true
|
||||
}
|
||||
|
||||
# If the source is newer than both the .a file and the .so, both are rebuilt.
|
||||
touch src/dep/dep.go
|
||||
will_check_rebuilt $rootdir/libdep.so $rootdir/dep.a
|
||||
go install -installsuffix="$mysuffix" -linkshared exe
|
||||
assert_rebuilt $rootdir/dep.a
|
||||
assert_rebuilt $rootdir/libdep.so
|
||||
|
||||
# If the .a file is newer than the .so, the .so is rebuilt (but not the .a)
|
||||
touch $rootdir/dep.a
|
||||
will_check_rebuilt $rootdir/libdep.so $rootdir/dep.a
|
||||
go install -installsuffix="$mysuffix" -linkshared exe
|
||||
assert_not_rebuilt $rootdir/dep.a
|
||||
assert_rebuilt $rootdir/libdep.so
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
// Copyright 2015 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 main
|
||||
|
||||
import "fmt"
|
||||
|
||||
/*
|
||||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int *p;
|
||||
static void sigsegv() {
|
||||
*p = 1;
|
||||
fprintf(stderr, "ERROR: C SIGSEGV not thrown on caught?.\n");
|
||||
exit(2);
|
||||
}
|
||||
|
||||
static void sighandler(int signum) {
|
||||
if (signum == SIGSEGV) {
|
||||
exit(0); // success
|
||||
}
|
||||
}
|
||||
|
||||
static void __attribute__ ((constructor)) sigsetup(void) {
|
||||
struct sigaction act;
|
||||
act.sa_handler = &sighandler;
|
||||
sigaction(SIGSEGV, &act, 0);
|
||||
}
|
||||
*/
|
||||
import "C"
|
||||
|
||||
var p *byte
|
||||
|
||||
func f() (ret bool) {
|
||||
defer func() {
|
||||
if recover() == nil {
|
||||
fmt.Errorf("ERROR: couldn't raise SIGSEGV in Go.")
|
||||
C.exit(2)
|
||||
}
|
||||
ret = true
|
||||
}()
|
||||
*p = 1
|
||||
return false
|
||||
}
|
||||
|
||||
func main() {
|
||||
// Test that the signal originating in Go is handled (and recovered) by Go.
|
||||
if !f() {
|
||||
fmt.Errorf("couldn't recover from SIGSEGV in Go.")
|
||||
C.exit(2)
|
||||
}
|
||||
|
||||
// Test that the signal originating in C is handled by C.
|
||||
C.sigsegv()
|
||||
}
|
||||
|
|
@ -11,6 +11,7 @@ package cgosotest
|
|||
#cgo dragonfly LDFLAGS: -L. -l cgosotest
|
||||
#cgo freebsd LDFLAGS: -L. -l cgosotest
|
||||
#cgo openbsd LDFLAGS: -L. -l cgosotest
|
||||
#cgo solaris LDFLAGS: -L. -lcgosotest
|
||||
#cgo netbsd LDFLAGS: -L. libcgosotest.so
|
||||
#cgo darwin LDFLAGS: -L. libcgosotest.dylib
|
||||
#cgo windows LDFLAGS: -L. libcgosotest.dll
|
||||
|
|
|
|||
|
|
@ -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 dragonfly freebsd linux netbsd
|
||||
// +build dragonfly freebsd linux netbsd solaris
|
||||
|
||||
package cgosotest
|
||||
|
||||
|
|
|
|||
|
|
@ -7,4 +7,14 @@ SDK_PATH=`xcrun --sdk $SDK --show-sdk-path`
|
|||
export IPHONEOS_DEPLOYMENT_TARGET=5.1
|
||||
# cmd/cgo doesn't support llvm-gcc-4.2, so we have to use clang.
|
||||
CLANG=`xcrun --sdk $SDK --find clang`
|
||||
exec $CLANG -arch armv7 -isysroot $SDK_PATH "$@"
|
||||
|
||||
if [ "$GOARCH" == "arm" ]; then
|
||||
CLANGARCH="armv7"
|
||||
elif [ "$GOARCH" == "arm64" ]; then
|
||||
CLANGARCH="arm64"
|
||||
else
|
||||
echo "unknown GOARCH=$GOARCH" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exec $CLANG -arch $CLANGARCH -isysroot $SDK_PATH "$@"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,132 @@
|
|||
// Copyright 2015 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.
|
||||
|
||||
// +build ignore
|
||||
|
||||
// detect attempts to autodetect the correct
|
||||
// values of the environment variables
|
||||
// used by go_darwin_arm_exec.
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func main() {
|
||||
devID := detectDevID()
|
||||
fmt.Printf("export GOIOS_DEV_ID=%s\n", devID)
|
||||
|
||||
udid := detectUDID()
|
||||
mp := detectMobileProvisionFile(udid)
|
||||
|
||||
f, err := ioutil.TempFile("", "go_ios_detect_")
|
||||
check(err)
|
||||
fname := f.Name()
|
||||
defer os.Remove(fname)
|
||||
|
||||
out := combinedOutput(parseMobileProvision(mp))
|
||||
_, err = f.Write(out)
|
||||
check(err)
|
||||
check(f.Close())
|
||||
|
||||
appID, err := plistExtract(fname, "ApplicationIdentifierPrefix:0")
|
||||
check(err)
|
||||
fmt.Printf("export GOIOS_APP_ID=%s\n", appID)
|
||||
|
||||
teamID, err := plistExtract(fname, "Entitlements:com.apple.developer.team-identifier")
|
||||
check(err)
|
||||
fmt.Printf("export GOIOS_TEAM_ID=%s\n", teamID)
|
||||
}
|
||||
|
||||
func detectDevID() string {
|
||||
cmd := exec.Command("security", "find-identity", "-p", "codesigning", "-v")
|
||||
lines := getLines(cmd)
|
||||
|
||||
for _, line := range lines {
|
||||
if !bytes.Contains(line, []byte("iPhone Developer")) {
|
||||
continue
|
||||
}
|
||||
fields := bytes.Fields(line)
|
||||
return string(fields[1])
|
||||
}
|
||||
fail("no code signing identity found")
|
||||
panic("unreachable")
|
||||
}
|
||||
|
||||
var udidPrefix = []byte("UniqueDeviceID: ")
|
||||
|
||||
func detectUDID() []byte {
|
||||
cmd := exec.Command("ideviceinfo")
|
||||
lines := getLines(cmd)
|
||||
for _, line := range lines {
|
||||
if bytes.HasPrefix(line, udidPrefix) {
|
||||
return bytes.TrimPrefix(line, udidPrefix)
|
||||
}
|
||||
}
|
||||
fail("udid not found; is the device connected?")
|
||||
panic("unreachable")
|
||||
}
|
||||
|
||||
func detectMobileProvisionFile(udid []byte) string {
|
||||
cmd := exec.Command("mdfind", "-name", ".mobileprovision")
|
||||
lines := getLines(cmd)
|
||||
|
||||
for _, line := range lines {
|
||||
if len(line) == 0 {
|
||||
continue
|
||||
}
|
||||
xmlLines := getLines(parseMobileProvision(string(line)))
|
||||
for _, xmlLine := range xmlLines {
|
||||
if bytes.Contains(xmlLine, udid) {
|
||||
return string(line)
|
||||
}
|
||||
}
|
||||
}
|
||||
fail("did not find mobile provision matching device udid %s", udid)
|
||||
panic("ureachable")
|
||||
}
|
||||
|
||||
func parseMobileProvision(fname string) *exec.Cmd {
|
||||
return exec.Command("security", "cms", "-D", "-i", string(fname))
|
||||
}
|
||||
|
||||
func plistExtract(fname string, path string) ([]byte, error) {
|
||||
out, err := exec.Command("/usr/libexec/PlistBuddy", "-c", "Print "+path, fname).CombinedOutput()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return bytes.TrimSpace(out), nil
|
||||
}
|
||||
|
||||
func getLines(cmd *exec.Cmd) [][]byte {
|
||||
out := combinedOutput(cmd)
|
||||
return bytes.Split(out, []byte("\n"))
|
||||
}
|
||||
|
||||
func combinedOutput(cmd *exec.Cmd) []byte {
|
||||
out, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
fmt.Println(strings.Join(cmd.Args, "\n"))
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func check(err error) {
|
||||
if err != nil {
|
||||
fail(err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
func fail(msg string, v ...interface{}) {
|
||||
fmt.Fprintf(os.Stderr, msg, v...)
|
||||
fmt.Fprintln(os.Stderr)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
|
@ -5,6 +5,18 @@
|
|||
// This program can be used as go_darwin_arm_exec by the Go tool.
|
||||
// It executes binaries on an iOS device using the XCode toolchain
|
||||
// and the ios-deploy program: https://github.com/phonegap/ios-deploy
|
||||
//
|
||||
// This script supports an extra flag, -lldb, that pauses execution
|
||||
// just before the main program begins and allows the user to control
|
||||
// the remote lldb session. This flag is appended to the end of the
|
||||
// script's arguments and is not passed through to the underlying
|
||||
// binary.
|
||||
//
|
||||
// This script requires that three environment variables be set:
|
||||
// GOIOS_DEV_ID: The codesigning developer id or certificate identifier
|
||||
// GOIOS_APP_ID: The provisioning app id prefix. Must support wildcard app ids.
|
||||
// GOIOS_TEAM_ID: The team id that owns the app id prefix.
|
||||
// $GOROOT/misc/ios contains a script, detect.go, that attempts to autodetect these.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
|
@ -13,6 +25,7 @@ import (
|
|||
"flag"
|
||||
"fmt"
|
||||
"go/build"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"os"
|
||||
|
|
@ -30,6 +43,12 @@ var errRetry = errors.New("failed to start test harness (retry attempted)")
|
|||
|
||||
var tmpdir string
|
||||
|
||||
var (
|
||||
devID string
|
||||
appID string
|
||||
teamID string
|
||||
)
|
||||
|
||||
func main() {
|
||||
log.SetFlags(0)
|
||||
log.SetPrefix("go_darwin_arm_exec: ")
|
||||
|
|
@ -40,6 +59,10 @@ func main() {
|
|||
log.Fatal("usage: go_darwin_arm_exec a.out")
|
||||
}
|
||||
|
||||
devID = getenv("GOIOS_DEV_ID")
|
||||
appID = getenv("GOIOS_APP_ID")
|
||||
teamID = getenv("GOIOS_TEAM_ID")
|
||||
|
||||
var err error
|
||||
tmpdir, err = ioutil.TempDir("", "go_darwin_arm_exec_")
|
||||
if err != nil {
|
||||
|
|
@ -70,6 +93,14 @@ func main() {
|
|||
}
|
||||
}
|
||||
|
||||
func getenv(envvar string) string {
|
||||
s := os.Getenv(envvar)
|
||||
if s == "" {
|
||||
log.Fatalf("%s not set\nrun $GOROOT/misc/ios/detect.go to attempt to autodetect", s)
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
func run(bin string, args []string) (err error) {
|
||||
appdir := filepath.Join(tmpdir, "gotest.app")
|
||||
os.RemoveAll(appdir)
|
||||
|
|
@ -82,7 +113,7 @@ func run(bin string, args []string) (err error) {
|
|||
}
|
||||
|
||||
entitlementsPath := filepath.Join(tmpdir, "Entitlements.plist")
|
||||
if err := ioutil.WriteFile(entitlementsPath, []byte(entitlementsPlist), 0744); err != nil {
|
||||
if err := ioutil.WriteFile(entitlementsPath, []byte(entitlementsPlist()), 0744); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := ioutil.WriteFile(filepath.Join(appdir, "Info.plist"), []byte(infoPlist), 0744); err != nil {
|
||||
|
|
@ -100,7 +131,7 @@ func run(bin string, args []string) (err error) {
|
|||
cmd := exec.Command(
|
||||
"codesign",
|
||||
"-f",
|
||||
"-s", "E8BMC3FE2Z", // certificate associated with golang.org
|
||||
"-s", devID,
|
||||
"--entitlements", entitlementsPath,
|
||||
appdir,
|
||||
)
|
||||
|
|
@ -139,6 +170,9 @@ func run(bin string, args []string) (err error) {
|
|||
|
||||
exec.Command("killall", "ios-deploy").Run()
|
||||
|
||||
var opts options
|
||||
opts, args = parseArgs(args)
|
||||
|
||||
// ios-deploy invokes lldb to give us a shell session with the app.
|
||||
cmd = exec.Command(
|
||||
// lldb tries to be clever with terminals.
|
||||
|
|
@ -165,8 +199,14 @@ func run(bin string, args []string) (err error) {
|
|||
return err
|
||||
}
|
||||
w := new(bufWriter)
|
||||
cmd.Stdout = w
|
||||
cmd.Stderr = w // everything of interest is on stderr
|
||||
if opts.lldb {
|
||||
mw := io.MultiWriter(w, os.Stderr)
|
||||
cmd.Stdout = mw
|
||||
cmd.Stderr = mw
|
||||
} else {
|
||||
cmd.Stdout = w
|
||||
cmd.Stderr = w // everything of interest is on stderr
|
||||
}
|
||||
cmd.Stdin = lldbr
|
||||
|
||||
if err := cmd.Start(); err != nil {
|
||||
|
|
@ -177,9 +217,9 @@ func run(bin string, args []string) (err error) {
|
|||
// of moving parts in an iOS test harness (notably lldb) that can
|
||||
// swallow useful stdio or cause its own ruckus.
|
||||
var timedout chan struct{}
|
||||
if t := parseTimeout(args); t > 1*time.Second {
|
||||
if opts.timeout > 1*time.Second {
|
||||
timedout = make(chan struct{})
|
||||
time.AfterFunc(t-1*time.Second, func() {
|
||||
time.AfterFunc(opts.timeout-1*time.Second, func() {
|
||||
close(timedout)
|
||||
})
|
||||
}
|
||||
|
|
@ -217,7 +257,7 @@ func run(bin string, args []string) (err error) {
|
|||
}
|
||||
|
||||
// Wait for installation and connection.
|
||||
if err := waitFor("ios-deploy before run", "(lldb) connect\r\nProcess 0 connected\r\n", 0); err != nil {
|
||||
if err := waitFor("ios-deploy before run", "(lldb)", 0); err != nil {
|
||||
// Retry if we see a rare and longstanding ios-deploy bug.
|
||||
// https://github.com/phonegap/ios-deploy/issues/11
|
||||
// Assertion failed: (AMDeviceStartService(device, CFSTR("com.apple.debugserver"), &gdbfd, NULL) == 0)
|
||||
|
|
@ -232,6 +272,14 @@ func run(bin string, args []string) (err error) {
|
|||
do(`process handle SIGSEGV --stop false --pass true --notify false`) // does not work
|
||||
do(`process handle SIGBUS --stop false --pass true --notify false`) // does not work
|
||||
|
||||
if opts.lldb {
|
||||
_, err := io.Copy(lldb, os.Stdin)
|
||||
if err != io.EOF {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
do(`breakpoint set -n getwd`) // in runtime/cgo/gcc_darwin_arm.go
|
||||
|
||||
fmt.Fprintln(lldb, `run`)
|
||||
|
|
@ -257,25 +305,13 @@ func run(bin string, args []string) (err error) {
|
|||
}
|
||||
|
||||
// Move the current working directory into the faux gopath.
|
||||
do(`breakpoint delete 1`)
|
||||
do(`expr char* $mem = (char*)malloc(512)`)
|
||||
do(`expr $mem = (char*)getwd($mem, 512)`)
|
||||
do(`expr $mem = (char*)strcat($mem, "/` + pkgpath + `")`)
|
||||
do(`call (void)chdir($mem)`)
|
||||
|
||||
// Watch for SIGSEGV. Ideally lldb would never break on SIGSEGV.
|
||||
// http://golang.org/issue/10043
|
||||
go func() {
|
||||
<-w.find("stop reason = EXC_BAD_ACCESS", 0)
|
||||
// cannot use do here, as the defer/recover is not available
|
||||
// on this goroutine.
|
||||
fmt.Fprintln(lldb, `bt`)
|
||||
waitFor("finish backtrace", "(lldb)", 0)
|
||||
w.printBuf()
|
||||
if p := cmd.Process; p != nil {
|
||||
p.Kill()
|
||||
}
|
||||
}()
|
||||
if pkgpath != "src" {
|
||||
do(`breakpoint delete 1`)
|
||||
do(`expr char* $mem = (char*)malloc(512)`)
|
||||
do(`expr $mem = (char*)getwd($mem, 512)`)
|
||||
do(`expr $mem = (char*)strcat($mem, "/` + pkgpath + `")`)
|
||||
do(`call (void)chdir($mem)`)
|
||||
}
|
||||
|
||||
// Run the tests.
|
||||
w.trimSuffix("(lldb) ")
|
||||
|
|
@ -289,6 +325,13 @@ func run(bin string, args []string) (err error) {
|
|||
p.Kill()
|
||||
}
|
||||
return errors.New("timeout running tests")
|
||||
case <-w.find("\nPASS", 0):
|
||||
passed := w.isPass()
|
||||
w.printBuf()
|
||||
if passed {
|
||||
return nil
|
||||
}
|
||||
return errors.New("test failure")
|
||||
case err := <-exited:
|
||||
// The returned lldb error code is usually non-zero.
|
||||
// We check for test success by scanning for the final
|
||||
|
|
@ -321,6 +364,12 @@ func (w *bufWriter) Write(in []byte) (n int, err error) {
|
|||
n = len(in)
|
||||
in = bytes.TrimSuffix(in, w.suffix)
|
||||
|
||||
if debug {
|
||||
inTxt := strings.Replace(string(in), "\n", "\\n", -1)
|
||||
findTxt := strings.Replace(string(w.findTxt), "\n", "\\n", -1)
|
||||
fmt.Printf("debug --> %s <-- debug (findTxt='%s')\n", inTxt, findTxt)
|
||||
}
|
||||
|
||||
w.buf = append(w.buf, in...)
|
||||
|
||||
if len(w.findTxt) > 0 {
|
||||
|
|
@ -354,9 +403,6 @@ func (w *bufWriter) printBuf() {
|
|||
func (w *bufWriter) clearTo(i int) {
|
||||
w.mu.Lock()
|
||||
defer w.mu.Unlock()
|
||||
if debug {
|
||||
fmt.Fprintf(os.Stderr, "--- go_darwin_arm_exec clear ---\n%s\n--- go_darwin_arm_exec clear ---\n", w.buf[:i])
|
||||
}
|
||||
w.buf = w.buf[i:]
|
||||
}
|
||||
|
||||
|
|
@ -408,20 +454,29 @@ func (w *bufWriter) isPass() bool {
|
|||
return bytes.Contains(w.buf, []byte("\nPASS\n")) || bytes.Contains(w.buf, []byte("\nPASS\r"))
|
||||
}
|
||||
|
||||
func parseTimeout(testArgs []string) (timeout time.Duration) {
|
||||
var args []string
|
||||
for _, arg := range testArgs {
|
||||
if strings.Contains(arg, "test.timeout") {
|
||||
args = append(args, arg)
|
||||
type options struct {
|
||||
timeout time.Duration
|
||||
lldb bool
|
||||
}
|
||||
|
||||
func parseArgs(binArgs []string) (opts options, remainingArgs []string) {
|
||||
var flagArgs []string
|
||||
for _, arg := range binArgs {
|
||||
if strings.Contains(arg, "-test.timeout") {
|
||||
flagArgs = append(flagArgs, arg)
|
||||
}
|
||||
if strings.Contains(arg, "-lldb") {
|
||||
flagArgs = append(flagArgs, arg)
|
||||
continue
|
||||
}
|
||||
remainingArgs = append(remainingArgs, arg)
|
||||
}
|
||||
f := flag.NewFlagSet("", flag.ContinueOnError)
|
||||
f.DurationVar(&timeout, "test.timeout", 0, "")
|
||||
f.Parse(args)
|
||||
if debug {
|
||||
log.Printf("parseTimeout of %s, got %s", args, timeout)
|
||||
}
|
||||
return timeout
|
||||
f.DurationVar(&opts.timeout, "test.timeout", 0, "")
|
||||
f.BoolVar(&opts.lldb, "lldb", false, "")
|
||||
f.Parse(flagArgs)
|
||||
return opts, remainingArgs
|
||||
|
||||
}
|
||||
|
||||
func copyLocalDir(dst, src string) error {
|
||||
|
|
@ -557,39 +612,45 @@ const infoPlist = `<?xml version="1.0" encoding="UTF-8"?>
|
|||
</plist>
|
||||
`
|
||||
|
||||
const devID = `YE84DJ86AZ`
|
||||
|
||||
const entitlementsPlist = `<?xml version="1.0" encoding="UTF-8"?>
|
||||
func entitlementsPlist() string {
|
||||
return `<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>keychain-access-groups</key>
|
||||
<array><string>` + devID + `.golang.gotest</string></array>
|
||||
<array><string>` + appID + `.golang.gotest</string></array>
|
||||
<key>get-task-allow</key>
|
||||
<true/>
|
||||
<key>application-identifier</key>
|
||||
<string>` + devID + `.golang.gotest</string>
|
||||
<string>` + appID + `.golang.gotest</string>
|
||||
<key>com.apple.developer.team-identifier</key>
|
||||
<string>` + devID + `</string>
|
||||
<string>` + teamID + `</string>
|
||||
</dict>
|
||||
</plist>`
|
||||
</plist>
|
||||
`
|
||||
}
|
||||
|
||||
const resourceRules = `<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>rules</key>
|
||||
<dict>
|
||||
<key>.*</key><true/>
|
||||
<key>Info.plist</key>
|
||||
<key>rules</key>
|
||||
<dict>
|
||||
<key>.*</key>
|
||||
<true/>
|
||||
<key>Info.plist</key>
|
||||
<dict>
|
||||
<key>omit</key> <true/>
|
||||
<key>weight</key> <real>10</real>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<integer>10</integer>
|
||||
</dict>
|
||||
<key>ResourceRules.plist</key>
|
||||
<dict>
|
||||
<key>omit</key> <true/>
|
||||
<key>weight</key> <real>100</real>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<integer>100</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
|
|
|
|||
|
|
@ -10,6 +10,9 @@ usr src=../misc/nacl/testdata
|
|||
go src=..
|
||||
src
|
||||
cmd
|
||||
api
|
||||
testdata
|
||||
+
|
||||
asm
|
||||
internal
|
||||
asm
|
||||
|
|
|
|||
|
|
@ -44,9 +44,11 @@ GOOS=$GOHOSTOS GOARCH=$GOHOSTARCH go build \
|
|||
export ANDROID_PRODUCT_OUT=/tmp/androidtest-$$
|
||||
FAKE_GOROOT=$ANDROID_PRODUCT_OUT/data/local/tmp/goroot
|
||||
mkdir -p $FAKE_GOROOT
|
||||
mkdir -p $FAKE_GOROOT/pkg
|
||||
cp -a "${GOROOT}/src" "${FAKE_GOROOT}/"
|
||||
cp -a "${GOROOT}/test" "${FAKE_GOROOT}/"
|
||||
cp -a "${GOROOT}/lib" "${FAKE_GOROOT}/"
|
||||
cp -a "${GOROOT}/pkg/android_$GOARCH" "${FAKE_GOROOT}/pkg/"
|
||||
echo '# Syncing test files to android device'
|
||||
time adb sync data &> /dev/null
|
||||
echo ''
|
||||
|
|
|
|||
|
|
@ -355,7 +355,7 @@ func paxHeader(msg string) string {
|
|||
// hdr.Size bytes are written after WriteHeader.
|
||||
func (tw *Writer) Write(b []byte) (n int, err error) {
|
||||
if tw.closed {
|
||||
err = ErrWriteTooLong
|
||||
err = ErrWriteAfterClose
|
||||
return
|
||||
}
|
||||
overwrite := false
|
||||
|
|
|
|||
|
|
@ -489,3 +489,20 @@ func TestValidTypeflagWithPAXHeader(t *testing.T) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestWriteAfterClose(t *testing.T) {
|
||||
var buffer bytes.Buffer
|
||||
tw := NewWriter(&buffer)
|
||||
|
||||
hdr := &Header{
|
||||
Name: "small.txt",
|
||||
Size: 5,
|
||||
}
|
||||
if err := tw.WriteHeader(hdr); err != nil {
|
||||
t.Fatalf("Failed to write header: %s", err)
|
||||
}
|
||||
tw.Close()
|
||||
if _, err := tw.Write([]byte("Kilts")); err != ErrWriteAfterClose {
|
||||
t.Fatalf("Write: got %v; want ErrWriteAfterClose", err)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,70 @@
|
|||
#!/usr/bin/env bash
|
||||
# Copyright 2015 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.
|
||||
|
||||
# Usage: buildall.sh [-e] [pattern]
|
||||
#
|
||||
# buildall.bash builds the standard library for all Go-supported
|
||||
# architectures. It is used by the "all-compile" trybot builder,
|
||||
# as a smoke test to quickly flag portability issues.
|
||||
#
|
||||
# Options:
|
||||
# -e: stop at first failure
|
||||
|
||||
if [ ! -f run.bash ]; then
|
||||
echo 'buildall.bash must be run from $GOROOT/src' 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
sete=false
|
||||
if [ "$1" = "-e" ]; then
|
||||
sete=true
|
||||
shift
|
||||
fi
|
||||
|
||||
if [ "$sete" = true ]; then
|
||||
set -e
|
||||
fi
|
||||
|
||||
pattern="$1"
|
||||
if [ "$pattern" = "" ]; then
|
||||
pattern=.
|
||||
fi
|
||||
|
||||
# put linux, nacl first in the target list to get all the architectures up front.
|
||||
targets="$((ls runtime | sed -n 's/^rt0_\(.*\)_\(.*\)\.s/\1-\2/p'; echo linux-386-387 linux-arm-arm5) | sort | egrep -v android-arm | egrep "$pattern" | egrep 'linux|nacl')
|
||||
$(ls runtime | sed -n 's/^rt0_\(.*\)_\(.*\)\.s/\1-\2/p' | egrep -v 'android-arm|darwin-arm' | egrep "$pattern" | egrep -v 'linux|nacl')"
|
||||
|
||||
./make.bash
|
||||
GOROOT="$(cd .. && pwd)"
|
||||
|
||||
failed=false
|
||||
for target in $targets
|
||||
do
|
||||
echo ""
|
||||
echo "### Building $target"
|
||||
export GOOS=$(echo $target | sed 's/-.*//')
|
||||
export GOARCH=$(echo $target | sed 's/.*-//')
|
||||
unset GO386 GOARM
|
||||
if [ "$GOARCH" = "arm5" ]; then
|
||||
export GOARCH=arm
|
||||
export GOARM=5
|
||||
fi
|
||||
if [ "$GOARCH" = "387" ]; then
|
||||
export GOARCH=386
|
||||
export GO386=387
|
||||
fi
|
||||
if ! "$GOROOT/bin/go" build -a std cmd; then
|
||||
failed=true
|
||||
if $sete; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$failed" = "true" ]; then
|
||||
echo "" 1>&2
|
||||
echo "Build(s) failed." 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
|
@ -56,6 +56,10 @@ func (b *Buffer) String() string {
|
|||
// b.Len() == len(b.Bytes()).
|
||||
func (b *Buffer) Len() int { return len(b.buf) - b.off }
|
||||
|
||||
// Cap returns the capacity of the buffer's underlying byte slice, that is, the
|
||||
// total space allocated for the buffer's data.
|
||||
func (b *Buffer) Cap() int { return cap(b.buf) }
|
||||
|
||||
// Truncate discards all but the first n unread bytes from the buffer.
|
||||
// It panics if n is negative or greater than the length of the buffer.
|
||||
func (b *Buffer) Truncate(n int) {
|
||||
|
|
|
|||
|
|
@ -231,6 +231,23 @@ func TestMixedReadsAndWrites(t *testing.T) {
|
|||
empty(t, "TestMixedReadsAndWrites (2)", &buf, s, make([]byte, buf.Len()))
|
||||
}
|
||||
|
||||
func TestCapWithPreallocatedSlice(t *testing.T) {
|
||||
buf := NewBuffer(make([]byte, 10))
|
||||
n := buf.Cap()
|
||||
if n != 10 {
|
||||
t.Errorf("expected 10, got %d", n)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCapWithSliceAndWrittenData(t *testing.T) {
|
||||
buf := NewBuffer(make([]byte, 0, 10))
|
||||
buf.Write([]byte("test"))
|
||||
n := buf.Cap()
|
||||
if n != 10 {
|
||||
t.Errorf("expected 10, got %d", n)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNil(t *testing.T) {
|
||||
var b *Buffer
|
||||
if b.String() != "<nil>" {
|
||||
|
|
|
|||
|
|
@ -138,6 +138,16 @@ func LastIndex(s, sep []byte) int {
|
|||
return -1
|
||||
}
|
||||
|
||||
// LastIndexByte returns the index of the last instance of c in s, or -1 if c is not present in s.
|
||||
func LastIndexByte(s []byte, c byte) int {
|
||||
for i := len(s) - 1; i >= 0; i-- {
|
||||
if s[i] == c {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
// IndexRune interprets s as a sequence of UTF-8-encoded Unicode code points.
|
||||
// It returns the byte index of the first occurrence in s of the given rune.
|
||||
// It returns -1 if rune is not present in s.
|
||||
|
|
|
|||
|
|
@ -265,6 +265,23 @@ func TestIndexByte(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestLastIndexByte(t *testing.T) {
|
||||
testCases := []BinOpTest{
|
||||
{"", "q", -1},
|
||||
{"abcdef", "q", -1},
|
||||
{"abcdefabcdef", "a", len("abcdef")}, // something in the middle
|
||||
{"abcdefabcdef", "f", len("abcdefabcde")}, // last byte
|
||||
{"zabcdefabcdef", "z", 0}, // first byte
|
||||
{"a☺b☻c☹d", "b", len("a☺")}, // non-ascii
|
||||
}
|
||||
for _, test := range testCases {
|
||||
actual := LastIndexByte([]byte(test.a), test.b[0])
|
||||
if actual != test.i {
|
||||
t.Errorf("LastIndexByte(%q,%c) = %v; want %v", test.a, test.b[0], actual, test.i)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// test a larger buffer with different sizes and alignments
|
||||
func TestIndexByteBig(t *testing.T) {
|
||||
var n = 1024
|
||||
|
|
|
|||
|
|
@ -7,7 +7,3 @@ package bytes
|
|||
// Export func for testing
|
||||
var IndexBytePortable = indexBytePortable
|
||||
var EqualPortable = equalPortable
|
||||
|
||||
func (b *Buffer) Cap() int {
|
||||
return cap(b.buf)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,6 +29,12 @@ func (r *Reader) Len() int {
|
|||
return int(int64(len(r.s)) - r.i)
|
||||
}
|
||||
|
||||
// Size returns the original length of the underlying byte slice.
|
||||
// Size is the number of bytes available for reading via ReadAt.
|
||||
// The returned value is always the same and is not affected by calls
|
||||
// to any other method.
|
||||
func (r *Reader) Size() int64 { return int64(len(r.s)) }
|
||||
|
||||
func (r *Reader) Read(b []byte) (n int, err error) {
|
||||
if len(b) == 0 {
|
||||
return 0, nil
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue