]> Nishi Git Mirror - gwion.git/commitdiff
:art: Remove addref for ops
authorJérémie Astor <fennecdjay@gmail.com>
Wed, 30 Dec 2020 22:22:14 +0000 (23:22 +0100)
committerJérémie Astor <fennecdjay@gmail.com>
Wed, 30 Dec 2020 22:22:14 +0000 (23:22 +0100)
src/emit/emit.c
src/lib/array.c
src/lib/event.c
src/lib/modules.c
src/lib/object_op.c
src/lib/ptr.c
src/lib/string.c
src/lib/ugen.c
src/vm/vm.c

index ec0d441c467bd3b5c60712285d923b2b2c91d695..39a9c8beac1f3f60f8d0b1b422e5487789f8296a 100644 (file)
@@ -987,9 +987,9 @@ ANN static m_bool emit_exp_binary(const Emitter emit, const Exp_Binary* bin) {
   const Exp rhs = bin->rhs;
   CHECK_BB(emit_exp_pop_next(emit, lhs))
   CHECK_BB(emit_exp_pop_next(emit, rhs))
-  const m_int size = exp_size(rhs);
-  emit_exp_addref1(emit, lhs, -exp_size(lhs) - size);
-  emit_exp_addref1(emit, rhs, -size);
+//  const m_int size = exp_size(rhs);
+//  emit_exp_addref1(emit, lhs, -exp_size(lhs) - size);
+//  emit_exp_addref1(emit, rhs, -size);
   struct Op_Import opi = { .op=bin->op, .lhs=lhs->type, .rhs=rhs->type,
     .pos=exp_self(bin)->pos, .data=(uintptr_t)bin, .op_type=op_binary };
   return op_emit(emit, &opi);
@@ -1009,7 +1009,6 @@ ANN static m_bool emit_exp_post(const Emitter emit, const Exp_Postfix* post) {
   struct Op_Import opi = { .op=post->op, .lhs=post->exp->type,
     .data=(uintptr_t)post, .op_type=op_postfix };
   CHECK_BB(emit_exp(emit, post->exp))
-  emit_exp_addref(emit, post->exp, -exp_totalsize(post->exp));
   return op_emit(emit, &opi);
 }
 
@@ -1372,7 +1371,6 @@ ANN static m_bool emit_exp_unary(const Emitter emit, const Exp_Unary* unary) {
   struct Op_Import opi = { .op=unary->op, .data=(uintptr_t)unary, .op_type=op_unary };
   if(unary->unary_type == unary_exp && unary->op != insert_symbol("spork") && unary->op != insert_symbol("fork")) {
     CHECK_BB(emit_exp_pop_next(emit, unary->exp))
-    emit_exp_addref1(emit, unary->exp, -exp_size(unary->exp));
     opi.rhs = unary->exp->type;
   }
   return op_emit(emit, &opi);
@@ -1483,6 +1481,13 @@ ANN2(1) /*static */m_bool emit_exp(const Emitter emit, /* const */Exp e) {
     CHECK_BB(emit_exp_func[exp->exp_type](emit, &exp->d))
     if(exp->cast_to)
       CHECK_BB(emit_implicit_cast(emit, exp, exp->cast_to))
+    if(isa(e->type, emit->gwion->type[et_object]) > 0 &&
+        (e->cast_to ? isa(e->cast_to, emit->gwion->type[et_object]) > 0 : 1) &&
+         e->exp_type == ae_exp_decl && GET_FLAG(e->d.exp_decl.td, late) && !exp_getvar(e)) {
+      const Instr instr = emit_add_instr(emit, GWOP_EXCEPT);
+      instr->m_val = -SZ_INT;
+    }
+
   } while((exp = exp->next));
   return GW_OK;
 }
index e356907f06daf1a9d9512ea7096b72f84ad2411c..d3b62012ee80f19ff919dfbe52fa2d3ce8ff1a30 100644 (file)
@@ -217,8 +217,6 @@ static INSTR(ArrayConcatLeft) {
   }
   m_bit *data = more->ptr + ARRAY_OFFSET;
   memmove(ARRAY_PTR(base) + (len - 1) * sz, data, sz);
-  release(obase, shred);
-  release(omore, shred);
 }
 
 static INSTR(ArrayConcatRight) {
@@ -235,8 +233,6 @@ static INSTR(ArrayConcatRight) {
   }
   memmove(ARRAY_PTR(base) + (ARRAY_LEN(more) + len - 1) * sz, ARRAY_PTR(base), len * sz);
   memmove(ARRAY_PTR(base), ARRAY_PTR(more), ARRAY_LEN(more) * sz);
-  release(obase, shred);
-  release(omore, shred);
 }
 
 static OP_EMIT(opem_array_sr) {
@@ -245,7 +241,8 @@ static OP_EMIT(opem_array_sr) {
     return emit_array_shift(emit, ArrayConcatRight);
   const Instr pop = emit_add_instr(emit, RegMove);
   pop->m_val = -SZ_INT;
-  emit_gc(emit, 0);
+  if(isa(bin->rhs->type, emit->gwion->type[et_object]) > 0)
+    emit_add_instr(emit, RegAddRef);
   (void)emit_add_instr(emit, ArrayAppendFront);
   return GW_OK;
 }
@@ -256,7 +253,10 @@ static OP_EMIT(opem_array_sl) {
     return emit_array_shift(emit, ArrayConcatLeft);
   const Instr pop = emit_add_instr(emit, RegMove);
   pop->m_val = -bin->rhs->type->size;
-  emit_gc(emit, -SZ_INT);
+  if(isa(bin->rhs->type, emit->gwion->type[et_object]) > 0){
+    const Instr ref = emit_add_instr(emit, RegAddRef);
+    ref->m_val = -SZ_INT;
+  }
   emit_add_instr(emit, ArrayAppend);
   return GW_OK;
 }
index 0d7c09d4dae91f5b5224c40fea5e21eb52c33c7e..04ae61f71fe0fcec63b32137d855a4b0e42c1f97 100644 (file)
@@ -24,7 +24,6 @@ static INSTR(EventWait) {
   const Vector v = EV_SHREDS(event);
   vector_add(v, (vtype)shred);
   *(m_int*)REG(-SZ_INT) = 1;
-  _release(event, shred);
 }
 
 static MFUN(event_signal) {
index 4120a76067dba891483d7c7fc7042f0ccb253af4..ba336327d927d649180176842076159dc096fddf 100644 (file)
@@ -255,7 +255,6 @@ static INSTR(UsrUGenTick) {
     free_vm_shred(uu->shred);
   UGEN(o)->module.gen.tick = usrugen_tick;
   const VM_Code code = *(VM_Code*)(shred->reg-offset);
-  release(o, shred);
   if(!code)
     Except(shred, "[NullTickException]");
   uu->shred = new_vm_shred(shred->info->vm->gwion->mp, *(VM_Code*)(shred->reg-offset));
index 3ad5a6b7d646f995219f70fd146d5f5acfa5514b..f851ae6905f7d9c07bed7966d7384ab7e950b751 100644 (file)
@@ -22,8 +22,6 @@ static INSTR(name##Object) {                     \
   const M_Object lhs = *(M_Object*)REG(-SZ_INT); \
   const M_Object rhs = *(M_Object*)REG(0);       \
   *(m_uint*)REG(-SZ_INT) = (lhs op rhs);         \
-  release(lhs, shred);                           \
-  release(rhs, shred);                           \
 }
 
 describe_logical(Eq,  ==)
@@ -295,8 +293,6 @@ ANN void struct_release(const VM_Shred shred, const Type base, const m_bit *ptr)
 
 static OP_EMIT(opem_not_object) {
   const Vector v = &emit->code->instr;
-  const Instr last = (Instr)vector_pop(v);
-  mp_free(emit->gwion->mp, Instr, last);
   const Instr back = (Instr)vector_back(v);
   if(back->opcode == eGWOP_EXCEPT) {
     vector_pop(v);
index cbb1793e1a33a177ae131a6ece88bcff60960929..069662bc213b3e6aa8187b91bd856be4abcf8090 100644 (file)
@@ -51,7 +51,8 @@ static INSTR(instr_ptr_assign) {
 
 static INSTR(instr_ptr_assign_obj) {
   m_bit **o = *(m_bit***)REG(0);
-  release(*(M_Object*)o, shred);
+  //release(*(M_Object*)o, shred);
+  // addref to object?
   *o = *(m_bit**)REG(-SZ_INT);
 }
 
index 56cc864da2fc30b14e2923b1f11322d23be231bf..fce5cff9f0af4552b2411e3c2018a5d2cffa7212 100644 (file)
@@ -21,8 +21,6 @@ static INSTR(String_##name) {                    \
   const M_Object lhs = *(M_Object*)REG(-SZ_INT); \
   const M_Object rhs = *(M_Object*)REG(0);       \
   *(m_int*)REG(-SZ_INT) = action;                \
-  release(lhs, shred);                           \
-  release(rhs, shred);                           \
 }
 describe_string_logical(eq, (lhs && rhs && STRING(lhs) == STRING(rhs)) || (!lhs && !rhs))
 describe_string_logical(neq, !(lhs && rhs && STRING(lhs) == STRING(rhs)) || (!lhs && !rhs))
index a7ad949ab3e45d1c18b0733b8e705e2183a66329..0cdfc8c1f9fe012b21ed375fd575248b8b575a02 100644 (file)
@@ -154,8 +154,6 @@ describe_connect(C,vector_add)
 describe_connect(Disc,vector_rem2)
 
 ANN static void release_connect(const VM_Shred shred) {
-  _release(*(M_Object*)REG(0), shred);
-  _release(*(M_Object*)REG(SZ_INT), shred);
   *(M_Object*)REG(0) = *(M_Object*)REG(SZ_INT);
   PUSH_REG(shred, SZ_INT);
 }
index c84c024f87fe7d6d6de7a885fadbcc509bd1ee07..fe7bc61bc1989804a46248cba9ee5fd7227061c2 100644 (file)
@@ -776,9 +776,9 @@ objassign:
 {
   const M_Object o = **(M_Object**)(reg -SZ_INT);
   if(o) {
-    --o->ref;
     _release(o, shred);
   }
+  ++(*(M_Object*)(reg -SZ_INT*2))->ref;
 }
 assign:
   reg -= SZ_INT;