FileDocCategorySizeDatePackage
BinOpExpr.javaAPI DocJava SE 5 API3929Fri Aug 26 14:55:34 BST 2005com.sun.org.apache.xalan.internal.xsltc.compiler

BinOpExpr

public final class BinOpExpr extends Expression
author
Jacek Ambroziak
author
Santiago Pericas-Geertsen

Fields Summary
public static final int
PLUS
public static final int
MINUS
public static final int
TIMES
public static final int
DIV
public static final int
MOD
private static final String[]
Ops
private int
_op
private Expression
_left
private Expression
_right
Constructors Summary
public BinOpExpr(int op, Expression left, Expression right)

	
           
	_op = op;
	(_left = left).setParent(this);
	(_right = right).setParent(this);
    
Methods Summary
public booleanhasLastCall()
Returns true if this expressions contains a call to last()

            return (_left.hasLastCall() || _right.hasLastCall());
    
public booleanhasPositionCall()
Returns true if this expressions contains a call to position(). This is needed for context changes in node steps containing multiple predicates.

	if (_left.hasPositionCall()) return true;
	if (_right.hasPositionCall()) return true;
	return false;
    
public voidsetParser(com.sun.org.apache.xalan.internal.xsltc.compiler.Parser parser)

	super.setParser(parser);
	_left.setParser(parser);
	_right.setParser(parser);
    
public java.lang.StringtoString()

	return Ops[_op] + '(" + _left + ", " + _right + ')";
    
public voidtranslate(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen)

	final InstructionList il = methodGen.getInstructionList();

	_left.translate(classGen, methodGen);
	_right.translate(classGen, methodGen);

	switch (_op) {
	case PLUS:
	    il.append(_type.ADD());
	    break;
	case MINUS:
	    il.append(_type.SUB());
	    break;
	case TIMES:
	    il.append(_type.MUL());
	    break;
	case DIV:
	    il.append(_type.DIV());
	    break;
	case MOD:
	    il.append(_type.REM());
	    break;
	default:
	    ErrorMsg msg = new ErrorMsg(ErrorMsg.ILLEGAL_BINARY_OP_ERR, this);
	    getParser().reportError(Constants.ERROR, msg);
	}
    
public com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypetypeCheck(com.sun.org.apache.xalan.internal.xsltc.compiler.SymbolTable stable)

	final Type tleft = _left.typeCheck(stable); 
	final Type tright = _right.typeCheck(stable);
	final MethodType ptype = lookupPrimop(stable, Ops[_op],
					      new MethodType(Type.Void,
							     tleft, tright)); 
	if (ptype != null) {
	    final Type arg1 = (Type) ptype.argsType().elementAt(0);
	    if (!arg1.identicalTo(tleft)) {
		_left = new CastExpr(_left, arg1);
	    }
	    final Type arg2 = (Type) ptype.argsType().elementAt(1);
	    if (!arg2.identicalTo(tright)) {
		_right = new CastExpr(_right, arg1);
	    }
	    return _type = ptype.resultType();
	}
	throw new TypeCheckError(this);