Search in sources :

Example 46 with JumpInsnNode

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

the class ForCompiler method write.

@Override
public void write(ForStmtToken token) {
    expr.writeDefineVariables(token.getInitLocal());
    for (ExprStmtToken expr : token.getInitExpr()) {
        this.expr.writeExpression(expr, false, false);
    }
    expr.writeUndefineVariables(token.getInitLocal());
    expr.writeDefineVariables(token.getLocal());
    for (VariableExprToken variable : token.getIterationLocal()) {
        // TODO optimize this for Dynamic Values of variables
        LocalVariable local = method.getLocalVariable(variable.getName());
        local.setValue(null);
    }
    LabelNode start = expr.writeLabel(node, token.getMeta().getStartLine());
    LabelNode iter = new LabelNode();
    LabelNode end = new LabelNode();
    for (Iterator<ExprStmtToken> i = token.getConditionExpr().iterator(); i.hasNext(); ) {
        ExprStmtToken expr = i.next();
        if (i.hasNext()) {
            this.expr.writeExpression(expr, false, false);
        } else {
            this.expr.writeExpression(expr, true, false);
            this.expr.writePopBoolean();
            add(new JumpInsnNode(IFEQ, end));
            this.expr.stackPop();
        }
    }
    method.pushJump(end, iter);
    expr.write(BodyStmtToken.class, token.getBody());
    method.popJump();
    add(iter);
    for (ExprStmtToken expr : token.getIterationExpr()) {
        this.expr.writeExpression(expr, false, false);
    }
    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) ExprStmtToken(org.develnext.jphp.core.tokenizer.token.stmt.ExprStmtToken) LocalVariable(org.develnext.jphp.core.compiler.jvm.misc.LocalVariable) JumpInsnNode(org.objectweb.asm.tree.JumpInsnNode) VariableExprToken(org.develnext.jphp.core.tokenizer.token.expr.value.VariableExprToken) LineNumberNode(org.objectweb.asm.tree.LineNumberNode)

Example 47 with JumpInsnNode

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

the class GotoCompiler method write.

@Override
public void write(GotoStmtToken token) {
    LabelNode labelNode = method.getOrCreateGotoLabel(token.getLabel().getName());
    LabelStmtToken labelStmtToken = method.statement.findLabel(token.getLabel().getName());
    if (labelStmtToken == null) {
        compiler.getEnvironment().error(token.getLabel().toTraceInfo(compiler.getContext()), "'goto' to undefined label '%s'", token.getLabel().getName());
        return;
    }
    if (labelStmtToken.getLevel() > token.getLevel()) {
        compiler.getEnvironment().error(token.toTraceInfo(compiler.getContext()), "'goto' into loop, switch or finally statement is disallowed");
    }
    add(new JumpInsnNode(GOTO, labelNode));
}
Also used : LabelNode(org.objectweb.asm.tree.LabelNode) LabelStmtToken(org.develnext.jphp.core.tokenizer.token.stmt.LabelStmtToken) JumpInsnNode(org.objectweb.asm.tree.JumpInsnNode)

Example 48 with JumpInsnNode

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

the class ForeachCompiler method write.

