@@ -51,6 +51,13 @@ package body Ada2WSDL.Parser is
51
51
use type SOAP.Types.Decimal;
52
52
use type SOAP.Types.Unsigned_Long;
53
53
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
+
54
61
package TxT renames Langkit_Support.Text;
55
62
56
63
function "+"
@@ -137,10 +144,6 @@ package body Ada2WSDL.Parser is
137
144
(Characters.Handling.To_Lower (Unit_Name (Node)) = " ada.calendar" );
138
145
-- True if Node is declared into the Ada.Calendar package
139
146
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
-
144
147
function Type_Definition
145
148
(Node : Ada_Node;
146
149
Name : String;
@@ -179,7 +182,7 @@ package body Ada2WSDL.Parser is
179
182
-- Analyze an array component
180
183
181
184
procedure Array_Type_Suffix
182
- (Lower, Upper : Long_Long_Integer ;
185
+ (Lower, Upper : Internal_Integer ;
183
186
Type_Suffix : out Unbounded_String;
184
187
Length : out Natural);
185
188
@@ -251,20 +254,16 @@ package body Ada2WSDL.Parser is
251
254
else " " );
252
255
Is_Std_LL : constant Boolean :=
253
256
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" ;
260
259
begin
261
260
Lower := Last;
262
261
Upper := First;
263
262
264
263
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).
268
267
269
268
if Is_Std_LL then
270
269
Lower := First;
@@ -385,13 +384,13 @@ package body Ada2WSDL.Parser is
385
384
-- Compute_Value --
386
385
-- -----------------
387
386
388
- function " **" (Left, Right : Long_Long_Integer ) return Long_Long_Integer
387
+ function " **" (Left, Right : Internal_Integer ) return Internal_Integer
389
388
is (Left ** Integer (Right));
390
389
391
390
function Compute_Value is new Compute.Value_G
392
- (T => Long_Long_Integer ,
391
+ (T => Internal_Integer ,
393
392
Zero => 0 ,
394
- Value => Long_Long_Integer 'Value);
393
+ Value => Internal_Integer 'Value);
395
394
396
395
function " **"
397
396
(Left, Right : SOAP.Types.Unsigned_Long) return SOAP.Types.Unsigned_Long
@@ -428,14 +427,14 @@ package body Ada2WSDL.Parser is
428
427
-- Get_Range --
429
428
-- -------------
430
429
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 );
432
431
procedure Get_Range is new Compute.Range_G (T => Long_Float);
433
432
procedure Get_Range is new Compute.Range_G (T => SOAP.Types.Decimal);
434
433
435
434
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);
439
438
440
439
procedure Get_Range is new Compute.Type_Range_G
441
440
(T => Long_Float,
@@ -460,7 +459,7 @@ package body Ada2WSDL.Parser is
460
459
Components : constant Component_Def := Node.F_Component_Type;
461
460
Array_Len : Natural := 0 ;
462
461
Type_Suffix : Unbounded_String;
463
- Lower, Upper : Long_Long_Integer ;
462
+ Lower, Upper : Internal_Integer ;
464
463
begin
465
464
Get_Range (T_Decl, Lower, Upper);
466
465
Array_Type_Suffix (Lower, Upper, Type_Suffix, Array_Len);
@@ -512,7 +511,7 @@ package body Ada2WSDL.Parser is
512
511
NS : constant String := Name_Space (Node);
513
512
T_Def : constant Type_Def := T_Decl.As_Type_Decl.F_Type_Def;
514
513
515
- Lower, Upper : Long_Long_Integer ;
514
+ Lower, Upper : Internal_Integer ;
516
515
Type_Suffix : Unbounded_String;
517
516
Array_Len : Natural;
518
517
begin
@@ -608,13 +607,13 @@ package body Ada2WSDL.Parser is
608
607
Components : constant Component_Def :=
609
608
A_Def.F_Component_Type;
610
609
Len : Unbounded_String;
611
- Lower, Upper : Long_Long_Integer ;
610
+ Lower, Upper : Internal_Integer ;
612
611
Type_Suffix : Unbounded_String;
613
612
Array_Len : Integer := 0 ;
614
613
begin
615
614
Get_Range (T_Decl, Lower, Upper);
616
615
617
- if Lower /= Long_Long_Integer 'Last then
616
+ if Lower /= Internal_Integer 'Last then
618
617
Array_Type_Suffix (Lower, Upper, Type_Suffix, Array_Len);
619
618
Len := To_Unbounded_String (AWS.Utils.Image (Array_Len));
620
619
end if ;
@@ -737,7 +736,7 @@ package body Ada2WSDL.Parser is
737
736
A_Def.F_Component_Type;
738
737
E_Type : constant Generator.Type_Data :=
739
738
Analyze_Array_Component (Components);
740
- Lower, Upper : Long_Long_Integer ;
739
+ Lower, Upper : Internal_Integer ;
741
740
Type_Suffix : Unbounded_String;
742
741
Has_Decl_Constraint : Boolean;
743
742
begin
@@ -764,8 +763,8 @@ package body Ada2WSDL.Parser is
764
763
(C_Def.F_Type_Expr, Lower, Upper, Top_Decl => True);
765
764
766
765
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;
769
768
770
769
Get_Range
771
770
(C_Def.F_Type_Expr, Lower, Upper, Top_Decl => False);
@@ -961,16 +960,16 @@ package body Ada2WSDL.Parser is
961
960
-- ---------------------
962
961
963
962
procedure Array_Type_Suffix
964
- (Lower, Upper : Long_Long_Integer ;
963
+ (Lower, Upper : Internal_Integer ;
965
964
Type_Suffix : out Unbounded_String;
966
965
Length : out Natural)
967
966
is
968
- function I (N : Long_Long_Integer ) return String
967
+ function I (N : Internal_Integer ) return String
969
968
is (AWS.Utils.Image (Natural (N)));
970
969
begin
971
970
if Lower /= 0
972
971
and then Upper /= 0
973
- and then Lower /= Long_Long_Integer 'Last
972
+ and then Lower /= Internal_Integer 'Last
974
973
then
975
974
Length := Natural (Upper - Lower + 1 );
976
975
@@ -1034,12 +1033,12 @@ package body Ada2WSDL.Parser is
1034
1033
case P_Type.As_Type_Decl.F_Type_Def.Kind is
1035
1034
when Ada_Signed_Int_Type_Def =>
1036
1035
declare
1037
- Lower, Upper : Long_Long_Integer ;
1036
+ Lower, Upper : Internal_Integer ;
1038
1037
begin
1039
1038
Get_Range (Node, Lower, Upper);
1040
1039
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);
1043
1042
end ;
1044
1043
1045
1044
when Ada_Floating_Point_Def =>
@@ -1661,8 +1660,8 @@ package body Ada2WSDL.Parser is
1661
1660
1662
1661
function Register_Deferred_I
1663
1662
(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)
1666
1665
return Generator.Type_Data;
1667
1666
-- Same as above for integer and optional range
1668
1667
@@ -1683,16 +1682,16 @@ package body Ada2WSDL.Parser is
1683
1682
function Build_Type
1684
1683
(Name : String;
1685
1684
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)
1688
1687
return Generator.Type_Data
1689
1688
is (+NS, +Name,
1690
- (if First = Long_Long_Integer 'Last
1689
+ (if First = Internal_Integer 'Last
1691
1690
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
1694
1693
then Null_Unbounded_String
1695
- else +Long_Long_Integer 'Image (Last)),
1694
+ else +Internal_Integer 'Image (Last)),
1696
1695
Null_Unbounded_String);
1697
1696
1698
1697
function Build_Type_F
@@ -2020,46 +2019,46 @@ package body Ada2WSDL.Parser is
2020
2019
function Build_Integer
2021
2020
(Node : Base_Type_Decl) return Generator.Type_Data
2022
2021
is
2023
- Ilb, Iub : Long_Long_Integer ;
2022
+ Ilb, Iub : Internal_Integer ;
2024
2023
begin
2025
2024
Get_Range (Node, Ilb, Iub);
2026
2025
2027
2026
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)
2030
2029
then
2031
2030
return Build_Type (" byte" );
2032
2031
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)
2035
2034
then
2036
2035
return Build_Type (" byte" , First => Ilb, Last => Iub);
2037
2036
2038
- elsif Ilb = Long_Long_Integer (SOAP.Types.Short'First)
2037
+ elsif Ilb = Internal_Integer (SOAP.Types.Short'First)
2039
2038
and then
2040
- Iub = Long_Long_Integer (SOAP.Types.Short'Last)
2039
+ Iub = Internal_Integer (SOAP.Types.Short'Last)
2041
2040
then
2042
2041
return Build_Type (" short" );
2043
2042
2044
- elsif Ilb >= Long_Long_Integer (SOAP.Types.Short'First)
2043
+ elsif Ilb >= Internal_Integer (SOAP.Types.Short'First)
2045
2044
and then
2046
- Iub <= Long_Long_Integer (SOAP.Types.Short'Last)
2045
+ Iub <= Internal_Integer (SOAP.Types.Short'Last)
2047
2046
then
2048
2047
return Build_Type (" short" , First => Ilb, Last => Iub);
2049
2048
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)
2052
2051
then
2053
2052
return Build_Type (" integer" );
2054
2053
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)
2057
2056
then
2058
2057
return Build_Type
2059
2058
(" integer" , First => Ilb, Last => Iub);
2060
2059
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)
2063
2062
then
2064
2063
return Build_Type (" long" );
2065
2064
@@ -2100,10 +2099,10 @@ package body Ada2WSDL.Parser is
2100
2099
-- Get_Last --
2101
2100
-- ------------
2102
2101
2103
- function Get_Last return Long_Long_Integer is
2102
+ function Get_Last return Internal_Integer is
2104
2103
(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 ));
2107
2106
2108
2107
begin
2109
2108
if Base then
@@ -2257,8 +2256,8 @@ package body Ada2WSDL.Parser is
2257
2256
2258
2257
function Register_Deferred_I
2259
2258
(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)
2262
2261
return Generator.Type_Data
2263
2262
is
2264
2263
T_Name : constant String := Img (Node.F_Name);
0 commit comments