]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Fix array concat emission
authorJérémie Astor <fennecdjay@gmail.com>
Sat, 7 Aug 2021 01:05:47 +0000 (03:05 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Sat, 7 Aug 2021 01:05:47 +0000 (03:05 +0200)
src/lib/array.c

index 701505a328ccd769b000a83505254278c0845a6c..90a06d79d020b0224c23ec3bf1881807e42f83af 100644 (file)
@@ -200,9 +200,14 @@ static INSTR(ArrayConcatRight) {
   memmove(ARRAY_PTR(base), ARRAY_PTR(more), ARRAY_LEN(more) * sz);
 }
 
+ANN static inline bool shift_match(const Type base, const Type more) {
+  return isa(more, base) > 0 &&
+    get_depth(base) == get_depth(more);
+}
+
 static OP_EMIT(opem_array_sr) {
   const Exp_Binary *bin = (Exp_Binary *)data;
-  if (bin->rhs->type->array_depth == bin->lhs->type->array_depth)
+  if (shift_match(bin->lhs->type, bin->rhs->type))
     return emit_array_shift(emit, ArrayConcatRight);
   const Instr pop = emit_add_instr(emit, RegMove);
   pop->m_val      = -SZ_INT;
@@ -214,7 +219,7 @@ static OP_EMIT(opem_array_sr) {
 
 static OP_EMIT(opem_array_sl) {
   const Exp_Binary *bin = (Exp_Binary *)data;
-  if (bin->lhs->type->array_depth == bin->rhs->type->array_depth)
+  if (shift_match(bin->rhs->type,  bin->lhs->type))
     return emit_array_shift(emit, ArrayConcatLeft);
   const Instr pop = emit_add_instr(emit, RegMove);
   pop->m_val      = -bin->rhs->type->size;