changeset 668:6c07eb2d4d39

...
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Tue, 18 Aug 2020 21:59:47 +0900
parents 72b7863ea5b4
children e8800c60811a
files src/parallel_execution/generate_stub.pl
diffstat 1 files changed, 41 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/generate_stub.pl	Tue Aug 18 19:56:33 2020 +0900
+++ b/src/parallel_execution/generate_stub.pl	Tue Aug 18 21:59:47 2020 +0900
@@ -69,7 +69,8 @@
 my $interface;
 my %call_interfaces;
 my $interface_name_to_header_path = create_interface_name_to_header_path($FindBin::Bin);
-my $cbc_name_to_source_path       = create_cbc_name_to_source_path($FindBin::Bin);
+my $search_cbc_from_code_gear_and_filename  = create_search_cbc_file_from_code_gear_name_and_filename($FindBin::Bin);
+
 
 
 # this for statement is main routine
@@ -135,16 +136,16 @@
                 }
                 $interface = $1;
                 $implementation = $3;
-                if ( -f "$interface.cbc") {
-                    &getDataGear("$interface.cbc");
+                if ($search_cbc_from_code_gear_and_filename->($interface, $filename)) {
+                    &getDataGear($search_cbc_from_code_gear_and_filename->($interface, $filename));
                 }
             } elsif(/^(.*)par goto (\w+)\((.*)\)/) {
                 my $codeGearName = $2;
                 if ($filename =~ /^(.*)\/(.*)/) {
                     $codeGearName = "$1/$codeGearName";
                 }
-                if ( -f "$codeGearName.cbc") {
-                    &getCodeGear("$codeGearName.cbc");
+                if ($search_cbc_from_code_gear_and_filename->($codeGearName, $filename)) {
+                    &getDataGear($search_cbc_from_code_gear_and_filename->($codeGearName, $filename));
                 }
             } elsif(/^#interface "(.*)"/) {
                 # use interface
@@ -159,11 +160,8 @@
                 }
             } elsif (/^\_\_code (\w+)\((.*)\)(.*)/) {
                 my $codeGearName = $1;
-                if ($filename =~ /^(.*)\/(.*)/) {
-                    $codeGearName = "$1/$codeGearName";
-                }
-                if ( -f "$codeGearName.cbc") {
-                    &getCodeGear("$codeGearName.cbc");
+                if ($search_cbc_from_code_gear_and_filename->($codeGearName, $filename)) {
+                    &getCodeGear($search_cbc_from_code_gear_and_filename->($codeGearName, $filename));
                 }
             }
             next;
@@ -748,6 +746,17 @@
 }
 
 sub create_cbc_name_to_source_path {
+  # create this structure
+  #
+  # {
+  #    SemaphoreImpl.cbc           [
+  #      [0] "/Users/anatofuz/src/firefly/hg/Gears/Gears/src/parallel_execution/SemaphoreImpl.cbc",
+  #      [1] "/Users/anatofuz/src/firefly/hg/Gears/Gears/src/parallel_execution/examples/boundedBuffer/SemaphoreImpl.cbc"
+  #  ],
+  #  SingleLinkedQueue.cbc       [
+  #      [0] "/Users/anatofuz/src/firefly/hg/Gears/Gears/src/parallel_execution/SingleLinkedQueue.cbc"
+  #  ],
+  # }
   my $search_root = shift;
   my $files = Gears::Util->find_cbc_sources_from_path($search_root);
 
@@ -760,3 +769,25 @@
   return $cbc_name2_source_path;
 }
 
+sub create_search_cbc_file_from_code_gear_name_and_filename {
+  my $search_root = shift;
+  my $cbc_name2_source_path = create_cbc_name_to_source_path($search_root);
+
+  # return sub is create clojure
+  return sub {
+    my ($codeGearName, $filename) = @_;
+    my $cbc_files_ref = $cbc_name2_source_path->{$codeGearName} // [];
+    my @cbc_files = @$cbc_files_ref;
+
+    if (scalar(@cbc_files) == 0) { # Not Found
+      return 0; #false case
+    }
+
+    if (scalar(@cbc_files) == 1) { # this case  $codeGearName.cbc is single (SingleLinkedQueue.cbc)
+      return shift @cbc_files;     # return "/Users/anatofuz/src/firefly/hg/Gears/Gears/src/parallel_execution/SingleLinkedQueue.cbc"
+    }
+
+
+    $filename = rel2abs($filename);
+  }
+}