From bfce5270963bdc75e8cad70ce4852a6f5a191a97 Mon Sep 17 00:00:00 2001 From: dzaima Date: Wed, 12 Mar 2025 02:25:24 +0200 Subject: [PATCH] =?UTF-8?q?fix=20=F0=9D=95=97=E2=8C=BE(-2=E2=8B=8663)?= =?UTF-8?q?=F0=9D=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/md2.c | 11 ++++++++--- test/cases/prims.bqn | 9 +++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/builtins/md2.c b/src/builtins/md2.c index 919bc8ba..eaeb8c9a 100644 --- a/src/builtins/md2.c +++ b/src/builtins/md2.c @@ -56,6 +56,10 @@ B catch_c1(Md2D* d, B x) { return c1(d->f, x); } B catch_c2(Md2D* d, B w, B x) { return c2(d->f, w,x); } #endif +static NOINLINE NORETURN void repeat_bad_num() { + thrM("⍟: 𝔾 contained non-integer or integer was out of range"); +} + extern GLOBAL B rt_undo; void repeat_bounds(i64* bound, B g) { // doesn't consume #define UPD_BOUNDS(B,I) ({ i64 i_ = (I); if (i_bound[1]) bound[1] = i_; }) @@ -65,7 +69,7 @@ void repeat_bounds(i64* bound, B g) { // doesn't consume u8 ge = TI(g,elType); if (elNum(ge)) { i64 bres[2]; - if (!getRange_fns[ge](tyany_ptr(g), bres, ia)) thrM("⍟: 𝔾 contained non-integer (or integer was out of range)"); + if (!getRange_fns[ge](tyany_ptr(g), bres, ia)) repeat_bad_num(); if (bres[0]bound[1]) bound[1] = bres[1]; } else { @@ -73,7 +77,7 @@ void repeat_bounds(i64* bound, B g) { // doesn't consume for (usz i = 0; i < ia; i++) repeat_bounds(bound, GetU(g, i)); } } else if (isNum(g)) { - if (!q_i64(g)) thrM("⍟: 𝔾 contained non-integer (or integer was out of range)"); + if (!q_i64(g)) repeat_bad_num(); i64 c = o2i64G(g); if (cbound[1]) bound[1] = c; @@ -104,7 +108,8 @@ NOINLINE B repeat_replaceR(B g, B* q) { } \ i64 bound[2] = {0,0}; \ repeat_bounds(bound, g); \ - i64 min=(u64)-bound[0]; i64 max=(u64)bound[1]; \ + i64 min=-(u64)bound[0]; i64 max=bound[1]; \ + if ((min|max) >> 48 != 0) repeat_bad_num(); \ TALLOC(B, all, min+max+1); \ B* q = all+min; \ q[0] = inc(x); \ diff --git a/test/cases/prims.bqn b/test/cases/prims.bqn index 589eb8e7..2c50badf 100644 --- a/test/cases/prims.bqn +++ b/test/cases/prims.bqn @@ -462,10 +462,11 @@ a←↕2 β‹„ ! "e" ≑ (↕10){b←aβ€Ώaβ€Ώaβ€Ώaβ€Ώaβ€Ώaβ€Ώaβ€Ώaβ€Ώaβ€Ώa β‹„ !"⍟: 𝔾 contained non-number" % 1⊸+⍟⟨1,∘,3⟩ 0 !"Expected integer, got 1.5" % 1⊸+⍟1.5 0 !"Integer out of range: 1e20" % 1⊸+⍟1e20 0 -!"⍟: 𝔾 contained non-integer (or integer was out of range)" % %USE evar β‹„ {1⊸+βŸπ•© 0}_evar ⟨1.5⟩ -!"⍟: 𝔾 contained non-integer (or integer was out of range)" % %USE evar β‹„ {1⊸+βŸπ•© 0}_evar ⟨1e20⟩ -!"⍟: 𝔾 contained non-integer (or integer was out of range)" % %USE evar β‹„ {1⊸+βŸπ•© 0}_evar ⟨9, 1.5⟩ -!"⍟: 𝔾 contained non-integer (or integer was out of range)" % %USE evar β‹„ {1⊸+βŸπ•© 0}_evar ⟨1.5, 9⟩ +!"⍟: 𝔾 contained non-integer or integer was out of range" % %USE evar β‹„ {1⊸+βŸπ•© 0}_evar ⟨1.5⟩ +!"⍟: 𝔾 contained non-integer or integer was out of range" % %USE evar β‹„ {1⊸+βŸπ•© 0}_evar ⟨1e20⟩ +!"⍟: 𝔾 contained non-integer or integer was out of range" % %USE evar β‹„ {1⊸+βŸπ•© 0}_evar ⟨9, 1.5⟩ +!"⍟: 𝔾 contained non-integer or integer was out of range" % %USE evar β‹„ {1⊸+βŸπ•© 0}_evar ⟨1.5, 9⟩ +!"⍟: 𝔾 contained non-integer or integer was out of range" % %USE eqerr β‹„ {1⊸+βŸπ•©β€Ώπ•© 2}_eqerr -⊸∾ ⟨2⋆63, 2⋆60⟩ # β—Ά !"π”½β—Άπ•˜π•©: π•˜ must have rank 1 when index is a number" % 1β—Ά[1β€Ώ2,3β€Ώ4] 3