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;
|