Search in sources :

Example 16 with Statement

use of lucee.transformer.bytecode.Statement in project Lucee by lucee.

the class TagTry2 method _writeOut.

@Override
public void _writeOut(BytecodeContext bc) throws TransformerException {
    GeneratorAdapter adapter = bc.getAdapter();
    adapter.visitLabel(begin);
    Body tryBody = new BodyBase(getFactory());
    List<Tag> catches = new ArrayList<Tag>();
    Tag tmpFinal = null;
    tryBody.setParent(getBody().getParent());
    List<Statement> statements = getBody().getStatements();
    Statement stat;
    Tag tag;
    {
        Iterator<Statement> it = statements.iterator();
        while (it.hasNext()) {
            stat = it.next();
            if (stat instanceof Tag) {
                tag = (Tag) stat;
                if (tag.getTagLibTag().getTagClassDefinition().isClassNameEqualTo("lucee.runtime.tag.Catch")) {
                    catches.add(tag);
                    continue;
                } else if (tag.getTagLibTag().getTagClassDefinition().isClassNameEqualTo("lucee.runtime.tag.Finally")) {
                    tmpFinal = tag;
                    continue;
                }
            }
            tryBody.addStatement(stat);
        }
        ;
    }
    final Tag _finally = tmpFinal;
    // has no try body, if there is no try body, no catches are executed, only finally
    if (!tryBody.hasStatements()) {
        if (_finally != null && _finally.getBody() != null) {
            BodyBase.writeOut(bc, _finally.getBody());
        // ExpressionUtil.writeOut(_finally.getBody(), bc);
        }
        return;
    }
    TryCatchFinallyVisitor tcfv = new TryCatchFinallyVisitor(new OnFinally() {

        @Override
        public void _writeOut(BytecodeContext bc) throws TransformerException {
            if (_finally != null) {
                ExpressionUtil.visitLine(bc, _finally.getStart());
                BodyBase.writeOut(bc, _finally.getBody());
            // ExpressionUtil.writeOut(_finally.getBody(), bc);
            }
        }
    }, getFlowControlFinal());
    // Try
    tcfv.visitTryBegin(bc);
    BodyBase.writeOut(bc, tryBody);
    // ExpressionUtil.writeOut(tryBody, bc);
    int e = tcfv.visitTryEndCatchBeging(bc);
    // if(e instanceof lucee.runtime.exp.Abort) throw e;
    Label abortEnd = new Label();
    adapter.loadLocal(e);
    // Abort.isAbort(t);
    adapter.invokeStatic(Types.ABORT, TryCatchFinally.IS_ABORT);
    // adapter.instanceOf(Types.ABORT);
    adapter.ifZCmp(Opcodes.IFEQ, abortEnd);
    adapter.loadLocal(e);
    adapter.throwException();
    adapter.visitLabel(abortEnd);
    // PageExceptionImpl old=pc.getCatch();
    int oldPE = adapter.newLocal(Types.PAGE_EXCEPTION);
    int oldName = adapter.newLocal(Types.STRING);
    adapter.loadArg(0);
    adapter.invokeVirtual(Types.PAGE_CONTEXT, GET_CATCH);
    adapter.storeLocal(oldPE);
    adapter.loadArg(0);
    adapter.checkCast(Types.PAGE_CONTEXT_IMPL);
    adapter.invokeVirtual(Types.PAGE_CONTEXT_IMPL, GET_CATCH_NAME);
    adapter.storeLocal(oldName);
    // PageException pe=Caster.toPageEception(e);
    int pe = adapter.newLocal(Types.PAGE_EXCEPTION);
    adapter.loadLocal(e);
    adapter.invokeStatic(Types.CASTER, TO_PAGE_EXCEPTION);
    adapter.storeLocal(pe);
    Iterator<Tag> it = catches.iterator();
    Attribute attrType;
    Expression type;
    Label endAllIfs = new Label();
    Tag tagElse = null;
    while (it.hasNext()) {
        tag = it.next();
        Label endIf = new Label();
        // type
        attrType = tag.getAttribute("type");
        type = bc.getFactory().createLitString("any");
        if (attrType != null)
            type = attrType.getValue();
        if (type instanceof LitString && ((LitString) type).getString().equalsIgnoreCase("any")) {
            tagElse = tag;
            continue;
        }
        ExpressionUtil.visitLine(bc, tag.getStart());
        // if(pe.typeEqual(@type)
        adapter.loadLocal(pe);
        type.writeOut(bc, Expression.MODE_REF);
        adapter.invokeVirtual(Types.PAGE_EXCEPTION, TYPE_EQUAL);
        adapter.ifZCmp(Opcodes.IFEQ, endIf);
        catchBody(bc, adapter, tag, pe, true, true, extractName(tag));
        adapter.visitJumpInsn(Opcodes.GOTO, endAllIfs);
        adapter.visitLabel(endIf);
    }
    // else
    if (tagElse != null) {
        catchBody(bc, adapter, tagElse, pe, true, true, extractName(tagElse));
    } else {
        // pc.setCatch(pe,true);
        adapter.loadArg(0);
        adapter.loadLocal(pe);
        adapter.push(false);
        adapter.push(true);
        adapter.invokeVirtual(Types.PAGE_CONTEXT, SET_CATCH3);
        // throw pe;
        adapter.loadLocal(pe);
        adapter.throwException();
    }
    adapter.visitLabel(endAllIfs);
    adapter.loadLocal(oldName);
    Label notNull = new Label();
    adapter.visitJumpInsn(Opcodes.IFNONNULL, notNull);
    // NULL
    adapter.loadArg(0);
    adapter.loadLocal(oldPE);
    adapter.invokeVirtual(Types.PAGE_CONTEXT, SET_CATCH_PE);
    Label end = new Label();
    adapter.visitJumpInsn(Opcodes.GOTO, end);
    adapter.visitLabel(notNull);
    // NOT NULL
    adapter.loadArg(0);
    adapter.checkCast(Types.PAGE_CONTEXT_IMPL);
    adapter.loadLocal(oldPE);
    adapter.loadLocal(oldName);
    adapter.invokeVirtual(Types.PAGE_CONTEXT_IMPL, SET_CATCH_PE2);
    adapter.visitLabel(end);
    tcfv.visitCatchEnd(bc);
}
Also used : Statement(lucee.transformer.bytecode.Statement) ArrayList(java.util.ArrayList) Label(org.objectweb.asm.Label) LitString(lucee.transformer.expression.literal.LitString) Expression(lucee.transformer.expression.Expression) Iterator(java.util.Iterator) OnFinally(lucee.transformer.bytecode.visitor.OnFinally) GeneratorAdapter(org.objectweb.asm.commons.GeneratorAdapter) TryCatchFinallyVisitor(lucee.transformer.bytecode.visitor.TryCatchFinallyVisitor) Body(lucee.transformer.bytecode.Body) BodyBase(lucee.transformer.bytecode.BodyBase) TransformerException(lucee.transformer.TransformerException) BytecodeContext(lucee.transformer.bytecode.BytecodeContext)

