]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve ranges
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Sat, 30 Nov 2019 21:27:25 +0000 (22:27 +0100)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Sat, 30 Nov 2019 21:27:25 +0000 (22:27 +0100)
src/emit/emit.c
src/lib/prim.c

index be0a7460f33bf60937f8735d21d99590c8e0cfd1..22806b9481fdec0419c64f1fba25ecf722df5a5e 100644 (file)
@@ -417,9 +417,6 @@ ANN static m_bool emit_prim_range(const Emitter emit, Range **data) {
   const Symbol sym = insert_symbol("@range");
   struct Op_Import opi = { .op=sym, .rhs=e->type, .pos=e->pos, .data=(uintptr_t)prim_exp(data) };
   CHECK_OB(op_emit(emit, &opi))
-  const Instr instr = emit_add_instr(emit, ArrayInit);
-  instr->m_val = (m_uint)prim_exp(data)->type;
-  instr->m_val2 = prim_exp(data)->type->size;
   emit_add_instr(emit, GcAdd);
   return GW_OK;
 }
index e1e715f74efdc88d5b91fb7974158266f365244e..326e124cf5b717ccf7c6089840c7593dbd35d0b1 100644 (file)
@@ -25,7 +25,7 @@ GWION_IMPORT(int_op) {
   GWI_BB(gwi_oper_end(gwi, "/", int_div))
   GWI_BB(gwi_oper_end(gwi, "%", int_modulo))
   GWI_BB(gwi_oper_end(gwi, "@access", NULL))
-  return   gwi_oper_end(gwi, "@repeat", NULL);
+  return gwi_oper_end(gwi, "@repeat", NULL);
 }
 
 static GWION_IMPORT(int_logical) {
@@ -65,12 +65,11 @@ static INSTR(IntRange) {
   const m_int end   = *(m_int*)REG(SZ_INT);
   const m_int op    = start < end ? 1 : -1;
   const m_uint sz    = op > 0 ? end - start : start - end;
-  if((sz - (shred->reg - (m_bit*)(shred + sizeof(struct VM_Shred_)))) > SIZEOF_REG)
-    Except(shred, _("Range too big"))
+  const M_Object array = new_array(shred->info->vm->gwion->mp, (Type)instr->m_val, sz);
   for(m_int i = start, j = 0; i != end; i += op, ++j)
-    *(m_uint*)REG(j * SZ_INT) = i;
-  *(m_uint*)REG(sz * SZ_INT) = sz;
-  PUSH_REG(shred, sz * SZ_INT);
+    m_vector_set(ARRAY(array), j, &i);
+  *(M_Object*)REG(0) = array;
+  PUSH_REG(shred, SZ_INT);
 }
 
 static OP_CHECK(opck_int_range) {
@@ -80,6 +79,13 @@ static OP_CHECK(opck_int_range) {
   return array_type(env, e->type, 1);
 }
 
+static OP_EMIT(opem_int_range) {
+  const Exp exp = (Exp)data;
+  const Instr instr = emit_add_instr(emit, IntRange);
+  instr->m_val = (m_uint)exp->type;
+  return instr;
+}
+
 static GWION_IMPORT(int_unary) {
   GWI_BB(gwi_oper_ini(gwi, NULL, "int", "int"))
   GWI_BB(gwi_oper_add(gwi,  opck_unary_meta))
@@ -89,7 +95,8 @@ static GWION_IMPORT(int_unary) {
   GWI_BB(gwi_oper_end(gwi,  "~", int_cmp))
   GWI_BB(gwi_oper_ini(gwi, NULL, "int", NULL))
   GWI_BB(gwi_oper_add(gwi,  opck_int_range))
-  GWI_BB(gwi_oper_end(gwi,  "@range", IntRange))
+  GWI_BB(gwi_oper_emi(gwi,  opem_int_range))
+  GWI_BB(gwi_oper_end(gwi,  "@range", NULL))
   GWI_BB(gwi_oper_ini(gwi, "int", NULL, "int"))
   CHECK_OP("++", post, post_inc)
   GWI_BB(gwi_oper_add(gwi, opck_post))