@Override
public void write(ForeachStmtToken token) {
    expr.writeDefineVariables(token.getLocal());
    LabelNode start = new LabelNode();
    LabelNode end = new LabelNode();
    LabelNode l = new LabelNode();
    add(l);
    expr.writePushEnv();
    expr.writePushTraceInfo(token);
    expr.writeExpression(token.getIterator(), true, false, true);
    expr.writePopBoxing();
    expr.writePushConstBoolean(token.isValueReference());
    expr.writePushConstBoolean(token.isKeyReference());
    expr.writeSysDynamicCall(Environment.class, "__getIterator", ForeachIterator.class, TraceInfo.class, Memory.class, Boolean.TYPE, Boolean.TYPE);
    String name = "~foreach~" + method.nextStatementIndex(ForeachIterator.class);
    LocalVariable foreachVariable = method.getLocalVariable(name);
    if (foreachVariable == null)
        foreachVariable = method.addLocalVariable(name, l, ForeachIterator.class);
    /*LocalVariable foreachVariable = method.addLocalVariable(
                "~foreach~" + method.nextStatementIndex(ForeachIterator.class), l, ForeachIterator.class
        );*/
    foreachVariable.setEndLabel(end);
    expr.writeVarStore(foreachVariable, false, false);
    method.pushJump(end, start);
    add(start);
    expr.writeVarLoad(foreachVariable);
    expr.writeSysDynamicCall(ForeachIterator.class, "next", Boolean.TYPE);
    add(new JumpInsnNode(IFEQ, end));
    expr.stackPop();
    // $key
    if (token.getKey() != null) {
        LocalVariable key = method.getLocalVariable(token.getKey().getName());
        expr.checkAssignableVar(token.getKey());
        expr.writeVarLoad(foreachVariable);
        expr.writeSysDynamicCall(ForeachIterator.class, "getMemoryKey", Memory.class);
        if (token.isKeyReference()) {
            throw new FatalException("Key element cannot be a reference", token.getKey().toTraceInfo(compiler.getContext()));
        // writeVarStore(key, false, false);
        } else
            expr.writeVarAssign(key, null, false, false);
    }
    // $var
    // LocalVariable variable = method.getLocalVariable(token.getValue().getName());
    Token last = token.getValue().getLast();
    VariableExprToken var = null;
    if (last instanceof DynamicAccessExprToken) {
        DynamicAccessExprToken setter = (DynamicAccessExprToken) last;
        ExprStmtToken value = new ExprStmtToken(this.env, this.compiler.getContext(), token.getValue().getTokens());
        value.getTokens().remove(value.getTokens().size() - 1);
        value.updateAsmExpr(this.env, this.compiler.getContext());
        expr.writeExpression(value, true, false);
        expr.writeVarLoad(foreachVariable);
        expr.writeSysDynamicCall(ForeachIterator.class, "getValue", Memory.class);
        if (!token.isValueReference())
            expr.writePopImmutable();
        expr.writeDynamicAccessInfo(setter, false);
        expr.writeGetStatic("$CALL_PROP_CACHE", PropertyCallCache.class);
        expr.writePushConstInt(method.clazz.getAndIncCallPropCount());
        expr.writeSysStaticCall(ObjectInvokeHelper.class, "assignProperty", Memory.class, Memory.class, Memory.class, String.class, Environment.class, TraceInfo.class, PropertyCallCache.class, int.class);
    } else {
        if (token.getValue().getSingle() instanceof VariableExprToken)
            expr.checkAssignableVar(var = (VariableExprToken) token.getValue().getSingle());
        ExprStmtToken value = token.getValue();
        expr.writeVarLoad(foreachVariable);
        expr.writeSysDynamicCall(ForeachIterator.class, "getValue", Memory.class);
        if (value.isSingle() && value.getSingle() instanceof ListExprToken) {
            ListExprToken listExprToken = (ListExprToken) value.getSingle();
            if (!token.isValueReference() && !listExprToken.isHasRef()) {
                expr.writePopImmutable();
            }
            ListCompiler listCompiler = (ListCompiler) expr.getCompiler(ListExprToken.class);
            listCompiler.write(listExprToken, false, false);
        } else {
            if (!token.isValueReference())
                expr.writePopImmutable();
            expr.writeExpression(value, true, false);
            if (expr.stackPeek().immutable)
                expr.unexpectedToken(value.getLast());
            expr.writeSysStaticCall(Memory.class, token.isValueReference() ? "assignRefRight" : "assignRight", Memory.class, Memory.class, Memory.class);
        }
    }
    expr.writePopAll(1);
    /*
        if (token.isValueReference())
            writeVarStore(variable, false, false);
        else
            writeVarAssign(variable, false, true); */
    // body
    expr.write(BodyStmtToken.class, token.getBody());
    add(new JumpInsnNode(GOTO, start));
    add(end);
    /*if (compiler.getLangMode() == LangMode.JPHP){
            if (token.isValueReference() && var != null){
                expr.writeVarLoad(var.getName());
                expr.writeSysDynamicCall(Memory.class, "unset", void.class);
            }
        }*/
    method.popJump();
    expr.writeUndefineVariables(token.getLocal());
    method.prevStatementIndex(ForeachIterator.class);
}
Also used : LabelNode(org.objectweb.asm.tree.LabelNode) ForeachIterator(php.runtime.lang.ForeachIterator) ExprStmtToken(org.develnext.jphp.core.tokenizer.token.stmt.ExprStmtToken) FatalException(php.runtime.exceptions.FatalException) ListCompiler(org.develnext.jphp.core.compiler.jvm.statement.expr.value.ListCompiler) LocalVariable(org.develnext.jphp.core.compiler.jvm.misc.LocalVariable) JumpInsnNode(org.objectweb.asm.tree.JumpInsnNode) DynamicAccessExprToken(org.develnext.jphp.core.tokenizer.token.expr.operator.DynamicAccessExprToken) Token(org.develnext.jphp.core.tokenizer.token.Token) BodyStmtToken(org.develnext.jphp.core.tokenizer.token.stmt.BodyStmtToken) ForeachStmtToken(org.develnext.jphp.core.tokenizer.token.stmt.ForeachStmtToken) VariableExprToken(org.develnext.jphp.core.tokenizer.token.expr.value.VariableExprToken) ExprStmtToken(org.develnext.jphp.core.tokenizer.token.stmt.ExprStmtToken) ListExprToken(org.develnext.jphp.core.tokenizer.token.expr.value.ListExprToken) DynamicAccessExprToken(org.develnext.jphp.core.tokenizer.token.expr.operator.DynamicAccessExprToken) VariableExprToken(org.develnext.jphp.core.tokenizer.token.expr.value.VariableExprToken) ListExprToken(org.develnext.jphp.core.tokenizer.token.expr.value.ListExprToken)

