Mercurial > hg > GearsTemplate
annotate src/parallel_execution/trans_impl.pl @ 560:2276952ed717
impl trans_impl.pl
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 19 Nov 2019 13:24:21 +0900 |
parents | 2dc06f944a85 |
children | aa4bef31cbfd |
rev | line source |
---|---|
555 | 1 #!/usr/bin/env perl |
2 use strict; | |
3 use warnings; | |
4 | |
557 | 5 use FindBin; |
6 use lib "$FindBin::Bin/lib"; | |
7 use Gears::Util; | |
555 | 8 |
557 | 9 use DDP { deparse => 1}; |
555 | 10 |
557 | 11 my $impl_file = shift or die 'require impl file'; |
560
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
12 my $impl_ir = Gears::Util->parse_code_verbose($impl_file); |
559 | 13 my $interface_file = Gears::Util->find_header($impl_ir->{isa},"$FindBin::Bin"); |
14 | |
15 my $inter_ir = Gears::Util->parse_code_verbose($interface_file); | |
16 my $stdout = *STDOUT; | |
560
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
17 emit_include_part($stdout, $inter_ir->{name}); |
559 | 18 emit_constracutor($stdout,$impl_ir,$inter_ir); |
560
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
19 emit_code_gears($stdout,$impl_ir,$inter_ir); |
559 | 20 #emit_impl_header_in_comment($stdout, $impl_file); |
21 | |
22 sub emit_include_part { | |
23 my ($out, $interface) = @_; | |
24 print $out <<"EOF" | |
25 #include "../context.h"; | |
26 #interface "$interface.h"; | |
27 | |
28 EOF | |
29 } | |
30 | |
31 sub emit_impl_header_in_comment { | |
32 my ($out, $impl_file) = @_; | |
33 my $line = Gears::Util->slup($impl_file); | |
34 print $out "// ----\n"; | |
35 map { print $out "// $_\n" } split /\n/, $line; | |
36 print $out "// ----\n"; | |
37 } | |
558 | 38 |
559 | 39 sub emit_constracutor { |
40 my ($out, $impl_ir, $inter_ir) = @_; | |
41 | |
560
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
42 my @inter_data = @{$inter_ir->{data}}; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
43 my $instance_inter = shift @inter_data; |
559 | 44 if ($instance_inter =~ /union\s*Data\*\s*(\w+)/) { |
45 $instance_inter = $1; | |
46 } | |
47 my $instance_impl = lcfirst $impl_ir->{name}; | |
48 | |
49 print $out <<"EOF"; | |
560
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
50 $impl_ir->{isa}* create$impl_ir->{name}(struct Context* context) { |
559 | 51 struct $impl_ir->{isa}* $instance_inter = new $impl_ir->{isa}(); |
52 struct $impl_ir->{name}* $instance_impl = new $impl_ir->{name}(); | |
53 $instance_inter->$instance_inter = (union Data*)$instance_impl; | |
54 EOF | |
55 | |
560
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
56 for my $datum (@inter_data) { |
559 | 57 if ($datum =~ /\w+ \w+\* (\w+)/) { |
560
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
58 print $out " ${instance_impl}->$1 = NULL;\n"; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
59 next; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
60 } |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
61 if ($datum =~ /\w+ \w+ (\w+)/) { |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
62 print $out " ${instance_impl}->$1 = 0;\n"; |
559 | 63 } |
64 } | |
65 | |
66 for my $code (@{$inter_ir->{codes}}) { | |
67 my $code_gear = $code->[0]; | |
68 print $out " ${instance_inter}->$code_gear = C_$code_gear$impl_ir->{name};\n" | |
69 } | |
70 | |
71 print $out " return $instance_inter;\n"; | |
72 print $out "}\n"; | |
73 } | |
74 | |
560
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
75 |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
76 sub emit_code_gears { |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
77 my ($out, $impl_ir, $inter_ir) = @_; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
78 my $impl = $impl_ir->{name}; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
79 |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
80 my @inter_data = @{$inter_ir->{data}}; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
81 my $instance_inter = shift @inter_data; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
82 if ($instance_inter =~ /union\s*Data\*\s*(\w+)/) { |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
83 $instance_inter = $1; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
84 } |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
85 my $instance_impl = lcfirst $impl_ir->{name}; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
86 my $data_gear_types = {}; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
87 |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
88 for my $code_ir (@{$inter_ir->{codes}}) { |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
89 my $data_gears = $code_ir->[1]; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
90 $data_gears =~ s/Impl/$impl/g; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
91 while ($data_gears =~ /Type\*\s*(\w+),/) { |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
92 my $target = $1; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
93 if (exists $data_gear_types->{$target}){ |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
94 $data_gears =~ s/Type\*/$data_gear_types->{$target}/; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
95 } else { |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
96 my $td = ""; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
97 map { $td = $_ if ($_ =~ /$target/) } @inter_data; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
98 if ($td =~ /(\w+)\s*([\w\*]+)\s*(\w+)/) { |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
99 my $tmp = "$1 $2"; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
100 $data_gears =~ s/Type\*/$tmp/; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
101 $data_gear_types->{$target} = $tmp; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
102 } |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
103 } |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
104 } |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
105 |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
106 print $out "__code $code_ir->[0]$impl("; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
107 print $out "$data_gears) {\n\n"; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
108 |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
109 #__code next(...), __code whenEmpty(...) |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
110 my @cg = (); |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
111 while ($data_gears =~ /__code ([\w(\.)\*\s,]+?\)),?/g) { |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
112 push(@cg, $1); |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
113 } |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
114 |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
115 if (@cg) { |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
116 if (@cg == 2) { |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
117 print $out " if (:TODO:) {\n"; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
118 print $out " goto ",shift(@cg),";\n"; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
119 print $out " }\n"; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
120 print $out " goto ",shift(@cg),";\n"; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
121 } else { |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
122 print $out " goto ",shift(@cg),";\n"; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
123 } |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
124 } |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
125 print $out "}\n\n"; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
126 } |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
127 } |