Ticket #1431 (closed bug: fixed)

Opened 5 years ago

Last modified 5 years ago

Register assigned to .local string variable is mis-remembered

Reported by: Austin_Hastings Owned by:
Priority: normal Milestone:
Component: none Version: 2.0.0
Severity: medium Keywords:
Cc: Language:
Patch status: Platform:

Description

Summary: A .local variable stored in S1 is referenced in a key constant as S0.

The following test code, when fed to parrot-nqp, produces an output file like the one attached (nqp-trace.out):

pir::trace(1);
P6metaclass.register('Exception');

Running this command will display the error:

parrot-nqp test.nqp 2>&1 | grep -A 4 'callmethodcc P., "methods"'

producing two blocks, the first of which is:

   311 callmethodcc P2, "methods"                                        P2=Class=PMC(0xb73f1840) 
   314 iter P9, P7                                        P9=PMCNULL P7=Hash=PMC(0xb6f788a0)
   317 unless P9, -18                                        P9=HashIterator=PMC(0xb6f788dc) 
   320 shift S1, P9                                        S1="(null)" P9=HashIterator=PMC(0xb6f788dc)
   323 set P3, P7[S0="PMCProxy"]                                        P3=PMCNULL P7=Hash=PMC(0xb6f788a0) 
   327 isa I0, P3, "NCI"                                        I0=0 P3=Sub=PMC(0xb73f03f0 pc:89) 
--

The problem is that offsets 320 and 323 refer to S1 and S0, when they should refer to the same register. The code in question is a part of the "add_parent" multisub in P6object.pir (~ line 263):

  method_loop:
    unless methoditer goto mro_loop
    .local string methodname
    .local pmc methodpmc
    methodname = shift methoditer
    methodpmc = methods[methodname]
    # don't add NCI methods (they don't work)
    $I0 = isa methodpmc, 'NCI'

In this case, the problem occurs with the local string variable methodname. Notice that methodname is shifted off methoditer and then used to index the methods hash.

Compiling to a .pbc and dumping the binary yields these lines (note that offset hex 0140 = decimal 320):

 0140:  00000347 00000001 00000009                            shift_s_p
 0143:  000003d1 00000003 00000007 00000049                   set_p_p_kc

I interpret that (possibly wrongly - someone please double-check me) as

shift S1, P9
set P3, P3[constant key x49]

The constants table contains (constant index 0x49 = decimal 73)

    # 73:
    [ 'PFC_KEY' (1 items)
       {
        FLAGS => 0x4141214 (private2,private4,is_PMC,external,on_free_list,custom_GC,needs_early_gc)
        TYPE        => S REGISTER
        DATA        => 0
       },
    ],

(which I am interpreting as [S0], per the trace output).

Attachments

nqp-trace.out Download (20.6 KB) - added by Austin_Hastings 5 years ago.
Full output of trace refered in text

Change History

Changed 5 years ago by Austin_Hastings

Full output of trace refered in text

Changed 5 years ago by coke

  • status changed from new to closed
  • resolution set to fixed

Austin - the 2 line NQP snippet no longer generates 'callmethodcc' in the output anywhere (using parrot-nqp).

I'm going to close this out, as I suspect this was with the old NQP, which is gone.

Please reopen if this is still an issue for you.

Thanks.

Note: See TracTickets for help on using tickets.