[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