@Override public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Label[] labels) { checkEndCode(); checkStartCode(); checkLabel(dflt, false, "default label"); checkNonDebugLabel(dflt); if (keys == null || labels == null || keys.length != labels.length) { throw new IllegalArgumentException("There must be the same number of keys and labels"); } for (int i = 0; i < labels.length; ++i) { checkLabel(labels[i], false, "label at index " + i); checkNonDebugLabel(labels[i]); } super.visitLookupSwitchInsn(dflt, keys, labels); usedLabels.add(dflt); for (int i = 0; i < labels.length; ++i) { usedLabels.add(labels[i]); } ++insnCount; }
public void visitLookupSwitchInsn(Label label, int[] ints, Label[] labels) { System.out.println("visitLookupSwitchInsn(" + label + ", " + ints + ", " + labels + ")"); methodVisitor.visitLookupSwitchInsn(label, ints, labels); }
public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) { visitor.visitLookupSwitchInsn(dflt, keys, labels); }
@Override public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) { mtd.addSwitch(dflt, keys, labels); super.visitLookupSwitchInsn(dflt, keys, labels); }
private void buildObjectDispatchMethods(ClassWriter cw) { String classname = "SVDBPersistenceDelegate"; String full_classname = transform_cls(fTargetPkg) + "/" + classname; int idx; Label labels[] = new Label[fClassList.size()]; int indexes[] = new int[fClassList.size()]; Label dflt, endcase; for (int i = 0; i < fClassList.size(); i++) { indexes[i] = i; } // writeItem Dispatch method MethodVisitor mv = cw.visitMethod( ACC_PUBLIC, "writeObject", "(L" + getClassName(Class.class) + ";" + "L" + getClassName(Object.class) + ";)V", null, new String[] {fDBWriteException}); for (int i = 0; i < fClassList.size(); i++) { labels[i] = new Label(); } dflt = new Label(); endcase = new Label(); // Find the object index mv.visitVarInsn(ALOAD, THIS_VAR); mv.visitFieldInsn( GETFIELD, fBaseClass, "fObjectTypeList", "L" + getClassName(List.class) + ";"); // Class parameter // fObjectList field mv.visitVarInsn(ALOAD, 1); // cls parameter mv.visitMethodInsn( INVOKEINTERFACE, getClassName(List.class), "indexOf", "(L" + getClassName(Object.class) + ";)I"); // Index now on the stack mv.visitLookupSwitchInsn(dflt, indexes, labels); idx = 0; for (Class c : fClassList) { mv.visitLabel(labels[idx]); mv.visitVarInsn(ALOAD, THIS_VAR); mv.visitVarInsn(ALOAD, 2); // object mv.visitTypeInsn(CHECKCAST, getClassName(c)); mv.visitMethodInsn( INVOKESPECIAL, full_classname, "write" + getClassLeafName(c), "(L" + getClassName(c) + ";)V"); mv.visitJumpInsn(GOTO, endcase); idx++; } mv.visitLabel(dflt); mv.visitVarInsn(ALOAD, THIS_VAR); mv.visitVarInsn(ALOAD, 2); // object mv.visitMethodInsn( INVOKESPECIAL, full_classname, "writeObjectErr", "(L" + getClassName(Object.class) + ";)V"); mv.visitLabel(endcase); mv.visitInsn(RETURN); mv.visitMaxs(16, 16); mv.visitEnd(); // readItem dispatch method mv = cw.visitMethod( ACC_PUBLIC, "readObject", "(L" + getClassName(ISVDBChildItem.class) + ";" + "L" + getClassName(Class.class) + ";" + "L" + getClassName(Object.class) + ";)V", null, new String[] {fDBWriteException}); for (int i = 0; i < fClassList.size(); i++) { labels[i] = new Label(); } dflt = new Label(); endcase = new Label(); // Find the object index mv.visitVarInsn(ALOAD, THIS_VAR); mv.visitFieldInsn( GETFIELD, fBaseClass, "fObjectTypeList", "L" + getClassName(List.class) + ";"); // Class parameter // fObjectList field mv.visitVarInsn(ALOAD, 2); // cls parameter mv.visitMethodInsn( INVOKEINTERFACE, getClassName(List.class), "indexOf", "(L" + getClassName(Object.class) + ";)I"); mv.visitLookupSwitchInsn(dflt, indexes, labels); idx = 0; for (Class c : fClassList) { mv.visitLabel(labels[idx]); // mv.visitVarInsn(ALOAD, THIS_VAR); mv.visitVarInsn(ALOAD, 1); // parent mv.visitVarInsn(ALOAD, 3); // object mv.visitTypeInsn(CHECKCAST, getClassName(c)); mv.visitMethodInsn( INVOKESPECIAL, full_classname, "read" + getClassLeafName(c), "(L" + getClassName(ISVDBChildItem.class) + ";" + "L" + getClassName(c) + ";)V"); mv.visitJumpInsn(GOTO, endcase); idx++; } mv.visitLabel(dflt); mv.visitVarInsn(ALOAD, THIS_VAR); mv.visitVarInsn(ALOAD, 3); // object mv.visitMethodInsn( INVOKESPECIAL, full_classname, "readObjectErr", "(L" + getClassName(Object.class) + ";)V"); mv.visitLabel(endcase); mv.visitInsn(RETURN); mv.visitMaxs(4, 4); mv.visitEnd(); }
private void buildItemDispatchMethods(ClassWriter cw) { String classname = "SVDBPersistenceDelegate"; String full_classname = transform_cls(fTargetPkg) + "/" + classname; Label labels[] = new Label[SVDBItemType.values().length]; int indexes[] = new int[SVDBItemType.values().length]; Label dflt, endcase; for (int i = 0; i < SVDBItemType.values().length; i++) { indexes[i] = i; } // writeItem Dispatch method MethodVisitor mv = cw.visitMethod( ACC_PUBLIC, "writeSVDBItem", "(L" + getClassName(ISVDBItemBase.class) + ";)V", null, new String[] {fDBWriteException}); for (int i = 0; i < SVDBItemType.values().length; i++) { labels[i] = new Label(); } dflt = new Label(); endcase = new Label(); // Retrieve the object type mv.visitVarInsn(ALOAD, WRITE_OBJ_VAR); mv.visitMethodInsn( INVOKEINTERFACE, getClassName(ISVDBItemBase.class), "getType", "()L" + getClassName(SVDBItemType.class) + ";"); mv.visitMethodInsn(INVOKEVIRTUAL, getClassName(SVDBItemType.class), "ordinal", "()I"); mv.visitLookupSwitchInsn(dflt, indexes, labels); for (SVDBItemType t : SVDBItemType.values()) { Class c = fTypeClassMap.get(t); mv.visitLabel(labels[t.ordinal()]); mv.visitVarInsn(ALOAD, THIS_VAR); mv.visitVarInsn(ALOAD, WRITE_OBJ_VAR); mv.visitTypeInsn(CHECKCAST, getClassName(c)); mv.visitMethodInsn( INVOKESPECIAL, full_classname, "write" + t.name(), "(L" + getClassName(c) + ";)V"); mv.visitJumpInsn(GOTO, endcase); } mv.visitLabel(dflt); mv.visitLabel(endcase); mv.visitInsn(RETURN); mv.visitMaxs(16, 16); mv.visitEnd(); // readItem dispatch method mv = cw.visitMethod( ACC_PUBLIC, "readSVDBItem", "(L" + getClassName(SVDBItemType.class) + ";L" + getClassName(ISVDBChildItem.class) + ";)L" + getClassName(ISVDBItemBase.class) + ";", null, new String[] {fDBWriteException}); for (int i = 0; i < SVDBItemType.values().length; i++) { labels[i] = new Label(); } dflt = new Label(); endcase = new Label(); mv.visitVarInsn(ALOAD, 1); // object type mv.visitMethodInsn(INVOKEVIRTUAL, getClassName(SVDBItemType.class), "ordinal", "()I"); mv.visitLookupSwitchInsn(dflt, indexes, labels); for (SVDBItemType t : SVDBItemType.values()) { Class c = fTypeClassMap.get(t); mv.visitLabel(labels[t.ordinal()]); mv.visitVarInsn(ALOAD, THIS_VAR); mv.visitVarInsn(ALOAD, 2); // parent mv.visitMethodInsn( INVOKESPECIAL, full_classname, "read" + t.name(), "(L" + getClassName(ISVDBChildItem.class) + ";)" + "L" + getClassName(c) + ";"); mv.visitJumpInsn(GOTO, endcase); } mv.visitLabel(dflt); mv.visitInsn(ACONST_NULL); mv.visitLabel(endcase); mv.visitInsn(ARETURN); mv.visitMaxs(16, 16); mv.visitEnd(); }
@Override public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) { _touchBranch(); super.visitLookupSwitchInsn(dflt, keys, labels); }
public void LOOKUPSWITCH(Label dflt, int[] keys, Label[] labels) { itsVisitor.visitLookupSwitchInsn(dflt, keys, labels); }