The typed buffers are slices: words/floats/fixeds/doubles/pointers(n) make
zeroed, bounds-checked []int/[]float/... and the type names mean them. buffer(n)
is a []byte, with text_of, Fs.read_bytes/write_bytes and view(xs, start, n).
bytes(), indexing a raw pointer or bytes, free, resize, Memory.*, raw file calls,
data_of and C externs are refused outside unsafe { } / unsafe function, and a
project's own files may write unsafe only with --unsafe; the runtime and packages
are the platform. A slice passed to an extern goes as its data.
What the change found: Sync's atomics on a slice header, words(n) uninitialised,
input's fixed axes in ints, truetype's fixed outlines as ints, skin matrices
typed int, gl_shader's source table made from raw bytes. render3d gets safe
entry points (safe_api.ludic). Rendering is byte-identical; a frame costs the same.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
27 lines
939 B
Text
27 lines
939 B
Text
# udp.ludic — Udp.* on the loopback: two sockets, one datagram each way.
|
|
program UdpDemo {
|
|
entry {
|
|
let a = Udp.open(0)
|
|
let b = Udp.open(0)
|
|
let pa = Udp.port(a)
|
|
let pb = Udp.port(b)
|
|
let lo = Udp.ip("127.0.0.1")
|
|
let out = buffer(16)
|
|
out[0] = 104
|
|
out[1] = 105
|
|
let sent = Udp.send(a, lo, pb, out, 2)
|
|
let inb = buffer(64)
|
|
var got = 0
|
|
var tries = 0
|
|
while got == 0 and tries < 200000 { got = Udp.recv(b, inb, 64); tries += 1 }
|
|
let from_ok = Udp.from_ip(b) == lo and Udp.from_port(b) == pa
|
|
Udp.send(b, Udp.from_ip(b), Udp.from_port(b), inb, got)
|
|
var back = 0
|
|
tries = 0
|
|
while back == 0 and tries < 200000 { back = Udp.recv(a, out, 16); tries += 1 }
|
|
let bad = Udp.ip("1.2.3") == 0 and Udp.ip("300.1.1.1") == 0
|
|
print(`{sent} {got} {inb[0]} {inb[1]} {from_ok} {back} {Udp.ip_text(lo)} {bad} {Udp.recv(a, out, 16)} {pa > 0}`)
|
|
Udp.close(a)
|
|
Udp.close(b)
|
|
}
|
|
}
|