public void visit_switch(final Instruction inst) {
		final Switch sw = (Switch) inst.operand();

		final int[] values = sw.values();
		final Label[] targets = sw.targets();

		if (values.length == 0) {
			if (longBranch) {
				addOpcode(Opcode.opc_pop); // Pop switch "index" off stack
				addOpcode(Opcode.opc_goto_w);
				addLongBranch(sw.defaultTarget());
			} else {
				addOpcode(Opcode.opc_pop); // Pop switch "index" off stack
				addOpcode(Opcode.opc_goto);
				addBranch(sw.defaultTarget());
			}
		} else if (sw.hasContiguousValues()) {
			addOpcode(Opcode.opc_tableswitch);
			addLongBranch(sw.defaultTarget());

			addInt(values[0]);
			addInt(values[values.length - 1]);

			for (int i = 0; i < targets.length; i++) {
				addLongBranch(targets[i]);
			}
		} else {
			addOpcode(Opcode.opc_lookupswitch);
			addLongBranch(sw.defaultTarget());

			addInt(values.length);

			for (int i = 0; i < targets.length; i++) {
				addInt(values[i]);
				addLongBranch(targets[i]);
			}
		}

		stackHeight--;
	}