@@ -703,21 +703,32 @@ impl Scheme for DictScheme {
703703
704704 let dict = dictionary_encode ( stats) ;
705705
706- // Cascade the codes child
707- // Don't allow SequenceArray as the codes child as it merely adds extra indirection without actually compressing data.
708- let mut new_excludes = vec ! [ IntCode :: Dict , IntCode :: Sequence ] ;
709- new_excludes. extend_from_slice ( excludes) ;
706+ // Cascade the codes child.
707+ // Don't allow SequenceArray as the codes child as it merely adds extra indirection without
708+ // actually compressing data.
709+ let mut codes_excludes = vec ! [ IntCode :: Dict , IntCode :: Sequence ] ;
710+ codes_excludes. extend_from_slice ( excludes) ;
710711
711712 let compressed_codes = compressor. compress_canonical (
712713 Canonical :: Primitive ( dict. codes ( ) . to_primitive ( ) . narrow ( ) ?) ,
713714 ctx. descend ( ) ,
714- Excludes :: int_only ( & new_excludes) ,
715+ Excludes :: int_only ( & codes_excludes) ,
716+ ) ?;
717+
718+ // Cascade the values child.
719+ let mut values_excludes = vec ! [ IntCode :: Dict ] ;
720+ values_excludes. extend_from_slice ( excludes) ;
721+
722+ let compressed_values = compressor. compress_canonical (
723+ Canonical :: Primitive ( dict. values ( ) . to_primitive ( ) ) ,
724+ ctx. descend ( ) ,
725+ Excludes :: int_only ( & values_excludes) ,
715726 ) ?;
716727
717- // SAFETY: compressing codes does not change their values
728+ // SAFETY: Compressing the arrays does not change their logical values.
718729 unsafe {
719730 Ok (
720- DictArray :: new_unchecked ( compressed_codes, dict . values ( ) . clone ( ) )
731+ DictArray :: new_unchecked ( compressed_codes, compressed_values )
721732 . set_all_values_referenced ( dict. has_all_values_referenced ( ) )
722733 . into_array ( ) ,
723734 )
0 commit comments