1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-11-22 00:35:15 +00:00
freebsd-ports/net/unison248/files/patch-hash__compat.c
Benjamin Jacobs 8025aa10ce lang/ocaml: Update to 4.14.1
The 'force-safe-string; setting is NOT enabled, as opposed to the
new upstream default. OCaml users are encouraged to migrate to safe
strings as soon as possible.

- The X11 library isn't part of lang/ocaml anymore, users should
install x11-toolkits/ocaml-graphics.
- Add new 'ocaml' USES
- Bump PORTREVISION on dependent ports, due to ABI Change.

The update includes the following updates to existing ports (needed
to keep them working):

- devel/ocaml-camlp4: Updated to 4.14+1
- devel/ocaml-camlp5: Updated to 8.02.01, homepage updated
- devel/ocaml-dune: Patch to allow overriding the stublibs directory,
  strip binary and shared libraries
- devel/ocaml-findlib: Improve port
- devel/ocaml-lwt: Fix build with OCaml 4.14
- deve/ocaml-re: Update to 1.11.0, use new dune USES
- devel/ocaml-sdl: Fix build with new ocaml
- games/freetennis: Fix build, tidy Makefile
- graphics/ocaml-images: Updated to 5.0.4, new homepage, use new
  dune USES, undeprecate
- graphics/ocaml-lablgl: Moved into site-lib, dynamic objects
  stripped, add missing GL dependencies
- math/coq: Updated to 8.19.0
- math/ocaml-zarith: strip shared libraries, fixed usage of
  USE_OCAML_LDCONFIG, use new dune USES
- math/teyjus: Fix build
- net/unison240: Fix build with new compiler
- net/unison248: Fix build with new compiler, add MAKE_JOBS_UNSAFE
- net-p2p/mldonkey: Fix build with new compiler, fix build on i386
- sysutils/ledit: Updated to 2.06, install native binary, Use github,
  fix man page installation
- www/geneweb: Build fix for OCaml and Camlp5 updates
- x11-toolkits/ocaml-lablgtk2: Fix build with new compiler
- x11-toolkits/ocaml-lablgtk3: Updated to 3.1.4, added ocaml-camlp-stream
  dependency, build fix patch
- x11-toolkits/ocaml-labltk: Updated to 8.06.12, Improve Makefile

Added the following ports:

- devel/ocaml-astring
- devel/ocaml-base
- devel/ocaml-bos
- devel/ocaml-camlp-streams
- devel/ocaml-csexp
- devel/ocaml-fmt
- devel/ocaml-fpath
- devel/ocaml-logs
- devel/ocaml-mtime
- devel/ocaml-pcre2
- devel/ocaml-rresult
- devel/ocaml-seq
- devel/ocaml-stdio
- x11-toolkits/ocaml-graphics

PR:                     250408 [1], 262781 [1], 262788 [3], 262789 [1],
			262792 [1], 263006 [1], 263162 [3], 263206 [2],
			276893 [1], 276945 [4], 276953 [1], 277026 [5],
			277241 [1], 277242 [1], 277243 [1], 277244 [1],
			277245 [1], 277246 [1], 277247 [1], 277248 [1],
			277249 [1], 277250 [1], 277251 [1], 277252 [1],
			277253 [1], 277254 [1], 277255 [1], 277256 [4],
			277257 [1], 277258 [1]
Approved by:		maintainer timeout [1],
			yuri (maintainer) [2],
			overcome by events, fixit [3],
			madpilot (maintainer) [4]
Reviewed by:		madpilot
Exp-run by:		antoine [5]
Differential Revision:	https://reviews.freebsd.org/D43861
2024-03-11 22:50:58 +01:00

169 lines
5.5 KiB
C

