| 631 | } |
| 632 | |
| 633 | public static class VarExpr implements Expr, AssignableExpr{ |
| 634 | public final Var var; |
| 635 | public final Object tag; |
| 636 | final static Method getMethod = Method.getMethod("Object get()"); |
| 637 | final static Method setMethod = Method.getMethod("Object set(Object)"); |
| 638 | |
| 639 | Class jc; |
| 640 | |
| 641 | public VarExpr(Var var, Symbol tag){ |
| 642 | this.var = var; |
| 643 | this.tag = tag != null ? tag : var.getTag(); |
| 644 | } |
| 645 | |
| 646 | public Object eval() { |
| 647 | return var.deref(); |
| 648 | } |
| 649 | |
| 650 | public void emit(C context, ObjExpr objx, GeneratorAdapter gen){ |
| 651 | objx.emitVarValue(gen,var); |
| 652 | if(context == C.STATEMENT) |
| 653 | { |
| 654 | gen.pop(); |
| 655 | } |
| 656 | } |
| 657 | |
| 658 | public boolean hasJavaClass(){ |
| 659 | return tag != null; |
| 660 | } |
| 661 | |
| 662 | public Class getJavaClass() { |
| 663 | if (jc == null) |
| 664 | jc = HostExpr.tagToClass(tag); |
| 665 | return jc; |
| 666 | } |
| 667 | |
| 668 | public Object evalAssign(Expr val) { |
| 669 | return var.set(val.eval()); |
| 670 | } |
| 671 | |
| 672 | public void emitAssign(C context, ObjExpr objx, GeneratorAdapter gen, |
| 673 | Expr val){ |
| 674 | objx.emitVar(gen, var); |
| 675 | val.emit(C.EXPRESSION, objx, gen); |
| 676 | gen.invokeVirtual(VAR_TYPE, setMethod); |
| 677 | if(context == C.STATEMENT) |
| 678 | gen.pop(); |
| 679 | } |
| 680 | } |
| 681 | |
| 682 | public static class TheVarExpr implements Expr{ |
| 683 | public final Var var; |