[svn:parrot] r44893 - in trunk/src: . pmc
chromatic at svn.parrot.org
chromatic at svn.parrot.org
Fri Mar 12 03:38:59 UTC 2010
Author: chromatic
Date: Fri Mar 12 03:38:36 2010
New Revision: 44893
URL: https://trac.parrot.org/parrot/changeset/44893
Log:
[MMD] Moved the logic for calculating the MMD type tuple from
Parrot_mmd_find_multi_from_sig_obj() into the CallContext PMC's get_pmc VTABLE,
as walking through CallContext's positionals to serialize them into a STRING
then walking through that STRINg to create a RIA was awfully silly. This gives
a modest but measurable speed improvement to MMD-heavy code.
Modified:
trunk/src/multidispatch.c
trunk/src/pmc/callcontext.pmc
Modified: trunk/src/multidispatch.c
==============================================================================
--- trunk/src/multidispatch.c Fri Mar 12 02:24:37 2010 (r44892)
+++ trunk/src/multidispatch.c Fri Mar 12 03:38:36 2010 (r44893)
@@ -1,5 +1,5 @@
/*
-Copyright (C) 2003-2009, Parrot Foundation.
+Copyright (C) 2003-2010, Parrot Foundation.
$Id$
=head1 NAME
@@ -456,82 +456,7 @@
Parrot_mmd_build_type_tuple_from_sig_obj(PARROT_INTERP, ARGIN(PMC *sig_obj))
{
ASSERT_ARGS(Parrot_mmd_build_type_tuple_from_sig_obj)
- PMC * const type_tuple = Parrot_pmc_new(interp, enum_class_ResizableIntegerArray);
- STRING *string_sig = VTABLE_get_string(interp, sig_obj);
- INTVAL args_ended = 0;
- INTVAL i, seen_invocant = 0;
- INTVAL sig_len;
-
- if (STRING_IS_NULL(string_sig)) {
- Parrot_ex_throw_from_c_args(interp, NULL, 1,
- "Call has no signature, unable to dispatch.\n");
- }
-
- sig_len = Parrot_str_byte_length(interp, string_sig);
-
- for (i = 0; i < sig_len; ++i) {
- INTVAL type = Parrot_str_indexed(interp, string_sig, i + seen_invocant);
- if (args_ended)
- break;
-
- /* Regular arguments just set the value */
- switch (type) {
- case 'I':
- VTABLE_set_integer_keyed_int(interp, type_tuple,
- i, enum_type_INTVAL);
- break;
- case 'N':
- VTABLE_set_integer_keyed_int(interp, type_tuple,
- i, enum_type_FLOATVAL);
- break;
- case 'S':
- {
- INTVAL type_lookahead = Parrot_str_indexed(interp, string_sig, (i + 1));
- if (type_lookahead == 'n') {
- args_ended = 1;
- break;
- }
- VTABLE_set_integer_keyed_int(interp, type_tuple,
- i, enum_type_STRING);
- break;
- }
- case 'P':
- {
- INTVAL type_lookahead = Parrot_str_indexed(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: only the first argument can be an invocant");
- seen_invocant = 1;
- }
- else if (type_lookahead == 'f') {
- args_ended = 1;
- break;
- }
- 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;
- }
- case '-':
- args_ended = 1;
- break;
- default:
- Parrot_ex_throw_from_c_args(interp, NULL,
- EXCEPTION_INVALID_OPERATION,
- "Multiple Dispatch: invalid argument type %c!", type);
- }
- }
-
- return type_tuple;
+ return VTABLE_get_pmc(interp, sig_obj);
}
Modified: trunk/src/pmc/callcontext.pmc
==============================================================================
--- trunk/src/pmc/callcontext.pmc Fri Mar 12 02:24:37 2010 (r44892)
+++ trunk/src/pmc/callcontext.pmc Fri Mar 12 03:38:36 2010 (r44893)
@@ -687,12 +687,55 @@
GET_ATTR_type_tuple(INTERP, SELF, type_tuple);
if (PMC_IS_NULL(type_tuple)) {
- type_tuple = Parrot_mmd_build_type_tuple_from_sig_obj(INTERP, SELF);
+ Pcc_cell *c;
+ INTVAL num_positionals;
+ INTVAL i = 0;
+
+ GET_ATTR_positionals(INTERP, SELF, c);
+ GET_ATTR_num_positionals(INTERP, SELF, num_positionals);
+
+ type_tuple = Parrot_pmc_new_init_int(interp,
+ enum_class_ResizableIntegerArray, num_positionals);
+
+ while (c) {
+ switch (CELL_TYPE_MASK(c)) {
+ case INTCELL:
+ VTABLE_set_integer_keyed_int(interp, type_tuple,
+ i, enum_type_INTVAL);
+ break;
+ case FLOATCELL:
+ VTABLE_set_integer_keyed_int(interp, type_tuple,
+ i, enum_type_FLOATVAL);
+ break;
+ case STRINGCELL:
+ VTABLE_set_integer_keyed_int(interp, type_tuple,
+ i, enum_type_STRING);
+ break;
+ case PMCCELL:
+ {
+ PMC *pmc_arg = CELL_PMC(c);
+ 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;
+ }
+ default:
+ Parrot_ex_throw_from_c_args(interp, NULL,
+ EXCEPTION_INVALID_OPERATION,
+ "Multiple Dispatch: invalid argument type!");
+ }
+
+ i++;
+ c = NEXT_CELL(c);
+ }
+
SET_ATTR_type_tuple(INTERP, SELF, type_tuple);
}
return type_tuple;
-
}
/*
More information about the parrot-commits
mailing list