List of usage examples for org.objectweb.asm Label Label
public Label()
From source file:com.github.javalbert.reflection.ClassAccessFactory.java
License:Apache License
private void visitIndexMethodLastPart(String categoryOfStringCase, Label firstLabel) { mv.visitTypeInsn(NEW, "java/lang/IllegalArgumentException"); mv.visitInsn(DUP);/* ww w. j a va 2 s . c o m*/ mv.visitTypeInsn(NEW, "java/lang/StringBuilder"); mv.visitInsn(DUP); mv.visitLdcInsn("No " + categoryOfStringCase + " with name: "); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V", false); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>", "(Ljava/lang/String;)V", false); mv.visitInsn(ATHROW); Label lastLabel = new Label(); mv.visitLabel(lastLabel); mv.visitLocalVariable("this", classAccessTypeDescriptor, null, firstLabel, lastLabel, 0); mv.visitLocalVariable("name", "Ljava/lang/String;", null, firstLabel, lastLabel, 1); mv.visitMaxs(5, 3); mv.visitEnd(); }
From source file:com.github.javalbert.reflection.ClassAccessFactory.java
License:Apache License
private void visitMethodAccessBridge(int parameterCount) { mv = cw.visitMethod(ACC_PUBLIC + ACC_BRIDGE + ACC_SYNTHETIC, "call", getMethodAccessMethodDescriptor(parameterCount, "Ljava/lang/Object;"), null, null); mv.visitCode();//from w w w .j a v a 2 s. c o m mv.visitLabel(new Label()); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, internalName); mv.visitVarInsn(ILOAD, 2); for (int i = 0; i < parameterCount; i++) { mv.visitVarInsn(ALOAD, 3 + i); } mv.visitMethodInsn(INVOKEVIRTUAL, classAccessInternalName, "call", getMethodAccessMethodDescriptor(parameterCount), false); mv.visitInsn(ARETURN); mv.visitMaxs(3 + parameterCount, 3 + parameterCount); mv.visitEnd(); }
From source file:com.github.javalbert.reflection.ClassAccessFactory.java
License:Apache License
private void visitMethodAccessInvokeBridge() { mv = cw.visitMethod(ACC_PUBLIC + ACC_BRIDGE + ACC_VARARGS + ACC_SYNTHETIC, "invoke", "(Ljava/lang/Object;I[Ljava/lang/Object;)Ljava/lang/Object;", null, null); mv.visitCode();// ww w. j av a 2 s . c om mv.visitLabel(new Label()); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, internalName); mv.visitVarInsn(ILOAD, 2); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, classAccessInternalName, "invoke", "(" + classTypeDescriptor + "I[Ljava/lang/Object;)Ljava/lang/Object;", false); mv.visitInsn(ARETURN); mv.visitMaxs(4, 4); mv.visitEnd(); }
From source file:com.github.javalbert.reflection.ClassAccessFactory.java
License:Apache License
private void visitMethodAccessInvokeMethod() { mv = cw.visitMethod(ACC_PUBLIC + ACC_VARARGS, "invoke", "(" + classTypeDescriptor + "I[Ljava/lang/Object;)Ljava/lang/Object;", null, null); mv.visitCode();//from www . j a va2 s .c o m Label firstLabel = new Label(); mv.visitLabel(firstLabel); mv.visitVarInsn(ILOAD, 2); Label defaultCaseLabel = new Label(); if (methodInfoList == null || methodInfoList.isEmpty()) { mv.visitInsn(POP); mv.visitLabel(defaultCaseLabel); visitMethodAccessInvokeMethodLastPart(firstLabel); return; } Label[] labels = getTableSwitchLabelsForAccess(defaultCaseLabel, methodInfoList); // Always use a table switch because there are no gaps between method indices mv.visitTableSwitchInsn(methodInfoList.get(0).memberIndex, methodInfoList.get(methodInfoList.size() - 1).memberIndex, defaultCaseLabel, labels); for (int i = 0; i < methodInfoList.size(); i++) { MethodInfo methodInfo = methodInfoList.get(i); mv.visitLabel(labels[i]); mv.visitFrame(F_SAME, 0, null, 0, null); mv.visitVarInsn(ALOAD, 1); List<ParameterInfo> parameters = methodInfo.parameters; for (int j = 0; j < parameters.size(); j++) { ParameterInfo parameter = parameters.get(j); mv.visitVarInsn(ALOAD, 3); AsmUtils.visitZeroOperandInt(mv, j); mv.visitInsn(AALOAD); checkCast(parameter); } mv.visitMethodInsn(methodInfo.invokeOpcode, internalName, methodInfo.name, methodInfo.descriptor, true); if (methodInfo.method.getReturnType() == Void.TYPE) { mv.visitLabel(new Label()); mv.visitInsn(ACONST_NULL); } mv.visitInsn(ARETURN); } mv.visitLabel(defaultCaseLabel); mv.visitFrame(F_SAME, 0, null, 0, null); visitMethodAccessInvokeMethodLastPart(firstLabel); }
From source file:com.github.javalbert.reflection.ClassAccessFactory.java
License:Apache License
private void visitMethodAccessInvokeMethodLastPart(Label firstLabel) { mv.visitTypeInsn(NEW, "java/lang/IllegalArgumentException"); mv.visitInsn(DUP);/* w w w . j a va 2 s. c om*/ mv.visitTypeInsn(NEW, "java/lang/StringBuilder"); mv.visitInsn(DUP); mv.visitLdcInsn("No method with index: "); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V", false); mv.visitVarInsn(ILOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(I)Ljava/lang/StringBuilder;", false); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>", "(Ljava/lang/String;)V", false); mv.visitInsn(ATHROW); Label lastLabel = new Label(); mv.visitLabel(lastLabel); mv.visitLocalVariable("this", classAccessTypeDescriptor, null, firstLabel, lastLabel, 0); mv.visitLocalVariable("obj", classTypeDescriptor, null, firstLabel, lastLabel, 1); mv.visitLocalVariable("methodIndex", "I", null, firstLabel, lastLabel, 2); mv.visitLocalVariable("args", "[Ljava/lang/Object;", null, firstLabel, lastLabel, 3); mv.visitMaxs(5, 4); mv.visitEnd(); }
From source file:com.github.javalbert.reflection.ClassAccessFactory.java
License:Apache License
private void visitMethodAccessLastPart(Label firstLabel, int parameterCount) { mv.visitTypeInsn(NEW, "java/lang/IllegalArgumentException"); mv.visitInsn(DUP);/*from w ww . ja v a2s . c o m*/ mv.visitTypeInsn(NEW, "java/lang/StringBuilder"); mv.visitInsn(DUP); mv.visitLdcInsn("No method with index "); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V", false); mv.visitLabel(new Label()); mv.visitVarInsn(ILOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(I)Ljava/lang/StringBuilder;", false); mv.visitLdcInsn(" with " + parameterCount + " parameter(s)"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false); mv.visitLabel(new Label()); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>", "(Ljava/lang/String;)V", false); mv.visitInsn(ATHROW); Label lastLabel = new Label(); mv.visitLabel(lastLabel); mv.visitLocalVariable("this", classAccessTypeDescriptor, null, firstLabel, lastLabel, 0); mv.visitLocalVariable("obj", classTypeDescriptor, null, firstLabel, lastLabel, 1); mv.visitLocalVariable("methodIndex", "I", null, firstLabel, lastLabel, 2); for (int i = 0; i < parameterCount; i++) { mv.visitLocalVariable("arg" + i, "Ljava/lang/Object;", null, firstLabel, lastLabel, 3 + i); } mv.visitMaxs(5, 3 + parameterCount); mv.visitEnd(); }
From source file:com.github.javalbert.reflection.ClassAccessFactory.java
License:Apache License
private void visitMethodAccessMethod(int parameterCount) { List<MethodInfo> methodsWithParamCount = paramCountMethodsMap.get(parameterCount); mv = cw.visitMethod(ACC_PUBLIC, "call", getMethodAccessMethodDescriptor(parameterCount), null, null); mv.visitCode();/*from www.java 2 s. c om*/ Label firstLabel = new Label(); mv.visitLabel(firstLabel); mv.visitVarInsn(ILOAD, 2); Label defaultCaseLabel = new Label(); if (methodsWithParamCount == null || methodsWithParamCount.isEmpty()) { mv.visitInsn(POP); mv.visitLabel(defaultCaseLabel); visitMethodAccessLastPart(firstLabel, parameterCount); return; } boolean useTableSwitch = useTableSwitch(methodsWithParamCount); Label[] labels = useTableSwitch ? getTableSwitchLabelsForAccess(defaultCaseLabel, methodsWithParamCount) : newLabelArray(methodsWithParamCount.size()); if (useTableSwitch) { mv.visitTableSwitchInsn(methodsWithParamCount.get(0).memberIndex, methodsWithParamCount.get(methodsWithParamCount.size() - 1).memberIndex, defaultCaseLabel, labels); } else { mv.visitLookupSwitchInsn(defaultCaseLabel, methodsWithParamCount.stream().mapToInt(f -> f.memberIndex).toArray(), labels); } for (int i = 0; i < methodsWithParamCount.size(); i++) { MethodInfo methodInfo = methodsWithParamCount.get(i); mv.visitLabel(labels[i]); mv.visitFrame(F_SAME, 0, null, 0, null); mv.visitVarInsn(ALOAD, 1); List<ParameterInfo> parameters = methodInfo.parameters; for (int j = 0; j < parameters.size(); j++) { ParameterInfo parameter = parameters.get(j); mv.visitVarInsn(ALOAD, 3 + j); checkCast(parameter); } mv.visitMethodInsn(methodInfo.invokeOpcode, internalName, methodInfo.name, methodInfo.descriptor, true); if (methodInfo.method.getReturnType() == Void.TYPE) { mv.visitLabel(new Label()); mv.visitInsn(ACONST_NULL); } mv.visitInsn(ARETURN); } mv.visitLabel(defaultCaseLabel); mv.visitFrame(F_SAME, 0, null, 0, null); visitMethodAccessLastPart(firstLabel, parameterCount); }
From source file:com.github.javalbert.reflection.ClassAccessFactory.java
License:Apache License
private void visitMethodIndexMethod() { mv = cw.visitMethod(ACC_PUBLIC + ACC_VARARGS, "methodIndex", "(Ljava/lang/String;[Ljava/lang/Class;)I", "(Ljava/lang/String;[Ljava/lang/Class<*>;)I", null); mv.visitCode();// w w w. ja v a2s . c o m final Label firstLabel = new Label(); mv.visitLabel(firstLabel); List<MethodNameReturnIndex> methodIndices = getMethodIndexSwitchCases(); if (methodIndices.isEmpty()) { visitMethodIndexMethodLastPart(firstLabel, methodIndices); return; } mv.visitVarInsn(ALOAD, 1); mv.visitInsn(DUP); mv.visitVarInsn(ASTORE, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "hashCode", "()I", false); final Label defaultCaseLabel = new Label(); Collections.sort(methodIndices, StringCaseReturnIndex::compareHashCode); int[] methodNameHashCodes = new int[methodIndices.size()]; Label[] caseLabels = new Label[methodIndices.size()]; for (int i = 0; i < methodIndices.size(); i++) { methodNameHashCodes[i] = methodIndices.get(i).hashCode; caseLabels[i] = new Label(); } mv.visitLookupSwitchInsn(defaultCaseLabel, methodNameHashCodes, caseLabels); for (int i = 0; i < methodIndices.size(); i++) { MethodNameReturnIndex methodIndex = methodIndices.get(i); mv.visitLabel(caseLabels[i]); if (i > 0) { mv.visitFrame(F_SAME, 0, null, 0, null); } else { mv.visitFrame(F_APPEND, 1, new Object[] { "java/lang/String" }, 0, null); } mv.visitVarInsn(ALOAD, 3); mv.visitLdcInsn(methodIndex.name); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false); mv.visitJumpInsn(IFNE, methodIndex.returnIndexLabel); mv.visitJumpInsn(GOTO, defaultCaseLabel); } Collections.sort(methodIndices, StringCaseReturnIndex::compareIndex); for (int i = 0; i < methodIndices.size(); i++) { visitMethodIndexReturnStatements(methodIndices.get(i), defaultCaseLabel); } mv.visitLabel(defaultCaseLabel); mv.visitFrame(F_CHOP, 1, null, 0, null); visitMethodIndexMethodLastPart(firstLabel, methodIndices); }
From source file:com.github.javalbert.reflection.ClassAccessFactory.java
License:Apache License
private void visitMethodIndexMethodLastPart(Label firstLabel, List<MethodNameReturnIndex> methodIndices) { mv.visitTypeInsn(NEW, "java/lang/IllegalArgumentException"); mv.visitInsn(DUP);/*w ww .j a va 2 s . c o m*/ mv.visitTypeInsn(NEW, "java/lang/StringBuilder"); mv.visitInsn(DUP); mv.visitLdcInsn("No method called "); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V", false); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false); mv.visitLabel(new Label()); mv.visitLdcInsn(" with parameters "); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKESTATIC, "java/util/Arrays", "stream", "([Ljava/lang/Object;)Ljava/util/stream/Stream;", false); mv.visitLabel(new Label()); mv.visitInvokeDynamicInsn("apply", "()Ljava/util/function/Function;", new Handle(H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;", false), new Object[] { Type.getType("(Ljava/lang/Object;)Ljava/lang/Object;"), new Handle(H_INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false), Type.getType("(Ljava/lang/Class;)Ljava/lang/String;") }); mv.visitMethodInsn(INVOKEINTERFACE, "java/util/stream/Stream", "map", "(Ljava/util/function/Function;)Ljava/util/stream/Stream;", true); mv.visitLabel(new Label()); mv.visitMethodInsn(INVOKESTATIC, "java/util/stream/Collectors", "toList", "()Ljava/util/stream/Collector;", false); mv.visitMethodInsn(INVOKEINTERFACE, "java/util/stream/Stream", "collect", "(Ljava/util/stream/Collector;)Ljava/lang/Object;", true); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/Object;)Ljava/lang/StringBuilder;", false); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false); mv.visitLabel(new Label()); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>", "(Ljava/lang/String;)V", false); mv.visitInsn(ATHROW); Label lastLabel = new Label(); mv.visitLabel(lastLabel); mv.visitLocalVariable("this", classAccessTypeDescriptor, null, firstLabel, lastLabel, 0); mv.visitLocalVariable("name", "Ljava/lang/String;", null, firstLabel, lastLabel, 1); mv.visitLocalVariable("parameterTypes", "[Ljava/lang/Class;", null, firstLabel, lastLabel, 2); mv.visitMaxs(5, methodIndices.isEmpty() ? 3 : 4); mv.visitEnd(); }
From source file:com.github.javalbert.reflection.ClassAccessFactory.java
License:Apache License
private void visitMethodIndexReturnStatements(MethodNameReturnIndex methodIndex, Label defaultCaseLabel) { Label jumpLabel = methodIndex.returnIndexLabel; List<MethodInfo> methods = methodIndex.methods; for (int i = 0; i < methods.size(); i++) { MethodInfo methodInfo = methods.get(i); Class<?>[] parameterTypes = methodInfo.method.getParameterTypes(); mv.visitLabel(jumpLabel);/*w w w. j a va 2 s .c o m*/ mv.visitFrame(F_SAME, 0, null, 0, null); mv.visitVarInsn(ALOAD, 2); AsmUtils.visitZeroOperandInt(mv, parameterTypes.length); mv.visitTypeInsn(ANEWARRAY, "java/lang/Class"); for (int j = 0; j < parameterTypes.length; j++) { mv.visitInsn(DUP); AsmUtils.visitZeroOperandInt(mv, j); Class<?> parameterType = parameterTypes[j]; if (parameterType.isPrimitive()) { mv.visitFieldInsn(GETSTATIC, Type.getInternalName(ClassUtils.primitiveToWrapper(parameterType)), "TYPE", "Ljava/lang/Class;"); } else { mv.visitLdcInsn(Type.getType(parameterType)); } mv.visitInsn(AASTORE); } mv.visitMethodInsn(INVOKESTATIC, "java/util/Arrays", "equals", "([Ljava/lang/Object;[Ljava/lang/Object;)Z", false); jumpLabel = i + 1 >= methods.size() ? defaultCaseLabel : new Label(); mv.visitJumpInsn(IFEQ, jumpLabel); mv.visitLabel(new Label()); AsmUtils.visitZeroOperandInt(mv, methodInfo.memberIndex); mv.visitInsn(IRETURN); } }