]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve vm.
authorfennecdjay <astor.jeremie@wanadoo.fr>
Fri, 7 Jun 2019 21:31:34 +0000 (23:31 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Fri, 7 Jun 2019 21:31:34 +0000 (23:31 +0200)
include/opcode.h
opcode.txt
src/emit/emit.c
src/vm/vm.c

index f1d678fc25161a493a156fa20e68f1b98b9c0616..7405cd8a73354474a617df58e03ad5046c6afa9f 100644 (file)
@@ -151,6 +151,7 @@ enum {
   eObjectInstantiate,
   eRegAddRef,
   eObjectAssign,
+  eAssign,
   eObjectRelease,
   eGWOP_EXCEPT,
   eAllocMember4,
@@ -324,6 +325,7 @@ enum {
 #define  ObjectInstantiate   (f_instr)eObjectInstantiate
 #define  RegAddRef           (f_instr)eRegAddRef
 #define  ObjectAssign        (f_instr)eObjectAssign
+#define  Assign              (f_instr)eAssign
 #define  ObjectRelease       (f_instr)eObjectRelease
 #define  GWOP_EXCEPT         (f_instr)eGWOP_EXCEPT
 #define  AllocMember4        (f_instr)eAllocMember4
index 88498ce7b2e9ea94e3e2a09deecc0ad93fce53b0..0318bd4bb9d5faa00943f80ee19edf71167efde7 100644 (file)
@@ -148,6 +148,7 @@ ArrayValid
 ObjectInstantiate
 RegAddRef
 ObjectAssign
+Assign
 ObjectRelease
 GWOP_EXCEPT
 AllocMember4
index ae120fac259d085190bb37e17dc2769f61f89920..a451542e766e5ba76de7d63cf5db2fc77a4681eb 100644 (file)
@@ -538,7 +538,7 @@ ANN static m_bool decl_static(const Emitter emit, const Var_Decl var_decl, const
   emit->code = (Code*)vector_back(&emit->stack);
   CHECK_BB(emit_instantiate_object(emit, v->type, var_decl->array, is_ref))
   CHECK_BB(emit_dot_static_data(emit, v, 1))
-  emit_add_instr(emit, ObjectAssign);
+  emit_add_instr(emit, Assign);
   emit->code = code;
   return GW_OK;
 }
@@ -570,7 +570,7 @@ ANN static m_bool emit_exp_decl_non_static(const Emitter emit, const Var_Decl va
   instr->m_val = v->offset;
   instr->m_val2 = v->type->size;
   if(is_obj && (is_array || !is_ref)) {
-    const Instr assign = emit_add_instr(emit, ObjectAssign);
+    const Instr assign = emit_add_instr(emit, Assign);
     assign->m_val = emit_var;
     const size_t missing_depth = type->array_depth - (array ? array->depth : 0);
     if((is_array || missing_depth) && !emit->env->scope->depth)
@@ -601,7 +601,7 @@ ANN static m_bool emit_exp_decl_global(const Emitter emit, const Var_Decl var_de
   instr->m_val = (m_uint)v->d.ptr;
   instr->m_val2 = v->type->size;
   if(is_obj && (is_array || !is_ref)) {
-    const Instr assign = emit_add_instr(emit, ObjectAssign);
+    const Instr assign = emit_add_instr(emit, Assign);
     assign->m_val = emit_var;
     if(is_array && !emit->env->scope->depth)
       ADD_REF(type)
index 876fcf09c0ec3e89678c70aa739a895f41fcd7ce..7a80118234ab8e2d3dbfd45a2e72fa746e8cef16 100644 (file)
@@ -276,7 +276,7 @@ ANN void vm_run(const VM* vm) { // lgtm [cpp/use-of-goto]
     &&sporkini, &&sporkini, &&sporkfunc, &&sporkexp, &&forkend, &&sporkend,
     &&brancheqint, &&branchneint, &&brancheqfloat, &&branchnefloat,
     &&arrayappend, &&autoloop, &&autoloopptr, &&autoloopcount, &&arraytop, &&arrayaccess, &&arrayget, &&arrayaddr, &&arrayvalid,
-    &&newobj, &&addref, &&assign, &&remref,
+    &&newobj, &&addref, &&objassign, &&assign, &&remref,
     &&except, &&allocmemberaddr, &&dotmember, &&dotfloat, &&dotother, &&dotaddr,
     &&staticint, &&staticfloat, &&staticother,
     &&dotfunc, &&dotstaticfunc, &&staticcode, &&pushstr,
@@ -402,7 +402,6 @@ allocother:
   reg += instr->m_val2;
   DISPATCH()
 allocaddr:
-  *(m_uint*)(mem+instr->m_val) = 0; // just set object to null in
   *(m_bit**)reg = mem + instr->m_val;
   reg += SZ_INT;
   DISPATCH()
@@ -696,16 +695,19 @@ addref:
     *(M_Object*)(reg-SZ_INT)))
     ++a.obj->ref;
   DISPATCH()
-assign:
-  reg -= SZ_INT;
-  a.obj = *(M_Object*)(reg-SZ_INT);
-  const M_Object tgt = **(M_Object**)reg;
+objassign:
+{
+  const M_Object tgt = **(M_Object**)(reg -SZ_INT);
   if(tgt) {
     --tgt->ref;
     _release(tgt, shred);
-  }
+}
+assign:
+  reg -= SZ_INT;
+  a.obj = *(M_Object*)(reg-SZ_INT);
   **(M_Object**)reg = a.obj;
   DISPATCH()
+}
 remref:
   release(*(M_Object*)(mem + instr->m_val), shred);
   DISPATCH()