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