diff options
author | Austin Clements <aclements@csail.mit.edu> | 2009-09-01 14:16:51 -0700 |
---|---|---|
committer | Austin Clements <aclements@csail.mit.edu> | 2009-09-01 14:16:51 -0700 |
commit | 369a523fd9053f42844adc08022d88afbed6abb0 (patch) | |
tree | 8101565884e509b5ff546c384fd4f3044fc3e55b /usr/austin/eval/expr.go | |
parent | 2e5dec38909370ea00882a8c74c864f3bea18400 (diff) | |
download | golang-369a523fd9053f42844adc08022d88afbed6abb0.tar.gz |
Clean up the statement and expression public interfaces. The
only visible change is that evaluating an expression returns a
interface{} instead of a Value.
R=rsc
APPROVED=rsc
DELTA=60 (15 added, 26 deleted, 19 changed)
OCL=34206
CL=34208
Diffstat (limited to 'usr/austin/eval/expr.go')
-rw-r--r-- | usr/austin/eval/expr.go | 61 |
1 files changed, 25 insertions, 36 deletions
diff --git a/usr/austin/eval/expr.go b/usr/austin/eval/expr.go index bf30d11a7..edcdcddcf 100644 --- a/usr/austin/eval/expr.go +++ b/usr/austin/eval/expr.go @@ -131,7 +131,7 @@ func (a *expr) asMulti() (func(f *Frame) []Value) { return a.eval.(func(*Frame)[]Value) } -func (a *expr) asInterface() (func(f *Frame) interface{}) { +func (a *expr) asInterface() (func(f *Frame) interface {}) { switch sf := a.eval.(type) { case func(*Frame)bool: return func(f *Frame) interface{} { return sf(f) }; @@ -139,19 +139,30 @@ func (a *expr) asInterface() (func(f *Frame) interface{}) { return func(f *Frame) interface{} { return sf(f) }; case func(*Frame)int64: return func(f *Frame) interface{} { return sf(f) }; + case func()*bignum.Integer: + return func(f *Frame) interface{} { return sf() }; case func(*Frame)float64: return func(f *Frame) interface{} { return sf(f) }; + case func()*bignum.Rational: + return func(f *Frame) interface{} { return sf() }; case func(*Frame)string: return func(f *Frame) interface{} { return sf(f) }; + case func(*Frame)ArrayValue: + return func(f *Frame) interface{} { return sf(f) }; + case func(*Frame)StructValue: + return func(f *Frame) interface{} { return sf(f) }; case func(*Frame)Value: return func(f *Frame) interface{} { return sf(f) }; case func(*Frame)Func: return func(f *Frame) interface{} { return sf(f) }; + case func(*Frame)Slice: + return func(f *Frame) interface{} { return sf(f) }; case func(*Frame)Map: return func(f *Frame) interface{} { return sf(f) }; - default: - log.Crashf("unexpected expression node type %v at %v", a.t, a.pos); + case func(*Frame)[]Value: + return func(f *Frame) interface{} { return sf(f) }; } + log.Crashf("unexpected expression node type %v at %v", a.t, a.pos); panic(); } @@ -1918,18 +1929,22 @@ func (a *expr) extractEffect(b *block, errOp string) (func(f *Frame), *expr) { } /* - * Testing interface + * Public interface */ type Expr struct { t Type; - f func(f *Frame, out Value); + f func(f *Frame) interface{}; } -func (expr *Expr) Eval(f *Frame) (Value, os.Error) { - v := expr.t.Zero(); - err := Try(func() {expr.f(f, v)}); - return v, err; +func (expr *Expr) Type() Type { + return expr.t; +} + +func (expr *Expr) Eval(f *Frame) (interface{}, os.Error) { + var res interface{}; + err := Try(func() {res = expr.f(f)}); + return res, err; } func CompileExpr(scope *Scope, expr ast.Expr) (*Expr, os.Error) { @@ -1940,31 +1955,5 @@ func CompileExpr(scope *Scope, expr ast.Expr) (*Expr, os.Error) { if ec == nil { return nil, errors.GetError(scanner.Sorted); } - t := ec.t; - switch e := ec.eval.(type) { - case func(*Frame)bool: - return &Expr{t, func(f *Frame, out Value) { out.(BoolValue).Set(e(f)) }}, nil; - case func(*Frame)uint64: - return &Expr{t, func(f *Frame, out Value) { out.(UintValue).Set(e(f)) }}, nil; - case func(*Frame)int64: - return &Expr{t, func(f *Frame, out Value) { out.(IntValue).Set(e(f)) }}, nil; - case func()*bignum.Integer: - return &Expr{t, func(f *Frame, out Value) { out.(*idealIntV).V = e() }}, nil; - case func(*Frame)float64: - return &Expr{t, func(f *Frame, out Value) { out.(FloatValue).Set(e(f)) }}, nil; - case func()*bignum.Rational: - return &Expr{t, func(f *Frame, out Value) { out.(*idealFloatV).V = e() }}, nil; - case func(*Frame)string: - return &Expr{t, func(f *Frame, out Value) { out.(StringValue).Set(e(f)) }}, nil; - case func(*Frame)ArrayValue: - return &Expr{t, func(f *Frame, out Value) { out.(ArrayValue).Assign(e(f)) }}, nil; - case func(*Frame)Value: - return &Expr{t, func(f *Frame, out Value) { out.(PtrValue).Set(e(f)) }}, nil; - case func(*Frame)Func: - return &Expr{t, func(f *Frame, out Value) { out.(FuncValue).Set(e(f)) }}, nil; - case func(*Frame)Slice: - return &Expr{t, func(f *Frame, out Value) { out.(SliceValue).Set(e(f)) }}, nil; - } - log.Crashf("unexpected type %v", ec.t); - panic(); + return &Expr{ec.t, ec.asInterface()}, nil; } |