// Map index expressions permit special forms of assignment,
// for which we need to know the Map and key.
- evalMapValue func(f *Frame) (Map, interface{});
+ evalMapValue func(t *Thread) (Map, interface{});
// Evaluate to the "address of" this value; that is, the
// settable Value object. nil for expressions whose address
// cannot be taken.
- evalAddr func(f *Frame) Value;
+ evalAddr func(t *Thread) Value;
// Execute this expression as a statement. Only expressions
// that are valid expression statements should set this.
- exec func(f *Frame);
+ exec func(t *Thread);
// If this expression is a type, this is its compiled type.
// This is only permitted in the function position of a call
n, d := rat.Value();
f := n.Quo(bignum.MakeInt(false, d));
v := f.Abs().Value();
- res.eval = func(*Frame) uint64 { return v };
+ res.eval = func(*Thread) uint64 { return v };
case *intType:
n, d := rat.Value();
f := n.Quo(bignum.MakeInt(false, d));
v := f.Value();
- res.eval = func(*Frame) int64 { return v };
+ res.eval = func(*Thread) int64 { return v };
case *idealIntType:
n, d := rat.Value();
f := n.Quo(bignum.MakeInt(false, d));
case *floatType:
n, d := rat.Value();
v := float64(n.Value())/float64(d.Value());
- res.eval = func(*Frame) float64 { return v };
+ res.eval = func(*Thread) float64 { return v };
case *idealFloatType:
res.eval = func() *bignum.Rational { return rat };
default:
// Convert to int
na := a.newExpr(IntType, a.desc);
af := a.asUint();
- na.eval = func(f *Frame) int64 {
- return int64(af(f));
+ na.eval = func(t *Thread) int64 {
+ return int64(af(t));
};
return na;
// a function that expects an l-value and the frame in which to
// evaluate the RHS expressions. The l-value must have exactly the
// type given by lt. Returns nil if type checking fails.
-func (a *assignCompiler) compile(b *block, lt Type) (func(lv Value, f *Frame)) {
+func (a *assignCompiler) compile(b *block, lt Type) (func(Value, *Thread)) {
lmt, isMT := lt.(*MultiType);
rmt, isUnpack := a.rmt, a.isUnpack;
// multi-value and replace the RHS with expressions to pull
// out values from the temporary. Technically, this is only
// necessary when we need to perform assignment conversions.
- var effect func(f *Frame);
+ var effect func(*Thread);
if isUnpack {
// This leaks a slot, but is definitely safe.
temp := b.DefineSlot(a.rmt);
if a.isMapUnpack {
rf := a.rs[0].evalMapValue;
vt := a.rmt.Elems[0];
- effect = func(f *Frame) {
- m, k := rf(f);
+ effect = func(t *Thread) {
+ m, k := rf(t);
v := m.Elem(k);
found := boolV(true);
if v == nil {
found = boolV(false);
v = vt.Zero();
}
- f.Vars[tempIdx] = multiV([]Value {v, &found});
+ t.f.Vars[tempIdx] = multiV([]Value {v, &found});
};
} else {
rf := a.rs[0].asMulti();
- effect = func(f *Frame) {
- f.Vars[tempIdx] = multiV(rf(f));
+ effect = func(t *Thread) {
+ t.f.Vars[tempIdx] = multiV(rf(t));
};
}
orig := a.rs[0];
}
a.rs[i] = orig.newExpr(t, orig.desc);
index := i;
- a.rs[i].genValue(func(f *Frame) Value { return f.Vars[tempIdx].(multiV)[index] });
+ a.rs[i].genValue(func(t *Thread) Value { return t.f.Vars[tempIdx].(multiV)[index] });
}
}
// Now len(a.rs) == len(a.rmt) and we've reduced any unpacking
rf := a.rs[i].asPtr();
a.rs[i] = a.rs[i].newExpr(lt, a.rs[i].desc);
len := at.Len;
- a.rs[i].eval = func(f *Frame) Slice {
- return Slice{rf(f).(ArrayValue), len, len};
+ a.rs[i].eval = func(t *Thread) Slice {
+ return Slice{rf(t).(ArrayValue), len, len};
};
rt = a.rs[i].t;
}
return genAssign(lt, a.rs[0]);
}
// Case 2 or 3
- as := make([]func(lv Value, f *Frame), len(a.rs));
+ as := make([]func(lv Value, t *Thread), len(a.rs));
for i, r := range a.rs {
as[i] = genAssign(lmt.Elems[i], r);
}
- return func(lv Value, f *Frame) {
+ return func(lv Value, t *Thread) {
if effect != nil {
- effect(f);
+ effect(t);
}
lmv := lv.(multiV);
for i, a := range as {
- a(lmv[i], f);
+ a(lmv[i], t);
}
};
}
// compileAssign compiles an assignment operation without the full
// generality of an assignCompiler. See assignCompiler for a
// description of the arguments.
-func (a *compiler) compileAssign(pos token.Position, b *block, lt Type, rs []*expr, errOp, errPosName string) (func(lv Value, f *Frame)) {
+func (a *compiler) compileAssign(pos token.Position, b *block, lt Type, rs []*expr, errOp, errPosName string) (func(Value, *Thread)) {
ac, ok := a.checkAssign(pos, rs, errOp, errPosName);
if !ok {
return nil;
// TODO(austin) Use unnamed string type.
expr := a.newExpr(StringType, "string literal");
- expr.eval = func(*Frame) string { return s };
+ expr.eval = func(*Thread) string { return s };
return expr;
}
return a.compileString(strings.Join(ss, ""));
}
-func (a *exprInfo) compileFuncLit(decl *FuncDecl, fn func(f *Frame) Func) *expr {
+func (a *exprInfo) compileFuncLit(decl *FuncDecl, fn func(*Thread) Func) *expr {
expr := a.newExpr(decl.Type, "function literal");
expr.eval = fn;
return expr;
}
expr := a.newExpr(ft, "selector expression");
pf := parent.asStruct();
- evalAddr := func(f *Frame) Value {
- return pf(f).Field(index);
+ evalAddr := func(t *Thread) Value {
+ return pf(t).Field(index);
};
expr.genValue(evalAddr);
return sub(expr);
lf := l.asArray();
rf := r.asInt();
bound := lt.Len;
- expr.genValue(func(f *Frame) Value {
- l, r := lf(f), rf(f);
+ expr.genValue(func(t *Thread) Value {
+ l, r := lf(t), rf(t);
if r < 0 || r >= bound {
- Abort(IndexOutOfBounds{r, bound});
+ Abort(IndexError{r, bound});
}
return l.Elem(r);
});
case *SliceType:
lf := l.asSlice();
rf := r.asInt();
- expr.genValue(func(f *Frame) Value {
- l, r := lf(f), rf(f);
+ expr.genValue(func(t *Thread) Value {
+ l, r := lf(t), rf(t);
if l.Base == nil {
- Abort(NilPointer{});
+ Abort(NilPointerError{});
}
if r < 0 || r >= l.Len {
- Abort(IndexOutOfBounds{r, l.Len});
+ Abort(IndexError{r, l.Len});
}
return l.Base.Elem(r);
});
rf := r.asInt();
// TODO(austin) This pulls over the whole string in a
// remote setting, instead of just the one character.
- expr.eval = func(f *Frame) uint64 {
- l, r := lf(f), rf(f);
+ expr.eval = func(t *Thread) uint64 {
+ l, r := lf(t), rf(t);
if r < 0 || r >= int64(len(l)) {
- Abort(IndexOutOfBounds{r, int64(len(l))});
+ Abort(IndexError{r, int64(len(l))});
}
return uint64(l[r]);
}
case *MapType:
lf := l.asMap();
rf := r.asInterface();
- expr.genValue(func(f *Frame) Value {
- m := lf(f);
- k := rf(f);
+ expr.genValue(func(t *Thread) Value {
+ m := lf(t);
+ k := rf(t);
if m == nil {
- Abort(NilPointer{});
+ Abort(NilPointerError{});
}
e := m.Elem(k);
if e == nil {
- Abort(KeyNotFound{k});
+ Abort(KeyError{k});
}
return e;
});
// genValue makes things addressable, but map values
// aren't addressable.
expr.evalAddr = nil;
- expr.evalMapValue = func(f *Frame) (Map, interface{}) {
+ expr.evalMapValue = func(t *Thread) (Map, interface{}) {
// TODO(austin) Key check? nil check?
- return lf(f), rf(f);
+ return lf(t), rf(t);
};
default:
// Compile
lf := l.asFunc();
- call := func(f *Frame) []Value {
- fun := lf(f);
+ call := func(t *Thread) []Value {
+ fun := lf(t);
fr := fun.NewFrame();
for i, t := range vts {
fr.Vars[i] = t.Zero();
}
- assign(multiV(fr.Vars[0:nin]), f);
- fun.Call(fr);
+ assign(multiV(fr.Vars[0:nin]), t);
+ oldf := t.f;
+ t.f = fr;
+ fun.Call(t);
+ t.f = oldf;
return fr.Vars[nin:nin+nout];
};
expr.genFuncCall(call);
// TODO(austin) It would be nice if this could
// be a constant int.
v := t.Len;
- expr.eval = func(f *Frame) int64 {
+ expr.eval = func(t *Thread) int64 {
return v;
};
case *SliceType:
vf := arg.asSlice();
- expr.eval = func(f *Frame) int64 {
- return vf(f).Cap;
+ expr.eval = func(t *Thread) int64 {
+ return vf(t).Cap;
};
//case *ChanType:
switch t := arg.t.lit().(type) {
case *stringType:
vf := arg.asString();
- expr.eval = func(f *Frame) int64 {
- return int64(len(vf(f)));
+ expr.eval = func(t *Thread) int64 {
+ return int64(len(vf(t)));
};
case *ArrayType:
// TODO(austin) It would be nice if this could
// be a constant int.
v := t.Len;
- expr.eval = func(f *Frame) int64 {
+ expr.eval = func(t *Thread) int64 {
return v;
};
case *SliceType:
vf := arg.asSlice();
- expr.eval = func(f *Frame) int64 {
- return vf(f).Len;
+ expr.eval = func(t *Thread) int64 {
+ return vf(t).Len;
};
case *MapType:
vf := arg.asMap();
- expr.eval = func(f *Frame) int64 {
+ expr.eval = func(t *Thread) int64 {
// XXX(Spec) What's the len of an
// uninitialized map?
- m := vf(f);
+ m := vf(t);
if m == nil {
return 0;
}
// arguments? Do they have to be ints? 6g
// accepts any integral type.
var lenexpr, capexpr *expr;
- var lenf, capf func(f *Frame) int64;
+ var lenf, capf func(*Thread) int64;
if len(as) > 1 {
lenexpr = as[1].convertToInt(-1, "length", "make function");
if lenexpr == nil {
}
et := t.Elem;
expr := a.newExpr(t, "function call");
- expr.eval = func(f *Frame) Slice {
- l := lenf(f);
+ expr.eval = func(t *Thread) Slice {
+ l := lenf(t);
// XXX(Spec) What if len or cap is
// negative? The runtime panics.
if l < 0 {
- Abort(NegativeLength{l});
+ Abort(NegativeLengthError{l});
}
c := l;
if capf != nil {
- c = capf(f);
+ c = capf(t);
if c < 0 {
- Abort(NegativeCapacity{c});
+ Abort(NegativeCapacityError{c});
}
// XXX(Spec) What happens if
// len > cap? The runtime
return nil;
}
expr := a.newExpr(t, "function call");
- expr.eval = func(f *Frame) Map {
+ expr.eval = func(t *Thread) Map {
if lenf == nil {
return make(evalMap);
}
- l := lenf(f);
+ l := lenf(t);
return make(evalMap, l);
};
return expr;
case *PtrType:
expr := a.newExpr(vt.Elem, "indirect expression");
vf := v.asPtr();
- expr.genValue(func(f *Frame) Value {
- v := vf(f);
+ expr.genValue(func(t *Thread) Value {
+ v := vf(t);
if v == nil {
- Abort(NilPointer{});
+ Abort(NilPointerError{});
}
return v;
});
case token.AND:
vf := v.evalAddr;
- expr.eval = func(f *Frame) Value { return vf(f) };
+ expr.eval = func(t *Thread) Value { return vf(t) };
default:
log.Crashf("Compilation of unary op %v not implemented", op);
// temporary variable, the caller should create a temporary block for
// the compilation of this expression and the evaluation of the
// results.
-func (a *expr) extractEffect(b *block, errOp string) (func(f *Frame), *expr) {
+func (a *expr) extractEffect(b *block, errOp string) (func(*Thread), *expr) {
// Create "&a" if a is addressable
rhs := a;
if a.evalAddr != nil {
log.Crashf("compileAssign type check failed");
}
- effect := func(f *Frame) {
+ effect := func(t *Thread) {
tempVal := tempType.Zero();
- f.Vars[tempIdx] = tempVal;
- assign(tempVal, f);
+ t.f.Vars[tempIdx] = tempVal;
+ assign(tempVal, t);
};
// Generate "temp" or "*temp"
}
func (expr *Expr) Eval(f *Frame) (Value, os.Error) {
+ t := new(Thread);
+ t.f = f;
switch _ := expr.e.t.(type) {
case *idealIntType:
return &idealIntV{expr.e.asIdealInt()()}, nil;
}
v := expr.e.t.Zero();
eval := genAssign(expr.e.t, expr.e);
- err := Try(func() {eval(v, f)});
+ err := Try(func() {eval(v, t)});
return v, err;
}
// This file is machine generated by gen.go.
-// 6g gen.go && 6l gen.6 && 6.out >expr1.go
+// 6g gen.go && 6l gen.6 && ./6.out >expr1.go
package eval
* "As" functions. These retrieve evaluator functions from an
* expr, panicking if the requested evaluator has the wrong type.
*/
-func (a *expr) asBool() (func(*Frame) bool) {
- return a.eval.(func(*Frame)(bool))
+func (a *expr) asBool() (func(*Thread) bool) {
+ return a.eval.(func(*Thread)(bool))
}
-func (a *expr) asUint() (func(*Frame) uint64) {
- return a.eval.(func(*Frame)(uint64))
+func (a *expr) asUint() (func(*Thread) uint64) {
+ return a.eval.(func(*Thread)(uint64))
}
-func (a *expr) asInt() (func(*Frame) int64) {
- return a.eval.(func(*Frame)(int64))
+func (a *expr) asInt() (func(*Thread) int64) {
+ return a.eval.(func(*Thread)(int64))
}
func (a *expr) asIdealInt() (func() *bignum.Integer) {
return a.eval.(func()(*bignum.Integer))
}
-func (a *expr) asFloat() (func(*Frame) float64) {
- return a.eval.(func(*Frame)(float64))
+func (a *expr) asFloat() (func(*Thread) float64) {
+ return a.eval.(func(*Thread)(float64))
}
func (a *expr) asIdealFloat() (func() *bignum.Rational) {
return a.eval.(func()(*bignum.Rational))
}
-func (a *expr) asString() (func(*Frame) string) {
- return a.eval.(func(*Frame)(string))
+func (a *expr) asString() (func(*Thread) string) {
+ return a.eval.(func(*Thread)(string))
}
-func (a *expr) asArray() (func(*Frame) ArrayValue) {
- return a.eval.(func(*Frame)(ArrayValue))
+func (a *expr) asArray() (func(*Thread) ArrayValue) {
+ return a.eval.(func(*Thread)(ArrayValue))
}
-func (a *expr) asStruct() (func(*Frame) StructValue) {
- return a.eval.(func(*Frame)(StructValue))
+func (a *expr) asStruct() (func(*Thread) StructValue) {
+ return a.eval.(func(*Thread)(StructValue))
}
-func (a *expr) asPtr() (func(*Frame) Value) {
- return a.eval.(func(*Frame)(Value))
+func (a *expr) asPtr() (func(*Thread) Value) {
+ return a.eval.(func(*Thread)(Value))
}
-func (a *expr) asFunc() (func(*Frame) Func) {
- return a.eval.(func(*Frame)(Func))
+func (a *expr) asFunc() (func(*Thread) Func) {
+ return a.eval.(func(*Thread)(Func))
}
-func (a *expr) asSlice() (func(*Frame) Slice) {
- return a.eval.(func(*Frame)(Slice))
+func (a *expr) asSlice() (func(*Thread) Slice) {
+ return a.eval.(func(*Thread)(Slice))
}
-func (a *expr) asMap() (func(*Frame) Map) {
- return a.eval.(func(*Frame)(Map))
+func (a *expr) asMap() (func(*Thread) Map) {
+ return a.eval.(func(*Thread)(Map))
}
-func (a *expr) asMulti() (func(*Frame) []Value) {
- return a.eval.(func(*Frame)[]Value)
+func (a *expr) asMulti() (func(*Thread) []Value) {
+ return a.eval.(func(*Thread)[]Value)
}
-func (a *expr) asInterface() (func(*Frame) interface{}) {
+func (a *expr) asInterface() (func(*Thread) interface{}) {
switch sf := a.eval.(type) {
- case func(*Frame)bool:
- return func(f *Frame) interface{} { return sf(f) }
- case func(*Frame)uint64:
- return func(f *Frame) interface{} { return sf(f) }
- case func(*Frame)int64:
- return func(f *Frame) interface{} { return sf(f) }
- case func(*Frame)*bignum.Integer:
- return func(f *Frame) interface{} { return sf(f) }
- case func(*Frame)float64:
- return func(f *Frame) interface{} { return sf(f) }
- case func(*Frame)*bignum.Rational:
- return func(f *Frame) interface{} { return sf(f) }
- 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) }
+ case func(*Thread)bool:
+ return func(t *Thread) interface{} { return sf(t) }
+ case func(*Thread)uint64:
+ return func(t *Thread) interface{} { return sf(t) }
+ case func(*Thread)int64:
+ return func(t *Thread) interface{} { return sf(t) }
+ case func(*Thread)*bignum.Integer:
+ return func(t *Thread) interface{} { return sf(t) }
+ case func(*Thread)float64:
+ return func(t *Thread) interface{} { return sf(t) }
+ case func(*Thread)*bignum.Rational:
+ return func(t *Thread) interface{} { return sf(t) }
+ case func(*Thread)string:
+ return func(t *Thread) interface{} { return sf(t) }
+ case func(*Thread)ArrayValue:
+ return func(t *Thread) interface{} { return sf(t) }
+ case func(*Thread)StructValue:
+ return func(t *Thread) interface{} { return sf(t) }
+ case func(*Thread)Value:
+ return func(t *Thread) interface{} { return sf(t) }
+ case func(*Thread)Func:
+ return func(t *Thread) interface{} { return sf(t) }
+ case func(*Thread)Slice:
+ return func(t *Thread) interface{} { return sf(t) }
+ case func(*Thread)Map:
+ return func(t *Thread) interface{} { return sf(t) }
default:
log.Crashf("unexpected expression node type %T at %v", a.eval, a.pos);
}
switch _ := a.t.lit().(type) {
case *boolType:
val := v.(BoolValue).Get();
- a.eval = func(f *Frame) bool { return val }
+ a.eval = func(t *Thread) bool { return val }
case *uintType:
val := v.(UintValue).Get();
- a.eval = func(f *Frame) uint64 { return val }
+ a.eval = func(t *Thread) uint64 { return val }
case *intType:
val := v.(IntValue).Get();
- a.eval = func(f *Frame) int64 { return val }
+ a.eval = func(t *Thread) int64 { return val }
case *idealIntType:
val := v.(IdealIntValue).Get();
a.eval = func() *bignum.Integer { return val }
case *floatType:
val := v.(FloatValue).Get();
- a.eval = func(f *Frame) float64 { return val }
+ a.eval = func(t *Thread) float64 { return val }
case *idealFloatType:
val := v.(IdealFloatValue).Get();
a.eval = func() *bignum.Rational { return val }
case *stringType:
val := v.(StringValue).Get();
- a.eval = func(f *Frame) string { return val }
+ a.eval = func(t *Thread) string { return val }
case *ArrayType:
val := v.(ArrayValue).Get();
- a.eval = func(f *Frame) ArrayValue { return val }
+ a.eval = func(t *Thread) ArrayValue { return val }
case *StructType:
val := v.(StructValue).Get();
- a.eval = func(f *Frame) StructValue { return val }
+ a.eval = func(t *Thread) StructValue { return val }
case *PtrType:
val := v.(PtrValue).Get();
- a.eval = func(f *Frame) Value { return val }
+ a.eval = func(t *Thread) Value { return val }
case *FuncType:
val := v.(FuncValue).Get();
- a.eval = func(f *Frame) Func { return val }
+ a.eval = func(t *Thread) Func { return val }
case *SliceType:
val := v.(SliceValue).Get();
- a.eval = func(f *Frame) Slice { return val }
+ a.eval = func(t *Thread) Slice { return val }
case *MapType:
val := v.(MapValue).Get();
- a.eval = func(f *Frame) Map { return val }
+ a.eval = func(t *Thread) Map { return val }
default:
log.Crashf("unexpected constant type %v at %v", a.t, a.pos);
}
}
func (a *expr) genIdentOp(level, index int) {
- a.evalAddr = func(f *Frame) Value { return f.Get(level, index) };
+ a.evalAddr = func(t *Thread) Value { return t.f.Get(level, index) };
switch _ := a.t.lit().(type) {
case *boolType:
- a.eval = func(f *Frame) bool { return f.Get(level, index).(BoolValue).Get() }
+ a.eval = func(t *Thread) bool { return t.f.Get(level, index).(BoolValue).Get() }
case *uintType:
- a.eval = func(f *Frame) uint64 { return f.Get(level, index).(UintValue).Get() }
+ a.eval = func(t *Thread) uint64 { return t.f.Get(level, index).(UintValue).Get() }
case *intType:
- a.eval = func(f *Frame) int64 { return f.Get(level, index).(IntValue).Get() }
+ a.eval = func(t *Thread) int64 { return t.f.Get(level, index).(IntValue).Get() }
case *floatType:
- a.eval = func(f *Frame) float64 { return f.Get(level, index).(FloatValue).Get() }
+ a.eval = func(t *Thread) float64 { return t.f.Get(level, index).(FloatValue).Get() }
case *stringType:
- a.eval = func(f *Frame) string { return f.Get(level, index).(StringValue).Get() }
+ a.eval = func(t *Thread) string { return t.f.Get(level, index).(StringValue).Get() }
case *ArrayType:
- a.eval = func(f *Frame) ArrayValue { return f.Get(level, index).(ArrayValue).Get() }
+ a.eval = func(t *Thread) ArrayValue { return t.f.Get(level, index).(ArrayValue).Get() }
case *StructType:
- a.eval = func(f *Frame) StructValue { return f.Get(level, index).(StructValue).Get() }
+ a.eval = func(t *Thread) StructValue { return t.f.Get(level, index).(StructValue).Get() }
case *PtrType:
- a.eval = func(f *Frame) Value { return f.Get(level, index).(PtrValue).Get() }
+ a.eval = func(t *Thread) Value { return t.f.Get(level, index).(PtrValue).Get() }
case *FuncType:
- a.eval = func(f *Frame) Func { return f.Get(level, index).(FuncValue).Get() }
+ a.eval = func(t *Thread) Func { return t.f.Get(level, index).(FuncValue).Get() }
case *SliceType:
- a.eval = func(f *Frame) Slice { return f.Get(level, index).(SliceValue).Get() }
+ a.eval = func(t *Thread) Slice { return t.f.Get(level, index).(SliceValue).Get() }
case *MapType:
- a.eval = func(f *Frame) Map { return f.Get(level, index).(MapValue).Get() }
+ a.eval = func(t *Thread) Map { return t.f.Get(level, index).(MapValue).Get() }
default:
log.Crashf("unexpected identifier type %v at %v", a.t, a.pos);
}
}
-func (a *expr) genFuncCall(call func(f *Frame) []Value) {
- a.exec = func(f *Frame) { call(f)};
+func (a *expr) genFuncCall(call func(t *Thread) []Value) {
+ a.exec = func(t *Thread) { call(t)};
switch _ := a.t.lit().(type) {
case *boolType:
- a.eval = func(f *Frame) bool { return call(f)[0].(BoolValue).Get() }
+ a.eval = func(t *Thread) bool { return call(t)[0].(BoolValue).Get() }
case *uintType:
- a.eval = func(f *Frame) uint64 { return call(f)[0].(UintValue).Get() }
+ a.eval = func(t *Thread) uint64 { return call(t)[0].(UintValue).Get() }
case *intType:
- a.eval = func(f *Frame) int64 { return call(f)[0].(IntValue).Get() }
+ a.eval = func(t *Thread) int64 { return call(t)[0].(IntValue).Get() }
case *floatType:
- a.eval = func(f *Frame) float64 { return call(f)[0].(FloatValue).Get() }
+ a.eval = func(t *Thread) float64 { return call(t)[0].(FloatValue).Get() }
case *stringType:
- a.eval = func(f *Frame) string { return call(f)[0].(StringValue).Get() }
+ a.eval = func(t *Thread) string { return call(t)[0].(StringValue).Get() }
case *ArrayType:
- a.eval = func(f *Frame) ArrayValue { return call(f)[0].(ArrayValue).Get() }
+ a.eval = func(t *Thread) ArrayValue { return call(t)[0].(ArrayValue).Get() }
case *StructType:
- a.eval = func(f *Frame) StructValue { return call(f)[0].(StructValue).Get() }
+ a.eval = func(t *Thread) StructValue { return call(t)[0].(StructValue).Get() }
case *PtrType:
- a.eval = func(f *Frame) Value { return call(f)[0].(PtrValue).Get() }
+ a.eval = func(t *Thread) Value { return call(t)[0].(PtrValue).Get() }
case *FuncType:
- a.eval = func(f *Frame) Func { return call(f)[0].(FuncValue).Get() }
+ a.eval = func(t *Thread) Func { return call(t)[0].(FuncValue).Get() }
case *SliceType:
- a.eval = func(f *Frame) Slice { return call(f)[0].(SliceValue).Get() }
+ a.eval = func(t *Thread) Slice { return call(t)[0].(SliceValue).Get() }
case *MapType:
- a.eval = func(f *Frame) Map { return call(f)[0].(MapValue).Get() }
+ a.eval = func(t *Thread) Map { return call(t)[0].(MapValue).Get() }
case *MultiType:
- a.eval = func(f *Frame) []Value { return call(f) }
+ a.eval = func(t *Thread) []Value { return call(t) }
default:
log.Crashf("unexpected result type %v at %v", a.t, a.pos);
}
}
-func (a *expr) genValue(vf func(*Frame) Value) {
+func (a *expr) genValue(vf func(*Thread) Value) {
a.evalAddr = vf;
switch _ := a.t.lit().(type) {
case *boolType:
- a.eval = func(f *Frame) bool { return vf(f).(BoolValue).Get() }
+ a.eval = func(t *Thread) bool { return vf(t).(BoolValue).Get() }
case *uintType:
- a.eval = func(f *Frame) uint64 { return vf(f).(UintValue).Get() }
+ a.eval = func(t *Thread) uint64 { return vf(t).(UintValue).Get() }
case *intType:
- a.eval = func(f *Frame) int64 { return vf(f).(IntValue).Get() }
+ a.eval = func(t *Thread) int64 { return vf(t).(IntValue).Get() }
case *floatType:
- a.eval = func(f *Frame) float64 { return vf(f).(FloatValue).Get() }
+ a.eval = func(t *Thread) float64 { return vf(t).(FloatValue).Get() }
case *stringType:
- a.eval = func(f *Frame) string { return vf(f).(StringValue).Get() }
+ a.eval = func(t *Thread) string { return vf(t).(StringValue).Get() }
case *ArrayType:
- a.eval = func(f *Frame) ArrayValue { return vf(f).(ArrayValue).Get() }
+ a.eval = func(t *Thread) ArrayValue { return vf(t).(ArrayValue).Get() }
case *StructType:
- a.eval = func(f *Frame) StructValue { return vf(f).(StructValue).Get() }
+ a.eval = func(t *Thread) StructValue { return vf(t).(StructValue).Get() }
case *PtrType:
- a.eval = func(f *Frame) Value { return vf(f).(PtrValue).Get() }
+ a.eval = func(t *Thread) Value { return vf(t).(PtrValue).Get() }
case *FuncType:
- a.eval = func(f *Frame) Func { return vf(f).(FuncValue).Get() }
+ a.eval = func(t *Thread) Func { return vf(t).(FuncValue).Get() }
case *SliceType:
- a.eval = func(f *Frame) Slice { return vf(f).(SliceValue).Get() }
+ a.eval = func(t *Thread) Slice { return vf(t).(SliceValue).Get() }
case *MapType:
- a.eval = func(f *Frame) Map { return vf(f).(MapValue).Get() }
+ a.eval = func(t *Thread) Map { return vf(t).(MapValue).Get() }
default:
log.Crashf("unexpected result type %v at %v", a.t, a.pos);
}
switch _ := a.t.lit().(type) {
case *uintType:
vf := v.asUint();
- a.eval = func(f *Frame) uint64 { v := vf(f); return -v }
+ a.eval = func(t *Thread) uint64 { v := vf(t); return -v }
case *intType:
vf := v.asInt();
- a.eval = func(f *Frame) int64 { v := vf(f); 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(f *Frame) float64 { v := vf(f); return -v }
+ a.eval = func(t *Thread) float64 { v := vf(t); return -v }
case *idealFloatType:
v := v.asIdealFloat()();
val := v.Neg();
switch _ := a.t.lit().(type) {
case *boolType:
vf := v.asBool();
- a.eval = func(f *Frame) bool { v := vf(f); 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);
}
switch _ := a.t.lit().(type) {
case *uintType:
vf := v.asUint();
- a.eval = func(f *Frame) uint64 { v := vf(f); return ^v }
+ a.eval = func(t *Thread) uint64 { v := vf(t); return ^v }
case *intType:
vf := v.asInt();
- a.eval = func(f *Frame) int64 { v := vf(f); 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));
case *uintType:
lf := l.asUint();
rf := r.asUint();
- a.eval = func(f *Frame) uint64 { l, r := lf(f), rf(f); return l + r }
+ a.eval = func(t *Thread) uint64 { l, r := lf(t), rf(t); return l + r }
case *intType:
lf := l.asInt();
rf := r.asInt();
- a.eval = func(f *Frame) int64 { l, r := lf(f), rf(f); return l + r }
+ a.eval = func(t *Thread) int64 { l, r := lf(t), rf(t); return l + r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
- a.eval = func(f *Frame) float64 { l, r := lf(f), rf(f); return l + r }
+ a.eval = func(t *Thread) float64 { l, r := lf(t), rf(t); return l + r }
case *idealFloatType:
l := l.asIdealFloat()();
r := r.asIdealFloat()();
case *stringType:
lf := l.asString();
rf := r.asString();
- a.eval = func(f *Frame) string { l, r := lf(f), rf(f); return l + r }
+ a.eval = func(t *Thread) string { l, r := lf(t), rf(t); return l + r }
default:
log.Crashf("unexpected type %v at %v", l.t, a.pos);
}
case *uintType:
lf := l.asUint();
rf := r.asUint();
- a.eval = func(f *Frame) uint64 { l, r := lf(f), rf(f); return l - r }
+ a.eval = func(t *Thread) uint64 { l, r := lf(t), rf(t); return l - r }
case *intType:
lf := l.asInt();
rf := r.asInt();
- a.eval = func(f *Frame) int64 { l, r := lf(f), rf(f); return l - r }
+ a.eval = func(t *Thread) int64 { l, r := lf(t), rf(t); return l - r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
- a.eval = func(f *Frame) float64 { l, r := lf(f), rf(f); return l - r }
+ a.eval = func(t *Thread) float64 { l, r := lf(t), rf(t); return l - r }
case *idealFloatType:
l := l.asIdealFloat()();
r := r.asIdealFloat()();
case *uintType:
lf := l.asUint();
rf := r.asUint();
- a.eval = func(f *Frame) uint64 { l, r := lf(f), rf(f); return l * r }
+ a.eval = func(t *Thread) uint64 { l, r := lf(t), rf(t); return l * r }
case *intType:
lf := l.asInt();
rf := r.asInt();
- a.eval = func(f *Frame) int64 { l, r := lf(f), rf(f); return l * r }
+ a.eval = func(t *Thread) int64 { l, r := lf(t), rf(t); return l * r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
- a.eval = func(f *Frame) float64 { l, r := lf(f), rf(f); return l * r }
+ a.eval = func(t *Thread) float64 { l, r := lf(t), rf(t); return l * r }
case *idealFloatType:
l := l.asIdealFloat()();
r := r.asIdealFloat()();
case *uintType:
lf := l.asUint();
rf := r.asUint();
- a.eval = func(f *Frame) uint64 { l, r := lf(f), rf(f); if r == 0 { Abort(DivByZero{}) } return l / r }
+ a.eval = func(t *Thread) uint64 { l, r := lf(t), rf(t); if r == 0 { Abort(DivByZeroError{}) } return l / r }
case *intType:
lf := l.asInt();
rf := r.asInt();
- a.eval = func(f *Frame) int64 { l, r := lf(f), rf(f); if r == 0 { Abort(DivByZero{}) } return l / r }
+ a.eval = func(t *Thread) int64 { l, r := lf(t), rf(t); if r == 0 { Abort(DivByZeroError{}) } return l / r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
- a.eval = func(f *Frame) float64 { l, r := lf(f), rf(f); if r == 0 { Abort(DivByZero{}) } return l / r }
+ a.eval = func(t *Thread) float64 { l, r := lf(t), rf(t); if r == 0 { Abort(DivByZeroError{}) } return l / r }
case *idealFloatType:
l := l.asIdealFloat()();
r := r.asIdealFloat()();
case *uintType:
lf := l.asUint();
rf := r.asUint();
- a.eval = func(f *Frame) uint64 { l, r := lf(f), rf(f); if r == 0 { Abort(DivByZero{}) } return l % r }
+ a.eval = func(t *Thread) uint64 { l, r := lf(t), rf(t); if r == 0 { Abort(DivByZeroError{}) } return l % r }
case *intType:
lf := l.asInt();
rf := r.asInt();
- a.eval = func(f *Frame) int64 { l, r := lf(f), rf(f); if r == 0 { Abort(DivByZero{}) } return l % r }
+ a.eval = func(t *Thread) int64 { l, r := lf(t), rf(t); if r == 0 { Abort(DivByZeroError{}) } return l % r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
case *uintType:
lf := l.asUint();
rf := r.asUint();
- a.eval = func(f *Frame) uint64 { l, r := lf(f), rf(f); return l & r }
+ a.eval = func(t *Thread) uint64 { l, r := lf(t), rf(t); return l & r }
case *intType:
lf := l.asInt();
rf := r.asInt();
- a.eval = func(f *Frame) int64 { l, r := lf(f), rf(f); return l & r }
+ a.eval = func(t *Thread) int64 { l, r := lf(t), rf(t); return l & r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
case *uintType:
lf := l.asUint();
rf := r.asUint();
- a.eval = func(f *Frame) uint64 { l, r := lf(f), rf(f); return l | r }
+ a.eval = func(t *Thread) uint64 { l, r := lf(t), rf(t); return l | r }
case *intType:
lf := l.asInt();
rf := r.asInt();
- a.eval = func(f *Frame) int64 { l, r := lf(f), rf(f); return l | r }
+ a.eval = func(t *Thread) int64 { l, r := lf(t), rf(t); return l | r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
case *uintType:
lf := l.asUint();
rf := r.asUint();
- a.eval = func(f *Frame) uint64 { l, r := lf(f), rf(f); return l ^ r }
+ a.eval = func(t *Thread) uint64 { l, r := lf(t), rf(t); return l ^ r }
case *intType:
lf := l.asInt();
rf := r.asInt();
- a.eval = func(f *Frame) int64 { l, r := lf(f), rf(f); return l ^ r }
+ a.eval = func(t *Thread) int64 { l, r := lf(t), rf(t); return l ^ r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
case *uintType:
lf := l.asUint();
rf := r.asUint();
- a.eval = func(f *Frame) uint64 { l, r := lf(f), rf(f); return l &^ r }
+ a.eval = func(t *Thread) uint64 { l, r := lf(t), rf(t); return l &^ r }
case *intType:
lf := l.asInt();
rf := r.asInt();
- a.eval = func(f *Frame) int64 { l, r := lf(f), rf(f); return l &^ r }
+ a.eval = func(t *Thread) int64 { l, r := lf(t), rf(t); return l &^ r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
case *uintType:
lf := l.asUint();
rf := r.asUint();
- a.eval = func(f *Frame) uint64 { l, r := lf(f), rf(f); return l << r }
+ a.eval = func(t *Thread) uint64 { l, r := lf(t), rf(t); return l << r }
case *intType:
lf := l.asInt();
rf := r.asUint();
- a.eval = func(f *Frame) int64 { l, r := lf(f), rf(f); return l << r }
+ a.eval = func(t *Thread) int64 { l, r := lf(t), rf(t); return l << r }
default:
log.Crashf("unexpected type %v at %v", l.t, a.pos);
}
case *uintType:
lf := l.asUint();
rf := r.asUint();
- a.eval = func(f *Frame) uint64 { l, r := lf(f), rf(f); return l >> r }
+ a.eval = func(t *Thread) uint64 { l, r := lf(t), rf(t); return l >> r }
case *intType:
lf := l.asInt();
rf := r.asUint();
- a.eval = func(f *Frame) int64 { l, r := lf(f), rf(f); return l >> r }
+ a.eval = func(t *Thread) int64 { l, r := lf(t), rf(t); return l >> r }
default:
log.Crashf("unexpected type %v at %v", l.t, a.pos);
}
case *uintType:
lf := l.asUint();
rf := r.asUint();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l < r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l < r }
case *intType:
lf := l.asInt();
rf := r.asInt();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l < r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l < r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
val := l.Cmp(r) < 0;
- a.eval = func(f *Frame) bool { return val }
+ a.eval = func(t *Thread) bool { return val }
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l < r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l < r }
case *idealFloatType:
l := l.asIdealFloat()();
r := r.asIdealFloat()();
val := l.Cmp(r) < 0;
- a.eval = func(f *Frame) bool { return val }
+ a.eval = func(t *Thread) bool { return val }
case *stringType:
lf := l.asString();
rf := r.asString();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l < r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l < r }
default:
log.Crashf("unexpected type %v at %v", l.t, a.pos);
}
case *uintType:
lf := l.asUint();
rf := r.asUint();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l > r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l > r }
case *intType:
lf := l.asInt();
rf := r.asInt();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l > r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l > r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
val := l.Cmp(r) > 0;
- a.eval = func(f *Frame) bool { return val }
+ a.eval = func(t *Thread) bool { return val }
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l > r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l > r }
case *idealFloatType:
l := l.asIdealFloat()();
r := r.asIdealFloat()();
val := l.Cmp(r) > 0;
- a.eval = func(f *Frame) bool { return val }
+ a.eval = func(t *Thread) bool { return val }
case *stringType:
lf := l.asString();
rf := r.asString();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l > r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l > r }
default:
log.Crashf("unexpected type %v at %v", l.t, a.pos);
}
case *uintType:
lf := l.asUint();
rf := r.asUint();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l <= r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l <= r }
case *intType:
lf := l.asInt();
rf := r.asInt();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l <= r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l <= r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
val := l.Cmp(r) <= 0;
- a.eval = func(f *Frame) bool { return val }
+ a.eval = func(t *Thread) bool { return val }
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l <= r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l <= r }
case *idealFloatType:
l := l.asIdealFloat()();
r := r.asIdealFloat()();
val := l.Cmp(r) <= 0;
- a.eval = func(f *Frame) bool { return val }
+ a.eval = func(t *Thread) bool { return val }
case *stringType:
lf := l.asString();
rf := r.asString();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l <= r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l <= r }
default:
log.Crashf("unexpected type %v at %v", l.t, a.pos);
}
case *uintType:
lf := l.asUint();
rf := r.asUint();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l >= r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l >= r }
case *intType:
lf := l.asInt();
rf := r.asInt();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l >= r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l >= r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
val := l.Cmp(r) >= 0;
- a.eval = func(f *Frame) bool { return val }
+ a.eval = func(t *Thread) bool { return val }
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l >= r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l >= r }
case *idealFloatType:
l := l.asIdealFloat()();
r := r.asIdealFloat()();
val := l.Cmp(r) >= 0;
- a.eval = func(f *Frame) bool { return val }
+ a.eval = func(t *Thread) bool { return val }
case *stringType:
lf := l.asString();
rf := r.asString();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l >= r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l >= r }
default:
log.Crashf("unexpected type %v at %v", l.t, a.pos);
}
case *boolType:
lf := l.asBool();
rf := r.asBool();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l == r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l == r }
case *uintType:
lf := l.asUint();
rf := r.asUint();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l == r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l == r }
case *intType:
lf := l.asInt();
rf := r.asInt();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l == r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l == r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
val := l.Cmp(r) == 0;
- a.eval = func(f *Frame) bool { return val }
+ a.eval = func(t *Thread) bool { return val }
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l == r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l == r }
case *idealFloatType:
l := l.asIdealFloat()();
r := r.asIdealFloat()();
val := l.Cmp(r) == 0;
- a.eval = func(f *Frame) bool { return val }
+ a.eval = func(t *Thread) bool { return val }
case *stringType:
lf := l.asString();
rf := r.asString();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l == r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l == r }
case *PtrType:
lf := l.asPtr();
rf := r.asPtr();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l == r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l == r }
case *FuncType:
lf := l.asFunc();
rf := r.asFunc();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l == r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l == r }
case *MapType:
lf := l.asMap();
rf := r.asMap();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l == r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l == r }
default:
log.Crashf("unexpected type %v at %v", l.t, a.pos);
}
case *boolType:
lf := l.asBool();
rf := r.asBool();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l != r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l != r }
case *uintType:
lf := l.asUint();
rf := r.asUint();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l != r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l != r }
case *intType:
lf := l.asInt();
rf := r.asInt();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l != r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l != r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
val := l.Cmp(r) != 0;
- a.eval = func(f *Frame) bool { return val }
+ a.eval = func(t *Thread) bool { return val }
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l != r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l != r }
case *idealFloatType:
l := l.asIdealFloat()();
r := r.asIdealFloat()();
val := l.Cmp(r) != 0;
- a.eval = func(f *Frame) bool { return val }
+ a.eval = func(t *Thread) bool { return val }
case *stringType:
lf := l.asString();
rf := r.asString();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l != r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l != r }
case *PtrType:
lf := l.asPtr();
rf := r.asPtr();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l != r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l != r }
case *FuncType:
lf := l.asFunc();
rf := r.asFunc();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l != r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l != r }
case *MapType:
lf := l.asMap();
rf := r.asMap();
- a.eval = func(f *Frame) bool { l, r := lf(f), rf(f); return l != r }
+ a.eval = func(t *Thread) bool { l, r := lf(t), rf(t); return l != r }
default:
log.Crashf("unexpected type %v at %v", l.t, a.pos);
}
}
-func genAssign(lt Type, r *expr) (func(lv Value, f *Frame)) {
+func genAssign(lt Type, r *expr) (func(lv Value, t *Thread)) {
switch _ := lt.lit().(type) {
case *boolType:
rf := r.asBool();
- return func(lv Value, f *Frame) { lv.(BoolValue).Set(rf(f)) }
+ return func(lv Value, t *Thread) { lv.(BoolValue).Set(rf(t)) }
case *uintType:
rf := r.asUint();
- return func(lv Value, f *Frame) { lv.(UintValue).Set(rf(f)) }
+ return func(lv Value, t *Thread) { lv.(UintValue).Set(rf(t)) }
case *intType:
rf := r.asInt();
- return func(lv Value, f *Frame) { lv.(IntValue).Set(rf(f)) }
+ return func(lv Value, t *Thread) { lv.(IntValue).Set(rf(t)) }
case *floatType:
rf := r.asFloat();
- return func(lv Value, f *Frame) { lv.(FloatValue).Set(rf(f)) }
+ return func(lv Value, t *Thread) { lv.(FloatValue).Set(rf(t)) }
case *stringType:
rf := r.asString();
- return func(lv Value, f *Frame) { lv.(StringValue).Set(rf(f)) }
+ return func(lv Value, t *Thread) { lv.(StringValue).Set(rf(t)) }
case *ArrayType:
rf := r.asArray();
- return func(lv Value, f *Frame) { lv.Assign(rf(f)) }
+ return func(lv Value, t *Thread) { lv.Assign(rf(t)) }
case *StructType:
rf := r.asStruct();
- return func(lv Value, f *Frame) { lv.Assign(rf(f)) }
+ return func(lv Value, t *Thread) { lv.Assign(rf(t)) }
case *PtrType:
rf := r.asPtr();
- return func(lv Value, f *Frame) { lv.(PtrValue).Set(rf(f)) }
+ return func(lv Value, t *Thread) { lv.(PtrValue).Set(rf(t)) }
case *FuncType:
rf := r.asFunc();
- return func(lv Value, f *Frame) { lv.(FuncValue).Set(rf(f)) }
+ return func(lv Value, t *Thread) { lv.(FuncValue).Set(rf(t)) }
case *SliceType:
rf := r.asSlice();
- return func(lv Value, f *Frame) { lv.(SliceValue).Set(rf(f)) }
+ return func(lv Value, t *Thread) { lv.(SliceValue).Set(rf(t)) }
case *MapType:
rf := r.asMap();
- return func(lv Value, f *Frame) { lv.(MapValue).Set(rf(f)) }
+ return func(lv Value, t *Thread) { lv.(MapValue).Set(rf(t)) }
default:
log.Crashf("unexpected left operand type %v at %v", lt, r.pos);
}