]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Fix builtin struct
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Fri, 26 Jun 2020 13:37:19 +0000 (15:37 +0200)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Fri, 26 Jun 2020 13:37:19 +0000 (15:37 +0200)
src/emit/emit.c
src/import/cdef.c
src/parse/check.c
src/vm/vm.c

index 730c322404f947f466e07e54abd180930d1e7d1e..8c2d3fd6701dbc5e9c4d0594d3f205b67eb6a642 100644 (file)
@@ -515,7 +515,8 @@ ANN static void interp_multi(const Emitter emit, const Exp e) {
 }
 
 ANN static void interp_size(const Emitter emit, const Type t) {
-  const m_uint sz = isa(t, emit->gwion->type[et_compound]) < 0 ?
+  const m_uint sz = (isa(t, emit->gwion->type[et_object]) < 0 ||
+    (!GET_FLAG(t, builtin) && isa(t, emit->gwion->type[et_compound]) > 0))?
       t->size : SZ_INT;
   const Instr instr = regseti(emit, sz);
   instr->m_val2 = SZ_INT;
@@ -593,7 +594,7 @@ ANN static m_bool decl_static(const Emitter emit, const Var_Decl var_decl, const
 }
 
 ANN static inline int struct_ctor(const Value v) {
-  return GET_FLAG(v->type, struct);
+  return GET_FLAG(v->type, struct) && !GET_FLAG(v->type, builtin);
 }
 
 ANN static void decl_expand(const Emitter emit, const Type t) {
index 01927fee9c970e2a2d54674f27e6d2fc551a8ed2..6a96d2e9ee4b7d1e61bca00a8f615e660ac834e4 100644 (file)
@@ -106,7 +106,7 @@ ANN2(1,2) Type gwi_class_ini(const Gwi gwi, const m_str name, const m_str parent
 
 ANN Type gwi_struct_ini(const Gwi gwi, const m_str name) {
   CHECK_OO(str2sym(gwi, name))
-  const Type t = new_type(gwi->gwion->mp, ++gwi->gwion->env->scope->type_xid, name, NULL);
+  const Type t = new_type(gwi->gwion->mp, ++gwi->gwion->env->scope->type_xid, name, gwi->gwion->type[et_compound]);
   t->e->tuple = new_tupleform(gwi->gwion->mp, NULL);
   gwi_type_flag(t);
   SET_FLAG(t, struct);
index 7eb363c49a45f1e46b7509a81a615b42c9a57394..922813d55aa07b06b28d0faf1697a15e126adc7d 100644 (file)
@@ -353,7 +353,7 @@ ANN static Type check_prim_typeof(const Env env, const Exp *exp) {
 ANN static Type check_prim_interp(const Env env, const Exp* exp) {
   CHECK_OO(check_exp(env, *exp))
   Exp e = *exp;
-  do if(GET_FLAG(e->info->type, struct))
+  do if(GET_FLAG(e->info->type, struct) && !GET_FLAG(e->info->type, builtin))
     exp_setvar(e, 1);
   while((e = e->next));
   return env->gwion->type[et_string];
index 8ab2937098235b84e024b0643da89c3f507bcd7d..b4582fcfff8f0b3c4bfe72d59d7f1acd5848f9c8 100644 (file)
@@ -467,7 +467,7 @@ allocfloat:
   DISPATCH()
 allocother:
 //  LOOP_OPTIM
-  for(m_uint i = 0; i <= VAL; i += SZ_INT)
+  for(m_uint i = 0; i <= VAL2; i += SZ_INT)
     *(m_uint*)(reg+i) = (*(m_uint*)(mem+VAL+i) = 0);
   reg += VAL2;
   DISPATCH()