]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve late checking
authorJérémie Astor <fennecdjay@gmail.com>
Wed, 16 Dec 2020 16:28:31 +0000 (17:28 +0100)
committerJérémie Astor <fennecdjay@gmail.com>
Wed, 16 Dec 2020 16:28:31 +0000 (17:28 +0100)
src/emit/emit.c
src/lib/array.c
src/lib/object_op.c
src/parse/check.c
src/parse/scan1.c
src/vm/vm.c
tests/error/array_excess.gw [deleted file]

index 577fef5921dca73b0ed410f6df8bd3fc327b2602..9d584aa3f99da0f0a148f6da021aaa81b9aaddb6 100644 (file)
@@ -541,6 +541,10 @@ ANN m_bool emit_array_access(const Emitter emit, struct ArrayAccessInfo *const i
   // look mum no pos
   struct Op_Import opi = { .op=insert_symbol("@array"), .lhs=info->array.exp->info->type, .rhs=info->array.type,
     .data=(uintptr_t)info, .op_type=op_array };
+  if(type_ref(info->array.type)) {
+    const Instr instr = emit_add_instr(emit, GWOP_EXCEPT);
+    instr->m_val = -SZ_INT;
+  }
   return op_emit(emit, &opi);
 }
 
index af6d4301987c69329b1a428650a510c00070bedb..d9b1e205abe24a249c3fffb8bda5155df24555ed 100644 (file)
@@ -332,15 +332,7 @@ static OP_CHECK(opck_array) {
     return array_type(env, array_base(t), t->array_depth - array->depth);
   const Exp curr = take_exp(array->exp, t->array_depth);
   struct Array_Sub_ next = { curr->next, array_base(t), array->depth - t->array_depth };
-  return check_array_access(env, &next);
-}
-
-static OP_CHECK(opck_not_array) {
-  const Array_Sub array = (Array_Sub)data;
-  if(array->depth <= get_depth(array->type))
-    return array->type;
-  ERR_N(array->exp->pos, _("array subscripts (%"UINT_F") exceeds defined dimension (%"UINT_F")"),
-         array->depth, get_depth(array->type))
+  return check_array_access(env, &next) ?: env->gwion->type[et_error];
 }
 
 ANN static void array_loop(const Emitter emit, const m_uint depth) {
@@ -440,9 +432,6 @@ GWION_IMPORT(array) {
   GWI_BB(gwi_oper_add(gwi, opck_array_slice))
   GWI_BB(gwi_oper_emi(gwi, opem_array_slice))
   GWI_BB(gwi_oper_end(gwi, "@slice", NULL))
-  GWI_BB(gwi_oper_ini(gwi, (m_str)OP_ANY_TYPE, (m_str)OP_ANY_TYPE, NULL))
-  GWI_BB(gwi_oper_add(gwi, opck_not_array))
-  GWI_BB(gwi_oper_end(gwi, "@array", NULL))
   GWI_BB(gwi_oper_ini(gwi, "int", "@Array", NULL))
   GWI_BB(gwi_oper_add(gwi, opck_array))
   GWI_BB(gwi_oper_emi(gwi, opem_array_access))
index 48bcea5519299514e82431d159c98d9ca5ee27a1..7d2a0a35b57c6ebaeb34e2d028334737df52560d 100644 (file)
@@ -206,8 +206,7 @@ OP_EMIT(opem_object_dot) {
   }
   if(GET_FLAG(value, late) && !exp_getvar(exp_self(member))) {
     const Instr instr = emit_add_instr(emit, GWOP_EXCEPT);
-    if(!is_fptr(emit->gwion, value->type))
-      instr->m_val = -SZ_INT;
+    instr->m_val = -SZ_INT;
   }
   return GW_OK;
 }
index 27aa12546489a552b52e4e2209bdc440ec6f42c2..5f0ad35fec586e98b2b13ad9abaa4e2eab6847b1 100644 (file)
@@ -393,9 +393,6 @@ ANN static Type check_prim(const Env env, Exp_Primary *prim) {
 }
 
 ANN Type check_array_access(const Env env, const Array_Sub array) {
-//  if(!get_depth(array->type))
-//    ERR_O(array->exp->pos, _("array subscripts (%"UINT_F") exceeds defined dimension (%"UINT_F")"),
-//        array->depth, get_depth(array->type))
   const Symbol sym = insert_symbol("@array");
   struct Op_Import opi = { .op=sym, .lhs=array->exp->info->type, .rhs=array->type,
     .pos=array->exp->pos, .data=(uintptr_t)array, .op_type=op_array };
index d00d7064f28e408751286b3dc09e55760db4c5af..44699f982ffbed4ea06e39aba24fdacaed2502c9 100644 (file)
@@ -85,14 +85,8 @@ ANN static m_bool scan1_decl(const Env env, const Exp_Decl* decl) {
       if(var->array->exp)
         CHECK_BB(scan1_exp(env, var->array->exp))
       t = array_type(env, decl->type, var->array->depth);
-    } else if(GET_FLAG(t, abstract) && !GET_FLAG(decl->td, late)) {
-      if(!(t == env->class_def && env->scope->depth)) {
-//        if(decl->td->xid == insert_symbol("auto"))
-          SET_FLAG(decl->td, late);
-//        else
-//          ERR_B(exp_self(decl)->pos, _("Type '%s' is abstract, declare as ref. (use @)"), t->name)
-      }
-    }
+    } else if(GET_FLAG(t, abstract) && !GET_FLAG(decl->td, late))
+      SET_FLAG(decl->td, late);
     const Value v = var->value = var->value ?: new_value(env->gwion->mp, t, s_name(var->xid));
 // rewrite logic
     if(!env->scope->depth && env->class_def && !GET_FLAG(decl->td, static))
index f938223a15a0ca161e8c3db48c7fb5b078c27f93..45dc6e371bf776befbb8876cabdc2254247c9843 100644 (file)
@@ -797,7 +797,7 @@ except:
  *  VAL = offset (no default SZ_INT)             *
  *  VAL2 = error message                         *
  * grep for GWOP_EXCEPT and Except, exception... */
-  if(!*(void**)(reg-(m_int)VAL)) {
+  if(!*(m_bit**)(reg+(m_int)(VAL))) {
     shred->pc = PC;
     exception(shred, "NullPtrException");
     continue;
diff --git a/tests/error/array_excess.gw b/tests/error/array_excess.gw
deleted file mode 100644 (file)
index 2c0a00f..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#! [contains] exceeds defined dimension
-var int i[2];
-i[0][0];