]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Fix slice
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Tue, 12 May 2020 20:12:50 +0000 (22:12 +0200)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Tue, 12 May 2020 20:12:50 +0000 (22:12 +0200)
src/emit/emit.c
src/lib/array.c
src/parse/check.c

index 7846646f718f928b8d12e7bd73b68e0b65b5fb43..7d9cf8514047c0c3fd3fc1ccd8db17e36af533fe 100644 (file)
@@ -429,7 +429,7 @@ ANN static m_bool emit_exp_slice(const Emitter emit, const Exp_Slice* range) {
   const Symbol sym = insert_symbol("@slice");
   const Exp e = range->range->start ?: range->range->end;
   struct Op_Import opi = { .op=sym, .lhs=e->info->type, .rhs=range->base->info->type,
-    .pos=e->pos, .data=(uintptr_t)range->base, .op_type=op_exp };
+    .pos=e->pos, .data=(uintptr_t)exp_self(range), .op_type=op_exp };
   CHECK_OB(op_emit(emit, &opi))
   return GW_OK;
 }
index 1808730b000f76c9063812f1126f6b82ab9bdf92..d203d71eb72a22eeee79437bab63f5790c7bb653 100644 (file)
@@ -196,7 +196,8 @@ static OP_CHECK(opck_array_cast) {
 
 static OP_CHECK(opck_array_slice) {
   const Exp e = (Exp)data;
-  return e->info->type;
+  exp_setmeta(exp_self(e), 1);
+  return e->d.exp_slice.base->info->type;
 }
 
 static inline m_bool bounds(const M_Vector v, const m_int i) {
@@ -339,6 +340,9 @@ GWION_IMPORT(array) {
   GWI_BB(gwi_oper_ini(gwi, "@Array", "@Array", NULL))
   GWI_BB(gwi_oper_add(gwi, opck_array_at))
   GWI_BB(gwi_oper_end(gwi, "@=>", ObjectAssign))
+  GWI_BB(gwi_oper_ini(gwi, "@null", "@Array", NULL))
+  GWI_BB(gwi_oper_add(gwi, opck_array_at))
+  GWI_BB(gwi_oper_end(gwi, "@=>", ObjectAssign))
   GWI_BB(gwi_oper_ini(gwi, "nonnull @Array", (m_str)OP_ANY_TYPE, NULL))
   GWI_BB(gwi_oper_add(gwi, opck_array_shift))
   GWI_BB(gwi_oper_emi(gwi, opem_array_shift))
index 9270a82d7ff084a4e63bf084e3e388ee94f938a1..656669277acfd7ea9554996e55c3621dbeceaa0a 100644 (file)
@@ -369,7 +369,7 @@ static ANN Type check_exp_slice(const Env env, const Exp_Slice* range) {
   const Symbol sym = insert_symbol("@slice");
   const Exp e = range->range->start ?: range->range->end;
   struct Op_Import opi = { .op=sym, .lhs=e->info->type, .rhs=range->base->info->type,
-    .pos=e->pos, .data=(uintptr_t)range->base, .op_type=op_exp };
+    .pos=e->pos, .data=(uintptr_t)exp_self(range), .op_type=op_exp };
   return op_check(env, &opi);
 }