On Wed Nov 21 07:45:53 2007, [EMAIL PROTECTED] wrote:
> Setting the :vtable pragma on a sub should enable the 'self' shortcut 
> for the current invocant. As in the following code example where a 
> method is called from within a vtable override:
> 
>    .sub main :main
>      $P1 = newclass "Foo"
>      $P2 = new "Foo"
>      $S1 = $P2
>      print $S1
>    .end
> 
>    .namespace [ "Foo" ]
> 
>    .sub get_string :vtable
>      self.'bar'()
>      .return ("stringy thingy\n")
>    .end
> 
>    .sub bar :method
>      print "called bar\n"
>    .end
> 
> (Pulled from rejected ticket #42430.)
> 
> Allison

Attached is a patch that does almost the right thing. It allows "self"
to be used in functions marked :vtable, not just functions marked
:method or ":vtable :method". However, the example above does not work.
The call to self.'bar'() triggers a "null PMC access in find_method()"
error. Without that method invocation, there is no error, and the
function works as expected (prints "stringy thingy").

I assume the :method invocation changes the PMC type of the self
parameter, or adds some kind of class field to it that isn't there
otherwise. I don't know enough about PCC internals to fix this part of
the problem, although I will keep looking at it.

--Andrew Whitworth


Index: compilers/imcc/imcc.l
===================================================================
--- compilers/imcc/imcc.l	(revision 28866)
+++ compilers/imcc/imcc.l	(working copy)
@@ -557,7 +557,8 @@
                 (r = IMCC_INFO(interp)->cur_unit->instructions->symregs[0]) &&
                 r->pcc_sub)
             {
-                if ((r->pcc_sub->pragma & P_METHOD) &&
+                if (((r->pcc_sub->pragma & P_METHOD) ||
+                     (IMCC_INFO(interp)->cur_unit->is_vtable_method)) &&
                     !strcmp(yytext, "self")) {
                     valp->sr = mk_ident(interp, "self", 'P');
                     IMCC_INFO(interp)->cur_unit->type |= IMC_HAS_SELF;

Reply via email to