--- src/ufuncs.c.orig	2022-12-12 08:21:17 UTC
+++ src/ufuncs.c
@@ -132,7 +132,7 @@ static void* is_ccw_data[1] = {GEOSGeom_isCCW_r};
 
 typedef char FuncGEOS_Y_b(void* context, void* a);
 static char Y_b_dtypes[2] = {NPY_OBJECT, NPY_BOOL};
-static void Y_b_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void Y_b_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   FuncGEOS_Y_b* func = (FuncGEOS_Y_b*)data;
   GEOSGeometry* in1 = NULL;
   char ret;
@@ -189,7 +189,7 @@ static char IsValidInput(void* context, PyObject* obj)
 static void* is_valid_input_data[1] = {IsValidInput};
 typedef char FuncGEOS_O_b(void* context, PyObject* obj);
 static char O_b_dtypes[2] = {NPY_OBJECT, NPY_BOOL};
-static void O_b_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void O_b_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   FuncGEOS_O_b* func = (FuncGEOS_O_b*)data;
   GEOS_INIT_THREADS;
   UNARY_LOOP { *(npy_bool*)op1 = func(ctx, *(PyObject**)ip1); }
@@ -201,7 +201,7 @@ static PyUFuncGenericFunction O_b_funcs[1] = {&O_b_fun
 static void* equals_data[1] = {GEOSEquals_r};
 typedef char FuncGEOS_YY_b(void* context, void* a, void* b);
 static char YY_b_dtypes[3] = {NPY_OBJECT, NPY_OBJECT, NPY_BOOL};
-static void YY_b_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void YY_b_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   FuncGEOS_YY_b* func = (FuncGEOS_YY_b*)data;
   GEOSGeometry *in1 = NULL, *in2 = NULL;
   char ret;
@@ -273,7 +273,7 @@ static void* touches_data[1] = {touches_func_tuple};
 static void* within_func_tuple[2] = {GEOSWithin_r, GEOSPreparedWithin_r};
 static void* within_data[1] = {within_func_tuple};
 static char YY_b_p_dtypes[3] = {NPY_OBJECT, NPY_OBJECT, NPY_BOOL};
-static void YY_b_p_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void YY_b_p_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   FuncGEOS_YY_b* func = ((FuncGEOS_YY_b**)data)[0];
   FuncGEOS_YY_b* func_prepared = ((FuncGEOS_YY_b**)data)[1];
 
@@ -320,7 +320,7 @@ finish:
 static PyUFuncGenericFunction YY_b_p_funcs[1] = {&YY_b_p_func};
 
 static char is_prepared_dtypes[2] = {NPY_OBJECT, NPY_BOOL};
-static void is_prepared_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void is_prepared_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                              void* data) {
   GEOSGeometry* in1 = NULL;
   GEOSPreparedGeometry* in1_prepared = NULL;
@@ -411,7 +411,7 @@ static void* oriented_envelope_data[1] = {GEOSMinimumR
 #endif
 typedef void* FuncGEOS_Y_Y(void* context, void* a);
 static char Y_Y_dtypes[2] = {NPY_OBJECT, NPY_OBJECT};
-static void Y_Y_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void Y_Y_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   FuncGEOS_Y_Y* func = (FuncGEOS_Y_Y*)data;
   GEOSGeometry* in1 = NULL;
   GEOSGeometry** geom_arr;
@@ -479,7 +479,7 @@ static void* prepare_data[1] = {PrepareGeometryObject}
 static void* destroy_prepared_data[1] = {DestroyPreparedGeometryObject};
 typedef char FuncPyGEOS_Y(void* ctx, GeometryObject* geom);
 static char Y_dtypes[1] = {NPY_OBJECT};
-static void Y_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void Y_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   FuncPyGEOS_Y* func = (FuncPyGEOS_Y*)data;
   GEOSGeometry* in1 = NULL;
   GeometryObject* geom_obj = NULL;
@@ -546,7 +546,7 @@ static void* segmentize_data[1] = {GEOSDensify_r};
 
 typedef void* FuncGEOS_Yd_Y(void* context, void* a, double b);
 static char Yd_Y_dtypes[3] = {NPY_OBJECT, NPY_DOUBLE, NPY_OBJECT};
-static void Yd_Y_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void Yd_Y_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   FuncGEOS_Yd_Y* func = (FuncGEOS_Yd_Y*)data;
   GEOSGeometry* in1 = NULL;
   GEOSGeometry** geom_arr;
@@ -681,7 +681,7 @@ static void* GEOSSetSRID_r_with_clone(void* context, v
 static void* set_srid_data[1] = {GEOSSetSRID_r_with_clone};
 typedef void* FuncGEOS_Yi_Y(void* context, void* a, int b);
 static char Yi_Y_dtypes[3] = {NPY_OBJECT, NPY_INT, NPY_OBJECT};
-static void Yi_Y_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void Yi_Y_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   FuncGEOS_Yi_Y* func = (FuncGEOS_Yi_Y*)data;
   GEOSGeometry* in1 = NULL;
   GEOSGeometry** geom_arr;
@@ -817,7 +817,7 @@ static void YY_Y_func_reduce(char** args, npy_intp* di
   }
 }
 
-static void YY_Y_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void YY_Y_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   // A reduce is characterized by multiple iterations (dimension[0] > 1) that
   // are output on the same place in memory (steps[2] == 0).
   if ((steps[2] == 0) && (dimensions[0] > 1)) {
@@ -952,7 +952,7 @@ static void* minimum_bounding_radius_data[1] = {GEOSMi
 #endif
 typedef int FuncGEOS_Y_d(void* context, void* a, double* b);
 static char Y_d_dtypes[2] = {NPY_OBJECT, NPY_DOUBLE};
-static void Y_d_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void Y_d_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   FuncGEOS_Y_d* func = (FuncGEOS_Y_d*)data;
   GEOSGeometry* in1 = NULL;
 
@@ -1029,7 +1029,7 @@ static void* get_num_coordinates_data[1] = {get_num_co
 
 typedef int FuncGEOS_Y_i(void* context, void* a);
 static char Y_i_dtypes[2] = {NPY_OBJECT, NPY_INT};
-static void Y_i_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void Y_i_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   FuncGEOS_Y_i* func = ((FuncGEOS_Y_i**)data)[0];
   int errcode = (int)((int**)data)[1];
   int none_value = (int)((int**)data)[2];
@@ -1119,7 +1119,7 @@ static int GEOSProjectNormalizedWrapped_r(void* contex
 static void* line_locate_point_normalized_data[1] = {GEOSProjectNormalizedWrapped_r};
 typedef int FuncGEOS_YY_d(void* context, void* a, void* b, double* c);
 static char YY_d_dtypes[3] = {NPY_OBJECT, NPY_OBJECT, NPY_DOUBLE};
-static void YY_d_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void YY_d_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   FuncGEOS_YY_d* func = (FuncGEOS_YY_d*)data;
   GEOSGeometry *in1 = NULL, *in2 = NULL;
 
@@ -1165,7 +1165,7 @@ static void* frechet_distance_densify_data[1] = {GEOSF
 #endif
 typedef int FuncGEOS_YYd_d(void* context, void* a, void* b, double c, double* d);
 static char YYd_d_dtypes[4] = {NPY_OBJECT, NPY_OBJECT, NPY_DOUBLE, NPY_DOUBLE};
-static void YYd_d_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void YYd_d_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   FuncGEOS_YYd_d* func = (FuncGEOS_YYd_d*)data;
   GEOSGeometry *in1 = NULL, *in2 = NULL;
 
@@ -1209,7 +1209,7 @@ static void* union_prec_data[1] = {GEOSUnionPrec_r};
 typedef void* FuncGEOS_YYd_Y(void* context, void* a, void* b, double c);
 static char YYd_Y_dtypes[4] = {NPY_OBJECT, NPY_OBJECT, NPY_DOUBLE, NPY_OBJECT};
 
-static void YYd_Y_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void YYd_Y_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   FuncGEOS_YYd_Y* func = (FuncGEOS_YYd_Y*)data;
   GEOSGeometry *in1 = NULL, *in2 = NULL;
   GEOSGeometry** geom_arr;
@@ -1256,7 +1256,7 @@ static PyUFuncGenericFunction YYd_Y_funcs[1] = {&YYd_Y
 /* Define functions with unique call signatures */
 static char box_dtypes[6] = {NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE,
                              NPY_DOUBLE, NPY_BOOL,   NPY_OBJECT};
-static void box_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void box_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   char *ip1 = args[0], *ip2 = args[1], *ip3 = args[2], *ip4 = args[3], *ip5 = args[4];
   npy_intp is1 = steps[0], is2 = steps[1], is3 = steps[2], is4 = steps[3], is5 = steps[4];
   npy_intp n = dimensions[0];
@@ -1321,7 +1321,7 @@ static char buffer_inner(void* ctx, GEOSBufferParams* 
 
 static char buffer_dtypes[8] = {NPY_OBJECT, NPY_DOUBLE, NPY_INT,  NPY_INT,
                                 NPY_INT,    NPY_DOUBLE, NPY_BOOL, NPY_OBJECT};
-static void buffer_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void buffer_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   char *ip1 = args[0], *ip2 = args[1], *ip3 = args[2], *ip4 = args[3], *ip5 = args[4],
        *ip6 = args[5], *ip7 = args[6];
   npy_intp is1 = steps[0], is2 = steps[1], is3 = steps[2], is4 = steps[3], is5 = steps[4],
@@ -1390,7 +1390,7 @@ static PyUFuncGenericFunction buffer_funcs[1] = {&buff
 
 static char offset_curve_dtypes[6] = {NPY_OBJECT, NPY_DOUBLE, NPY_INT,
                                       NPY_INT,    NPY_DOUBLE, NPY_OBJECT};
-static void offset_curve_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void offset_curve_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                               void* data) {
   char *ip1 = args[0], *ip2 = args[1], *ip3 = args[2], *ip4 = args[3], *ip5 = args[4];
   npy_intp is1 = steps[0], is2 = steps[1], is3 = steps[2], is4 = steps[3], is5 = steps[4];
@@ -1451,7 +1451,7 @@ static void offset_curve_func(char** args, npy_intp* d
 static PyUFuncGenericFunction offset_curve_funcs[1] = {&offset_curve_func};
 
 static char snap_dtypes[4] = {NPY_OBJECT, NPY_OBJECT, NPY_DOUBLE, NPY_OBJECT};
-static void snap_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void snap_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   GEOSGeometry *in1 = NULL, *in2 = NULL;
   GEOSGeometry** geom_arr;
 
@@ -1497,7 +1497,7 @@ static PyUFuncGenericFunction snap_funcs[1] = {&snap_f
 
 static char clip_by_rect_dtypes[6] = {NPY_OBJECT, NPY_DOUBLE, NPY_DOUBLE,
                                       NPY_DOUBLE, NPY_DOUBLE, NPY_OBJECT};
-static void clip_by_rect_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void clip_by_rect_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                               void* data) {
   char *ip1 = args[0], *ip2 = args[1], *ip3 = args[2], *ip4 = args[3], *ip5 = args[4];
   npy_intp is1 = steps[0], is2 = steps[1], is3 = steps[2], is4 = steps[3], is5 = steps[4];
@@ -1557,7 +1557,7 @@ static void clip_by_rect_func(char** args, npy_intp* d
 static PyUFuncGenericFunction clip_by_rect_funcs[1] = {&clip_by_rect_func};
 
 static char equals_exact_dtypes[4] = {NPY_OBJECT, NPY_OBJECT, NPY_DOUBLE, NPY_BOOL};
-static void equals_exact_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void equals_exact_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                               void* data) {
   GEOSGeometry *in1 = NULL, *in2 = NULL;
   double in3;
@@ -1597,7 +1597,7 @@ static PyUFuncGenericFunction equals_exact_funcs[1] = 
 #if GEOS_SINCE_3_10_0
 
 static char dwithin_dtypes[4] = {NPY_OBJECT, NPY_OBJECT, NPY_DOUBLE, NPY_BOOL};
-static void dwithin_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void dwithin_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   GEOSGeometry *in1 = NULL, *in2 = NULL;
   GEOSPreparedGeometry* in1_prepared = NULL;
   double in3;
@@ -1645,7 +1645,7 @@ static PyUFuncGenericFunction dwithin_funcs[1] = {&dwi
 #endif  // GEOS_SINCE_3_10_0
 
 static char delaunay_triangles_dtypes[4] = {NPY_OBJECT, NPY_DOUBLE, NPY_BOOL, NPY_OBJECT};
-static void delaunay_triangles_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void delaunay_triangles_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                                     void* data) {
   GEOSGeometry* in1 = NULL;
   GEOSGeometry** geom_arr;
@@ -1692,7 +1692,7 @@ static PyUFuncGenericFunction delaunay_triangles_funcs
 
 static char voronoi_polygons_dtypes[5] = {NPY_OBJECT, NPY_DOUBLE, NPY_OBJECT, NPY_BOOL,
                                           NPY_OBJECT};
-static void voronoi_polygons_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void voronoi_polygons_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                                   void* data) {
   GEOSGeometry *in1 = NULL, *in3 = NULL;
   GEOSGeometry** geom_arr;
@@ -1739,7 +1739,7 @@ static void voronoi_polygons_func(char** args, npy_int
 static PyUFuncGenericFunction voronoi_polygons_funcs[1] = {&voronoi_polygons_func};
 
 static char is_valid_reason_dtypes[2] = {NPY_OBJECT, NPY_OBJECT};
-static void is_valid_reason_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void is_valid_reason_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                                  void* data) {
   char* reason;
   GEOSGeometry* in1 = NULL;
@@ -1777,7 +1777,7 @@ finish:
 static PyUFuncGenericFunction is_valid_reason_funcs[1] = {&is_valid_reason_func};
 
 static char relate_dtypes[3] = {NPY_OBJECT, NPY_OBJECT, NPY_OBJECT};
-static void relate_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void relate_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   char* pattern;
   GEOSGeometry *in1 = NULL, *in2 = NULL;
 
@@ -1818,7 +1818,7 @@ finish:
 static PyUFuncGenericFunction relate_funcs[1] = {&relate_func};
 
 static char relate_pattern_dtypes[4] = {NPY_OBJECT, NPY_OBJECT, NPY_OBJECT, NPY_BOOL};
-static void relate_pattern_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void relate_pattern_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                                 void* data) {
   GEOSGeometry *in1 = NULL, *in2 = NULL;
   const char* pattern = NULL;
@@ -1878,7 +1878,7 @@ finish:
 static PyUFuncGenericFunction relate_pattern_funcs[1] = {&relate_pattern_func};
 
 static char polygonize_dtypes[2] = {NPY_OBJECT, NPY_OBJECT};
-static void polygonize_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void polygonize_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                             void* data) {
   GEOSGeometry* geom = NULL;
   unsigned int n_geoms;
@@ -1923,7 +1923,7 @@ static PyUFuncGenericFunction polygonize_funcs[1] = {&
 
 static char polygonize_full_dtypes[5] = {NPY_OBJECT, NPY_OBJECT, NPY_OBJECT, NPY_OBJECT,
                                          NPY_OBJECT};
-static void polygonize_full_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void polygonize_full_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                                  void* data) {
   GEOSGeometry* geom = NULL;
   GEOSGeometry* geom_copy = NULL;
@@ -1999,7 +1999,7 @@ finish:
 static PyUFuncGenericFunction polygonize_full_funcs[1] = {&polygonize_full_func};
 
 static char shortest_line_dtypes[3] = {NPY_OBJECT, NPY_OBJECT, NPY_OBJECT};
-static void shortest_line_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void shortest_line_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                                void* data) {
   GEOSGeometry* in1 = NULL;
   GEOSGeometry* in2 = NULL;
@@ -2072,7 +2072,7 @@ static PyUFuncGenericFunction shortest_line_funcs[1] =
 
 #if GEOS_SINCE_3_6_0
 static char set_precision_dtypes[4] = {NPY_OBJECT, NPY_DOUBLE, NPY_INT, NPY_OBJECT};
-static void set_precision_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void set_precision_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                                void* data) {
   GEOSGeometry* in1 = NULL;
   GEOSGeometry** geom_arr;
@@ -2140,7 +2140,7 @@ static PyUFuncGenericFunction set_precision_funcs[1] =
 
 /* define double -> geometry construction functions */
 static char points_dtypes[2] = {NPY_DOUBLE, NPY_OBJECT};
-static void points_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void points_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   GEOSCoordSequence* coord_seq = NULL;
   GEOSGeometry** geom_arr;
 
@@ -2194,7 +2194,7 @@ finish:
 static PyUFuncGenericFunction points_funcs[1] = {&points_func};
 
 static char linestrings_dtypes[2] = {NPY_DOUBLE, NPY_OBJECT};
-static void linestrings_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void linestrings_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                              void* data) {
   GEOSCoordSequence* coord_seq = NULL;
   GEOSGeometry** geom_arr;
@@ -2234,7 +2234,7 @@ finish:
 static PyUFuncGenericFunction linestrings_funcs[1] = {&linestrings_func};
 
 static char linearrings_dtypes[2] = {NPY_DOUBLE, NPY_OBJECT};
-static void linearrings_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void linearrings_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                              void* data) {
   GEOSCoordSequence* coord_seq = NULL;
   GEOSGeometry** geom_arr;
@@ -2298,7 +2298,7 @@ finish:
 static PyUFuncGenericFunction linearrings_funcs[1] = {&linearrings_func};
 
 static char polygons_dtypes[3] = {NPY_OBJECT, NPY_OBJECT, NPY_OBJECT};
-static void polygons_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void polygons_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                           void* data) {
   GEOSGeometry *hole, *shell, *hole_copy, *shell_copy;
   GEOSGeometry **holes, **geom_arr;
@@ -2410,7 +2410,7 @@ finish:
 static PyUFuncGenericFunction polygons_funcs[1] = {&polygons_func};
 
 static char create_collection_dtypes[3] = {NPY_OBJECT, NPY_INT, NPY_OBJECT};
-static void create_collection_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void create_collection_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                                    void* data) {
   GEOSGeometry *g, *g_copy;
   int n_geoms, type, actual_type, expected_type, alt_expected_type;
@@ -2513,7 +2513,7 @@ finish:
 static PyUFuncGenericFunction create_collection_funcs[1] = {&create_collection_func};
 
 static char bounds_dtypes[2] = {NPY_OBJECT, NPY_DOUBLE};
-static void bounds_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void bounds_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   GEOSGeometry *envelope = NULL, *in1;
   const GEOSGeometry* ring;
   const GEOSCoordSequence* coord_seq;
@@ -2609,7 +2609,7 @@ static PyUFuncGenericFunction bounds_funcs[1] = {&boun
 /* Define the object -> geom functions (O_Y) */
 
 static char from_wkb_dtypes[3] = {NPY_OBJECT, NPY_UINT8, NPY_OBJECT};
-static void from_wkb_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void from_wkb_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                           void* data) {
   char *ip1 = args[0], *ip2 = args[1], *op1 = args[2];
   npy_intp is1 = steps[0], is2 = steps[1], os1 = steps[2];
@@ -2700,7 +2700,7 @@ finish:
 static PyUFuncGenericFunction from_wkb_funcs[1] = {&from_wkb_func};
 
 static char from_wkt_dtypes[3] = {NPY_OBJECT, NPY_UINT8, NPY_OBJECT};
-static void from_wkt_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void from_wkt_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                           void* data) {
   char *ip1 = args[0], *ip2 = args[1], *op1 = args[2];
   npy_intp is1 = steps[0], is2 = steps[1], os1 = steps[2];
@@ -2777,7 +2777,7 @@ finish:
 static PyUFuncGenericFunction from_wkt_funcs[1] = {&from_wkt_func};
 
 static char from_shapely_dtypes[2] = {NPY_OBJECT, NPY_OBJECT};
-static void from_shapely_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void from_shapely_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                               void* data) {
   GEOSGeometry *in_ptr, *ret_ptr;
   PyObject *in1, *attr;
@@ -2832,7 +2832,7 @@ static PyUFuncGenericFunction from_shapely_funcs[1] = 
 
 static char to_wkb_dtypes[6] = {NPY_OBJECT, NPY_BOOL, NPY_INT,
                                 NPY_INT,    NPY_BOOL, NPY_OBJECT};
-static void to_wkb_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void to_wkb_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   char *ip1 = args[0], *ip2 = args[1], *ip3 = args[2], *ip4 = args[3], *ip5 = args[4],
        *op1 = args[5];
   npy_intp is1 = steps[0], is2 = steps[1], is3 = steps[2], is4 = steps[3], is5 = steps[4],
@@ -2937,7 +2937,7 @@ static PyUFuncGenericFunction to_wkb_funcs[1] = {&to_w
 
 static char to_wkt_dtypes[6] = {NPY_OBJECT, NPY_INT,  NPY_BOOL,
                                 NPY_INT,    NPY_BOOL, NPY_OBJECT};
-static void to_wkt_func(char** args, npy_intp* dimensions, npy_intp* steps, void* data) {
+static void to_wkt_func(char** args, const npy_intp* dimensions, const npy_intp* steps, void* data) {
   char *ip1 = args[0], *ip2 = args[1], *ip3 = args[2], *ip4 = args[3], *ip5 = args[4],
        *op1 = args[5];
   npy_intp is1 = steps[0], is2 = steps[1], is3 = steps[2], is4 = steps[3], is5 = steps[4],
@@ -3022,7 +3022,7 @@ static PyUFuncGenericFunction to_wkt_funcs[1] = {&to_w
 #if GEOS_SINCE_3_10_0
 
 static char from_geojson_dtypes[3] = {NPY_OBJECT, NPY_UINT8, NPY_OBJECT};
-static void from_geojson_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void from_geojson_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                               void* data) {
   char *ip1 = args[0], *ip2 = args[1], *op1 = args[2];
   npy_intp is1 = steps[0], is2 = steps[1], os1 = steps[2];
@@ -3100,7 +3100,7 @@ finish:
 static PyUFuncGenericFunction from_geojson_funcs[1] = {&from_geojson_func};
 
 static char to_geojson_dtypes[3] = {NPY_OBJECT, NPY_INT, NPY_OBJECT};
-static void to_geojson_func(char** args, npy_intp* dimensions, npy_intp* steps,
+static void to_geojson_func(char** args, const npy_intp* dimensions, const npy_intp* steps,
                             void* data) {
   char *ip1 = args[0], *ip2 = args[1], *op1 = args[2];
   npy_intp is1 = steps[0], is2 = steps[1], os1 = steps[2];
