Skip to content

Commit ab16c81

Browse files
TurboGittonunaks
authored andcommitted
Fix handling of Long_Long_Integer when parsing Ada in ada2wsdl.
TN eng/toolchain/aws#51
1 parent 4b0453c commit ab16c81

File tree

1 file changed

+61
-62
lines changed

1 file changed

+61
-62
lines changed

tools/ada2wsdl-parser.adb

Lines changed: 61 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@ package body Ada2WSDL.Parser is
5151
use type SOAP.Types.Decimal;
5252
use type SOAP.Types.Unsigned_Long;
5353

54+
subtype Internal_Integer is Long_Long_Long_Integer;
55+
-- The type used for internal computation of range, value... So we can
56+
-- safely check range of Long_Integer or Long_Long_Integer on standard
57+
-- x86_64 Linux targets where those types are 64bits and Internal_Integer
58+
-- will be 128bits. For the later we special case the computation to avoid
59+
-- overflow, see in Type_Range_G.
60+
5461
package TxT renames Langkit_Support.Text;
5562

5663
function "+"
@@ -137,10 +144,6 @@ package body Ada2WSDL.Parser is
137144
(Characters.Handling.To_Lower (Unit_Name (Node)) = "ada.calendar");
138145
-- True if Node is declared into the Ada.Calendar package
139146

