[Ada] Strengthen Locked flag
authorBob Duff <duff@adacore.com>
Wed, 14 Aug 2019 09:52:06 +0000 (09:52 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 14 Aug 2019 09:52:06 +0000 (09:52 +0000)
This patch strengthens the Locked flag, by Asserting that it is False on
operations that might cause reallocation.

No change in behavior (except in the presence of compiler bugs), so no
test.

2019-08-14  Bob Duff  <duff@adacore.com>

gcc/ada/

* table.adb: Assert that the table is not locked when increasing
Last, even if it doesn't cause reallocation.  In other words,
assert that on operations that MIGHT cause reallocation.
* table.ads: Fix comment accordingly.

From-SVN: r274463

gcc/ada/ChangeLog
gcc/ada/table.adb
gcc/ada/table.ads

index b7bacdcd0aded9840ab35e144198d07f640b6257..7c09cc0c32f067341e7b7056e001334813d3985d 100644 (file)
@@ -1,3 +1,10 @@
+2019-08-14  Bob Duff  <duff@adacore.com>
+
+       * table.adb: Assert that the table is not locked when increasing
+       Last, even if it doesn't cause reallocation.  In other words,
+       assert that on operations that MIGHT cause reallocation.
+       * table.ads: Fix comment accordingly.
+
 2019-08-14  Arnaud Charlet  <charlet@adacore.com>
 
        * doc/gnat_ugn/gnat_and_program_execution.rst: Remove
index ebbb8574da3d8780b8ce2d5bbc115f13e6d49e17..97940475bf109adc9f775ec778f36b410d25d07d 100644 (file)
@@ -80,6 +80,7 @@ package body Table is
 
       procedure Append (New_Val : Table_Component_Type) is
       begin
+         pragma Assert (not Locked);
          Set_Item (Table_Index_Type (Last_Val + 1), New_Val);
       end Append;
 
@@ -120,6 +121,7 @@ package body Table is
 
       procedure Increment_Last is
       begin
+         pragma Assert (not Locked);
          Last_Val := Last_Val + 1;
 
          if Last_Val > Max then
@@ -384,6 +386,8 @@ package body Table is
 
       procedure Set_Last (New_Val : Table_Index_Type) is
       begin
+         pragma Assert (Int (New_Val) <= Last_Val or else not Locked);
+
          if Int (New_Val) < Last_Val then
             Last_Val := Int (New_Val);
 
index a816c738430787fdbb8c69a9bf279bbf6c63508e..5f03cf3ca1939157610775a6451be0b1e22f3cc1 100644 (file)
@@ -130,14 +130,15 @@ package Table is
       --  First .. Last.
 
       Locked : Boolean := False;
-      --  Table expansion is permitted only if this switch is set to False. A
-      --  client may set Locked to True, in which case any attempt to expand
-      --  the table will cause an assertion failure. Note that while a table
-      --  is locked, its address in memory remains fixed and unchanging. This
-      --  feature is used to control table expansion during Gigi processing.
-      --  Gigi assumes that tables other than the Uint and Ureal tables do
-      --  not move during processing, which means that they cannot be expanded.
-      --  The Locked flag is used to enforce this restriction.
+      --  Increasing the value of Last is permitted only if this switch is set
+      --  to False. A client may set Locked to True, in which case any attempt
+      --  to increase the value of Last (which might expand the table) will
+      --  cause an assertion failure. Note that while a table is locked, its
+      --  address in memory remains fixed and unchanging. This feature is used
+      --  to control table expansion during Gigi processing.  Gigi assumes that
+      --  tables other than the Uint and Ureal tables do not move during
+      --  processing, which means that they cannot be expanded.  The Locked
+      --  flag is used to enforce this restriction.
 
       procedure Init;
       --  This procedure allocates a new table of size Initial (freeing any