]> Nishi Git Mirror - gwion.git/commitdiff
:art: use functions for ext_ctor
authorfennecdjay <fennecdjay@gmail.com>
Wed, 11 Jan 2023 18:54:21 +0000 (19:54 +0100)
committerfennecdjay <fennecdjay@gmail.com>
Wed, 11 Jan 2023 18:54:21 +0000 (19:54 +0100)
include/instr.h
src/emit/emit.c
src/lib/instr.c
src/parse/check.c
src/vm/vm.c

index 72e733b5251431ede00d298506c86104a3bc9024..25724cf7ba938d5256c5e5b6929459b389b4304b 100644 (file)
@@ -68,7 +68,6 @@ struct dottmpl_ {
 ANN m_bool traverse_dot_tmpl(const Emitter emit, const Func_Def fdef, const Value v);
 
 INSTR(SetFunc);
-INSTR(SetCtor);
 INSTR(FuncWait);
 #include "opcode.h"
 
index 1b437e922b5c5fa3685f7ea1d79d4b7c03aa3335..01f1dbab95045e03c56121ce6a760102f4f08e4e 100644 (file)
@@ -406,24 +406,14 @@ static ArrayInfo *emit_array_extend_inner(const Emitter emit, const Type t,
   return info;
 }
 
+ANN static void call_finish(const Emitter emit, const Func f,const bool);
 ANN void emit_ext_ctor(const Emitter emit, const Type t) {
   const Instr cpy = emit_add_instr(emit, Reg2Reg);
   cpy->m_val2     = -SZ_INT;
-  if (t->nspc->pre_ctor)
-    emit_setimm(emit, (m_uint)t->nspc->pre_ctor, SZ_INT);
-  else {
-    const Instr instr = emit_add_instr(emit, SetCtor);
-    instr->m_val      = (m_uint)t;
-  }
-  const m_uint offset = emit_code_offset(emit);
-  emit_setimm(emit, offset, SZ_INT*2);
-  emit_regmove(emit, SZ_INT*2);
-  const Instr prelude = emit_add_instr(emit, SetCode);
-  prelude->m_val      = -SZ_INT * 2;
-  prelude->udata.one  = 2;
-  (void)emit_regtomem(emit, 0, 0);
-  const Instr next = emit_add_instr(emit, Overflow);
-  next->m_val2     = offset;
+  const Func f = (Func)vector_front(&t->nspc->vtable);
+  emit_regmove(emit, SZ_INT);
+  emit_pushfunc(emit, f);
+  call_finish(emit, f, false);
 }
 
 ANN static inline void emit_notpure(const Emitter emit) {
index 97162dd95a7283be8699cbfebce5a758be3406e0..2b9e40096064513c92fcb616544670e0a8adb7a4 100644 (file)
@@ -134,13 +134,6 @@ INSTR(SetFunc) {
   shred->reg += SZ_INT;
 }
 
-INSTR(SetCtor) {
-  BYTE(eRegSetImm)
-  const Type t = (Type)instr->m_val;
-  VAL = *(m_uint *)(shred->reg + SZ_INT) = (m_uint)t->nspc->pre_ctor;
-  VAL2 = SZ_INT;
-}
-
 INSTR(FuncWait) {
   const Func f = (Func)instr->m_val;
   if(f->_wait->len - instr->m_val2) {
index 60ba8e9b69161d67377f2af3c072acc7a82ed0fe..ce9ee9ead69024a7578a83216b77f6b68d965f14 100644 (file)
@@ -19,7 +19,7 @@
 #include "array.h"
 
 ANN m_bool check_stmt_list(const Env env, Stmt_List list);
-ANN m_bool        check_class_def(const Env env, const Class_Def class_def);
+ANN m_bool check_class_def(const Env env, const Class_Def class_def);
 
 ANN static Type check_internal(const Env env, const Symbol sym, const Exp e,
                                const Type t) {
index df8c917a2ee6e689dba57114dbc47df7c1340768..4cc46bcaefb0469b4413f99feb34071c43baf43c 100644 (file)
@@ -1574,8 +1574,6 @@ _other:
     instr->opcode = (m_uint)&&noop;
   else if(exec == SetFunc)
     instr->opcode = (m_uint)&&regpushimm;
-  else if(exec == SetCtor)
-    instr->opcode = (m_uint)&&regsetimm;
   prepare_code += BYTECODE_SZ;
   goto *_dispatch[*(m_bit*)prepare_code];
 }