Commit 851497bc authored by Austin Clements's avatar Austin Clements

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
parent 45eadcf4
......@@ -213,11 +213,11 @@ func (*testFunc) NewFrame() *Frame {
}
func (*testFunc) Call(t *Thread) {
n := t.f.Vars[0].(IntValue).Get();
n := t.f.Vars[0].(IntValue).Get(t);
res := n + 1;
t.f.Vars[1].(IntValue).Set(res);
t.f.Vars[1].(IntValue).Set(t, res);
}
type oneTwoFunc struct {};
......@@ -227,8 +227,8 @@ func (*oneTwoFunc) NewFrame() *Frame {
}
func (*oneTwoFunc) Call(t *Thread) {
t.f.Vars[0].(IntValue).Set(1);
t.f.Vars[1].(IntValue).Set(2);
t.f.Vars[0].(IntValue).Set(t, 1);
t.f.Vars[1].(IntValue).Set(t, 2);
}
type voidFunc struct {};
......
......@@ -346,7 +346,7 @@ func (a *assignCompiler) compile(b *block, lt Type) (func(Value, *Thread)) {
vt := a.rmt.Elems[0];
effect = func(t *Thread) {
m, k := rf(t);
v := m.Elem(k);
v := m.Elem(t, k);
found := boolV(true);
if v == nil {
found = boolV(false);
......@@ -902,7 +902,7 @@ func (a *exprInfo) compileSelectorExpr(v *expr, name string) *expr {
expr := a.newExpr(ft, "selector expression");
pf := parent.asStruct();
evalAddr := func(t *Thread) Value {
return pf(t).Field(index);
return pf(t).Field(t, index);
};
expr.genValue(evalAddr);
return sub(expr);
......@@ -990,7 +990,7 @@ func (a *exprInfo) compileIndexExpr(l, r *expr) *expr {
if r < 0 || r >= bound {
t.Abort(IndexError{r, bound});
}
return l.Elem(r);
return l.Elem(t, r);
});
case *SliceType:
......@@ -1004,7 +1004,7 @@ func (a *exprInfo) compileIndexExpr(l, r *expr) *expr {
if r < 0 || r >= l.Len {
t.Abort(IndexError{r, l.Len});
}
return l.Base.Elem(r);
return l.Base.Elem(t, r);
});
case *stringType:
......@@ -1029,7 +1029,7 @@ func (a *exprInfo) compileIndexExpr(l, r *expr) *expr {
if m == nil {
t.Abort(NilPointerError{});
}
e := m.Elem(k);
e := m.Elem(t, k);
if e == nil {
t.Abort(KeyError{k});
}
......@@ -1197,7 +1197,7 @@ func (a *exprInfo) compileBuiltinCallExpr(b *block, ft *FuncType, as []*expr) *e
if m == nil {
return 0;
}
return m.Len();
return m.Len(t);
};
//case *ChanType:
......
This diff is collapsed.
......@@ -184,11 +184,11 @@ func (a *expr) genConstant(v Value) {
switch _ := a.t.lit().(type) {
«.repeated section Types»
case «Repr»:
val := v.(«Value»).Get();
«.section IsIdeal»
val := v.(«Value»).Get();
a.eval = func() «Native» { return val }
«.or»
a.eval = func(t *Thread) «Native» { return val }
a.eval = func(t *Thread) «Native» { return v.(«Value»).Get(t) }
«.end»
«.end»
default:
......@@ -203,7 +203,7 @@ func (a *expr) genIdentOp(level, index int) {
«.section IsIdeal»
«.or»
case «Repr»:
a.eval = func(t *Thread) «Native» { return t.f.Get(level, index).(«Value»).Get() }
a.eval = func(t *Thread) «Native» { return t.f.Get(level, index).(«Value»).Get(t) }
«.end»
«.end»
default:
......@@ -218,7 +218,7 @@ func (a *expr) genFuncCall(call func(t *Thread) []Value) {
«.section IsIdeal»
«.or»
case «Repr»:
a.eval = func(t *Thread) «Native» { return call(t)[0].(«Value»).Get() }
a.eval = func(t *Thread) «Native» { return call(t)[0].(«Value»).Get(t) }
«.end»
«.end»
case *MultiType:
......@@ -235,7 +235,7 @@ func (a *expr) genValue(vf func(*Thread) Value) {
«.section IsIdeal»
«.or»
case «Repr»:
a.eval = func(t *Thread) «Native» { return vf(t).(«Value»).Get() }
a.eval = func(t *Thread) «Native» { return vf(t).(«Value»).Get(t) }
«.end»
«.end»
default:
......@@ -296,7 +296,7 @@ func genAssign(lt Type, r *expr) (func(lv Value, t *Thread)) {
«.or»
case «Repr»:
rf := r.«As»();
return func(lv Value, t *Thread) { «.section HasAssign»lv.Assign(rf(t))«.or»lv.(«Value»).Set(rf(t))«.end» }
return func(lv Value, t *Thread) { «.section HasAssign»lv.Assign(t, rf(t))«.or»lv.(«Value»).Set(t, rf(t))«.end» }
«.end»
«.end»
default:
......
......@@ -402,7 +402,7 @@ func (a *stmtCompiler) compileDecl(decl ast.Decl) {
return;
}
var zeroThread Thread;
c.Value.(FuncValue).Set(fn(&zeroThread));
c.Value.(FuncValue).Set(nil, fn(&zeroThread));
case *ast.GenDecl:
switch d.Tok {
......@@ -649,10 +649,10 @@ func (a *stmtCompiler) doAssign(lhs []ast.Expr, rhs []ast.Expr, tok token.Token,
et := sub.t;
ls[i].evalAddr = func(t *Thread) Value {
m, k := mvf(t);
e := m.Elem(k);
e := m.Elem(t, k);
if e == nil {
e = et.Zero();
m.SetElem(k, e);
m.SetElem(t, k, e);
}
return e;
};
......@@ -736,7 +736,7 @@ func (a *stmtCompiler) doAssign(lhs []ast.Expr, rhs []ast.Expr, tok token.Token,
for i := 0; i < n; i ++ {
// TODO(austin) Need to evaluate LHS
// before RHS
lfs[i](t).Assign(temp[i]);
lfs[i](t).Assign(t, temp[i]);
}
});
}
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment