File: componenterrors.adb

package info (click to toggle)
spark 2012.0.deb-9
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 29,260 kB
  • ctags: 3,098
  • sloc: ada: 186,243; cpp: 13,497; makefile: 685; yacc: 440; lex: 176; ansic: 119; sh: 16
file content (134 lines) | stat: -rw-r--r-- 6,071 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
-------------------------------------------------------------------------------
-- (C) Altran Praxis Limited
-------------------------------------------------------------------------------
--
-- The SPARK toolset is free software; you can redistribute it and/or modify it
-- under terms of the GNU General Public License as published by the Free
-- Software Foundation; either version 3, or (at your option) any later
-- version. The SPARK toolset is distributed in the hope that it will be
-- useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-- Public License for more details. You should have received a copy of the GNU
-- General Public License distributed with the SPARK toolset; see file
-- COPYING3. If not, go to http://www.gnu.org/licenses for a complete copy of
-- the license.
--
--=============================================================================

with SystemErrors, Statistics;

package body ComponentErrors is

   procedure Initialise (TheErrorHeap : out HeapOfErrors) is
   begin
      --# accept F, 32, TheErrorHeap.ListOfComponentErrors, "Initialization partial but effective" &
      --#        F, 31, TheErrorHeap.ListOfComponentErrors, "Initialization partial but effective" &
      --#        F, 602, TheErrorHeap, TheErrorHeap.ListOfComponentErrors, "Initialization partial but effective";
      TheErrorHeap.HighMark          := NullComponentError;
      TheErrorHeap.NextFreeComponent := NullComponentError;
   end Initialise;

   procedure CreateError
     (TheErrorHeap : in out HeapOfErrors;
      HeapSeq      : in out Heap.HeapRecord;
      ErrClass     : in     ErrorClass;
      ErrVal       : in     Natural;
      Position     : in     LexTokenManager.Token_Position;
      Sym          : in     Dictionary.Symbol;
      NewError     :    out ComponentError)
   is
      NewErrorLocal : ComponentError;
      NodeList      : SeqAlgebra.Seq;
   begin
      if TheErrorHeap.NextFreeComponent /= NullComponentError then
         -- returned locations are re-usable
         NewErrorLocal                  := TheErrorHeap.NextFreeComponent;
         TheErrorHeap.NextFreeComponent := TheErrorHeap.ListOfComponentErrors (NewErrorLocal).NextError;

      elsif TheErrorHeap.HighMark < MaxNumComponentErrors then
         -- return list empty but unused cells remain in array
         TheErrorHeap.HighMark := TheErrorHeap.HighMark + 1;
         NewErrorLocal         := TheErrorHeap.HighMark;
      else
         --returned list empty and array used up, nothing left
         Statistics.SetTableUsage (Statistics.RecordErrors, MaxNumComponentErrors);
         SystemErrors.Fatal_Error (Sys_Err => SystemErrors.Component_Error_Overflow,
                                   Msg     => "");
         NewErrorLocal := NullComponentError; -- strictly unnecessary since prev lines doesn't return
      end if;

      -- if we get here we have a new, valid index into the array (which may point at garbage)
      SeqAlgebra.CreateSeq (HeapSeq, NodeList);
      TheErrorHeap.ListOfComponentErrors (NewErrorLocal) :=
        ErrorDescriptor'
        (ErrClass                 => ErrClass,
         ErrVal                   => ErrVal,
         Position                 => Position,
         Sym                      => Sym,
         AssociatedComponentNodes => NodeList,
         NextError                => NullComponentError);

      NewError := NewErrorLocal;
   end CreateError;

   procedure DisposeOfError (TheErrorHeap : in out HeapOfErrors;
                             HeapSeq      : in out Heap.HeapRecord;
                             OldError     : in     ComponentError) is
   begin
      SeqAlgebra.DisposeOfSeq (HeapSeq, TheErrorHeap.ListOfComponentErrors (OldError).AssociatedComponentNodes);
      TheErrorHeap.ListOfComponentErrors (OldError).NextError := TheErrorHeap.NextFreeComponent;
      TheErrorHeap.NextFreeComponent                          := OldError;
   end DisposeOfError;

   function IsSameError
     (TheErrorHeap : HeapOfErrors;
      Error1       : ComponentError;
      Error2       : ComponentError)
     return         Boolean
   is
      FirstError, SecondError : ErrorDescriptor;
   begin
      FirstError  := TheErrorHeap.ListOfComponentErrors (Error1);
      SecondError := TheErrorHeap.ListOfComponentErrors (Error2);
      return FirstError.ErrClass = SecondError.ErrClass
        and then FirstError.ErrVal = SecondError.ErrVal
        and then FirstError.Position = SecondError.Position
        and then FirstError.Sym = SecondError.Sym;
   end IsSameError;

   function ClassOfError (TheErrorHeap : HeapOfErrors;
                          Error        : ComponentError) return ErrorClass is
   begin
      return TheErrorHeap.ListOfComponentErrors (Error).ErrClass;
   end ClassOfError;

   function ValueOfError (TheErrorHeap : HeapOfErrors;
                          Error        : ComponentError) return Natural is
   begin
      return TheErrorHeap.ListOfComponentErrors (Error).ErrVal;
   end ValueOfError;

   function PositionOfError (TheErrorHeap : HeapOfErrors;
                             Error        : ComponentError) return LexTokenManager.Token_Position is
   begin
      return TheErrorHeap.ListOfComponentErrors (Error).Position;
   end PositionOfError;

   function SymOfError (TheErrorHeap : HeapOfErrors;
                        Error        : ComponentError) return Dictionary.Symbol is
   begin
      return TheErrorHeap.ListOfComponentErrors (Error).Sym;
   end SymOfError;

   function AssociatedComponentNodesOfError (TheErrorHeap : HeapOfErrors;
                                             Error        : ComponentError) return SeqAlgebra.Seq is
   begin
      return TheErrorHeap.ListOfComponentErrors (Error).AssociatedComponentNodes;
   end AssociatedComponentNodesOfError;

   procedure ReportUsage (TheErrorHeap : in HeapOfErrors) is
   begin
      Statistics.SetTableUsage (Statistics.RecordErrors, TheErrorHeap.HighMark);
   end ReportUsage;

end ComponentErrors;