use of lucee.transformer.bytecode.visitor.DecisionIntVisitor in project Lucee by lucee.
the class TagGroupUtil method writeOutTypeQuery.
public static void writeOutTypeQuery(final TagGroup tag, BytecodeContext bc) throws TransformerException {
final GeneratorAdapter adapter = bc.getAdapter();
tag.setNumberIterator(adapter.newLocal(NUMBER_ITERATOR));
boolean isOutput = tag.getType() == TagGroup.TAG_OUTPUT;
ParseBodyVisitor pbv = isOutput ? new ParseBodyVisitor() : null;
if (isOutput)
pbv.visitBegin(bc);
// Query query=pc.getQuery(@query);
tag.setQuery(adapter.newLocal(Types.QUERY));
adapter.loadArg(0);
Expression val = tag.getAttribute("query").getValue();
val.writeOut(bc, Expression.MODE_REF);
if (val instanceof LitString)
adapter.invokeVirtual(Types.PAGE_CONTEXT, TagLoop.GET_QUERY_STRING);
else
adapter.invokeVirtual(Types.PAGE_CONTEXT, TagLoop.GET_QUERY_OBJ);
adapter.storeLocal(tag.getQuery());
tag.setPID(adapter.newLocal(Types.INT_VALUE));
adapter.loadArg(0);
adapter.invokeVirtual(Types.PAGE_CONTEXT, TagLoop.GET_ID);
adapter.storeLocal(tag.getPID());
// int startAt=query.getCurrentrow();
final int startAt = adapter.newLocal(Types.INT_VALUE);
adapter.loadLocal(tag.getQuery());
adapter.loadLocal(tag.getPID());
// adapter.loadArg(0);
// adapter.invokeVirtual(Types.PAGE_CONTEXT, TagLoop.GET_ID);
adapter.invokeInterface(Types.QUERY, TagLoop.GET_CURRENTROW_1);
adapter.storeLocal(startAt);
// if(query.getRecordcount()>0) {
DecisionIntVisitor div = new DecisionIntVisitor();
div.visitBegin();
adapter.loadLocal(tag.getQuery());
adapter.invokeInterface(Types.QUERY, GET_RECORDCOUNT);
div.visitGT();
adapter.push(0);
div.visitEnd(bc);
Label ifRecCount = new Label();
adapter.ifZCmp(Opcodes.IFEQ, ifRecCount);
// startrow
int from = adapter.newLocal(Types.INT_VALUE);
Attribute attrStartRow = tag.getAttribute("startrow");
if (attrStartRow != null) {
// NumberRange.range(@startrow,1)
// attrStartRow.getValue().writeOut(bc, Expression.MODE_VALUE);
bc.getFactory().toExprInt(attrStartRow.getValue()).writeOut(bc, Expression.MODE_VALUE);
// adapter.visitInsn(Opcodes.D2I);
adapter.push(1);
adapter.invokeStatic(Types.NUMBER_RANGE, RANGE);
// adapter.visitInsn(Opcodes.D2I);
} else {
adapter.push(1);
}
adapter.storeLocal(from);
// numberIterator
adapter.loadLocal(from);
adapter.loadLocal(tag.getQuery());
adapter.invokeInterface(Types.QUERY, GET_RECORDCOUNT);
// adapter.visitInsn(Opcodes.I2D);
Attribute attrMaxRow = tag.getAttribute("maxrows");
Attribute attrEndRow = tag.getAttribute("endrow");
if (attrMaxRow != null) {
bc.getFactory().toExprInt(attrMaxRow.getValue()).writeOut(bc, Expression.MODE_VALUE);
adapter.invokeStatic(NUMBER_ITERATOR, LOAD_MAX);
} else if (attrEndRow != null) {
bc.getFactory().toExprInt(attrEndRow.getValue()).writeOut(bc, Expression.MODE_VALUE);
adapter.invokeStatic(NUMBER_ITERATOR, LOAD_END);
} else {
adapter.invokeStatic(NUMBER_ITERATOR, LOAD_2);
}
adapter.storeLocal(tag.getNumberIterator());
// Group
Attribute attrGroup = tag.getAttribute("group");
Attribute attrGroupCS = tag.getAttribute("groupcasesensitive");
tag.setGroup(adapter.newLocal(Types.STRING));
final int groupCaseSensitive = adapter.newLocal(Types.BOOLEAN_VALUE);
if (attrGroup != null) {
attrGroup.getValue().writeOut(bc, Expression.MODE_REF);
adapter.storeLocal(tag.getGroup());
if (attrGroupCS != null)
attrGroupCS.getValue().writeOut(bc, Expression.MODE_VALUE);
else
adapter.push(false);
adapter.storeLocal(groupCaseSensitive);
}
// pc.us().addQuery(query);
adapter.loadArg(0);
adapter.invokeVirtual(Types.PAGE_CONTEXT, US);
adapter.loadLocal(tag.getQuery());
adapter.invokeInterface(UNDEFINED, ADD_QUERY);
// current
final int current = adapter.newLocal(Types.INT_VALUE);
adapter.loadLocal(from);
adapter.push(1);
adapter.visitInsn(Opcodes.ISUB);
adapter.storeLocal(current);
// Try
TryFinallyVisitor tfv = new TryFinallyVisitor(new OnFinally() {
@Override
public void _writeOut(BytecodeContext bc) {
// query.reset();
// query.go(startAt);
adapter.loadLocal(tag.getQuery());
adapter.loadLocal(startAt);
adapter.loadLocal(tag.getPID());
// adapter.loadArg(0);
// adapter.invokeVirtual(Types.PAGE_CONTEXT, TagLoop.GET_ID);
adapter.invokeInterface(Types.QUERY, TagLoop.GO);
adapter.pop();
// pc.us().removeQuery();
adapter.loadArg(0);
adapter.invokeVirtual(Types.PAGE_CONTEXT, US);
adapter.invokeInterface(UNDEFINED, REMOVE_QUERY);
// NumberIterator.release(ni);
adapter.loadLocal(tag.getNumberIterator());
adapter.invokeStatic(NUMBER_ITERATOR, REALEASE);
}
}, null);
tfv.visitTryBegin(bc);
WhileVisitor wv = new WhileVisitor();
if (tag instanceof TagLoop)
((TagLoop) tag).setLoopVisitor(wv);
wv.visitBeforeExpression(bc);
// while(ni.isValid()) {
adapter.loadLocal(tag.getNumberIterator());
adapter.loadLocal(current);
adapter.push(1);
adapter.visitInsn(Opcodes.IADD);
adapter.invokeVirtual(NUMBER_ITERATOR, IS_VALID_1);
wv.visitAfterExpressionBeforeBody(bc);
// if(!query.go(ni.current()))break;
adapter.loadLocal(tag.getQuery());
adapter.loadLocal(tag.getNumberIterator());
adapter.invokeVirtual(NUMBER_ITERATOR, CURRENT);
adapter.loadLocal(tag.getPID());
adapter.invokeInterface(Types.QUERY, TagLoop.GO);
NotVisitor.visitNot(bc);
Label _if = new Label();
adapter.ifZCmp(Opcodes.IFEQ, _if);
wv.visitBreak(bc);
adapter.visitLabel(_if);
if (attrGroup != null) {
// NumberIterator oldNi=numberIterator;
int oldNi = adapter.newLocal(NUMBER_ITERATOR);
adapter.loadLocal(tag.getNumberIterator());
adapter.storeLocal(oldNi);
// numberIterator=NumberIterator.load(ni,query,group,grp_case);
adapter.loadArg(0);
adapter.loadLocal(tag.getNumberIterator());
adapter.loadLocal(tag.getQuery());
adapter.loadLocal(tag.getGroup());
adapter.loadLocal(groupCaseSensitive);
adapter.invokeStatic(NUMBER_ITERATOR, LOAD_5);
adapter.storeLocal(tag.getNumberIterator());
// current=oldNi.current();
adapter.loadLocal(oldNi);
adapter.invokeVirtual(NUMBER_ITERATOR, CURRENT);
adapter.storeLocal(current);
tag.getBody().writeOut(bc);
// tmp(adapter,current);
// NumberIterator.release(ni);
adapter.loadLocal(tag.getNumberIterator());
adapter.invokeStatic(NUMBER_ITERATOR, REALEASE);
// numberIterator=oldNi;
adapter.loadLocal(oldNi);
adapter.storeLocal(tag.getNumberIterator());
} else {
// current=ni.current();
adapter.loadLocal(tag.getNumberIterator());
adapter.invokeVirtual(NUMBER_ITERATOR, CURRENT);
adapter.storeLocal(current);
tag.getBody().writeOut(bc);
}
// ni.setCurrent(current+1);
/*adapter.loadLocal(tag.getNumberIterator());
adapter.loadLocal(current);
adapter.push(1);
adapter.visitInsn(Opcodes.IADD);
adapter.invokeVirtual(NUMBER_ITERATOR, SET_CURRENT);*/
wv.visitAfterBody(bc, tag.getEnd());
tfv.visitTryEnd(bc);
adapter.visitLabel(ifRecCount);
if (isOutput)
pbv.visitEnd(bc);
}
use of lucee.transformer.bytecode.visitor.DecisionIntVisitor in project Lucee by lucee.
the class TagLoop method writeOutTypeFile.
/**
* write out file loop
* @param adapter
* @throws TemplateException
*/
private void writeOutTypeFile(BytecodeContext bc) throws TransformerException {
WhileVisitor whileVisitor = new WhileVisitor();
loopVisitor = whileVisitor;
GeneratorAdapter adapter = bc.getAdapter();
// charset=@charset
int charset = adapter.newLocal(Types.STRING);
Attribute attrCharset = getAttribute("charset");
if (attrCharset == null)
adapter.visitInsn(Opcodes.ACONST_NULL);
else
attrCharset.getValue().writeOut(bc, Expression.MODE_REF);
adapter.storeLocal(charset);
// startline=@startline
int startline = adapter.newLocal(Types.INT_VALUE);
Attribute attrStartLine = getAttribute("startline");
// CF8
if (attrStartLine == null)
attrStartLine = getAttribute("from");
if (attrStartLine == null)
adapter.push(1);
else {
attrStartLine.getValue().writeOut(bc, Expression.MODE_VALUE);
adapter.visitInsn(Opcodes.D2I);
}
adapter.storeLocal(startline);
// endline=@endline
int endline = adapter.newLocal(Types.INT_VALUE);
Attribute attrEndLine = getAttribute("endline");
if (attrEndLine == null)
attrEndLine = getAttribute("to");
if (attrEndLine == null)
adapter.push(-1);
else {
attrEndLine.getValue().writeOut(bc, Expression.MODE_VALUE);
adapter.visitInsn(Opcodes.D2I);
}
adapter.storeLocal(endline);
// VariableReference index=VariableInterpreter.getVariableReference(pc,@index);
int index = -1, item = -1;
// item
Attribute attrItem = getAttribute("item");
if (attrItem != null) {
item = adapter.newLocal(Types.VARIABLE_REFERENCE);
adapter.loadArg(0);
attrItem.getValue().writeOut(bc, Expression.MODE_REF);
adapter.invokeStatic(Types.VARIABLE_INTERPRETER, GET_VARIABLE_REFERENCE);
adapter.storeLocal(item);
}
// index
Attribute attrIndex = getAttribute("index");
if (attrIndex != null) {
index = adapter.newLocal(Types.VARIABLE_REFERENCE);
adapter.loadArg(0);
attrIndex.getValue().writeOut(bc, Expression.MODE_REF);
adapter.invokeStatic(Types.VARIABLE_INTERPRETER, GET_VARIABLE_REFERENCE);
adapter.storeLocal(index);
}
// java.io.File file=FileUtil.toResourceExisting(pc,@file);
int resource = adapter.newLocal(Types.RESOURCE);
adapter.loadArg(0);
getAttribute("file").getValue().writeOut(bc, Expression.MODE_REF);
adapter.invokeStatic(RESOURCE_UTIL, TO_RESOURCE_EXISTING);
adapter.storeLocal(resource);
// pc.getConfig().getSecurityManager().checkFileLocation(resource);
adapter.loadArg(0);
adapter.invokeVirtual(Types.PAGE_CONTEXT, GET_CONFIG);
adapter.invokeInterface(Types.CONFIG_WEB, GET_SECURITY_MANAGER);
adapter.loadLocal(resource);
adapter.invokeInterface(Types.SECURITY_MANAGER, CHECK_FILE_LOCATION);
// char[] carr=new char[characters];
Attribute attr = getAttribute("characters");
int carr = -1;
if (attr != null) {
carr = adapter.newLocal(Types.CHAR_ARRAY);
attr.getValue().writeOut(bc, Expression.MODE_VALUE);
adapter.cast(Types.DOUBLE_VALUE, Types.INT_VALUE);
adapter.newArray(Types.CHAR);
adapter.storeLocal(carr);
}
// BufferedReader reader = IOUtil.getBufferedReader(resource,charset);
final int br = adapter.newLocal(Types.BUFFERED_READER);
adapter.loadLocal(resource);
adapter.loadLocal(charset);
adapter.invokeStatic(IO_UTIL, GET_BUFFERED_READER);
adapter.storeLocal(br);
// String line;
int line = adapter.newLocal(Types.STRING);
// int count=0;
int count = adapter.newLocal(Types.INT_VALUE);
adapter.push(0);
adapter.storeLocal(count);
TryFinallyVisitor tfv = new TryFinallyVisitor(new OnFinally() {
@Override
public void _writeOut(BytecodeContext bc) {
bc.getAdapter().loadLocal(br);
bc.getAdapter().invokeStatic(IO_UTIL, CLOSE_EL);
}
}, null);
// TryFinallyVisitor tcfv=new TryFinallyVisitor();
// try
tfv.visitTryBegin(bc);
// tcfv.visitTryBegin(bc);
// while((line=br.readLine())!=null) {
// WhileVisitor wv=new WhileVisitor();
whileVisitor.visitBeforeExpression(bc);
DecisionObjectVisitor dv = new DecisionObjectVisitor();
dv.visitBegin();
if (attr != null) {
// IOUtil.read(bufferedreader,12)
adapter.loadLocal(br);
adapter.loadLocal(carr);
adapter.arrayLength();
adapter.invokeStatic(Types.IOUTIL, READ);
} else {
// br.readLine()
adapter.loadLocal(br);
adapter.invokeVirtual(Types.BUFFERED_READER, READ_LINE);
}
adapter.dup();
adapter.storeLocal(line);
dv.visitNEQ();
adapter.visitInsn(Opcodes.ACONST_NULL);
dv.visitEnd(bc);
whileVisitor.visitAfterExpressionBeforeBody(bc);
// if(++count < startLine) continue;
DecisionIntVisitor dv2 = new DecisionIntVisitor();
dv2.visitBegin();
adapter.iinc(count, 1);
adapter.loadLocal(count);
dv2.visitLT();
adapter.loadLocal(startline);
dv2.visitEnd(bc);
Label end = new Label();
adapter.ifZCmp(Opcodes.IFEQ, end);
whileVisitor.visitContinue(bc);
adapter.visitLabel(end);
// if(endLine!=-1 && count > endLine) break;
DecisionIntVisitor div = new DecisionIntVisitor();
div.visitBegin();
adapter.loadLocal(endline);
div.visitNEQ();
adapter.push(-1);
div.visitEnd(bc);
Label end2 = new Label();
adapter.ifZCmp(Opcodes.IFEQ, end2);
DecisionIntVisitor div2 = new DecisionIntVisitor();
div2.visitBegin();
adapter.loadLocal(count);
div2.visitGT();
adapter.loadLocal(endline);
div2.visitEnd(bc);
Label end3 = new Label();
adapter.ifZCmp(Opcodes.IFEQ, end3);
whileVisitor.visitBreak(bc);
adapter.visitLabel(end3);
adapter.visitLabel(end2);
// index and item
if (index != -1 && item != -1) {
// index.set(pc,line);
adapter.loadLocal(index);
adapter.loadArg(0);
adapter.loadLocal(count);
adapter.cast(Types.INT_VALUE, Types.DOUBLE_VALUE);
adapter.invokeStatic(Types.CASTER, Methods.METHOD_TO_DOUBLE_FROM_DOUBLE);
adapter.invokeVirtual(Types.VARIABLE_REFERENCE, SET);
adapter.pop();
// item.set(pc,line);
adapter.loadLocal(item);
adapter.loadArg(0);
adapter.loadLocal(line);
adapter.invokeVirtual(Types.VARIABLE_REFERENCE, SET);
adapter.pop();
} else // only index
if (index != -1) {
// index.set(pc,line);
adapter.loadLocal(index);
adapter.loadArg(0);
adapter.loadLocal(line);
adapter.invokeVirtual(Types.VARIABLE_REFERENCE, SET);
adapter.pop();
} else // only item
{
// item.set(pc,line);
adapter.loadLocal(item);
adapter.loadArg(0);
adapter.loadLocal(line);
adapter.invokeVirtual(Types.VARIABLE_REFERENCE, SET);
adapter.pop();
}
getBody().writeOut(bc);
whileVisitor.visitAfterBody(bc, getEnd());
tfv.visitTryEnd(bc);
}
use of lucee.transformer.bytecode.visitor.DecisionIntVisitor in project Lucee by lucee.
the class TagSwitch method addCase.
private void addCase(BytecodeContext bc, ConditionVisitor cv, Tag tag, int expression) throws TransformerException {
GeneratorAdapter adapter = bc.getAdapter();
cv.visitWhenBeforeExpr();
DecisionIntVisitor div = new DecisionIntVisitor();
div.visitBegin();
// List.listFindNoCase(case.value,expression,del);
tag.getAttribute("value").getValue().writeOut(bc, Expression.MODE_REF);
adapter.loadLocal(expression);
Attribute attr = tag.getAttribute("delimiters");
if (attr != null)
attr.getValue().writeOut(bc, Expression.MODE_REF);
else
adapter.push(",");
adapter.invokeStatic(Types.LIST_UTIL, LIST_FIND_NO_CASE);
div.visitNEQ();
adapter.push(-1);
div.visitEnd(bc);
cv.visitWhenAfterExprBeforeBody(bc);
BodyBase.writeOut(bc, tag.getBody());
// tag.getBody().writeOut(bc);
cv.visitWhenAfterBody(bc);
/*if(List.listFindNoCase(case.value,expression,delimiters)!=-1) {
<xsl:apply-templates select="./body/*"/>
}*/
}
use of lucee.transformer.bytecode.visitor.DecisionIntVisitor in project Lucee by lucee.
the class SourceLastModifiedClassAdapter method writeUdfDefaultValueInner.
private void writeUdfDefaultValueInner(BytecodeContext bc, Function[] functions, int offset, int length) throws TransformerException {
GeneratorAdapter adapter = bc.getAdapter();
ConditionVisitor cv = new ConditionVisitor();
DecisionIntVisitor div;
cv.visitBefore();
for (int i = offset; i < length; i++) {
cv.visitWhenBeforeExpr();
div = new DecisionIntVisitor();
div.visitBegin();
adapter.loadArg(1);
div.visitEQ();
adapter.push(i);
div.visitEnd(bc);
cv.visitWhenAfterExprBeforeBody(bc);
writeOutFunctionDefaultValueInnerInner(bc, functions[i]);
cv.visitWhenAfterBody(bc);
}
cv.visitAfter(bc);
}
use of lucee.transformer.bytecode.visitor.DecisionIntVisitor in project Lucee by lucee.
the class SourceLastModifiedClassAdapter method writeOutFunctionDefaultValueInnerInner.
private void writeOutFunctionDefaultValueInnerInner(BytecodeContext bc, Function function) throws TransformerException {
GeneratorAdapter adapter = bc.getAdapter();
List<Argument> args = function.getArguments();
if (args.size() == 0) {
adapter.loadArg(DEFAULT_VALUE);
adapter.returnValue();
return;
}
Iterator<Argument> it = args.iterator();
Argument arg;
ConditionVisitor cv = new ConditionVisitor();
DecisionIntVisitor div;
cv.visitBefore();
int count = 0;
while (it.hasNext()) {
arg = it.next();
cv.visitWhenBeforeExpr();
div = new DecisionIntVisitor();
div.visitBegin();
adapter.loadArg(2);
div.visitEQ();
adapter.push(count++);
div.visitEnd(bc);
cv.visitWhenAfterExprBeforeBody(bc);
Expression defaultValue = arg.getDefaultValue();
if (defaultValue != null) {
/*if(defaultValue instanceof Null) {
adapter.invokeStatic(NULL, GET_INSTANCE);
}
else*/
defaultValue.writeOut(bc, Expression.MODE_REF);
} else
adapter.loadArg(DEFAULT_VALUE);
// adapter.visitInsn(Opcodes.ACONST_NULL);
adapter.returnValue();
cv.visitWhenAfterBody(bc);
}
cv.visitOtherviseBeforeBody();
// adapter.visitInsn(ACONST_NULL);
// adapter.returnValue();
cv.visitOtherviseAfterBody();
cv.visitAfter(bc);
}
Aggregations