@@ -4,38 +4,42 @@ module Memory
44from "runtime/gc" include GC
55use GC.{ malloc, free, incRef, decRef }
66from "runtime/unsafe/wasmi32" include WasmI32
7- use WasmI32.{ (+), (-), (<<), (== ), (!= ), ltU as (< ) }
7+ use WasmI32.{ (+), (-), (!= ), ltU as (< ), gtU as (> ) }
88
99provide { malloc, free, incRef, decRef }
1010
11- provide let copy = (dest, src, n) => {
12- let mut dest = dest
13- let mut src = src
14- let mut n = n
11+ /**
12+ * Copies the source memory region to the destination memory region. Regions may overlap.
13+ *
14+ * @param dest: The destination memory region
15+ * @param src: The source memory region
16+ * @param length: The length of the memory region to copy
17+ */
18+ provide let copy = (dest, src, length) => {
1519 if (dest != src) {
1620 if (dest < src) {
17- while (n != 0n) {
18- WasmI32.store8(dest, WasmI32.load8U(src, 0n), 0n)
19- dest += 1n
20- src += 1n
21- n -= 1n
21+ for (let mut i = 0n; i < length; i += 1n) {
22+ WasmI32.store8(dest, WasmI32.load8U(src, i), i)
2223 }
2324 } else {
24- while (n != 0n) {
25- n -= 1n
26- WasmI32.store8(dest + n, WasmI32.load8U(src + n, 0n), 0n)
25+ // Copy backwards to ensure we do not overwrite on overlapping regions
26+ for (let mut n = length; n > 0n; n -= 1n) {
27+ WasmI32.store8(dest + n - 1n , WasmI32.load8U(src + n - 1n , 0n), 0n)
2728 }
2829 }
2930 }
3031}
3132
32- provide let fill = (dest, c, n) => {
33- let mut dest = dest
34- let mut n = n
35- while (n != 0n) {
36- WasmI32.store8(dest, c, 0n)
37- dest += 1n
38- n -= 1n
33+ /**
34+ * Fills the given memory region with the given 1-byte value. Values larger than 1 byte will be truncated.
35+ *
36+ * @param dest: The destination memory region
37+ * @param value: The value to fill the memory region with
38+ * @param length: The length of the memory region to fill
39+ */
40+ provide let fill = (dest, value, length) => {
41+ for (let mut i = 0n; i < length; i += 1n) {
42+ WasmI32.store8(dest, value, i)
3943 }
4044}
4145
0 commit comments