Example 17 with Statement

use of lucee.transformer.bytecode.Statement in project Lucee by lucee.

the class TagTry2 method hasFinally.

private boolean hasFinally() {
    List<Statement> statements = getBody().getStatements();
    Statement stat;
    Tag tag;
    Iterator<Statement> it = statements.iterator();
    while (it.hasNext()) {
        stat = it.next();
        if (stat instanceof Tag) {
            tag = (Tag) stat;
            if (tag.getTagLibTag().getTagClassDefinition().isClassNameEqualTo("lucee.runtime.tag.Finally")) {
                return true;
            }
        }
    }
    return false;
}
Also used : Statement(lucee.transformer.bytecode.Statement)

Example 18 with Statement

use of lucee.transformer.bytecode.Statement in project Lucee by lucee.

the class ASMUtil method removeLiterlChildren.

public static void removeLiterlChildren(Tag tag, boolean recursive) {
    Body body = tag.getBody();
    if (body != null) {
        List<Statement> list = body.getStatements();
        Statement[] stats = list.toArray(new Statement[list.size()]);
        PrintOut po;
        Tag t;
        for (int i = 0; i < stats.length; i++) {
            if (stats[i] instanceof PrintOut) {
                po = (PrintOut) stats[i];
                if (po.getExpr() instanceof Literal) {
                    body.getStatements().remove(po);
                }
            } else if (recursive && stats[i] instanceof Tag) {
                t = (Tag) stats[i];
                if (t.getTagLibTag().isAllowRemovingLiteral()) {
                    removeLiterlChildren(t, recursive);
                }
            }
        }
    }
}
Also used : PrintOut(lucee.transformer.bytecode.statement.PrintOut) Statement(lucee.transformer.bytecode.Statement) Literal(lucee.transformer.expression.literal.Literal) Tag(lucee.transformer.bytecode.statement.tag.Tag) Body(lucee.transformer.bytecode.Body) ScriptBody(lucee.transformer.bytecode.ScriptBody) HasBody(lucee.transformer.bytecode.statement.HasBody) lucee.aprint(lucee.aprint)

