bug#39634: All keyowrds hash to the same value

lloda <[email protected]>
Newsgroups gmane.lisp.guile.bugs
Message-ID <[email protected]>


> On 25 Feb 2020, at 21:56, Andy Wingo <[email protected]> wrote:
> 
> On Thu 20 Feb 2020 17:19, Ludovic Courtès <[email protected]> writes:
> 
>> Of all the scm_tc7_ values listed in ‘scm.h’, the following are not
>> explicitly listed (so they go to the default case that hashes the first
>> word):
> 
> Reformatting your list so I can check one by one :)
> 
>>  variable,
>>  hashtable,
>>  fluid,
>>  dynamic_state,
>>  frame,
>>  atomic_box,
>>  program,
>>  vm_cont,
>>  weak_set,
>>  weak_table,
>>  port
> 
> No equal? implementation, so should hashq() instead.
> 
>>  bytevector,
>>  array,
>>  bitvector,
> 
> These have equal? implementations, and what's more, a bitvector can
> equal? an array... I think we have another bug!
> 
>  ;; Project 2d array as 1d array (scm_tc7_array)
>  (define x
>    (make-shared-array #2b((#t #t #t)) (lambda (i) (list 0 i)) '(0 2)))
>  ;; scm_tc7_bitvector
>  (define y #*111)
> 
>  (equal? x y) ;; => #t
>  (equal? (hash x #xffffffff) (hash y #xffffffff)) ;; => #f
> 
> Similarly for 1-d scm_tc7_array versus regular vectors, bytevectors,
> etc.
> 
> Fixing this will not be straightforward...  I think basically 1d arrays
> need some special hashing logic so that e.g. vectors and 1d arrays hash
> to the same thing.

I cannot check at the moment but I think that use of make-shared-array is special cased to return a bitvector because the shared array and the root happen to be equivalent. So your x isn't a scm_tc7_array but a scm_tc7_bitvector. The same is true for the other vector types. You can see that if you make a shared array with bounds '(0 1) instead of '(0 2) for example, or non-unit step or non-zero lower bound or anything that cannot be represented as a root vector.

Now it is true that functionally a root vector and a 1d array with the same bounds and the same elements are equivalent even if the array has non-unit stride and so on, but we had that logic before were you could use the root vector functions on arrays and it was an absolute mess. I think there should be a logic to hash n-d arrays that extends to 1-d arrays so there's no need to make special cases. All vectors can be treated as 1-d arrays so that should work fine for those too.

Partially related, I have a series of patches on wip-vector-cleanup to make sure that the various vector implementations don't depend on arrays (as they still do on some cases) but rather the other way around, strictly. I haven't posted about it b/c it changes a few interfaces and I haven't figured out the deprecation route.

regards





> 
>>  stringbuf,
>>  values,
> 
> These are never exposed to Scheme, and never compared using equal?
> AFAIU.  No need for special cases.
> 
> Basically I think the tc7 case should default to hashq, and include
> special cases for the ones that have equal? implementations or which
> have read syntax.
> 
> Sound right to you?
> 
> Andy
> 
> 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.