140-
function Is_SOAP_Type (Node : Ada_Node'Class) return Boolean is
141-
(Characters.Handling.To_Lower (Unit_Name (Node)) = "soap.types");
142-
-- True if Node is declared into AWS's SOAP.Types package
143-
144147
function Type_Definition
145148
(Node : Ada_Node;
146149
Name : String;
@@ -179,7 +182,7 @@ package body Ada2WSDL.Parser is
179182
-- Analyze an array component
180183

181184
procedure Array_Type_Suffix
182-
(Lower, Upper : Long_Long_Integer;
185+
(Lower, Upper : Internal_Integer;
183186
Type_Suffix : out Unbounded_String;
184187
Length : out Natural);
185188

@@ -251,20 +254,16 @@ package body Ada2WSDL.Parser is
251254
else "");
252255
Is_Std_LL : constant Boolean :=
253256
Node.Kind in Ada_Type_Decl
254-
and then
255-
((Is_Standard (Node)
256-
and then T_Name = "long_long_integer")
257-
or else
258-
(Is_SOAP_Type (Node)
259-
and then T_Name in "long" | "unsigned_long"));
257+
and then Is_Standard (Node)
258+
and then T_Name = "long_long_long_integer";
260259
begin
261260
Lower := Last;
262261
Upper := First;
263262

264263
if E /= No_Bin_Op and then E.Kind = Ada_Bin_Op then
265-
-- Do not try to compute range for Long_Long_Integer as this
266-
-- will overflow in Get_Range while computing last (2**64 -
267-
-- 1). Likewise for SOAP long and unsigned long.
264+
-- Do not try to compute range for Long_Long_Long_Integer as this
265+
-- will overflow in Get_Range while computing last (2**127 -
266+
-- 1).
268267

269268
if Is_Std_LL then
270269
Lower := First;
@@ -385,13 +384,13 @@ package body Ada2WSDL.Parser is
385384
-- Compute_Value --
386385
-------------------
387386

388-
function "**" (Left, Right : Long_Long_Integer) return Long_Long_Integer
387+
function "**" (Left, Right : Internal_Integer) return Internal_Integer
389388
is (Left ** Integer (Right));
390389

391390
function Compute_Value is new Compute.Value_G
392-
(T => Long_Long_Integer,
391+
(T => Internal_Integer,
393392
Zero => 0,
394-
Value => Long_Long_Integer'Value);
393+
Value => Internal_Integer'Value);
395394

396395
function "**"
397396
(Left, Right : SOAP.Types.Unsigned_Long) return SOAP.Types.Unsigned_Long
@@ -428,14 +427,14 @@ package body Ada2WSDL.Parser is
428427
-- Get_Range --
429428
---------------
430429

431-
procedure Get_Range is new Compute.Range_G (T => Long_Long_Integer);
430+
procedure Get_Range is new Compute.Range_G (T => Internal_Integer);
432431
procedure Get_Range is new Compute.Range_G (T => Long_Float);
433432
procedure Get_Range is new Compute.Range_G (T => SOAP.Types.Decimal);
434433

435434
procedure Get_Range is new Compute.Type_Range_G
436-
(T => Long_Long_Integer,
437-
First => Long_Long_Integer'First,
438-
Last => Long_Long_Integer'Last);
435+
(T => Internal_Integer,
436+
First => Internal_Integer'First,
437+
Last => Internal_Integer'Last);
439438

440439
procedure Get_Range is new Compute.Type_Range_G
441440
(T => Long_Float,
@@ -460,7 +459,7 @@ package body Ada2WSDL.Parser is
460459
Components : constant Component_Def := Node.F_Component_Type;
461460
Array_Len : Natural := 0;
462461
Type_Suffix : Unbounded_String;
463-
Lower, Upper : Long_Long_Integer;
462+
Lower, Upper : Internal_Integer;
464463
begin
465464
Get_Range (T_Decl, Lower, Upper);
466465
Array_Type_Suffix (Lower, Upper, Type_Suffix, Array_Len);
@@ -512,7 +511,7 @@ package body Ada2WSDL.Parser is
512511
NS : constant String := Name_Space (Node);
513512
T_Def : constant Type_Def := T_Decl.As_Type_Decl.F_Type_Def;
514513

515-
Lower, Upper : Long_Long_Integer;
514+
Lower, Upper : Internal_Integer;
516515
Type_Suffix : Unbounded_String;
517516
Array_Len : Natural;
518517
begin
@@ -608,13 +607,13 @@ package body Ada2WSDL.Parser is
608607
Components : constant Component_Def :=
609608
A_Def.F_Component_Type;
610609
Len : Unbounded_String;
611-
Lower, Upper : Long_Long_Integer;
610+
Lower, Upper : Internal_Integer;
612611
Type_Suffix : Unbounded_String;
613612
Array_Len : Integer := 0;
614613
begin
615614
Get_Range (T_Decl, Lower, Upper);
616615

617-
if Lower /= Long_Long_Integer'Last then
616+
if Lower /= Internal_Integer'Last then
618617
Array_Type_Suffix (Lower, Upper, Type_Suffix, Array_Len);
619618
Len := To_Unbounded_String (AWS.Utils.Image (Array_Len));
620619
end if;
@@ -737,7 +736,7 @@ package body Ada2WSDL.Parser is
737736
A_Def.F_Component_Type;
738737
E_Type : constant Generator.Type_Data :=
739738
Analyze_Array_Component (Components);
740-
Lower, Upper : Long_Long_Integer;
739+
Lower, Upper : Internal_Integer;
741740
Type_Suffix : Unbounded_String;
742741
Has_Decl_Constraint : Boolean;
743742
begin
@@ -764,8 +763,8 @@ package body Ada2WSDL.Parser is
764763
(C_Def.F_Type_Expr, Lower, Upper, Top_Decl => True);
765764

766765
Has_Decl_Constraint :=
767-
Lower /= Long_Long_Integer'Last
768-
and then Upper /= Long_Long_Integer'First;
766+
Lower /= Internal_Integer'Last
767+
and then Upper /= Internal_Integer'First;
769768

770769
Get_Range
771770
(C_Def.F_Type_Expr, Lower, Upper, Top_Decl => False);
@@ -961,16 +960,16 @@ package body Ada2WSDL.Parser is
961960
-----------------------
962961

963962
procedure Array_Type_Suffix
964-
(Lower, Upper : Long_Long_Integer;
963+
(Lower, Upper : Internal_Integer;
965964
Type_Suffix : out Unbounded_String;
966965
Length : out Natural)
967966
is
968-
function I (N : Long_Long_Integer) return String
967+
function I (N : Internal_Integer) return String
969968
is (AWS.Utils.Image (Natural (N)));
970969
begin
971970
if Lower /= 0
972971
and then Upper /= 0
973-
and then Lower /= Long_Long_Integer'Last
972+
and then Lower /= Internal_Integer'Last
974973
then
975974
Length := Natural (Upper - Lower + 1);
976975

@@ -1034,12 +1033,12 @@ package body Ada2WSDL.Parser is
10341033
case P_Type.As_Type_Decl.F_Type_Def.Kind is
10351034
when Ada_Signed_Int_Type_Def =>
10361035
declare
1037-
Lower, Upper : Long_Long_Integer;
1036+
Lower, Upper : Internal_Integer;
10381037
begin
10391038
Get_Range (Node, Lower, Upper);
10401039

1041-
Min := +Long_Long_Integer'Image (Lower);
1042-
Max := +Long_Long_Integer'Image (Upper);
1040+
Min := +Internal_Integer'Image (Lower);
1041+
Max := +Internal_Integer'Image (Upper);
10431042
end;
10441043

10451044
when Ada_Floating_Point_Def =>
@@ -1661,8 +1660,8 @@ package body Ada2WSDL.Parser is
16611660

16621661
function Register_Deferred_I
16631662
(Node : Base_Type_Decl'Class;
1664-
First : Long_Long_Integer := Long_Long_Integer'Last;
1665-
Last : Long_Long_Integer := Long_Long_Integer'First)
1663+
First : Internal_Integer := Internal_Integer'Last;
1664+
Last : Internal_Integer := Internal_Integer'First)
16661665
return Generator.Type_Data;
16671666
-- Same as above for integer and optional range
16681667

@@ -1683,16 +1682,16 @@ package body Ada2WSDL.Parser is
16831682
function Build_Type
16841683
(Name : String;
16851684
NS : String := SOAP.Name_Space.Value (SOAP.Name_Space.XSD);
1686-
First : Long_Long_Integer := Long_Long_Integer'Last;
1687-
Last : Long_Long_Integer := Long_Long_Integer'First)
1685+
First : Internal_Integer := Internal_Integer'Last;
1686+
Last : Internal_Integer := Internal_Integer'First)
16881687
return Generator.Type_Data
16891688
is (+NS, +Name,
1690-
(if First = Long_Long_Integer'Last
1689+
(if First = Internal_Integer'Last
16911690
then Null_Unbounded_String
1692-
else +Long_Long_Integer'Image (First)),
1693-
(if Last = Long_Long_Integer'First
1691+
else +Internal_Integer'Image (First)),
1692+
(if Last = Internal_Integer'First
16941693
then Null_Unbounded_String
1695-
else +Long_Long_Integer'Image (Last)),
1694+
else +Internal_Integer'Image (Last)),
16961695
Null_Unbounded_String);
16971696

16981697
function Build_Type_F
@@ -2020,46 +2019,46 @@ package body Ada2WSDL.Parser is
20202019
function Build_Integer
20212020
(Node : Base_Type_Decl) return Generator.Type_Data
20222021
is
2023-
Ilb, Iub : Long_Long_Integer;
2022+
Ilb, Iub : Internal_Integer;
20242023
begin
20252024
Get_Range (Node, Ilb, Iub);
20262025

20272026
if Base then
2028-
if Ilb = Long_Long_Integer (SOAP.Types.Byte'First)
2029-
and then Iub = Long_Long_Integer (SOAP.Types.Byte'Last)
2027+
if Ilb = Internal_Integer (SOAP.Types.Byte'First)
2028+
and then Iub = Internal_Integer (SOAP.Types.Byte'Last)
20302029
then
20312030
return Build_Type ("byte");
20322031

2033-
elsif Ilb >= Long_Long_Integer (SOAP.Types.Byte'First)
2034-
and then Iub <= Long_Long_Integer (SOAP.Types.Byte'Last)
2032+
elsif Ilb >= Internal_Integer (SOAP.Types.Byte'First)
2033+
and then Iub <= Internal_Integer (SOAP.Types.Byte'Last)
20352034
then
20362035
return Build_Type ("byte", First => Ilb, Last => Iub);
20372036

2038-
elsif Ilb = Long_Long_Integer (SOAP.Types.Short'First)
2037+
elsif Ilb = Internal_Integer (SOAP.Types.Short'First)
20392038
and then
2040-
Iub = Long_Long_Integer (SOAP.Types.Short'Last)
2039+
Iub = Internal_Integer (SOAP.Types.Short'Last)
20412040
then
20422041
return Build_Type ("short");
20432042

2044-
elsif Ilb >= Long_Long_Integer (SOAP.Types.Short'First)
2043+
elsif Ilb >= Internal_Integer (SOAP.Types.Short'First)
20452044
and then
2046-
Iub <= Long_Long_Integer (SOAP.Types.Short'Last)
2045+
Iub <= Internal_Integer (SOAP.Types.Short'Last)
20472046
then
20482047
return Build_Type ("short", First => Ilb, Last => Iub);
20492048

2050-
elsif Ilb = Long_Long_Integer (Integer'First)
2051-
and then Iub = Long_Long_Integer (Integer'Last)
2049+
elsif Ilb = Internal_Integer (Integer'First)
2050+
and then Iub = Internal_Integer (Integer'Last)
20522051
then
20532052
return Build_Type ("integer");
20542053

2055-
elsif Ilb >= Long_Long_Integer (Integer'First)
2056-
and then Iub <= Long_Long_Integer (Integer'Last)
2054+
elsif Ilb >= Internal_Integer (Integer'First)
2055+
and then Iub <= Internal_Integer (Integer'Last)
20572056
then
20582057
return Build_Type
20592058
("integer", First => Ilb, Last => Iub);
20602059

2061-
elsif Ilb = Long_Long_Integer (Long_Integer'First)
2062-
and then Iub = Long_Long_Integer (Long_Integer'Last)
2060+
elsif Ilb = Internal_Integer (Long_Integer'First)
2061+
and then Iub = Internal_Integer (Long_Integer'Last)
20632062
then
20642063
return Build_Type ("long");
20652064

@@ -2100,10 +2099,10 @@ package body Ada2WSDL.Parser is
21002099
-- Get_Last --
21012100
--------------
21022101

2103-
function Get_Last return Long_Long_Integer is
2102+
function Get_Last return Internal_Integer is
21042103
(if Modulus = 0
2105-
then Long_Long_Integer'First
2106-
else Long_Long_Integer (Modulus - 1));
2104+
then Internal_Integer'First
2105+
else Internal_Integer (Modulus - 1));
21072106

21082107
begin
21092108
if Base then
@@ -2257,8 +2256,8 @@ package body Ada2WSDL.Parser is
22572256

22582257
function Register_Deferred_I
22592258
(Node : Base_Type_Decl'Class;
2260-
First : Long_Long_Integer := Long_Long_Integer'Last;
2261-
Last : Long_Long_Integer := Long_Long_Integer'First)
2259+
First : Internal_Integer := Internal_Integer'Last;
2260+
Last : Internal_Integer := Internal_Integer'First)
22622261
return Generator.Type_Data
22632262
is
22642263
T_Name : constant String := Img (Node.F_Name);

0 commit comments

Comments
 (0)