[svn:parrot] r38445 - branches/tt528_vtinit/lib/Parrot/Pmc2c

cotto at svn.parrot.org cotto at svn.parrot.org
Sat May 2 11:38:22 UTC 2009


Author: cotto
Date: Sat May  2 11:38:21 2009
New Revision: 38445
URL: https://trac.parrot.org/parrot/changeset/38445

Log:
[pmc2c] generate an (unused) update_vtable function for each PMC

Modified:
   branches/tt528_vtinit/lib/Parrot/Pmc2c/PMCEmitter.pm

Modified: branches/tt528_vtinit/lib/Parrot/Pmc2c/PMCEmitter.pm
==============================================================================
--- branches/tt528_vtinit/lib/Parrot/Pmc2c/PMCEmitter.pm	Sat May  2 10:56:18 2009	(r38444)
+++ branches/tt528_vtinit/lib/Parrot/Pmc2c/PMCEmitter.pm	Sat May  2 11:38:21 2009	(r38445)
@@ -103,9 +103,10 @@
 =cut
 
 sub generate_h_file {
-    my ($self) = @_;
-    my $h      = $self->{emitter};
-    my $name   = uc $self->name;
+    my ($self)  = @_;
+    my $h       = $self->{emitter};
+    my $name    = uc $self->name;
+    my $lc_name = $self->name;
 
     $h->emit( dont_edit( $self->filename ) );
     $h->emit(<<"EOH");
@@ -120,6 +121,7 @@
     $h->emit( $self->{ro}->hdecls ) if ( $self->{ro} );
     $self->gen_attributes;
     $h->emit(<<"EOH");
+    PARROT_EXPORT VTABLE * Parrot_${lc_name}_update_vtable(VTABLE *);
 
 #endif /* PARROT_PMC_${name}_H_GUARD */
 
@@ -715,6 +717,22 @@
     } /* pass */
 } /* Parrot_${classname}_class_init */
 EOC
+
+    my $vtable_updates = '';
+    for my $name ( @{ $self->vtable->names } ) {
+        if (exists $self->{has_method}{$name}) {
+            $vtable_updates .= "    vt->$name = Parrot_${classname}_${name};\n";
+        }
+    }   
+
+    $cout .= <<"EOC";
+
+PARROT_EXPORT VTABLE *Parrot_${classname}_update_vtable(VTABLE *vt) {
+$vtable_updates
+    return vt;
+}
+EOC
+
     if ( $self->is_dynamic ) {
         $cout .= dynext_load_code( $classname, $classname => {} );
     }


More information about the parrot-commits mailing list