]> Nishi Git Mirror - gwion.git/commitdiff
:art: Move ->variadic from Func to Emit
authorfennecdjay <astor.jeremie@wanadoo.fr>
Sat, 11 May 2019 20:22:43 +0000 (22:22 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Sat, 11 May 2019 20:22:43 +0000 (22:22 +0200)
include/emit.h
include/func.h
src/emit/emit.c
src/emit/emitter.c

index 4f9b5ad3f9e6fd6273264e203de55e6227541715..ddbf81e0cbf54d4a154b0f90c4c6c62e9d44d647 100644 (file)
@@ -20,6 +20,7 @@ struct Emitter_ {
   Code*  code;
   struct Gwion_ *gwion;
   struct Vector_  stack;
+  struct Vector_  variadic;
   char *escape;
   m_bool memoize;
 };
index 31096f797132a001c66ffd312bda610554f83596..17df20353cbdcb104d004c3fd4a40c82b78e654d 100644 (file)
@@ -6,7 +6,6 @@ struct Func_ {
   struct VM_Code_* code;
   Value value_ref;
   Func next;
-  struct Instr_* variadic;
   size_t vt_index;
   HAS_OBJ
   ae_flag flag;
index 4a9b536d2c84c687108a05eb830b22808f053454..e915e548298656c20687fdd2557b5c970bc98532 100644 (file)
@@ -1529,17 +1529,22 @@ ANN static m_bool emit_VecMember(const Emitter emit, const Exp_Dot* member) {
 }
 
 ANN static m_bool emit_vararg_start(const Emitter emit, const m_uint offset) {
-  emit->env->func->variadic = emit_add_instr(emit, VarargTop);
-  emit->env->func->variadic->m_val = offset;
-  emit->env->func->variadic->m_val2 = emit_code_size(emit);
+  const Instr instr = emit_add_instr(emit, VarargTop);
+  instr->m_val = offset;
+  instr->m_val2 = emit_code_size(emit);
+  vector_set(&emit->variadic, vector_size(&emit->variadic) -1, (vtype)instr);
   return GW_OK;
 }
+ANN static inline Instr get_variadic(const Emitter emit) {
+  return (Instr)vector_back(&emit->variadic);
+}
 
 ANN static void emit_vararg_end(const Emitter emit, const m_uint offset) {
-  const Instr instr = emit_add_instr(emit, VarargEnd);
+  const Instr instr = emit_add_instr(emit, VarargEnd), 
+    variadic = get_variadic(emit);
   instr->m_val = offset;
-  instr->m_val2 = emit->env->func->variadic->m_val2;
-  emit->env->func->variadic->m_val2 = emit_code_size(emit);
+  instr->m_val2 = variadic->m_val2;
+  variadic->m_val2 = emit_code_size(emit);
   SET_FLAG(emit->env->func, empty);// mark vararg func as complete
 }
 
@@ -1552,13 +1557,13 @@ ANN static m_bool emit_vararg(const Emitter emit, const Exp_Dot* member) {
     l = l->next;
   }
   if(!strcmp(str, "start")) {
-    if(emit->env->func->variadic)
+    if(get_variadic(emit))
       ERR_B(exp_self(member)->pos, "vararg.start already used. this is an error")
     emit_vararg_start(emit, offset);
     return GW_OK;
   }
   if(!strcmp(str, "end")) {
-    if(!emit->env->func->variadic)
+    if(!get_variadic(emit))
       ERR_B(exp_self(member)->pos, "vararg.start not used before vararg.end. this is an error")
     emit_vararg_end(emit, offset);
     return GW_OK;
@@ -1703,13 +1708,15 @@ ANN static m_bool emit_func_def(const Emitter emit, const Func_Def func_def) {
     stack_alloc_this(emit);
   emit_push_scope(emit);
   emit->env->func = func;
+  vector_add(&emit->variadic, 0);
   CHECK_BB(emit_func_def_body(emit, func_def))
   if(GET_FLAG(func_def, variadic)) {
-    if(!emit->env->func->variadic)
+    if(!get_variadic(emit))
       ERR_B(func_def->pos, "invalid variadic use")
     if(!GET_FLAG(func, empty))
       ERR_B(func_def->pos, "invalid variadic use")
   }
+  vector_pop(&emit->variadic);
   emit_func_def_return(emit);
   emit_func_def_code(emit, func);
   emit->env->func = former;
index fe3ae21c2232eb0c79f7c705348e5e4ae2a0b063..dda013c1f9fd8408c1d521fff0a6f18ea1224b49 100644 (file)
 ANEW Emitter new_emitter(void) {
   Emitter emit = (Emitter)xcalloc(1, sizeof(struct Emitter_));
   vector_init(&emit->stack);
+  vector_init(&emit->variadic);
   emit->escape = escape_table();
   return emit;
 }
 
 ANN void free_emitter(Emitter a) {
   vector_release(&a->stack);
+  vector_release(&a->variadic);
   xfree(a->escape);
   xfree(a);
 }