[svn:parrot] r38746 - branches/pmc_pct/compilers/pmcc/src/emitter/pmc

bacek at svn.parrot.org bacek at svn.parrot.org
Wed May 13 12:30:19 UTC 2009


Author: bacek
Date: Wed May 13 12:30:18 2009
New Revision: 38746
URL: https://trac.parrot.org/parrot/changeset/38746

Log:
Add pre_method_gen and stub for get_vtable_func into Emitter::PMC::default

Modified:
   branches/pmc_pct/compilers/pmcc/src/emitter/pmc/default.pm

Modified: branches/pmc_pct/compilers/pmcc/src/emitter/pmc/default.pm
==============================================================================
--- branches/pmc_pct/compilers/pmcc/src/emitter/pmc/default.pm	Wed May 13 12:09:39 2009	(r38745)
+++ branches/pmc_pct/compilers/pmcc/src/emitter/pmc/default.pm	Wed May 13 12:30:18 2009	(r38746)
@@ -11,6 +11,47 @@
 
 class PMC::Emitter::PMC::default;
 
+=item C<pre_method_gen>
+
+Generate bunch of "not_implemented_yet" VTABLE functions.
+
+=cut
+method pre_method_gen() {
+    my @vtables := PMC::VTableInfo::vtable_list();
+    my %vtables := self.vtables;
+
+    for @vtables {
+        if !exists(%vtables, $_.name) {
+            my $entry := PAST::Block.new(
+                :name($_.name),
+            );
+            # FIXME Ugly hack
+            $entry<parameters> := PAST::Op.new(
+                PAST::Val.new(
+                    :returns(''),
+                    :name($_<parameters>)
+                )
+            );
+
+            $entry.push(
+                PAST::Op.new(
+                    :pasttype('inline'),
+                    :inline(
+' {
+    cant_do_method(interp, pmc, "' ~ $_.name ~ '");
+}
+'),
+                )
+            );
+            %vtables{$entry.name} := $entry;
+            #say("GENERATING " ~ $_.name);
+        }
+        else {
+            #say("USING " ~ $_.name);
+        }
+    }
+}
+
 =item C<get_vtable_func>
 
 Generate C-code for C<Parrot_default_get_vtable> and
@@ -19,6 +60,28 @@
 =cut
 
 method get_vtable_func() {
+    my %vtables := self.vtables;
+    my $past := self.past;
+
+    my @res;
+    @res.push('
+PARROT_EXPORT VTABLE* Parrot_default_get_vtable(PARROT_INTERP) {
+
+    static const char attr_defs [] = "";
+'
+    );
+
+#    for @vtables {
+#        say("vtable " ~ $_.name ~ ' ' ~ $past<vtables>{$_.name});
+#    }
+
+    @res.push('
+    return Parrot_clone_vtable(interp, &temp_vtable);
+}
+'
+    );
+
+    join('', @res);
 }
 
 =item C<update_vtable_func>


More information about the parrot-commits mailing list