changeset 677:47910f7c731e

remove some global variables
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Wed, 19 Aug 2020 19:31:00 +0900
parents 4b0ca2c6c8cb
children 8c147f6e1346
files src/parallel_execution/generate_stub.pl src/parallel_execution/lib/Gears/Util.pm
diffstat 2 files changed, 51 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/generate_stub.pl	Wed Aug 19 15:41:14 2020 +0900
+++ b/src/parallel_execution/generate_stub.pl	Wed Aug 19 19:31:00 2020 +0900
@@ -55,6 +55,8 @@
   $context_name = $projects{$opt_project}->{context};
 }
 
+
+
 my %var;
 my %code;
 my %dataGearVar;
@@ -65,13 +67,12 @@
 my %generic;
 my %dataGearVarType;
 my %codeGear;
-my $implementation;
-my $interface;
 my %call_interfaces;
 my $interfaceNameToHeaderPath = createInterfaceNameToHeaderPath($FindBin::Bin);
 my $searchCbCFromCodeGearAndFilename  = createSearchCbCFileFromCodeGearNameAndFilename($FindBin::Bin);
 my %filename2EachCodeGearArgs;
 
+my $implInterfaceInfo = {isImpl => undef, implementation => undef, interface => undef};
 
 
 # this for statement is main routine
@@ -113,7 +114,7 @@
 sub getDataGear {
     my ($filename) = @_;
 
-    my ($codeGearName, $name, $inTypedef,$described_data_gear, $codeGearName2Args);
+    my ($codeGearName, $name, $inTypedef,$described_data_gear, $codeGearName2Args, $currentCodeGear);
     open my $fd,"<",$filename or die("can't open $filename $!");
     while (<$fd>) {
         if (! $inTypedef) {
@@ -132,13 +133,23 @@
                 $var{$name} = {};
                 $code{$name} = {};
                 $generic{$name} = [];
-            } elsif (/^(\w+)(\*)+ create(\w+)\(/) {
-                if (defined $interface) {
-                   die "duplicate interface $interface\n";
+            } elsif (/^(\w+)(\*)+ create(\w+)\(/) { # this case implementation constructor
+                if (defined $implInterfaceInfo->{interface} ) {
+                   die "duplicate interface $implInterfaceInfo->{interface}\n";
                 }
-                $interface = $1;
-                $implementation = $3;
-                my $cbc_source_path = $searchCbCFromCodeGearAndFilename->($interface, $filename);
+                my $interfaceName = $1;
+                $implInterfaceInfo->{isImpl} = 1;
+                $implInterfaceInfo->{interface} = $interfaceName;
+                $implInterfaceInfo->{implementation} = $3;
+                my $cbc_source_path = $searchCbCFromCodeGearAndFilename->($interfaceName, $filename);
+                if ($cbc_source_path) {
+                    &getDataGear($cbc_source_path);
+                }
+            } elsif (/^(\w+)(\*)\s+(\w+)\s+=\s+create(\w+)\(.*\);/) { # this case use constructor
+                my $interfaceName = $1;
+                my $instance = $2;
+                my $impl = $3;
+                my $cbc_source_path = $searchCbCFromCodeGearAndFilename->($interfaceName, $filename);
                 if ($cbc_source_path) {
                     &getDataGear($cbc_source_path);
                 }
@@ -171,6 +182,7 @@
                 for my $tname (keys %$tname2type) {
                   $codeGearName2Args->{$codeGearName}->{$tname} = $tname2type->{$tname};
                 }
+                $currentCodeGear = $codeGearName;
             } elsif (/^(.*)goto (\w+)\-\>(\w+)\((.*)\);/) {
                 # handling goto statement
                 # convert it to the meta call form with two arugments, that is context and enum Code
@@ -178,6 +190,8 @@
                 my $next = $2;
                 my $method = $3;
                 my $tmpArgs = $4;
+
+
             }
             next;
         }
@@ -331,7 +345,12 @@
 }
 
 sub generateStubArgs {
-    my($codeGearName, $varName, $typeName, $ptrType, $typeField, $interface,$output) = @_;
+    my($codeGearName, $varName, $typeName, $ptrType, $typeField, $implInterfaceInfo,$output) = @_;
+
+    my $isImpl = $implInterfaceInfo->{isImpl};
+    my $interfaceName = $implInterfaceInfo->{interface};
+    my $implName = $implInterfaceInfo->{implementation};
+
     my $varname1 = $output ? "O_$varName" : $varName;
     for my $n ( @{$dataGearVar{$codeGearName}} ) {
         # we already have it
@@ -339,35 +358,37 @@
     }
     push @{$dataGearVar{$codeGearName}}, $varname1;
     push @{$dataGearVarType{$codeGearName}}, $typeName;
-    if ($implementation && ($implementation eq $typeName)) {
-        # get implementation
-        $dataGearName{$codeGearName} .= "\t$typeName* $varName = ($typeName*)GearImpl($context_name, $interface, $varName);\n";
-        return 1;
+    if ($isImpl){
+        if ($implName eq $typeName) {
+          # get implementation
+          $dataGearName{$codeGearName} .= "\t$typeName* $varName = ($typeName*)GearImpl($context_name, $interfaceName, $varName);\n";
+          return 1;
+        }
     }
 
 
     # interface var
-    if ($interface) {
-      for my $ivar (keys %{$var{$interface}}) {
+    if ($isImpl) {
+      for my $ivar (keys %{$var{$interfaceName}}) {
           #  input data gear field
           if ($varName eq $ivar) {
-              if ($typeName eq $var{$interface}->{$ivar}) {
+              if ($typeName eq $var{$interfaceName}->{$ivar}) {
                   if ($output) {
-                      $dataGearName{$codeGearName} .= "\t$typeName$ptrType* O_$varName = &Gearef($context_name, $interface)->$varName;\n";
+                      $dataGearName{$codeGearName} .= "\t$typeName$ptrType* O_$varName = &Gearef($context_name, $interfaceName)->$varName;\n";
                       $outputVar{$codeGearName} .= "\t$typeName$ptrType $varName  __attribute__((unused))  = *O_$varName;\n";
                       return 1;
                   }
-                  $dataGearName{$codeGearName} .= "\t$typeName$ptrType $varName = Gearef($context_name, $interface)->$varName;\n";
+                  $dataGearName{$codeGearName} .= "\t$typeName$ptrType $varName = Gearef($context_name, $interfaceName)->$varName;\n";
                   return 1;
               }
           }
       }
 
       # interface continuation
-      for my $cName (keys %{$code{$interface}}) {
+      for my $cName (keys %{$code{$interfaceName}}) {
           if ($varName eq $cName) {
               # continuation field
-              $dataGearName{$codeGearName} .= "\tenum Code $varName = Gearef($context_name, $interface)->$varName;\n";
+              $dataGearName{$codeGearName} .= "\tenum Code $varName = Gearef($context_name, $interfaceName)->$varName;\n";
               return 1;
           }
       }
@@ -402,8 +423,8 @@
 
     # par goto continuation
     # global or local variable case
-    if (($typeName eq "Code") && $interface) {
-        $dataGearName{$codeGearName} .= "\tenum $typeName$ptrType $varName = Gearef(${context_name}, $interface)->$varName;\n";
+    if (($typeName eq "Code") && $isImpl) {
+        $dataGearName{$codeGearName} .= "\tenum $typeName$ptrType $varName = Gearef(${context_name}, $interfaceName)->$varName;\n";
         return 1;
     }
     $dataGearName{$codeGearName} .= "\t$typeName$ptrType $varName = Gearef($context_name, $typeName);\n";
@@ -500,7 +521,7 @@
                     if ($args =~ s/^(\s)*\_\_code\s+(\w+)\(([^)]*)\)//) {
                         my $next = $2;
                         my @args = split(/,/,$3);
-                        if (generateStubArgs($codeGearName, $next, "Code", "", $next, $interface,0) ) {
+                        if (generateStubArgs($codeGearName, $next, "Code", "", $next, $implInterfaceInfo,0) ) {
                             $newArgs .= "enum Code $next";
                         }
                         # analyze continuation arguments
@@ -519,7 +540,7 @@
                         }
                             my $typeField = lcfirst($typeName);
                             push(@{$outputArgs{$codeGearName}->{$next}}, $varName);
-                            if (generateStubArgs($codeGearName, $varName, $typeName, $ptrType, $typeField, $interface,1)) {
+                            if (generateStubArgs($codeGearName, $varName, $typeName, $ptrType, $typeField, $implInterfaceInfo,1)) {
                                 $newArgs .= ",$structType $typeName **O_$varName";
                             }
                         }
@@ -533,7 +554,7 @@
                             $typeName = "$structType $typeName";
                         }
                         my $typeField = lcfirst($typeName);
-                        generateStubArgs($codeGearName, $varName, $typeName, $ptrType, $typeField, $interface,0);
+                        generateStubArgs($codeGearName, $varName, $typeName, $ptrType, $typeField, $implInterfaceInfo,0);
                     } elsif ($args =~ s/(.*,)//) {
                         $newArgs .= $1;
                     } else {
@@ -693,7 +714,7 @@
                     # continuation arguments
                     $v = 1  if ( $n eq $next);
                 }
-                if ($v || ($interface && defined $code{$interface}->{$next})) {
+                if ($v || ($implInterfaceInfo->{isImpl} && defined $code{$implInterfaceInfo->{interface}}->{$next})) {
                     # write continuation's arguments into the interface arguments
                     # we may need a commit for a shared DataGear
                     for my $arg ( @{$outputArgs{$codeGearName}->{$next}} ) {
--- a/src/parallel_execution/lib/Gears/Util.pm	Wed Aug 19 15:41:14 2020 +0900
+++ b/src/parallel_execution/lib/Gears/Util.pm	Wed Aug 19 19:31:00 2020 +0900
@@ -1,7 +1,7 @@
 package Gears::Util;
 use strict;
 use warnings;
-use Carp qw/croak/;
+use Carp qw/croak carp/;
 use File::Find;
 
 sub parse {
@@ -55,7 +55,8 @@
   }
 
   if ($line =~ /typedef struct (\w+)\s?<.*>([\s\w{]+)/) {
-    die "invalied struct name $1" unless $1;
+    carp "invalied struct name $1" unless $1;
+    return undef;
     $ir->{name} = $1;
 
     if ($2 =~ m|\s*impl\s*([\w+]+)\s*{|) {