Date: Wed, 2 Jun 2004 09:41:15 +0000 (UTC) From: "Bjoern A. Zeeb" <bzeeb-lists@lists.zabbadoz.net> To: Peter Wemm <peter@freebsd.org> Cc: FreeBSD amd64 mailing list <freebsd-amd64@freebsd.org> Subject: Re: patch: amd64 native cvsup with compress working Message-ID: <Pine.BSF.4.53.0406020931380.26723@e0-0.zab2.int.zabbadoz.net> In-Reply-To: <Pine.BSF.4.53.0406012110280.26723@e0-0.zab2.int.zabbadoz.net> References: <Pine.BSF.4.53.0406012110280.26723@e0-0.zab2.int.zabbadoz.net>
next in thread | previous in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.53.0406020931380.26723>