package org.develnext.jphp.core.compiler.jvm.statement.expr; import org.develnext.jphp.core.compiler.jvm.statement.ExpressionStmtCompiler; import org.develnext.jphp.core.tokenizer.token.stmt.GotoStmtToken; import org.develnext.jphp.core.tokenizer.token.stmt.LabelStmtToken; import org.objectweb.asm.tree.JumpInsnNode; import org.objectweb.asm.tree.LabelNode; import static org.objectweb.asm.Opcodes.GOTO; public class GotoCompiler extends BaseStatementCompiler<GotoStmtToken> { public GotoCompiler(ExpressionStmtCompiler exprCompiler) { super(exprCompiler); } @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)); } }