void changeLastInsnToGOTO(LabelNode label) { setInstruction(endPos, new JumpInsnNode(GOTO, label)); }
public void writeConditional(ExprStmtToken condition, LabelNode successLabel) { writeExpression(condition, true, false); writePopBoolean(); code.add(new JumpInsnNode(IFEQ, successLabel)); stackPop(); }
@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)); } } }
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)); }
this.expr.writePopBoolean(); add(new JumpInsnNode(IFEQ, end)); this.expr.stackPop(); this.expr.writeExpression(expr, false, false); add(new JumpInsnNode(GOTO, start)); add(end); add(new LineNumberNode(token.getMeta().getEndLine(), end));
add(new JumpInsnNode(GOTO, catchEnd)); add(catchStart); add(new JumpInsnNode(IFEQ, j == catchExceptions.size() - 1 ? nextCatch : nextCatchLocal)); expr.stackPop(); add(new JumpInsnNode(GOTO, bodyLabel)); add(new JumpInsnNode(GOTO, catchEnd)); add(new JumpInsnNode(GOTO, skip)); } else { add(new JumpInsnNode(GOTO, method.getTryStack().peek().getReturnLabel()));
code.add(new JumpInsnNode(IFEQ, next)); stackPop(); if (returnValue) { code.add(new JumpInsnNode(IFNE, next)); stackPop(); if (returnValue) { code.add(new JumpInsnNode(GOTO, end));
destructor.instructions.add(new JumpInsnNode(IFEQ, end));
@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()); } }
@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()); } }
@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)); } }
writeSysDynamicCall(IObject.class, "isMock", Boolean.TYPE); code.add(new JumpInsnNode(IFEQ, elseLabel)); stackPop(); code.add(new JumpInsnNode(GOTO, endLabel)); code.add(elseLabel);
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(); add(new JumpInsnNode(GOTO, jumps[i][1])); // if is done... i++;
expr.writePushDup(); add(new JumpInsnNode(IFNONNULL, end)); expr.stackPop();
node.instructions.add(new JumpInsnNode(Opcodes.IFNONNULL, next)); expressionCompiler.stackPop();
add(new JumpInsnNode(GOTO, method.getTryStack().peek().getReturnLabel())); } else { add(new InsnNode(ARETURN));
add(new JumpInsnNode(IFEQ, end)); expr.stackPop(); add(new JumpInsnNode(GOTO, start)); add(end);
code.add(new JumpInsnNode(Opcodes.IFEQ, elseL)); stackPop(); stackPop(); code.add(new JumpInsnNode(Opcodes.GOTO, end)); code.add(elseL); writePopBoolean(); code.add(new JumpInsnNode(Opcodes.IFEQ, elseL)); stackPop(); writeExpression(valueIfElseToken.getValue(), true, false); stackPop(); code.add(new JumpInsnNode(Opcodes.GOTO, end)); // goto end
@Test public void shouldMatchConditionalJumps() { assertFalse(aConditionalJump().test(this.context,new JumpInsnNode(Opcodes.GOTO, null))); assertFalse(aConditionalJump().test(this.context, new JumpInsnNode(Opcodes.JSR, null))); assertTrue(aConditionalJump().test(this.context, new JumpInsnNode(Opcodes.IFEQ, null))); assertTrue(aConditionalJump().test(this.context, new JumpInsnNode(Opcodes.IFNE, null))); assertTrue(aConditionalJump().test(this.context, new JumpInsnNode(Opcodes.IFLT, null))); assertTrue(aConditionalJump().test(this.context, new JumpInsnNode(Opcodes.IFGE, null))); assertTrue(aConditionalJump().test(this.context, new JumpInsnNode(Opcodes.IFGT, null))); assertTrue(aConditionalJump().test(this.context, new JumpInsnNode(Opcodes.IFLE, null))); assertTrue(aConditionalJump().test(this.context, new JumpInsnNode(Opcodes.IF_ICMPEQ, null))); assertTrue(aConditionalJump().test(this.context, new JumpInsnNode(Opcodes.IF_ICMPNE, null))); assertTrue(aConditionalJump().test(this.context, new JumpInsnNode(Opcodes.IF_ICMPLT, null))); assertTrue(aConditionalJump().test(this.context, new JumpInsnNode(Opcodes.IF_ICMPGE, null))); assertTrue(aConditionalJump().test(this.context, new JumpInsnNode(Opcodes.IF_ICMPGT, null))); assertTrue(aConditionalJump().test(this.context, new JumpInsnNode(Opcodes.IF_ICMPLE, null))); assertTrue(aConditionalJump().test(this.context, new JumpInsnNode(Opcodes.IF_ACMPEQ, null))); assertTrue(aConditionalJump().test(this.context, new JumpInsnNode(Opcodes.IF_ACMPNE, null))); assertTrue(aConditionalJump().test(this.context, new JumpInsnNode(Opcodes.IFNULL, null))); assertTrue(aConditionalJump().test(this.context, new JumpInsnNode(Opcodes.IFNONNULL, null))); }
@Test public void shouldMatchJumps() { assertTrue(aJump().test(this.context,new JumpInsnNode(Opcodes.GOTO, null))); assertFalse(aJump().test(this.context, new InsnNode(Opcodes.ACONST_NULL))); }