/** * Sort match and targets array with QuickSort. */ private final void sort(int l, int r) { int i = l, j = r; int h, m = match[(l + r) / 2]; InstructionHandle h2; do { while(match[i] < m) i++; while(m < match[j]) j--; if(i <= j) { h=match[i]; match[i]=match[j]; match[j]=h; // Swap elements h2=targets[i]; targets[i]=targets[j]; targets[j]=h2; // Swap instructions, too i++; j--; } } while(i <= j); if(l < j) sort(l, j); if(i < r) sort(i, r); }
instruction = new TABLESWITCH(match, targets, target); else { sort(0, match_length - 1);
/** * Template for switch() constructs. If the match array can be * sorted in ascending order with gaps no larger than max_gap * between the numbers, a TABLESWITCH instruction is generated, and * a LOOKUPSWITCH otherwise. The former may be more efficient, but * needs more space. * * Note, that the key array always will be sorted, though we leave * the original arrays unaltered. * * @param match array of match values (case 2: ... case 7: ..., etc.) * @param targets the instructions to be branched to for each case * @param target the default target * @param max_gap maximum gap that may between case branches */ public SWITCH(final int[] match, final InstructionHandle[] targets, final InstructionHandle target, final int max_gap) { this.match = match.clone(); this.targets = targets.clone(); if ((match_length = match.length) < 2) { instruction = new TABLESWITCH(match, targets, target); } else { sort(0, match_length - 1); if (matchIsOrdered(max_gap)) { fillup(max_gap, target); instruction = new TABLESWITCH(this.match, this.targets, target); } else { instruction = new LOOKUPSWITCH(this.match, this.targets, target); } } }