]> Nishi Git Mirror - gwion.git/commitdiff
:art: Fix gc detection and introduce NoOp
authorfennecdjay <astor.jeremie@wanadoo.fr>
Tue, 24 Sep 2019 12:49:49 +0000 (14:49 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Tue, 24 Sep 2019 12:49:49 +0000 (14:49 +0200)
include/instr.h
src/emit/emit.c
src/vm/vm_code.c

index 9a545cbe797851197496548ad4f1551f58990386..6ad3d4ed1f76eb385305c3dd8f069fbe2b617df1 100644 (file)
@@ -58,6 +58,7 @@ INSTR(PopArrayClass);
 
 INSTR(DotTmpl);
 INSTR(GTmpl);
+#define NoOp (f_instr)256
 
 struct dottmpl_ {
   size_t len;
index e305a59a68f3ddd7daa381857d4859e15ca7db1f..42deaa1d767d20824b006b9ee189e4e51347d360 100644 (file)
@@ -1014,12 +1014,13 @@ static inline void stack_alloc_this(const Emitter emit) {
 static m_bool scoped_stmt(const Emitter emit, const Stmt stmt, const m_bool pop) {
   ++emit->env->scope->depth;
   emit_push_scope(emit);
-  const m_bool pure = !vector_back(&emit->info->pure);
-  if(!pure)
-    emit_add_instr(emit, GcIni);
+  const Instr gc = emit_add_instr(emit, NoOp);
   CHECK_BB(emit_stmt(emit, stmt, pop))
-  if(!pure)
+  const m_bool pure = !vector_back(&emit->info->pure);
+  if(!pure) {
+    gc->opcode = eGcIni;
     emit_add_instr(emit, GcEnd);
+  }
   emit_pop_scope(emit);
   --emit->env->scope->depth;
   return GW_OK;
index bcb1e2bc7bb589d301bdb79e886c49bb77df0ba8..3335c0e6d6a77f9c8327c41e2c60725a252e0506 100644 (file)
@@ -15,7 +15,7 @@
 #include "operator.h"
 #include "import.h"
 
-ANN /*static*/ void free_code_instr(const Vector v, const Gwion gwion) {
+ANN void free_code_instr(const Vector v, const Gwion gwion) {
   for(m_uint i = vector_size(v) + 1; --i;) {
     const Instr instr = (Instr)vector_at(v, i - 1);
     const f_freearg f = (f_freearg)(map_get(&gwion->data->freearg, instr->opcode) ?:
@@ -30,6 +30,7 @@ ANN static void _free_code_instr(const Vector v, const Gwion gwion) {
   free_code_instr(v, gwion);
   free_vector(gwion->mp, v);
 }
+
 ANN static void free_vm_code(VM_Code a, Gwion gwion) {
   if(a->memoize)
     memoize_end(gwion->mp, a->memoize);
@@ -63,6 +64,8 @@ ANN static m_bit* tobytecode(MemPool p, const VM_Code code) {
     if(instr->opcode < eGack)
       memcpy(ptr + i*BYTECODE_SZ, instr, BYTECODE_SZ);
     else {
+      if(instr->execute == NoOp)
+        continue;
       *(m_bit*)(ptr + (i*BYTECODE_SZ)) = instr->opcode;
       *(Instr*)(ptr + (i*BYTECODE_SZ) + SZ_INT) = instr;
       *(f_instr*)(ptr + (i*BYTECODE_SZ) + SZ_INT*2) = instr->execute;