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

bacek at svn.parrot.org bacek at svn.parrot.org
Tue Sep 28 23:18:04 UTC 2010


Author: bacek
Date: Tue Sep 28 23:18:03 2010
New Revision: 49372
URL: https://trac.parrot.org/parrot/changeset/49372

Log:
Generate wb_variant_vtable in more sane way: get current vtable and update it using parent's wb_update_vtable

Modified:
   branches/generational_gc/lib/Parrot/Pmc2c/PMC/WB.pm
   branches/generational_gc/lib/Parrot/Pmc2c/PMC/default.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 23:17:09 2010	(r49371)
+++ branches/generational_gc/lib/Parrot/Pmc2c/PMC/WB.pm	Tue Sep 28 23:18:03 2010	(r49372)
@@ -73,8 +73,8 @@
 
         #warn "$pmcname $name\n";
         # Generate WB variant
-        next unless exists $parent->{has_method}{$name};
-        #&& $parent->vtable_method_does_write($name);
+        next unless exists $parent->{has_method}{$name}
+                    && $parent->vtable_method_does_write($name);
 
         # Get parameters.      strip type from param
         my $parameters = join ', ',

Modified: branches/generational_gc/lib/Parrot/Pmc2c/PMC/default.pm
==============================================================================
--- branches/generational_gc/lib/Parrot/Pmc2c/PMC/default.pm	Tue Sep 28 23:17:09 2010	(r49371)
+++ branches/generational_gc/lib/Parrot/Pmc2c/PMC/default.pm	Tue Sep 28 23:18:03 2010	(r49372)
@@ -150,6 +150,24 @@
 
 EOC
 
+    # Generate WB vtable for implemented non-updating methods
+    my $vtable_updates = '';
+    foreach my $name ( @{ $self->vtable->names} ) {
+        next unless exists $self->{has_method}{$name}
+                    && $self->vtable_method_does_write($name);
+        next if $name =~ m{ ^init }xo;
+        $vtable_updates .= "    vt->$name = Parrot_default_wb_${name};\n";
+    }
+
+    $cout .= <<"EOC";
+
+PARROT_EXPORT
+VTABLE *Parrot_default_wb_update_vtable(ARGMOD(VTABLE *vt)) {
+$vtable_updates
+    return vt;
+}
+
+EOC
     $cout;
 }
 

Modified: branches/generational_gc/lib/Parrot/Pmc2c/PMCEmitter.pm
==============================================================================
--- branches/generational_gc/lib/Parrot/Pmc2c/PMCEmitter.pm	Tue Sep 28 23:17:09 2010	(r49371)
+++ branches/generational_gc/lib/Parrot/Pmc2c/PMCEmitter.pm	Tue Sep 28 23:18:03 2010	(r49372)
@@ -814,7 +814,8 @@
     # Generate WB vtable for implemented non-updating methods
     $vtable_updates = '';
     foreach my $name ( @{ $self->vtable->names} ) {
-        next unless exists $self->{has_method}{$name};
+        next unless exists $self->{has_method}{$name}
+                    && $self->vtable_method_does_write($name);
         next if $name =~ m{ ^init }xo;
         $vtable_updates .= "    vt->$name = Parrot_${classname}_wb_${name};\n";
     }
@@ -995,14 +996,8 @@
 
 EOC
 
-    $get_extra_vtable = '';
-
-    if ($first_parent eq 'default') {
-        $get_extra_vtable .= "    vt = Parrot_default_wb_get_vtable(interp);\n";
-    }
-    else {
-        $get_extra_vtable .= "    vt = Parrot_${first_parent}_wb_get_vtable(interp);\n";
-    }
+    $get_extra_vtable .= "    vt = Parrot_${classname}_get_vtable(interp);\n";
+    #$get_extra_vtable .= "    Parrot_${first_parent}_wb_update_vtable(interp);\n";
 
     foreach my $parent_name ( @other_parents ) {
         $get_extra_vtable .= "    Parrot_${parent_name}_wb_update_vtable(vt);\n";


More information about the parrot-commits mailing list