[svn:parrot] r38453 - branches/tt528_vtinit/lib/Parrot/Pmc2c
cotto at svn.parrot.org
cotto at svn.parrot.org
Sun May 3 09:07:35 UTC 2009
Author: cotto
Date: Sun May 3 09:07:32 2009
New Revision: 38453
URL: https://trac.parrot.org/parrot/changeset/38453
Log:
[pmc2c] switch class_init to using runtime-built vtables - all tests pass, but there's much cleanup work to be done
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 Sun May 3 06:37:40 2009 (r38452)
+++ branches/tt528_vtinit/lib/Parrot/Pmc2c/PMCEmitter.pm Sun May 3 09:07:32 2009 (r38453)
@@ -513,6 +513,7 @@
for my $k (keys %extra_vt) {
$cout .= "PARROT_EXPORT VTABLE* Parrot_${classname}_update_${k}_vtable(VTABLE*);\n";
+ $cout .= "VTABLE* Parrot_${classname}_get_${k}_vtable(PARROT_INTERP);\n";
}
$cout .= <<"EOC";
@@ -573,7 +574,7 @@
if (pass == 0) {
EOC
for my $k ( keys %extra_vt ) {
- $cout .= " VTABLE *vt_$k;\n";
+ $cout .= " VTABLE *vt_$k;\n";
}
my $flags = $self->vtable_flags;
@@ -584,14 +585,16 @@
vt->base_type = enum_class_$classname;
vt->flags = $flags;
vt->attribute_defs = attr_defs;
+
EOC
for my $k ( keys %extra_vt ) {
my $k_flags = $self->$k->vtable_flags;
$cout .= <<"EOC";
- vt_${k} = Parrot_${classname}_get_vtable(interp);
+ vt_${k} = Parrot_${classname}_get_${k}_vtable(interp);
vt_$k->base_type = enum_class_$classname;
vt_$k->flags = $k_flags;
vt_$k->attribute_defs = attr_defs;
+
EOC
}
@@ -774,11 +777,12 @@
for my $k (keys %extra_vt) {
my $vtable_updates = '';
- for my $name ( @{ $self->$k->vtable->names } ) {
- if (exists $self->$k->{has_method}{$name}) {
- $vtable_updates .= " vt->$name = Parrot_${classname}_${k}_${name};\n";
- }
- }
+ foreach my $vt_method ( @{ $self->$k->vtable->names} ) {
+
+ next unless ($self->$k->implements_vtable($vt_method));
+
+ $vtable_updates .= " vt->$vt_method = Parrot_${classname}_${k}_${vt_method};\n";
+ }
$cout .= <<"EOC";
@@ -801,7 +805,6 @@
}
$cout .= <<"EOC";
-
VTABLE* Parrot_${classname}_get_vtable(PARROT_INTERP) {
VTABLE *vt = Parrot_new_vtable(interp);
@@ -811,6 +814,26 @@
}
EOC
+ for my $k (keys %extra_vt) {
+ my $get_extra_vtable = '';
+ foreach my $parent_name ( reverse ($self->name, @{ $self->parents }) ) {
+ unless ($parent_name eq 'default') {
+ $get_extra_vtable .= " vt = Parrot_${parent_name}_update_vtable(vt);\n";
+ $get_extra_vtable .= " vt = Parrot_${parent_name}_update_${k}_vtable(vt);\n";
+ }
+ }
+ $cout .= <<"EOC";
+
+VTABLE* Parrot_${classname}_get_${k}_vtable(PARROT_INTERP) {
+
+ VTABLE *vt = Parrot_new_vtable(interp);
+$set_default
+$get_extra_vtable
+ return vt;
+}
+EOC
+ }
+
if ( $self->is_dynamic ) {
$cout .= dynext_load_code( $classname, $classname => {} );
}
More information about the parrot-commits
mailing list