break; default: mv.visitLdcInsn(Type.getType(arg.getDescriptor()));
@Override public void visitLdcInsn(final Object value) { super.visitLdcInsn(value); if (stackFrameTracking) { pushValue(OTHER); if (value instanceof Double || value instanceof Long || (value instanceof ConstantDynamic && ((ConstantDynamic) value).getSize() == 2)) { pushValue(SECOND_WORD); } } }
/** * Store the last LDC call. When ServiceLoader.load(Class cls) is called * with a class constant (XXX.class) as parameter, the last LDC call * before the ServiceLoader.load() visitMethodInsn call * contains the class being passed in. We need to pass this class to * $$FCCL$$ as well so we can copy the value found in here. */ @Override public void visitLdcInsn(Object cst) { if (cst instanceof Type) { lastLDCType = ((Type) cst); } super.visitLdcInsn(cst); }
/** * Store the last LDC call. When ServiceLoader.load(Class cls) is called * with a class constant (XXX.class) as parameter, the last LDC call * before the ServiceLoader.load() visitMethodInsn call * contains the class being passed in. We need to pass this class to * $$FCCL$$ as well so we can copy the value found in here. */ @Override public void visitLdcInsn(Object cst) { if (cst instanceof Type) { lastLDCType = ((Type) cst); } super.visitLdcInsn(cst); }
/** * Store the last LDC call. When ServiceLoader.load(Class cls) is called * with a class constant (XXX.class) as parameter, the last LDC call * before the ServiceLoader.load() visitMethodInsn call * contains the class being passed in. We need to pass this class to * $$FCCL$$ as well so we can copy the value found in here. */ @Override public void visitLdcInsn(Object cst) { if (cst instanceof Type) { lastLDCType = ((Type) cst); } super.visitLdcInsn(cst); }
private void loadSynchronizedMethodMonitorOwner() { if (isStatic) { Type classType = Type.getType("L" + className + ";"); if (classVersion >= V1_5) { mv.visitLdcInsn(classType); } else { mv.visitLdcInsn(classType.getClassName()); mv.invokeStatic(CLASS_TYPE, CLASS_FOR_NAME); } } else { mv.loadThis(); } }
@Override protected void pushObjectReturnType(GeneratorAdapter mg, Class<?> returnType) { if (returnType.isArray()) pushGenerateEmptyArray(mg, returnType.getComponentType()); else if (returnType.equals(String.class)) mg.visitLdcInsn(""); else if (isInterface(returnType)) pushGenerateStub(mg, returnType); else super.pushObjectReturnType(mg, returnType); }
private void pushGenerateStub(GeneratorAdapter mg, Class<?> returnType) { mg.visitLdcInsn(Type.getType(returnType)); mg.visitInsn(Opcodes.ICONST_0); mg.newArray(Type.getType(Object.class)); mg.visitMethodInsn(Opcodes.INVOKESTATIC, "com/meterware/simplestub/Stub", "createNiceStub", "(Ljava/lang/Class;[Ljava/lang/Object;)Ljava/lang/Object;", false); mg.checkCast(Type.getType(returnType)); }
@Override public void visitLdcInsn(final Object value) { super.visitLdcInsn(value); if (isConstructor && !superClassConstructorCalled) { pushValue(OTHER); if (value instanceof Double || value instanceof Long || (value instanceof ConstantDynamic && ((ConstantDynamic) value).getSize() == 2)) { pushValue(OTHER); } } }
@Override public void visitLdcInsn(final Object value) { super.visitLdcInsn(value); if (isConstructor && !superClassConstructorCalled) { pushValue(OTHER); if (value instanceof Double || value instanceof Long || (value instanceof ConstantDynamic && ((ConstantDynamic) value).getSize() == 2)) { pushValue(OTHER); } } }
@Override public void visitLdcInsn(final Object value) { super.visitLdcInsn(value); if (isConstructor && !superClassConstructorCalled) { pushValue(OTHER); if (value instanceof Double || value instanceof Long || (value instanceof ConstantDynamic && ((ConstantDynamic) value).getSize() == 2)) { pushValue(OTHER); } } }
/** * Generates a static Logger field for logging and a static initialization block to initialize the logger. */ private void generateLogger(Type classType, ClassWriter classWriter) { // private static final Logger LOG = LoggerFactory.getLogger(classType); classWriter.visitField(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL, "LOG", Type.getType(Logger.class).getDescriptor(), null, null); Method init = Methods.getMethod(void.class, "<clinit>"); GeneratorAdapter mg = new GeneratorAdapter(Opcodes.ACC_STATIC, init, null, null, classWriter); mg.visitLdcInsn(classType); mg.invokeStatic(Type.getType(LoggerFactory.class), Methods.getMethod(Logger.class, "getLogger", Class.class)); mg.putStatic(classType, "LOG", Type.getType(Logger.class)); mg.returnValue(); mg.endMethod(); }
/** * Generates a static Logger field for logging and a static initialization block to initialize the logger. */ private void generateLogger(Type classType, ClassWriter classWriter) { // private static final Logger LOG = LoggerFactory.getLogger(classType); classWriter.visitField(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL, "LOG", Type.getType(Logger.class).getDescriptor(), null, null); Method init = Methods.getMethod(void.class, "<clinit>"); GeneratorAdapter mg = new GeneratorAdapter(Opcodes.ACC_STATIC, init, null, null, classWriter); mg.visitLdcInsn(classType); mg.invokeStatic(Type.getType(LoggerFactory.class), Methods.getMethod(Logger.class, "getLogger", Class.class)); mg.putStatic(classType, "LOG", Type.getType(Logger.class)); mg.returnValue(); mg.endMethod(); }
mg.visitLdcInsn("Launch class " + className + " by calling " + mainDelegator.getClassName() + ".launch"); mg.invokeVirtual(Type.getType(PrintStream.class), Methods.getMethod(void.class, "println", String.class)); mg.visitLdcInsn(className); mg.loadArg(0); mg.invokeStatic(mainDelegator, Methods.getMethod(void.class, "launch", String.class, String[].class));
mg.visitLdcInsn("Launch class " + className + " by calling " + mainDelegator.getClassName() + ".launch"); mg.invokeVirtual(Type.getType(PrintStream.class), Methods.getMethod(void.class, "println", String.class)); mg.visitLdcInsn(className); mg.loadArg(0); mg.invokeStatic(mainDelegator, Methods.getMethod(void.class, "launch", String.class, String[].class));
mv.visitLdcInsn(wd.getClassName()); mv.visitLdcInsn(wd.getMethodName()); mv.loadArg(0); mv.visitLdcInsn(targetClass);
private static GeneratorAdapter createClassInitializer(Type selfType, ClassVisitor cw) { GeneratorAdapter clazzInit; clazzInit = new GeneratorAdapter(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC, new org.objectweb.asm.commons.Method( "<clinit>", Type.VOID_TYPE, EMPTY_TYPE_ARR), null, EMPTY_TYPE_ARR, cw); clazzInit.visitLdcInsn(selfType.getClassName()); clazzInit.invokeStatic(JAVA_LANG_CLASS_TYPE, CLASS_FORNAME_METHOD); clazzInit .invokeStatic(PROXY_HELPER_TYPE, HELPER_GET_PROXY_CLASS_METHOD); clazzInit.dup(); clazzInit.putStatic(selfType, PROXY_CLASS_FIELD_NAME, PROXY_CLASS_TYPE); return clazzInit; }
/** * Emit code for a string if-else block. * * if (s.equals("collided_method1")) { * visit(s); * } else if (s.equals("collided_method2")) { * visit(s); * } * * In the most common case of just one string, this degenerates to: * * visit(s) * */ private void visitx(GeneratorAdapter mv, List<String> strings) { if (strings.size() == 1) { visitCase(strings.get(0)); return; } for (String string : strings) { Label label = new Label(); visitString(); mv.visitLdcInsn(string); mv.invokeVirtual(STRING_TYPE, Method.getMethod("boolean equals(Object)")); mv.visitJumpInsn(Opcodes.IFEQ, label); visitCase(string); mv.visitLabel(label); } visitDefault(); }
/** * Emit code for a string if-else block. * * if (s.equals("collided_method1")) { * visit(s); * } else if (s.equals("collided_method2")) { * visit(s); * } * * In the most common case of just one string, this degenerates to: * * visit(s) * */ private void visitx(GeneratorAdapter mv, List<String> strings) { if (strings.size() == 1) { visitCase(strings.get(0)); return; } for (String string : strings) { Label label = new Label(); visitString(); mv.visitLdcInsn(string); mv.invokeVirtual(STRING_TYPE, Method.getMethod("boolean equals(Object)")); mv.visitJumpInsn(Opcodes.IFEQ, label); visitCase(string); mv.visitLabel(label); } visitDefault(); }
mv.visitLdcInsn(wd.getClassName()); mv.visitLdcInsn(wd.getMethodName()); mv.loadArg(0); mv.visitLdcInsn(targetClass);