aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2013-01-07 15:30:21 +0100
committerDrahflow <drahflow@gmx.de>2013-01-07 15:30:21 +0100
commitabf250d1efb699ca0bfedc62c5ba1278c08fc32d (patch)
tree52754094f5dd5fde54b6aa22570baea63f7d465b
parente816e6bbbfe03b0ab15344155250ced004a7f924 (diff)
Structs and scopes now inseparable
-rw-r--r--examples/working/hash-set.ey8
-rw-r--r--interpreter/Elymas.pm14
-rw-r--r--interpreter/ElymasAsm.pm4
-rw-r--r--interpreter/ElymasGlobal.pm18
-rw-r--r--interpreter/ElymasSys.pm10
5 files changed, 27 insertions, 27 deletions
diff --git a/examples/working/hash-set.ey b/examples/working/hash-set.ey
new file mode 100644
index 0000000..acd9e75
--- /dev/null
+++ b/examples/working/hash-set.ey
@@ -0,0 +1,8 @@
+< { defv }' /put deff > =hashSet
+
+1 /one hashSet .put
+2 /two hashSet .put
+
+hashSet .one dump
+hashSet .two dump
+hashSet keys dump
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 {