use of org.objectweb.asm.Type in project aries by apache.
the class MethodCopyingClassAdapter method visitMethod.
@Override
public final MethodVisitor visitMethod(final int access, String name, String desc, String sig, String[] exceptions) {
MethodVisitor mv = null;
//abstract ones!.
if (!!!name.equals("<init>") && !!!name.equals("<clinit>") && (access & (ACC_STATIC | ACC_PRIVATE | ACC_SYNTHETIC | ACC_ABSTRACT | ACC_NATIVE | ACC_BRIDGE)) == 0) {
// identify the target method parameters and return type
Method currentTransformMethod = new Method(name, desc);
// We don't want to duplicate a method we already overrode!
if (!!!knownMethods.add(currentTransformMethod))
return null;
// We can't override a final method
if ((access & ACC_FINAL) != 0)
throw new RuntimeException(new FinalModifierException(superToCopy, name));
// package
if ((access & (ACC_PUBLIC | ACC_PROTECTED | ACC_PRIVATE)) == 0) {
if (!!!samePackage) {
methodHiddenException(name);
}
}
//Safe to copy a call to this method!
Type superType = Type.getType(superToCopy);
// identify the target method parameters and return type
String methodStaticFieldName = "methodField" + AbstractWovenProxyAdapter.getSanitizedUUIDString();
transformedMethods.put(methodStaticFieldName, new TypeMethod(superType, currentTransformMethod));
//Remember we need to copy the fake method *and* weave it, use a
//WovenProxyMethodAdapter as well as a CopyingMethodAdapter
MethodVisitor weaver = wovenProxyAdapter.getWeavingMethodVisitor(access, name, desc, sig, exceptions, currentTransformMethod, methodStaticFieldName, superType, false);
if (weaver instanceof AbstractWovenProxyMethodAdapter) {
//gets around the problem, but if not the class will fail verification.
if (!samePackage && (access & ACC_PROTECTED) != 0) {
methodHiddenException(name);
}
mv = new CopyingMethodAdapter((GeneratorAdapter) weaver, superType, currentTransformMethod);
} else {
//For whatever reason we aren't weaving this method. The call to super.xxx() will always work
mv = new CopyingMethodAdapter(new GeneratorAdapter(access, currentTransformMethod, mv), superType, currentTransformMethod);
}
}
return mv;
}
use of org.objectweb.asm.Type in project deltaspike by apache.
the class AsmProxyClassGenerator method defineDefaultConstructor.
private static void defineDefaultConstructor(ClassWriter cw, Type proxyType, Type superType) {
GeneratorAdapter mg = new GeneratorAdapter(Opcodes.ACC_PUBLIC, new Method("<init>", Type.VOID_TYPE, new Type[] {}), null, null, cw);
mg.visitCode();
// invoke super constructor
mg.loadThis();
mg.invokeConstructor(superType, Method.getMethod("void <init> ()"));
mg.returnValue();
mg.endMethod();
mg.visitEnd();
}
use of org.objectweb.asm.Type in project cdap by caskdata.
the class HttpHandlerGenerator method generate.
/**
* Generates a new class that implements {@link HttpHandler} by copying methods signatures from the given
* {@link HttpServiceHandler} class. Calls to {@link HttpServiceHandler} methods are transactional unless
* the method is annotated with {@link TransactionPolicy(TransactionControl)}.
*
* @param delegateType type of the {@link HttpServiceHandler}
* @param pathPrefix prefix for all {@code @PATH} annotation
* @return A {@link ClassDefinition} containing information of the newly generated class.
* @throws IOException if failed to generate the class.
*/
ClassDefinition generate(TypeToken<? extends HttpServiceHandler> delegateType, String pathPrefix) throws IOException {
Class<?> rawType = delegateType.getRawType();
List<Class<?>> preservedClasses = Lists.newArrayList();
preservedClasses.add(rawType);
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
String internalName = Type.getInternalName(rawType);
String className = internalName + Hashing.md5().hashString(internalName);
// Generate the class
Type classType = Type.getObjectType(className);
classWriter.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL, className, getClassSignature(delegateType), Type.getInternalName(AbstractHttpHandlerDelegator.class), null);
// Inspect the delegate class hierarchy to generate public handler methods.
for (TypeToken<?> type : delegateType.getTypes().classes()) {
if (!Object.class.equals(type.getRawType())) {
inspectHandler(delegateType, type, pathPrefix, classType, classWriter, preservedClasses);
}
}
generateConstructor(delegateType, classWriter);
generateLogger(classType, classWriter);
ClassDefinition classDefinition = new ClassDefinition(classWriter.toByteArray(), className, preservedClasses);
// End DEBUG block
return classDefinition;
}
use of org.objectweb.asm.Type in project cdap by caskdata.
the class SparkClassRewriter method rewriteDStreamGraph.
/**
* Rewrites the DStreamGraph class for calls to parallel array with a call to
* SparkRuntimeUtils#setTaskSupport(ParArray).
*/
private byte[] rewriteDStreamGraph(InputStream byteCodeStream) throws IOException {
ClassReader cr = new ClassReader(byteCodeStream);
ClassWriter cw = new ClassWriter(0);
cr.accept(new ClassVisitor(Opcodes.ASM5, cw) {
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
return new MethodVisitor(Opcodes.ASM5, mv) {
@Override
public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
super.visitMethodInsn(opcode, owner, name, desc, itf);
// If detected call to ArrayBuffer.par(), set the TaskSupport to avoid thread leak.
//INVOKEVIRTUAL scala/collection/mutable/ ArrayBuffer.par ()Lscala/collection/parallel/mutable/ParArray;
Type returnType = Type.getReturnType(desc);
if (opcode == Opcodes.INVOKEVIRTUAL && name.equals("par") && owner.equals("scala/collection/mutable/ArrayBuffer") && returnType.getClassName().equals("scala.collection.parallel.mutable.ParArray")) {
super.visitMethodInsn(Opcodes.INVOKESTATIC, SPARK_RUNTIME_UTILS_TYPE.getInternalName(), "setTaskSupport", Type.getMethodDescriptor(returnType, returnType), false);
}
}
};
}
}, ClassReader.EXPAND_FRAMES);
return cw.toByteArray();
}
use of org.objectweb.asm.Type in project cdap by caskdata.
the class SparkClassRewriter method rewriteAkkaRemoting.
/**
* Rewrites the akka.remote.Remoting by rewriting usages of scala.concurrent.ExecutionContext.Implicits.global
* to Remoting.system().dispatcher() in the shutdown() method for fixing the Akka thread/permgen leak bug in
* https://github.com/akka/akka/issues/17729.
*
* @return the rewritten bytes or {@code null} if no rewriting is needed
*/
@Nullable
private byte[] rewriteAkkaRemoting(InputStream byteCodeStream) throws IOException {
final Type dispatcherReturnType = determineAkkaDispatcherReturnType();
if (dispatcherReturnType == null) {
LOG.warn("Failed to determine ActorSystem.dispatcher() return type. " + "No rewriting of akka.remote.Remoting class. ClassLoader leakage might happen in SDK.");
return null;
}
ClassReader cr = new ClassReader(byteCodeStream);
ClassWriter cw = new ClassWriter(0);
cr.accept(new ClassVisitor(Opcodes.ASM5, cw) {
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
// Call super so that the method signature is registered with the ClassWriter (parent)
MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
// Only rewrite the shutdown() method
if (!"shutdown".equals(name)) {
return mv;
}
return new MethodVisitor(Opcodes.ASM5, mv) {
@Override
public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
// ()Lscala/concurrent/ExecutionContextExecutor;
if (opcode == Opcodes.INVOKEVIRTUAL && "global".equals(name) && "scala/concurrent/ExecutionContext$Implicits$".equals(owner) && Type.getMethodDescriptor(EXECUTION_CONTEXT_EXECUTOR_TYPE).equals(desc)) {
// Discard the GETSTATIC result from the stack by popping it
super.visitInsn(Opcodes.POP);
// Make the call "import system.dispatch", which translate to Java code as
// this.system().dispatcher()
// hence as bytecode
// ALOAD 0 (load this)
// INVOKEVIRTUAL akka/remote/Remoting.system ()Lakka/actor/ExtendedActorSystem;
// INVOKEVIRTUAL akka/actor/ExtendedActorSystem.dispatcher ()Lscala/concurrent/ExecutionContextExecutor;
Type extendedActorSystemType = Type.getObjectType("akka/actor/ExtendedActorSystem");
super.visitVarInsn(Opcodes.ALOAD, 0);
super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "akka/remote/Remoting", "system", Type.getMethodDescriptor(extendedActorSystemType), false);
super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, extendedActorSystemType.getInternalName(), "dispatcher", Type.getMethodDescriptor(dispatcherReturnType), false);
} else {
// For other instructions, just call parent to deal with it
super.visitMethodInsn(opcode, owner, name, desc, itf);
}
}
};
}
}, ClassReader.EXPAND_FRAMES);
return cw.toByteArray();
}
Aggregations