# New Ticket Created by  Bram Geron 
# Please include the string:  [perl #41583]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=41583 >


---
osname= linux
osvers= 2.6.18.3
arch=   i486-linux-gnu-thread-multi
cc=     cc
---
Flags:
    category=core
    severity=medium
    ack=no
---
Tail calls from within v-table methods are broken, the tail-called sub
(or method) will not return correct values.

When method A tailcalls sub B, B's set_returns stores its opcode
number (and with it, which registers should be returned), but the
low-level vtable code gets the registers from A's context.
(Runops_args stores a pointer to A's context just before it is called,
wrongly assuming A has the final set_returns. Runops_args returns the
context to a function that then does return value passing on it.)

Maybe the solution is to store the current context in a new field in
the interp structure; I don't know, I'm rather bad at C.

Example:
This should print 2, but it prints 13.

-----

.sub main :main
    $P1 = newclass "Foo"
    $P2 = new "Foo"

    ## Should return 2, but doesn't.
    $I1 = elements $P2
    $S1 = $I1
    say $S1
.end

.namespace ["Foo"]

.sub elements :method :vtable
    I0 = 13
    I1 = 2
    .return identity(I1)
.end

.sub identity
    .param int arg
    ## arg is I0, taken from the elements context (which is set
    ## to 13). If we put "I0 = 14" here and don't optimize, we
    ## return 2. (elements's context's I1)
    .return (arg)
.end

-----

This happens in svn head.

Regards,
Bram Geron.

---
Summary of my parrot 0.4.8 (r16890) configuration:
  configdate='Sat Feb 10 16:50:38 2007'
  Platform:
    osname=linux, archname=i486-linux-gnu-thread-multi
    jitcapable=1, jitarchname=i386-linux,
    jitosname=LINUX, jitcpuarch=i386
    execcapable=1
    perl=/usr/bin/perl
  Compiler:
    cc='cc', ccflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS
-DDEBIAN  -pipe -I/usr/local/include -D_LARGEFILE_SOURCE
-D_FILE_OFFSET_BITS=64 -I /usr/include',
  Linker and Libraries:
    ld='cc', ldflags=' -L/usr/local/lib',
    cc_ldflags='',
    libs='-ldl -lm -lpthread -lcrypt -lrt -lgmp -lreadline -lncurses'
  Dynamic Linking:
    share_ext='.so', ld_share_flags='-shared -L/usr/local/lib -fPIC',
    load_ext='.so', ld_load_flags='-shared -L/usr/local/lib -fPIC'
  Types:
    iv=long, intvalsize=4, intsize=4, opcode_t=long, opcode_t_size=4,
    ptrsize=4, ptr_alignment=1 byteorder=1234,
    nv=double, numvalsize=8, doublesize=8

---
Environment:
    HOME    LANG    LANGUAGE    LD_LIBRARY_PATH    LOGDIR    PATH   SHELL

Reply via email to