@Override
  boolean handleReturn(Frame<BasicValue> frame, int opcode, boolean unsure) {
    Result subResult;
    if (interpreter.deReferenced) {
      subResult = Value.Top;
    } else {
      switch (opcode) {
        case ARETURN, IRETURN, LRETURN, FRETURN, DRETURN -> {
          BasicValue value = frame.pop();
          if (!(value instanceof NthParamValue) && value != NullValue && value != TrueValue && value != FalseValue ||
              myReturnValue != null && !myReturnValue.equals(value)) {
            myHasNonTrivialReturn = true;
          }
          else {
            myReturnValue = value;
          }
          subResult = Value.Top;
        }
        case RETURN -> subResult = Value.Top;
        case ATHROW -> subResult = Value.Fail;
        default -> {
          return false;
        }
      }
    }
    internalResult = resultUtil.join(internalResult, subResult);
    unsureOnly &= unsure;
    if (!unsure && internalResult == Value.Top && myHasNonTrivialReturn) {
      earlyResult = internalResult;
    }
    return true;
  }
@Override
  boolean handleReturn(Frame<BasicValue> frame, int opcode, boolean unsure)