Skip to content

Commit 6f0b636

Browse files
committed
For compressed marshaling, use absolute shared object references
Instead of the default relative references. As noted in #4056, absolute references compress better. (We get a 15% size reduction on typical .cmt files.) Closes: #4056
1 parent 03e3266 commit 6f0b636

2 files changed

Lines changed: 7 additions & 4 deletions

File tree

runtime/extern.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -805,7 +805,10 @@ static void extern_rec(struct caml_extern_state* s, value v)
805805
/* Check if object already seen */
806806
if (! (s->extern_flags & NO_SHARING)) {
807807
if (extern_lookup_position(s, v, &pos, &h)) {
808-
extern_shared_reference(s, s->obj_counter - pos);
808+
/* #4056: using absolute references for shared objects improves
809+
compressibility. */
810+
uintnat d = s->extern_flags & COMPRESSED ? pos : s->obj_counter - pos;
811+
extern_shared_reference(s, d);
809812
goto next_item;
810813
}
811814
}

runtime/intern.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -527,10 +527,10 @@ static void intern_rec(struct caml_intern_state* s,
527527
case CODE_SHARED8:
528528
ofs = read8u(s);
529529
read_shared:
530-
CAMLassert (ofs > 0);
531-
CAMLassert (ofs <= s->obj_counter);
530+
if (!s->compressed) ofs = s->obj_counter - ofs;
531+
CAMLassert (ofs < s->obj_counter);
532532
CAMLassert (s->intern_obj_table != NULL);
533-
v = s->intern_obj_table[s->obj_counter - ofs];
533+
v = s->intern_obj_table[ofs];
534534
break;
535535
case CODE_SHARED16:
536536
ofs = read16u(s);

0 commit comments

Comments
 (0)