Search in sources :

Example 1 with LabelNode

use of org.objectweb.asm.tree.LabelNode in project jphp by jphp-compiler.

the class WhileCompiler method write.

@Override
public void write(WhileStmtToken token) {
    expr.writeDefineVariables(token.getLocal());
    LabelNode start = expr.writeLabel(node, token.getMeta().getStartLine());
    LabelNode end = new LabelNode();
    expr.writeConditional(token.getCondition(), end);
    method.pushJump(end, start);
    expr.write(BodyStmtToken.class, token.getBody());
    method.popJump();
    add(new JumpInsnNode(GOTO, start));
    add(end);
    add(new LineNumberNode(token.getMeta().getEndLine(), end));
    expr.writeUndefineVariables(token.getLocal());
}
Also used : LabelNode(org.objectweb.asm.tree.LabelNode) JumpInsnNode(org.objectweb.asm.tree.JumpInsnNode) LineNumberNode(org.objectweb.asm.tree.LineNumberNode)

Example 2 with LabelNode

use of org.objectweb.asm.tree.LabelNode in project jphp by jphp-compiler.

the class GotoLabelCompiler method write.

@Override
public void write(LabelStmtToken token) {
    LabelNode labelNode = method.getOrCreateGotoLabel(token.getName());
    add(labelNode);
}
Also used : LabelNode(org.objectweb.asm.tree.LabelNode)

Example 3 with LabelNode

use of org.objectweb.asm.tree.LabelNode in project jphp by jphp-compiler.

the class IfElseCompiler method writeBody.

private void writeBody(IfStmtToken token) {
    LabelNode end = new LabelNode();
    LabelNode elseL = new LabelNode();
    expr.writePopBoolean();
    add(new JumpInsnNode(IFEQ, token.getElseBody() != null ? elseL : end));
    expr.stackPop();
    if (token.getBody() != null) {
        expr.write(token.getBody());
    }
    if (token.getElseBody() != null) {
        add(new JumpInsnNode(GOTO, end));
        add(elseL);
        expr.write(token.getElseBody());
    }
    add(end);
    add(new LineNumberNode(token.getMeta().getEndLine(), end));
}
Also used : LabelNode(org.objectweb.asm.tree.LabelNode) JumpInsnNode(org.objectweb.asm.tree.JumpInsnNode) LineNumberNode(org.objectweb.asm.tree.LineNumberNode)

Example 4 with LabelNode

use of org.objectweb.asm.tree.LabelNode in project jphp by jphp-compiler.

the class SwitchCompiler method write.

@Override
public void write(SwitchStmtToken token) {
    expr.writeDefineVariables(token.getLocal());
    LabelNode l = new LabelNode();
    LabelNode end = new LabelNode();
    add(l);
    LocalVariable switchValue = method.addLocalVariable("~switch~" + method.nextStatementIndex(Memory.class), l, Memory.class);
    switchValue.setEndLabel(end);
    LabelNode[][] jumps = new LabelNode[token.getCases().size() + 1][2];
    int i = 0;
    for (CaseStmtToken one : token.getCases()) {
        // checkLabel, bodyLabel
        jumps[i] = new LabelNode[] { new LabelNode(), new LabelNode() };
        if (i == jumps.length - 1)
            jumps[i] = new LabelNode[] { end, end };
        i++;
    }
    jumps[jumps.length - 1] = new LabelNode[] { end, end };
    method.pushJump(end, end);
    expr.writeExpression(token.getValue(), true, false);
    expr.writePopBoxing();
    expr.writeVarStore(switchValue, false, false);
    i = 0;
    for (CaseStmtToken one : token.getCases()) {
        // conditional
        add(jumps[i][0]);
        if (one.getConditional() != null) {
            expr.writeVarLoad(switchValue);
            expr.writeExpression(one.getConditional(), true, false);
            expr.writeSysDynamicCall(Memory.class, "equal", Boolean.TYPE, expr.stackPeek().type.toClass());
            add(new JumpInsnNode(IFEQ, jumps[i + 1][0]));
            expr.stackPop();
        }
        // if is done...
        add(new JumpInsnNode(GOTO, jumps[i][1]));
        i++;
    }
    i = 0;
    for (CaseStmtToken one : token.getCases()) {
        add(jumps[i][1]);
        expr.writeDefineVariables(one.getLocals());
        expr.write(BodyStmtToken.class, one.getBody());
        i++;
        expr.writeUndefineVariables(one.getLocals());
    }
    method.popJump();
    add(end);
    add(new LineNumberNode(token.getMeta().getEndLine(), end));
    method.prevStatementIndex(Memory.class);
    expr.writeUndefineVariables(token.getLocal());
}
Also used : LabelNode(org.objectweb.asm.tree.LabelNode) CaseStmtToken(org.develnext.jphp.core.tokenizer.token.stmt.CaseStmtToken) LocalVariable(org.develnext.jphp.core.compiler.jvm.misc.LocalVariable) JumpInsnNode(org.objectweb.asm.tree.JumpInsnNode) LineNumberNode(org.objectweb.asm.tree.LineNumberNode)

Example 5 with LabelNode

use of org.objectweb.asm.tree.LabelNode in project jphp by jphp-compiler.

the class DoCompiler method write.

@Override
public void write(DoStmtToken token) {
    expr.writeDefineVariables(token.getLocal());
    LabelNode start = expr.writeLabel(node, token.getMeta().getStartLine());
    LabelNode end = new LabelNode();
    method.pushJump(end, start);
    expr.write(token.getBody());
    method.popJump();
    expr.writeConditional(token.getCondition(), end);
    add(new JumpInsnNode(GOTO, start));
    add(end);
    add(new LineNumberNode(token.getMeta().getEndLine(), end));
    expr.writeUndefineVariables(token.getLocal());
}
Also used : LabelNode(org.objectweb.asm.tree.LabelNode) JumpInsnNode(org.objectweb.asm.tree.JumpInsnNode) LineNumberNode(org.objectweb.asm.tree.LineNumberNode)

Aggregations

LabelNode (org.objectweb.asm.tree.LabelNode)89 JumpInsnNode (org.objectweb.asm.tree.JumpInsnNode)37 AbstractInsnNode (org.objectweb.asm.tree.AbstractInsnNode)32 Label (org.objectweb.asm.Label)28 MethodInsnNode (org.objectweb.asm.tree.MethodInsnNode)23 InsnList (org.objectweb.asm.tree.InsnList)22 VarInsnNode (org.objectweb.asm.tree.VarInsnNode)21 InsnNode (org.objectweb.asm.tree.InsnNode)20 MethodNode (org.objectweb.asm.tree.MethodNode)19 LdcInsnNode (org.objectweb.asm.tree.LdcInsnNode)17 FieldInsnNode (org.objectweb.asm.tree.FieldInsnNode)16 TypeInsnNode (org.objectweb.asm.tree.TypeInsnNode)15 ClassNode (org.objectweb.asm.tree.ClassNode)14 ClassReader (org.objectweb.asm.ClassReader)12 LineNumberNode (org.objectweb.asm.tree.LineNumberNode)10 Type (org.objectweb.asm.Type)8 LocalVariableNode (org.objectweb.asm.tree.LocalVariableNode)8 LinkedList (java.util.LinkedList)6 ArrayList (java.util.ArrayList)5 LookupSwitchInsnNode (org.objectweb.asm.tree.LookupSwitchInsnNode)5