From 86b3ad070d6a2e1b70f6ad425b95cfd9a3f5351d Mon Sep 17 00:00:00 2001 From: Will Anderson Date: Thu, 30 Apr 2026 18:14:57 -0500 Subject: [PATCH] compiler+runtime: codegen fixes for empty literal, == int idents, m.field; runtime body-loss fix and Linux feature macros MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three codegen bugs surfaced repeatedly across the parallel port-to-El agents and were patched here: 1. Empty array literal '[]' was emitting el_list_new(0, ) — trailing comma in a varargs call, fails the C parse. Special-cased: n==0 returns 'el_list_empty()' directly. 2. '==' between two identifiers both tracked in __int_names (typed Int via 'let x: Int = ...') was miscompiling to str_eq. With the tagged-pointer Int-as-int64 representation, str_eq strcmp's what are integer values dressed as char* and segfaults on the first non-printable byte. Added the int-name lookup, mirroring the dispatch already present for '+' between Int idents. NotEq got the same treatment. 3. 'm.field' codegen was passing the raw const char* field name to el_get_field, which expects el_val_t. C compiler warned about int conversion; runtime read garbage at the address. Wrapped in EL_STR(...) so the field name lands as a proper el_val_t. Runtime additions in the same pass: - el_runtime.c http_read_request: the loop's boundary check was 'line_end >= hdr_end' which broke before processing the LAST header line — its trailing \r\n IS hdr_end. Real curl clients put Content-Length last, so POST bodies were silently arriving as length 0. Changed to '> hdr_end' so the last line is processed. soma-server agent surfaced this during smoke testing. - _GNU_SOURCE feature macro: clock_gettime/CLOCK_REALTIME, strcasecmp, and the dlfcn extensions (RTLD_DEFAULT) all gated behind it on glibc/Debian. macOS is permissive without; the landing Docker build needed these for linux/amd64. Adds for strcasecmp. - Refactored slot semantics in el_runtime.c (already in tree from the morning ARC commit): magic-tagged ElHeader at offset 0, ElList/ElMap with separate elems/keys/values payload allocations, el_list_append and el_map_set mutate-in-place when refcount<=1 and copy-on-write when shared. Self-host fixpoint reached at v3: elc → elc.c → cc → elc binary → elc.c reproduced byte-for-byte. dist/platform/elc and dist/platform/elc.c updated. The codegen.el and elc-combined.el changes are mirror-edits; both flow through the bootstrap chain to keep self-hosting clean. --- dist/platform/elc | Bin 166168 -> 166312 bytes dist/platform/elc.c | 27 +++++++++++++++++++- el-compiler/runtime/el_runtime.c | 41 ++++++++++++++++++++++++++++++- el-compiler/runtime/el_runtime.h | 2 ++ el-compiler/src/codegen.el | 39 ++++++++++++++++++++++++++--- elc-combined.el | 31 ++++++++++++++++++++--- 6 files changed, 132 insertions(+), 8 deletions(-) diff --git a/dist/platform/elc b/dist/platform/elc index 1ed09407c89392fb2f06a8f0e377346b9c2b2ea7..7b21bab0f5e83cc295376b42caf3258d74ce55aa 100755 GIT binary patch delta 52200 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 GLi``dtI^m1 delta 51525 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

