#1253: [BUG] values returned from iterating a hash are no longer strings
(deprecation failure)
----------------------+-----------------------------------------------------
Reporter: pmichaud | Owner:
Type: bug | Status: new
Priority: major | Milestone:
Component: core | Version: 1.7.0
Severity: release | Keywords:
Lang: | Patch:
Platform: |
----------------------+-----------------------------------------------------
Description changed by pmichaud:
Old description:
> The following code worked in Parrot 1.0.0 (r37535) and Parrot 1.3.0
> (39599):
>
> {{{
> $ 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 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
New description:
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
--
--
Ticket URL: <https://trac.parrot.org/parrot/ticket/1253#comment:1>
Parrot <https://trac.parrot.org/parrot/>
Parrot Development
_______________________________________________
parrot-tickets mailing list
[email protected]
http://lists.parrot.org/mailman/listinfo/parrot-tickets