I've committed the following patch, which allows vtable ops to be called for some of the simpler functions. Yes, I know we don't actually have the vtable methods yet, but I'm working on it; I'll try and have some of them done by the end of the day.
The tricky part is making them maintainable. Index: Makefile.in =================================================================== RCS file: /home/perlcvs/parrot/Makefile.in,v retrieving revision 1.34 retrieving revision 1.35 diff -u -w -r1.34 -r1.35 --- Makefile.in 2001/10/18 01:15:11 1.34 +++ Makefile.in 2001/10/18 11:33:47 1.35 @@ -7,11 +7,12 @@ $(INC)/register.h $(INC)/string.h $(INC)/events.h $(INC)/interpreter.h \ $(INC)/memory.h $(INC)/parrot.h $(INC)/stacks.h $(INC)/packfile.h \ $(INC)/global_setup.h $(INC)/vtable.h $(INC)/oplib/core_ops.h \ -$(INC)/runops_cores.h $(INC)/trace.h +$(INC)/runops_cores.h $(INC)/trace.h $(INC)/oplib/vtable_ops.h O_FILES = global_setup$(O) interpreter$(O) parrot$(O) register$(O) \ core_ops$(O) memory$(O) packfile$(O) stacks$(O) string$(O) strnative$(O) \ -strutf8$(O) strutf16$(O) strutf32$(O) transcode$(O) runops_cores$(O) trace$(O) +strutf8$(O) strutf16$(O) strutf32$(O) transcode$(O) runops_cores$(O) \ +trace$(O) vtable_ops$(O) #DO NOT ADD C COMPILER FLAGS HERE #Add them in Configure.pl--look for the @@ -52,6 +53,9 @@ Parrot/OpLib/core.pm: core.ops ops2pm.pl $(PERL) ops2pm.pl core.ops +Parrot/OpLib/vtable.pm: vtable.ops ops2pm.pl + $(PERL) ops2pm.pl vtabls.ops + examples/assembly/mops.c: examples/assembly/mops.pbc pbc2c.pl $(PERL) pbc2c.pl examples/assembly/mops.pbc > examples/assembly/mops.c @@ -89,6 +93,12 @@ core_ops.c $(INC)/oplib/core_ops.h: core.ops ops2c.pl $(PERL) ops2c.pl core.ops +vtable.ops: make_vtable_ops.pl + $(PERL) make_vtable_ops.pl > vtable.ops + +vtable_ops.c $(INC)/oplib/vtable_ops.h: vtable.ops ops2c.pl + $(PERL) ops2c.pl vtable.ops + $(INC)/config.h: Configure.pl config_h.in $(PERL) Configure.pl @@ -104,6 +114,7 @@ $(RM_F) *$(O) *.s core_ops.c $(TEST_PROG) $(PDISASM) $(PDUMP) $(RM_F) $(INC)/vtable.h $(RM_F) $(INC)/oplib/core_ops.h + $(RM_F) $(INC)/oplib/vtable_ops.h vtable_ops.c vtable.ops $(RM_F) $(TEST_PROG) $(PDISASM) $(PDUMP) $(RM_F) examples/assembly/mops$(EXE) examples/assembly/mops.c $(RM_F) examples/assembly/mops$(O) examples/assembly/mops.pbc 1.4 +1 -1 parrot/vtable.tbl Index: vtable.tbl =================================================================== RCS file: /home/perlcvs/parrot/vtable.tbl,v retrieving revision 1.3 retrieving revision 1.4 diff -u -w -r1.3 -r1.4 --- vtable.tbl 2001/10/10 14:32:56 1.3 +++ vtable.tbl 2001/10/18 11:33:47 1.4 @@ -35,7 +35,7 @@ num void multiply PMC* left PMC* right num void divide PMC* left PMC* right num void modulus PMC* left PMC* right -num void concatenate PMC* left PMC* right +str void concatenate PMC* left PMC* right unique void is_equal PMC* left unique void logical_or PMC* left PMC* right unique void logical_and PMC* left PMC* right 1.1 parrot/make_vtable_ops.pl Index: make_vtable_ops.pl =================================================================== use Parrot::Vtable; my %vtable = parse_vtable(); while (<DATA>) { next if /^#/ or /^$/; my @params = split; my $op = $params[1]; my $vtable_entry = $params[2] || $op; die "Can't find $vtable_entry in vtable, line $.\n" unless exists $vtable{$vtable_entry}; print "AUTO_OP $params[1] (".(join ", ", ("p")x$params[0]).") {\n"; if ($params[0] == 3) { # Three-address function print "\t\$2->vtable->vtable_funcs[VTABLE_"; print uc $vtable_entry; print multimethod($vtable_entry); print ']($2,$3,$1);'; print "\n}\n"; } } sub multimethod { my $type = $vtable{$_[0]}{meth_type}; return "" if $type eq "unique"; return ' + $3->vtable->num_type' if $type eq "num"; return ' + $3->vtable->string_type' if $type eq "str"; die "Coding error - undefined type $type\n"; } __DATA__ # Three-address functions 3 add 3 sub subtract 3 mul multiply 3 div divide 3 mod modulus 3 concat concatenate -- A witty saying means nothing. -Voltaire