use of org.glassfish.hk2.external.org.objectweb.asm.commons.GeneratorAdapter in project Payara by payara.
the class BtraceClientGenerator method generateBtraceClientClassData.
public static byte[] generateBtraceClientClassData(int clientID, Collection<FlashlightProbe> probes) {
// create a unique name. It does not matter what the name is.
String generatedClassName = "com/sun/btrace/flashlight/BTrace_Flashlight_" + clientID;
// Start of writing a class using ASM, which will be our BTrace Client
int cwFlags = ClassWriter.COMPUTE_FRAMES + ClassWriter.COMPUTE_MAXS;
ClassWriter cw = new ClassWriter(cwFlags);
// Define the access identifiers for the BTrace Client class
int access = Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL;
cw.visit(Opcodes.V1_5, access, generatedClassName, null, "java/lang/Object", null);
// Need a @OnMethod annotation, so prepare your Annotation Visitor for that
cw.visitAnnotation("Lcom/sun/btrace/annotations/BTrace;", true);
// Iterate through the probes, so you will create one method for each probe
int methodCounter = 0;
for (FlashlightProbe probe : probes) {
// Preparing the class method header and params (type) for @OnMethod annotation
StringBuilder typeDesc = new StringBuilder("void ");
StringBuilder methodDesc = new StringBuilder("void __");
methodDesc.append(probe.getProviderJavaMethodName()).append("__");
methodDesc.append(clientID).append("_").append(methodCounter).append("_");
methodDesc.append("(");
typeDesc.append("(");
String delim = "";
String typeDelim = "";
Class[] paramTypes = probe.getParamTypes();
for (int index = 0; index < paramTypes.length; index++) {
Class paramType = paramTypes[index];
methodDesc.append(delim).append(paramType.getName());
// Dont add the param type for type desc, if self is the first index
if (!(probe.hasSelf() && (index == 0))) {
typeDesc.append(typeDelim).append(paramType.getName());
typeDelim = ",";
}
delim = ", ";
}
methodDesc.append(")");
typeDesc.append(")");
// Creating the class method
Method m = Method.getMethod(methodDesc.toString());
GeneratorAdapter gen = new GeneratorAdapter(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, m, null, null, cw);
// Add the @Self annotation
if (probe.hasSelf()) {
String[] paramNames = probe.getProbeParamNames();
for (int index = 0; index < paramNames.length; index++) {
if (paramNames[index].equalsIgnoreCase(FlashlightProbe.SELF)) {
AnnotationVisitor paramVisitor = gen.visitParameterAnnotation(index, "Lcom/sun/btrace/annotations/Self;", true);
paramVisitor.visitEnd();
}
}
}
// Add the @OnMethod annotation to this method
AnnotationVisitor av = gen.visitAnnotation("Lcom/sun/btrace/annotations/OnMethod;", true);
av.visit("clazz", "" + probe.getProviderClazz().getName());
av.visit("method", probe.getProviderJavaMethodName());
av.visit("type", typeDesc.toString());
av.visitEnd();
// Add the body
gen.push(probe.getId());
gen.loadArgArray();
gen.invokeStatic(Type.getType(ProbeRegistry.class), Method.getMethod("void invokeProbe(int, Object[])"));
gen.returnValue();
gen.endMethod();
methodCounter++;
}
BtraceClientGenerator.generateConstructor(cw);
cw.visitEnd();
byte[] classData = cw.toByteArray();
writeClass(classData, generatedClassName);
return classData;
}
use of org.glassfish.hk2.external.org.objectweb.asm.commons.GeneratorAdapter in project Payara by payara.
the class ProviderImplGenerator method generateClassData.
public byte[] generateClassData(FlashlightProbeProvider provider, Class providerClazz, String generatedClassName) {
Type classType = Type.getType(providerClazz);
if (logger.isLoggable(Level.FINE)) {
logger.fine("** classType: " + classType);
logger.fine("** classDesc: " + Type.getDescriptor(providerClazz));
logger.fine("Generating for: " + generatedClassName);
}
generatedClassName = generatedClassName.replace('.', '/');
int cwFlags = ClassWriter.COMPUTE_FRAMES + ClassWriter.COMPUTE_MAXS;
ClassWriter cw = new ClassWriter(cwFlags);
int access = Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL;
String[] interfaces = new String[] { providerClazz.getName().replace('.', '/') };
cw.visit(Opcodes.V1_5, access, generatedClassName, null, "java/lang/Object", interfaces);
for (FlashlightProbe probe : provider.getProbes()) {
Type probeType = Type.getType(FlashlightProbe.class);
int fieldAccess = Opcodes.ACC_PUBLIC;
String fieldName = "_flashlight_" + probe.getProbeName();
cw.visitField(fieldAccess, fieldName, probeType.getDescriptor(), null, null);
}
Type probeType = Type.getType(FlashlightProbe.class);
for (FlashlightProbe probe : provider.getProbes()) {
StringBuilder methodDesc = new StringBuilder();
methodDesc.append("void ").append(probe.getProviderJavaMethodName());
methodDesc.append("(");
String delim = "";
for (Class paramType : probe.getParamTypes()) {
methodDesc.append(delim).append(paramType.getName());
delim = ", ";
}
methodDesc.append(")");
Method m = Method.getMethod(methodDesc.toString());
GeneratorAdapter gen = new GeneratorAdapter(Opcodes.ACC_PUBLIC, m, null, null, cw);
String fieldName = "_flashlight_" + probe.getProbeName();
gen.loadThis();
gen.visitFieldInsn(Opcodes.GETFIELD, generatedClassName, fieldName, probeType.getDescriptor());
int index = gen.newLocal(probeType);
gen.storeLocal(index);
gen.loadLocal(index);
gen.invokeVirtual(probeType, Method.getMethod("boolean isEnabled()"));
gen.push(true);
Label enabledLabel = new Label();
Label notEnabledLabel = new Label();
gen.ifCmp(Type.getType(boolean.class), GeneratorAdapter.EQ, enabledLabel);
gen.goTo(notEnabledLabel);
gen.visitLabel(enabledLabel);
gen.loadLocal(index);
gen.loadArgArray();
gen.invokeVirtual(probeType, Method.getMethod("void fireProbe(Object[])"));
gen.visitLabel(notEnabledLabel);
gen.returnValue();
gen.endMethod();
}
generateConstructor(cw, generatedClassName, provider);
cw.visitEnd();
byte[] classData = cw.toByteArray();
int index = generatedClassName.lastIndexOf('.');
String clsName = generatedClassName.substring(index + 1);
if (Boolean.parseBoolean(System.getenv("AS_DEBUG"))) {
if (logger.isLoggable(Level.FINE))
logger.fine("Generated ClassDATA " + clsName);
// the path is horribly long. Let's just write t directly into the
// lib dir. It is not for loading as a class but just for us humans
// to decompile to figure out what is going on. No need to make it even harder!
clsName = clsName.replace('.', '/');
// just in case Windows? unlikely...
clsName = clsName.replace('\\', '/');
index = clsName.lastIndexOf("/");
if (index >= 0)
clsName = clsName.substring(index + 1);
FileOutputStream fos = null;
try {
String rootPath = System.getProperty(SystemPropertyConstants.INSTALL_ROOT_PROPERTY) + File.separator + "lib" + File.separator;
String fileName = rootPath + clsName + ".class";
if (logger.isLoggable(Level.FINE))
logger.fine("ClassFile: " + fileName);
File file = new File(fileName);
if (FileUtils.mkdirsMaybe(file.getParentFile())) {
fos = new FileOutputStream(file);
fos.write(classData);
fos.flush();
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if (fos != null)
fos.close();
} catch (Exception e) {
// nothing can be done...
}
}
}
return classData;
}
use of org.glassfish.hk2.external.org.objectweb.asm.commons.GeneratorAdapter in project Payara by payara.
the class EjbOptionalIntfGenerator method generateNonAccessibleMethod.
private static void generateNonAccessibleMethod(ClassVisitor cv, java.lang.reflect.Method m) throws Exception {
String methodName = m.getName();
Type returnType = Type.getReturnType(m);
Type[] argTypes = Type.getArgumentTypes(m);
Method asmMethod = new Method(methodName, returnType, argTypes);
// Only called for non-static Protected or Package access
int access = ACC_PUBLIC;
GeneratorAdapter mg = new GeneratorAdapter(access, asmMethod, null, getExceptionTypes(m), cv);
mg.throwException(Type.getType(javax.ejb.EJBException.class), "Illegal non-business method access on no-interface view");
mg.returnValue();
mg.endMethod();
}
use of org.glassfish.hk2.external.org.objectweb.asm.commons.GeneratorAdapter in project Payara by payara.
the class EjbOptionalIntfGenerator method generateInterfaceMethod.
private static void generateInterfaceMethod(ClassVisitor cv, java.lang.reflect.Method m) throws Exception {
String methodName = m.getName();
Type returnType = Type.getReturnType(m);
Type[] argTypes = Type.getArgumentTypes(m);
Method asmMethod = new Method(methodName, returnType, argTypes);
GeneratorAdapter cg = new GeneratorAdapter(ACC_PUBLIC + ACC_ABSTRACT, asmMethod, null, getExceptionTypes(m), cv);
cg.endMethod();
}
use of org.glassfish.hk2.external.org.objectweb.asm.commons.GeneratorAdapter in project Payara by payara.
the class EjbOptionalIntfGenerator method generateSetDelegateMethod.
private static void generateSetDelegateMethod(ClassVisitor cv, Class delegateClass, String subClassName) throws Exception {
Class optProxyClass = OptionalLocalInterfaceProvider.class;
java.lang.reflect.Method proxyMethod = optProxyClass.getMethod("setOptionalLocalIntfProxy", java.lang.reflect.Proxy.class);
String methodName = proxyMethod.getName();
Type returnType = Type.getReturnType(proxyMethod);
Type[] argTypes = Type.getArgumentTypes(proxyMethod);
Type[] eTypes = getExceptionTypes(proxyMethod);
Method asmMethod = new Method(methodName, returnType, argTypes);
GeneratorAdapter mg2 = new GeneratorAdapter(ACC_PUBLIC, asmMethod, null, eTypes, cv);
mg2.visitVarInsn(ALOAD, 0);
mg2.visitVarInsn(ALOAD, 1);
mg2.visitTypeInsn(CHECKCAST, delegateClass.getName().replace('.', '/'));
String delIntClassDesc = Type.getType(delegateClass).getDescriptor();
mg2.visitFieldInsn(PUTFIELD, subClassName.replace('.', '/'), DELEGATE_FIELD_NAME, delIntClassDesc);
mg2.returnValue();
mg2.endMethod();
}
Aggregations