Example usage for org.objectweb.asm.commons Method getMethod

List of usage examples for org.objectweb.asm.commons Method getMethod

Introduction

In this page you can find the example usage for org.objectweb.asm.commons Method getMethod.

Prototype

public static Method getMethod(final String method) 

Source Link

Document

Returns a Method corresponding to the given Java method declaration.

Usage

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()));
}