]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve value_data
authorJérémie Astor <fennecdjay@gmail.com>
Wed, 6 Jan 2021 12:22:26 +0000 (13:22 +0100)
committerJérémie Astor <fennecdjay@gmail.com>
Wed, 6 Jan 2021 12:22:26 +0000 (13:22 +0100)
include/env/value.h
include/import/item.h
src/emit/emit.c
src/import/import_item.c
src/lib/object_op.c
src/vm/vm.c

index 153a3cde56cf8231cb862f4ffefe8a7f4dbce763..8ee40aaf88151424bff39b4dd270e7922496264e 100644 (file)
@@ -26,10 +26,11 @@ struct Value_ {
   Type type;
   m_str name;
   struct ValueFrom_ *from;
-  union value_data{
+  union __attribute__((transparent_union)) value_data {
     m_uint num;
     m_float fnum;
     m_uint* ptr;
+    struct M_Object_ *obj;
     Func func_ref;
   } d;
   uint16_t ref;
index 48ba820fa4b17f5f668fbbf926a9ebcfa727c795..5090ad0501215c0e22af33324f25ca16fab6d1e2 100644 (file)
@@ -2,7 +2,7 @@
 #define __IMPORT_ITEM
 
 ANN m_int gwi_item_ini(const Gwi gwi, const m_str type, const m_str name);
-ANN2(1) m_int gwi_item_end(const Gwi gwi, const ae_flag flag, m_uint *const addr);
+ANN2(1) m_int gwi_item_end(const Gwi gwi, const ae_flag flag, union value_data);
 #define gwi_item_end(a, b, c) gwi_item_end(a, (const ae_flag)(b), (m_uint*const)c)
 ANN void ck_clean_item(MemPool, ImportCK*);
 #endif
index c4cb140619754c0d03a2fffaff4cec58e8f75d85..615b0afccf35e4bd8d35bb2250bca466aa819e39 100644 (file)
@@ -619,9 +619,9 @@ ANN static m_bool emit_prim_str(const Emitter emit, const m_str *str) {
   } else c[0] = '\0';
   const Value v = prim_self(str)->value;
   const Symbol sym = insert_symbol(c);
-  if(!v->d.ptr)
-    v->d.ptr = (m_uint*)new_string2(emit->gwion, NULL, s_name(sym));
-  regpushi(emit, (m_uint)v->d.ptr);
+  if(!v->d.obj)
+    v->d.obj = new_string2(emit->gwion, NULL, s_name(sym));
+  regpushi(emit, (m_uint)v->d.obj);
   emit_object_addref(emit, -SZ_INT, 0);
   return GW_OK;
 }
index dd8311c4beac7a04bef582eb30c4221a364a5abd..129c35a2e1072fea2a42536c54ad2ee8c8033bd5 100644 (file)
@@ -30,7 +30,7 @@ ANN static m_int gwi_item_tmpl(const Gwi gwi) {
 }
 
 #undef gwi_item_end
-ANN2(1) m_int gwi_item_end(const Gwi gwi, const ae_flag flag, m_uint *const addr) {
+ANN2(1) m_int gwi_item_end(const Gwi gwi, const ae_flag flag, union value_data addr) {
   CHECK_BB(ck_ok(gwi, ck_item))
   const Env env = gwi->gwion->env;
   gwi->ck->exp->d.exp_decl.td->flag = flag;
@@ -38,7 +38,7 @@ ANN2(1) m_int gwi_item_end(const Gwi gwi, const ae_flag flag, m_uint *const addr
     return gwi_item_tmpl(gwi);
   CHECK_BB(traverse_exp(env, gwi->ck->exp))
   const Value value = gwi->ck->exp->d.exp_decl.list->self->value;
-  value->d.ptr = addr;
+  value->d = addr;
   set_vflag(value, vflag_builtin);
   if(!env->class_def)
     SET_FLAG(value, global);
index 2fdee4b2924ad58abce3643b6859b3d650a68a70..6a68ad60d4245d0bdf7424a8209841f14042e427 100644 (file)
@@ -92,7 +92,8 @@ ANN static void emit_dot_static_data(const Emitter emit, const Value v, const ui
 
 static const f_instr regpushimm[] = { RegPushImm, RegPushImm2, RegPushImm3, RegPushImm4 };
 ANN static void emit_dot_static_import_data(const Emitter emit, const Value v, const uint emit_addr) {
-  if(v->d.ptr && vflag(v, vflag_builtin) && GET_FLAG(v, const)) {
+//  if(v->d.ptr && vflag(v, vflag_builtin) && GET_FLAG(v, const)) {
+  if(vflag(v, vflag_builtin) && GET_FLAG(v, const)) {
     const m_uint size = v->type->size;
     const Instr instr = emit_kind(emit, size, emit_addr, regpushimm);
     instr->m_val = (m_uint)v->d.ptr;
index 6c076bf0cb1b2c12a41667c5bf3c94c2bf9b6fab..89c4e8b55666e4a1d12831d264955c98457175a3 100644 (file)
@@ -365,7 +365,7 @@ regpushfloat:
 regpushother:
 //  LOOP_OPTIM
   for(m_uint i = 0; i <= VAL2; i+= SZ_INT)
-    *(m_bit**)(reg+i) = (m_bit*)(VAL + i);
+    *(m_bit**)(reg+i) = *(m_bit**)(VAL + i);
   reg += VAL2;
   DISPATCH();
 regpushaddr: