changeset 679:c65f8f00ba6f

analyze the interface when goto using the interface
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Thu, 20 Aug 2020 20:20:59 +0900
parents 8c147f6e1346
children ce8dadfb7043
files src/parallel_execution/generate_stub.pl src/parallel_execution/lib/Gears/Util.pm
diffstat 2 files changed, 37 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/generate_stub.pl	Wed Aug 19 19:31:23 2020 +0900
+++ b/src/parallel_execution/generate_stub.pl	Thu Aug 20 20:20:59 2020 +0900
@@ -114,7 +114,7 @@
 sub getDataGear {
     my ($filename) = @_;
 
-    my ($codeGearName, $name, $inTypedef,$described_data_gear, $codeGearName2Args, $currentCodeGear);
+    my ($codeGearName, $name, $inTypedef,$described_data_gear, $currentCodeGear, $codeGearInfo);
     open my $fd,"<",$filename or die("can't open $filename $!");
     while (<$fd>) {
         if (! $inTypedef) {
@@ -145,14 +145,6 @@
                 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);
-                }
             } elsif(/^(.*)par goto (\w+)\((.*)\)/) {
                 my $codeGearName = $2;
                 my $cbc_source_path = $searchCbCFromCodeGearAndFilename->($codeGearName, $filename);
@@ -178,20 +170,43 @@
                 if ($cbc_source_path) {
                     &getCodeGear($cbc_source_path);
                 }
-                my $tname2type = parseCodeGearDeclarationArg($args);
-                for my $tname (keys %$tname2type) {
-                  $codeGearName2Args->{$codeGearName}->{$tname} = $tname2type->{$tname};
+                my $vname2type = parseCodeGearDeclarationArg($args);
+                for my $vname (keys %$vname2type) {
+                  $codeGearInfo->{$codeGearName}->{arg}->{$vname} = $vname2type->{$vname};
                 }
                 $currentCodeGear = $codeGearName;
+            } elsif ((/^\s*(\w+)?\s*(\w+)(\*)\s+(\w+)\s+=/) && $currentCodeGear) { # collect local variables
+                my $structType = $1;
+                my $interfaceName = $2;
+                my $instance = $4;
+                $codeGearInfo->{$currentCodeGear}->{localVar}->{$instance} = $interfaceName;
             } elsif (/^(.*)goto (\w+)\-\>(\w+)\((.*)\);/) {
                 # handling goto statement
                 # convert it to the meta call form with two arugments, that is context and enum Code
                 my $prev = $1;
-                my $next = $2;
+                my $instance = $2;
                 my $method = $3;
                 my $tmpArgs = $4;
+                my $typeName = $codeGearInfo->{$currentCodeGear}->{arg}->{$instance};
+                unless ($typeName) {
+                  #this case is not __code arguments.
+                  for my $localVar (keys %{$codeGearInfo->{$currentCodeGear}->{localVar}}) {
+                    if ($localVar eq $instance) {
+                      $typeName = $codeGearInfo->{$currentCodeGear}->{localVar}->{$localVar};
+                    }
+                  }
+                  unless ($typeName){
+                    use DDP {deparse => 1};
+                    print "[ERROR] $.: $_\n";
+                    p $codeGearInfo;
+                    die "[ERROR] not found $instance type\n";
+                  }
+                }
 
+                print "[INFO] found instance $instance, typeName $typeName\n";
 
+            } elsif (/^}$/) {
+              $currentCodeGear = undef;
             }
             next;
         }
@@ -229,7 +244,7 @@
         }
     }
 
-    $filename2EachCodeGearArgs{$filename} = $codeGearName2Args;
+    $filename2EachCodeGearArgs{$filename} = $codeGearInfo;
 
 }
 
--- a/src/parallel_execution/lib/Gears/Util.pm	Wed Aug 19 19:31:23 2020 +0900
+++ b/src/parallel_execution/lib/Gears/Util.pm	Thu Aug 20 20:20:59 2020 +0900
@@ -55,11 +55,15 @@
   }
 
   if ($line =~ /typedef struct (\w+)\s?<.*>([\s\w{]+)/) {
-    carp "invalied struct name $1" unless $1;
-    return undef;
-    $ir->{name} = $1;
+    my $vname = $1;
+    unless ($vname) {
+      carp "[WARN] invalied struct name from $file";
+      return undef;
+    }
+    $ir->{name} = $vname;
+    my $annotation = $2;
 
-    if ($2 =~ m|\s*impl\s*([\w+]+)\s*{|) {
+    if ($annotation =~ m|\s*impl\s*([\w+]+)\s*{|) {
       $ir->{isa} = $1;
     }
   }