Beispiel #1
0
 /**
  * public void bdbReadXxxKeyFields(EntityInput input, int startField, int endField, int
  * superLevel) { // ... if (superLevel <= 0) { switch (startField) { case 0: keyField1 =
  * input.readInt(); if (endField == 0) break; case 1: keyField2 = (String) input.readObject(); if
  * (endField == 1) break; case 2: keyField3 = input.readInt(); } }
  */
 private void genReadFieldSwitch(MethodVisitor mv, List<FieldInfo> fields) {
   int nFields = fields.size();
   if (nFields > 0) {
     mv.visitVarInsn(ILOAD, 4);
     Label pastSwitch = new Label();
     mv.visitJumpInsn(IFGT, pastSwitch);
     Label[] labels = new Label[nFields];
     for (int i = 0; i < nFields; i += 1) {
       labels[i] = new Label();
     }
     mv.visitVarInsn(ILOAD, 2);
     mv.visitTableSwitchInsn(0, nFields - 1, pastSwitch, labels);
     for (int i = 0; i < nFields; i += 1) {
       FieldInfo field = fields.get(i);
       mv.visitLabel(labels[i]);
       genReadField(mv, field);
       if (i < nFields - 1) {
         Label nextCase = labels[i + 1];
         mv.visitVarInsn(ILOAD, 3);
         if (i == 0) {
           mv.visitJumpInsn(IFNE, nextCase);
         } else {
           switch (i) {
             case 1:
               mv.visitInsn(ICONST_1);
               break;
             case 2:
               mv.visitInsn(ICONST_2);
               break;
             case 3:
               mv.visitInsn(ICONST_3);
               break;
             case 4:
               mv.visitInsn(ICONST_4);
               break;
             case 5:
               mv.visitInsn(ICONST_5);
               break;
             default:
               mv.visitIntInsn(BIPUSH, i);
           }
           mv.visitJumpInsn(IF_ICMPNE, nextCase);
         }
         mv.visitJumpInsn(GOTO, pastSwitch);
       }
     }
     mv.visitLabel(pastSwitch);
   }
 }