Mercurial > hg > Gears > Gears
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; } }