changeset 253:ebc13549394c

generate stubArgs
author mir3636
date Thu, 26 Jan 2017 19:52:08 +0900
parents 682b1195e604
children edb3aff688d0
files src/parallel_execution/SingleLinkedStack.cbc src/parallel_execution/generate_stub.pl src/parallel_execution/stack.c
diffstat 3 files changed, 88 insertions(+), 57 deletions(-) [+]
line wrap: on
line diff
--- 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) {
--- 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;
--- 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);
 }