[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