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

Expression

public abstract class Expression extends SyntaxTreeNode
author
Jacek Ambroziak
author
Santiago Pericas-Geertsen
author
Morten Jorgensen
author
Erwin Bolwidt

Fields Summary
protected Type
_type
The type of this expression. It is set after calling typeCheck().
protected FlowList
_trueList
Instruction handles that comprise the true list.
protected FlowList
_falseList
Instruction handles that comprise the false list.
Constructors Summary
Methods Summary
public voidbackPatchFalseList(com.sun.org.apache.bcel.internal.generic.InstructionHandle ih)

	_falseList.backPatch(ih);
    
public voidbackPatchTrueList(com.sun.org.apache.bcel.internal.generic.InstructionHandle ih)

	_trueList.backPatch(ih);
    
public final com.sun.org.apache.bcel.internal.generic.InstructionListcompile(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen)
Translate this node into a fresh instruction list. The original instruction list is saved and restored.

	final InstructionList result, save = methodGen.getInstructionList();
	methodGen.setInstructionList(result = new InstructionList());
	translate(classGen, methodGen);
	methodGen.setInstructionList(save);
	return result;
    
public voiddesynthesize(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();
	_falseList.add(il.append(new IFEQ(null)));
    
public java.lang.ObjectevaluateAtCompileTime()
Returns an object representing the compile-time evaluation of an expression. We are only using this for function-available and element-available at this time.

	return null;
    
public com.sun.org.apache.xalan.internal.xsltc.compiler.FlowListgetFalseList()

	return _falseList;
    
public com.sun.org.apache.xalan.internal.xsltc.compiler.FlowListgetTrueList()

	return _trueList;
    
public com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypegetType()


       
	return _type;
    
public booleanhasLastCall()

	return false;
    
public booleanhasPositionCall()

	return false;		// default should be 'false' for StepPattern
    
public com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodTypelookupPrimop(com.sun.org.apache.xalan.internal.xsltc.compiler.SymbolTable stable, java.lang.String op, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodType ctype)
Search for a primop in the symbol table that matches the method type ctype. Two methods match if they have the same arity. If a primop is overloaded then the "closest match" is returned. The first entry in the vector of primops that has the right arity is considered to be the default one.

	MethodType result = null;
	final Vector primop = stable.lookupPrimop(op);
	if (primop != null) {
	    final int n = primop.size();
	    int minDistance = Integer.MAX_VALUE;
	    for (int i = 0; i < n; i++) {
		final MethodType ptype = (MethodType) primop.elementAt(i);
		// Skip if different arity
		if (ptype.argsCount() != ctype.argsCount()) {
		    continue;
		}
				
		// The first method with the right arity is the default
		if (result == null) {
		    result = ptype;		// default method
		}

		// Check if better than last one found
		final int distance = ctype.distanceTo(ptype);
		if (distance < minDistance) {
		    minDistance = distance;
		    result = ptype;
		}
	    }		
	}	
	return result;
    
public voidstartIterator(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen)
If this expression is of type node-set and it is not a variable reference, then call setStartNode() passing the context node.

	// Ignore if type is not node-set
	if (_type instanceof NodeSetType == false) {
	    return;
	}

	// setStartNode() should not be called if expr is a variable ref
	Expression expr = this;
	if (expr instanceof CastExpr) {
	    expr = ((CastExpr) expr).getExpr();
	}
	if (expr instanceof VariableRefBase == false) {
	    final InstructionList il = methodGen.getInstructionList();
	    il.append(methodGen.loadContextNode());
	    il.append(methodGen.setStartNode());
	}
    
public voidsynthesize(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen)
Synthesize a boolean expression, i.e., either push a 0 or 1 onto the operand stack for the next statement to succeed. Returns the handle of the instruction to be backpatched.

	final ConstantPoolGen cpg = classGen.getConstantPool();
	final InstructionList il = methodGen.getInstructionList();
	_trueList.backPatch(il.append(ICONST_1));
	final BranchHandle truec = il.append(new GOTO_W(null));
	_falseList.backPatch(il.append(ICONST_0));
	truec.setTarget(il.append(NOP));
    
public abstract java.lang.StringtoString()

public voidtranslate(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen)
Translate this node into JVM bytecodes.

	ErrorMsg msg = new ErrorMsg(ErrorMsg.NOT_IMPLEMENTED_ERR,
				    getClass(), this);
	getParser().reportError(FATAL, msg);
    
public voidtranslateDesynthesized(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen)
Redefined by expressions of type boolean that use flow lists.

	translate(classGen, methodGen);
	if (_type instanceof BooleanType) {
	    desynthesize(classGen, methodGen);
	}
    
public com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypetypeCheck(com.sun.org.apache.xalan.internal.xsltc.compiler.SymbolTable stable)
Type check all the children of this node.

	return typeCheckContents(stable);