+
+ private boolean isIntegerSwitch() {
+ if(scrutinee.getType() != Types.INTEGER)
+ return false;
+ for(BranchRef branch : branches)
+ if(branch.constructor != null && !(branch.constructor instanceof IntegerConstant))
+ return false;
+ return true;
+ }
+
+ private void generateIntegerSwitch(MethodBuilder mb) {
+ int defaultId;
+ for(defaultId=0;defaultId<branches.length-1&&branches[defaultId].constructor!=null;++defaultId);
+ int[] values = new int[defaultId];
+ Cont[] continuations = new Cont[defaultId+1];
+ TIntObjectHashMap<Label> labelMap = new TIntObjectHashMap<Label>(defaultId);
+ for(int i=0;i<defaultId;++i) {
+ int value = ((IntegerConstant)branches[i].constructor).getValue();
+ values[i] = value;
+ Cont cont = branches[i].cont.getBinding();
+ labelMap.put(value, mb.getLabel(cont));
+ continuations[i] = cont;
+ }
+ Arrays.sort(values);
+ Label[] labels = new Label[defaultId];
+ for(int i=0;i<defaultId;++i)
+ labels[i] = labelMap.get(values[i]);
+ Label defaultLabel;
+ {
+ Cont cont = branches[defaultId].cont.getBinding();
+ defaultLabel = mb.getLabel(cont);
+ continuations[defaultId] = cont;
+ }
+ mb.push(scrutinee, Types.INTEGER);
+ mb.switch_(values, labels, defaultLabel);
+ for(Cont cont : continuations)
+ mb.ensureExists(cont);
+ }