mirror of
https://github.com/golang/go.git
synced 2025-05-19 06:14:40 +00:00
* generate different versions of binary operators for each size of int and float, so that proper truncating happens after each operation to simulate the various sized ops. * add slice expressions * publish World.CompileStmtList, CompileDeclList, CompileExpr * handle type-less expressions in CompileExpr R=austin DELTA=1459 (1327 added, 11 deleted, 121 changed) OCL=34382 CL=35581
92 lines
1.7 KiB
Go
92 lines
1.7 KiB
Go
// 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.
|
|
|
|
package eval
|
|
|
|
import (
|
|
"fmt";
|
|
"os";
|
|
"runtime";
|
|
)
|
|
|
|
// Abort aborts the thread's current computation,
|
|
// causing the innermost Try to return err.
|
|
func (t *Thread) Abort(err os.Error) {
|
|
if t.abort == nil {
|
|
panicln("abort:", err.String());
|
|
}
|
|
t.abort <- err;
|
|
runtime.Goexit();
|
|
}
|
|
|
|
// Try executes a computation; if the computation
|
|
// Aborts, Try returns the error passed to abort.
|
|
func (t *Thread) Try(f func(t *Thread)) os.Error {
|
|
oc := t.abort;
|
|
c := make(chan os.Error);
|
|
t.abort = c;
|
|
go func() {
|
|
f(t);
|
|
c <- nil;
|
|
}();
|
|
err := <-c;
|
|
t.abort = oc;
|
|
return err;
|
|
}
|
|
|
|
type DivByZeroError struct {}
|
|
|
|
func (DivByZeroError) String() string {
|
|
return "divide by zero";
|
|
}
|
|
|
|
type NilPointerError struct {}
|
|
|
|
func (NilPointerError) String() string {
|
|
return "nil pointer dereference";
|
|
}
|
|
|
|
type IndexError struct {
|
|
Idx, Len int64;
|
|
}
|
|
|
|
func (e IndexError) String() string {
|
|
if e.Idx < 0 {
|
|
return fmt.Sprintf("negative index: %d", e.Idx);
|
|
}
|
|
return fmt.Sprintf("index %d exceeds length %d", e.Idx, e.Len);
|
|
}
|
|
|
|
type SliceError struct {
|
|
Lo, Hi, Cap int64;
|
|
}
|
|
|
|
func (e SliceError) String() string {
|
|
return fmt.Sprintf("slice [%d:%d]; cap %d", e.Lo, e.Hi, e.Cap);
|
|
}
|
|
|
|
type KeyError struct {
|
|
Key interface {};
|
|
}
|
|
|
|
func (e KeyError) String() string {
|
|
return fmt.Sprintf("key '%v' not found in map", e.Key);
|
|
}
|
|
|
|
type NegativeLengthError struct {
|
|
Len int64;
|
|
}
|
|
|
|
func (e NegativeLengthError) String() string {
|
|
return fmt.Sprintf("negative length: %d", e.Len);
|
|
}
|
|
|
|
type NegativeCapacityError struct {
|
|
Len int64;
|
|
}
|
|
|
|
func (e NegativeCapacityError) String() string {
|
|
return fmt.Sprintf("negative capacity: %d", e.Len);
|
|
}
|