Ticket #1253 (new bug)
[BUG] hash iterator interface changed, needs errata or deprecation notice
Reported by: | pmichaud | Owned by: | |
---|---|---|---|
Priority: | normal | Milestone: | |
Component: | core | Version: | 1.7.0 |
Severity: | release | Keywords: | |
Cc: | whiteknight, allison | Language: | |
Patch status: | Platform: |
Description (last modified by pmichaud) (diff)
The following code worked in Parrot 1.0.0 (r37535) and Parrot 1.3.0 (r39599):
$ cat hash-1.pir .sub 'main' .local pmc hash, hash_it hash = new ['Hash'] hash['1'] = 'a' hash['2'] = 'b' hash['3'] = 'c' hash_it = iter hash loop: unless hash_it goto done $P0 = shift hash_it $P1 = concat $P0, 'x' say $P1 goto loop done: .end $ 37535/parrot hash-1.pir 1x 2x 3x $ 39599/parrot hash-1.pir 1x 2x 3x
The same code fails in 1.4.0 (r40185) and current trunk:
$ 40185/parrot hash-1.pir Multiple Dispatch: No suitable candidate found for 'concatenate_str', with signature 'PSP->P' current instr.: 'main' pc 24 (hash-1.pir:12) $ trunk/parrot hash-1.pir Multiple Dispatch: No suitable candidate found for 'concatenate_str', with signature 'PSP->P' current instr.: 'main' pc 24 (hash-1.pir:13) $
The problem is not limited to the concat opcode -- other opcodes cause problems also:
$ cat hash-2.pir .sub 'main' .local pmc hash, hash_it hash = new ['Hash'] hash['1'] = 'a' hash['2'] = 'b' hash['3'] = 'c' hash_it = iter hash loop: unless hash_it goto done $P0 = shift hash_it $P1 = add $P0, 100 say $P1 goto loop done: .end $ 37535/parrot hash-2.pir 101 102 103 $ 39599/parrot hash-2.pir 101 102 103 $ 40185/parrot hash-2.pir Multiple Dispatch: No suitable candidate found for 'add_int', with signature 'PIP->P' current instr.: 'main' pc 24 (hash-2.pir:12) $ trunk/parrot hash-2.pir Multiple Dispatch: No suitable candidate found for 'add_int', with signature 'PIP->P' current instr.: 'main' pc 24 (hash-2.pir:13) $
The underlying problem appears to be that starting with the 1.4.0 release, hash iterators began returning HashIteratorKey PMCs instead of String PMCs:
$ cat hash-3.pir .sub 'main' .local pmc hash, hash_it hash = new ['Hash'] hash['1'] = 'a' hash['2'] = 'b' hash['3'] = 'c' hash_it = iter hash loop: unless hash_it goto done $P0 = shift hash_it $P1 = typeof $P0 say $P1 goto loop done: .end $ 37535/parrot hash-3.pir String String String $ 39599/parrot hash-3.pir String String String $ 40185/parrot hash-3.pir HashIteratorKey HashIteratorKey HashIteratorKey $ trunk/parrot hash-3.pir HashIteratorKey HashIteratorKey HashIteratorKey $
It seems to me that a change of this sort should have been preceded by a deprecation notice -- as far as I can tell no such notice was given. Regardless, returning a HashIteratorKey PMC would seem to be the least usable or useful of any of the options available.
Pm