[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