mirror of
https://github.com/vishapoberon/compiler.git
synced 2026-04-06 13:22:26 +00:00
fixed bug in Reals.Mod which was actual on x86_64
without prototype, return type of ecvt was int, which has 4 byte size on
x86 but still has the same size on x86_64, that's why pointer which is 8
byte long could not fit in the variable holding return value. And it
could get negative value causing programs to explode. Fixed with casting
the result to LONGINT.
Former-commit-id: 0d85205cfd
This commit is contained in:
parent
4a77f04720
commit
ca407472a0
8 changed files with 12 additions and 14 deletions
|
|
@ -5,7 +5,7 @@ MODULE Reals;
|
||||||
|
|
||||||
|
|
||||||
PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT
|
PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT
|
||||||
"ecvt (x, ndigit, decpt, sign)";
|
"(LONGINT)ecvt (x, ndigit, decpt, sign)";
|
||||||
|
|
||||||
PROCEDURE Ten*(e: INTEGER): REAL;
|
PROCEDURE Ten*(e: INTEGER): REAL;
|
||||||
VAR r, power: LONGREAL;
|
VAR r, power: LONGREAL;
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ MODULE Reals;
|
||||||
|
|
||||||
|
|
||||||
PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT
|
PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT
|
||||||
"ecvt (x, ndigit, decpt, sign)";
|
"(LONGINT)ecvt (x, ndigit, decpt, sign)";
|
||||||
|
|
||||||
PROCEDURE Ten*(e: INTEGER): REAL;
|
PROCEDURE Ten*(e: INTEGER): REAL;
|
||||||
VAR r, power: LONGREAL;
|
VAR r, power: LONGREAL;
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ MODULE Reals;
|
||||||
|
|
||||||
|
|
||||||
PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT
|
PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT
|
||||||
"ecvt (x, ndigit, decpt, sign)";
|
"(LONGINT)ecvt (x, ndigit, decpt, sign)";
|
||||||
|
|
||||||
PROCEDURE Ten*(e: INTEGER): REAL;
|
PROCEDURE Ten*(e: INTEGER): REAL;
|
||||||
VAR r, power: LONGREAL;
|
VAR r, power: LONGREAL;
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ MODULE Reals;
|
||||||
|
|
||||||
|
|
||||||
PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT
|
PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT
|
||||||
"ecvt (x, ndigit, decpt, sign)";
|
"(LONGINT)ecvt (x, ndigit, decpt, sign)";
|
||||||
|
|
||||||
PROCEDURE Ten*(e: INTEGER): REAL;
|
PROCEDURE Ten*(e: INTEGER): REAL;
|
||||||
VAR r, power: LONGREAL;
|
VAR r, power: LONGREAL;
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ MODULE Reals;
|
||||||
|
|
||||||
|
|
||||||
PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT
|
PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT
|
||||||
"ecvt (x, ndigit, decpt, sign)";
|
"(LONGINT)ecvt (x, ndigit, decpt, sign)";
|
||||||
|
|
||||||
PROCEDURE Ten*(e: INTEGER): REAL;
|
PROCEDURE Ten*(e: INTEGER): REAL;
|
||||||
VAR r, power: LONGREAL;
|
VAR r, power: LONGREAL;
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,9 @@ MODULE Reals;
|
||||||
|
|
||||||
IMPORT S := SYSTEM;
|
IMPORT S := SYSTEM;
|
||||||
|
|
||||||
(*
|
|
||||||
PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT
|
PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT
|
||||||
"ecvt (x, ndigit, decpt, sign)";
|
"(LONGINT)ecvt (x, ndigit, decpt, sign)";
|
||||||
*)
|
|
||||||
PROCEDURE Ten*(e: INTEGER): REAL;
|
PROCEDURE Ten*(e: INTEGER): REAL;
|
||||||
VAR r, power: LONGREAL;
|
VAR r, power: LONGREAL;
|
||||||
BEGIN r := 1.0;
|
BEGIN r := 1.0;
|
||||||
|
|
@ -65,7 +64,7 @@ MODULE Reals;
|
||||||
d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k)
|
d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k)
|
||||||
END
|
END
|
||||||
END Convert;
|
END Convert;
|
||||||
|
(*
|
||||||
PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR);
|
PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR);
|
||||||
VAR i, k: LONGINT;
|
VAR i, k: LONGINT;
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|
@ -74,8 +73,7 @@ MODULE Reals;
|
||||||
d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k)
|
d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k)
|
||||||
END
|
END
|
||||||
END ConvertL;
|
END ConvertL;
|
||||||
|
*)
|
||||||
(* (*commented because ecvt returns smth strange on x86_64, may be types must be checked, but anyway, getting rid of libc dependency is good *)
|
|
||||||
PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR);
|
PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR);
|
||||||
VAR decpt, sign, i: LONGINT; buf: LONGINT;
|
VAR decpt, sign, i: LONGINT; buf: LONGINT;
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|
@ -86,7 +84,7 @@ MODULE Reals;
|
||||||
i := n - i - 1;
|
i := n - i - 1;
|
||||||
WHILE i >= 0 DO d[i] := "0"; DEC(i) END ;
|
WHILE i >= 0 DO d[i] := "0"; DEC(i) END ;
|
||||||
END ConvertL;
|
END ConvertL;
|
||||||
*)
|
|
||||||
PROCEDURE Unpack(VAR b, d: ARRAY OF S.BYTE);
|
PROCEDURE Unpack(VAR b, d: ARRAY OF S.BYTE);
|
||||||
VAR i, k: SHORTINT; len: LONGINT;
|
VAR i, k: SHORTINT; len: LONGINT;
|
||||||
BEGIN i := 0; len := LEN(b);
|
BEGIN i := 0; len := LEN(b);
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
ecc8a9a5e3415d5077353c2003a7a8751125df3e
|
ea3eeab60e2534238860b93b768a164507a37366
|
||||||
|
|
@ -1 +1 @@
|
||||||
90416871552aca31fdc4f4df787d5ad56448ca5d
|
ea3eeab60e2534238860b93b768a164507a37366
|
||||||
Loading…
Add table
Add a link
Reference in a new issue