mirror of
https://github.com/vishapoberon/compiler.git
synced 2026-04-06 22:42:24 +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.
This commit is contained in:
parent
90a0dc3ae2
commit
0d85205cfd
8 changed files with 10 additions and 12 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);
|
||||||
|
|
|
||||||
BIN
voc
BIN
voc
Binary file not shown.
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue