]> Nishi Git Mirror - gwion.git/commitdiff
:fire: few fixes
authorfennecdjay <fennecdjay@gmail.com>
Wed, 31 Jan 2024 20:30:32 +0000 (21:30 +0100)
committerfennecdjay <fennecdjay@gmail.com>
Wed, 31 Jan 2024 20:30:32 +0000 (21:30 +0100)
const-generic.gw [deleted file]
include/opcode.h
opcode.txt
src/emit/emit.c
src/vm/vm.c

diff --git a/const-generic.gw b/const-generic.gw
deleted file mode 100644 (file)
index 451f7af..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#!enum Enum {
-#!  bar,
-#!  foo
-#!}
-#!class C:[const int N] {
-#!class C:[const Enum N] {
-#!  N :=> var auto n;
-#!  <<< "N:${N} n:${n}" >>>;
-#!}
-
-fun void foo:[T, const float N]() {
-#!   <<< __func__ >>>;
-   <<< N >>>;
-#!  <<< "heyo">>>;
-}
-#!const int i;
-#!new C:[Enum.foo];
-#!new C:[2];
-#!r
-#!foo:[int, Enum.foo]();
-foo:[int, .2]();
-#!foo:[int, 2]();
index d0704e44cb67400b46dc8a6979e5c23a8f6b22f6..537955ef09ae6527d9b9fbba4a9ac3bee1ed39f7 100644 (file)
@@ -150,6 +150,7 @@ enum {
   eReg2Mem,
   eReg2Mem4,
   e_staticmemcpy_,
+  e_staticmemset_,
   eOverflow,
   eFuncUsrEnd,
   eFuncUsrEnd2,
@@ -370,6 +371,7 @@ enum {
 #define  Reg2Mem               (f_instr)eReg2Mem
 #define  Reg2Mem4              (f_instr)eReg2Mem4
 #define  _staticmemcpy_        (f_instr)e_staticmemcpy_
+#define  _staticmemset_        (f_instr)e_staticmemset_
 #define  Overflow              (f_instr)eOverflow
 #define  FuncUsrEnd            (f_instr)eFuncUsrEnd
 #define  FuncUsrEnd2           (f_instr)eFuncUsrEnd2
@@ -1119,6 +1121,10 @@ ANN static inline void dump_opcodes(const VM_Code code) {
         gw_out("{Y}┃{0}{-}% 4lu{0}: _staticmemcpy_", j);
         gw_out("\n");
         break;
+      case e_staticmemset_:
+        gw_out("{Y}┃{0}{-}% 4lu{0}: _staticmemset_", j);
+        gw_out("\n");
+        break;
       case eOverflow:
         gw_out("{Y}┃{0}{-}% 4lu{0}: Overflow    ", j);
         gw_out("\n");
index 4bd9f83b77d00c46d4985f91de94052464c2d236..ba0271d803d84a7c048cc8d240d012d9e6a7b8b7 100644 (file)
@@ -147,6 +147,7 @@ RegMove~i
 Reg2Mem~u~i
 Reg2Mem4~u~u
 _staticmemcpy_
+_staticmemset_
 Overflow
 FuncUsrEnd
 FuncUsrEnd2
index 49986981c3e67718ff86384286d0ccc9372c3991..296df6bb1b69f322d3675510389295fda2940f3a 100644 (file)
@@ -111,9 +111,9 @@ ANN static inline void frame_push(Frame *frame) {
   vector_add(&frame->defer, (vtype)NULL);
 }
 
-static const f_instr allocmember[] = {RegPushImm, RegPushImm2, RegPushImm3,
+static const f_instr allocmember[4] = {RegPushImm, RegPushImm2, _staticmemset_,
                                       DotMemberMem4};
-static const f_instr allocword[]   = {AllocWord, AllocWord2, AllocWord3,
+static const f_instr allocword[4]   = {AllocWord, AllocWord2, AllocWord3,
                                     RegPushMem4};
 
 ANN static m_bool      emit_class_def(const Emitter, const Class_Def);
@@ -1023,9 +1023,13 @@ ANN static m_bool emit_exp_decl_non_static(const Emitter   emit,
     if (GET_FLAG(v, late)) // ref or emit_var ?
       emit_memsetimm(emit, v->from->offset, 0);
   }
-  if(!(safe_tflag(emit->env->class_def, tflag_struct) && !emit->env->scope->depth))
-    emit_kind(emit, v->from->offset, v->type->size, !struct_ctor(v) ? emit_addr : true,
+  if(!(safe_tflag(emit->env->class_def, tflag_struct) && !emit->env->scope->depth)) {
+    const Instr instr =  emit_kind(emit, v->from->offset, v->type->size, !struct_ctor(v) ? emit_addr : true,
                       exec);
+    // we want to push a zero
+    if(vflag(v, vflag_member) && !emit_addr)
+      instr->m_val = 0;
+  }
   else emit_struct_decl(emit, v, !struct_ctor(v) ? emit_addr : 1);
   if (is_obj && !is_ref && !exp_self(decl)->ref) {
     if (!emit_var)
index ae3009f58fd91e3ffbd22c2fee825988dafdf448..5550543a713ae2811db8e3d4ff7ac06db355461e 100644 (file)
@@ -408,7 +408,7 @@ _Pragma(STRINGIFY(COMPILER diagnostic ignored UNINITIALIZED)
 #define IVAL  (*(m_int *)(byte + SZ_INT))
 #define FVAL  (*(m_float *)(byte + SZ_INT))
 #define VAL2  (*(m_uint *)(byte + SZ_INT + SZ_INT))
-#define IVAL2  (*(m_int *)(byte + SZ_INT + SZ_INT))
+#define IVAL2 (*(m_int *)(byte + SZ_INT + SZ_INT))
 #define SVAL  (*(uint16_t *)(byte + SZ_INT + SZ_INT))
 #define SVAL2 (*(uint16_t *)(byte + SZ_INT + SZ_INT + sizeof(uint16_t)))
 
@@ -454,7 +454,7 @@ vm_prepare(const VM *vm, m_bit *prepare_code) { // lgtm [cpp/use-of-goto]
       &&fimul, &&fidiv, &&fiand, &&fior, &&fieq, &&fine, &&figt, &&fige, &&filt,
       &&file, &&firassign, &&firadd, &&firsub, &&firmul, &&firdiv, &&itof,
       &&ftoi, &&timeadv, &&recurs, &&setcode, &&regmove,
-      &&regtomem, &&regtomemother, &&staticmemcpy,
+      &&regtomem, &&regtomemother, &&staticmemcpy, &&staticmemset,
       &&overflow,
       &&funcusrend, &&funcusrend2, &&funcmemberend,
       &&sporkini, &&forkini, &&sporkfunc, &&sporkexp, &&sporkcode,
@@ -942,6 +942,10 @@ vm_prepare(const VM *vm, m_bit *prepare_code) { // lgtm [cpp/use-of-goto]
     staticmemcpy:
       memcpy((void*)VAL, reg, VAL2);
       DISPATCH()
+    staticmemset:
+      memset(reg, VAL2, VAL);
+      reg += VAL;
+      DISPATCH()
     overflow:
       if (overflow_(mem + VAL2, shred)) {
         handle(shred, "StackOverflow");
@@ -1144,9 +1148,9 @@ DISPATCH();
       reg += SZ_INT;
       DISPATCH()
     dotmembermem2:
-      *(m_float *)(reg + SZ_INT) =
+      *(m_float *)reg =
           *(m_float *)((*(M_Object *)(mem + VAL2))->data + VAL);
-      reg += SZ_INT - SZ_FLOAT;
+      reg += SZ_FLOAT;
       DISPATCH()
 //    dotmembermem3:
     dotmembermem4:
@@ -1338,7 +1342,7 @@ static void *_dispatch[] = {
       &&_fimul, &&_fidiv, &&_fiand, &&_fior, &&_fieq, &&_fine, &&_figt, &&_fige, &&_filt,
       &&_file, &&_firassign, &&_firadd, &&_firsub, &&_firmul, &&_firdiv, &&_itof,
       &&_ftoi, &&_timeadv, &&_recurs, &&_setcode, &&_regmove,
-      &&_regtomem, &&_regtomemother, &&_staticmemcpy,
+      &&_regtomem, &&_regtomemother, &&_staticmemcpy, &&_staticmemset,
       &&_overflow,
       &&_funcusrend, &&_funcusrend2, &&_funcmemberend,
       &&_sporkini, &&_forkini, &&_sporkfunc, &&_sporkexp, &&_sporkcode, &&_forkend,
@@ -1540,6 +1544,7 @@ return;
     PREPARE(regtomem);
     PREPARE(regtomemother);
     PREPARE(staticmemcpy);
+    PREPARE(staticmemset);
     PREPARE(overflow);
     PREPARE(funcusrend);
     PREPARE(funcusrend2);