# HG changeset patch # User anatofuz # Date 1575294677 -32400 # Node ID 823503ada47f2a476d00a12c9f47230fea368739 # Parent ba529ff3f068300c5765321addb52d351305c252 add SingleLinkedStack.h diff -r ba529ff3f068 -r 823503ada47f src/parallel_execution/plautogen/impl/SingleLinkedStack.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/parallel_execution/plautogen/impl/SingleLinkedStack.h Mon Dec 02 22:51:17 2019 +0900 @@ -0,0 +1,26 @@ +typedef struct SingleLinkedStack impl Stack { + struct Element* top; +} SingleLinkedStack; + +/* + // Stack Interface + struct Stack { + union Data* stack; + union Data* data; + union Data* data1; + enum Code whenEmpty; + enum Code clear; + enum Code push; + enum Code pop; + enum Code pop2; + enum Code isEmpty; + enum Code get; + enum Code get2; + enum Code next; + } Stack; + // Stack implementations + struct SingleLinkedStack { + struct Element* top; + } SingleLinkedStack; + */ + diff -r ba529ff3f068 -r 823503ada47f src/parallel_execution/trans_impl.pl --- a/src/parallel_execution/trans_impl.pl Thu Nov 28 16:33:01 2019 +0900 +++ b/src/parallel_execution/trans_impl.pl Mon Dec 02 22:51:17 2019 +0900 @@ -104,6 +104,7 @@ sub emit_code_gears { my ($out, $impl_ir, $inter_ir) = @_; my $impl = $impl_ir->{name}; + my $interface_name = $inter_ir->{name}; my @inter_data = @{$inter_ir->{data}}; my $instance_inter = shift @inter_data; @@ -114,22 +115,44 @@ $instance_impl =~ s/([A-Z])/_\l$1/g; my $data_gear_types = {}; + if (defined $impl_ir->{codes}) { + for my $cg (@{$impl_ir->{codes}}) { + while ($data_gears =~ /Type\*\s*(\w+),/g) { + $data_gears =~ s/Type\*/struct $impl*/; + } + + while ($data_gears =~ /Isa\*\s*(\w+),/g) { + $data_gears =~ s/Isa\*/struct $inter_name*/; + } + print $out "__code $code_ir->{name}$impl("; + print $out "$data_gears) {\n\n"; + + #__code next(...), __code whenEmpty(...) + my @cg = (); + while ($data_gears =~ /__code ([\w(\.)\*\s,]+?\)),?/g) { + push(@cg, $1); + } + + if (@cg) { + if (@cg == 2) { + print $out " if (:TODO:) {\n"; + print $out " goto ",shift(@cg),";\n"; + print $out " }\n"; + print $out " goto ",shift(@cg),";\n"; + } else { + print $out " goto ",shift(@cg),";\n"; + } + } + print $out "}\n\n"; + } + } + for my $code_ir (@{$inter_ir->{codes}}) { my $data_gears = $code_ir->{args}; $data_gears =~ s/Impl/struct $impl/g; + while ($data_gears =~ /Type\*\s*(\w+),/g) { - my $target = $1; - if (exists $data_gear_types->{$target}){ - $data_gears =~ s/Type\*/$data_gear_types->{$target}/; - } else { - my $td = ""; - map { $td = $_ if ($_ =~ /$target/) } @inter_data; - if ($td =~ /(\w+)\s*([\w\*]+)\s*(\w+)/) { - my $tmp = "$1 $2"; - $data_gears =~ s/Type\*/$tmp/; - $data_gear_types->{$target} = $tmp; - } - } + $data_gears =~ s/Type\*/struct $interface_name*/; } print $out "__code $code_ir->{name}$impl(";