Skip site navigation (1)Skip section navigation (2)
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>