Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
50 most recent check-ins
|
2026-08-05
| ||
| 19:10 | Port the circular-record fixes from trunk (1d6486c34d, 0fad28f98f). This replaces the relocate_record change that had been sitting on this branch. That version stopped the GC crash by marking the old record in-process and bailing out on re-entry, but it silently produced a corrupted duplicate -- un-relocated fields and a record_type of UNBOUND -- which broke the r7expander outright. As a result efscm.boot could not be regenerated on this branch at all (./eflisp -b mkboot2.lsp died in assq-environment / identifier=?) and ./eflisp -s was equally broken. Both work again. From trunk, verbatim: - cvalue_relocate installs the forwarding pointer BEFORE calling the cvtable relocate hook, so a cycle leading back to the object resolves to the new copy instead of copying it again. The hook takes the old data pointer now, since forwarding overwrites the old cvalue's type and data words. Self-referential tables are fixed by the same change. GC also stops duplicating records reachable by two paths, which used to break eq? across a collection. - print_record emits #record!(<nfields> <type> f...) for a record carrying a circle label so read.c can allocate it and register the label before reading the fields; plain #record( output and its read path are unchanged, so older images still load. - equal? is cycle-safe for records: the compare hook is (a, b, bound, eq), compare_record recurses through fl_bounded_compare and propagates FL_NIL, and cyc_compare gained cyc_record_compare. Every other efsrc file involved was already identical to trunk; record.c differed only by the old guard, and DevNotes-eflisp-base.txt only by the BUGS entry trunk has since replaced with a 'done' write-up. So this is a clean fast-forward of those files rather than a merge. efscm.boot is regenerated -- the first time that has been possible on this branch. It matches trunk's at 176906 bytes and contains 41 #record! forms. Verified on this branch: make test, test7 (983/983), etest, etest7 all pass; r7rs-coverage-test at 20 errors, matching trunk; gen-e2e-test 240 pass and module-test 16 pass, so the efml pipeline is unaffected; and the circular record checks -- gc survival, print/read round-trip with the cycle intact, cycle-safe equal?, self-referential tables -- all behave as on trunk. Note an image containing #record! needs this binary; this binary still reads older images. Leaf check-in: e2c022e671 user: e tags: efml | |
| 19:05 | Make equal? cycle-safe for records. equal.c is two tier: depth-limited bounded_compare escaping to cycle-detecting cyc_compare once the bound runs out. The cvtable compare hook is dispatched from inside bounded_compare, but compare_record called equal_lispvalue, which restarts at compare_ with a fresh bound -- so the bound never decremented through a record and the escape never fired. cyc_compare had no record arm either. Comparing two distinct self-referential records hung. This was unreachable until the previous commit made such records survive GC. - The compare hook is now (a, b, bound, eq). compare_record recurses with fl_bounded_compare(.., bound-1, ..), a new exported wrapper around the static bounded_compare, and passes FL_NIL back unchanged so the caller retries under cyc_compare. It also orders by field count instead of reporting every length mismatch as 1. - cyc_compare gained cyc_record_compare, modelled on cyc_vector_compare, reaching fields through fl_record_nfields / fl_record_type_of / fl_record_field, since record_t is private to record.c. Note leafp only excludes conses and vectors, so a record looks like a leaf to it. Both cyc_record_compare and cyc_vector_compare have to recurse into record-valued elements explicitly (cyc_recurse_p), or two records nested in a container compare equal without ever being examined: the cheap bounded_compare(x, y, 1, eq) pass returns NIL for a pair of records, which reads as 'no difference proved'. cyc_vector_compare had that gap for records before this change, so a vector of deeply nested records could compare equal when it was not. Verified: distinct self-referential records compare equal; different record types, cyclic vs finite, and mutually recursive pairs all give the right answer; records reached through cyclic lists and through vectors work; deep acyclic records past the 128 bound still compare correctly, including when they differ only below the bound. Nested list and vector comparison is unchanged. make test, test7, etest, etest7 pass and r7rs-coverage-test is unchanged at 20 errors; efscm.boot is byte-identical. Leaf check-in: 0fad28f98f user: e tags: trunk | |
| 18:58 | Fix circular records: survive GC, and read back as cycles. A record referring to itself, directly or through other records, killed the interpreter during GC, and record sharing was silently destroyed by every collection. Two parts. 1. cvalue_relocate now installs the forwarding pointer BEFORE calling the cvtable relocate hook, the way conses, vectors, closures and gensyms have always worked, so a cycle leading back to the object resolves to the new copy instead of copying it again. forward() overwrites words [0] and [1] of the old object -- 'type' and 'data' for a cvalue_t -- so the hook signature becomes void (*relocate)(void *olddata, value_t newv). relocate_htable and relocate_iostream only ever used the old value to test whether the buffer was inlined, so those edits are mechanical. This fixes self-referential tables too. Note GC no longer duplicates records reachable by two paths; the old behaviour quietly broke eq? across a collection. 2. The reader could not read a self-referential record back. read.c only pre-registered a #N= label for #fn(...) before reading the constructor's arguments, so a #N# inside a record's own fields raised 'read: undefined label N'. Records are variable-size, so the reader needs the field count before it can allocate the placeholder. print_record now emits #record!(<nfields> <type> f...) for a record carrying a circle label (fl_print_labeled, new in print.c, reports that) and the original #record(<type> f...) form otherwise. read.c reads the count and type, calls fl_record_placeholder, registers the label, then reads the fields and calls fl_record_fill. The record-type resolution heuristic is factored out of fl_record so both forms agree. Ordinary record output is unchanged, and the #record( read path is untouched, so images written by an older eflisp still load. The reverse is not true: an image containing #record! needs this binary. efscm.boot is regenerated. It is ~1 KB smaller than before and contains 41 #record! forms -- the r7expander's environment records really are cyclic, e.g. #20=#record(#14# #f ((delay . ...) #20#)), which is why the dump was unreadable as soon as sharing was preserved. Also fills in the opaque type template, which referenced an undefined compare_TYPE. Verified: make test, test7, etest, etest7 all pass, both against the committed image (backward compatibility) and against the regenerated one; r7rs-coverage-test unchanged at 20 errors. Cyclic and mutually-recursive records survive GC, round-trip through print and read with the cycle intact, and self-referential tables survive GC. Known follow-up, written up under BUGS: equal? on two records in a reference cycle still recurses forever. compare_record calls equal_lispvalue, which restarts with a fresh bound, so bounded_compare never escapes to cyc_compare. That was unreachable until this commit made such records survive. check-in: 1d6486c34d user: e tags: trunk | |
| 18:32 | Port three boot-image packaging fixes back from trunk. - BOOTIMAGE_SIZE must be the size of the .boot image, not of the .inc hex text that encodes it. It declares the length of the flisp_system_image array and is the byte count handed to fl_load_system_image_str, so the oversized array left ~890 KB of trailing zeros after the real image. The base image survived that by luck; eflisp-r7rs would not boot at all (parse-error "read: undefined label 20"). Now 177919 rather than 1065584, and eflisp-r7rs loads. - Add an $(IMGDIR) rule and make it an order-only prerequisite of $(IMGDIR)/%.boot.inc, along with $(EXENAME). images/ is in ignore-glob, so without this a fresh checkout could not build eflisp-base or eflisp-r7rs. Also mkdir -p for $(BINDIR), and rm images/*.o in clean. - tests/r7rs-coverage/coverage runs eflisp with -s. The plain binary carries an empty image since the packaging rework, so the harness was invoking an imageless interpreter. Verified: make test, make etest, gen-e2e-test (240 pass) and module-test (16 pass) all pass; images/ rebuilds from nothing. eflisp-r7rs had to be verified with 'make -o efscm.boot' because efscm.boot cannot be regenerated on this branch -- ./eflisp -b mkboot2.lsp fails in the r7expander (assq-environment / identifier=? on records), and ./eflisp -s is broken the same way. That is the relocate_record change in record.c corrupting records that appear in reference cycles; it is unrelated to this commit and is written up under BUGS in wiki/DevNotes/DevNotes-eflisp-base.txt on trunk. check-in: abbf925ac2 user: e tags: efml | |
| 18:24 | Merge base-eflisp improvements from the efml branch. - equal? now works on records: cvtable_t gains a compare slot, equal.c dispatches to it for cvalues of the same type, and record.c implements compare_record (field-wise equal?, requires matching record type). - Rework boot-image packaging. The image moves out of flmain.c into efsrc/eflisp_image.c, compiled with -DBOOTIMAGE=... to embed one or with no defines for an empty image. images/%.boot.inc is generated by bin2hex, and eflisp-base / eflisp-r7rs link it in. The plain eflisp binary now carries an empty image and must be run with -b or -s. This replaces the checked-in flisp.boot.inc, which was misleadingly built from efscm.boot, so trunk's 'base' embedded image was really the R7RS one. Two fixes on top of the efml version: BOOTIMAGE_SIZE must be the size of the .boot image rather than of the .inc hex text that encodes it (the oversized R7RS array would not reload), and images/ is now created by the Makefile so a fresh checkout can build the packaged binaries. - tests/r7rs-coverage/coverage invokes eflisp with -s, since the plain binary no longer carries an image. Coverage is unchanged-to-better vs. trunk: 20 errors, down from 22 (load and interaction-environment now pass). - Drop the debug target, which referenced an undefined DOBJS and could not have worked; split clean/reallyclean; add the missing -s to r7rs-benchmarks; retarget etest/etest7 at the packaged binaries. - Add CLAUDE.md and .claude/skill-base.md, with the efml-specific material removed. Refresh wiki/DevNotes/symtab-base.txt. The efml branch's relocate_record change is deliberately NOT merged: it stops the circular-record GC crash but silently corrupts records in cycles, which breaks the r7expander outright. Forwarding early is the correct fix but exposes a *print-circle* labelling bug that makes mkboot2.lsp emit an unreadable image. Both findings are written up under BUGS in wiki/DevNotes/DevNotes-eflisp-base.txt. make test, test7, etest and etest7 all pass. check-in: 3325f8d7db user: e tags: trunk | |
| 17:31 | doc cleanup check-in: 89b6f107ac user: e tags: efml | |
|
2026-07-07
| ||
| 01:46 | start de-duping functions from enq3ml; reveal cross module compilation bug (worked around for now) check-in: e5f1f6931e user: e tags: efml | |
|
2026-07-06
| ||
| 21:36 | add basic value shadowing warning to enq3ml compiler check-in: fdd6dd279e user: e tags: efml | |
| 20:31 | get compiler warnings working; fix a frame slot allocation bug check-in: f67ec0517e user: e tags: efml | |
|
2026-07-05
| ||
| 17:59 | made divide op Num-generic, added toFloat check-in: 04a0ec6c20 user: e tags: efml | |
| 17:33 | remove the redundant topo_sort_modules machinery from the enq3ml compiler check-in: 1bd45a9e9e user: e tags: efml | |
| 17:24 | remove obsolete static module dependecy structure check-in: 54c344c6df user: e tags: efml | |
| 17:00 | compound String read . show round trips, with tests check-in: 29f01ff26b user: e tags: efml | |
| 13:19 | extended Read to handle compound types check-in: 3600eb81a4 user: e tags: efml | |
| 02:37 | add ReadTest; extended DerivedShowTest (ctor-args), ScalarTest (Show-Ordering), TupleTest (Eq/Ord); fix related defects check-in: 063b77c531 user: e tags: efml | |
|
2026-07-04
| ||
| 21:53 | update prompt queue check-in: 9f04f5f781 user: e tags: efml | |
| 21:01 | update prompt queue check-in: e7f761d0e9 user: e tags: efml | |
| 20:57 | use heapsort for simple-sort; fix register shortage for unit tests check-in: a63a631fc7 user: e tags: efml | |
| 19:21 | fix float Num instance dispatch in enq3ml compiler check-in: 1f0cd34d10 user: e tags: efml | |
| 18:22 | add more native efml tests, expose more bugs check-in: efd9ab7f9d user: e tags: efml | |
| 17:50 | fix Show and exception match exhaustiveness codegen check-in: b3dc5b683f user: e tags: efml | |
| 17:16 | native tests added; two buges revealed check-in: f4e57b39d6 user: e tags: efml | |
| 14:04 | foreign value feature fixed in native compiler check-in: 01a9b14c80 user: e tags: efml | |
| 12:51 | add makefile for efml bootstrap check-in: ad01ecdfab user: e tags: efml | |
| 00:39 | todo prompt notes updated check-in: feab212236 user: e tags: efml | |
| 00:35 | hoist the function closure save/restore out of the loop in ml_map_d and m_filter_d check-in: 54db141500 user: e tags: efml | |
| 00:08 | add fast path optimization to code gen for function entry boilerplate check-in: b4fe842702 user: e tags: efml | |
|
2026-07-03
| ||
| 23:49 | streamline enq3ml function-entry boilerplate check-in: 292172da0e user: e tags: efml | |
| 22:54 | put prompt queue in repo check-in: 16a035e5a1 user: e tags: efml | |
| 22:47 | improve the safe-for-space code generation check-in: caa4425702 user: e tags: efml | |
| 18:19 | bootstrap achieved! sh efml/test/bootstrap.sh check-in: 582a189277 user: e tags: efml | |
|
2026-07-02
| ||
| 01:06 | bootstrap ran though one native iteration, segfaults on second iteration; progress check-in: f33acbb6a6 user: e tags: efml | |
|
2026-07-01
| ||
| 20:32 | add stack size check to code gen check-in: 99d1f74d42 user: e tags: efml | |
| 19:29 | fix some gode gen gc safety issues check-in: 6763c5f5de user: e tags: efml | |
|
2026-06-30
| ||
| 22:59 | nearly there, a bit of debugging to do for the native/native comiler check-in: 25daa44681 user: e tags: efml | |
| 19:01 | self compile works, but missing some runtime ClosedFun forward defs for fixed point build check-in: 82333da538 user: e tags: efml | |
|
2026-06-29
| ||
| 22:03 | a few bugs squashed check-in: 35bca1e6e9 user: e tags: efml | |
| 19:21 | Module.ml native loading is complete and verified for value + tycon imports. Full Repl self-host blocked by Infer/SurfaceType gaps when loading BBTree.ml / Types.ml. check-in: a9b91a98ba user: e tags: efml | |
|
2026-06-28
| ||
| 20:49 | enq3ml wip; unify cons representation with records check-in: 1c31fc9671 user: e tags: efml | |
| 18:28 | enq3ml wip check-in: de5dc7105d user: e tags: efml | |
|
2026-06-27
| ||
| 20:00 | paeh optimizations and unit tests check-in: 0ccc818970 user: e tags: efml | |
| 18:37 | wip on enq3ml check-in: f079815006 user: e tags: efml | |
|
2026-06-24
| ||
| 16:29 | add ArithTest.ml integration test for enq3ml check-in: 9e5c026ddb user: e tags: efml | |
| 14:49 | fix some compiler and runtime bugs; bootstrapped compiler is basically working check-in: 0ab81d2e8e user: e tags: efml | |
|
2026-06-23
| ||
| 20:04 | fix two native enq3ml binary bugs causing wrong C generation check-in: 2677ab6dbc user: e tags: efml | |
| 18:00 | a few bugs squashed; compiler bootstrap v1 compiles and runs check-in: f61dd0f91b user: e tags: efml | |
| 12:41 | continue to flesh out enq3ml; ready to test with some things stubbed check-in: 4f78891f41 user: e tags: efml | |
|
2026-06-22
| ||
| 19:50 | add GenC to enq3ml check-in: 0e578813e2 user: e tags: efml | |
| 19:23 | continue to flesh out yhe enq3ml compiler check-in: b1e763bfcf user: e tags: efml | |
| 18:52 | added the pure ml files for enq3ml check-in: 3f1c8e61b9 user: e tags: efml | |