aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2014-01-01 22:20:11 +0100
committerDrahflow <drahflow@gmx.de>2014-01-01 22:20:11 +0100
commit5427dd384017d27dc3f86fc23aa0019a9defe8e7 (patch)
tree5081f85f4e29b9e56c345cd248954412d15f1413
parent84a3531334fb171b9740e785eddcfd8b7139261c (diff)
sys .argv initialized meaningfully
-rw-r--r--Makefile4
-rw-r--r--compiler/elymasGlobalSysAsm.ey76
-rw-r--r--elymas/Makefile8
-rw-r--r--elymas/interpreter.ey6
-rw-r--r--elymas/loaded.ey6
-rw-r--r--elymas/optimized.ey6
-rw-r--r--elymas/shared.ey6
7 files changed, 101 insertions, 11 deletions
diff --git a/Makefile b/Makefile
index 3cb2f35..76a011f 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
-all: elymas/loaded
+all: elymas/loaded elymas/shared
-elymas/loaded: elymas/interpreter $(shell find elymas/ -name '*.ey' )
+elymas/loaded elymas/shared: elymas/interpreter $(shell find elymas/ -name '*.ey' )
cd elymas && $(MAKE)
elymas/interpreter: elymas/interpreter.ey compiler/*.ey interpreter/Metal.so interpreter/ACME
diff --git a/compiler/elymasGlobalSysAsm.ey b/compiler/elymasGlobalSysAsm.ey
index 6a1e740..2fdc02a 100644
--- a/compiler/elymasGlobalSysAsm.ey
+++ b/compiler/elymasGlobalSysAsm.ey
@@ -441,7 +441,7 @@
# (template) program boot sequence after freeze
[[
- /rsp :movqImmOOBReg %EE %EE %EE %EE %EE %EE %EE %EE # 10
+ /r8 :movqImmOOBReg %EE %EE %EE %EE %EE %EE %EE %EE # 10
/r15 :movqImmOOBReg %EE %EE %EE %EE %EE %EE %EE %EE # 20
::heapSize /rax :movqImmReg # 30
/rbx :movqImmOOBReg %EE %EE %EE %EE %EE %EE %EE %EE # 40
@@ -456,14 +456,86 @@
/rbx :movqImmOOBReg %EE %EE %EE %EE %EE %EE %EE %EE # 109
/rbx /rax :movqRegMem # 112
+ /r8 /rsp :xchgqRegReg # swap to elymas stack to ensure correct GC behavior for what follows
+
# empty encoding buffer to ensure the GC does not follow residue from freeze into unallocated memory
:quoteEncodingBufferObjects /rdi :movqImmReg
/rax /rax :xorqRegReg
/rax /rdi :movqRegMem
+ # setup new sys .argv
+ /r8 /rdi :movqMemReg # get argc
+ 8 /r8 :addqImm8Reg
+ /rdi :decqReg
+ /rdi :pushqReg
+ 3 /rdi :shlqImm8Reg
+ ::internalAllocateArray /rax :movqImmReg
+ /rax :callqReg
+ # rax == new sys .argv array
+
+ /rax :pushqReg
+ /rax :pushqReg
+
+ /rax :movqImmOOBReg "argv" ::string
+ /rax :pushqReg
+
+ /rax :movqImmOOBReg "sys" ::string
+ /rax :pushqReg
+ /rax :movqImmOOBReg "eyprogramStart" "ey|" ::linkAbs64
+ /rax :callqReg
+
+ /rax :movqImmOOBReg "defv" ::string
+ /rax :pushqReg
+ /rax :movqImmOOBReg "eyprogramStart" "ey." ::linkAbs64
+ /rax :callqReg
+
+ /rax :popqReg
+ 8 /rax /rbx :leaqMemDisp8Reg
+
+ /rcx :popqReg
+ 8 /r8 :addqImm8Reg # throw away program name # TODO: save it somewhere
+
+ /rcx /rcx :testqRegReg
+ /argvAssemblyDone :jzLbl8
+ @argvAssembly
+
+ /r8 /rdi :movqMemReg # load next argv element
+ 8 /r8 :addqImm8Reg
+ /rcx :pushqReg
+
+ /copyCString :callqLbl32
+ /rax /rbx :movqRegMem
+ 8 /rbx :addqImm8Reg
+
+ /rcx :popqReg
+ /argvAssembly :loopLbl8
+ @argvAssemblyDone
+
+ # call frozen function
|ey* /rax :movqImmReg
/rax :callqReg
:ud2
+
+ @copyCString
+# rdi -> pointer to beginning of string
+# rax <- pointer to new elymas string
+ /rax /rax :xorqRegReg
+ /rcx /rcx :xorqRegReg
+ /rcx :decqReg
+ /rdi /rsi :movqRegReg
+ /rdi :pushqReg
+ :repnz :scasb
+
+ /rcx :negqReg
+ 2 /rcx :subqImm8Reg
+ /rcx /rdi :movqRegReg
+ ::internalAllocateString /rax :movqImmReg
+ /rax :callqReg
+ /rsi :popqReg
+ 16 /rax /rcx :movqMemDisp8Reg
+ 24 /rax /rdi :leaqMemDisp8Reg
+ :reprcx :movsb
+ :retn
]] /eyprogramStart defv
> _ ==globalFunctions { defv }' ::allocateOffsetStruct
@@ -510,6 +582,8 @@
]] /eypatchProgramStart defv
> _ ==globalFunctions2 { defv }' ::allocateOffsetStruct
+ { | }' ::linkResolve
+
"asm" enterSubScope
[
diff --git a/elymas/Makefile b/elymas/Makefile
index bbdd4a8..5283db7 100644
--- a/elymas/Makefile
+++ b/elymas/Makefile
@@ -1,12 +1,12 @@
all: shared loaded
shared: optimized shared.ey $(shell find lib -name '*.ey')
- ./optimized < shared.ey
+ ./optimized shared.ey
loaded: optimized loaded.ey $(shell find lib -name '*.ey')
- ./optimized < loaded.ey
+ ./optimized loaded.ey
-optimized: interpreter optimized.ey lib/math.ey lib/sys/opt.ey
- ./interpreter < optimized.ey
+optimized: interpreter optimized.ey lib/math.ey lib/txt.ey lib/sys/opt.ey
+ ./interpreter optimized.ey
.PHONY: all
diff --git a/elymas/interpreter.ey b/elymas/interpreter.ey
index bb25d00..365a8d6 100644
--- a/elymas/interpreter.ey
+++ b/elymas/interpreter.ey
@@ -1,3 +1,7 @@
#!/usr/bin/env elymas
-{ "/proc/self/fd/0" include 0 sys .exit }' "interpreter" sys .freeze
+{
+ sys .argv len not { "Usage: interpreter <input.ey>" die } rep
+ 0 sys .argv * include
+ 0 sys .exit
+}' "interpreter" sys .freeze
diff --git a/elymas/loaded.ey b/elymas/loaded.ey
index 02faa8a..2a48af1 100644
--- a/elymas/loaded.ey
+++ b/elymas/loaded.ey
@@ -12,4 +12,8 @@
"lib/net/alg/http.ey"
] { _ dump include }' each
-{ "/proc/self/fd/0" include 0 sys .exit }' "loaded" sys .freeze
+{
+ sys .argv len not { "Usage: loaded <input.ey>" die } rep
+ 0 sys .argv * include
+ 0 sys .exit
+}' "loaded" sys .freeze
diff --git a/elymas/optimized.ey b/elymas/optimized.ey
index 5cee305..0102017 100644
--- a/elymas/optimized.ey
+++ b/elymas/optimized.ey
@@ -6,4 +6,8 @@
"lib/sys/opt.ey"
] { _ dump include }' each
-2 { { "/proc/self/fd/0" include 0 sys .exit }' "optimized" sys .freeze } rep # FIXME freeze wonkyness (the optimizer allocates during freeze)
+{
+ sys .argv len not { "Usage: optimized <input.ey>" die } rep
+ 0 sys .argv * include
+ 0 sys .exit
+}' "optimized" sys .freeze
diff --git a/elymas/shared.ey b/elymas/shared.ey
index 6a0ee6d..73b0a12 100644
--- a/elymas/shared.ey
+++ b/elymas/shared.ey
@@ -13,4 +13,8 @@
"lib/net/alg/http.ey"
] { _ dump include }' each
-{ "/proc/self/fd/0" include 0 sys .exit }' "shared" sys .so .freeze
+{
+ sys .argv len not { "Usage: shared <input.ey>" die } rep
+ 0 sys .argv * include
+ 0 sys .exit
+}' "shared" sys .so .freeze