diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-07-13 20:57:35 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-07-13 21:52:26 -0700 |
commit | e2b55208b22f3c97dfbc866d8d555b7a7c614632 (patch) | |
tree | 5b7f29f1a09a53f91b97cd03f1305afddd855d1d | |
parent | 6b8a3a94b1ae33fe053a13a4bbf96d9dc5eeb4b2 (diff) | |
download | mu-e2b55208b22f3c97dfbc866d8d555b7a7c614632.tar.gz |
6643
-rw-r--r-- | 120allocate.subx | 2 | ||||
-rw-r--r-- | 300.txt | 18 | ||||
-rw-r--r-- | 400.mu | 18 |
3 files changed, 26 insertions, 12 deletions
diff --git a/120allocate.subx b/120allocate.subx index 9e8dfce0..ff52b2e9 100644 --- a/120allocate.subx +++ b/120allocate.subx @@ -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 diff --git a/300.txt b/300.txt index 1544081b..a151656f 100644 --- a/300.txt +++ b/300.txt @@ -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. diff --git a/400.mu b/400.mu index 8c7aa70c..fd31bb20 100644 --- a/400.mu +++ b/400.mu @@ -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 |