# New Ticket Created by Bram Geron
# Please include the string: [perl #44471]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=44471 >
:vtable subs are not stored in the vtable slot of a namespace when :anon
is set. This is because :anon blocks the sub from reaching the namespace:
src/global.c: (Parrot_store_sub_in_namespace)
613 else if (!(PObj_get_FLAGS(sub) & SUB_FLAG_PF_ANON)) {
... ...
617 Parrot_store_global_n(interp, ns, name, sub);
Parrot_store_global_n calls namespace->set_pmc_keyed_str, which also
checks if subs are :anon, so the check in Parrot_store_sub_in_namespace
seems to be unnecessary. If we remove it, :vtable :anon works.
This patch removes the check in Parrot_store_sub_in_namespace, and
there's a test too. Created t/compilers/imcc/syn/sub.t for that.
src/global.c | 5 +++--
t/compilers/imcc/syn/sub.t | 36 ++++++++++++++++++++++++++++++++++++
2 files changed, 39 insertions(+), 2 deletions(-)
--
Bram Geron | GPG 0xE7B9E65E
diff --git a/src/global.c b/src/global.c
index 29b9b30..fe4bf75 100644
--- a/src/global.c
+++ b/src/global.c
@@ -609,8 +609,9 @@ Parrot_store_sub_in_namespace(PARROT_INTERP, NOTNULL(PMC *sub))
/* store a :multi sub */
if (!PMC_IS_NULL(PMC_sub(sub)->multi_signature))
store_sub_in_multi(interp, sub, ns);
- /* store other subs (as long as they're not :anon) */
- else if (!(PObj_get_FLAGS(sub) & SUB_FLAG_PF_ANON)) {
+ /* store other subs (as long as they're not :anon, but the namespace will
+ * detect that) */
+ else {
STRING * const name = PMC_sub(sub)->name;
PMC * const nsname = PMC_sub(sub)->namespace_name;
diff --git a/t/compilers/imcc/syn/sub.t b/t/compilers/imcc/syn/sub.t
new file mode 100644
index 0000000..91bc06e
--- /dev/null
+++ b/t/compilers/imcc/syn/sub.t
@@ -0,0 +1,36 @@
+#!perl
+# Copyright (C) 2005, The Perl Foundation.
+# $Id$
+
+use strict;
+use warnings;
+use lib qw( . lib ../lib ../../lib );
+use Parrot::Test tests => 1;
+
+##############################
+
+pir_output_is( <<'CODE', <<'OUTPUT', ":anon :vtable should work" );
+.sub main :main
+ $P0 = newclass "Foo"
+ $P0 = new "Foo"
+ $I0 = $P0
+ $S0 = $I0
+ say $S0
+.end
+
+.namespace ["Foo"]
+
+.sub get_integer :vtable :anon
+ .return (42)
+.end
+CODE
+42
+OUTPUT
+
+
+# Local Variables:
+# mode: cperl
+# cperl-indent-level: 4
+# fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4: