Hi there,
I played again a little with the vtables.
I noticed that all *.pmc function implement the methods type and name
are implemented the same way. Then I was wondering if its possible to
autogenerate this functions in the pmc2c.pl
This patch implements autogeneration of this functions, and therefor
they are deleted from the *.pmc files. genclass.pl will not generate
them any more. If the user really wants to implement this functions
then he can add them to the pmc-file and this will replace the
autogenerated one.
Index: classes/parrotpointer.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/parrotpointer.pmc,v
retrieving revision 1.6
diff -u -r1.6 parrotpointer.pmc
--- classes/parrotpointer.pmc 22 Jan 2002 01:04:52 -0000 1.6
+++ classes/parrotpointer.pmc 3 Feb 2002 19:52:14 -0000
@@ -14,13 +14,6 @@
#define POINTER_ERROR internal_exception(PARROT_POINTER_ERROR, "An illegal operation
was performed on a ParrotPointer (vtable function at %s line %d).\n", __FILE__,
__LINE__);
pmclass ParrotPointer {
- INTVAL type () {
- return 0;
- }
-
- STRING* name () {
- return whoami;
- }
void init () {
SELF->data=NULL;
Index: classes/perlarray.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/perlarray.pmc,v
retrieving revision 1.10
diff -u -r1.10 perlarray.pmc
--- classes/perlarray.pmc 2 Feb 2002 04:06:05 -0000 1.10
+++ classes/perlarray.pmc 3 Feb 2002 19:52:14 -0000
@@ -14,14 +14,6 @@
pmclass PerlArray {
- INTVAL type () {
- return 0;
- }
-
- STRING* name() {
- return whoami;
- }
-
void init () {
SELF->data = key_new(INTERP);
key_set_size(INTERP,SELF->data,0);
Index: classes/perlhash.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/perlhash.pmc,v
retrieving revision 1.7
diff -u -r1.7 perlhash.pmc
--- classes/perlhash.pmc 2 Feb 2002 04:06:05 -0000 1.7
+++ classes/perlhash.pmc 3 Feb 2002 19:52:14 -0000
@@ -14,14 +14,6 @@
pmclass PerlHash {
- INTVAL type () {
- return 0;
- }
-
- STRING* name() {
- return whoami;
- }
-
void init () {
SELF->data = key_new(INTERP);
key_set_size(INTERP,SELF->data,0);
Index: classes/perlint.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/perlint.pmc,v
retrieving revision 1.15
diff -u -r1.15 perlint.pmc
--- classes/perlint.pmc 22 Jan 2002 01:04:53 -0000 1.15
+++ classes/perlint.pmc 3 Feb 2002 19:52:14 -0000
@@ -14,14 +14,6 @@
pmclass PerlInt {
- INTVAL type () {
- return 0;
- }
-
- STRING* name() {
- return whoami;
- }
-
void init () {
SELF->cache.int_val = 0;
}
Index: classes/perlnum.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/perlnum.pmc,v
retrieving revision 1.17
diff -u -r1.17 perlnum.pmc
--- classes/perlnum.pmc 22 Jan 2002 01:04:53 -0000 1.17
+++ classes/perlnum.pmc 3 Feb 2002 19:52:14 -0000
@@ -13,17 +13,9 @@
#include "parrot/parrot.h"
pmclass PerlNum {
-
- INTVAL type () {
- return 0;
- }
-
- STRING* name() {
- return whoami;
- }
void init () {
- SELF->cache.num_val = 0.0;
+ SELF->cache.num_val = 0.0;
}
void clone (PMC* dest) {
Index: classes/perlstring.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/perlstring.pmc,v
retrieving revision 1.15
diff -u -r1.15 perlstring.pmc
--- classes/perlstring.pmc 22 Jan 2002 01:04:53 -0000 1.15
+++ classes/perlstring.pmc 3 Feb 2002 19:52:14 -0000
@@ -14,14 +14,6 @@
pmclass PerlString {
- INTVAL type () {
- return 0;
- }
-
- STRING* name() {
- return whoami;
- }
-
void init () {
SELF->cache.struct_val = string_make(INTERP,NULL,0,NULL,0,NULL);
}
Index: classes/perlundef.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/perlundef.pmc,v
retrieving revision 1.6
diff -u -r1.6 perlundef.pmc
--- classes/perlundef.pmc 22 Jan 2002 01:04:53 -0000 1.6
+++ classes/perlundef.pmc 3 Feb 2002 19:52:15 -0000
@@ -14,13 +14,6 @@
pmclass PerlUndef {
- INTVAL type () {
- }
-
- STRING* name () {
- return whoami;
- }
-
void init () {
/* Nothing */
}
Index: classes/genclass.pl
===================================================================
RCS file: /cvs/public/parrot/classes/genclass.pl,v
retrieving revision 1.8
diff -u -r1.8 genclass.pl
--- classes/genclass.pl 30 Jan 2002 18:02:23 -0000 1.8
+++ classes/genclass.pl 3 Feb 2002 19:52:15 -0000
@@ -7,10 +7,11 @@
my %vtbl = parse_vtable("$FindBin::Bin/../vtable.tbl");
my $classname = shift;
die "No classname given!\n" unless $classname;
+my $classname_lc = lc $classname;
-my $DOLLAR = '$';
+my $DOLLAR = "\$";
print <<EOF;
-/* ${classname}.pmc
+/* ${classname_lc}.pmc
* Copyright: (When this is determined...it will go here)
* CVS Info
* ${DOLLAR}Id${DOLLAR}
@@ -28,8 +29,12 @@
EOF
+my @autogenerated = ('type', 'name');
+
my $decls;
for (vtbl_enumerate(%vtbl)) {
+ my $name = $_->[1];
+ next if grep { $name eq $_ } @autogenerated;
my $proto = $_->[2];
my $thisproto = $proto;
# I am Jack's crufty code
Index: classes/pmc2c.pl
===================================================================
RCS file: /cvs/public/parrot/classes/pmc2c.pl,v
retrieving revision 1.11
diff -u -r1.11 pmc2c.pl
--- classes/pmc2c.pl 31 Jan 2002 21:00:40 -0000 1.11
+++ classes/pmc2c.pl 3 Feb 2002 19:52:15 -0000
@@ -11,6 +11,7 @@
use lib "$FindBin::Bin/../lib";
use Parrot::Vtable;
use strict;
+use Data::Dumper;
my %default = parse_vtable("$FindBin::Bin/../vtable.tbl");
my $signature_re = qr{
@@ -27,6 +28,35 @@
\(([^\(]*)\) #parameters
}sx;
+my %autogenerated = (
+ type => \&gen_type,
+ name => \&gen_name
+ );
+
+sub gen_type {
+ my ($classname, $method) = @_;
+
+ return <<"EOC";
+INTVAL Parrot_${classname}_${method}
+ {
+ return enum_class_${classname};
+ }
+
+EOC
+}
+
+sub gen_name {
+ my ($classname, $method) = @_;
+
+ return <<"EOC";
+STRING* Parrot_${classname}_${method}
+ {
+ return whoami;
+ }
+
+EOC
+}
+
sub extract_balanced {
my $balance = 0;
my $lines = 0;
@@ -187,12 +217,12 @@
my @methods;
my $OUT = '';
- my $HOUT = <<"EOC";
+ my $HOUT = <<"EOH";
/* Do not edit - automatically generated from '$pmcfile' by $0 */
-EOC
+EOH
my %defaulted;
-
+
while ($classblock =~ s/($signature_re)//) {
$lineno += count_newlines($1);
my ($type, $methodname, $parameters) = ($2,$3,$4);
@@ -223,9 +253,9 @@
push @methods, $methodname;
};
- @methods = map { "Parrot_$methodloc->{$_}_$_" } @{ $default{order} };
+ my @methods_full = map { "Parrot_$methodloc->{$_}_$_" } @{ $default{order} };
- my $methodlist = join (",\n ", @methods);
+ my $methodlist = join (",\n ", @methods_full);
my $initname = "Parrot_$classname" . "_class_init";
my %visible_supers;
@@ -236,9 +266,16 @@
# No, include yourself to check your headers match your bodies
# (and gcc -W... is happy then)
# next if $class eq $classname;
- $includes .= qq(#include "\L$class.h"\n);
+ $includes .= "#include \"\L$class.h\"\n";
}
+ foreach my $method (keys %autogenerated) {
+ if (!grep {$_ eq $method} @methods) {
+ $OUT = "/* $method is autogenerated */\n"
+ . &{$autogenerated{$method}} ($classname, $method)
+ . $OUT;
+ }
+ }
$OUT = <<EOC . $OUT;
/* Do not edit - automatically generated from '$pmcfile' by $0 */
--
Juergen Boemmels [EMAIL PROTECTED]
Fachbereich Physik Tel: ++49-(0)631-205-2817
Universitaet Kaiserslautern Fax: ++49-(0)631-205-3906
PGP Key fingerprint = 9F 56 54 3D 45 C1 32 6F 23 F6 C7 2F 85 93 DD 47