private void fallbackOnlyInsn(InsnNode insn) throws CodegenException { if (!fallback) { throw new CodegenException(insn.getType() + " can be used only in fallback mode"); } }
public static void addFallbackInsns(CodeWriter code, MethodNode mth, InsnNode[] insnArr, boolean addLabels) { InsnGen insnGen = new InsnGen(getFallbackMethodGen(mth), true); for (InsnNode insn : insnArr) { if (insn == null || insn.getType() == InsnType.NOP) { continue; } if (addLabels && (insn.contains(AType.JUMP) || insn.contains(AType.EXC_HANDLER))) { code.decIndent(); code.startLine(getLabelName(insn.getOffset()) + ":"); code.incIndent(); } try { if (insnGen.makeInsn(insn, code)) { CatchAttr catchAttr = insn.get(AType.CATCH_BLOCK); if (catchAttr != null) { code.add("\t " + catchAttr); } } } catch (CodegenException e) { LOG.debug("Error generate fallback instruction: ", e.getCause()); code.startLine("// error: " + insn); } } }
protected boolean makeInsn(InsnNode insn, CodeWriter code, Flags flag) throws CodegenException { try { Set<Flags> state = EnumSet.noneOf(Flags.class); if (flag == Flags.BODY_ONLY || flag == Flags.BODY_ONLY_NOWRAP) { state.add(flag); makeInsnBody(code, insn, state); } else { if (flag != Flags.INLINE) { code.startLineWithNum(insn.getSourceLine()); } if (insn.getResult() != null && !insn.contains(AFlag.ARITH_ONEARG)) { assignVar(code, insn); code.add(" = "); } makeInsnBody(code, insn, state); if (flag != Flags.INLINE) { code.add(';'); } } } catch (Exception th) { throw new CodegenException(mth, "Error generate insn: " + insn, th); } return true; }
public void makeRegion(CodeWriter code, IContainer cont) throws CodegenException { if (cont instanceof IBlock) { makeSimpleBlock((IBlock) cont, code); } else if (cont instanceof IRegion) { if (cont instanceof Region) { makeSimpleRegion(code, (Region) cont); } else { declareVars(code, cont); if (cont instanceof IfRegion) { makeIf((IfRegion) cont, code, true); } else if (cont instanceof SwitchRegion) { makeSwitch((SwitchRegion) cont, code); } else if (cont instanceof LoopRegion) { makeLoop((LoopRegion) cont, code); } else if (cont instanceof TryCatchRegion) { makeTryCatch((TryCatchRegion) cont, code); } else if (cont instanceof SynchronizedRegion) { makeSynchronizedRegion((SynchronizedRegion) cont, code); } } } else { throw new CodegenException("Not processed container: " + cont); } }
public void addArg(CodeWriter code, InsnArg arg, boolean wrap) throws CodegenException { if (arg.isRegister()) { code.add(mgen.getNameGen().useArg((RegisterArg) arg)); } else if (arg.isLiteral()) { code.add(lit((LiteralArg) arg)); } else if (arg.isInsnWrap()) { Flags flag = wrap ? Flags.BODY_ONLY : Flags.BODY_ONLY_NOWRAP; makeInsn(((InsnWrapArg) arg).getWrapInsn(), code, flag); } else if (arg.isNamed()) { code.add(((Named) arg).getName()); } else if (arg.isField()) { FieldArg f = (FieldArg) arg; if (f.isStatic()) { staticField(code, f.getField()); } else { instanceField(code, f.getField(), f.getInstanceArg()); } } else { throw new CodegenException("Unknown arg type " + arg); } }
throw new CodegenException(mth, "Unknown instruction: " + insn.getType());