diff options
| author | Drahflow <drahflow@gmx.de> | 2013-01-07 15:30:21 +0100 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2013-01-07 15:30:21 +0100 |
| commit | abf250d1efb699ca0bfedc62c5ba1278c08fc32d (patch) | |
| tree | 52754094f5dd5fde54b6aa22570baea63f7d465b /interpreter | |
| parent | e816e6bbbfe03b0ab15344155250ced004a7f924 (diff) | |
Structs and scopes now inseparable
Diffstat (limited to 'interpreter')
| -rw-r--r-- | interpreter/Elymas.pm | 14 | ||||
| -rw-r--r-- | interpreter/ElymasAsm.pm | 4 | ||||
| -rw-r--r-- | interpreter/ElymasGlobal.pm | 18 | ||||
| -rw-r--r-- | interpreter/ElymasSys.pm | 10 |
4 files changed, 19 insertions, 27 deletions
diff --git a/interpreter/Elymas.pm b/interpreter/Elymas.pm index 0749443..dcd36ee 100644 --- a/interpreter/Elymas.pm +++ b/interpreter/Elymas.pm @@ -6,7 +6,7 @@ use warnings; require Exporter; our @ISA = qw(Exporter); our @EXPORT = qw( - popInt popString popArray enstruct arrayAccess $quoted @globalCallStack + popInt popString popArray arrayAccess $quoted @globalCallStack interpretCode execute executeString executeFile resolve canCastTo typeEqual ); @@ -40,12 +40,6 @@ sub popArray { return $a->[0]; } -sub enstruct { - my ($struct) = @_; - - return ($struct, ['struct', { map { my @e = ($_, [@{$struct->{$_}}]); shift @{$e[1]}; @e } keys %$struct }]); -} - sub arrayAccess { my ($array, $data, $scope) = @_; @@ -119,13 +113,13 @@ sub typeEqual { } elsif($a->[0] eq 'struct') { return 0 unless $b->[0] eq 'struct'; - my @aKeys = sort keys %{$a->[1]}; - my @bKeys = sort keys %{$b->[1]}; + my @aKeys = sort keys %{$a->[0]}; + my @bKeys = sort keys %{$b->[0]}; return 0 unless @aKeys == @bKeys; foreach my $i (0 .. $#aKeys) { return 0 unless $aKeys[$i] eq $bKeys[$i]; - return 0 unless typeEqual($a->[1]->{$aKeys[$i]}->[0], $b->[1]->{$bKeys[$i]}->[0]); + return 0 unless typeEqual($a->[0]->{$aKeys[$i]}->[1], $b->[0]->{$bKeys[$i]}->[1]); } return 1; diff --git a/interpreter/ElymasAsm.pm b/interpreter/ElymasAsm.pm index 2bf2295..3a13f53 100644 --- a/interpreter/ElymasAsm.pm +++ b/interpreter/ElymasAsm.pm @@ -29,7 +29,7 @@ our $asm = { my $size = popInt($data); my $block = ACME::Bare::Metal::allocate($size); - push @$data, [enstruct(constructBlock($block, $size))]; + push @$data, [constructBlock($block, $size), ['struct']]; }, ['func', 'sys .asm .alloc'], 'active'], 'allocAt' => [sub { my ($data) = @_; @@ -38,7 +38,7 @@ our $asm = { my $size = popInt($data); my $block = ACME::Bare::Metal::allocateAt($size, $addr); - push @$data, [enstruct(constructBlock($block, $size))]; + push @$data, [constructBlock($block, $size), ['struct']]; }, ['func', 'sys .asm .alloc'], 'active'], 'poke' => [sub { my ($data, $scope) = @_; diff --git a/interpreter/ElymasGlobal.pm b/interpreter/ElymasGlobal.pm index fddf483..34d86e3 100644 --- a/interpreter/ElymasGlobal.pm +++ b/interpreter/ElymasGlobal.pm @@ -192,11 +192,8 @@ our $global = { }, ['func', '<'], 'active'], '>' => [sub { my ($data, $scope) = @_; - my %struct = %$$scope; - delete $struct{' parent'}; - - push @$data, [enstruct(\%struct)]; + push @$data, [$$scope, ['struct']]; $$scope = $$scope->{' parent'}; }, ['func', '>'], 'active'], '.' => [sub { @@ -207,7 +204,7 @@ our $global = { $member = $member->[0]; die "not a struct during member dereference in " . Dumper($struct) unless ref($struct->[1]) eq 'ARRAY' and $struct->[1]->[0] eq 'struct'; - die Dumper($struct, $member) . "Cannot resolve requested member $member" unless exists $struct->[1]->[1]->{$member}; + die Dumper($struct, $member) . "Cannot resolve requested member $member" unless exists $struct->[0]->{$member}; push @$data, $struct->[0]->{$member}; execute($data, $scope) if($data->[-1]->[2] eq 'active'); @@ -219,7 +216,7 @@ our $global = { my $struct = pop @$data; die "not a struct during member dereference in $struct" unless $struct->[1]->[0] eq 'struct'; - die Dumper($struct, $member) . "Cannot resolve requested member $member" unless exists $struct->[1]->[1]->{$member}; + die Dumper($struct, $member) . "Cannot resolve requested member $member" unless exists $struct->[0]->{$member}; push @$data, $struct->[0]->{$member}; }, ['func', '.|'], 'active'], @@ -358,6 +355,8 @@ our $global = { $commonType = $b->[1]->[3]->[0]; } elsif(not @{$b->[0]}) { $commonType = $a->[1]->[3]->[0]; + } elsif($a->[1]->[3]->[0]->[0] eq 'func') { + # FIXME allowed } else { die "Array types don't match in cat: " . Dumper($a->[1]->[3]->[0], $b->[1]->[3]->[0]); } @@ -400,7 +399,7 @@ our $global = { my $s = pop @$data or die "Stack underflow"; if(ref($s->[1]) eq 'ARRAY' and $s->[1]->[0] eq 'struct') { - my @keys = keys %{$s->[1]->[1]}; + my @keys = keys %{$s->[0]}; push @$data, [[map { [$_, 'string'] } @keys], ['array', '[]', [['range', 0, $#keys]], ['string']]]; } else { @@ -522,7 +521,7 @@ our $global = { push @$data, [[map { [$_, 'int'] } 0 .. $l - 1], ['array', '[]', [['range', 0, $l - 1]], ['int']]]; } elsif(ref($a->[1]) eq 'ARRAY' and $a->[1]->[0] eq 'struct') { - die "no supporting dom member in struct" . Dumper($a) unless exists $a->[1]->[1]->{'dom'}; + die "no supporting dom member in struct" . Dumper($a) unless exists $a->[0]->{'dom'}; push @$data, $a->[0]->{'dom'}; execute($data, $scope) if($data->[-1]->[2] eq 'active'); @@ -535,8 +534,7 @@ our $global = { push @$data, $globalCallStack[-2]; }, ['func', 'rec'], 'active'], - # 'linux' => [enstruct($ElymasLinux::linux), 'passive'], - 'sys' => [enstruct($ElymasSys::sys), 'passive'], + 'sys' => [$ElymasSys::sys, ['struct'], 'passive'], }; sub installGlobal1IntFunction { diff --git a/interpreter/ElymasSys.pm b/interpreter/ElymasSys.pm index 2b7132f..9cb07d4 100644 --- a/interpreter/ElymasSys.pm +++ b/interpreter/ElymasSys.pm @@ -14,13 +14,13 @@ our $sys = { my ($data, $scope) = @_; my $file = createFile(-1, &POSIX::O_RDONLY); - push @$data, [enstruct($file)]; + push @$data, [$file, ['struct']]; }, ['func', 'sys .file'], 'active'], - 'in' => [enstruct(createFile(0, &POSIX::O_RDONLY)), 'passive'], - 'out' => [enstruct(createFile(1, &POSIX::O_WRONLY)), 'passive'], - 'err' => [enstruct(createFile(2, &POSIX::O_WRONLY)), 'passive'], + 'in' => [createFile(0, &POSIX::O_RDONLY), ['struct'], 'passive'], + 'out' => [createFile(1, &POSIX::O_WRONLY), ['struct'], 'passive'], + 'err' => [createFile(2, &POSIX::O_WRONLY), ['struct'], 'passive'], 'argv' => [[map { [$_, 'string'] } @ARGV[1 .. $#ARGV]], ['array', 'sys .argv', ['range', 0, $#ARGV - 1], ['string']], 'passive'], - 'asm' => [enstruct($ElymasAsm::asm), 'passive'], + 'asm' => [$ElymasAsm::asm, ['struct'], 'passive'], }; sub createFile { |
