compiler: free a string an expression made once it has been used
The left half of a + chain, a template's pieces and holes, a number's text and a side made only to be compared are marked fresh and freed after the +, ==, != or print that reads them. lp_int_str and lp_long_str move their digits to the start of the buffer, so the pointer they return is the one malloc gave. Reseeded. examples/lang/string_temps.ludic: kept intermediates stay good, and 20,000 rounds grow the heap 0 bytes (2.9 MB before). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
2fe4018d28
commit
9660587e10
10 changed files with 56019 additions and 48735 deletions
|
|
@ -247,7 +247,7 @@ function emit_fp_str(v: Val) -> Val {
|
|||
var d = v.code
|
||||
var single = "0"
|
||||
if (v.ty == "float") { d = emit_bind(`fpext float {v.code} to double`); single = "1" }
|
||||
return val(emit_bind(`call ptr @lp_fp_str(double {d}, i32 {single})`), "string")
|
||||
return fresh_val(emit_bind(`call ptr @lp_fp_str(double {d}, i32 {single})`), "string")
|
||||
}
|
||||
|
||||
# @lp_fp_str(v, single): "%.*g" with the fewest digits that round-trip (through
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue