[svn:parrot] r49361 - in branches/generational_gc/lib/Parrot/Pmc2c: . PMC

bacek at svn.parrot.org bacek at svn.parrot.org
Tue Sep 28 09:46:05 UTC 2010


Author: bacek
Date: Tue Sep 28 09:46:05 2010
New Revision: 49361
URL: https://trac.parrot.org/parrot/changeset/49361

Log:
Generate more wb vtables.

Modified:
   branches/generational_gc/lib/Parrot/Pmc2c/PMC/WB.pm
   branches/generational_gc/lib/Parrot/Pmc2c/PMCEmitter.pm

Modified: branches/generational_gc/lib/Parrot/Pmc2c/PMC/WB.pm
==============================================================================
--- branches/generational_gc/lib/Parrot/Pmc2c/PMC/WB.pm	Tue Sep 28 09:45:45 2010	(r49360)
+++ branches/generational_gc/lib/Parrot/Pmc2c/PMC/WB.pm	Tue Sep 28 09:46:05 2010	(r49361)
@@ -67,13 +67,14 @@
         }
     }
 
+    my $pmcname = $parent->name;
     foreach my $vt_method ( @{ $self->vtable->methods } ) {
         my $name = $vt_method->name;
 
-        # Generate WB variant only if we override method constantness
-        # with ":write"
-        next unless $parent->{has_method}{$name}
-                    && $parent->vtable_method_does_write($name);
+        #warn "$pmcname $name\n";
+        # Generate WB variant 
+        next unless exists $parent->{has_method}{$name};
+        #&& $parent->vtable_method_does_write($name);
 
         # Get parameters.      strip type from param
         my $parameters = join ', ',
@@ -90,13 +91,14 @@
                 type        => Parrot::Pmc2c::Method::VTABLE,
             }
         );
-        my $pmcname = $parent->name;
         my $ret     = return_statement($method);
         my $body    = <<"EOC";
         /* Switch vtable here and redispatch to original method */
-        VTABLE *t = _self->vtable->wb_variant_vtable;
-        _self->vtable->wb_variant_vtable = _self->vtable;
-        _self->vtable = t;
+        VTABLE *t = _self->vtable;
+        PARROT_ASSERT(_self->vtable != _self->vtable->wb_variant_vtable);
+        _self->vtable = _self->vtable->wb_variant_vtable;
+        _self->vtable->wb_variant_vtable = t;
+        PARROT_ASSERT(_self->vtable != _self->vtable->wb_variant_vtable);
         Parrot_gc_write_barrier(interp, _self);
         return _self->vtable->$name(interp, _self $parameters);
 EOC

Modified: branches/generational_gc/lib/Parrot/Pmc2c/PMCEmitter.pm
==============================================================================
--- branches/generational_gc/lib/Parrot/Pmc2c/PMCEmitter.pm	Tue Sep 28 09:45:45 2010	(r49360)
+++ branches/generational_gc/lib/Parrot/Pmc2c/PMCEmitter.pm	Tue Sep 28 09:46:05 2010	(r49361)
@@ -815,15 +815,8 @@
     $vtable_updates = '';
     foreach my $name ( @{ $self->vtable->names} ) {
         next unless exists $self->{has_method}{$name};
-        if ($self->vtable_method_does_write($name)) {
-            # If we override constantness status of vtable
-            if (!$self->vtable->attrs($name)->{write}) {
-                $vtable_updates .= "    vt->$name = Parrot_${classname}_wb_${name};\n";
-            }
-        }
-        else {
-            $vtable_updates .= "    vt->$name = Parrot_${classname}_${name};\n";
-        }
+        next if $name =~ m{ ^init }xo;
+        $vtable_updates .= "    vt->$name = Parrot_${classname}_wb_${name};\n";
     }
 
     $vtable_updates .= $set_attr_size;


More information about the parrot-commits mailing list