develooper Front page | perl.cvs.parrot | Postings from December 2008

[svn:parrot] r33510 - trunk/compilers/ncigen

From:
tewk
Date:
December 5, 2008 07:18
Subject:
[svn:parrot] r33510 - trunk/compilers/ncigen
Message ID:
20081205151811.EEB2ECB9AF@x12.develooper.com
Author: tewk
Date: Fri Dec  5 07:18:08 2008
New Revision: 33510

Added:
   trunk/compilers/ncigen/NCIGENP6.pm   (contents, props changed)
      - copied, changed from r33506, /trunk/compilers/ncigen/sqlite_interface_generator.pl
   trunk/compilers/ncigen/gen_sqlite3.pl   (contents, props changed)
Removed:
   trunk/compilers/ncigen/sqlite_interface_generator.pl

Log:
[ncigen] programmatic control via perl6


Copied: trunk/compilers/ncigen/NCIGENP6.pm (from r33506, /trunk/compilers/ncigen/sqlite_interface_generator.pl)
==============================================================================
--- /trunk/compilers/ncigen/sqlite_interface_generator.pl	(original)
+++ trunk/compilers/ncigen/NCIGENP6.pm	Fri Dec  5 07:18:08 2008
@@ -7,37 +7,28 @@
 
 evalfile('./ncigen.pbc', lang => 'Parrot');
 