Example 49 with JumpInsnNode

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

the class JumpCompiler method write.

@Override
public void write(JumpStmtToken token) {
    int level = token.getLevel();
    JumpItem jump = method.getJump(level);
    if (jump == null) {
        env.error(token.toTraceInfo(compiler.getContext()), ErrorType.E_COMPILE_ERROR, level == 1 ? Messages.ERR_CANNOT_JUMP.fetch() : Messages.ERR_CANNOT_JUMP_TO_LEVEL.fetch(level));
        return;
    }
    if (token instanceof ContinueStmtToken) {
        add(new JumpInsnNode(GOTO, jump.continueLabel));
    } else if (token instanceof BreakStmtToken) {
        add(new JumpInsnNode(GOTO, jump.breakLabel));
    }
}
Also used : ContinueStmtToken(org.develnext.jphp.core.tokenizer.token.stmt.ContinueStmtToken) JumpInsnNode(org.objectweb.asm.tree.JumpInsnNode) JumpItem(org.develnext.jphp.core.compiler.jvm.misc.JumpItem) BreakStmtToken(org.develnext.jphp.core.tokenizer.token.stmt.BreakStmtToken)

Aggregations

JumpInsnNode (org.objectweb.asm.tree.JumpInsnNode)49 LabelNode (org.objectweb.asm.tree.LabelNode)36 MethodInsnNode (org.objectweb.asm.tree.MethodInsnNode)28 AbstractInsnNode (org.objectweb.asm.tree.AbstractInsnNode)26 InsnNode (org.objectweb.asm.tree.InsnNode)25 VarInsnNode (org.objectweb.asm.tree.VarInsnNode)24 InsnList (org.objectweb.asm.tree.InsnList)22 FieldInsnNode (org.objectweb.asm.tree.FieldInsnNode)19 LdcInsnNode (org.objectweb.asm.tree.LdcInsnNode)18 MethodNode (org.objectweb.asm.tree.MethodNode)18 TypeInsnNode (org.objectweb.asm.tree.TypeInsnNode)15 ClassNode (org.objectweb.asm.tree.ClassNode)14 ClassReader (org.objectweb.asm.ClassReader)12 Label (org.objectweb.asm.Label)11 Type (org.objectweb.asm.Type)9 LocalVariable (org.develnext.jphp.core.compiler.jvm.misc.LocalVariable)6 LineNumberNode (org.objectweb.asm.tree.LineNumberNode)4 LinkedList (java.util.LinkedList)3 Mutation (org.evosuite.coverage.mutation.Mutation)3 FieldNode (org.objectweb.asm.tree.FieldNode)3