com.saxonica.bytecode
Class BlockCompiler

java.lang.Object
  extended by com.saxonica.bytecode.ExpressionCompiler
      extended by com.saxonica.bytecode.ToIteratorCompiler
          extended by com.saxonica.bytecode.BlockCompiler

public class BlockCompiler
extends ToIteratorCompiler

Generate bytecode for a call to a Block expression. A block typically represents either an expression of the form (a, b, c, d), or an XSLT sequence constructor.


Constructor Summary
BlockCompiler()
           
 
Method Summary
 void compileToIterator(CompilerService compiler, Expression expression)
          Generate bytecode to evaluate the BlockExpression as an iterator Precondition: none.
 void compileToLoop(CompilerService compiler, Expression expression, LoopBodyGenerator loopBody)
          The compileToLoop method compiles this expression in such a way that the code generated by the supplied loopBody argument will be executed once for each item in the result of this expression.
 void compileToPush(CompilerService compiler, Expression expression)
          Generate bytecode to evaluate the BlockExpression in push mode Precondition: none.
 
Methods inherited from class com.saxonica.bytecode.ToIteratorCompiler
compileToBoolean, compileToItem
 
Methods inherited from class com.saxonica.bytecode.ExpressionCompiler
allocateStatic, compileItemFromInt, compileItemFromString, compileToPrimitive, generateMethod, getConfiguration, handleEmptyStringResult, setConfiguration, throwXPathException, throwXPathException, unboxItem, verify, visitAnnotation, visitLineNumber
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

BlockCompiler

public BlockCompiler()
Method Detail

compileToPush

public void compileToPush(CompilerService compiler,
                          Expression expression)
                   throws CannotCompileException
Generate bytecode to evaluate the BlockExpression in push mode Precondition: none. Postcondition: the stack is empty

Overrides:
compileToPush in class ToIteratorCompiler
Parameters:
compiler - the compiler service
expression - the expression to be compiled
Throws:
CannotCompileException

compileToLoop

public void compileToLoop(CompilerService compiler,
                          Expression expression,
                          LoopBodyGenerator loopBody)
                   throws CannotCompileException
Description copied from class: ExpressionCompiler
The compileToLoop method compiles this expression in such a way that the code generated by the supplied loopBody argument will be executed once for each item in the result of this expression. The code generated by the loopBody expects to find this item on the top of the bytecode stack, and must remove it.

Note that the compileToLoop() method must not be used where there is a need to maintain the value of position() or size(), or equivalents such as updating range variables. It is therefore generally used only for compiling aggregate functions such as count() and sum().

This has proved something of an obstacle. Attempts to compile path expressions as nested loops have failed in the case where there is a dependency on position() or last(): the current dependency mechanism doesn't always allow these cases to be detected (it only tells us when an expression uses position() or last(), not when it needs to maintain position() and last()). Hence this mode of compilation is not widely implemented (other than by the default implementation) and is currently used only when compiling sum() and count().

Overrides:
compileToLoop in class ExpressionCompiler
Parameters:
compiler - the compiler service
expression - the expression to be compiled
loopBody - a generator which produces code to be executed once for every item in the result of this expression, with that item being on the top of the bytecode stack.
Throws:
CannotCompileException

compileToIterator

public void compileToIterator(CompilerService compiler,
                              Expression expression)
                       throws CannotCompileException
Generate bytecode to evaluate the BlockExpression as an iterator Precondition: none. Postcondition: the stack contains an iterator representing the result of the expression

Specified by:
compileToIterator in class ExpressionCompiler
Parameters:
compiler - the compiler service
expression - the expression to be compiled
Throws:
CannotCompileException


Copyright (c) 2004-2011 Saxonica Limited. All rights reserved.