Ticket #701 (closed bug: invalid)

Opened 5 years ago

Last modified 5 years ago

PAST: Parameter Var in viviself causes duplicate parameter allocation

Reported by: Austin_Hastings Owned by: pmichaud
Priority: minor Milestone:
Component: PCT Version: 1.2.0
Severity: high Keywords: past,parameter,variable
Cc: Language:
Patch status: Platform: linux

Description (last modified by bacek) (diff)

Creating a PAST tree containing a parameter variable and a second variable that uses the parameter in viviself for initialization causes the generation of code that allocates the parameter (at least) twice.

As best as I can tell, the problem is pretty straightforward. The viviself code calls the 'as_post'(_, Var) multimethod, which when it sees a scope of parameter jumps to a method that outputs the declaration a second time (the first time was because I put a node in the block). I suspect checking isdecl() in the viviself would fix it, but maybe it should be in 'parameter'?

Details:

This code (written in 'close'):

extern void demo(pmc args) {
    lexical pmc list = args;
}

Produces this PIR:

.namespace []
.sub "demo"  :subid("12_1243147960")
    .param pmc param_22
    .param pmc param_23
.annotate "line", 21
    .lex "args", param_22
.annotate "line", 22
    .lex "args", param_23
    .lex "list", param_23
.annotate "line", 21
    .return (param_23)
.end

By way of this PAST:

        [2] => PMC 'PAST;Block'  {
            <blocktype> => "declaration"
            <name> => "demo"
            <source> => \past
            <pos> => 347
            <symtable> => Hash {
                "args" => Hash {
                    "decl" => PMC 'PAST;Var'  {
                        <isdecl> => 1
                        <source> => \past
                        <pos> => 364
                        <pirflags> => ""
                        <scope> => "parameter"
                        <rtype> => "P"
                        <name> => "args"
                    }
                },
                "list" => Hash {
                    "decl" => PMC 'PAST;Var'  {
                        <isdecl> => 1
                        <source> => \past
                        <pos> => 380
                        <pirflags> => ""
                        <scope> => "lexical"
                        <rtype> => "P"
                        <name> => "list"
                        <viviself> => PMC 'PAST;Var'  {
                            <source> => \past
                            <pos> => 399
                            <name> => "args"
                            <scope> => \past["args"]["decl"]
                        }
                    }
                }
            }
            <params> => null
            <namespace> => undef
            <pirflags> => ""
            <rtype> => "v"
            [0] => \past["args"]["decl"]
            [1] => PMC 'PAST;Stmts'  {
                <name> => "compound_stmt"
                <rtype> => undef
                [0] => \past["list"]["decl"]
            }
        }

Change History

Changed 5 years ago by bacek

  • description modified (diff)

Changed 5 years ago by bacek

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

Issue was resolved on #parrot channel. Resolving ticket as invalid.

Note: See TracTickets for help on using tickets.