[svn:parrot] r38438 - in branches/pmc_pct/compilers/pmc: . src src/emitter
bacek at svn.parrot.org
bacek at svn.parrot.org
Sat May 2 05:18:01 UTC 2009
Author: bacek
Date: Sat May 2 05:18:00 2009
New Revision: 38438
URL: https://trac.parrot.org/parrot/changeset/38438
Log:
Start moving stuff from emitter/pmc.pir into emitter/pmc.pm
Added:
branches/pmc_pct/compilers/pmc/src/emitter/pmc.pm
Modified:
branches/pmc_pct/compilers/pmc/pmc.pir
branches/pmc_pct/compilers/pmc/src/emitter.pm
branches/pmc_pct/compilers/pmc/src/emitter/pmc.pir
Modified: branches/pmc_pct/compilers/pmc/pmc.pir
==============================================================================
--- branches/pmc_pct/compilers/pmc/pmc.pir Sat May 2 05:17:38 2009 (r38437)
+++ branches/pmc_pct/compilers/pmc/pmc.pir Sat May 2 05:18:00 2009 (r38438)
@@ -34,6 +34,7 @@
.include 'src/emitter/c.pir'
.include 'src/gen_emitter.pir'
+.include 'src/emitter/gen_pmc.pir'
.include 'src/gen_vtable_info.pir'
.include 'src/parser/gen_grammar.pir'
.include 'src/parser/gen_actions.pir'
Modified: branches/pmc_pct/compilers/pmc/src/emitter.pm
==============================================================================
--- branches/pmc_pct/compilers/pmc/src/emitter.pm Sat May 2 05:17:38 2009 (r38437)
+++ branches/pmc_pct/compilers/pmc/src/emitter.pm Sat May 2 05:18:00 2009 (r38438)
@@ -13,13 +13,13 @@
my $filename := self.filename();
# Get emitter for (specific) PMC.
- my $pmc_emitter := get_pmc_emitter($name);
+ my $pmc_emitter := get_pmc_emitter($name, $past);
$res :=
# Generate header.
dont_edit($filename)
# PMC functions
- ~ $pmc_emitter.generate_h_file($past)
+ ~ $pmc_emitter.generate_h_file()
# C code
~ c_code_coda();
@@ -34,7 +34,7 @@
my $filename := self.filename();
# Get emitter for (specific) PMC.
- my $pmc_emitter := get_pmc_emitter($name);
+ my $pmc_emitter := get_pmc_emitter($name, $past);
$res :=
# Generate header.
@@ -59,24 +59,21 @@
# Get (specific) PMC emitter
# Try to create specific emitter. In case of failure create generic one.
-sub get_pmc_emitter($name) {
+sub get_pmc_emitter($name, $past) {
PIR q<
find_lex $P0, '$name'
$S0 = $P0
- $P1 = new 'ResizableStringArray'
- push $P1, 'PMC'
- push $P1, 'Emitter'
- push $P1, $S0
- push_eh not_found
- %r = new $P1
- pop_eh
- goto done
+
+ .local pmc ctor
+ ctor = get_hll_global ['PMC';'Emitter';'PMC'], $S0
+ $I0 = defined ctor
+ if $I0 goto done
not_found:
- pop_eh
- $P1 = split '::', 'PMC::Emitter::PMC'
- %r = new $P1
+ ctor = get_hll_global ['PMC';'Emitter'], 'PMC'
done:
+ find_lex $P1, '$past'
+ %r = ctor.'new'($P1)
>;
}
Modified: branches/pmc_pct/compilers/pmc/src/emitter/pmc.pir
==============================================================================
--- branches/pmc_pct/compilers/pmc/src/emitter/pmc.pir Sat May 2 05:17:38 2009 (r38437)
+++ branches/pmc_pct/compilers/pmc/src/emitter/pmc.pir Sat May 2 05:18:00 2009 (r38438)
@@ -3,6 +3,10 @@
=head1 Generic PMC emitter
+This is PIR part of PMC emitter.
+
+TODO figure out how to implement it in NQP.
+
=cut
.namespace ['PMC';'Emitter';'PMC']
@@ -12,50 +16,44 @@
p6meta = new 'P6metaclass'
- p6meta.'new_class'('PMC::Emitter::PMC')
+ p6meta.'new_class'('PMC::Emitter::PMC', 'parent'=>'Capture')
.end
-=item C<generate_h_file>
-
-Generate part of header file.
-
-=cut
-
-# "Template Method". Just override generate_h_file_functions in derived
-# classes.
-
-.sub 'generate_h_file' :method
+.sub 'new' :method
.param pmc past
- .local string res
- .local string guard
- .local string name
+ .local pmc res
+ $P0 = self.'HOW'()
+ $P0 = getattribute $P0, 'parrotclass'
+ res = new $P0
+
+ res['past'] = past
+ $S0 = past.'name'()
+ res['name'] = $S0
+ $S0 = 'uc'($S0)
+ res['ucname'] = $S0
- name = past.'name'()
- $S0 = 'uc'(name)
+ .return (res)
+.end
- guard = 'PARROT_PMC_'
- concat guard, $S0
- concat guard, '_H_GUARD'
-
- res = '#ifndef '
- concat res, guard
- concat res, "\n"
- concat res, '#define '
- concat res, guard
- concat res, "\n"
+.sub 'past' :method
+ $P0 = self['past']
+ .return ($P0)
+.end
- $S0 = self.'generate_h_file_functions'(past)
- concat res, $S0
-
- concat res, '#endif /* '
- concat res, guard
- concat res, " */ \n"
+.sub 'name' :method
+ $S0 = self['name']
+ .return ($S0)
+.end
- .return (res)
+.sub 'ucname' :method
+ $S0 = self['ucname']
+ .return ($S0)
.end
+
+
=item C<generate_h_file_functions>
Generate C declarations for vtable functions
@@ -63,7 +61,7 @@
=cut
.sub 'generate_h_file_functions' :method
- .param pmc past
+ .local pmc past
.local string res
.local pmc vtable_info, vtable_hash
.local pmc vtables, it, entry, class_init
@@ -71,6 +69,7 @@
.local pmc res_builder
+ past = self.'past'()
pmc_name = past.'name'()
$P0 = get_hll_global ['PMC'; 'VTableInfo'], 'vtable_hash'
Added: branches/pmc_pct/compilers/pmc/src/emitter/pmc.pm
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ branches/pmc_pct/compilers/pmc/src/emitter/pmc.pm Sat May 2 05:18:00 2009 (r38438)
@@ -0,0 +1,40 @@
+# Copyright (C) 2009, Parrot Foundation.
+# $Id$
+
+class PMC::Emitter::PMC;
+
+# =item C<generate_h_file>
+#
+# Generate part of header file.
+#
+# =cut
+
+# "Template Method". Just override generate_h_file_functions in derived
+# classes.
+
+method generate_h_file() {
+ my $past := self.past;
+ my $name := self.name;
+
+ my $guard := 'PARROT_PMC_' ~ self.ucname ~ '_H_GUARD';
+
+ # "join" is way too simple...
+ my $res := join('', (
+ '#ifndef ' ~ $guard ~ "\n",
+ '#define ' ~ $guard ~ "\n\n",
+
+ self.generate_h_file_functions(),
+
+ "\n",
+ '#endif /* ', $guard, " */ \n"
+ )
+ );
+
+ $res
+}
+
+# Local Variables:
+# mode: pir
+# fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:
More information about the parrot-commits
mailing list