List of usage examples for org.objectweb.asm.commons TableSwitchGenerator generateDefault
void generateDefault();
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); }