1828 final int hi = values[size - 1];
1829 final int range = hi - lo + 1;
1830
1831 // Find an unused value for default.
1832 int deflt = Integer.MIN_VALUE;
1833 for (final int value : values) {
1834 if (deflt == value) {
1835 deflt++;
1836 } else if (deflt < value) {
1837 break;
1838 }
1839 }
1840
1841 // Load switch expression.
1842 load(expression);
1843 final Type type = expression.getType();
1844
1845 // If expression not int see if we can convert, if not use deflt to trigger default.
1846 if (!type.isInteger()) {
1847 method.load(deflt);
1848 method.invoke(staticCallNoLookup(ScriptRuntime.class, "switchTagAsInt", int.class, type.getTypeClass(), int.class));
1849 }
1850
1851 // If reasonable size and not too sparse (80%), use table otherwise use lookup.
1852 if (range > 0 && range < 4096 && range < (size * 5 / 4)) {
1853 final Label[] table = new Label[range];
1854 Arrays.fill(table, defaultLabel);
1855
1856 for (int i = 0; i < size; i++) {
1857 final int value = values[i];
1858 table[value - lo] = labels[i];
1859 }
1860
1861 method.tableswitch(lo, hi, defaultLabel, table);
1862 } else {
1863 final int[] ints = new int[size];
1864 for (int i = 0; i < size; i++) {
1865 ints[i] = values[i];
1866 }
1867
1868 method.lookupswitch(defaultLabel, ints, labels);
|
1828 final int hi = values[size - 1];
1829 final int range = hi - lo + 1;
1830
1831 // Find an unused value for default.
1832 int deflt = Integer.MIN_VALUE;
1833 for (final int value : values) {
1834 if (deflt == value) {
1835 deflt++;
1836 } else if (deflt < value) {
1837 break;
1838 }
1839 }
1840
1841 // Load switch expression.
1842 load(expression);
1843 final Type type = expression.getType();
1844
1845 // If expression not int see if we can convert, if not use deflt to trigger default.
1846 if (!type.isInteger()) {
1847 method.load(deflt);
1848 final Class exprClass = type.getTypeClass();
1849 method.invoke(staticCallNoLookup(ScriptRuntime.class, "switchTagAsInt", int.class, exprClass.isPrimitive()? exprClass : Object.class, int.class));
1850 }
1851
1852 // If reasonable size and not too sparse (80%), use table otherwise use lookup.
1853 if (range > 0 && range < 4096 && range < (size * 5 / 4)) {
1854 final Label[] table = new Label[range];
1855 Arrays.fill(table, defaultLabel);
1856
1857 for (int i = 0; i < size; i++) {
1858 final int value = values[i];
1859 table[value - lo] = labels[i];
1860 }
1861
1862 method.tableswitch(lo, hi, defaultLabel, table);
1863 } else {
1864 final int[] ints = new int[size];
1865 for (int i = 0; i < size; i++) {
1866 ints[i] = values[i];
1867 }
1868
1869 method.lookupswitch(defaultLabel, ints, labels);
|