1
0
mirror of https://github.com/golang/go synced 2024-11-23 00:20:12 -07:00
go/usr/austin/eval/expr1.go
Austin Clements 851497bc65 Thread Thread into Value Get/Set/Assign so other Value
implementations can abort.  Make genConstant get values lazily
since we need the Thread now.

R=rsc
APPROVED=rsc
DELTA=299  (8 added, 19 deleted, 272 changed)
OCL=34353
CL=34353
2009-09-03 17:14:49 -07:00

795 lines
24 KiB
Go

// This file is machine generated by gen.go.
// 6g gen.go && 6l gen.6 && ./6.out >expr1.go
package eval
import (
"bignum";
"log";
)
/*
* "As" functions. These retrieve evaluator functions from an
* expr, panicking if the requested evaluator has the wrong type.
*/
func (a *expr) asBool() (func(*Thread) bool) {
return a.eval.(func(*Thread)(bool))
}
func (a *expr) asUint() (func(*Thread) uint64) {
return a.eval.(func(*Thread)(uint64))
}
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(*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(*Thread) string) {
return a.eval.(func(*Thread)(string))
}
func (a *expr) asArray() (func(*Thread) ArrayValue) {
return a.eval.(func(*Thread)(ArrayValue))
}
func (a *expr) asStruct() (func(*Thread) StructValue) {
return a.eval.(func(*Thread)(StructValue))
}
func (a *expr) asPtr() (func(*Thread) Value) {
return a.eval.(func(*Thread)(Value))
}
func (a *expr) asFunc() (func(*Thread) Func) {
return a.eval.(func(*Thread)(Func))
}
func (a *expr) asSlice() (func(*Thread) Slice) {
return a.eval.(func(*Thread)(Slice))
}
func (a *expr) asMap() (func(*Thread) Map) {
return a.eval.(func(*Thread)(Map))
}
func (a *expr) asMulti() (func(*Thread) []Value) {
return a.eval.(func(*Thread)[]Value)
}
func (a *expr) asInterface() (func(*Thread) interface{}) {
switch sf := a.eval.(type) {
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);
}
panic();
}
/*
* Operator generators.
*/
func (a *expr) genConstant(v Value) {
switch _ := a.t.lit().(type) {
case *boolType:
a.eval = func(t *Thread) bool { return v.(BoolValue).Get(t) }
case *uintType:
a.eval = func(t *Thread) uint64 { return v.(UintValue).Get(t) }
case *intType:
a.eval = func(t *Thread) int64 { return v.(IntValue).Get(t) }
case *idealIntType:
val := v.(IdealIntValue).Get();
a.eval = func() *bignum.Integer { return val }
case *floatType:
a.eval = func(t *Thread) float64 { return v.(FloatValue).Get(t) }
case *idealFloatType:
val := v.(IdealFloatValue).Get();
a.eval = func() *bignum.Rational { return val }
case *stringType:
a.eval = func(t *Thread) string { return v.(StringValue).Get(t) }
case *ArrayType:
a.eval = func(t *Thread) ArrayValue { return v.(ArrayValue).Get(t) }
case *StructType:
a.eval = func(t *Thread) StructValue { return v.(StructValue).Get(t) }
case *PtrType:
a.eval = func(t *Thread) Value { return v.(PtrValue).Get(t) }
case *FuncType:
a.eval = func(t *Thread) Func { return v.(FuncValue).Get(t) }
case *SliceType:
a.eval = func(t *Thread) Slice { return v.(SliceValue).Get(t) }
case *MapType:
a.eval = func(t *Thread) Map { return v.(MapValue).Get(t) }
default:
log.Crashf("unexpected constant type %v at %v", a.t, a.pos);
}
}
func (a *expr) genIdentOp(level, index int) {
a.evalAddr = func(t *Thread) Value { return t.f.Get(level, index) };
switch _ := a.t.lit().(type) {
case *boolType:
a.eval = func(t *Thread) bool { return t.f.Get(level, index).(BoolValue).Get(t) }
case *uintType:
a.eval = func(t *Thread) uint64 { return t.f.Get(level, index).(UintValue).Get(t) }
case *intType:
a.eval = func(t *Thread) int64 { return t.f.Get(level, index).(IntValue).Get(t) }
case *floatType:
a.eval = func(t *Thread) float64 { return t.f.Get(level, index).(FloatValue).Get(t) }
case *stringType:
a.eval = func(t *Thread) string { return t.f.Get(level, index).(StringValue).Get(t) }
case *ArrayType:
a.eval = func(t *Thread) ArrayValue { return t.f.Get(level, index).(ArrayValue).Get(t) }
case *StructType:
a.eval = func(t *Thread) StructValue { return t.f.Get(level, index).(StructValue).Get(t) }
case *PtrType:
a.eval = func(t *Thread) Value { return t.f.Get(level, index).(PtrValue).Get(t) }
case *FuncType:
a.eval = func(t *Thread) Func { return t.f.Get(level, index).(FuncValue).Get(t) }
case *SliceType:
a.eval = func(t *Thread) Slice { return t.f.Get(level, index).(SliceValue).Get(t) }
case *MapType:
a.eval = func(t *Thread) Map { return t.f.Get(level, index).(MapValue).Get(t) }
default:
log.Crashf("unexpected identifier type %v at %v", a.t, a.pos);
}
}
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(t *Thread) bool { return call(t)[0].(BoolValue).Get(t) }
case *uintType:
a.eval = func(t *Thread) uint64 { return call(t)[0].(UintValue).Get(t) }
case *intType:
a.eval = func(t *Thread) int64 { return call(t)[0].(IntValue).Get(t) }
case *floatType:
a.eval = func(t *Thread) float64 { return call(t)[0].(FloatValue).Get(t) }
case *stringType:
a.eval = func(t *Thread) string { return call(t)[0].(StringValue).Get(t) }
case *ArrayType:
a.eval = func(t *Thread) ArrayValue { return call(t)[0].(ArrayValue).Get(t) }
case *StructType:
a.eval = func(t *Thread) StructValue { return call(t)[0].(StructValue).Get(t) }
case *PtrType:
a.eval = func(t *Thread) Value { return call(t)[0].(PtrValue).Get(t) }
case *FuncType:
a.eval = func(t *Thread) Func { return call(t)[0].(FuncValue).Get(t) }
case *SliceType:
a.eval = func(t *Thread) Slice { return call(t)[0].(SliceValue).Get(t) }
case *MapType:
a.eval = func(t *Thread) Map { return call(t)[0].(MapValue).Get(t) }
case *MultiType:
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(*Thread) Value) {
a.evalAddr = vf;
switch _ := a.t.lit().(type) {
case *boolType:
a.eval = func(t *Thread) bool { return vf(t).(BoolValue).Get(t) }
case *uintType:
a.eval = func(t *Thread) uint64 { return vf(t).(UintValue).Get(t) }
case *intType:
a.eval = func(t *Thread) int64 { return vf(t).(IntValue).Get(t) }
case *floatType:
a.eval = func(t *Thread) float64 { return vf(t).(FloatValue).Get(t) }
case *stringType:
a.eval = func(t *Thread) string { return vf(t).(StringValue).Get(t) }
case *ArrayType:
a.eval = func(t *Thread) ArrayValue { return vf(t).(ArrayValue).Get(t) }
case *StructType:
a.eval = func(t *Thread) StructValue { return vf(t).(StructValue).Get(t) }
case *PtrType:
a.eval = func(t *Thread) Value { return vf(t).(PtrValue).Get(t) }
case *FuncType:
a.eval = func(t *Thread) Func { return vf(t).(FuncValue).Get(t) }
case *SliceType:
a.eval = func(t *Thread) Slice { return vf(t).(SliceValue).Get(t) }
case *MapType:
a.eval = func(t *Thread) Map { return vf(t).(MapValue).Get(t) }
default:
log.Crashf("unexpected result type %v at %v", a.t, a.pos);
}
}
func (a *expr) genUnaryOpNeg(v *expr) {
switch _ := a.t.lit().(type) {
case *uintType:
vf := v.asUint();
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 }
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 }
case *idealFloatType:
v := v.asIdealFloat()();
val := v.Neg();
a.eval = func() *bignum.Rational { return val }
default:
log.Crashf("unexpected type %v at %v", a.t, a.pos);
}
}
func (a *expr) genUnaryOpNot(v *expr) {
switch _ := a.t.lit().(type) {
case *boolType:
vf := v.asBool();
a.eval = func(t *Thread) bool { v := vf(t); return !v }
default:
log.Crashf("unexpected type %v at %v", a.t, a.pos);
}
}
func (a *expr) genUnaryOpXor(v *expr) {
switch _ := a.t.lit().(type) {
case *uintType:
vf := v.asUint();
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 }
case *idealIntType:
v := v.asIdealInt()();
val := v.Neg().Sub(bignum.Int(1));
a.eval = func() *bignum.Integer { return val }
default:
log.Crashf("unexpected type %v at %v", a.t, a.pos);
}
}
func (a *expr) genBinOpAdd(l, r *expr) {
switch _ := l.t.lit().(type) {
case *uintType:
lf := l.asUint();
rf := r.asUint();
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(t *Thread) int64 { l, r := lf(t), rf(t); return l + r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
val := l.Add(r);
a.eval = func() *bignum.Integer { return val }
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
a.eval = func(t *Thread) float64 { l, r := lf(t), rf(t); return l + r }
case *idealFloatType:
l := l.asIdealFloat()();
r := r.asIdealFloat()();
val := l.Add(r);
a.eval = func() *bignum.Rational { return val }
case *stringType:
lf := l.asString();
rf := r.asString();
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);
}
}
func (a *expr) genBinOpSub(l, r *expr) {
switch _ := l.t.lit().(type) {
case *uintType:
lf := l.asUint();
rf := r.asUint();
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(t *Thread) int64 { l, r := lf(t), rf(t); return l - r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
val := l.Sub(r);
a.eval = func() *bignum.Integer { return val }
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
a.eval = func(t *Thread) float64 { l, r := lf(t), rf(t); return l - r }
case *idealFloatType:
l := l.asIdealFloat()();
r := r.asIdealFloat()();
val := l.Sub(r);
a.eval = func() *bignum.Rational { return val }
default:
log.Crashf("unexpected type %v at %v", l.t, a.pos);
}
}
func (a *expr) genBinOpMul(l, r *expr) {
switch _ := l.t.lit().(type) {
case *uintType:
lf := l.asUint();
rf := r.asUint();
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(t *Thread) int64 { l, r := lf(t), rf(t); return l * r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
val := l.Mul(r);
a.eval = func() *bignum.Integer { return val }
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
a.eval = func(t *Thread) float64 { l, r := lf(t), rf(t); return l * r }
case *idealFloatType:
l := l.asIdealFloat()();
r := r.asIdealFloat()();
val := l.Mul(r);
a.eval = func() *bignum.Rational { return val }
default:
log.Crashf("unexpected type %v at %v", l.t, a.pos);
}
}
func (a *expr) genBinOpQuo(l, r *expr) {
switch _ := l.t.lit().(type) {
case *uintType:
lf := l.asUint();
rf := r.asUint();
a.eval = func(t *Thread) uint64 { l, r := lf(t), rf(t); if r == 0 { t.Abort(DivByZeroError{}) } return l / r }
case *intType:
lf := l.asInt();
rf := r.asInt();
a.eval = func(t *Thread) int64 { l, r := lf(t), rf(t); if r == 0 { t.Abort(DivByZeroError{}) } return l / r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
val := l.Quo(r);
a.eval = func() *bignum.Integer { return val }
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
a.eval = func(t *Thread) float64 { l, r := lf(t), rf(t); if r == 0 { t.Abort(DivByZeroError{}) } return l / r }
case *idealFloatType:
l := l.asIdealFloat()();
r := r.asIdealFloat()();
val := l.Quo(r);
a.eval = func() *bignum.Rational { return val }
default:
log.Crashf("unexpected type %v at %v", l.t, a.pos);
}
}
func (a *expr) genBinOpRem(l, r *expr) {
switch _ := l.t.lit().(type) {
case *uintType:
lf := l.asUint();
rf := r.asUint();
a.eval = func(t *Thread) uint64 { l, r := lf(t), rf(t); if r == 0 { t.Abort(DivByZeroError{}) } return l % r }
case *intType:
lf := l.asInt();
rf := r.asInt();
a.eval = func(t *Thread) int64 { l, r := lf(t), rf(t); if r == 0 { t.Abort(DivByZeroError{}) } return l % r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
val := l.Rem(r);
a.eval = func() *bignum.Integer { return val }
default:
log.Crashf("unexpected type %v at %v", l.t, a.pos);
}
}
func (a *expr) genBinOpAnd(l, r *expr) {
switch _ := l.t.lit().(type) {
case *uintType:
lf := l.asUint();
rf := r.asUint();
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(t *Thread) int64 { l, r := lf(t), rf(t); return l & r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
val := l.And(r);
a.eval = func() *bignum.Integer { return val }
default:
log.Crashf("unexpected type %v at %v", l.t, a.pos);
}
}
func (a *expr) genBinOpOr(l, r *expr) {
switch _ := l.t.lit().(type) {
case *uintType:
lf := l.asUint();
rf := r.asUint();
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(t *Thread) int64 { l, r := lf(t), rf(t); return l | r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
val := l.Or(r);
a.eval = func() *bignum.Integer { return val }
default:
log.Crashf("unexpected type %v at %v", l.t, a.pos);
}
}
func (a *expr) genBinOpXor(l, r *expr) {
switch _ := l.t.lit().(type) {
case *uintType:
lf := l.asUint();
rf := r.asUint();
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(t *Thread) int64 { l, r := lf(t), rf(t); return l ^ r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
val := l.Xor(r);
a.eval = func() *bignum.Integer { return val }
default:
log.Crashf("unexpected type %v at %v", l.t, a.pos);
}
}
func (a *expr) genBinOpAndNot(l, r *expr) {
switch _ := l.t.lit().(type) {
case *uintType:
lf := l.asUint();
rf := r.asUint();
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(t *Thread) int64 { l, r := lf(t), rf(t); return l &^ r }
case *idealIntType:
l := l.asIdealInt()();
r := r.asIdealInt()();
val := l.AndNot(r);
a.eval = func() *bignum.Integer { return val }
default:
log.Crashf("unexpected type %v at %v", l.t, a.pos);
}
}
func (a *expr) genBinOpShl(l, r *expr) {
switch _ := l.t.lit().(type) {
case *uintType:
lf := l.asUint();
rf := r.asUint();
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(t *Thread) int64 { l, r := lf(t), rf(t); return l << r }
default:
log.Crashf("unexpected type %v at %v", l.t, a.pos);
}
}
func (a *expr) genBinOpShr(l, r *expr) {
switch _ := l.t.lit().(type) {
case *uintType:
lf := l.asUint();
rf := r.asUint();
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(t *Thread) int64 { l, r := lf(t), rf(t); return l >> r }
default:
log.Crashf("unexpected type %v at %v", l.t, a.pos);
}
}
func (a *expr) genBinOpLss(l, r *expr) {
switch _ := l.t.lit().(type) {
case *uintType:
lf := l.asUint();
rf := r.asUint();
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(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(t *Thread) bool { return val }
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
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(t *Thread) bool { return val }
case *stringType:
lf := l.asString();
rf := r.asString();
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 (a *expr) genBinOpGtr(l, r *expr) {
switch _ := l.t.lit().(type) {
case *uintType:
lf := l.asUint();
rf := r.asUint();
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(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(t *Thread) bool { return val }
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
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(t *Thread) bool { return val }
case *stringType:
lf := l.asString();
rf := r.asString();
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 (a *expr) genBinOpLeq(l, r *expr) {
switch _ := l.t.lit().(type) {
case *uintType:
lf := l.asUint();
rf := r.asUint();
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(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(t *Thread) bool { return val }
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
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(t *Thread) bool { return val }
case *stringType:
lf := l.asString();
rf := r.asString();
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 (a *expr) genBinOpGeq(l, r *expr) {
switch _ := l.t.lit().(type) {
case *uintType:
lf := l.asUint();
rf := r.asUint();
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(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(t *Thread) bool { return val }
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
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(t *Thread) bool { return val }
case *stringType:
lf := l.asString();
rf := r.asString();
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 (a *expr) genBinOpEql(l, r *expr) {
switch _ := l.t.lit().(type) {
case *boolType:
lf := l.asBool();
rf := r.asBool();
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(t *Thread) bool { l, r := lf(t), rf(t); return l == r }
case *intType:
lf := l.asInt();
rf := r.asInt();
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(t *Thread) bool { return val }
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
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(t *Thread) bool { return val }
case *stringType:
lf := l.asString();
rf := r.asString();
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(t *Thread) bool { l, r := lf(t), rf(t); return l == r }
case *FuncType:
lf := l.asFunc();
rf := r.asFunc();
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(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 (a *expr) genBinOpNeq(l, r *expr) {
switch _ := l.t.lit().(type) {
case *boolType:
lf := l.asBool();
rf := r.asBool();
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(t *Thread) bool { l, r := lf(t), rf(t); return l != r }
case *intType:
lf := l.asInt();
rf := r.asInt();
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(t *Thread) bool { return val }
case *floatType:
lf := l.asFloat();
rf := r.asFloat();
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(t *Thread) bool { return val }
case *stringType:
lf := l.asString();
rf := r.asString();
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(t *Thread) bool { l, r := lf(t), rf(t); return l != r }
case *FuncType:
lf := l.asFunc();
rf := r.asFunc();
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(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, t *Thread)) {
switch _ := lt.lit().(type) {
case *boolType:
rf := r.asBool();
return func(lv Value, t *Thread) { lv.(BoolValue).Set(t, rf(t)) }
case *uintType:
rf := r.asUint();
return func(lv Value, t *Thread) { lv.(UintValue).Set(t, rf(t)) }
case *intType:
rf := r.asInt();
return func(lv Value, t *Thread) { lv.(IntValue).Set(t, rf(t)) }
case *floatType:
rf := r.asFloat();
return func(lv Value, t *Thread) { lv.(FloatValue).Set(t, rf(t)) }
case *stringType:
rf := r.asString();
return func(lv Value, t *Thread) { lv.(StringValue).Set(t, rf(t)) }
case *ArrayType:
rf := r.asArray();
return func(lv Value, t *Thread) { lv.Assign(t, rf(t)) }
case *StructType:
rf := r.asStruct();
return func(lv Value, t *Thread) { lv.Assign(t, rf(t)) }
case *PtrType:
rf := r.asPtr();
return func(lv Value, t *Thread) { lv.(PtrValue).Set(t, rf(t)) }
case *FuncType:
rf := r.asFunc();
return func(lv Value, t *Thread) { lv.(FuncValue).Set(t, rf(t)) }
case *SliceType:
rf := r.asSlice();
return func(lv Value, t *Thread) { lv.(SliceValue).Set(t, rf(t)) }
case *MapType:
rf := r.asMap();
return func(lv Value, t *Thread) { lv.(MapValue).Set(t, rf(t)) }
default:
log.Crashf("unexpected left operand type %v at %v", lt, r.pos);
}
panic();
}