From patchwork Mon Jun 14 05:24:24 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Lance Taylor X-Patchwork-Id: 55467 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id D7C6AB7DB0 for ; Mon, 14 Jun 2010 15:24:51 +1000 (EST) Received: (qmail 8272 invoked by alias); 14 Jun 2010 05:24:48 -0000 Received: (qmail 8252 invoked by uid 22791); 14 Jun 2010 05:24:42 -0000 X-SWARE-Spam-Status: No, hits=-0.8 required=5.0 tests=AWL, BAYES_50, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, SPF_HELO_PASS, TW_CC, TW_XM, T_RP_MATCHES_RCVD, T_TVD_MIME_NO_HEADERS X-Spam-Check-By: sourceware.org Received: from smtp-out.google.com (HELO smtp-out.google.com) (216.239.44.51) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 14 Jun 2010 05:24:35 +0000 Received: from kpbe11.cbf.corp.google.com (kpbe11.cbf.corp.google.com [172.25.105.75]) by smtp-out.google.com with ESMTP id o5E5OWNA014193 for ; Sun, 13 Jun 2010 22:24:32 -0700 Received: from pxi3 (pxi3.prod.google.com [10.243.27.3]) by kpbe11.cbf.corp.google.com with ESMTP id o5E5OU5o009841 for ; Sun, 13 Jun 2010 22:24:31 -0700 Received: by pxi3 with SMTP id 3so1629764pxi.20 for ; Sun, 13 Jun 2010 22:24:30 -0700 (PDT) Received: by 10.114.236.22 with SMTP id j22mr4131229wah.5.1276493070475; Sun, 13 Jun 2010 22:24:30 -0700 (PDT) Received: from coign.google.com (adsl-71-133-8-30.dsl.pltn13.pacbell.net [71.133.8.30]) by mx.google.com with ESMTPS id 33sm50514925wad.20.2010.06.13.22.24.26 (version=TLSv1/SSLv3 cipher=RC4-MD5); Sun, 13 Jun 2010 22:24:29 -0700 (PDT) To: gcc-patches@gcc.gnu.org Subject: [gccgo] Go library updates for panic recover From: Ian Lance Taylor Date: Sun, 13 Jun 2010 22:24:24 -0700 Message-ID: User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.1 (gnu/linux) MIME-Version: 1.0 X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org This patch updates the Go library for the removal of the panicln function and the change to the panic function to take only one argument. It also adds the runtime.Error interface used for builtin panics. Committed to gccgo branch. Ian diff -r d56422877227 libgo/go/bufio/bufio.go --- a/libgo/go/bufio/bufio.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/bufio/bufio.go Sun Jun 13 22:20:07 2010 -0700 @@ -75,7 +75,7 @@ b, err := NewReaderSize(rd, defaultBufSize) if err != nil { // cannot happen - defaultBufSize is a valid size - panic("bufio: NewReader: ", err.String()) + panic(err) } return b } @@ -353,7 +353,7 @@ b, err := NewWriterSize(wr, defaultBufSize) if err != nil { // cannot happen - defaultBufSize is valid size - panic("bufio: NewWriter: ", err.String()) + panic(err) } return b } diff -r d56422877227 libgo/go/bytes/bytes_test.go --- a/libgo/go/bytes/bytes_test.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/bytes/bytes_test.go Sun Jun 13 22:20:07 2010 -0700 @@ -151,7 +151,8 @@ for i := 0; i < b.N; i++ { j := index(buf, 'x') if j != n-1 { - panic("bad index", j) + println("bad index", j) + panic("bad index") } } buf[n-1] = '0' diff -r d56422877227 libgo/go/crypto/block/cfb.go --- a/libgo/go/crypto/block/cfb.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/crypto/block/cfb.go Sun Jun 13 22:20:07 2010 -0700 @@ -26,7 +26,7 @@ func newCFB(c Cipher, s int, iv []byte) *cfbCipher { if s == 0 || s%8 != 0 { - panicln("crypto/block: invalid CFB mode", s) + panic("crypto/block: invalid CFB mode") } b := c.BlockSize() x := new(cfbCipher) diff -r d56422877227 libgo/go/crypto/block/cmac.go --- a/libgo/go/crypto/block/cmac.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/crypto/block/cmac.go Sun Jun 13 22:20:07 2010 -0700 @@ -37,7 +37,7 @@ case 128 / 8: r = r128 default: - panic("crypto/block: NewCMAC: invalid cipher block size", n) + panic("crypto/block: NewCMAC: invalid cipher block size") } d := new(cmac) diff -r d56422877227 libgo/go/crypto/block/eax.go --- a/libgo/go/crypto/block/eax.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/crypto/block/eax.go Sun Jun 13 22:20:07 2010 -0700 @@ -36,7 +36,7 @@ func setupEAX(c Cipher, iv, hdr []byte, tagBytes int) (ctrIV, tag []byte, cmac hash.Hash) { n := len(iv) if n != c.BlockSize() { - panicln("crypto/block: EAX: iv length", n, "!=", c.BlockSize()) + panic(fmt.Sprintln("crypto/block: EAX: iv length", n, "!=", c.BlockSize())) } buf := make([]byte, n) // zeroed diff -r d56422877227 libgo/go/crypto/block/ecb_test.go --- a/libgo/go/crypto/block/ecb_test.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/crypto/block/ecb_test.go Sun Jun 13 22:20:07 2010 -0700 @@ -24,10 +24,10 @@ func (c *IncCipher) Encrypt(src, dst []byte) { if !c.encrypting { - panicln("encrypt: not encrypting") + panic("encrypt: not encrypting") } if len(src) != c.blockSize || len(dst) != c.blockSize { - panicln("encrypt: wrong block size", c.blockSize, len(src), len(dst)) + panic(fmt.Sprintln("encrypt: wrong block size", c.blockSize, len(src), len(dst))) } c.delta++ for i, b := range src { @@ -37,10 +37,10 @@ func (c *IncCipher) Decrypt(src, dst []byte) { if c.encrypting { - panicln("decrypt: not decrypting") + panic("decrypt: not decrypting") } if len(src) != c.blockSize || len(dst) != c.blockSize { - panicln("decrypt: wrong block size", c.blockSize, len(src), len(dst)) + panic(fmt.Sprintln("decrypt: wrong block size ", c.blockSize, " ", len(src), " ", len(dst))) } c.delta-- for i, b := range src { diff -r d56422877227 libgo/go/crypto/block/ofb.go --- a/libgo/go/crypto/block/ofb.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/crypto/block/ofb.go Sun Jun 13 22:20:07 2010 -0700 @@ -13,6 +13,7 @@ package block import ( + "fmt" "io" ) @@ -26,7 +27,7 @@ x.c = c n := len(iv) if n != c.BlockSize() { - panicln("crypto/block: newOFBStream: invalid iv size", n, "!=", c.BlockSize()) + panic(fmt.Sprintln("crypto/block: newOFBStream: invalid iv size", n, "!=", c.BlockSize())) } x.iv = copy(iv) return x diff -r d56422877227 libgo/go/crypto/md4/md4.go --- a/libgo/go/crypto/md4/md4.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/crypto/md4/md4.go Sun Jun 13 22:20:07 2010 -0700 @@ -99,7 +99,7 @@ d.Write(tmp[0:8]) if d.nx != 0 { - panicln("oops") + panic("d.nx != 0") } p := make([]byte, 16) diff -r d56422877227 libgo/go/crypto/md5/md5.go --- a/libgo/go/crypto/md5/md5.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/crypto/md5/md5.go Sun Jun 13 22:20:07 2010 -0700 @@ -99,7 +99,7 @@ d.Write(tmp[0:8]) if d.nx != 0 { - panicln("oops") + panic("d.nx != 0") } p := make([]byte, 16) diff -r d56422877227 libgo/go/crypto/sha1/sha1.go --- a/libgo/go/crypto/sha1/sha1.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/crypto/sha1/sha1.go Sun Jun 13 22:20:07 2010 -0700 @@ -101,7 +101,7 @@ d.Write(tmp[0:8]) if d.nx != 0 { - panicln("oops") + panic("d.nx != 0") } p := make([]byte, 20) diff -r d56422877227 libgo/go/crypto/sha256/sha256.go --- a/libgo/go/crypto/sha256/sha256.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/crypto/sha256/sha256.go Sun Jun 13 22:20:07 2010 -0700 @@ -107,7 +107,7 @@ d.Write(tmp[0:8]) if d.nx != 0 { - panicln("oops") + panic("d.nx != 0") } p := make([]byte, 32) diff -r d56422877227 libgo/go/debug/proc/proc_linux.go --- a/libgo/go/debug/proc/proc_linux.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/debug/proc/proc_linux.go Sun Jun 13 22:20:07 2010 -0700 @@ -430,7 +430,7 @@ t.logTrace("beginning wait") ev.Waitmsg, ev.err = os.Wait(t.tid, syscall.WALL) if ev.err == nil && ev.Pid != t.tid { - panic("Wait returned pid ", ev.Pid, " wanted ", t.tid) + panic(fmt.Sprint("Wait returned pid ", ev.Pid, " wanted ", t.tid)) } if ev.StopSignal() == syscall.SIGSTOP && t.ignoreNextSigstop { // Spurious SIGSTOP. See Thread.Stop(). diff -r d56422877227 libgo/go/debug/proc/regs_linux_386.go --- a/libgo/go/debug/proc/regs_linux_386.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/debug/proc/regs_linux_386.go Sun Jun 13 22:20:07 2010 -0700 @@ -92,7 +92,7 @@ case 15: return Word(r.Gs) } - panic("invalid register index ", strconv.Itoa(i)) + panic("invalid register index " + strconv.Itoa(i)) } func (r *_386Regs) Set(i int, val Word) os.Error { @@ -130,7 +130,7 @@ case 15: r.Gs = uint16(val) default: - panic("invalid register index ", strconv.Itoa(i)) + panic("invalid register index " + strconv.Itoa(i)) } return r.setter(&r.PtraceRegs) } diff -r d56422877227 libgo/go/debug/proc/regs_linux_amd64.go --- a/libgo/go/debug/proc/regs_linux_amd64.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/debug/proc/regs_linux_amd64.go Sun Jun 13 22:20:07 2010 -0700 @@ -124,7 +124,7 @@ case 23: return Word(r.Gs) } - panic("invalid register index ", strconv.Itoa(i)) + panic("invalid register index " + strconv.Itoa(i)) } func (r *amd64Regs) Set(i int, val Word) os.Error { @@ -178,7 +178,7 @@ case 23: r.Gs = uint64(val) default: - panic("invalid register index ", strconv.Itoa(i)) + panic("invalid register index " + strconv.Itoa(i)) } return r.setter(&r.PtraceRegs) } diff -r d56422877227 libgo/go/exp/eval/abort.go --- a/libgo/go/exp/eval/abort.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/exp/eval/abort.go Sun Jun 13 22:20:07 2010 -0700 @@ -14,7 +14,7 @@ // causing the innermost Try to return err. func (t *Thread) Abort(err os.Error) { if t.abort == nil { - panicln("abort:", err.String()) + panic("abort: " + err.String()) } t.abort <- err runtime.Goexit() diff -r d56422877227 libgo/go/exp/eval/eval_test.go --- a/libgo/go/exp/eval/eval_test.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/exp/eval/eval_test.go Sun Jun 13 22:20:07 2010 -0700 @@ -196,7 +196,7 @@ return &funcV{val} } log.Crashf("toValue(%T) not implemented", val) - panic() + panic("unreachable") } /* diff -r d56422877227 libgo/go/exp/eval/expr.go --- a/libgo/go/exp/eval/expr.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/exp/eval/expr.go Sun Jun 13 22:20:07 2010 -0700 @@ -6,6 +6,7 @@ import ( "bignum" + "fmt" "go/ast" "go/token" "log" @@ -340,7 +341,7 @@ temp := b.DefineTemp(a.rmt) tempIdx := temp.Index if tempIdx < 0 { - panicln("tempidx", tempIdx) + panic(fmt.Sprintln("tempidx", tempIdx)) } if a.isMapUnpack { rf := a.rs[0].evalMapValue @@ -655,7 +656,7 @@ return ei.compileUnaryExpr(x.Op, v) } log.Crashf("unexpected ast node type %T", x) - panic() + panic("unreachable") typeexpr: if !callCtx { @@ -717,7 +718,7 @@ return nil } log.Crashf("name %s has unknown type %T", name, def) - panic() + panic("unreachable") } func (a *exprInfo) compileVariable(level int, v *Variable) *expr { @@ -1388,12 +1389,12 @@ expr.eval = func(*Thread) Value { return t.Zero() } return expr - case panicType, paniclnType, printType, printlnType: + case panicType, printType, printlnType: evals := make([]func(*Thread) interface{}, len(as)) for i, x := range as { evals[i] = x.asInterface() } - spaces := ft == paniclnType || ft == printlnType + spaces := ft == printlnType newline := ft != printType printer := func(t *Thread) { for i, eval := range evals { @@ -1427,7 +1428,7 @@ } expr := a.newExpr(EmptyType, "print") expr.exec = printer - if ft == panicType || ft == paniclnType { + if ft == panicType { expr.exec = func(t *Thread) { printer(t) t.Abort(os.NewError("panic")) @@ -1437,7 +1438,7 @@ } log.Crashf("unexpected built-in function '%s'", ft.builtin) - panic() + panic("unreachable") } func (a *exprInfo) compileStarExpr(v *expr) *expr { diff -r d56422877227 libgo/go/exp/eval/expr1.go --- a/libgo/go/exp/eval/expr1.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/exp/eval/expr1.go Sun Jun 13 22:20:07 2010 -0700 @@ -76,7 +76,7 @@ default: log.Crashf("unexpected expression node type %T at %v", a.eval, a.pos) } - panic() + panic("fail") } /* @@ -214,26 +214,17 @@ switch a.t.lit().(type) { case *uintType: vf := v.asUint() - a.eval = func(t *Thread) uint64 { - v := vf(t) - return -v - } + a.eval = func(t *Thread) uint64 { v := vf(t); return -v } case *intType: vf := v.asInt() - a.eval = func(t *Thread) int64 { - v := vf(t) - return -v - } + a.eval = func(t *Thread) int64 { v := vf(t); return -v } case *idealIntType: v := v.asIdealInt()() val := v.Neg() a.eval = func() *bignum.Integer { return val } case *floatType: vf := v.asFloat() - a.eval = func(t *Thread) float64 { - v := vf(t) - return -v - } + a.eval = func(t *Thread) float64 { v := vf(t); return -v } case *idealFloatType: v := v.asIdealFloat()() val := v.Neg() @@ -247,10 +238,7 @@ switch a.t.lit().(type) { case *boolType: vf := v.asBool() - a.eval = func(t *Thread) bool { - v := vf(t) - return !v - } + a.eval = func(t *Thread) bool { v := vf(t); return !v } default: log.Crashf("unexpected type %v at %v", a.t, a.pos) } @@ -260,16 +248,10 @@ switch a.t.lit().(type) { case *uintType: vf := v.asUint() - a.eval = func(t *Thread) uint64 { - v := vf(t) - return ^v - } + a.eval = func(t *Thread) uint64 { v := vf(t); return ^v } case *intType: vf := v.asInt() - a.eval = func(t *Thread) int64 { - v := vf(t) - return ^v - } + a.eval = func(t *Thread) int64 { v := vf(t); return ^v } case *idealIntType: v := v.asIdealInt()() val := v.Neg().Sub(bignum.Int(1)) @@ -1909,5 +1891,5 @@ default: log.Crashf("unexpected left operand type %v at %v", lt, r.pos) } - panic() + panic("fail") } diff -r d56422877227 libgo/go/exp/eval/type.go --- a/libgo/go/exp/eval/type.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/exp/eval/type.go Sun Jun 13 22:20:07 2010 -0700 @@ -231,7 +231,7 @@ res := uint64V(0) return &res } - panic("unexpected uint bit count: ", t.Bits) + panic("unexpected uint bit count") } func (t *uintType) minVal() *bignum.Rational { return bignum.Rat(0, 1) } @@ -304,7 +304,7 @@ res := intV(0) return &res } - panic("unexpected int bit count: ", t.Bits) + panic("unexpected int bit count") } func (t *intType) minVal() *bignum.Rational { @@ -390,7 +390,7 @@ res := floatV(0) return &res } - panic("unexpected float bit count: ", t.Bits) + panic("unexpected float bit count") } var maxFloat32Val = bignum.MakeRat(bignum.Int(0xffffff).Shl(127-23), bignum.Nat(1)) @@ -410,7 +410,7 @@ return minFloat64Val } log.Crashf("unexpected floating point bit count: %d", bits) - panic() + panic("unreachable") } func (t *floatType) maxVal() *bignum.Rational { @@ -425,7 +425,7 @@ return maxFloat64Val } log.Crashf("unexpected floating point bit count: %d", bits) - panic() + panic("unreachable") } /* @@ -702,7 +702,6 @@ makeType = &FuncType{builtin: "make"} newType = &FuncType{builtin: "new"} panicType = &FuncType{builtin: "panic"} - paniclnType = &FuncType{builtin: "panicln"} printType = &FuncType{builtin: "print"} printlnType = &FuncType{builtin: "println"} ) @@ -1237,7 +1236,6 @@ universe.DefineConst("make", universePos, makeType, nil) universe.DefineConst("new", universePos, newType, nil) universe.DefineConst("panic", universePos, panicType, nil) - universe.DefineConst("panicln", universePos, paniclnType, nil) universe.DefineConst("print", universePos, printType, nil) universe.DefineConst("println", universePos, printlnType, nil) } diff -r d56422877227 libgo/go/exp/ogle/rvalue.go --- a/libgo/go/exp/ogle/rvalue.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/exp/ogle/rvalue.go Sun Jun 13 22:20:07 2010 -0700 @@ -232,7 +232,7 @@ case 8: return v.r.p.ToFloat64(bits) } - panic("Unexpected float size ", v.size) + panic("Unexpected float size") } func (v remoteFloat) Set(t *eval.Thread, x float64) { @@ -247,7 +247,7 @@ case 8: bits = v.r.p.FromFloat64(x) default: - panic("Unexpected float size ", v.size) + panic("Unexpected float size") } v.r.Set(a, v.size, bits) } diff -r d56422877227 libgo/go/exp/ogle/vars.go --- a/libgo/go/exp/ogle/vars.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/exp/ogle/vars.go Sun Jun 13 22:20:07 2010 -0700 @@ -63,7 +63,7 @@ } t.Abort(NotOnStack{v.fn, g}) - panic() + panic("fail") } func (v remoteFramePtr) Set(t *eval.Thread, x eval.Value) { diff -r d56422877227 libgo/go/exp/parser/parser.go --- a/libgo/go/exp/parser/parser.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/exp/parser/parser.go Sun Jun 13 22:20:07 2010 -0700 @@ -1624,7 +1624,7 @@ return &ast.ForStmt{pos, s1, p.makeExpr(s2), s3, body} } - panic() // unreachable + panic("unreachable") // unreachable return nil } diff -r d56422877227 libgo/go/go/ast/walk.go --- a/libgo/go/go/ast/walk.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/go/ast/walk.go Sun Jun 13 22:20:07 2010 -0700 @@ -326,7 +326,7 @@ default: fmt.Printf("ast.Walk: unexpected type %T", n) - panic() + panic("ast.Walk") } v.Visit(nil) diff -r d56422877227 libgo/go/go/parser/parser.go --- a/libgo/go/go/parser/parser.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/go/parser/parser.go Sun Jun 13 22:20:07 2010 -0700 @@ -1743,8 +1743,7 @@ return &ast.ForStmt{pos, s1, p.makeExpr(s2), s3, body} } - panic() // unreachable - return nil + panic("unreachable") } diff -r d56422877227 libgo/go/go/printer/printer.go --- a/libgo/go/go/printer/printer.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/go/printer/printer.go Sun Jun 13 22:20:07 2010 -0700 @@ -105,7 +105,7 @@ if debug { fmt.Print(p.pos.String() + ": ") fmt.Println(msg) - panic() + panic("go/printer") } } @@ -770,7 +770,8 @@ next = x // accurate position of next item } default: - panicln("print: unsupported argument type", f.Type().String()) + fmt.Fprintf(os.Stderr, "print: unsupported argument type %T\n", f) + panic("go/printer type") } p.pos = next diff -r d56422877227 libgo/go/gob/decode.go --- a/libgo/go/gob/decode.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/gob/decode.go Sun Jun 13 22:20:07 2010 -0700 @@ -777,7 +777,7 @@ case unsafe.Sizeof(float64(0)): op = decFloat64 default: - panic("gob: unknown size of float", unsafe.Sizeof(float(0))) + panic("gob: unknown size of float") } decOpMap[valueKind(float(0))] = op @@ -791,7 +791,7 @@ op = decInt64 uop = decUint64 default: - panic("gob: unknown size of int/uint", unsafe.Sizeof(int(0))) + panic("gob: unknown size of int/uint") } decOpMap[valueKind(int(0))] = op decOpMap[valueKind(uint(0))] = uop @@ -803,7 +803,7 @@ case unsafe.Sizeof(uint64(0)): uop = decUint64 default: - panic("gob: unknown size of uintptr", unsafe.Sizeof(uintptr(0))) + panic("gob: unknown size of uintptr") } decOpMap[valueKind(uintptr(0))] = uop } diff -r d56422877227 libgo/go/gob/encode.go --- a/libgo/go/gob/encode.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/gob/encode.go Sun Jun 13 22:20:07 2010 -0700 @@ -399,7 +399,7 @@ func compileEnc(rt reflect.Type) (*encEngine, os.Error) { srt, ok := rt.(*reflect.StructType) if !ok { - panicln("can't happen: non-struct") + panic("can't happen: non-struct") } engine := new(encEngine) engine.instr = make([]encInstr, srt.NumField()+1) // +1 for terminator diff -r d56422877227 libgo/go/gob/type.go --- a/libgo/go/gob/type.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/gob/type.go Sun Jun 13 22:20:07 2010 -0700 @@ -114,7 +114,7 @@ // Move the id space upwards to allow for growth in the predefined world // without breaking existing files. if nextId > firstUserId { - panicln("nextId too large:", nextId) + panic(fmt.Sprintln("nextId too large:", nextId)) } nextId = firstUserId } @@ -303,7 +303,7 @@ func checkId(want, got typeId) { if want != got { - panicln("bootstrap type wrong id:", got.Name(), got, "not", want) + panic("bootstrap type wrong id: " + got.Name() + " " + got.string() + " not " + want.string()) } } @@ -312,7 +312,7 @@ rt := reflect.Typeof(e) _, present := types[rt] if present { - panicln("bootstrap type already present:", name) + panic("bootstrap type already present: " + name) } typ := &commonType{name: name} types[rt] = typ @@ -356,7 +356,7 @@ // typeLock must be held. func getTypeInfo(rt reflect.Type) (*typeInfo, os.Error) { if _, ok := rt.(*reflect.PtrType); ok { - panicln("pointer type in getTypeInfo:", rt.String()) + panic("pointer type in getTypeInfo: " + rt.String()) } info, ok := typeInfoMap[rt] if !ok { @@ -388,7 +388,7 @@ func mustGetTypeInfo(rt reflect.Type) *typeInfo { t, err := getTypeInfo(rt) if err != nil { - panicln("getTypeInfo:", err.String()) + panic("getTypeInfo: " + err.String()) } return t } diff -r d56422877227 libgo/go/gob/type_test.go --- a/libgo/go/gob/type_test.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/gob/type_test.go Sun Jun 13 22:20:07 2010 -0700 @@ -28,7 +28,7 @@ defer typeLock.Unlock() t, err := getType(name, rt) if err != nil { - panicln("getTypeUnlocked:", err.String()) + panic("getTypeUnlocked: " + err.String()) } return t } diff -r d56422877227 libgo/go/http/lex.go --- a/libgo/go/http/lex.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/http/lex.go Sun Jun 13 22:20:07 2010 -0700 @@ -14,20 +14,16 @@ switch c { case '(', ')', '<', '>', '@', ',', ';', ':', '\\', '"', '/', '[', ']', '?', '=', '{', '}', ' ', '\t': return true - default: - return false } - panic() + return false } func isSpace(c byte) bool { switch c { case ' ', '\t', '\r', '\n': return true - default: - return false } - panic() + return false } func isCtl(c byte) bool { return (0 <= c && c <= 31) || c == 127 } diff -r d56422877227 libgo/go/http/server.go --- a/libgo/go/http/server.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/http/server.go Sun Jun 13 22:20:07 2010 -0700 @@ -508,7 +508,7 @@ // Handle registers the handler for the given pattern. func (mux *ServeMux) Handle(pattern string, handler Handler) { if pattern == "" || pattern[0] != '/' { - panicln("http: invalid pattern", pattern) + panic("http: invalid pattern " + pattern) } mux.m[pattern] = handler diff -r d56422877227 libgo/go/net/fd.go --- a/libgo/go/net/fd.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/net/fd.go Sun Jun 13 22:20:07 2010 -0700 @@ -11,6 +11,7 @@ "os" "sync" "syscall" + "time" ) // Network file descriptor. @@ -128,7 +129,7 @@ return } if err := s.poll.AddFD(intfd, mode, false); err != nil { - panicln("pollServer AddFD ", intfd, ": ", err.String(), "\n") + panic("pollServer AddFD " + err.String()) return } @@ -176,12 +177,7 @@ } func (s *pollServer) Now() int64 { - sec, nsec, err := os.Time() - if err != nil { - panic("net: os.Time: ", err.String()) - } - nsec += sec * 1e9 - return nsec + return time.Nanoseconds() } func (s *pollServer) CheckDeadlines() { diff -r d56422877227 libgo/go/net/unixsock.go --- a/libgo/go/net/unixsock.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/net/unixsock.go Sun Jun 13 22:20:07 2010 -0700 @@ -25,7 +25,7 @@ var la, ra syscall.Sockaddr switch mode { default: - panic("unixSocket", mode) + panic("unixSocket mode " + mode) case "dial": if laddr != nil { diff -r d56422877227 libgo/go/reflect/tostring_test.go --- a/libgo/go/reflect/tostring_test.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/reflect/tostring_test.go Sun Jun 13 22:20:07 2010 -0700 @@ -111,7 +111,7 @@ v := val return typ.String() + "(" + strconv.Itoa64(int64(v.Get())) + ")" default: - panicln("valueToString: can't print type ", typ.String()) + panic("valueToString: can't print type " + typ.String()) } return "valueToString: can't happen" } diff -r d56422877227 libgo/go/reflect/type.go --- a/libgo/go/reflect/type.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/reflect/type.go Sun Jun 13 22:20:07 2010 -0700 @@ -668,7 +668,7 @@ case *runtime.StructType: return (*StructType)(unsafe.Pointer(v)) } - panicln("toType", i) + panic("toType") } // Convert pointer to runtime Type structure to our Type structure. @@ -732,7 +732,7 @@ case runtime.StructTypeCode: r = (*StructType)(unsafe.Pointer(v)) default: - panicln("runtimeToType", v) + panic("runtimeToType") } return canonicalize(r) } diff -r d56422877227 libgo/go/reflect/value.go --- a/libgo/go/reflect/value.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/reflect/value.go Sun Jun 13 22:20:07 2010 -0700 @@ -503,7 +503,7 @@ func typesMustMatch(t1, t2 Type) { if t1 != t2 { - panicln("type mismatch:", t1.String(), "!=", t2.String()) + panic("type mismatch: " + t1.String() + " != " + t2.String()) } } @@ -571,7 +571,7 @@ typ := v.typ.(*ArrayType).Elem() n := v.Len() if i < 0 || i >= n { - panic("index", i, "in array len", n) + panic("array index out of bounds") } p := addr(uintptr(v.addr()) + uintptr(i)*typ.Size()) return newValue(typ, p, v.canSet) @@ -612,7 +612,7 @@ func (v *SliceValue) SetLen(n int) { s := v.slice() if n < 0 || n > int(s.Cap) { - panicln("SetLen", n, "with capacity", s.Cap) + panic("reflect: slice length out of range in SetLen") } s.Len = n } @@ -642,7 +642,7 @@ func (v *SliceValue) Slice(beg, end int) *SliceValue { cap := v.Cap() if beg < 0 || end < beg || end > cap { - panic("slice bounds [", beg, ":", end, "] with capacity ", cap) + panic("slice index out of bounds") } typ := v.typ.(*SliceType) s := new(SliceHeader) @@ -657,7 +657,7 @@ typ := v.typ.(*SliceType).Elem() n := v.Len() if i < 0 || i >= n { - panicln("index", i, "in array of length", n) + panic("reflect: slice index out of range") } p := addr(uintptr(v.addr()) + uintptr(i)*typ.Size()) return newValue(typ, p, v.canSet) @@ -985,7 +985,7 @@ j++ } if j >= xmc { - panicln("no method", vm.Name) + panic("no method" + vm.Name) } } pv[1] = addr(&methods[0]) @@ -1342,7 +1342,7 @@ case *UnsafePointerType: return (*UnsafePointerValue)(v) } - panicln("newValue", typ.String()) + panic("newValue" + typ.String()) } // MakeZero returns a zero Value for the specified Type. diff -r d56422877227 libgo/go/regexp/regexp.go --- a/libgo/go/regexp/regexp.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/regexp/regexp.go Sun Jun 13 22:20:07 2010 -0700 @@ -673,7 +673,7 @@ func MustCompile(str string) *Regexp { regexp, error := Compile(str) if error != nil { - panicln(`regexp: compiling "`, str, `": `, error.String()) + panic(`regexp: compiling "` + str + `": ` + error.String()) } return regexp } diff -r d56422877227 libgo/go/rpc/client.go --- a/libgo/go/rpc/client.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/rpc/client.go Sun Jun 13 22:20:07 2010 -0700 @@ -61,7 +61,7 @@ client.enc.Encode(request) err := client.enc.Encode(c.Args) if err != nil { - panicln("rpc: client encode error:", err.String()) + panic("rpc: client encode error: " + err.String()) } client.sending.Unlock() } diff -r d56422877227 libgo/go/rpc/server_test.go --- a/libgo/go/rpc/server_test.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/rpc/server_test.go Sun Jun 13 22:20:07 2010 -0700 @@ -49,7 +49,7 @@ } func (t *Arith) Error(args *Args, reply *Reply) os.Error { - panicln("ERROR") + panic("ERROR") } func startServer() { diff -r d56422877227 libgo/go/runtime/error.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libgo/go/runtime/error.go Sun Jun 13 22:20:07 2010 -0700 @@ -0,0 +1,131 @@ +// Copyright 2010 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 runtime + +// The Error interface identifies a run time error. +type Error interface { + String() string + + // RuntimeError is a no-op function but + // serves to distinguish types that are runtime + // errors from ordinary os.Errors: a type is a + // runtime error if it has a RuntimeError method. + RuntimeError() +} + +// A TypeAssertionError explains a failed type assertion. +type TypeAssertionError struct { + interfaceType *Type // interface had this type + concreteType *Type // concrete value had this type + assertedType *Type // asserted type + interfaceString string + concreteString string + assertedString string + missingMethod string // one method needed by Interface, missing from Concrete +} + +func (*TypeAssertionError) RuntimeError() {} + +func (e *TypeAssertionError) String() string { + inter := e.interfaceString + if inter == "" { + inter = "interface" + } + if e.concreteType == nil { + return "interface conversion: " + inter + " is nil, not " + e.assertedString + } + if e.missingMethod == "" { + return "interface conversion: " + inter + " is " + e.concreteString + + ", not " + e.assertedString + } + return "interface conversion: " + e.concreteString + " is not " + e.assertedString + + ": missing method " + e.missingMethod +} + +// Concrete returns the type of the concrete value in the failed type assertion. +// If the interface value was nil, Concrete returns nil. +func (e *TypeAssertionError) Concrete() *Type { + return e.concreteType +} + +// Asserted returns the type incorrectly asserted by the type assertion. +func (e *TypeAssertionError) Asserted() *Type { + return e.assertedType +} + +// If the type assertion is to an interface type, MissingMethod returns the +// name of a method needed to satisfy that interface type but not implemented +// by Concrete. If there are multiple such methods, +// MissingMethod returns one; which one is unspecified. +// If the type assertion is not to an interface type, MissingMethod returns an empty string. +func (e *TypeAssertionError) MissingMethod() string { + return e.missingMethod +} + +// For calling from C. +func NewTypeAssertionError(pt1, pt2, pt3 *Type, ps1, ps2, ps3 *string, pmeth *string, ret *interface{}) { + var t1, t2, t3 *Type + var s1, s2, s3, meth string + + if pt1 != nil { + t1 = pt1 + } + if pt2 != nil { + t2 = pt2 + } + if pt3 != nil { + t3 = pt3 + } + if ps1 != nil { + s1 = *ps1 + } + if ps2 != nil { + s2 = *ps2 + } + if ps3 != nil { + s3 = *ps3 + } + if pmeth != nil { + meth = *pmeth + } + *ret = &TypeAssertionError{t1, t2, t3, s1, s2, s3, meth} +} + +// An errorString represents a runtime error described by a single string. +type errorString string + +func (e errorString) RuntimeError() {} + +func (e errorString) String() string { + return "runtime error: " + string(e) +} + +// For calling from C. +func NewErrorString(s string, ret *interface{}) { + *ret = errorString(s) +} + +type stringer interface { + String() string +} + +// For calling from C. +// Prints an argument passed to panic. +// There's room for arbitrary complexity here, but we keep it +// simple and handle just a few important cases: int, string, and Stringer. +func Printany(i interface{}) { + switch v := i.(type) { + case nil: + print("nil") + case stringer: + print(v.String()) + case int: + print(v) + case string: + print(v) + default: + print(i) + } +} diff -r d56422877227 libgo/go/strconv/fp_test.go --- a/libgo/go/strconv/fp_test.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/strconv/fp_test.go Sun Jun 13 22:20:07 2010 -0700 @@ -96,7 +96,7 @@ func TestFp(t *testing.T) { f, err := os.Open("testfp.txt", os.O_RDONLY, 0) if err != nil { - panicln("testfp: open testfp.txt:", err.String()) + t.Fatal("testfp: open testfp.txt:", err.String()) } defer f.Close() @@ -109,7 +109,7 @@ break } if err2 != nil { - panicln("testfp: read testfp.txt:", err2.String()) + t.Fatal("testfp: read testfp.txt: " + err2.String()) } line = line[0 : len(line)-1] lineno++ diff -r d56422877227 libgo/go/strconv/ftoa_test.go --- a/libgo/go/strconv/ftoa_test.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/strconv/ftoa_test.go Sun Jun 13 22:20:07 2010 -0700 @@ -101,7 +101,8 @@ func TestFtoa(t *testing.T) { if FloatSize != 32 { - panic("floatsize: ", FloatSize) + println("floatsize: ", FloatSize) + panic("floatsize") } for i := 0; i < len(ftoatests); i++ { test := &ftoatests[i] diff -r d56422877227 libgo/go/tabwriter/tabwriter_test.go --- a/libgo/go/tabwriter/tabwriter_test.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/tabwriter/tabwriter_test.go Sun Jun 13 22:20:07 2010 -0700 @@ -31,7 +31,7 @@ b.a[n+i] = buf[i] } } else { - panicln("buffer.Write: buffer too small", n, m, cap(b.a)) + panic("buffer.Write: buffer too small") } return len(buf), nil } diff -r d56422877227 libgo/go/template/template.go --- a/libgo/go/template/template.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/template/template.go Sun Jun 13 22:20:07 2010 -0700 @@ -964,7 +964,7 @@ func MustParse(s string, fmap FormatterMap) *Template { t, err := Parse(s, fmap) if err != nil { - panic("template parse error: ", err.String()) + panic("template.MustParse error: " + err.String()) } return t } diff -r d56422877227 libgo/go/testing/regexp.go --- a/libgo/go/testing/regexp.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/testing/regexp.go Sun Jun 13 22:20:07 2010 -0700 @@ -624,7 +624,7 @@ func MustCompile(str string) *Regexp { regexp, error := CompileRegexp(str) if error != "" { - panicln(`regexp: compiling "`, str, `": `, error) + panic(`regexp: compiling "` + str + `": ` + error) } return regexp } diff -r d56422877227 libgo/go/time/time.go --- a/libgo/go/time/time.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/time/time.go Sun Jun 13 22:20:07 2010 -0700 @@ -15,7 +15,7 @@ func Seconds() int64 { sec, _, err := os.Time() if err != nil { - panic("time: os.Time: ", err.String()) + panic(err) } return sec } @@ -25,7 +25,7 @@ func Nanoseconds() int64 { sec, nsec, err := os.Time() if err != nil { - panic("time: os.Time: ", err.String()) + panic(err) } return sec*1e9 + nsec } diff -r d56422877227 libgo/go/websocket/client.go --- a/libgo/go/websocket/client.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/websocket/client.go Sun Jun 13 22:20:07 2010 -0700 @@ -55,14 +55,14 @@ func main() { ws, err := websocket.Dial("ws://localhost/ws", "", "http://localhost/"); if err != nil { - panic("Dial: ", err.String()) + panic("Dial: " + err.String()) } if _, err := ws.Write(strings.Bytes("hello, world!\n")); err != nil { - panic("Write: ", err.String()) + panic("Write: " + err.String()) } var msg = make([]byte, 512); if n, err := ws.Read(msg); err != nil { - panic("Read: ", err.String()) + panic("Read: " + err.String()) } // use msg[0:n] } diff -r d56422877227 libgo/go/websocket/server.go --- a/libgo/go/websocket/server.go Sat Jun 05 10:17:15 2010 -0700 +++ b/libgo/go/websocket/server.go Sun Jun 13 22:20:07 2010 -0700 @@ -30,7 +30,7 @@ http.Handle("/echo", websocket.Handler(EchoServer)); err := http.ListenAndServe(":12345", nil); if err != nil { - panic("ListenAndServe: ", err.String()) + panic("ListenAndServe: " + err.String()) } } */ @@ -62,7 +62,7 @@ rwc, buf, err := c.Hijack() if err != nil { - panic("Hijack failed: ", err.String()) + panic("Hijack failed: " + err.String()) return } defer rwc.Close()