changeset 285:26be78edaf83

impl auto collection for data gears from interface
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Mon, 03 Feb 2020 17:12:35 +0900
parents 875ad11af596
children 4f72a447d518
files src/gearsTools/generate_stub.pl src/gearsTools/lib/Gears/Util.pm src/impl/pipe.h src/impl/vm_impl.h
diffstat 4 files changed, 39 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/gearsTools/generate_stub.pl	Sun Feb 02 13:31:03 2020 +0900
+++ b/src/gearsTools/generate_stub.pl	Mon Feb 03 17:12:35 2020 +0900
@@ -110,7 +110,7 @@
                 if ( -f "$codeGearName.cbc") {
                     &getCodeGear("$codeGearName.cbc");
                 }
-			} elsif(/^#interface "(.*)"/) {
+            } elsif(/^#interface "(.*)"/) {
                 # use interface
                 my $interfaceHeader = $1;
                 next if ($interfaceHeader =~ /context.h/);
@@ -139,6 +139,21 @@
             }
             $var{$name}->{$tname} = $ttype;
         }
+        if (/__code (\w+)/) {
+            my $args = $';
+            while ($args =~ /((?:struct|union|const)\s+)?([\w\[\]_]+)\*?\s*(\w+),?/g) {
+              #$args eq  (Impl* vm, pde_t* pgdir, char* init, uint sz, __code next(...));
+              my $const_type = $1;
+              my $ttype = $2;
+              my $tname = $3;
+
+              $ttype =~ s/Impl/struct $name/;
+              if ($const_type eq 'const') {
+                $ttype = "const $ttype";
+              }
+              $var{$name}->{$tname} = $ttype;
+            }
+        }
         if (/^}/) {
             $inTypedef = 0;
         }
--- a/src/gearsTools/lib/Gears/Util.pm	Sun Feb 02 13:31:03 2020 +0900
+++ b/src/gearsTools/lib/Gears/Util.pm	Mon Feb 03 17:12:35 2020 +0900
@@ -3,6 +3,7 @@
 use warnings;
 use Carp qw/croak/;
 use File::Find;
+use List::Util qw/uniq/;
 
 sub parse {
   my ($class, $file_name) = @_;
@@ -40,6 +41,7 @@
     }
   }
 
+  my @tmp_args;
   while ($line = <$fh>) {
     if ($line =~ m|\s*/\*|) {
       while ( $line !~ m|\*/|) {
@@ -52,13 +54,27 @@
     next if ($line =~ m[^\s*//]);
     next if ($line =~ m[^\}\s*$ir->{name};]);
 
-    if ($line =~ m|__code (\w+)\(([()\.\*\s\w,_]+)\)|) {
-      $line = "enum Code $1;\n";
+    if ($line =~ m|__code (\w+)|) {
+      push(@tmp_args,"enum Code $1;\n");
+      my $args = $';
+      #$args eq  (Impl* vm, pde_t* pgdir, char* init, uint sz, __code next(...));
+      while ($args =~ /((?:struct|union|const)\s+)?([\w*\[\]_]+)\s*(\w+),?/g) {
+        my $const_type = $1;
+        my $type = $2;
+        my $vname = $3;
+        next if ($type eq '__code');
+        $type =~ s/(?:Impl|Type|Isa)/union Data/;
+        my $val = "$type $vname;\n";
+        push(@tmp_args, $const_type ?  "$const_type$val" : $val);
+      }
+      next;
     }
 
-    push(@{$ir->{content}},$line);
+    $line =~ s/^\s+//;
+    push(@tmp_args,$line);
   }
 
+  push(@{$ir->{content}}, uniq(@tmp_args));
   return $ir;
 }
 
@@ -298,5 +314,4 @@
   return \%res;
 }
 
-
 1;
--- a/src/impl/pipe.h	Sun Feb 02 13:31:03 2020 +0900
+++ b/src/impl/pipe.h	Mon Feb 03 17:12:35 2020 +0900
@@ -9,8 +9,10 @@
     int writeopen;  // write fd is still open
 
     int ref;   // reference count
+    /*
     char readable;
     char writable;
+    */
     unsigned int off;
 
     // interface field
--- a/src/impl/vm_impl.h	Sun Feb 02 13:31:03 2020 +0900
+++ b/src/impl/vm_impl.h	Mon Feb 03 17:12:35 2020 +0900
@@ -39,8 +39,8 @@
     __code uva2ka_check_pe_types(Type* vm_impl, pde_t* pgdir, char* uva, __code next(...));
     __code paging_intvm_impl(Type* vm_impl, uint phy_low, uint phy_hi, __code next(...));
     __code copyout_loopvm_impl(Type* vm_impl, pde_t* pgdir, uint va, void* pp, uint len, __code next(...));
-    __code switchuvm_check_pgdirvm_impl(struct vm_impl* vm_impl, struct proc* p, __code next(...));
-    __code init_inituvm_check_sz(struct vm_impl* vm_impl, pde_t* pgdir, char* init, uint sz, __code next(...));
+    __code switchuvm_check_pgdirvm_impl(Type* vm_impl, proc_struct* p, __code next(...));
+    __code init_inituvm_check_sz(Type* vm_impl, pde_t* pgdir, char* init, uint sz, __code next(...));
     __code void_ret(Type* vm_impl);
     __code next(...);
 } vm_impl;