krit4_V~>VoZraO?9|**CllbC;gD*|F4y3djAu3 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 diff --git a/dist/platform/elc.c b/dist/platform/elc.c index c97779d..941891d 100644 --- a/dist/platform/elc.c +++ b/dist/platform/elc.c @@ -1898,6 +1898,17 @@ el_val_t cg_expr(el_val_t expr) { if (str_eq(right_kind, EL_STR("Bool"))) { return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Ident"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + el_val_t rname = el_get_field(right, EL_STR("name")); + if (is_int_name(lname)) { + if (is_int_name(rname)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); + } + } + } + } if (str_eq(left_kind, EL_STR("Str"))) { return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); } @@ -1930,6 +1941,17 @@ el_val_t cg_expr(el_val_t expr) { if (str_eq(right_kind, EL_STR("Bool"))) { return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Ident"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + el_val_t rname = el_get_field(right, EL_STR("name")); + if (is_int_name(lname)) { + if (is_int_name(rname)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); + } + } + } + } if (str_eq(left_kind, EL_STR("Str"))) { return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); } @@ -1989,7 +2011,7 @@ el_val_t cg_expr(el_val_t expr) { el_val_t obj = el_get_field(expr, EL_STR("object")); el_val_t field = el_get_field(expr, EL_STR("field")); el_val_t obj_c = cg_expr(obj); - return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_get_field("), obj_c), EL_STR(", ")), c_str_lit(field)), EL_STR(")")); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_get_field("), obj_c), EL_STR(", EL_STR(")), c_str_lit(field)), EL_STR("))")); } if (str_eq(kind, EL_STR("Index"))) { el_val_t obj = el_get_field(expr, EL_STR("object")); @@ -2005,6 +2027,9 @@ el_val_t cg_expr(el_val_t expr) { if (str_eq(kind, EL_STR("Array"))) { el_val_t elems = el_get_field(expr, EL_STR("elems")); el_val_t n = native_list_len(elems); + if (n == 0) { + return EL_STR("el_list_empty()"); + } el_val_t items = EL_STR(""); el_val_t i = 0; while (i < n) { diff --git a/el-compiler/runtime/el_runtime.c b/el-compiler/runtime/el_runtime.c index daf4dac..3f9028f 100644 --- a/el-compiler/runtime/el_runtime.c +++ b/el-compiler/runtime/el_runtime.c @@ -11,9 +11,18 @@ * Link requirements: -lcurl (HTTP client + LLM), -lpthread (HTTP server). */ +/* Feature-test macros must be set before any standard headers. _GNU_SOURCE + * exposes clock_gettime/CLOCK_REALTIME, strcasecmp, and the dlfcn extensions + * (RTLD_DEFAULT) — all of which macOS hands us without asking but glibc on + * Debian gates behind an explicit opt-in. */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + #include "el_runtime.h" #include +#include /* strcasecmp */ #include #include #include @@ -877,7 +886,14 @@ static int http_read_request(int fd, char** out_method, char** out_path, char* hp = sp2 + 1; while (hp < hdr_end) { char* line_end = strstr(hp, "\r\n"); - if (!line_end || line_end >= hdr_end) break; + /* line_end == hdr_end means we're on the LAST header line — its + * trailing \r\n is the same \r\n that begins the \r\n\r\n header + * terminator. Process this line; only stop when line_end is past + * hdr_end (which means the parser walked off the end of the + * header block). The previous condition (line_end >= hdr_end) + * silently dropped any Content-Length that appeared as the last + * header — exactly what real curl/clients tend to emit. */ + if (!line_end || line_end > hdr_end) break; if (strncasecmp(hp, "Content-Length:", 15) == 0) { content_length = strtol(hp + 15, NULL, 10); if (content_length < 0) content_length = 0; @@ -1705,6 +1721,29 @@ el_val_t time_diff(el_val_t ts1, el_val_t ts2, el_val_t unit) { return (el_val_t)d; } +/* Block the calling thread for `secs` seconds. Negative values are clamped + * to 0. Used by El programs that poll external resources (e.g. RunPod + * /status, Engram readiness probes). */ +el_val_t sleep_secs(el_val_t secs) { + int64_t s = (int64_t)secs; + if (s < 0) s = 0; + struct timespec ts; + ts.tv_sec = (time_t)s; + ts.tv_nsec = 0; + nanosleep(&ts, NULL); + return 0; +} + +el_val_t sleep_ms(el_val_t ms) { + int64_t m = (int64_t)ms; + if (m < 0) m = 0; + struct timespec ts; + ts.tv_sec = (time_t)(m / 1000LL); + ts.tv_nsec = (long)((m % 1000LL) * 1000000LL); + nanosleep(&ts, NULL); + return 0; +} + /* ── UUID v4 ─────────────────────────────────────────────────────────────── */ static int _el_uuid_seeded = 0; diff --git a/el-compiler/runtime/el_runtime.h b/el-compiler/runtime/el_runtime.h index 685f642..014d2ee 100644 --- a/el-compiler/runtime/el_runtime.h +++ b/el-compiler/runtime/el_runtime.h @@ -158,6 +158,8 @@ el_val_t json_array_len(el_val_t json_str); el_val_t time_now(void); el_val_t time_now_utc(void); +el_val_t sleep_secs(el_val_t secs); +el_val_t sleep_ms(el_val_t ms); el_val_t time_format(el_val_t ts, el_val_t fmt); el_val_t time_to_parts(el_val_t ts); el_val_t time_from_parts(el_val_t secs, el_val_t ns, el_val_t tz); diff --git a/el-compiler/src/codegen.el b/el-compiler/src/codegen.el index 5406e50..6d9252d 100644 --- a/el-compiler/src/codegen.el +++ b/el-compiler/src/codegen.el @@ -253,9 +253,12 @@ fn cg_expr(expr: Map) -> String { } // String equality: use str_eq() when either side is a string literal or ident. - // Use plain == when comparing integer literals. + // Use plain == when comparing integer literals OR when both sides are + // identifiers tracked in __int_names (typed Int via `let x: Int = ...`). + // Without the int-name check, `seen == idx` between two Int locals + // miscompiles to str_eq(seen, idx), strcmp'ing what are integer values + // dressed as char* — segfault on the first non-printable byte. if op == "EqEq" { - // Integer literal on either side → arithmetic comparison if left_kind == "Int" { return "(" + left_c + " == " + right_c + ")" } @@ -268,6 +271,17 @@ fn cg_expr(expr: Map) -> String { if right_kind == "Bool" { return "(" + left_c + " == " + right_c + ")" } + if left_kind == "Ident" { + if right_kind == "Ident" { + let lname: String = left["name"] + let rname: String = right["name"] + if is_int_name(lname) { + if is_int_name(rname) { + return "(" + left_c + " == " + right_c + ")" + } + } + } + } if left_kind == "Str" { return "str_eq(" + left_c + ", " + right_c + ")" } @@ -301,6 +315,17 @@ fn cg_expr(expr: Map) -> String { if right_kind == "Bool" { return "(" + left_c + " != " + right_c + ")" } + if left_kind == "Ident" { + if right_kind == "Ident" { + let lname: String = left["name"] + let rname: String = right["name"] + if is_int_name(lname) { + if is_int_name(rname) { + return "(" + left_c + " != " + right_c + ")" + } + } + } + } if left_kind == "Str" { return "!str_eq(" + left_c + ", " + right_c + ")" } @@ -372,7 +397,12 @@ fn cg_expr(expr: Map) -> String { let obj = expr["object"] let field: String = expr["field"] let obj_c: String = cg_expr(obj) - return "el_get_field(" + obj_c + ", " + c_str_lit(field) + ")" + // el_get_field takes el_val_t for both args, so the field name + // string literal must be wrapped in EL_STR(). Without the wrap + // the C compiler treats the bare const char* as an int64 (warns + // -Wint-conversion) and the runtime reads gibberish at the address + // when looking up the key. + return "el_get_field(" + obj_c + ", EL_STR(" + c_str_lit(field) + "))" } if kind == "Index" { @@ -395,6 +425,9 @@ fn cg_expr(expr: Map) -> String { if kind == "Array" { let elems = expr["elems"] let n: Int = native_list_len(elems) + // Empty literal: el_list_new(0, ) generates malformed C (trailing + // comma in a varargs call). Emit el_list_empty() directly. + if n == 0 { return "el_list_empty()" } let items = "" let i = 0 while i < n { diff --git a/elc-combined.el b/elc-combined.el index 1fd5608..e068919 100644 --- a/elc-combined.el +++ b/elc-combined.el @@ -1703,9 +1703,11 @@ fn cg_expr(expr: Map) -> String { } // String equality: use str_eq() when either side is a string literal or ident. - // Use plain == when comparing integer literals. + // Use plain == when comparing integer literals OR when both sides are + // identifiers tracked in __int_names. Without the int-name check, + // `seen == idx` between two Int locals miscompiles to str_eq on what + // are integer values dressed as char* — segfault. if op == "EqEq" { - // Integer literal on either side → arithmetic comparison if left_kind == "Int" { return "(" + left_c + " == " + right_c + ")" } @@ -1718,6 +1720,17 @@ fn cg_expr(expr: Map) -> String { if right_kind == "Bool" { return "(" + left_c + " == " + right_c + ")" } + if left_kind == "Ident" { + if right_kind == "Ident" { + let lname: String = left["name"] + let rname: String = right["name"] + if is_int_name(lname) { + if is_int_name(rname) { + return "(" + left_c + " == " + right_c + ")" + } + } + } + } if left_kind == "Str" { return "str_eq(" + left_c + ", " + right_c + ")" } @@ -1751,6 +1764,17 @@ fn cg_expr(expr: Map) -> String { if right_kind == "Bool" { return "(" + left_c + " != " + right_c + ")" } + if left_kind == "Ident" { + if right_kind == "Ident" { + let lname: String = left["name"] + let rname: String = right["name"] + if is_int_name(lname) { + if is_int_name(rname) { + return "(" + left_c + " != " + right_c + ")" + } + } + } + } if left_kind == "Str" { return "!str_eq(" + left_c + ", " + right_c + ")" } @@ -1822,7 +1846,7 @@ fn cg_expr(expr: Map) -> String { let obj = expr["object"] let field: String = expr["field"] let obj_c: String = cg_expr(obj) - return "el_get_field(" + obj_c + ", " + c_str_lit(field) + ")" + return "el_get_field(" + obj_c + ", EL_STR(" + c_str_lit(field) + "))" } if kind == "Index" { @@ -1845,6 +1869,7 @@ fn cg_expr(expr: Map) -> String { if kind == "Array" { let elems = expr["elems"] let n: Int = native_list_len(elems) + if n == 0 { return "el_list_empty()" } let items = "" let i = 0 while i < n {