src/jdk/nashorn/internal/codegen/CodeGenerator.java

Print this page




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