From 58ac287ef6823bbc0a850ad90e2511670764e8e1 Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 21 Apr 2023 17:19:27 +0300 Subject: [PATCH] handle array-atom comparison separately from array-array --- src/builtins/compare.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/builtins/compare.c b/src/builtins/compare.c index 05efe4b7..c79544df 100644 --- a/src/builtins/compare.c +++ b/src/builtins/compare.c @@ -5,13 +5,24 @@ NOINLINE i32 compareF(B w, B x) { if (isNum(w) & isC32(x)) return -1; if (isC32(w) & isNum(x)) return 1; - if (isAtm(w) & isAtm(x)) thrM("Invalid comparison"); - bool wa=isAtm(w); usz wia; ur wr; usz* wsh; AS2B wgetU ONLY_GCC(=0); Arr* wArr ONLY_GCC(=0); - bool xa=isAtm(x); usz xia; ur xr; usz* xsh; AS2B xgetU ONLY_GCC(=0); Arr* xArr ONLY_GCC(=0); - if(wa) { wia=1; wr=0; wsh=NULL; } else { wia=IA(w); wr=RNK(w); wsh=SH(w); wgetU=TI(w,getU); wArr = a(w); } - if(xa) { xia=1; xr=0; xsh=NULL; } else { xia=IA(x); xr=RNK(x); xsh=SH(x); xgetU=TI(x,getU); xArr = a(x); } - i32 rc = CMP(wr+(wa?0:1), xr+(xa?0:1)); + i32 atmNeg; + if (isAtm(w)) { + atmNeg = 0; + + atmW:; + if (isAtm(x)) thrM("Invalid comparison"); + + if (IA(x)==0) return atmNeg? -1 : 1; + i32 c = compare(w, IGetU(x,0)); + return (c<=0)^atmNeg? -1 : 1; + } + if (isAtm(x)) { B t=w; w=x; x=t; atmNeg=1; goto atmW; } + + ur wr=RNK(w); usz* wsh=SH(w); + ur xr=RNK(x); usz* xsh=SH(x); + + i32 rc = CMP(wr, xr); ur rr = wr