docs: private static int stackChange(int opcode) {
          // For INVOKE... accounts only for popping this (unless static),
          // ignoring parameters and return type
          switch (opcode) {
              case ByteCode.DASTORE:
              case ByteCode.LASTORE:
                  return -4;
  
              case ByteCode.AASTORE:
              case ByteCode.BASTORE:
              case ByteCode.CASTORE:
              case ByteCode.DCMPG:
              case ByteCode.DCMPL:
              case ByteCode.FASTORE:
              case ByteCode.IASTORE:
              case ByteCode.LCMP:
              case ByteCode.SASTORE:
                  return -3;
  
              case ByteCode.DADD:
              case ByteCode.DDIV:
              case ByteCode.DMUL:
              case ByteCode.DREM:
              case ByteCode.DRETURN:
              case ByteCode.DSTORE:
              case ByteCode.DSTORE_0:
              case ByteCode.DSTORE_1:
              case ByteCode.DSTORE_2:
              case ByteCode.DSTORE_3:
              case ByteCode.DSUB:
              case ByteCode.IF_ACMPEQ:
              case ByteCode.IF_ACMPNE:
              case ByteCode.IF_ICMPEQ:
              case ByteCode.IF_ICMPGE:
              case ByteCode.IF_ICMPGT:
              case ByteCode.IF_ICMPLE:
              case ByteCode.IF_ICMPLT:
              case ByteCode.IF_ICMPNE:
              case ByteCode.LADD:
              case ByteCode.LAND:
              case ByteCode.LDIV:
              case ByteCode.LMUL:
              case ByteCode.LOR:
              case ByteCode.LREM:
              case ByteCode.LRETURN:
              case ByteCode.LSTORE:
              case ByteCode.LSTORE_0:
              case ByteCode.LSTORE_1:
              case ByteCode.LSTORE_2:
              case ByteCode.LSTORE_3:
              case ByteCode.LSUB:
              case ByteCode.LXOR:
              case ByteCode.POP2:
                  return -2;
  
              case ByteCode.AALOAD:
              case ByteCode.ARETURN:
              case ByteCode.ASTORE:
              case ByteCode.ASTORE_0:
              case ByteCode.ASTORE_1:
              case ByteCode.ASTORE_2:
              case ByteCode.ASTORE_3:
              case ByteCode.ATHROW:
              case ByteCode.BALOAD:
              case ByteCode.CALOAD:
              case ByteCode.D2F:
              case ByteCode.D2I:
              case ByteCode.FADD:
              case ByteCode.FALOAD:
              case ByteCode.FCMPG:
              case ByteCode.FCMPL:
              case ByteCode.FDIV:
              case ByteCode.FMUL:
              case ByteCode.FREM:
              case ByteCode.FRETURN:
              case ByteCode.FSTORE:
              case ByteCode.FSTORE_0:
              case ByteCode.FSTORE_1:
              case ByteCode.FSTORE_2:
              case ByteCode.FSTORE_3:
              case ByteCode.FSUB:
              case ByteCode.GETFIELD:
              case ByteCode.IADD:
              case ByteCode.IALOAD:
              case ByteCode.IAND:
              case ByteCode.IDIV:
              case ByteCode.IFEQ:
              case ByteCode.IFGE:
              case ByteCode.IFGT:
              case ByteCode.IFLE:
              case ByteCode.IFLT:
              case ByteCode.IFNE:
              case ByteCode.IFNONNULL:
              case ByteCode.IFNULL:
              case ByteCode.IMUL:
              case ByteCode.INVOKEINTERFACE:       //
              case ByteCode.INVOKESPECIAL:         // but needs to account for
              case ByteCode.INVOKEVIRTUAL:         // pops 'this' (unless static)
              case ByteCode.IOR:
              case ByteCode.IREM:
              case ByteCode.IRETURN:
              case ByteCode.ISHL:
              case ByteCode.ISHR:
              case ByteCode.ISTORE:
              case ByteCode.ISTORE_0:
              case ByteCode.ISTORE_1:
              case ByteCode.ISTORE_2:
              case ByteCode.ISTORE_3:
              case ByteCode.ISUB:
              case ByteCode.IUSHR:
              case ByteCode.IXOR:
              case ByteCode.L2F:
              case ByteCode.L2I:
              case ByteCode.LOOKUPSWITCH:
              case ByteCode.LSHL:
              case ByteCode.LSHR:
              case ByteCode.LUSHR:
              case ByteCode.MONITORENTER:
              case ByteCode.MONITOREXIT:
              case ByteCode.POP:
              case ByteCode.PUTFIELD:
              case ByteCode.SALOAD:
              case ByteCode.TABLESWITCH:
                  return -1;
  
              case ByteCode.ANEWARRAY:
              case ByteCode.ARRAYLENGTH:
              case ByteCode.BREAKPOINT:
              case ByteCode.CHECKCAST:
              case ByteCode.D2L:
              case ByteCode.DALOAD:
              case ByteCode.DNEG:
              case ByteCode.F2I:
              case ByteCode.FNEG:
              case ByteCode.GETSTATIC:
              case ByteCode.GOTO:
              case ByteCode.GOTO_W:
              case ByteCode.I2B:
              case ByteCode.I2C:
              case ByteCode.I2F:
              case ByteCode.I2S:
              case ByteCode.IINC:
              case ByteCode.IMPDEP1:
              case ByteCode.IMPDEP2:
              case ByteCode.INEG:
              case ByteCode.INSTANCEOF:
              case ByteCode.INVOKESTATIC:
              case ByteCode.INVOKEDYNAMIC:
              case ByteCode.L2D:
              case ByteCode.LALOAD:
              case ByteCode.LNEG:
              case ByteCode.NEWARRAY:
              case ByteCode.NOP:
              case ByteCode.PUTSTATIC:
              case ByteCode.RET:
              case ByteCode.RETURN:
              case ByteCode.SWAP:
              case ByteCode.WIDE:
                  return 0;
  
              case ByteCode.ACONST_NULL:
              case ByteCode.ALOAD:
              case ByteCode.ALOAD_0:
              case ByteCode.ALOAD_1:
              case ByteCode.ALOAD_2:
              case ByteCode.ALOAD_3:
              case ByteCode.BIPUSH:
              case ByteCode.DUP:
              case ByteCode.DUP_X1:
              case ByteCode.DUP_X2:
              case ByteCode.F2D:
              case ByteCode.F2L:
              case ByteCode.FCONST_0:
              case ByteCode.FCONST_1:
              case ByteCode.FCONST_2:
              case ByteCode.FLOAD:
              case ByteCode.FLOAD_0:
              case ByteCode.FLOAD_1:
              case ByteCode.FLOAD_2:
              case ByteCode.FLOAD_3:
              case ByteCode.I2D:
              case ByteCode.I2L:
              case ByteCode.ICONST_0:
              case ByteCode.ICONST_1:
              case ByteCode.ICONST_2:
              case ByteCode.ICONST_3:
              case ByteCode.ICONST_4:
              case ByteCode.ICONST_5:
              case ByteCode.ICONST_M1:
              case ByteCode.ILOAD:
              case ByteCode.ILOAD_0:
              case ByteCode.ILOAD_1:
              case ByteCode.ILOAD_2:
              case ByteCode.ILOAD_3:
              case ByteCode.JSR:
              case ByteCode.JSR_W:
              case ByteCode.LDC:
              case ByteCode.LDC_W:
              case ByteCode.MULTIANEWARRAY:
              case ByteCode.NEW:
              case ByteCode.SIPUSH:
                  return 1;
  
              case ByteCode.DCONST_0:
              case ByteCode.DCONST_1:
              case ByteCode.DLOAD:
              case ByteCode.DLOAD_0:
              case ByteCode.DLOAD_1:
              case ByteCode.DLOAD_2:
              case ByteCode.DLOAD_3:
              case ByteCode.DUP2:
              case ByteCode.DUP2_X1:
              case ByteCode.DUP2_X2:
              case ByteCode.LCONST_0:
              case ByteCode.LCONST_1:
              case ByteCode.LDC2_W:
              case ByteCode.LLOAD:
              case ByteCode.LLOAD_0:
              case ByteCode.LLOAD_1:
              case ByteCode.LLOAD_2:
              case ByteCode.LLOAD_3:
                  return 2;
          }
          throw new IllegalArgumentException("Bad opcode: " + opcode);
      }