aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/elymasAsmLib.ey131
-rw-r--r--compiler/elymasGlobal.ey6
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