develooper Front page | perl.cvs.parrot | Postings from December 2008

[svn:parrot] r33475 - trunk/languages/perl6/src/pmc

From:
jonathan
Date:
December 3, 2008 16:56
Subject:
[svn:parrot] r33475 - trunk/languages/perl6/src/pmc
Message ID:
20081204005558.8170ECB9AF@x12.develooper.com
Author: jonathan
Date: Wed Dec  3 16:55:57 2008
New Revision: 33475

Modified:
   trunk/languages/perl6/src/pmc/perl6multisub.pmc

Log:
[rakudo] When we have an ambiguous dispatch, report the signatures of the candidates that were ambiguous.

Modified: trunk/languages/perl6/src/pmc/perl6multisub.pmc
==============================================================================
--- trunk/languages/perl6/src/pmc/perl6multisub.pmc	(original)
+++ trunk/languages/perl6/src/pmc/perl6multisub.pmc	Wed Dec  3 16:55:57 2008
@@ -559,9 +559,24 @@
                     VTABLE_get_string(interp, candidates[0]->sub));
         }
         else {
+            /* Get signatures of ambiguous candidates. */
+            STRING *sig_name = CONST_STRING(interp, "signature");
+            STRING *perl_name = CONST_STRING(interp, "perl");
+            STRING *newline = CONST_STRING(interp, "\n");
+            STRING *signatures = string_from_cstring(interp, "", 0);
+            for (i = 0; i < possibles_count; i++) {
+                PMC    *sig_meth  = VTABLE_find_method(interp, possibles[i]->sub, sig_name);
+                PMC    *sig_obj   = (PMC *)Parrot_run_meth_fromc_args(interp, sig_meth,
+                        possibles[i]->sub, sig_name, "P");
+                PMC    *perl_meth = VTABLE_find_method(interp, sig_obj, perl_name);
+                STRING *sig_perl  = (STRING *)Parrot_run_meth_fromc_args(interp, perl_meth,
+                        sig_obj, perl_name, "S");
+                signatures = string_append(interp, signatures, sig_perl);
+                signatures = string_append(interp, signatures, newline);
+            }
             Parrot_ex_throw_from_c_args(interp, next, 1,
-                "Ambiguous dispatch to multi '%Ss'",
-                    VTABLE_get_string(interp, candidates[0]->sub));
+                "Ambiguous dispatch to multi '%Ss'. Ambiguous candidates had signatures:\n%Ss",
+                    VTABLE_get_string(interp, candidates[0]->sub), signatures);
         }
     }
     else {



nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About