]> Nishi Git Mirror - gwion.git/commitdiff
:art: Few fixes
authorJérémie Astor <fennecdjay@gmail.com>
Wed, 15 Dec 2021 13:35:54 +0000 (14:35 +0100)
committerJérémie Astor <fennecdjay@gmail.com>
Wed, 15 Dec 2021 13:35:54 +0000 (14:35 +0100)
19 files changed:
examples/auto.gw
include/opcode.h
opcode.txt
src/emit/emit.c
src/lib/object.c
src/parse/check.c
src/vm/vm.c
tests/functionnal_array/concatmap.gw
tests/functionnal_array/map.gw
tests/new/array.gw
tests/pp/pragma_unroll.gw
tests/range/range_char.gw
tests/range/range_int.gw
tests/tree/auto_array.gw
tests/tree/auto_fun.gw
tests/tree/auto_ptr.gw
tests/tree/cpy_ast.gw
tests/tree/set_obj.gw
tests/tree/typedef_auto_loop.gw

index c4056df10f1deb2d5fa4c69e274c034942b382f9..f13495c6525411d034654b3cad15c14e6fc4dbfa 100644 (file)
@@ -1,3 +1,3 @@
 var Object i[4];
-foreach(a: i)
+for(a: i)
   <<< a >>>;
index 356216dd6cc8d616c37d83c13aa5dc0041f5ee72..76b978cb1a0872669390468d3f6eecd08827ee13 100644 (file)
@@ -1090,6 +1090,8 @@ ANN static inline void dump_opcodes(const VM_Code code) {
         break;
       case eSetCode:
         gw_out("{Y}┃{0}{-}% 4lu{0}: SetCode     ", j);
+        gw_out(" {-R}%-14"INT_F"{0}", instr->m_val);
+        gw_out(" {-M}%-14"INT_F"{0}", instr->m_val2);
         gw_out("\n");
         break;
       case eRegMove:
index 38966b4e169f99660bdef5de8d1e79bb29aa65e5..1ef10f3bae6682a508008fe0e390bd97789ba350 100644 (file)
@@ -143,7 +143,7 @@ CastI2F
 CastF2I
 Time_Advance
 Recurs
-SetCode
+SetCode~i~i
 RegMove~i
 Reg2Mem~u~i
 Reg2Mem4~u~u
index 4726224df873508c28b9271407609e8c8f5c66f1..c9f1451b82ecdb693818e4cf0bfef9a013eebf49 100644 (file)
@@ -527,7 +527,6 @@ ANN static m_bool _emit_symbol(const Emitter emit, const Symbol *data) {
     }
     return GW_OK;
   }
