diff --git a/packages/ludic.ui/expr_prim.ludic b/packages/ludic.ui/expr_prim.ludic index 38350312..c95a36a3 100644 --- a/packages/ludic.ui/expr_prim.ludic +++ b/packages/ludic.ui/expr_prim.ludic @@ -82,7 +82,14 @@ function ex_text(src: string, err: []string) -> UiExpr { i += 1 } if at < len(src) { push(e.args, ex_lit(Value.str(src[at..len(src)]))) } - if len(e.args) == 0 { return ex_lit(Value.str("")) } - if len(e.args) == 1 { return e.args[0] } - return e + if len(e.args) > 1 { return e } + # one piece or none: the joining node is not kept, so it is given back + var one: UiExpr = null + if len(e.args) == 1 { one = e.args[0] } + unsafe { + free(e.args) + free(e) + } + if one == null { return ex_lit(Value.str("")) } + return one } diff --git a/packages/ludic.ui/style.ludic b/packages/ludic.ui/style.ludic index 4a654a82..88c5a824 100644 --- a/packages/ludic.ui/style.ludic +++ b/packages/ludic.ui/style.ludic @@ -30,9 +30,12 @@ function lss_file(ui_st: mut UiState, src: string, path: string) -> UiFile { @alloc_ok("a stylesheet being read: once per component class (uc_load)") function lss_text(ui_st: mut UiState, f: UiFile, src: string) -> void { let err = new []string - lss_block(ui_st, f, lss_strip(src), null, err) + let body = lss_strip(src) # always a copy of its own (lss_strip joins its pieces) + lss_block(ui_st, f, body, null, err) + unsafe { free(body) } # every rule, selector and value read from it is a copy @alloc_ok("only when a template is wrong: a broken screen, never a working one") for i in 0 .. len(err) { ui_err(ui_st, `{f.path}: