summaryrefslogtreecommitdiff
path: root/usr/austin/eval/expr.go
diff options
context:
space:
mode:
authorAustin Clements <aclements@csail.mit.edu>2009-09-01 14:16:51 -0700
committerAustin Clements <aclements@csail.mit.edu>2009-09-01 14:16:51 -0700
commit369a523fd9053f42844adc08022d88afbed6abb0 (patch)
tree8101565884e509b5ff546c384fd4f3044fc3e55b /usr/austin/eval/expr.go
parent2e5dec38909370ea00882a8c74c864f3bea18400 (diff)
downloadgolang-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.go61
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;
}