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 c3/return
# Fill a region of memory with zeroes. # Fill a region of memory with zeroes.
zero-out: # start: (addr byte), len: int zero-out: # start: (addr byte), size: int
# pseudocode: # pseudocode:
# curr/esi = start # curr/esi = start
# i/ecx = 0 # 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. 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: They're used by the Mu translator (apps/mu.subx) and can also be called from
apps/mu.subx 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 lookup h: (handle T) -> result/eax: (addr T)
sig handle-equal? a: handle, b: handle -> result/eax: boolean sig handle-equal? a: handle, b: handle -> result/eax: boolean
sig copy-handle src: handle, dest: (addr handle) sig copy-handle src: handle, dest: (addr handle)
sig allocate-region ad: (addr allocation-descriptor), n: int, out: (addr handle allocation-descriptor) #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-array ad: (addr allocation-descriptor), n: int, out: (addr handle)
sig copy-array ad: (addr allocation-descriptor), src: (addr array), 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 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-buffered f: (addr buffered-file), s: (addr stream byte)
sig read-line f: (addr stream byte), 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-matching-whitespace in: (addr stream byte)
sig skip-chars-not-matching in: (addr stream byte), delimiter: 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-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-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-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-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-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 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 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-stream-data f: (addr buffered-file), s: (addr stream byte)
sig write-int32-decimal out: (addr stream byte), n: int32 sig write-int32-decimal out: (addr stream byte), n: int32
sig is-decimal-digit? c: byte -> result/eax: boolean sig is-decimal-digit? c: byte -> result/eax: boolean