List of usage examples for org.objectweb.asm Opcodes ATHROW
int ATHROW
To view the source code for org.objectweb.asm Opcodes ATHROW.
Click Source Link
From source file:org.openquark.cal.internal.javamodel.AsmJavaBytecodeGenerator.java
License:Open Source License
private static boolean encodeThrowStatement(JavaStatement.ThrowStatement throwStatement, GenerationContext context) throws JavaGenerationException { MethodVisitor mv = context.getMethodVisitor(); // get the result of evaluating the thrown expression. encodeExpr(throwStatement.getThrownExpression(), context); // throw the result. mv.visitInsn(Opcodes.ATHROW); // throw statements are terminating. return true;//from w ww . j av a 2 s .c o m }
From source file:org.openquark.cal.internal.javamodel.AsmJavaBytecodeGenerator.java
License:Open Source License
/** * Encode a method invocation that is wrapped in a synchronized block. * See Sun bug id #4414101 for a discussion of this generated code. * // w ww.ja v a2 s . c o m * @param smi - the SynchronizedMethodInvocation object. * @param context - the context of the code generation. * @return - true if the SynchronizedMethodInvocation is terminating. * @throws JavaGenerationException */ private static boolean encodeSynchronizedMethodInvocation(JavaStatement.SynchronizedMethodInvocation smi, GenerationContext context) throws JavaGenerationException { MethodVisitor mv = context.getMethodVisitor(); // Get the JavaExpression for the object to synchronize on and generate the bytecode. JavaExpression objectToSynchOn = smi.getSynchronizingObject(); encodeExpr(objectToSynchOn, context); // The object to synchronize on is now on the stack. Duplicate it, // move one to storage as a local variable, and to MONITORENTER on the other. mv.visitInsn(Opcodes.DUP); int mutexIndex = context.addLocalVar("$mutex", JavaTypeName.OBJECT); mv.visitVarInsn(Opcodes.ASTORE, mutexIndex); mv.visitInsn(Opcodes.MONITORENTER); // We need to wrap the method invocation in a try/catch block so // the monitor can be exited properly if the method invocation throws // an exception. Label tryCatchStart = new Label(); mv.visitLabel(tryCatchStart); // Note: if this is generalized to handle any synchronized statement (for example, a synchronized block), // then the scope of entries in the exception table here will have to be modified to exclude return instructions. // See encodeTryCatchStatement() for how to do this. // Here, the only statement in the try block is a single expressionStatement, which has no return instructions, // so we don't have to worry about handling this case. // Get the method invocation and generate the corresponding bytecode. MethodInvocation methodInvocation = smi.getMethodInvocation(); encodeExpr(methodInvocation, context); // Load the mutex object back onto the stack and do MonitorExit. mv.visitVarInsn(Opcodes.ALOAD, mutexIndex); mv.visitInsn(Opcodes.MONITOREXIT); // Label the end of the try block around the method invocation. Label tryEnd = new Label(); mv.visitLabel(tryEnd); // At this point we want to code an instruction to jump past the exception handling // code. Label tryCatchEnd = new Label(); mv.visitJumpInsn(Opcodes.GOTO, tryCatchEnd); // Label the start of the exception handling code. Label catchStart = new Label(); mv.visitLabel(catchStart); // The exception is on the stack. Store it as a local. int exceptionIndex = context.addLocalVar("exception", JavaTypeName.OBJECT); mv.visitVarInsn(Opcodes.ASTORE, exceptionIndex); // Retrieve the mutex object and do MONITOREXIT. mv.visitVarInsn(Opcodes.ALOAD, mutexIndex); mv.visitInsn(Opcodes.MONITOREXIT); // Label the end of the exception handling code that deals with the monitor. Label exceptionMonitorExitEnd = new Label(); mv.visitLabel(exceptionMonitorExitEnd); // Retrieve the exception and throw it. mv.visitVarInsn(Opcodes.ALOAD, exceptionIndex); mv.visitInsn(Opcodes.ATHROW); // Vist the label to mark the end of the try/catch. mv.visitLabel(tryCatchEnd); // Set up the try/catch block to catch exceptions thrown by the method invocation // and handle exiting the monitor. mv.visitTryCatchBlock(tryCatchStart, tryEnd, catchStart, null); // Set up a try catch block so that if an exception is thrown by trying to exit // the monitor in the case of an exception from the method invocation we will keep trying to // exit the monitor. mv.visitTryCatchBlock(catchStart, exceptionMonitorExitEnd, catchStart, null); return false; }
From source file:org.parboiled.compiler.notNullVerification.MyMethodAdapter.java
License:Apache License
private void generateThrow(String exceptionClass, String descr, Label end) { String exceptionParamClass = "(Ljava/lang/String;)V"; mv.visitTypeInsn(Opcodes.NEW, exceptionClass); mv.visitInsn(Opcodes.DUP);//from w w w . ja v a 2s . co m mv.visitLdcInsn(descr); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, exceptionClass, NotNullVerifyingInstrumenter.CONSTRUCTOR_NAME, exceptionParamClass); mv.visitInsn(Opcodes.ATHROW); mv.visitLabel(end); instrumenter.myIsModification = true; }
From source file:org.pitest.mutationtest.engine.gregor.mutators.ReturnValsMutator.java
License:Apache License
private static ZeroOperandMutation areturnMutation() { return new ZeroOperandMutation() { public void apply(final int opCode, final MethodVisitor mv) { // Strategy translated from jumble BCEL code // if result is non-null make it null, otherwise hard case // for moment throw runtime exception final Label l1 = new Label(); mv.visitJumpInsn(Opcodes.IFNONNULL, l1); mv.visitTypeInsn(Opcodes.NEW, "java/lang/RuntimeException"); mv.visitInsn(Opcodes.DUP);/* w w w . j a v a2 s . co m*/ mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false); mv.visitInsn(Opcodes.ATHROW); mv.visitLabel(l1); mv.visitInsn(Opcodes.ACONST_NULL); mv.visitInsn(Opcodes.ARETURN); } public String decribe(final int opCode, final MethodInfo methodInfo) { return "mutated return of Object value for " + methodInfo.getDescription() + " to ( if (x != null) null else throw new RuntimeException )"; } }; }
From source file:org.pitest.mutationtest.engine.gregor.TryWithResourcesMethodVisitor.java
License:Apache License
@Override public void visitInsn(int opcode) { if (opcode == Opcodes.ATHROW) { opcodesStack.add(opcode);/*w w w. j a v a 2 s .co m*/ finishTracking(); } super.visitInsn(opcode); }
From source file:org.sonar.java.bytecode.cfg.BytecodeCFGBuilderTest.java
License:Open Source License
@Test public void all_opcodes_should_be_visited() throws Exception { Instructions ins = new Instructions(); Predicate<Integer> filterReturnAndThrow = opcode -> !((Opcodes.IRETURN <= opcode && opcode <= Opcodes.RETURN) || opcode == Opcodes.ATHROW); NO_OPERAND_INSN.stream().filter(filterReturnAndThrow).forEach(ins::visitInsn); INT_INSN.forEach(i -> ins.visitIntInsn(i, 0)); VAR_INSN.forEach(i -> ins.visitVarInsn(i, 0)); TYPE_INSN.forEach(i -> ins.visitTypeInsn(i, "java/lang/Object")); FIELD_INSN.forEach(i -> ins.visitFieldInsn(i, "java/lang/Object", "foo", "D(D)")); METHOD_INSN.forEach(i -> ins.visitMethodInsn(i, "java/lang/Object", "foo", "()V", i == INVOKEINTERFACE)); JUMP_INSN.forEach(i -> {//from ww w.j a va2 s .c o m Label jumpLabel = new Label(); ins.visitJumpInsn(i, jumpLabel); ins.visitLabel(jumpLabel); }); ins.visitLdcInsn("a"); ins.visitIincInsn(0, 1); Handle handle = new Handle(H_INVOKESTATIC, "", "", "()V", false); ins.visitInvokeDynamicInsn("sleep", "()V", handle); ins.visitLookupSwitchInsn(new Label(), new int[] {}, new Label[] {}); ins.visitMultiANewArrayInsn("B", 1); Label l0 = new Label(); Label dflt = new Label(); Label case0 = new Label(); ins.visitTableSwitchInsn(0, 1, dflt, case0); ins.visitLabel(dflt); ins.visitInsn(NOP); ins.visitLabel(l0); ins.visitInsn(NOP); BytecodeCFG cfg = ins.cfg(); Multiset<String> cfgOpcodes = cfgOpcodes(cfg); List<String> collect = Instructions.OPCODES.stream().filter(filterReturnAndThrow) .map(op -> Printer.OPCODES[op]).collect(Collectors.toList()); assertThat(cfgOpcodes).containsAll(collect); }
From source file:org.sonar.java.bytecode.cfg.BytecodeCFGMethodVisitor.java
License:Open Source License
@Override public void visitInsn(int opcode) { currentBlock.addInsn(opcode);//from w w w .j a v a 2 s . com if ((Opcodes.IRETURN <= opcode && opcode <= Opcodes.RETURN) || opcode == Opcodes.ATHROW) { currentBlock.successors.add(cfg.blocks.get(0)); currentBlock = null; } }
From source file:org.sonar.java.bytecode.se.BytecodeEGWalkerExecuteTest.java
License:Open Source License
@Test public void test_athrow() throws Exception { SymbolicValue sv = new SymbolicValue(); Type exceptionType = semanticModel.getClassType("java.lang.RuntimeException"); ProgramState initialState = ProgramState.EMPTY_STATE.stackValue(sv).addConstraint(sv, new TypedConstraint("java.lang.RuntimeException")); ProgramState programState = execute(new Instruction(Opcodes.ATHROW), initialState); SymbolicValue exception = programState.peekValue(); assertThat(exception).isInstanceOf(SymbolicValue.ExceptionalSymbolicValue.class); assertThat(((SymbolicValue.ExceptionalSymbolicValue) exception).exceptionType()).isEqualTo(exceptionType); assertThat(programState.exitValue()).isEqualTo(exception); }
From source file:org.spongepowered.asm.mixin.injection.callback.CallbackInjector.java
License:MIT License
/** * Generates a method which throws an error * // ww w . j av a 2s.com * @param callback callback handle * @param errorClass error class to throw * @param message message for the error * @return generated method */ private MethodNode generateErrorMethod(Callback callback, String errorClass, String message) { MethodNode method = this.info.addMethod(this.methodNode.access, this.methodNode.name + "$missing", callback.getDescriptor()); method.maxLocals = ASMHelper.getFirstNonArgLocalIndex(Type.getArgumentTypes(callback.getDescriptor()), !this.isStatic); method.maxStack = 3; InsnList insns = method.instructions; insns.add(new TypeInsnNode(Opcodes.NEW, errorClass)); insns.add(new InsnNode(Opcodes.DUP)); insns.add(new LdcInsnNode(message)); insns.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, errorClass, "<init>", "(Ljava/lang/String;)V", false)); insns.add(new InsnNode(Opcodes.ATHROW)); return method; }
From source file:org.testeoa.estatica.AdapterDUG.java
License:Open Source License
@Override public void visitInsn(int opcode) { addInstrucao(getInstrucao(opcode));//from w w w . j ava 2s . c o m if (opcode >= Opcodes.IRETURN && opcode <= Opcodes.RETURN) { adjacente = false; saida = true; inserirVerticeAtual(); } else if (opcode == Opcodes.ATHROW) { adjacente = false; saida = true; inserirVerticeAtual(); } super.visitInsn(opcode); }