patch: amd64 native cvsup with compress working
Bjoern A. Zeeb
bzeeb-lists at lists.zabbadoz.net
Wed Jun 2 02:50:35 PDT 2004
On Tue, 1 Jun 2004, Bjoern A. Zeeb wrote:
Sorry for replying to myself but attached is an updated patch for amd64
cvsup to work with compression.
The problem seems that zlib deflate returns an (c native) int that
gets somehow mapped to an INTEGER directly or indirectly through the
RETURN statements with the PROCEDURE returning an INTEGER.
INTEGER on amd64 seems to be a long and not an int thus
some conversion from the zlib return into m3 seems to lose
signedness. The workaround is to use a Ctypes.int variable
to temporary safe the return code from zlib and do the
type convertion entirely in m3 which seems to work fine here.
cvsupping release=cvs, src-all at the moment.
--- cut ---
--- suplib/src/GzipWr.m3.orig Tue Jun 1 21:09:44 2004
+++ suplib/src/GzipWr.m3 Wed Jun 2 08:59:02 2004
@@ -32,7 +32,7 @@ UNSAFE MODULE GzipWr;
IMPORT
GzipError, OSError, StreamWrClass, Thread, Ugzip, Wr, WrClass;
-FROM Ctypes IMPORT unsigned_char_star;
+FROM Ctypes IMPORT unsigned_char_star, int;
REVEAL
T = Public BRANDED OBJECT
@@ -102,12 +102,15 @@ PROCEDURE Deflate(strmp: Ugzip.z_stream_
(* Call "Ugzip.deflate", making sure that pointers into the (traced)
input and output buffers are on the stack or in registers. This
ensures that the collector will not move the buffers. *)
+ VAR
+ rc: int;
BEGIN
strmp.next_in := next_in;
strmp.avail_in := avail_in;
strmp.next_out := next_out;
strmp.avail_out := avail_out;
- RETURN Ugzip.deflate(strmp, flush);
+ rc := Ugzip.deflate(strmp, flush);
+ RETURN rc;
END Deflate;
PROCEDURE Flush(self: T)
--- suplib/src/GzipRd.m3.orig Tue Mar 4 19:26:22 2003
+++ suplib/src/GzipRd.m3 Wed Jun 2 08:59:22 2004
@@ -32,7 +32,7 @@ UNSAFE MODULE GzipRd;
IMPORT
GzipError, OSError, Rd, RdClass, StreamRdClass, Thread, Ugzip;
-FROM Ctypes IMPORT unsigned_char_star;
+FROM Ctypes IMPORT unsigned_char_star, int;
REVEAL
T = Public BRANDED OBJECT
@@ -83,12 +83,15 @@ PROCEDURE Inflate(strmp: Ugzip.z_stream_
(* Call "Ugzip.inflate", making sure that pointers into the (traced)
input and output buffers are on the stack or in registers. This
ensures that the collector will not move the buffers. *)
+ VAR
+ rc: int;
BEGIN
strmp.next_in := next_in;
strmp.avail_in := avail_in;
strmp.next_out := next_out;
strmp.avail_out := avail_out;
- RETURN Ugzip.inflate(strmp, flush);
+ rc := Ugzip.inflate(strmp, flush);
+ RETURN rc;
END Inflate;
PROCEDURE Init(self: T;
--- cut ---
--
Bjoern A. Zeeb bzeeb at Zabbadoz dot NeT
More information about the freebsd-amd64
mailing list