Example usage for org.objectweb.asm.commons TableSwitchGenerator generateDefault

List of usage examples for org.objectweb.asm.commons TableSwitchGenerator generateDefault

Introduction

In this page you can find the example usage for org.objectweb.asm.commons TableSwitchGenerator generateDefault.

Prototype

void generateDefault();

Source Link

Document

Generates the code for the default switch case.

Usage

From source file:org.formulacompiler.compiler.internal.bytecode.MethodCompiler.java

License:Open Source License

protected final void compileTableSwitch(int[] _keys, final TableSwitchGenerator _generator)
        throws CompilerException {
    try {//from w w  w  . j  a  v a  2s. co  m
        mv().tableSwitch(_keys, new org.objectweb.asm.commons.TableSwitchGenerator() {

            public void generateCase(int _key, Label _end) {
                try {
                    _generator.generateCase(_key, _end);
                } catch (CompilerException e) {
                    throw new InnerException(e);
                }
            }

            public void generateDefault() {
                try {
                    _generator.generateDefault();
                } catch (CompilerException e) {
                    throw new InnerException(e);
                }
            }

        });
    } catch (InnerException e) {
        throw (CompilerException) e.getCause();
    }

}

From source file:org.jboss.byteman.agent.adapter.RuleGeneratorAdapter.java

License:Open Source License

/**
 * Generates the instructions for a switch statement.
 *
 * @param keys the switch case keys./*from ww  w. j  av a  2  s .co  m*/
 * @param generator a generator to generate the code for the switch cases.
 * @param useTable <tt>true</tt> to use a TABLESWITCH instruction, or
 *        <tt>false</tt> to use a LOOKUPSWITCH instruction.
 */
public void tableSwitch(final int[] keys, final TableSwitchGenerator generator, final boolean useTable) {
    for (int i = 1; i < keys.length; ++i) {
        if (keys[i] < keys[i - 1]) {
            throw new IllegalArgumentException("keys must be sorted ascending");
        }
    }
    Label def = newLabel();
    Label end = newLabel();
    if (keys.length > 0) {
        int len = keys.length;
        int min = keys[0];
        int max = keys[len - 1];
        int range = max - min + 1;
        if (useTable) {
            Label[] labels = new Label[range];
            Arrays.fill(labels, def);
            for (int i = 0; i < len; ++i) {
                labels[keys[i] - min] = newLabel();
            }
            visitTableSwitchInsn(min, max, def, labels);
            for (int i = 0; i < range; ++i) {
                Label label = labels[i];
                if (label != def) {
                    mark(label);
                    generator.generateCase(i + min, end);
                }
            }
        } else {
            Label[] labels = new Label[len];
            for (int i = 0; i < len; ++i) {
                labels[i] = newLabel();
            }
            visitLookupSwitchInsn(def, keys, labels);
            for (int i = 0; i < len; ++i) {
                mark(labels[i]);
                generator.generateCase(keys[i], end);
            }
        }
    }
    mark(def);
    generator.generateDefault();
    mark(end);
}