[svn:parrot] r38454 - in branches/tt528_vtinit/lib/Parrot/Pmc2c: . PMC
bacek at svn.parrot.org
bacek at svn.parrot.org
Sun May 3 12:23:08 UTC 2009
Author: bacek
Date: Sun May 3 12:23:06 2009
New Revision: 38454
URL: https://trac.parrot.org/parrot/changeset/38454
Log:
Small cleanups:
- Factor out get_vtable_func and update_vtable_func for generating
get_vtable and update_vtable functions.
- Override default_get_vtable.
- Fix dynpmc's generating.
- Small other fixes that I forgot.
Modified:
branches/tt528_vtinit/lib/Parrot/Pmc2c/PMC/default.pm
branches/tt528_vtinit/lib/Parrot/Pmc2c/PMCEmitter.pm
Modified: branches/tt528_vtinit/lib/Parrot/Pmc2c/PMC/default.pm
==============================================================================
--- branches/tt528_vtinit/lib/Parrot/Pmc2c/PMC/default.pm Sun May 3 09:07:32 2009 (r38453)
+++ branches/tt528_vtinit/lib/Parrot/Pmc2c/PMC/default.pm Sun May 3 12:23:06 2009 (r38454)
@@ -49,6 +49,34 @@
return 1;
}
+sub update_vtable_func {
+ "";
+}
+
+# Really build default vtable.
+sub get_vtable_func {
+ my ($self) = @_;
+
+ my $cout = "";
+
+ my $vtable_decl = $self->vtable_decl("temp_vtable", '""');
+
+ $cout .= <<"EOC";
+
+VTABLE* Parrot_default_get_vtable(PARROT_INTERP) {
+
+ static const char attr_defs [] = "";
+
+$vtable_decl
+
+ return Parrot_clone_vtable(interp, &temp_vtable);
+}
+
+EOC
+
+ $cout;
+}
+
1;
# Local Variables:
Modified: branches/tt528_vtinit/lib/Parrot/Pmc2c/PMCEmitter.pm
==============================================================================
--- branches/tt528_vtinit/lib/Parrot/Pmc2c/PMCEmitter.pm Sun May 3 09:07:32 2009 (r38453)
+++ branches/tt528_vtinit/lib/Parrot/Pmc2c/PMCEmitter.pm Sun May 3 12:23:06 2009 (r38454)
@@ -90,6 +90,8 @@
$c->emit("#include \"pmc_default.h\"\n");
+ $c->emit( $self->update_vtable_func );
+ $c->emit( $self->get_vtable_func );
$c->emit( $self->init_func );
$c->emit( $self->postamble );
@@ -160,8 +162,11 @@
$hout .= 'PARROT_DYNEXT_EXPORT ' if ( $self->is_dynamic );
$hout .= "void Parrot_${name}_class_init(PARROT_INTERP, int, int);\n";
- $hout .= 'PARROT_DYNEXT_EXPORT ' if ( $self->is_dynamic );
- $hout .= "VTABLE* Parrot_${lc_name}_update_vtable(VTABLE*);\n";
+ $hout .= $self->is_dynamic ? 'PARROT_DYNEXT_EXPORT' : 'PARROT_EXPORT';
+ $hout .= " VTABLE* Parrot_${lc_name}_update_vtable(VTABLE*);\n";
+
+ $hout .= $self->is_dynamic ? 'PARROT_DYNEXT_EXPORT' : 'PARROT_EXPORT';
+ $hout .= " VTABLE* Parrot_${lc_name}_get_vtable(PARROT_INTERP);\n";
$self->{hdecls} .= $hout;
@@ -480,7 +485,6 @@
my $classname = $self->name;
my $enum_name = $self->is_dynamic ? -1 : "enum_class_$classname";
- my $vtable_decl = $self->vtable_decl( 'temp_base_vtable', $enum_name );
my $multi_funcs = $self->find_multi_functions();
my $multi_list = join( ",\n ",
@@ -507,16 +511,6 @@
$extra_vt{ro} = $self->{ro} if $self->{ro};
$cout .= <<"EOC";
-PARROT_EXPORT VTABLE* Parrot_${classname}_update_vtable(VTABLE*);
-VTABLE* Parrot_${classname}_get_vtable(PARROT_INTERP);
-EOC
-
- 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";
void
Parrot_${classname}_class_init(PARROT_INTERP, int entry, int pass)
{
@@ -551,14 +545,6 @@
}
$cout .= "\";\n";
- $cout .= <<"EOC";
-$vtable_decl
-EOC
-
- for my $k ( keys %extra_vt ) {
- $cout .= $extra_vt{$k}->vtable_decl( "temp_${k}_vtable", $enum_name );
- }
-
my $const = ( $self->{flags}{dynpmc} ) ? " " : " const ";
if ( @$multi_funcs ) {
@@ -582,7 +568,7 @@
Hash *isa_hash;
/* create vtable - clone it - we have to set a few items */
VTABLE * vt = Parrot_${classname}_get_vtable(interp);
- vt->base_type = enum_class_$classname;
+ vt->base_type = $enum_name;
vt->flags = $flags;
vt->attribute_defs = attr_defs;
@@ -590,8 +576,8 @@
for my $k ( keys %extra_vt ) {
my $k_flags = $self->$k->vtable_flags;
$cout .= <<"EOC";
- vt_${k} = Parrot_${classname}_get_${k}_vtable(interp);
- vt_$k->base_type = enum_class_$classname;
+ vt_${k} = Parrot_${classname}_${k}_get_vtable(interp);
+ vt_$k->base_type = $enum_name;
vt_$k->flags = $k_flags;
vt_$k->attribute_defs = attr_defs;
@@ -758,6 +744,25 @@
} /* Parrot_${classname}_class_init */
EOC
+ if ( $self->is_dynamic ) {
+ $cout .= dynext_load_code( $classname, $classname => {} );
+ }
+
+ $cout;
+}
+
+=item C<update_vtable_func()>
+
+Returns the C code for the PMC's update_vtable method.
+
+=cut
+
+sub update_vtable_func {
+ my ($self) = @_;
+
+ my $cout = "";
+ my $classname = $self->name;
+
my $vtable_updates = '';
for my $name ( @{ $self->vtable->names } ) {
if (exists $self->{has_method}{$name}) {
@@ -771,8 +776,11 @@
$vtable_updates
return vt;
}
+
EOC
+ my %extra_vt;
+ $extra_vt{ro} = $self->{ro} if $self->{ro};
for my $k (keys %extra_vt) {
@@ -786,56 +794,68 @@
$cout .= <<"EOC";
-PARROT_EXPORT VTABLE *Parrot_${classname}_update_${k}_vtable(VTABLE *vt) {
+PARROT_EXPORT VTABLE *Parrot_${classname}_${k}_update_vtable(VTABLE *vt) {
$vtable_updates
return vt;
}
+
EOC
}
+ $cout;
+}
+
+=item C<get_vtable_func()>
+
+Returns the C code for the PMC's update_vtable method.
+
+=cut
+
+sub get_vtable_func {
+ my ($self) = @_;
+
+ my $cout = "";
+ my $classname = $self->name;
+
my $get_vtable = '';
foreach my $parent_name ( reverse ($self->name, @{ $self->parents }) ) {
- unless ($parent_name eq 'default') {
- $get_vtable .= " vt = Parrot_${parent_name}_update_vtable(vt);\n";
+ if ($parent_name eq 'default') {
+ $get_vtable = "Parrot_default_get_vtable(interp)";
+ }
+ else {
+ $get_vtable = "Parrot_${parent_name}_update_vtable($get_vtable)";
}
}
- my $set_default = '';
- foreach my $vtable_func ( @{ $self->vtable->names } ) {
- $set_default .= " vt->$vtable_func = Parrot_default_$vtable_func;\n";
- }
- $cout .= <<"EOC";
+ $cout .= <<"EOC";
+PARROT_EXPORT
VTABLE* Parrot_${classname}_get_vtable(PARROT_INTERP) {
-
- VTABLE *vt = Parrot_new_vtable(interp);
-$set_default
-$get_vtable
- return vt;
+ return $get_vtable;
}
+
EOC
+ my %extra_vt;
+ $extra_vt{ro} = $self->{ro} if $self->{ro};
+
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";
+ if ($parent_name eq 'default') {
+ $get_extra_vtable = "Parrot_default_${k}_get_vtable(PARROT_INTERP)";
+ }
+ else {
+ $get_extra_vtable = "Parrot_${parent_name}_${k}_update_vtable($get_vtable)";
}
}
+
$cout .= <<"EOC";
-
-VTABLE* Parrot_${classname}_get_${k}_vtable(PARROT_INTERP) {
-
- VTABLE *vt = Parrot_new_vtable(interp);
-$set_default
-$get_extra_vtable
- return vt;
+PARROT_EXPORT
+VTABLE* Parrot_${classname}_${k}_get_vtable(PARROT_INTERP) {
+ return $get_extra_vtable;
}
-EOC
- }
- if ( $self->is_dynamic ) {
- $cout .= dynext_load_code( $classname, $classname => {} );
+EOC
}
$cout;
More information about the parrot-commits
mailing list