# HG changeset patch # User anatofuz # Date 1597833060 -32400 # Node ID 47910f7c731edb1495ce58505164f82712c1d42f # Parent 4b0ca2c6c8cbadbc03511a2e955df8b1ce5b8d26 remove some global variables diff -r 4b0ca2c6c8cb -r 47910f7c731e src/parallel_execution/generate_stub.pl --- 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}} ) { diff -r 4b0ca2c6c8cb -r 47910f7c731e src/parallel_execution/lib/Gears/Util.pm --- 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*{|) {