From 1c20f3eac550fd946e0a15505a494f0b20f0f179 Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 23 May 2025 20:48:28 +0300 Subject: [PATCH] =?UTF-8?q?fix=20memory=20leak=20in=20`=F0=9D=94=BD?= =?UTF-8?q?=E2=8C=BE(is=E2=8A=B8=E2=8A=8F)=20highRank`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/select.c | 11 +++++++---- test/cases/under.bqn | 4 ++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/builtins/select.c b/src/builtins/select.c index 6e98ea7e..24604316 100644 --- a/src/builtins/select.c +++ b/src/builtins/select.c @@ -475,8 +475,9 @@ B select_replace(u32 chr, B w, B x, B rep, usz wia, usz cam, usz csz) { // consu MAKE_MUT(r, cam*csz); mut_init_copy(r, x, re); NOGC_E; - MUTG_INIT(r); SGet(rep) + MUTG_INIT(r); if (csz==1) { + SGet(rep) for (usz i = 0; i < wia; i++) { READ_W(cw, i); B cn = Get(rep, i); @@ -485,9 +486,10 @@ B select_replace(u32 chr, B w, B x, B rep, usz wia, usz cam, usz csz) { // consu mut_setG(r, cw, cn); } } else { + SGetU(rep) for (usz i = 0; i < wia; i++) { READ_W(cw, i); - EQ(for (usz j = 0; j < csz; j++), !compatible(mut_getU(r, cw*csz + j), Get(rep, i*csz + j))); + EQ(for (usz j = 0; j < csz; j++), !compatible(mut_getU(r, cw*csz + j), GetU(rep, i*csz + j))); for (usz j = 0; j < csz; j++) mut_rm(r, cw*csz + j); mut_copyG(r, cw*csz, rep, i*csz, csz); } @@ -533,8 +535,8 @@ B select_replace(u32 chr, B w, B x, B rep, usz wia, usz cam, usz csz) { // consu case el_B: { ra = reuse? a(REUSE(x)) : cpyHArr(x); B* rp = harrv_ptr(ra); - SGet(rep) if (csz==1) { + SGet(rep) for (usz i = 0; i < wia; i++) { READ_W(cw, i); B cn = Get(rep, i); @@ -543,9 +545,10 @@ B select_replace(u32 chr, B w, B x, B rep, usz wia, usz cam, usz csz) { // consu rp[cw] = cn; } } else { + SGetU(rep) for (usz i = 0; i < wia; i++) { READ_W(cw, i); - EQ(for (usz j = 0; j < csz; j++), !compatible(Get(rep, i*csz + j), rp[cw*csz + j])); + EQ(for (usz j = 0; j < csz; j++), !compatible(GetU(rep, i*csz + j), rp[cw*csz + j])); for (usz j = 0; j < csz; j++) dec(rp[cw*csz + j]); COPY_TO(rp, el_B, cw*csz, rep, i*csz, csz); } diff --git a/test/cases/under.bqn b/test/cases/under.bqn index fbac8b3f..9c461ede 100644 --- a/test/cases/under.bqn +++ b/test/cases/under.bqn @@ -115,6 +115,10 @@ n←500 ⋄ a←↕n ⋄ i←(-n)+↕2×n ⋄ r←⌽(2×n)⥊a ⋄ ! (⌽a) ≡ %USE eqvar ⋄ (<⟨⟩) {•internal.Keep⌾(𝕨⊸⊏) 𝕩}_eqvar¨ ⟨0‿1, "ab"‿"cd"⟩ %% ⟨0‿1, "ab"‿"cd"⟩ %USE eqvar ⋄ ⟨0÷0,0÷0⟩ {𝕨⌾(0‿0⊸⊏) 𝕩}_eqvar 3⥊0 %% ⟨0÷0,0,0⟩ %USE eqvar ⋄ %USE nz ⋄ 0‿0 {(0 InsNZ 2⥊0)⌾(𝕨⊸⊏)𝕩}_eqvar 3⥊3 %% 0‿3‿3 +%USE eqvar ⋄ "CD" {𝕨¨⌾(2‿3‿2‿3‿4⊸⊏) 𝕩}_eqvar 10⥊<"ab" %% "ab"‿"ab"‿"CD"‿"CD"‿"CD"‿"ab"‿"ab"‿"ab"‿"ab"‿"ab" +%USE eqvar ⋄ "CD" {𝕨¨⌾(2‿3‿2‿1⊸⊏) 𝕩}_eqvar 5‿2⥊<"ab" %% ≍˜˘ "ab"‿"CD"‿"CD"‿"CD"‿"ab" +%USE eqvar ⋄ 2‿3‿2‿1 {( 32⊸+⊸≍˘ "AB"‿"CD"‿"AB"‿"EF")⌾(𝕨⊸⊏) 𝕩}_eqvar 5‿2⥊<"?" %% 5‿2⥊⟨"?","?","ef","EF","ab","AB","cd","CD","?","?"⟩ +%USE eqvar ⋄ 2‿3‿2‿1 {{𝕊: 32⊸+⊸≍˘ "AB"‿"CD"‿"AB"‿"EF"}⌾(𝕨⊸⊏) 𝕩}_eqvar 5‿2⥊<"?" %% 5‿2⥊⟨"?","?","ef","EF","ab","AB","cd","CD","?","?"⟩ # ⥊