This commit is contained in:
Kartik Agaram 2020-07-13 20:57:35 -07:00
parent 6b8a3a94b1
commit e2b55208b2
3 changed files with 26 additions and 12 deletions

View File

@ -874,7 +874,7 @@ test-copy-array:
c3/return
# Fill a region of memory with zeroes.
zero-out: # start: (addr byte), len: int
zero-out: # start: (addr byte), size: int
# pseudocode:
# curr/esi = start
# i/ecx = 0

18
300.txt
View File

@ -1,3 +1,17 @@
Layers in the 3xx series use all the available syntax sugar for SubX programs.
For the most part they're intended to be used by the Mu translator:
apps/mu.subx
They're used by the Mu translator (apps/mu.subx) and can also be called from
Mu programs if they meet certain criteria:
- There's a signature for them in 400.mu
- Inouts on the stack, outputs in registers
- Valid Mu types everywhere (Mu's type system isn't expressive enough for
everything SubX does in rare situations.)
- No way to for an `addr` to escape a function. No `(... addr ... addr ...)`
inouts, and no `(... addr ...)` outputs.
While functions _can_ be called, not all SubX functions meeting these criteria
_should_ be called. In particular, avoid exporting functions that could be
misused. A classic example is trying to add a `size-of` operator. If you're
doing that you're likely going to rely on programmers to use it correctly. Mu
tries to be idiot-proof. Even if SubX requires greater care, using SubX
primitives from Mu should not.

18
400.mu
View File

@ -74,10 +74,10 @@ sig error-byte ed: (addr exit-descriptor), out: (addr buffered-file), msg: (addr
sig lookup h: (handle T) -> result/eax: (addr T)
sig handle-equal? a: handle, b: handle -> result/eax: boolean
sig copy-handle src: handle, dest: (addr handle)
sig allocate-region ad: (addr allocation-descriptor), n: int, out: (addr handle allocation-descriptor)
sig allocate-array ad: (addr allocation-descriptor), n: int, out: (addr handle)
#sig allocate-region ad: (addr allocation-descriptor), n: int, out: (addr handle allocation-descriptor)
#sig allocate-array ad: (addr allocation-descriptor), n: int, out: (addr handle)
sig copy-array ad: (addr allocation-descriptor), src: (addr array), out: (addr handle)
sig zero-out start: (addr byte), len: int
#sig zero-out start: (addr byte), size: int
sig new-stream ad: (addr allocation-descriptor), length: int, elemsize: int, out: (addr handle stream _)
sig read-line-buffered f: (addr buffered-file), s: (addr stream byte)
sig read-line f: (addr stream byte), s: (addr stream byte)
@ -93,14 +93,14 @@ sig skip-chars-matching in: (addr stream byte), delimiter: byte
sig skip-chars-matching-whitespace in: (addr stream byte)
sig skip-chars-not-matching in: (addr stream byte), delimiter: byte
sig skip-chars-not-matching-whitespace in: (addr stream byte)
sig skip-chars-matching-in-slice curr: (addr byte), end: (addr byte), delimiter: byte -> curr/eax: (addr byte)
sig skip-chars-matching-whitespace-in-slice curr: (addr byte), end: (addr byte) -> curr/eax: (addr byte)
sig skip-chars-not-matching-in-slice curr: (addr byte), end: (addr byte), delimiter: byte -> curr/eax: (addr byte)
sig skip-chars-not-matching-whitespace-in-slice curr: (addr byte), end: (addr byte) -> curr/eax: (addr byte)
#sig skip-chars-matching-in-slice curr: (addr byte), end: (addr byte), delimiter: byte -> curr/eax: (addr byte)
#sig skip-chars-matching-whitespace-in-slice curr: (addr byte), end: (addr byte) -> curr/eax: (addr byte)
#sig skip-chars-not-matching-in-slice curr: (addr byte), end: (addr byte), delimiter: byte -> curr/eax: (addr byte)
#sig skip-chars-not-matching-whitespace-in-slice curr: (addr byte), end: (addr byte) -> curr/eax: (addr byte)
sig skip-string line: (addr stream byte)
sig skip-string-in-slice curr: (addr byte), end: (addr byte) -> curr/eax: (addr byte)
#sig skip-string-in-slice curr: (addr byte), end: (addr byte) -> curr/eax: (addr byte)
sig skip-until-close-paren line: (addr stream byte)
sig skip-until-close-paren-in-slice curr: (addr byte), end: (addr byte) -> curr/eax: (addr byte)
#sig skip-until-close-paren-in-slice curr: (addr byte), end: (addr byte) -> curr/eax: (addr byte)
sig write-stream-data f: (addr buffered-file), s: (addr stream byte)
sig write-int32-decimal out: (addr stream byte), n: int32
sig is-decimal-digit? c: byte -> result/eax: boolean