Use ada_value_subscript in valpy_getitem
authorTom Tromey <tromey@adacore.com>
Thu, 17 Aug 2023 16:37:06 +0000 (10:37 -0600)
committerTom Tromey <tromey@adacore.com>
Tue, 5 Sep 2023 17:02:34 +0000 (11:02 -0600)
Ada has a few complexities when it comes to array handling.  Currently
these are all handled in Ada-specific code -- but unfortunately that
means they aren't really accessible to Python.

This patch changes the Python code to defer to Ada when given an Ada
array.  In order to make this work, one spot in ada-lang.c had to be
updated to set the "GNAT-specific" flag on an array type.

The test case for this will come in a later patch.

gdb/ada-lang.c
gdb/python/py-value.c

index f6a623d79ed350ce7d97033bd82d9efc300d53bf..c0cc512bfa31e2c378823d723b31c146d0698877 100644 (file)
@@ -2141,6 +2141,7 @@ ada_type_of_array (struct value *arr, int bounds)
                                        longest_to_int (value_as_long (low)),
                                        longest_to_int (value_as_long (high)));
          elt_type = create_array_type (alloc, elt_type, range_type);
+         INIT_GNAT_SPECIFIC (elt_type);
 
          if (ada_is_unconstrained_packed_array_type (arr->type ()))
            {
index 069560742cfd227df9cff11e7247a64dec7826c2..e1178de89e99aa175bf156bc6db58f9a3f97cd1a 100644 (file)
@@ -28,6 +28,7 @@
 #include "expression.h"
 #include "cp-abi.h"
 #include "python.h"
+#include "ada-lang.h"
 
 #include "python-internal.h"
 
@@ -1096,6 +1097,8 @@ valpy_getitem (PyObject *self, PyObject *key)
              if (type->code () != TYPE_CODE_ARRAY
                  && type->code () != TYPE_CODE_PTR)
                  error (_("Cannot subscript requested type."));
+             else if (ADA_TYPE_P (type))
+               res_val = ada_value_subscript (tmp, 1, &idx);
              else
                res_val = value_subscript (tmp, value_as_long (idx));
            }