]> Nishi Git Mirror - gwion.git/commitdiff
:art: fast_except improvs
authorJérémie Astor <fennecdjay@gmail.com>
Thu, 16 Sep 2021 18:42:33 +0000 (20:42 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Thu, 16 Sep 2021 18:42:33 +0000 (20:42 +0200)
include/instr.h
src/emit/emit.c
src/lib/instr.c
src/lib/object_op.c

index 6f268351f2690fada6c222399efeb9797b579451..141e1e574f55b15062152da5832e43aa999a5689 100644 (file)
@@ -44,6 +44,8 @@ INSTR(DtorReturn);
 INSTR(ComplexReal);
 INSTR(ComplexImag);
 
+
+INSTR(fast_except);
 /* function */
 INSTR(DtorReturn);
 
index 3bd0680535ec9194cf58241ab8257400ad2b6bfe..79f48b2a4647374f559e0cd7d45127656b1e0d8e 100644 (file)
@@ -461,7 +461,8 @@ ANN static m_bool emit_symbol_builtin(const Emitter emit, const Symbol *data) {
     // prevent invalid access to global variables
     if(!exp_getvar(exp_self(prim_self(data))) &&
        isa(v->type, emit->gwion->type[et_object]) > 0) {
-      const Instr instr = emit_add_instr(emit, GWOP_EXCEPT);
+//      const Instr instr = emit_add_instr(emit, GWOP_EXCEPT);
+      const Instr instr = emit_add_instr(emit, fast_except);
       instr->m_val      = -SZ_INT;
       // use m_val2 to set some info?
     }
@@ -516,7 +517,8 @@ ANN static m_bool _emit_symbol(const Emitter emit, const Symbol *data) {
   if (GET_FLAG(v, late) && !exp_getvar(prim_exp(data)) &&
       (isa(v->type, emit->gwion->type[et_object]) > 0 ||
        is_fptr(emit->gwion, v->type))) {
-    const Instr instr = emit_add_instr(emit, GWOP_EXCEPT);
+//    const Instr instr = emit_add_instr(emit, GWOP_EXCEPT);
+    const Instr instr = emit_add_instr(emit, fast_except);
     instr->m_val      = -SZ_INT;
   }
   return GW_OK;
@@ -643,7 +645,8 @@ ANN m_bool emit_array_access(const Emitter                 emit,
                           .data = (uintptr_t)info};
   if (!info->is_var &&
       (GET_FLAG(info->array.type, abstract) || type_ref(info->array.type))) {
-    const Instr instr = emit_add_instr(emit, GWOP_EXCEPT);
+//    const Instr instr = emit_add_instr(emit, GWOP_EXCEPT);
+    const Instr instr = emit_add_instr(emit, fast_except);
     instr->m_val      = -SZ_INT;
   }
   return op_emit(emit, &opi);
@@ -1528,7 +1531,7 @@ ANN m_bool emit_exp_call1(const Emitter emit, const Func f,
   if (vector_size(&emit->code->instr) && vflag(f->value_ref, vflag_member) &&
       is_fptr(emit->gwion, f->value_ref->type)) {
     const Instr back      = (Instr)vector_back(&emit->code->instr);
-    const bool  is_except = back->opcode == eGWOP_EXCEPT;
+    const bool  is_except = back->opcode == eGWOP_EXCEPT || (back->opcode == eOP_MAX && back->execute == fast_except);
     const Instr base =
         !is_except ? back
                    : (Instr)vector_at(&emit->code->instr,
@@ -1873,7 +1876,8 @@ ANN2(1) /*static */ m_bool emit_exp(const Emitter emit, /* const */ Exp e) {
         exp_getuse(e) && !exp_getvar(e) &&
         GET_FLAG(e->d.exp_decl.list->self->value, late)) {
       //         e->exp_type == ae_exp_decl && !exp_getvar(e)) {
-      const Instr instr = emit_add_instr(emit, GWOP_EXCEPT);
+//      const Instr instr = emit_add_instr(emit, GWOP_EXCEPT);
+      const Instr instr = emit_add_instr(emit, fast_except);
       instr->m_val      = -SZ_INT;
     }
   } while ((exp = exp->next));
index f843970fd863d6a3c801ec1557a1e2acc09f714b..a6697344598ab35f38355c61e2b869570bcb0cd0 100644 (file)
@@ -144,3 +144,10 @@ INSTR(SetCtor) {
   VAL = *(m_uint *)(shred->reg + SZ_INT) = (m_uint)t->nspc->pre_ctor;
   VAL2                                   = SZ_INT;
 }
+
+INSTR(fast_except) {
+  if(*(m_uint*)REG((m_int)instr->m_val)) {
+    BYTE(eNoOp)
+  } else
+    handle(shred, "NullPtrException");
+}
index f0d3937025b6afe85141d806106161c75a30a450..0850151eeb7dfcb59f493603bb33d83d030b151e 100644 (file)
@@ -261,7 +261,8 @@ OP_EMIT(opem_object_dot) {
   if((isa(value->type, emit->gwion->type[et_object]) > 0 || is_fptr(emit->gwion, value->type)) &&
      !exp_getvar(exp_self(member)) &&
     (GET_FLAG(value, static) || GET_FLAG(value, late))) {
-    const Instr instr = emit_add_instr(emit, GWOP_EXCEPT);
+//    const Instr instr = emit_add_instr(emit, GWOP_EXCEPT);
+    const Instr instr = emit_add_instr(emit, fast_except);
     instr->m_val      = -SZ_INT;
   }
   return GW_OK;
@@ -349,6 +350,9 @@ static OP_EMIT(opem_not_object) {
   if (back->opcode == eGWOP_EXCEPT) {
     back->opcode = eIntNot;
     return GW_OK;
+  } else if (back->opcode == eOP_MAX && back->execute == fast_except) {
+    back->opcode = eIntNot;
+    return GW_OK;
   }
   const Instr instr = emit_add_instr(emit, RegSetImm);
   instr->m_val2     = -SZ_INT;
@@ -358,7 +362,7 @@ static OP_EMIT(opem_not_object) {
 static OP_EMIT(opem_uncond_object) {
   const Vector v    = &emit->code->instr;
   const Instr  back = (Instr)vector_at(v, vector_size(v) -2);
-  if (back->opcode == eGWOP_EXCEPT) {
+  if (back->opcode == eGWOP_EXCEPT || (back->opcode == eOP_MAX && back->execute == fast_except)) {
     free_instr(emit->gwion, back);
     vector_rem(v, vector_size(v) - 2);
   }
@@ -369,7 +373,7 @@ static OP_EMIT(opem_uncond_object) {
 static OP_EMIT(opem_cond_object) {
   const Vector v    = &emit->code->instr;
   const Instr  back = (Instr)vector_at(v, vector_size(v) -2);
-  if (back->opcode == eGWOP_EXCEPT) {
+  if (back->opcode == eGWOP_EXCEPT || (back->opcode == eOP_MAX && back->execute == fast_except)) {
     free_instr(emit->gwion, back);
     vector_rem(v, vector_size(v) - 2);
   }