-//  if (!strncmp(v->type->name, "Ref:[", 5) && (!prim_exp(data)->cast_to || strncmp(prim_exp(data)->cast_to->name, "Ref:[", 5))) {
   if (tflag(v->type, tflag_ref) && !safe_tflag(prim_exp(data)->cast_to, tflag_ref)) {
     if (exp_getvar(exp_self(prim_self(data)))) {
       const Instr instr = emit_add_instr(emit, RegPushMem);
@@ -901,11 +900,9 @@ ANN static m_bool emit_dot_static_data(const Emitter emit, const Value v,
   return GW_OK;
 }
 
-ANN static m_bool decl_static(const Emitter emit, const Exp_Decl *decl,
+ANN static m_bool _decl_static(const Emitter emit, const Exp_Decl *decl,
                               const Var_Decl var_decl, const uint is_ref) {
   const Value v    = var_decl->value;
-  Code *      code = emit->code;
-  emit->code       = (Code *)vector_back(&emit->stack);
   CHECK_BB(
       emit_instantiate_decl(emit, v->type, decl->td, var_decl->array, is_ref));
   CHECK_BB(emit_dot_static_data(emit, v, 1));
@@ -913,10 +910,18 @@ ANN static m_bool decl_static(const Emitter emit, const Exp_Decl *decl,
 //  if(get_depth(var_decl->value->type) && !is_ref)
 //    (void)emit_object_addref(emit, -SZ_INT, 0);
   regpop(emit, SZ_INT);
-  emit->code = code;
   return GW_OK;
 }
 
+ANN static m_bool decl_static(const Emitter emit, const Exp_Decl *decl,
+                              const Var_Decl var_decl, const uint is_ref) {
+  Code *const code = emit->code;
+  emit->code       = (Code *)vector_back(&emit->stack);
+  const m_bool ret = _decl_static(emit, decl, var_decl, is_ref);
+  emit->code = code;
+  return ret;
+}
+
 ANN static inline int struct_ctor(const Value v) {
   return tflag(v->type, tflag_struct) && v->type->nspc->pre_ctor;
 }
index 724cf9843541354fb9bacfd902ef9ca58b191b56..8a9aad0823f96f5ed002a1fb4c350b50b772ae88 100644 (file)
@@ -100,12 +100,14 @@ static ID_CHECK(opck_this) {
   if (!env->class_def)
     ERR_O(exp_self(prim)->pos,
           _("keyword 'this' can be used only inside class definition..."))
-  if (env->func && !vflag(env->func->value_ref, vflag_member))
-    ERR_O(exp_self(prim)->pos,
+  if(env->func) {
+    if (!vflag(env->func->value_ref, vflag_member))
+      ERR_O(exp_self(prim)->pos,
           _("keyword 'this' cannot be used inside static functions..."))
-  if (!exp_getuse(exp_self(prim)) && env->func &&
-      !strcmp(s_name(env->func->def->base->xid), "@gack"))
-    return get_gack(env->class_def->info->parent); // get_gack ?
+    if (!exp_getuse(exp_self(prim)) &&
+        !strcmp(s_name(env->func->def->base->xid), "@gack"))
+      return get_gack(env->class_def->info->parent); // get_gack ?
+  }
   return env->class_def;
 }
 
index b34cf2ec702d951d270fd8808937e3328514f362..a59b4e8fb31ab28e6e18ddcb666ab07477b9ce6f 100644 (file)
@@ -502,9 +502,8 @@ static Func find_func_match_actual(const Env env, Func func, const Exp args,
     while (e) {
       if (!e->type) // investigate
         return NULL;
-//      if (!strncmp(e->type->name, "Ref:[", 5)) {
-      if (tflag(e->type, tflag_ref)) {
-if(!e->cast_to)e->cast_to = e->type;
+      if (tflag(e->type, tflag_ref) && isa(e->type, e1->type) > 0) {
+        if(!e->cast_to)e->cast_to = e1->type;
       }
       if (!e1) {
         if (fbflag(func->def->base, fbflag_variadic)) return func;
index 738d9ca31b866a691f81ff5dcd1dce750245b9e3..507dfab051ed8b25c6e8374091c95909f6eab49e 100644 (file)
@@ -896,9 +896,12 @@ vm_run(const VM *vm) { // lgtm [cpp/use-of-goto]
       *(m_float *)(reg - SZ_FLOAT) = (m_float) * (m_int *)(reg - SZ_FLOAT);
       DISPATCH()
     ftoi:
+{
+      const m_float f = * (m_float *)(reg - SZ_FLOAT);
       reg -= SZ_FLOAT - SZ_INT;
-      *(m_int *)(reg - SZ_INT) = (m_int) * (m_float *)(reg - SZ_INT);
+      *(m_int *)(reg - SZ_INT) = (m_int)f;
       DISPATCH()
+}
     timeadv:
       reg -= SZ_FLOAT;
       shredule(s, shred, *(m_float *)(reg - SZ_FLOAT));
index 70b40a9af1daeae94375b353970bc691bca1ec24..c9df7e1c791a5d89814e80a5c0808060207d7cbd 100644 (file)
@@ -6,7 +6,7 @@
 const float ii;
 123=> var float f;
 
-foreach(a : [12, 1, 2 ,3].compactMap:[int]( \a {
+for(a : [12, 1, 2 ,3].compactMap:[int]( \a {
     var int?i;
     145 => i.val;
     if(maybe)
@@ -24,6 +24,6 @@ fun int? t(int x) {
     i.val++;
   return i;
 }
-foreach(a : [12, 1, 2 ,3].compactMap:[int](t))
+for(a : [12, 1, 2 ,3].compactMap:[int](t))
   <<< "mapped to => ${a}" >>>;
 <<< "test" >>>;
index c323decf916bf8d1f4831a35dcdb4b8f8fa62343..83e659c3c2ab7b3c82aa4b5ffb50964f5522b7f7 100644 (file)
@@ -1,13 +1,13 @@
 fun float t(float i) { return 2; }
-foreach(a : [12., 1, 2 ,3].map:[float](t))
+for(a : [12., 1, 2 ,3].map:[float](t))
   <<< "mapped to => ${a}" >>>;
-#!foreach(a : [12, 1, 2 ,3].map:[int](t))
+#!for(a : [12, 1, 2 ,3].map:[int](t))
 #!  <<< "mapped to => ${a}" >>>;
-#!foreach(a : [12, 1, 2 ,3].map:[int](t))
+#!for(a : [12, 1, 2 ,3].map:[int](t))
 #!  <<< "mapped to => ${a}" >>>;
-#!foreach(a : [12, 1, 2 ,3].map:[int](t))
+#!for(a : [12, 1, 2 ,3].map:[int](t))
 #!  <<< "mapped to => ${a}" >>>;
-#!foreach(a : [12, 1, 2 ,3].map:[int]( \a {145 => a;return 2;}))
+#!for(a : [12, 1, 2 ,3].map:[int]( \a {145 => a;return 2;}))
 #!  <<< "mapped to => ${a}" >>>;
-#!foreach(a : [12, 1, 2 ,3].map:[int]( \a {145 => a;return 2;}))
+#!for(a : [12, 1, 2 ,3].map:[int]( \a {145 => a;return 2;}))
 #!  <<< "mapped to => ${a}" >>>;
index 7401126c5dd317980781cc1841d1e8b62f1b2cb5..b9198e26fa12f4f9627922a470d7ef42235156e7 100644 (file)
@@ -3,5 +3,5 @@ j << 23;
 i << 2;
 j >> i;
 1234 >> i;
-foreach(a : i)
+for(a : i)
   <<< a >>>;
index 9dd92231fe8866e1fe86f892e59c4e4de4621052..560d9f6289a9009109635d957d1998d6bc3fd45e 100644 (file)
@@ -1,4 +1,4 @@
 #! contains 23
 #pragma unroll 2
-foreach(a, i : [ 0, 1, 3 ])
+for(a, i : [ 0, 1, 3 ])
   <<< a, i >>>;
index 7be542854355f3308b113734cf28e8d40719ea9f..0cf7a05189b5d33d45cbd1555f2f8f87772e93fb 100644 (file)
@@ -1,3 +1,3 @@
 #! [contains] b
-foreach(a : [ 'a' : 'c' ])
+for(a : [ 'a' : 'c' ])
    <<< a >>>;
index 870d1fd17557c2a1ffbbe96ec37511aad8d7ad7a..4b9c09141c02a42e796131b078d1511db32824c5 100644 (file)
@@ -1,3 +1,3 @@
 #! [contains] \-5
-foreach(a : [ -1 : -6 ])
+for(a : [ -1 : -6 ])
    <<< a >>>;
index 03fdc9865f413b775a4133d12cc4fce44394a80b..444fd163a385b8f581c5885a197de8a42d1b01b1 100644 (file)
@@ -1,4 +1,4 @@
 var int i[2][2];
-foreach(a : i)
+for(a : i)
    <<< a >>>;
 <<< i >>>;
index 92f23720a110f5f796a1280b48ecff5f8041d2a6..e1ef04dec926a054a4de0e7473b551b74f91ac14 100644 (file)
@@ -4,6 +4,6 @@ class C {
 
 var C i[2];
 
-foreach(a : i)
+for(a : i)
      <<< a >>>;
 
index 0da29291cc6341b6856374d8281de0050b7b69bc..ac84255903a37a0c613917e83049a8fd8f983257 100644 (file)
@@ -1,5 +1,5 @@
 var int i[4];
-foreach(a : i)
+for(a : i)
   <<< 1 => a >>>;
-foreach(a : i)
+for(a : i)
   <<< a >>>;
index 25c18fb6b737009b6f9a19777382805d159628df..13588e82efea9a1ac33fd34c2b73b1ea1c4c1404 100644 (file)
@@ -13,7 +13,7 @@ class C:[A] {
   for(var int _i; _i < 1; ++_i);
   var int array[2];
   array[0];
-  foreach(a : array);
+  for(a : array);
   repeat(1);
   match i,2 {
     case 12 when 0:;
index ae8180a636e86e52800362d29e0e913bbdb9d8e7..2e599a4d10054a81b2ef32cf0bdb9cbe76d62c81 100644 (file)
@@ -1,4 +1,4 @@
 typedef int[2] Type;
 Type type;
 <<<type>>>;
-foreach(ref a : type);
+for(ref a : type);
index 9c300b436a49d30e63ff8e287b798299f9cec7c2..5f2a0e97b02bd0cdf4107ea5af18ea075a63e7de 100644 (file)
@@ -1,3 +1,3 @@
 typedef int[2] Type;
 var Type type;
-foreach(a : type);
+for(a : type);