diff options
| author | Drahflow <drahflow@gmx.de> | 2014-01-01 22:20:11 +0100 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2014-01-01 22:20:11 +0100 |
| commit | 5427dd384017d27dc3f86fc23aa0019a9defe8e7 (patch) | |
| tree | 5081f85f4e29b9e56c345cd248954412d15f1413 | |
| parent | 84a3531334fb171b9740e785eddcfd8b7139261c (diff) | |
sys .argv initialized meaningfully
| -rw-r--r-- | Makefile | 4 | ||||
| -rw-r--r-- | compiler/elymasGlobalSysAsm.ey | 76 | ||||
| -rw-r--r-- | elymas/Makefile | 8 | ||||
| -rw-r--r-- | elymas/interpreter.ey | 6 | ||||
| -rw-r--r-- | elymas/loaded.ey | 6 | ||||
| -rw-r--r-- | elymas/optimized.ey | 6 | ||||
| -rw-r--r-- | elymas/shared.ey | 6 |
7 files changed, 101 insertions, 11 deletions
@@ -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 |
