Author: Whiteknight
Date: Sun Nov 30 09:52:32 2008
New Revision: 33374
Modified:
branches/call_conv_redux/src/multidispatch.c
Log:
[call_conv_redux] update Parrot_mmd_build_type_tuple_from_sig_obj
Modified: branches/call_conv_redux/src/multidispatch.c
==============================================================================
--- branches/call_conv_redux/src/multidispatch.c (original)
+++ branches/call_conv_redux/src/multidispatch.c Sun Nov 30 09:52:32 2008
@@ -1338,15 +1338,24 @@
break;
case 'P':
{
- PMC *pmc_arg = VTABLE_get_pmc_keyed_int(interp, sig_obj, i);
- if (PMC_IS_NULL(pmc_arg))
- VTABLE_set_integer_keyed_int(interp, type_tuple,
- i, enum_type_PMC);
- else
- VTABLE_set_integer_keyed_int(interp, type_tuple, i,
- VTABLE_type(interp, pmc_arg));
+ INTVAL type_lookahead = string_index(interp, string_sig, (i +
1));
+ if (type_lookahead == 'i') {
+ if (i != 0)
+ Parrot_ex_throw_from_c_args(interp, NULL,
+ EXCEPTION_INVALID_OPERATION,
+ "Multiple Dispatch: 'i' adverb modifier may only
be used on the invocant");
+ }
+ else {
+ PMC *pmc_arg = VTABLE_get_pmc_keyed_int(interp, sig_obj,
i);
+ if (PMC_IS_NULL(pmc_arg))
+ VTABLE_set_integer_keyed_int(interp, type_tuple,
+ i, enum_type_PMC);
+ else
+ VTABLE_set_integer_keyed_int(interp, type_tuple, i,
+ VTABLE_type(interp, pmc_arg));
- break;
+ break;
+ }
}
case '-':
args_ended = 1;