could one of you take a look at this for me? i've started digging into
the pmc2c code, but it'll be a long while before i grok it. since you
two have an understanding of that code already, perhaps something will
jump out at you.

~jerry

---------- Forwarded message ----------
From: jerry gay <[EMAIL PROTECTED]>
Date: Apr 23, 2007 12:26 PM
Subject: [BUG] method overload in pir subclass of pmc pccmethod leaves
object undefined
To: parrotbug <[EMAIL PROTECTED]>


while creating a subclass of Exporter to test inter-language exports,
i stumbled across a bug that i can't seem to fix.

i've created a subclass of Exporter called MyExporter. MyExporter has
an overridden 'add_global' method, which adds a '&' sigil to each
global specified by the user and calls the method in the superclass.

i've also created a high-level language that uses the '&' sigil on
subs, and i import and aim to call the hll sub. however, the code
never finishes 'add_method', as it segfaults inside the supermethod
with an undefined 'exp' object. that is, from src/pmc/exporter.pmc,
line 260:

       Parrot_Exporter *exp = PARROT_EXPORTER(SELF);

after this line, 'exp' is NULL, but 'SELF' (or after macro expansion
'pmc') is not. this is not the case when 'add_method' has not been
overridden. here's the pir code that exposes the bug:

.sub 'main' :main
   .local pmc exp, ns

   exp = new 'MyExporter'

   ns = get_root_namespace ['foo']
   exp.'source'( ns )

   exp.'add_global'('bar')

say "NEVER REACHES HERE"

   exp.'import'()

   '&bar'() ## THIS WILL SUCCEED!
    'bar'() ## THIS WILL FAIL!
            ## THAT'S NOT WHAT I WANT!!!
.end


## create a subclass of Exporter that overrides 'add_global'
## it adds a '&' sigil to each requested global
.namespace ['MyExporter']
.sub 'onload' :load :init :anon
   .local pmc class
   class = subclass 'Exporter', 'MyExporter'
   .return ()
.end


.sub 'add_global' :method
   .param string glb      :optional
   .param int    has_glb  :opt_flag

   .local pmc args, super
   args = new .Hash
   super = new .Super, self

   unless has_glb goto no_global
   glb = concat '&', glb
   .return super.'add_global'( glb )
 no_global:
   .return super.'add_global'()
.end


# create a high-level language that uses '&' sigil for sub names
.HLL 'foo', ''
.sub '&bar'
   say 'hello, world!'
.end


note that switching from a tail method call to a regular method call
has no effect.

also note that my code also exposes a problem with the current
Exporter implementation: the imported sub name does not match the
requested name. i have yet to address this as the current bug is
blocking progress.

~jerry

Reply via email to