Author: Whiteknight
Date: Sat Nov  8 17:50:03 2008
New Revision: 32459

Modified:
   branches/calling_conventions/src/multidispatch.c

Log:
[calling_conventions] Fix the new "i" invocant adverb modifier to actually be 
in the right place

Modified: branches/calling_conventions/src/multidispatch.c
==============================================================================
--- branches/calling_conventions/src/multidispatch.c    (original)
+++ branches/calling_conventions/src/multidispatch.c    Sat Nov  8 17:50:03 2008
@@ -570,14 +570,14 @@
     ARGIN(const char *sig), va_list args)
 {
     INTVAL i;
-    INTVAL in_return_sig    = 0;
-    PMC   *returns          = PMCNULL;
-    PMC   *call_object      = pmc_new(interp, enum_class_CallSignature);
-    PMC * const type_tuple  = pmc_new(interp, enum_class_FixedIntegerArray);
-    INTVAL sig_len          = strlen(sig);
-    STRING *s_sig           = string_from_cstring(interp, sig, sig_len);
-    STRING *string_sig      = NULL;
-    INTVAL has_invocant     = 0;
+    INTVAL in_return_sig     = 0;
+    PMC    *returns          = PMCNULL;
+    PMC    *call_object      = pmc_new(interp, enum_class_CallSignature);
+    PMC    *const type_tuple = pmc_new(interp, enum_class_FixedIntegerArray);
+    INTVAL  sig_len          = strlen(sig);
+    STRING *s_sig            = string_from_cstring(interp, sig, sig_len);
+    STRING *string_sig       = NULL;
+    INTVAL  has_invocant     = 0;
 
     /* Protect call signature object from collection. */
     dod_register_pmc(interp, call_object);
@@ -588,9 +588,9 @@
     if (PMC_IS_NULL(obj))
         string_sig = s_sig;
     else {
-        STRING *invocant_sig = CONST_STRING(interp, "P");
+        STRING *invocant_sig = CONST_STRING(interp, "Pi");
         string_sig = string_concat(interp, invocant_sig, s_sig, 0);
-        sig_len = sig_len + 1;
+        sig_len = sig_len + 2;
         has_invocant = 1;
     }
 
@@ -681,6 +681,14 @@
                     VTABLE_push_pmc(interp, call_object, pmc_arg);
                     break;
                 }
+                case 'i':
+                    if (i != 1)
+                        Parrot_ex_throw_from_c_args(interp, NULL,
+                            EXCEPTION_INVALID_OPERATION,
+                            "Multiple Dispatch: 'i' adverb modifier may only 
be used on the invocant");
+                    /* I don't think we need to do any additional
+                       processing here. */
+                    break;
                 case '-':
                     i++; /* skip '>' */
                     in_return_sig = 1;

Reply via email to