annotate src/parallel_execution/generate_stub.pl @ 252:682b1195e604

fix stub
author mir3636
date Thu, 26 Jan 2017 17:38:33 +0900
parents 0ab52d6e2fd9
children ebc13549394c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
194
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
1 #!/usr/bin/perl
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
2
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
3 use strict;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
4
194
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
5 # interface.cbc
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
6 # typedef struct Worker {
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
7 # int id;
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
8 # struct Context* contexts;
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
9 # enum Code execute;
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
10 # enum Code taskSend;
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
11 # enum Code taskRecive;
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
12 # enum Code shutdown;
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
13 # struct Queue* tasks;
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
14 # } Worker;
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
15
252
682b1195e604 fix stub
mir3636
parents: 251
diff changeset
16 #while (<*.cbc>) {
682b1195e604 fix stub
mir3636
parents: 251
diff changeset
17 while (<SingleLinkedStack.cbc>) {
249
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
18 my $fn = $_;
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
19 &getDataGear($fn);
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
20 &generateDataGear($fn);
194
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
21 }
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
22
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
23 my %var;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
24 my %type;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
25 my %code;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
26 my %dataGearVar;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
27 my %dataGear;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
28 my %dataGearName;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
29
194
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
30 sub getDataGear {
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
31 my ($filename) = @_;
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
32 my ($interface, $implementation, $codeGearName, $name, $inTypedef);
194
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
33 open my $fd,"<",$filename or die("can't open $filename $!");
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
34 while (<$fd>) {
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
35 if (! $inTypedef) {
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
36 if (/^typedef struct (\w+) {/) {
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
37 $inTypedef = 1;
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
38 $name = $1;
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
39 $dataGear{$name} = $_;
249
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
40 } elsif (/^(\w+)\* create(\w+)\(/) {
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
41 if (defined $interface) {
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
42 die "duplicate interface $interface\n";
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
43 }
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
44 $interface = $1;
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
45 $implementation = $2;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
46 if ( -f "$interface.cbc") {
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
47 &getDataGear("$interface.cbc");
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
48 }
249
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
49 } elsif (/^\_\_code (\w+)/) {
226
68c03e7057d9 get arg
mir3636
parents: 201
diff changeset
50 $codeGearName = $1;
249
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
51 $dataGearVar{$codeGearName} = [];
252
682b1195e604 fix stub
mir3636
parents: 251
diff changeset
52 args:while (/(struct|union) (\w+)(\*)+\s(\w+)/g) {
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
53 my $structType = $1;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
54 my $typeName = $2;
252
682b1195e604 fix stub
mir3636
parents: 251
diff changeset
55 my $varName = $4;
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
56 my $typeField = lcfirst($typeName);
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
57 push @{$dataGearVar{$codeGearName}},$varName;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
58 if ($typeField ne $varName) {
252
682b1195e604 fix stub
mir3636
parents: 251
diff changeset
59 $dataGearName{$codeGearName} .= "\t$typeName* $varName = ($typeName*)GearImpl(context, $varName, $varName);\n";
682b1195e604 fix stub
mir3636
parents: 251
diff changeset
60 print STDOUT "$codeGearName \t$typeName* $varName = ($typeName*)GearImpl(context, $varName, $varName);\n";
243
6a80ab36181c generate impl
mir3636
parents: 231
diff changeset
61 } else {
252
682b1195e604 fix stub
mir3636
parents: 251
diff changeset
62 for my $ivar ($var{$interface}) {
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
63 if ($varName eq $ivar) {
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
64 $dataGearName{$codeGearName} .= "\t$typeName* $varName = Gearef(context, $interface)->$varName;\n";
252
682b1195e604 fix stub
mir3636
parents: 251
diff changeset
65 print STDOUT "$codeGearName \t$typeName* $varName = Gearef(context, $interface)->$varName;\n";
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
66 next args;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
67 }
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
68 }
252
682b1195e604 fix stub
mir3636
parents: 251
diff changeset
69 $dataGearName{$codeGearName} .= "\t$typeName* $varName = Gearef(context, $typeName)->$typeField;\n";
682b1195e604 fix stub
mir3636
parents: 251
diff changeset
70 print STDOUT "$codeGearName \t$typeName* $varName = Gearef(context, $typeName)->$typeField;\n";
243
6a80ab36181c generate impl
mir3636
parents: 231
diff changeset
71 }
226
68c03e7057d9 get arg
mir3636
parents: 201
diff changeset
72 }
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
73 $dataGearName{$codeGearName} .= "\tgoto $codeGearName(context";
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
74 for my $arg ( @{$dataGearVar{$codeGearName}}) {
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
75 $dataGearName{$codeGearName} .= ", $arg";
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
76 }
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
77 $dataGearName{$codeGearName} .= ");";
226
68c03e7057d9 get arg
mir3636
parents: 201
diff changeset
78 }
194
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
79 next;
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
80 }
249
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
81 # gather type name and type
194
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
82 $dataGear{$name} .= $_;
195
bd96dffaa76a generate_stub
mir3636
parents: 194
diff changeset
83 if (/(\w+);$/ and !/^} (\w+)/) {
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
84 my $tmp = $1 . "\n";
200
207aff30ed34 fix generate_stub.pl
mir3636
parents: 195
diff changeset
85 if (/{/) {
207aff30ed34 fix generate_stub.pl
mir3636
parents: 195
diff changeset
86 $tmp = "{" . $';
201
mir3636
parents: 200
diff changeset
87 $tmp =~ s/;$//;
200
207aff30ed34 fix generate_stub.pl
mir3636
parents: 195
diff changeset
88 }
207aff30ed34 fix generate_stub.pl
mir3636
parents: 195
diff changeset
89 $var{$name} .= $tmp;
195
bd96dffaa76a generate_stub
mir3636
parents: 194
diff changeset
90 $tmp = $`;
bd96dffaa76a generate_stub
mir3636
parents: 194
diff changeset
91 $tmp =~ s/^\s*//;
bd96dffaa76a generate_stub
mir3636
parents: 194
diff changeset
92 $type{$name} .= $tmp . "\n";
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
93 } elsif (/\_\_code (\w+)\(/) {
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
94 push $code{$name}, $1;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
95 }
194
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
96 if (/^}/) {
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
97 $inTypedef = 0;
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
98 }
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
99 }
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
100 }
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
101
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
102 sub generateStub {
251
0ab52d6e2fd9 fix sub generateStub
mir3636
parents: 250
diff changeset
103 my($fd,$prevCodeGearName,$dataGearName) = @_;
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
104 print $fd "__code ", $prevCodeGearName ,"_stub (struct Context* context) {\n";
251
0ab52d6e2fd9 fix sub generateStub
mir3636
parents: 250
diff changeset
105 print $fd $dataGearName;
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
106 print $fd "\n} \n\n";
251
0ab52d6e2fd9 fix sub generateStub
mir3636
parents: 250
diff changeset
107 return 1;
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
108 }
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
109
194
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
110 sub generateDataGear {
249
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
111 my ($filename) = @_;
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
112 my $fn1 = $filename;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
113 $fn1 =~ s/\.cbc/.c/;
249
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
114 open my $in,"<",$filename or die("can't open $filename $!");
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
115 my $i = 1;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
116 my $fn = $fn1;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
117 while ( -f $fn) {
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
118 $fn = "$fn1.$i";
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
119 $i++;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
120 }
249
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
121 open my $fd,">",$fn or die("can't write $fn $!");
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
122 my $prevCodeGearName;
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
123 my $inTypedef = 0;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
124 my %stub;
251
0ab52d6e2fd9 fix sub generateStub
mir3636
parents: 250
diff changeset
125 my $codeGearName;
249
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
126 while (<$in>) {
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
127 if (! $inTypedef) {
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
128 if (/^typedef struct (\w+) {/) {
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
129 $inTypedef = 1;
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
130 } elsif (/^\_\_code (\w+)/) {
251
0ab52d6e2fd9 fix sub generateStub
mir3636
parents: 250
diff changeset
131 $codeGearName = $1;
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
132 if ($codeGearName =~ /_stub$/) {
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
133 $stub{$codeGearName} = 1;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
134 print $fd $_;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
135 next;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
136 }
252
682b1195e604 fix stub
mir3636
parents: 251
diff changeset
137 $prevCodeGearName = $codeGearName;
249
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
138 if (defined $prevCodeGearName) {
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
139 if (defined $stub{$prevCodeGearName."_stub"}) {
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
140 undef $prevCodeGearName;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
141 print $fd $_;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
142 next;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
143 }
251
0ab52d6e2fd9 fix sub generateStub
mir3636
parents: 250
diff changeset
144 $stub{$prevCodeGearName."_stub"} = &generateStub($fd,$prevCodeGearName,$dataGearName{$codeGearName});
249
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
145 }
252
682b1195e604 fix stub
mir3636
parents: 251
diff changeset
146 #$prevCodeGearName = $codeGearName;
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
147 } elsif (/^(.*)goto next\(\.\.\.(.*)\);/) {
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
148 my $prev = $1;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
149 my $args = $2;
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
150 print $fd "${prev}goto meta(context, next);\n";
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
151 next;
249
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
152 }
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
153 print $fd $_;
249
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
154 next;
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
155 }
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
156 # gather type name and type
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
157 if (/^}/) {
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
158 $inTypedef = 0;
afa1e02e4386 fix generate stub
mir3636
parents: 243
diff changeset
159 }
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
160 print $fd $_;
194
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
161 }
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
162 if (defined $prevCodeGearName) {
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
163 if (!defined $stub{$prevCodeGearName."_stub"}) {
251
0ab52d6e2fd9 fix sub generateStub
mir3636
parents: 250
diff changeset
164 $stub{$prevCodeGearName."_stub"} = &generateStub($fd,$prevCodeGearName,$dataGearName{$codeGearName});
250
8a8963ce9858 fix generate_stub
mir3636
parents: 249
diff changeset
165 }
228
55260ff44c8c generate stub
mir3636
parents: 226
diff changeset
166 }
194
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
167 }
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
168
081607dcf893 create generate_stub.pl
mir3636
parents:
diff changeset
169 # end