--- hash_compat.c.orig 2024-02-06 20:29:47 UTC
+++ hash_compat.c
@@ -0,0 +1,165 @@
+/* The pre-OCaml 4.00 hash implementation */
+/* FIXME: This is included for backwards compatibility only and must be
+ * REMOVED when a new hash function included in a stable release has been
+ * available for a few years. The removal of this function will break
+ * Unison version compatibility. There must be plenty of time given
+ * for users to upgrade (most users don't compile themselves and are at
+ * mercy of whatever package repositories they use). */
+
+/* Code copied from OCaml sources */
+/**************************************************************************/
+/* */
+/* OCaml */
+/* */
+/* Xavier Leroy, projet Cristal, INRIA Rocquencourt */
+/* */
+/* Copyright 1996 Institut National de Recherche en Informatique et */
+/* en Automatique. */
+/* */
+/* All rights reserved. This file is distributed under the terms of */
+/* the GNU Lesser General Public License version 2.1, with the */
+/* special exception on linking described in the file LICENSE. */
+/* */
+/**************************************************************************/
+
+#include <caml/mlvalues.h>
+#include <caml/custom.h>
+#include <caml/address_class.h>
+
+struct hash_state {
+ uintnat accu;
+ intnat univ_limit, univ_count;
+};
+
+static void hash_aux(struct hash_state*, value obj);
+
+CAMLprim value unsn_hash_univ_param(value count, value limit, value obj)
+{
+ struct hash_state h;
+ h.univ_limit = Long_val(limit);
+ h.univ_count = Long_val(count);
+ h.accu = 0;
+ hash_aux(&h, obj);
+ return Val_long(h.accu & 0x3FFFFFFF);
+ /* The & has two purposes: ensure that the return value is positive
+ and give the same result on 32 bit and 64 bit architectures. */
+}
+
+#define Alpha 65599
+#define Beta 19
+#define Combine(new) (h->accu = h->accu * Alpha + (new))
+#define Combine_small(new) (h->accu = h->accu * Beta + (new))
+
+static void hash_aux(struct hash_state* h, value obj)
+{
+ unsigned char * p;
+ mlsize_t i, j;
+ tag_t tag;
+
+ h->univ_limit--;
+ if (h->univ_count < 0 || h->univ_limit < 0) return;
+
+ again:
+ if (Is_long(obj)) {
+ h->univ_count--;
+ Combine(Long_val(obj));
+ return;
+ }
+ if (! Is_in_value_area(obj)) {
+ /* obj is a pointer outside the heap, to an object with
+ a priori unknown structure. Use its physical address as hash key. */
+ Combine((intnat) obj);
+ return;
+ }
+ /* Pointers into the heap are well-structured blocks. So are atoms.
+ We can inspect the block contents. */
+ /* The code needs reindenting later. Leaving as is to facilitate review. */
+ tag = Tag_val(obj);
+ switch (tag) {
+ case String_tag:
+ h->univ_count--;
+ i = caml_string_length(obj);
+ for (p = &Byte_u(obj, 0); i > 0; i--, p++)
+ Combine_small(*p);
+ break;
+ case Double_tag:
+ /* For doubles, we inspect their binary representation, LSB first.
+ The results are consistent among all platforms with IEEE floats. */
+ h->univ_count--;
+#ifdef ARCH_BIG_ENDIAN
+ for (p = &Byte_u(obj, sizeof(double) - 1), i = sizeof(double);
+ i > 0;
+ p--, i--)
+#else
+ for (p = &Byte_u(obj, 0), i = sizeof(double);
+ i > 0;
+ p++, i--)
+#endif
+ Combine_small(*p);
+ break;
+ case Double_array_tag:
+ h->univ_count--;
+ for (j = 0; j < Bosize_val(obj); j += sizeof(double)) {
+#ifdef ARCH_BIG_ENDIAN
+ for (p = &Byte_u(obj, j + sizeof(double) - 1), i = sizeof(double);
+ i > 0;
+ p--, i--)
+#else
+ for (p = &Byte_u(obj, j), i = sizeof(double);
+ i > 0;
+ p++, i--)
+#endif
+ Combine_small(*p);
+ }
+ break;
+ case Abstract_tag:
+ /* We don't know anything about the contents of the block.
+ Better do nothing. */
+ break;
+ case Infix_tag:
+ hash_aux(h, obj - Infix_offset_val(obj));
+ break;
+ case Forward_tag:
+ obj = Forward_val (obj);
+ goto again;
+ case Object_tag:
+ h->univ_count--;
+ Combine(Oid_val(obj));
+ break;
+ case Custom_tag:
+ /* If no hashing function provided, do nothing */
+ if (Custom_ops_val(obj)->hash != NULL) {
+ h->univ_count--;
+ Combine(Custom_ops_val(obj)->hash(obj));
+ }
+ break;
+#ifdef NO_NAKED_POINTERS
+ case Closure_tag:
+ h->univ_count--;
+ Combine_small(tag);
+ /* Recursively hash the environment fields */
+ i = Wosize_val(obj);
+ j = Start_env_closinfo(Closinfo_val(obj));
+ while (i > j) {
+ i--;
+ hash_aux(h, Field(obj, i));
+ }
+ /* Combine the code pointers, closure info fields, and infix headers */
+ while (i > 0) {
+ i--;
+ Combine(Field(obj, i));
+ h->univ_count--;
+ }
+ break;
+#endif
+ default:
+ h->univ_count--;
+ Combine_small(tag);
+ i = Wosize_val(obj);
+ while (i != 0) {
+ i--;
+ hash_aux(h, Field(obj, i));
+ }
+ break;
+ }
+}