about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-07-13 20:57:35 -0700
committerKartik Agaram <vc@akkartik.com>2020-07-13 21:52:26 -0700
commite2b55208b22f3c97dfbc866d8d555b7a7c614632 (patch)
tree5b7f29f1a09a53f91b97cd03f1305afddd855d1d
parent6b8a3a94b1ae33fe053a13a4bbf96d9dc5eeb4b2 (diff)
downloadmu-e2b55208b22f3c97dfbc866d8d555b7a7c614632.tar.gz
6643
-rw-r--r--120allocate.subx2
-rw-r--r--300.txt18
-rw-r--r--400.mu18
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