-my $fn = @*ARGS[0];
-my $pp_fn = mktempfile('ptemp');
+sub parse_ast($fn) {
+    my $pp_fn = mktempfile('ptemp');
 
-run("gcc -x c -E $fn > $pp_fn");
-my $compiler = compreg('NCIGEN');
-my $ast = $compiler.parse(slurp($pp_fn));
-
-my $b = $ast.item();
-
-for ($ast.item().kv) -> $k,$v {
-  say "====================================================";
-  say $k;
-  say $v.perl;
-  for ($v.list) -> $x {
-    say $x.perl;
-  }
-  say pir($v);
+    run("gcc -x c -E $fn > $pp_fn");
+    my $compiler = compreg('NCIGEN');
+    my $ast = $compiler.parse(slurp($pp_fn));
+    unlink $pp_fn;
+    $ast.item();
 }
 
 sub compreg {
-  my $a = q:PIR { %r = compreg 'NCIGEN' };
-  return $a;
+    my $a = q:PIR { %r = compreg 'NCIGEN' };
+    return $a;
 }
 
 sub mktempfile($prefix) {
-  sub nonce() { ".{$*PID}." ~ int 1000.rand }
-  $prefix ~ nonce;
+    sub nonce() { ".{$*PID}." ~ int 1000.rand }
+    $prefix ~ nonce;
 }
 
 sub gen_preamble($nsname, $libname) {
-    my $fmt = ".namespace [$nsname]\n";
+    my $fmt = ".namespace ['$nsname']\n";
     $fmt ~= ".sub __load_lib_dlfunc_init__ :anon :init :load\n";
 
     if $libname {
@@ -47,85 +38,90 @@
         $fmt ~= "\$P1 = null\ngoto has_lib\n";
     }
 
-    $fmt ~= "\$P2 = new 'Exception'";
-    $fmt ~= "\$P2[0] = 'error loading $libname - loadlib failed'";
-    $fmt ~= "throw \$P2";
-    $fmt ~= "has_lib:";
+    $fmt ~= 
+        qq{{\$P2 = new 'Exception'
+\$P2[0] = 'error loading $libname - loadlib failed'
+throw \$P2
+has_lib:
+}};
 
     return $fmt;
 }
 
+sub gen_postamble() {
+    return ".end\n";
+}
+
+sub dump_node($node) {
+    say "====================================================";
+    say $node.perl;
+    for ($node.list) -> $x {
+        say $x.perl;
+    }
+}
+
+=begin
 multi sub pir($node) {
+    say $node.WHAT;
     return  pir_children($node);
 }
-multi sub pir(NCIGENAST::TypeDef $node) { return ""; }
-multi sub pir(NCIGENAST::VarDecl $node) { return ""; } 
-multi sub pir(NCIGENAST::FuncDecl $node) {
-    ##  get list of arguments to operation
-    my $arglist = $node.list();
+=end
 
+#multi sub pir(NCIGENAST::TypeDef $node) { return ""; }
+#multi sub pir(NCIGENAST::VarDecl $node) { return ""; } 
+multi sub pir(NCIGENAST::FuncDecl $node) {
+## return type
     my $type = param_to_code($node, 1);
 
-    for @($arglist) -> $x {
+##  get list of arguments to operation
+    for ($node.list()) -> $x {
         $type ~= param_to_code($x);
     }
+    return ($node.name, $type);
+}
 
-    my $name = $node.name();
-    my $fmt = "dlfunc \$P2, \$P1, '$name', '$type'\nstore_global '$name', \$P2";
-
-    return $fmt;
+sub format_func_decl($pirname, $cname, $type) {
+    return qq{{dlfunc \$P2, \$P1, '$cname', '$type'
+store_global '$pirname', \$P2}};
 }
 
-sub param_to_code($node, $returncode) {
-    my $I0 = $node.'pointer'();
-    my $I2 = $node.'pointer_cnt'();
+sub param_to_code($node, $returncode = 0) {
     my $pt = $node.'primitive_type'();
 
     if ($node.pointer()) {
-        if ($pt ~~ 'void' ) {
-            if ($returncode) { return ""; }
-            else { return "v"; }
-        }
-        elsif ($pt ~~ 'int') { return "i"; }
-        elsif ($pt ~~ 'long') { return "l"; }
-        elsif ($pt ~~ 'char') { return "c"; }
-        elsif ($pt ~~ 'short') { return "s"; }
-        else { return "p"; }
-    }
-    else {
-        if ($node.pointer_cnt() > 1 ) {
-            return "V";
-        }
-        if ($pt ~~ 'void' ) {
+        if ($node.pointer_cnt() > 1 ) { return "V"; } #out params
+        given $pt {
+          when 'void' {
             if ($returncode) { return "p"; } #probably should be "V"
             else { return "p"; } 
-        }
-        elsif ($pt ~~ 'int') { return "V"; }
-        elsif ($pt ~~ 'long') { return "V"; }
-        elsif ($pt ~~ 'char') { return "t"; }
-        elsif ($pt ~~ 'short') { return "V"; }
-        else { 
+          }
+          when 'int'    { return "V"; }
+          when 'long'   { return "V"; }
+          when 'char'   { return "t"; }
+          when 'short'  { return "V"; }
+          default { 
+=begin
             say "ERROR";
-            say $pt;
+            say $node.perl;
             say "what is this";
-            return "p"; }
+=end
+              return "p";
+          }
+        }
     }
-}
-
-sub to_pir($ast, $adverbs) {
-#    .param pmc ast
-#    .param pmc adverbs         :slurpy :named
-    
-    my $code = "";
-    my $raw = $adverbs['raw'];
-    unless ($raw) {
-        $code = gen_preamble($adverbs);
+    else {
+        given $pt {
+            when 'void' {
+                if ($returncode) { return ""; } # void return code
+                else { return "v"; }
+            }
+            when 'int'      { return "i"; }
+            when 'long'     { return "l"; }
+            when 'char'     { return "c"; }
+            when 'short'    { return "s"; }
+            default         { return "p"; }
+        }
     }
-
-    ##  now generate the pir
-    $code = pir(ast);
-
-    return $code;
 }
 
 sub pir_children($node) {
@@ -140,5 +136,6 @@
 #   mode: pir
 #   fill-column: 100
 # End:
-# vim: expandtab shiftwidth=4 ft=perl6:
+# vim: expandtab ft=perl6 shiftwidth=2 
+
 

Added: trunk/compilers/ncigen/gen_sqlite3.pl
==============================================================================
--- (empty file)
+++ trunk/compilers/ncigen/gen_sqlite3.pl	Fri Dec  5 07:18:08 2008
@@ -0,0 +1,38 @@
+#!/home/tewk/srcs/parrot/perl6
+
+# $Id: sqlite_interface_generator.pl 33506 2008-12-05 12:39:55Z tewk $
+# Copyright (C) 2008, The Perl Foundation.
+
+use v6;
+use NCIGENP6;
+
+my $fn = @*ARGS[0];
+
+print gen_preamble("SQLite3", "sqlite3");
+
+my %rename_table = (
+    'open'          => 'open_raw',
+    'prepare_v2'    => 'prepare_raw',
+);
+
+for (parse_ast($fn).kv) -> $k,$v {
+    #dump_node($v);
+    if ($v.WHAT eq "FuncDecl") {
+        my @result = pir($v);
+        my $suffix_name = @result[0];
+        my $suffix_name .= subst( /sqlite3_/, '' );
+
+        my $pirname = %rename_table{$suffix_name} || $suffix_name;
+        
+        say format_func_decl($pirname, |@result);
+    }
+}
+
+say gen_postamble();
+
+# Local Variables:
+#   mode: pir
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4 ft=perl6:
+



nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About