Skip to content
This repository was archived by the owner on Jun 1, 2023. It is now read-only.
This repository was archived by the owner on Jun 1, 2023. It is now read-only.

fix NODEFAULT_SHAREKEYS #201

@rurban

Description

@rurban

When NODEFAULT_SHAREKEYS is defined, sv_clear of a IsCOW/LEN=0 PV fails to get the he before the hek, which is shared with the pv.

With default SHAREKEYS every single key is stored twice. Once in strtab, and once in the hash. This seems to be a massive overhead. But I cannot test the overhead with this failure. (=> 20-30% faster)

This is an upstream bug, typical bitrot. perl5 simply assumes that every single non-strtab hash uses shared keys, ignoring the HVhek_UNSHARED bit somewhere. Or most likely forgetting to copy this bit.
NODEFAULT_SHAREKEYS was previously in newHV() in hv.c, added with fde52b5 in perl 5.003_01

repro: Configure with -DDEBUGGING -Accflags=-DNODEFAULT_SHAREKEYS;
make miniperl; ./miniperl -Ilib configpm && make uni.data and see the unshare_hek assert.
This even happens with 5.10.0, before new IsCOW times, but works with 5.8.9. So it got broken during the 5.9 cycle, probably with the old COW.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions