# HG changeset patch # User mir3636 # Date 1485427928 -32400 # Node ID ebc13549394c6efbc4a4d751ddf83421f15a43f2 # Parent 682b1195e6040bc1949763795313ffe81213ae91 generate stubArgs diff -r 682b1195e604 -r ebc13549394c src/parallel_execution/SingleLinkedStack.cbc --- a/src/parallel_execution/SingleLinkedStack.cbc Thu Jan 26 17:38:33 2017 +0900 +++ b/src/parallel_execution/SingleLinkedStack.cbc Thu Jan 26 19:52:08 2017 +0900 @@ -49,45 +49,42 @@ goto next(...); } -__code popSingleLinkedStack(struct SingleLinkedStack* stack, __code next(..., union Data*)) { - union Data* data; +__code popSingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, ...)) { if (stack->top) { - *data = stack->top->data; + data = stack->top->data; stack->top = stack->top->next; } else { - *data = NULL; + data = NULL; } - goto next(..., data); + goto next(data, ...); } -__code pop2SingleLinkedStack(struct SingleLinkedStack* stack, union Data** data, union Data** data1, __code next(..., union Data**, union Data**)) { +__code pop2SingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, union Data* data1, ...)) { if (stack->top) { - *data = stack->top->data; + data = stack->top->data; stack->top = stack->top->next; } else { - *data = NULL; + data = NULL; } if (stack->top) { - *data1 = stack->top->data; + data1 = stack->top->data; stack->top = stack->top->next; } else { - *data1 = NULL; + data1 = NULL; } - goto next(..., data, data1); + goto next(data, data1, ...); } -__code getSingleLinkedStack(struct SingleLinkedStack* stack, union Data** data, __code next(...)) { +__code getSingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, ...)) { if (stack->top) - *data = stack->top->data; + data = stack->top->data; else - *data = NULL; - goto next(...); + data = NULL; + goto next(data, ...); } -__code get2SingleLinkedStack(struct SingleLinkedStack* stack,..., __code next(...)) { - union Data* data, *data1; - +__code get2SingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, union Data* data1, ...)) { if (stack->top) { data = stack->top->data; if (stack->top->next) { diff -r 682b1195e604 -r ebc13549394c src/parallel_execution/generate_stub.pl --- a/src/parallel_execution/generate_stub.pl Thu Jan 26 17:38:33 2017 +0900 +++ b/src/parallel_execution/generate_stub.pl Thu Jan 26 19:52:08 2017 +0900 @@ -26,10 +26,12 @@ my %dataGearVar; my %dataGear; my %dataGearName; +my $implementation; +my $interface; sub getDataGear { my ($filename) = @_; - my ($interface, $implementation, $codeGearName, $name, $inTypedef); + my ($codeGearName, $name, $inTypedef); open my $fd,"<",$filename or die("can't open $filename $!"); while (<$fd>) { if (! $inTypedef) { @@ -37,6 +39,7 @@ $inTypedef = 1; $name = $1; $dataGear{$name} = $_; + $code{$name} = []; } elsif (/^(\w+)\* create(\w+)\(/) { if (defined $interface) { die "duplicate interface $interface\n"; @@ -46,35 +49,6 @@ if ( -f "$interface.cbc") { &getDataGear("$interface.cbc"); } - } elsif (/^\_\_code (\w+)/) { - $codeGearName = $1; - $dataGearVar{$codeGearName} = []; - args:while (/(struct|union) (\w+)(\*)+\s(\w+)/g) { - my $structType = $1; - my $typeName = $2; - my $varName = $4; - my $typeField = lcfirst($typeName); - push @{$dataGearVar{$codeGearName}},$varName; - if ($typeField ne $varName) { - $dataGearName{$codeGearName} .= "\t$typeName* $varName = ($typeName*)GearImpl(context, $varName, $varName);\n"; - print STDOUT "$codeGearName \t$typeName* $varName = ($typeName*)GearImpl(context, $varName, $varName);\n"; - } else { - for my $ivar ($var{$interface}) { - if ($varName eq $ivar) { - $dataGearName{$codeGearName} .= "\t$typeName* $varName = Gearef(context, $interface)->$varName;\n"; - print STDOUT "$codeGearName \t$typeName* $varName = Gearef(context, $interface)->$varName;\n"; - next args; - } - } - $dataGearName{$codeGearName} .= "\t$typeName* $varName = Gearef(context, $typeName)->$typeField;\n"; - print STDOUT "$codeGearName \t$typeName* $varName = Gearef(context, $typeName)->$typeField;\n"; - } - } - $dataGearName{$codeGearName} .= "\tgoto $codeGearName(context"; - for my $arg ( @{$dataGearVar{$codeGearName}}) { - $dataGearName{$codeGearName} .= ", $arg"; - } - $dataGearName{$codeGearName} .= ");"; } next; } @@ -107,6 +81,25 @@ return 1; } +sub generateStubArgs { + my($codeGearName, $varName, $typeName, $typeField, $interface) = @_; + push @{$dataGearVar{$codeGearName}},$varName; + if ($typeField ne $varName) { + $dataGearName{$codeGearName} .= "\t$typeName* $varName = ($typeName*)GearImpl(context, $typeName, $varName);\n"; + # print STDOUT "$codeGearName \t$typeName* $varName = ($typeName*)GearImpl(context, $typeName, $varName);\n"; + } else { + for my $ivar ($var{$interface}) { + if ($varName eq $ivar) { + $dataGearName{$codeGearName} .= "\t$typeName* $varName = Gearef(context, $interface)->$varName;\n"; + # print STDOUT "$codeGearName \t$typeName* $varName = Gearef(context, $interface)->$varName;\n"; + return; + } + } + $dataGearName{$codeGearName} .= "\t$typeName* $varName = Gearef(context, $typeName)->$typeField;\n"; + # print STDOUT "$codeGearName \t$typeName* $varName = Gearef(context, $typeName)->$typeField;\n"; + } +} + sub generateDataGear { my ($filename) = @_; my $fn1 = $filename; @@ -127,23 +120,60 @@ if (! $inTypedef) { if (/^typedef struct (\w+) {/) { $inTypedef = 1; - } elsif (/^\_\_code (\w+)/) { + } elsif (/^\_\_code (\w+)\((.*)\)(.*)/) { $codeGearName = $1; + my $args = $2; + my $tail = $3; if ($codeGearName =~ /_stub$/) { $stub{$codeGearName} = 1; print $fd $_; next; } - $prevCodeGearName = $codeGearName; if (defined $prevCodeGearName) { if (defined $stub{$prevCodeGearName."_stub"}) { undef $prevCodeGearName; print $fd $_; next; } - $stub{$prevCodeGearName."_stub"} = &generateStub($fd,$prevCodeGearName,$dataGearName{$codeGearName}); + $stub{$prevCodeGearName."_stub"} = &generateStub($fd,$prevCodeGearName,$dataGearName{$prevCodeGearName}); } - #$prevCodeGearName = $codeGearName; + $prevCodeGearName = $codeGearName; + $dataGearVar{$codeGearName} = []; + my $newArgs = ""; + while($args) { + if ($args =~ s/(^\s*,\s*)//) { + $newArgs .= $1; + } + # replace __code next + if ($args =~ s/^\_\_code\s(\w+)\([^)]*\)//) { + my $next = $1; + my @args = split(/,/,$2); + $newArgs .= "enum Code $next"; + for my $arg (@args) { + $arg =~ s/^\s*//; + $arg =~ s/^(struct|union) (\w+)(\*)+\s(\w+)//; + my $structType = $1; + my $typeName = $2; + my $varName = $4; + my $typeField = lcfirst($typeName); + &generateStubArgs($codeGearName, $varName, $typeName, $typeField, $interface); + } + } elsif ($args =~ s/^(struct|union) (\w+)(\*)+\s(\w+)//) { + my $structType = $1; + my $typeName = $2; + my $varName = $4; + my $typeField = lcfirst($typeName); + $newArgs .= $&; + &generateStubArgs($codeGearName, $varName, $typeName, $typeField, $interface); + } + } + $dataGearName{$codeGearName} .= "\tgoto $codeGearName(context"; + for my $arg ( @{$dataGearVar{$codeGearName}}) { + $dataGearName{$codeGearName} .= ", $arg"; + } + $dataGearName{$codeGearName} .= ");"; + print $fd "__code $codeGearName($newArgs)$tail\n"; + next; } elsif (/^(.*)goto next\(\.\.\.(.*)\);/) { my $prev = $1; my $args = $2; diff -r 682b1195e604 -r ebc13549394c src/parallel_execution/stack.c --- a/src/parallel_execution/stack.c Thu Jan 26 17:38:33 2017 +0900 +++ b/src/parallel_execution/stack.c Thu Jan 26 19:52:08 2017 +0900 @@ -75,19 +75,23 @@ context->data[D_Stack]->Stack.next); } -__code pop2SingleLinkedStack(struct Context* context, struct SingleLinkedStack* stack, union Data** data, union Data** data1, enum Code next) { +__code pop2SingleLinkedStack(struct Context* context, struct SingleLinkedStack* stack, union Data** _data, union Data** _data1, enum Code next) { + union Data* data; + union Data* data1; if (stack->top) { - *data = stack->top->data; + data = stack->top->data; stack->top = stack->top->next; } else { - *data = NULL; + data = NULL; } if (stack->top) { - *data1 = stack->top->data; + data1 = stack->top->data; stack->top = stack->top->next; } else { - *data1 = NULL; + data1 = NULL; } + *_data = data; + *_data1 = data1; goto meta(context, next); }