[svn:parrot] r38762 - in trunk: include/parrot lib/Parrot/Pmc2c src
chromatic at svn.parrot.org
chromatic at svn.parrot.org
Wed May 13 23:59:32 UTC 2009
Author: chromatic
Date: Wed May 13 23:59:32 2009
New Revision: 38762
URL: https://trac.parrot.org/parrot/changeset/38762
Log:
[MMD] Added the appropriate namespace name to the multi_func_list structure
used to initialize MULTIs defined in PMCs. This moves yet another bit of
runtime initialization to compile-time and speeds up Parrot startup by some 7%.
Modified:
trunk/include/parrot/multidispatch.h
trunk/lib/Parrot/Pmc2c/PMCEmitter.pm
trunk/src/multidispatch.c
Modified: trunk/include/parrot/multidispatch.h
==============================================================================
--- trunk/include/parrot/multidispatch.h Wed May 13 23:39:55 2009 (r38761)
+++ trunk/include/parrot/multidispatch.h Wed May 13 23:59:32 2009 (r38762)
@@ -51,6 +51,7 @@
STRING *multi_name;
STRING *short_sig;
STRING *full_sig;
+ STRING *ns_name;
funcptr_t func_ptr;
} multi_func_list;
Modified: trunk/lib/Parrot/Pmc2c/PMCEmitter.pm
==============================================================================
--- trunk/lib/Parrot/Pmc2c/PMCEmitter.pm Wed May 13 23:39:55 2009 (r38761)
+++ trunk/lib/Parrot/Pmc2c/PMCEmitter.pm Wed May 13 23:59:32 2009 (r38762)
@@ -404,10 +404,11 @@
foreach my $method ( @{ $self->methods } ) {
next unless $method->is_multi;
- my $short_sig = $method->{MULTI_short_sig};
- my $full_sig = $pmcname . "," . $method->{MULTI_full_sig};
+ my $short_sig = $method->{MULTI_short_sig};
+ my $full_sig = $pmcname . "," . $method->{MULTI_full_sig};
my $functionname = 'Parrot_' . $pmcname . '_' . $method->name;
- push @multi_names, [ $method->symbol, $short_sig, $full_sig, $functionname ];
+ push @multi_names, [ $method->symbol, $short_sig, $full_sig,
+ $pmcname, $functionname ];
}
return ( \@multi_names );
}
@@ -520,11 +521,14 @@
my $cache = {};
for my $multi (@$multi_funcs) {
- my ($name, $ssig, $fsig, $func) = @$multi;
- my ($name_str, $ssig_str, $fsig_str) =
- map { gen_multi_name($_, $cache) } ($name, $ssig, $fsig);
-
- for my $s ([$name, $name_str], [$ssig, $ssig_str], [$fsig,$fsig_str]) {
+ my ($name, $ssig, $fsig, $ns, $func) = @$multi;
+ my ($name_str, $ssig_str, $fsig_str, $ns_name) =
+ map { gen_multi_name($_, $cache) } ($name, $ssig, $fsig, $ns);
+
+ for my $s ([$name, $name_str],
+ [$ssig, $ssig_str],
+ [$fsig, $fsig_str],
+ [$ns, $ns_name ]) {
my ($raw_string, $name) = @$s;
next if $strings_seen{$name}++;
$multi_strings .= " STRING *$name = "
@@ -535,6 +539,7 @@
{ $name_str,
$ssig_str,
$fsig_str,
+ $ns_name,
(funcptr_t) $func }
END_MULTI_LIST
Modified: trunk/src/multidispatch.c
==============================================================================
--- trunk/src/multidispatch.c Wed May 13 23:39:55 2009 (r38761)
+++ trunk/src/multidispatch.c Wed May 13 23:59:32 2009 (r38762)
@@ -1344,8 +1344,7 @@
STRING *sub_name = mmd_info[i].multi_name;
STRING *long_sig = mmd_info[i].full_sig;
STRING *short_sig = mmd_info[i].short_sig;
- PMC *type_list = Parrot_str_split(interp, CONST_STRING(interp, ","), long_sig);
- STRING *ns_name = VTABLE_get_string_keyed_int(interp, type_list, 0);
+ STRING *ns_name = mmd_info[i].ns_name;
/* Create an NCI sub for the C function */
PMC *sub_obj = constant_pmc_new(interp, enum_class_NCI);
More information about the parrot-commits
mailing list