List of usage examples for org.objectweb.asm.commons Method getMethod
public static Method getMethod(final String method)
From source file:com.axway.jmb.MethodBuilder.java
License:Open Source License
public void storeInField(ModuleBuilder mb, String varName, boolean isStatementCall, int statementCallCurrentParameterIndex) throws CompileException { ClassField field = mb.getField(varName); if (field == null) throw new CompileException("Class field " + varName + " used, but not defined."); if (isStatementCall) { visitInsn(Opcodes.DUP);/* ww w .ja v a 2 s.c o m*/ visitInsn(Opcodes.ICONST_0 + statementCallCurrentParameterIndex); visitInsn(AALOAD); } if (field.getType() == JMBVariableType.FIXED_STRING) { invokeVirtual(Type.getType(String.class), Method.getMethod("char[] toCharArray()")); push((int) field.getFixedStringLength()); invokeStatic(Type.getType(Arrays.class), Method.getMethod("char[] copyOf(char[], int)")); } else if (field.getType() == JMBVariableType.STRING) { invokeVirtual(Type.getType(Object.class), Method.getMethod("String toString()")); } else if (field.getType() == JMBVariableType.INTEGER) { visitTypeInsn(CHECKCAST, "java/lang/Long"); } else if (field.getType() == JMBVariableType.FLOAT) { visitTypeInsn(CHECKCAST, "java/lang/Double"); } else if (field.getType() == JMBVariableType.DATE) { visitTypeInsn(CHECKCAST, "java/util/Date"); } loadThis(); swap(); if (field.isArray()) { putField(Type.getObjectType(mb.getClassFullyQualifiedName()), varName, field.getType().getArrayJvmType(field.getArrayDimension())); } else { putField(Type.getObjectType(mb.getClassFullyQualifiedName()), varName, field.getType().getJvmType()); } debug("## put field " + field.getName()); }
From source file:com.axway.jmb.MethodBuilder.java
License:Open Source License
public void printStatement(List<Object> objs) { StringBuffer sb = new StringBuffer(); Integer tempLocalVar = null;/* w ww . j a va 2 s .co m*/ for (Object obj : objs) { if (obj instanceof String) { sb.append(obj); } else if (obj instanceof LocalVariable) { LocalVariable lv = (LocalVariable) obj; if (tempLocalVar != null) { loadLocal(tempLocalVar, Type.getType(String.class)); push(sb.toString()); invokeVirtual(Type.getType(String.class), Method.getMethod("String concat(String)")); } else { push(sb.toString()); } if (!lv.isArray()) { loadLocal(lv.getArrayPosition(), lv.getType().getJvmType()); if (lv.getType() == JMBVariableType.INTEGER) { invokeVirtual(Type.getType(Long.class), Method.getMethod("String toString()")); } if (lv.getType() == JMBVariableType.FLOAT) { invokeVirtual(Type.getType(Double.class), Method.getMethod("String toString()")); } if (lv.getType() == JMBVariableType.FIXED_STRING) { invokeStatic(Type.getType(String.class), Method.getMethod("String valueOf(char[])")); } if (lv.getType() == JMBVariableType.DATE) { invokeStatic(Type.getType(JMBCSupport.class), Method.getMethod("String formatDateDefault(java.util.Date)")); } } else { loadLocal(lv.getArrayPosition(), lv.getType().getArrayJvmType(lv.getArrayDimension())); push(lv.getArrayAccess() - 1); arrayLoad(lv.getType().getJvmType()); // visitTypeInsn(CHECKCAST, "java/lang/String"); // invokeStatic(Type.getType(Arrays.class), Method.getMethod("String toString(Object[])")); } invokeVirtual(Type.getType(String.class), Method.getMethod("String concat(String)")); sb = new StringBuffer(); if (tempLocalVar == null) { tempLocalVar = newLocal(Type.getType(String.class)); } storeLocal(tempLocalVar, Type.getType(String.class)); } } if (tempLocalVar == null) { tempLocalVar = newLocal(Type.getType(String.class)); push(sb.toString()); storeLocal(tempLocalVar, Type.getType(String.class)); } loadLocal(tempLocalVar, Type.getType(String.class)); invokeStatic(Type.getType(Builtin.class), Method.getMethod("void print ( Object )")); }
From source file:com.axway.jmb.MethodBuilder.java
License:Open Source License
public void addCallToOpenFile(boolean forRead) { push(forRead);/*from w w w.j av a 2s. c o m*/ invokeStatic(Type.getType(Builtin.class), Method.getMethod("void openFile ( String , boolean )")); }
From source file:com.axway.jmb.MethodBuilder.java
License:Open Source License
public void addCallToCloseFile(boolean forRead) { push(forRead);//w w w. j a v a 2s . co m invokeStatic(Type.getType(Builtin.class), Method.getMethod("void closeFile ( boolean )")); }
From source file:com.axway.jmb.MethodBuilder.java
License:Open Source License
public void addCallToRead(ModuleBuilder mb, String variableName) throws CompileException { debug(" addCallToRead( " + variableName + ")"); invokeStatic(Type.getType(Builtin.class), Method.getMethod("String read ( Object )")); if (isLocalVariableDefined(variableName)) { storeInLocalVar(variableName, false, 0); } else {//w ww. ja v a 2 s .c o m storeInField(mb, variableName, false, 0); } }
From source file:com.changingbits.Builder.java
License:Apache License
/** Build a {@link LongRangeMultiSet} implementation to * lookup intervals for a given point.//from ww w . ja va 2s .c o m * * @param useAsm If true, the tree will be compiled to * java bytecodes using the {@code asm} library; typically * this results in a faster (~3X) implementation. */ public LongRangeMultiSet getMultiSet(boolean useAsm, boolean useArrayImpl) { finish(useArrayImpl); if (useAsm) { StringBuilder sb = new StringBuilder(); sb.append('\n'); int count = 0; for (LongRange range : ranges) { sb.append("// range "); sb.append(count++); sb.append(": "); sb.append(range); sb.append('\n'); } sb.append('\n'); sb.append("int upto = 0;\n"); buildJavaSource(root, 0, sb); String javaSource = sb.toString(); //System.out.println("java: " + javaSource); ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); classWriter.visit(Opcodes.V1_7, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC, COMPILED_TREE_CLASS.replace('.', '/'), null, LONG_RANGE_MULTI_SET_TYPE.getInternalName(), null); classWriter.visitSource(javaSource, null); Method m = Method.getMethod("void <init> ()"); GeneratorAdapter constructor = new GeneratorAdapter(Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, m, null, null, classWriter); constructor.loadThis(); constructor.loadArgs(); constructor.invokeConstructor(LONG_RANGE_MULTI_SET_TYPE, m); constructor.returnValue(); constructor.endMethod(); GeneratorAdapter gen = new GeneratorAdapter(Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, LOOKUP_METHOD, null, null, classWriter); //Label labelTop = new Label(); //Label labelEnd = new Label(); //gen.visitLabel(labelTop); int uptoLocal = gen.newLocal(Type.INT_TYPE); //System.out.println("uptoLocal=" + uptoLocal); // nocommit is this not needed!? //gen.visitLocalVariable("upto", "I", null, labelTop, labelEnd, uptoLocal); gen.push(0); gen.storeLocal(uptoLocal, Type.INT_TYPE); buildAsm(gen, root, uptoLocal); // Return upto: gen.loadLocal(uptoLocal, Type.INT_TYPE); gen.returnValue(); //gen.visitLabel(labelEnd); gen.endMethod(); classWriter.visitEnd(); byte[] bytes = classWriter.toByteArray(); // javap -c /x/tmp/my.class /* try { FileOutputStream fos = new FileOutputStream(new File("/x/tmp/my.class")); fos.write(bytes); fos.close(); } catch (Exception e) { throw new RuntimeException(e); } */ // nocommit allow changing the class loader Class<? extends LongRangeMultiSet> treeClass = new Loader(LongRangeMultiSet.class.getClassLoader()) .define(COMPILED_TREE_CLASS, classWriter.toByteArray()); try { return treeClass.getConstructor().newInstance(); } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { throw new RuntimeException(e); } } else if (useArrayImpl) { return new ArrayLongRangeMultiSet(root); } else { return new SimpleLongRangeMultiSet(root); } }
From source file:com.changingbits.Builder.java
License:Apache License
public LongRangeCounter getCounter(boolean useAsm) { finish(false);/*from w ww .ja va 2s. co m*/ if (useAsm) { StringBuilder sb = new StringBuilder(); sb.append('\n'); int count = 0; for (LongRange range : ranges) { sb.append("// range "); sb.append(count++); sb.append(": "); sb.append(range); sb.append('\n'); } sb.append('\n'); buildJavaCounterSource(root, 0, sb, false); String javaSource = sb.toString(); //System.out.println("javaSource:\n" + javaSource); ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); classWriter.visit(Opcodes.V1_7, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC, COMPILED_COUNTER_CLASS.replace('.', '/'), null, BASE_LONG_RANGE_COUNTER_TYPE.getInternalName(), null); classWriter.visitSource(javaSource, null); Method m = Method.getMethod("void <init> (com.changingbits.Node, int, int)"); GeneratorAdapter constructor = new GeneratorAdapter(Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, m, null, null, classWriter); constructor.loadThis(); constructor.loadArgs(); constructor.invokeConstructor(Type.getType(BaseLongRangeCounter.class), m); constructor.returnValue(); constructor.endMethod(); GeneratorAdapter gen = new GeneratorAdapter(Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, ADD_METHOD, null, null, classWriter); buildCounterAsm(gen, root, false); gen.returnValue(); gen.endMethod(); classWriter.visitEnd(); byte[] bytes = classWriter.toByteArray(); // javap -c /x/tmp/my.class /* try { FileOutputStream fos = new FileOutputStream(new File("/x/tmp/counter.class")); fos.write(bytes); fos.close(); } catch (Exception e) { throw new RuntimeException(e); } */ // nocommit allow changing the class loader Class<? extends LongRangeCounter> cl = new CounterLoader(LongRangeCounter.class.getClassLoader()) .define(COMPILED_COUNTER_CLASS, classWriter.toByteArray()); try { return cl.getConstructor(Node.class, int.class, int.class).newInstance(root, elementaryIntervals.size(), ranges.length); } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { throw new RuntimeException(e); } } else { return new SimpleLongRangeCounter(root, elementaryIntervals, ranges.length); } }
From source file:com.changingbits.Builder.java
License:Apache License
public LongRangeCounter getCounter2() { finish(false);// w w w.j a v a 2 s .com // Maps each range to the leaf counts that contribute to it: Map<Integer, List<Integer>> rangeToLeaf = new HashMap<>(); buildRangeToLeaf(root, new ArrayList<Integer>(), rangeToLeaf); StringBuilder sb = new StringBuilder(); sb.append('\n'); sb.append("public void add(long v) {\n"); int count = 0; for (LongRange range : ranges) { sb.append(" // range "); sb.append(count++); sb.append(": "); sb.append(range); sb.append('\n'); } buildJavaCounter2Source(root, 1, sb, false); sb.append("}\n\n"); sb.append("public int[] getCounts() {\n"); sb.append(" int[] counts = new int["); sb.append(ranges.length); sb.append("];\n"); for (int range = 0; range < ranges.length; range++) { List<Integer> elements = rangeToLeaf.get(range); if (elements != null) { sb.append(" counts["); sb.append(range); sb.append("] = count"); sb.append(elements.get(0)); for (int i = 1; i < elements.size(); i++) { sb.append(" + count"); sb.append(elements.get(i)); } sb.append(";\n"); } } sb.append(" return counts;\n}\n"); String javaSource = sb.toString(); //System.out.println("counter2 javaSource:\n" + javaSource); ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); classWriter.visit(Opcodes.V1_7, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC, COMPILED_COUNTER_CLASS2.replace('.', '/'), null, LONG_RANGE_COUNTER_TYPE.getInternalName(), null); classWriter.visitSource(javaSource, null); // Define "int countN" members: int numLeaves = elementaryIntervals.size(); for (int i = 0; i < numLeaves; i++) { classWriter.visitField(Opcodes.ACC_PRIVATE | Opcodes.ACC_SYNTHETIC, "count" + i, "I", null, null); } // init: Method m = Method.getMethod("void <init> ()"); GeneratorAdapter constructor = new GeneratorAdapter(Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, m, null, null, classWriter); // Init all counters to 0: for (int i = 0; i < numLeaves; i++) { constructor.loadThis(); constructor.push(0); constructor.putField(COMPILED_COUNTER_CLASS2_TYPE, "count" + i, Type.INT_TYPE); } constructor.loadThis(); constructor.invokeConstructor(LONG_RANGE_COUNTER_TYPE, m); constructor.returnValue(); constructor.endMethod(); // void add(long v): GeneratorAdapter gen = new GeneratorAdapter(Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, ADD_METHOD, null, null, classWriter); buildCounterAsm2(gen, root, false); gen.returnValue(); gen.endMethod(); // int[] getCounts(): gen = new GeneratorAdapter(Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, GET_COUNTS_METHOD, null, null, classWriter); int countsLocal = gen.newLocal(INT_ARRAY_TYPE); gen.push(ranges.length); gen.newArray(Type.INT_TYPE); gen.storeLocal(countsLocal); for (int range = 0; range < ranges.length; range++) { List<Integer> elements = rangeToLeaf.get(range); if (elements != null) { gen.loadLocal(countsLocal); gen.push(range); gen.loadThis(); gen.getField(COMPILED_COUNTER_CLASS2_TYPE, "count" + elements.get(0), Type.INT_TYPE); for (int i = 1; i < elements.size(); i++) { gen.loadThis(); gen.getField(COMPILED_COUNTER_CLASS2_TYPE, "count" + elements.get(i), Type.INT_TYPE); gen.visitInsn(Opcodes.IADD); } gen.arrayStore(Type.INT_TYPE); } } gen.loadLocal(countsLocal); gen.returnValue(); gen.endMethod(); classWriter.visitEnd(); byte[] bytes = classWriter.toByteArray(); // javap -c /x/tmp/my.class /* try { FileOutputStream fos = new FileOutputStream(new File("/x/tmp/counter2.class")); fos.write(bytes); fos.close(); } catch (Exception e) { throw new RuntimeException(e); } */ // nocommit allow changing the class loader Class<? extends LongRangeCounter> cl = new CounterLoader(LongRangeCounter.class.getClassLoader()) .define(COMPILED_COUNTER_CLASS2, classWriter.toByteArray()); try { return cl.getConstructor().newInstance(); } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { throw new RuntimeException(e); } }
From source file:com.google.code.nanorm.internal.introspect.asm.AccessorBuilder.java
License:Apache License
/** * Generate//from w w w. j a v a2s. c o m * {@link com.google.code.nanorm.internal.introspect.Getter#getType()} * method. * * @param owner type representing the class being generated */ private void visitGetType(Type owner) { Method getTypeMethod = Method.getMethod("java.lang.reflect.Type getType()"); GeneratorAdapter mg = new GeneratorAdapter(Opcodes.ACC_PUBLIC, getTypeMethod, null, null, cw); mg.loadThis(); mg.getField(owner, "type", JL_REFLECT_TYPE_TYPE); mg.returnValue(); mg.endMethod(); }
From source file:com.google.template.soy.jbcsrc.ConstructorRef.java
License:Apache License
static ConstructorRef create(Class<?> clazz, Class<?>... argTypes) { TypeInfo type = TypeInfo.create(clazz); Constructor<?> c;//w ww . j a va 2 s . co m try { c = clazz.getConstructor(argTypes); } catch (NoSuchMethodException | SecurityException e) { throw new RuntimeException(e); } Type constructorType = Type.getType(c); return new AutoValue_ConstructorRef(type, Method.getMethod(c), ImmutableList.copyOf(constructorType.getArgumentTypes())); }