Example 19 with Statement

use of lucee.transformer.bytecode.Statement in project Lucee by lucee.

the class ASMUtil method getParentTag.

/**
 * Gibt das uebergeordnete CFXD Tag Element zurueck, falls dies nicht existiert wird null zurueckgegeben.
 * @param el Element von dem das parent Element zurueckgegeben werden soll.
 * @return uebergeordnete CFXD Tag Element
 */
public static Tag getParentTag(Tag tag) {
    Statement p = tag.getParent();
    if (p == null)
        return null;
    p = p.getParent();
    if (p instanceof Tag)
        return (Tag) p;
    return null;
}
Also used : Statement(lucee.transformer.bytecode.Statement) Tag(lucee.transformer.bytecode.statement.tag.Tag)

Example 20 with Statement

use of lucee.transformer.bytecode.Statement in project Lucee by lucee.

the class ASMUtil method hasSisterTagWithSameName.

/**
 * Prueft ob das angegebene Tag innerhalb seiner Ebene einmalig ist oder nicht.
 * @param tag Ausgangspunkt, nach diesem tag darf das angegebene nicht vorkommen.
 * @return kommt das Tag vor.
 */
public static boolean hasSisterTagWithSameName(Tag tag) {
    Body body = (Body) tag.getParent();
    List<Statement> stats = body.getStatements();
    Iterator<Statement> it = stats.iterator();
    Statement other;
    String name = tag.getTagLibTag().getName();
    while (it.hasNext()) {
        other = it.next();
        if (other != tag && other instanceof Tag && ((Tag) other).getTagLibTag().getName().equals(name))
            return true;
    }
    return false;
}
Also used : Statement(lucee.transformer.bytecode.Statement) VariableString(lucee.transformer.bytecode.expression.var.VariableString) LitString(lucee.transformer.expression.literal.LitString) ExprString(lucee.transformer.expression.ExprString) Tag(lucee.transformer.bytecode.statement.tag.Tag) Body(lucee.transformer.bytecode.Body) ScriptBody(lucee.transformer.bytecode.ScriptBody) HasBody(lucee.transformer.bytecode.statement.HasBody)

Aggregations

Statement (lucee.transformer.bytecode.Statement)28 Body (lucee.transformer.bytecode.Body)15 Tag (lucee.transformer.bytecode.statement.tag.Tag)13 Expression (lucee.transformer.expression.Expression)7 LitString (lucee.transformer.expression.literal.LitString)7 TagLibTag (lucee.transformer.library.tag.TagLibTag)7 ArrayList (java.util.ArrayList)6 ScriptBody (lucee.transformer.bytecode.ScriptBody)6 PrintOut (lucee.transformer.bytecode.statement.PrintOut)6 Iterator (java.util.Iterator)5 HasBody (lucee.transformer.bytecode.statement.HasBody)5 EvaluatorException (lucee.transformer.cfml.evaluator.EvaluatorException)5 List (java.util.List)4 StaticBody (lucee.transformer.bytecode.StaticBody)4 GeneratorAdapter (org.objectweb.asm.commons.GeneratorAdapter)4 lucee.aprint (lucee.aprint)3 TransformerException (lucee.transformer.TransformerException)3 BodyBase (lucee.transformer.bytecode.BodyBase)3 Literal (lucee.transformer.expression.literal.Literal)3 Label (org.objectweb.asm.Label)3