[svn:parrot] r44669 - in branches/ops_pct/compilers/opsc: src/Ops src/Ops/Compiler t

bacek at svn.parrot.org bacek at svn.parrot.org
Fri Mar 5 23:50:37 UTC 2010


Author: bacek
Date: Fri Mar  5 23:50:36 2010
New Revision: 44669
URL: https://trac.parrot.org/parrot/changeset/44669

Log:
Start c header emitting

Modified:
   branches/ops_pct/compilers/opsc/src/Ops/Compiler/Actions.pm
   branches/ops_pct/compilers/opsc/src/Ops/Emitter.pm
   branches/ops_pct/compilers/opsc/t/06-emitter.t

Modified: branches/ops_pct/compilers/opsc/src/Ops/Compiler/Actions.pm
==============================================================================
--- branches/ops_pct/compilers/opsc/src/Ops/Compiler/Actions.pm	Fri Mar  5 23:50:06 2010	(r44668)
+++ branches/ops_pct/compilers/opsc/src/Ops/Compiler/Actions.pm	Fri Mar  5 23:50:36 2010	(r44669)
@@ -52,7 +52,7 @@
 method op($/) {
 
     # Handling flags.
-    my %flags := pir::new__Ps('Hash');
+    my %flags := pir::new__Ps('OrderedHash');
     for $<op_flag> {
         %flags{~$_<identifier>} := 1;
     }

Modified: branches/ops_pct/compilers/opsc/src/Ops/Emitter.pm
==============================================================================
--- branches/ops_pct/compilers/opsc/src/Ops/Emitter.pm	Fri Mar  5 23:50:06 2010	(r44668)
+++ branches/ops_pct/compilers/opsc/src/Ops/Emitter.pm	Fri Mar  5 23:50:36 2010	(r44669)
@@ -8,7 +8,7 @@
 
 =end
 
-method new(:$ops_file!, :$trans!, :$script!, :$file, :%flags) {
+method new(:$ops_file!, :$trans!, :$script!, :$file, :%flags!) {
     self<ops_file>  := $ops_file;
     self<trans>     := $trans;
     self<script>    := $script;
@@ -23,8 +23,8 @@
     my $base_ops_h    := $base_ops_stub ~ '.h';
 
 
-    self<include> := %flags<dir> ~ "parrot/oplib/$base_ops_h";
-    self<header>  := "include/{self<include>}";
+    self<include> := "parrot/oplib/$base_ops_h";
+    self<header>  := (~%flags<dir>) ~ "include/" ~ self<include>;
 
 
     self;
@@ -38,8 +38,64 @@
 
 
 method print_c_header_file() {
+    my $fh := pir::open__PSs(self<header>, 'w') || die("Can't open filehandle");
+    self.emit_c_header_file($fh);
+    $fh.close();
+    return self<header>;
+}
+
+method emit_c_header_file($fh) {
+
+    self._emit_guard_prefix($fh);
+
+    self._emit_guard_suffix($fh);
+
+    self._emit_coda($fh);
+}
+
+# given a headerfile name like "include/parrot/oplib/core_ops.h", this
+# returns a string like "PARROT_OPLIB_CORE_OPS_H_GUARD"
+method _generate_guard_macro_name() {
+    my $fn   := self<header>;
+    $fn := subst($fn, /.h$/, '');
+    #my @path = File::Spec->splitdir($fn);
+    my @path := split('/', $fn);
+    @path.shift if @path[0]~'/' eq self<flags><dir>;
+    @path.shift if @path[0] eq 'include';
+    @path.shift if @path[0] eq 'parrot';
+    uc( join( '_', 'parrot', |@path, 'h', 'guard' ) );
+}
 
+
+method _emit_guard_prefix($fh) {
+    my $guardname := self._generate_guard_macro_name();
+    $fh.print(qq/
+#ifndef $guardname
+#define $guardname
+
+/);
+}
+
+method _emit_guard_suffix($fh) {
+    my $guardname := self._generate_guard_macro_name();
+    $fh.print(qq|
+
+#endif /* $guardname */
+|);
 }
 
 
+method _emit_coda($fh) {
+    $fh.print(q|
+
+/*
+ * Local variables:
+ *   c-file-style: "parrot"
+ *   buffer-read-only: t
+ * End:
+ * vim: expandtab shiftwidth=4:
+ */
+|);
+}
+
 # vim: expandtab shiftwidth=4 ft=perl6:

Modified: branches/ops_pct/compilers/opsc/t/06-emitter.t
==============================================================================
--- branches/ops_pct/compilers/opsc/t/06-emitter.t	Fri Mar  5 23:50:06 2010	(r44668)
+++ branches/ops_pct/compilers/opsc/t/06-emitter.t	Fri Mar  5 23:50:36 2010	(r44669)
@@ -3,7 +3,7 @@
 pir::load_bytecode("compilers/opsc/opsc.pbc");
 pir::load_bytecode("nqp-settings.pbc");
 
-plan(3);
+plan(5);
 
 my $trans := Ops::Trans::C.new();
 
@@ -26,4 +26,15 @@
 ok( $emitter<header> ~~ /^tmp/, 'header file in tmp');
 say('# ' ~ $emitter<header>);
 
+#my $header := $emitter.print_c_header_file();
+my $fh := pir::new__Ps('StringHandle');
+$fh.open('header.h', 'w');
+$emitter.emit_c_header_file($fh);
+
+$fh.close();
+my $header := $fh.readall();
+
+ok($header ~~ /define \s PARROT_OPLIB_CORE_OPS_H_GUARD/, 'Guard generated');
+ok($header ~~ /endif/, 'Close guard generated');
+
 # vim: expandtab shiftwidth=4 ft=perl6:


More information about the parrot-commits mailing list