diff options
| author | Drahflow <drahflow@gmx.de> | 2013-01-03 22:11:37 +0100 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2013-01-03 22:11:37 +0100 |
| commit | 19d573cf7c6dd729289ef5151f15db51bcc79d91 (patch) | |
| tree | 288980504ab3721cfa7fd0aea59514957c17b45d /interpreter/ElymasAsm.pm | |
| parent | d7d307dc6563fe27bf43cab1e83ac21204fea6c6 (diff) | |
Compiler can now push ints and strings
Diffstat (limited to 'interpreter/ElymasAsm.pm')
| -rw-r--r-- | interpreter/ElymasAsm.pm | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/interpreter/ElymasAsm.pm b/interpreter/ElymasAsm.pm index 63b7803..2bf2295 100644 --- a/interpreter/ElymasAsm.pm +++ b/interpreter/ElymasAsm.pm @@ -6,25 +6,40 @@ use warnings; use Elymas; use ACME::Bare::Metal; +sub constructBlock { + my ($block, $size) = @_; + + my $scope; $scope = \{ + 'base' => [$block, 'int', 'passive'], + 'size' => [$size, 'int', 'passive'], + 'free' => [sub { + my ($data) = @_; + + ACME::Bare::Metal::deallocate($$scope->{'base'}->[0], $$scope->{'size'}->[0]); + }, ['func', 'sys .asm .free'], 'active'], + }; + + return $$scope; +} + our $asm = { 'alloc' => [sub { - my ($data) = @_; + my ($data) = @_; - my $size = popInt($data); - my $block = ACME::Bare::Metal::allocate($size); + my $size = popInt($data); + my $block = ACME::Bare::Metal::allocate($size); - my $scope; $scope = \{ - 'base' => [$block, 'int', 'passive'], - 'size' => [$size, 'int', 'passive'], - 'free' => [sub { - my ($data) = @_; + push @$data, [enstruct(constructBlock($block, $size))]; + }, ['func', 'sys .asm .alloc'], 'active'], + 'allocAt' => [sub { + my ($data) = @_; - ACME::Bare::Metal::deallocate($$scope->{'base'}->[0], $$scope->{'size'}->[0]); - }, ['func', 'sys .asm .free'], 'active'], - }; + my $addr = popInt($data); + my $size = popInt($data); + my $block = ACME::Bare::Metal::allocateAt($size, $addr); - push @$data, [enstruct($$scope)]; - }, ['func', 'sys .asm .alloc'], 'active'], + push @$data, [enstruct(constructBlock($block, $size))]; + }, ['func', 'sys .asm .alloc'], 'active'], 'poke' => [sub { my ($data, $scope) = @_; |
