| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
plain blocks
a call to rt.new_k / rt.recycle_leaf with a constant class, or to rt.own,
does its class-list pop or push (or owner store) inline and goes on after
the call; an empty list, memdebug, a held range, a block outside memory, a
translated word or a type/class mismatch takes the ordinary call. in a
region this replaces the o3_invoke round trip. o3 frees of leaf objects now
use recycle_leaf too (new_k stamps the type inside o3 since b86db60).
ZYNOFASTALLOC=1 turns it off; ZYPERFMAP=1 writes a perf map of translated code.
tests/programs/o3_freelist.zc: reuse, zeroing, an empty list, untyped
neighbours, memdebug; jit vs ZYNOFASTALLOC vs ZYO3INTERP.
|
| |
|
|
|
|
|
| |
Restoring undirtied lafacts when the body might free was wrong: push can
grow an array without dirtying its name, so a[99] after push warned against
a stale length 0. Keep the old lafact_keep rule; reorder explain_prover so
the constant/affine cases run before the touch() loops.
|
| |
|
|
|
|
|
|
| |
Rebased the prover WIP onto main. lafact_keep restores undirtied allocation
facts even when the loop body might free (so a later touch() no longer drops
every length fact). proven_p uses ptr_still so an outer call keeps the check.
entry_fact still supplies the size for the "might free" explain reason.
bounds_prover.zc and explain_prover.zc land with test.sh coverage.
|
| |
|
|
| |
affine i*n+k); unbuilt and untested
|
| |
|
|
|
|
|
| |
Constant-size typed new inside o3 now calls rt.new_k instead of always
taking new_t/new_raw. new_k and recycle_leaf skip the o3 argument-fatten
path the way free/recycle already do. trees o3 new/free on the x86-64
jit dropped from about 4.1 ms to about 2.7 ms per iter (matches plain).
|
| |
|
|
| |
replies and closes the endpoint; the handler reaches the struct through endpoint.state so the struct isn't shared; spawn hint skips mailbox structs
|
| |
|
|
| |
enters and leaves the region and fattens its result, like a direct call; spec 4.10.3, o3_receiver_method_enter.zc
|
| |
|
|
| |
block they leave (the loop records the o3 depth it began at), so the depth returns to 0 and pending collections and drops run; spec 4.10.3, o3_break_continue_leave.zc
|
| |
|
|
| |
it too, on x.spawn() of a mailbox struct for each live owned local with a drop; spec 6.15.4, lsp hint check
|
| |
|
|
| |
a drop, or on an array field of a value with a drop, is error: a: can't move out of a value with drop (fields were already borrowed projections); spec 6.15.5, four conformance programs
|
| |
|
|
| |
value first, running its drop (right side first, then the free, then the store), with hint: x: reassigning frees the old value; a new value that is part of the old one is an error; u, d and captured owners keep the leak error; the new value's size, leaf type and drop are recorded like a declaration's; spec 6.8.5, 6.15.2
|
| |
|
|
| |
of the source before it end there: a program joined to the unbounded runtime in a self-hosted run-only image is bounds-checked again (since d55b5fd its index errors went unreported); runtime_image_test expects the trap's exit status 2; spec 4.15.1, 4.x unchecked, 5.15.3
|
| |
|
|
| |
compiler reads mentions actors (test.sh check)
|
| |
|
|
| |
methods, collector drops after the sweep (once, resurrection), freed blocks forget their drop, temporaries drop at statement end with a hint, actor send check; o3: no collection inside a region (pending until the outermost exit), no drops set or ended inside o3; spec 3.11.6, 4.10.3-4, 6.15
|
| |
|
|
| |
not just an expression or a block
|
| |
|
|
| |
words, same behaviour)
|
| |
|
|
| |
capture_scan in the body scanner
|
| |
|
|
| |
compiled only in that mode; the genome keeps the call sites and a hook
|
| |
|
|
| |
--explain-checks v1 (non-o3 code)
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
of p[-4]
the bnd recipe and paylen read n instead of the power-of-two block:
bnd: r6 = sub p 3; r6 = ld r6; r7 = xor p 0x2B7E1516; r6 = eq r6 r7;
r7 = sub p 4; r7 = ld r7; r7 = shr r7 32; r7 = mul r7 q;
r8 = mul i m; r8 = ltu r8 r7; r8 = xor r8 1; r0 = and r6 r8
paylen: return p[-4] >> 32
two loads instead of three; osize, bchk, release, recycle and the memdebug
leak report all read n (rt.new(4) has length 4, rt.new(0) has 0).
writers: new_raw and new_k set n; stack.h line 87 and tinyvm.ts (BigInt) set
it on stack segments. release clears n when a block goes into quarantine
(len 0, indexing traps; under memdebug bchk reports a use after free); every
free-list path (fpush, mkblock, bdrop, recycle_leaf, balloc hold) rewrites
the word as k << 16, and an array that grows gets a fresh block. a request over
2^31-1-HDR words stops in new_raw (oom), and the compiler only takes the
new_k fast path for constant sizes that fit, so n is never truncated.
bit users checked (all mask or preserve bits 32..62; none compares or copies
the whole word): gc mark and sweep; release, free, recycle, recycle_leaf;
share and own; isobj, quar, checkptr, obj_base; bclass and the bfree buddy
merge; balloc, mkblock, fpush, funlink, heap_grow; frame_grow; stack_allocate
in src/core/stack.h and src/js/tinyvm.ts; micro.c and core.c (check word
only); the compiler's two p[-4] | F_INTERNAL writes (base.zc, builtins.zc).
32-bit ports: none (baremetal, wasm and micro use int64 Cell).
tests: tests/programs/exactsize.zc (n-1/n for non-power-of-two sizes, new(0),
packed bytes, recycle, grow, stack growth); 8-runtime: exact_size_bounds,
pointer_index_n_minus_1, pointer_index_n_traps, pointer_index_n_traps_memdebug,
new_zero_index_traps, new_too_big_traps, stale_index_after_free_traps,
stale_index_after_free_memdebug. expectations changed: leak report shows n
(tests/test.sh line 169, examples/learn/13-memdebug.out, docs/LEARN.md,
4-statements/memdebug_report_line.zc). programs adjusted to keep test.sh
expectations: quarantine.zc (unbounded), bounds_heap.zc (rt.new(11)).
spec 3.7.4 and 4.11 updated. fixpoint 402204 words (main 402197).
|
| | |
|
| | |
|
| |
|
|
| |
return type check still fires (fixes typeerrors/ret.zc after b.2.6)
|
| |
|
|
| |
(appendix b.2.11)
|
| | |
|
| |
|
|
| |
name it (appendix b.2.2)
|
| |
|
|
| |
float (float g = 2; is 2.0)
|
| |\ |
|
| | |\ |
|
| | | |
| | |
| | |
| | | |
check, docs (readme, spec 4.15 and friends, server, vscode), conformance and test.sh fixes, todo
|
| | | |
| | |
| | |
| | | |
main in o3call, o3 tests expect no check, boundsrules, bounds_fixed, bounds_heap and zc0unbounded tests
|
| | | |
| | |
| | |
| | | |
(appendix b.2.5)
|
| | | |
| | |
| | |
| | | |
(appendix b.2.9)
|
| | | |
| | |
| | |
| | | |
b.2.7)
|
| | | |
| | |
| | |
| | | |
definition (appendix b.2.4)
|
| | | |
| | |
| | |
| | | |
twice' (appendix b.2.3)
|
| | | | |
|
| |/ / |
|
| |\ \
| |/
|/| |
|
| | |
| |
| |
| | |
when it has fields (spec 4.7.3)
|
| | |
| |
| |
| | |
the scrub program reads the freed word through asm
|
| | |
| |
| |
| | |
yields 0 (typecheck off, spec 4.8.3)
|
| | | |
|
| | |
| |
| |
| | |
(int*)s indexes words
|
| | |
| |
| |
| | |
(spec 1.6.3)
|
| | |
| |
| |
| | |
function's first statement is reported
|
| |/
|
|
| |
x86-64 jit, docs, measurements, tests; default genome reservation 0x68000
|
| |\ |
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
defer expr; and defer { ... } register code that runs when the enclosing
block ends: at the end of the block, and at return, break and continue
that leave it. the tokens are kept at the defer and compiled again at each
exit (block_close, body, kw_return, kw_break, kw_continue), newest first,
before the block's variables are released, so the analyzer sees a deferred
rt.free(p) as the transfer of p where it runs. names mean what they meant
at the defer; values are read when it runs. return, break and continue
inside a deferred statement are errors, reported once. works in unchecked
code and closures (own base per function context).
|