diff options
| author | Drahflow <drahflow@gmx.de> | 2013-01-10 13:45:16 +0100 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2013-01-10 13:45:16 +0100 |
| commit | f9ba198c1d0a18b905034ec609bc2de09b76db88 (patch) | |
| tree | b036e8e7f09e2cb9aa45d4d821311905e1be3813 /compiler | |
| parent | 0107c46dbad1c6f45ae05815df880970fcdb172b (diff) | |
Scope resolution working
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/elymasAsmLib.ey | 131 | ||||
| -rw-r--r-- | compiler/elymasGlobal.ey | 6 |
2 files changed, 111 insertions, 26 deletions
diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey index 01aed4f..2a4c56c 100644 --- a/compiler/elymasAsmLib.ey +++ b/compiler/elymasAsmLib.ey @@ -220,18 +220,21 @@ # rdx -> type pointer # rax <- address of function on the heap [ - /rdi /rcx :movqRegReg + /rdi :pushqReg + /rdx :pushqReg 32 /rdi :movqImmReg internalAllocate /rax :movqImmReg /rax :callqReg # set type - %90 7 /rax :orbImmMemDisp8 + %50 7 /rax :orbImmMemDisp8 /rsi 8 /rax :movqRegMemDisp8 + /rdx :popqReg /rdx 16 /rax :movqRegMemDisp8 - /rcx 24 /rax :movqRegMemDisp8 + /rdi :popqReg + /rdi 24 /rax :movqRegMemDisp8 :retn ] /internalAllocateFunction defv @@ -361,10 +364,9 @@ :retn ] :labelResolve /eydeff defv - # execute top element on the stack + # execute top stack element [ - # FIXME - :retn + :retn # FIXME: implement this ] /ey* defv > _ ==globalFunctions { defv }' allocateOffsetStruct @@ -425,7 +427,7 @@ /rax :pushqReg # create string - name constStringCode _ len dearray + name "ey(.*)" regex assert constStringCode _ len dearray # enter into current (i.e. global) scope eydeff /rax :movqImmReg @@ -453,6 +455,10 @@ [ -01 4 { _ sys .asm .peek -01 1 add } rep -- ] reverse { -01 256 mul add } fold } /peekImm32 deff + { # ==addr + sys .asm .peek + } /peekImm8 deff + { [ -01 16 { _ 16 mod -01 16 div } rep -- ] [ /0 /1 /2 /3 /4 /5 /6 /7 /8 /9 /A /B /C /D /E /F ] * @@ -465,6 +471,86 @@ reverse |cat fold } /base16encode32 deff + { ==objAddr + " int\n" sys .out .writestr + } /intDump deff + + { ==objAddr + " \"" sys .out .writestr + objAddr 16 add peekImm64 ==length + objAddr 24 add _ length add 1 sub range peekImm8 ASCII * |cat fold sys .out .writestr + "\"\n" sys .out .writestr + } /stringDump deff + + { ==objAddr + " scope\n" sys .out .writestr + + objAddr peekImm32 + objAddr 4 add peekImm32 16777215 band 4294967296 mul add ==length + + objAddr 8 add peekImm64 ==nameTable + objAddr 16 add peekImm64 ==parent + objAddr 24 add peekImm64 ==extensionArea + + nameTable 8 add peekImm64 ==nameTableEnd + 16 { _ nameTableEnd lt } { + _ nameTable add base16encode64 ": " cat sys .out .writestr + _ nameTable add peekImm64 stringDump + _ 16 sub 2 div 32 add _ length lt { ==offset + offset objAddr add peekImm64 memDump + } { + "Extension area dumping not yet implemented" die + } ? * + 16 add + } loop -- + } /scopeDump deff + + { ==objAddr + " nameTable\n" sys .out .writestr + } /nameTableDump deff + + { ==objAddr + " extensionArea\n" sys .out .writestr + } /extensionAreaDump deff + + { ==objAddr + " function\n" sys .out .writestr + } /functionDump deff + + { ==objAddr + " code\n" sys .out .writestr + } /codeDump deff + + { ==addr + [ + " " + addr base16encode64 + ": " + # the perl interpreter does not like full 64bit numbers and converts them into floats + addr 4 add peekImm32 _ ==heapValueB base16encode32 + addr peekImm32 _ ==heapValueA base16encode32 + " " + [ [ heapValueA heapValueB ] { 4 { _ 256 mod -01 256 div } rep -- } each ] ASCII * 8 dearray + "\n" + ] |cat fold sys .out .writestr + } /memDump deff + + { ==objAddr + "Object at " objAddr base16encode64 cat " ----------\n" cat sys .out .writestr + objAddr peekImm32 + objAddr 4 add peekImm32 16777215 band 4294967296 mul + add 8 div ==length + 0 length 1 sub range { 8 mul objAddr add memDump } each + + objAddr 7 add peekImm8 16 div + [ + |intDump |stringDump |scopeDump |nameTableDump |extensionAreaDump |functionDump |codeDump |die + |die |die |die |die |die |die |die |die + ] * + objAddr -01* + "^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" sys .out .writestr + } /heapDump deff + { :mainStack .base :STACKSIZE add ==stackEnd "Stack ------------\n" sys .out .writestr @@ -476,29 +562,24 @@ addr base16encode64 ": " addr peekImm64 ==value value base16encode64 - value 105553116266496 ge value 123145302310912 lt and { - value peekImm32 - value 4 add peekImm32 16777215 band 4294967296 mul - add 8 div ==length - 0 length 1 sub range { - 8 mul value add ==heapAddr - "\n " - heapAddr base16encode64 - ": " - # the perl interpreter does not like full 64bit numbers and converts them into floats - heapAddr 4 add peekImm32 _ ==heapValueB base16encode32 - heapAddr peekImm32 _ ==heapValueA base16encode32 - " " - [ [ heapValueA heapValueB ] { 4 { _ 256 mod -01 256 div } rep -- } each ] ASCII * 8 dearray - } each - } rep "\n" ] |cat fold sys .out .writestr + + value 105553116266496 ge value 123145302310912 lt and { + value peekImm32 + value 4 add peekImm32 16777215 band 4294967296 mul + add 8 div ==length + 0 length 1 sub range { 8 mul value add memDump } each + } rep addr 8 add =addr } loop "^^^^^^^^^^^^^^^^^^\n" sys .out .writestr - } - > -- /stackDump deff + } /stackDump + + { + currentScope peekImm64 heapDump + } /globalScopeDump + > -- 2 |deff rep > /assemblerLibrary defv # vim: syn=elymas diff --git a/compiler/elymasGlobal.ey b/compiler/elymasGlobal.ey index 64b2659..12589e8 100644 --- a/compiler/elymasGlobal.ey +++ b/compiler/elymasGlobal.ey @@ -91,7 +91,11 @@ 4096 input .readstr cat _ "" streq not } { - { _ "([^\\n]*)\\n(.*)" regex } { -102 -- tokenize { _ .handle assemblerLibrary .stackDump } each } loop + { _ "([^\\n]*)\\n(.*)" regex } { -102 -- tokenize { + _ .handle + assemblerLibrary .stackDump + assemblerLibrary .globalScopeDump + } each } loop } loop } /executeFile deff |
