# New Ticket Created by "Alek Storm" # Please include the string: [perl #42919] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=42919 >
Because PIR can't tell the difference between invoking an object PMC and invoking a sub PMC, it doesn't generate a correct set_args when an object is invoked. Since the 'invoke' override is a method, it expects the current object to be the first parameter. There are currently two workarounds: pass the current object explicitly as the first parameter, or don't declare 'invoke' as a :method. The first is inconvenient and unintuitive, and the second means 'invoke' doesn't get access to its own object. Example code for bug: .sub _ :main $P0 = newclass "Foo" $P1 = new "Foo" $P1("bar") .end .namespace ["Foo"] .sub 'invoke' :method :vtable .param string bar say bar self.'baz'() .end .sub 'baz' :method say "baz" .end Output: too few arguments passed (1) - 2 params expected current instr.: 'parrot;Foo;invoke' pc 16 (/home/alek/test2.pir:8) called from Sub '_' pc 11 (/home/alek/test2.pir:4) I've attached a patch that fixes this by grabbing the args signature inside delegate.invoke() and unshifting an arg of type PARROT_ARG_PMC | PARROT_ARG_OBJECT. It also modifies src/inter_call.c to handle this by setting the arg equal to interp->current_object, and enums.h to add the new argument flag. The tests in t/pmc/parrotobject.t have been changed to include :method on the 'invoke' overrides, and to remove the test for #41732, which is no longer applicable. -- Alek Storm
invoke.patch
Description: Binary data
invoke_tests.patch
Description: Binary data