]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve check_exp_decl
authorfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 15 Aug 2019 15:28:22 +0000 (17:28 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 15 Aug 2019 15:28:22 +0000 (17:28 +0200)
src/emit/emit.c
src/lib/engine.c
src/parse/check.c

index f1a4486f1e288e77f35b50e894db5abc259f7a14..9a7bc160374fcac2c6baab5eb386551657b64ca4 100644 (file)
@@ -352,6 +352,10 @@ ANN static m_bool emit_symbol(const Emitter emit, const Exp_Primary* prim) {
   const Value v = prim->value;
   if(v->owner_class)
     return emit_symbol_owned(emit, prim);
+  if(isa(v->type, t_class) > 0) {
+    regpushi(emit, (m_uint)actual_type(v->type));
+    return GW_OK;
+  }
   if(GET_FLAG(v, builtin) || GET_FLAG(v, union) || GET_FLAG(v, enum))
     return emit_symbol_builtin(emit, prim);
   const m_uint size = v->type->size;
@@ -1070,7 +1074,7 @@ ANN static m_bool emit_exp_lambda(const Emitter emit, const Exp_Lambda * lambda)
 }
 
 ANN static m_bool emit_exp_typeof(const Emitter emit, const Exp_Typeof *exp) {
-  regpushi(emit, (m_uint)exp->exp->type);
+  regpushi(emit, (m_uint)actual_type(exp->exp->type));
   return GW_OK;
 }
 
index 4313a2a39ee568041d4b3a2a4e1209486daf479c..4c13145e139c2d2527f17aa848465ead031bf486 100644 (file)
@@ -34,6 +34,19 @@ static FREEARG(freearg_gack) {
   free_vector(((Gwion)gwion)->mp, (Vector)instr->m_val2);
 }
 
+
+#define mk_class_instr(op, arg0, arg1, ...)                          \
+static INSTR(instr_class_##op) {                                     \
+  POP_REG(shred, SZ_INT);                                            \
+  const Type l = *(Type*)(shred->reg - SZ_INT);                      \
+  const Type r = *(Type*)(shred->reg);                               \
+  *(m_uint*)(shred->reg - SZ_INT) = isa(arg0, arg1) > 0 __VA_ARGS__; \
+}
+mk_class_instr(ge, l, r)
+mk_class_instr(gt, l, r, && l != r)
+mk_class_instr(le, r, l)
+mk_class_instr(lt, r, l, && l != r)
+
 ANN static m_bool import_core_libs(const Gwi gwi) {
   GWI_OB((t_class = gwi_mk_type(gwi, "Class", SZ_INT, NULL)))
   GWI_BB(gwi_add_type(gwi, t_class))
@@ -90,6 +103,14 @@ ANN static m_bool import_core_libs(const Gwi gwi) {
   GWI_BB(import_string(gwi))
   GWI_BB(import_shred(gwi))
   GWI_BB(import_modules(gwi))
+
+  GWI_BB(gwi_oper_ini(gwi, "Class", "Class", "int"))
+  GWI_BB(gwi_oper_end(gwi, "==", int_eq))
+  GWI_BB(gwi_oper_end(gwi, ">=", instr_class_ge))
+  GWI_BB(gwi_oper_end(gwi, ">",  instr_class_gt))
+  GWI_BB(gwi_oper_end(gwi, "<=", instr_class_le))
+  GWI_BB(gwi_oper_end(gwi, "<",  instr_class_lt))
+
   register_freearg(gwi, SwitchIni, freearg_switchini);
   register_freearg(gwi, SwitchBranch, freearg_switchbranch);
   register_freearg(gwi, Gack, freearg_gack);
index b285127344adfd041c212608aaaab45d7c2ecc0a..818907dc517fb0e1a36919d1b080c5b1a3f99c46 100644 (file)
@@ -89,15 +89,21 @@ ANN Type check_td(const Env env, Type_Decl *td) {
   return t;
 }
 
+ANN static Type no_xid(const Env env, const Exp_Decl* decl) {
+  DECL_OO(const Type, t, = check_td(env, decl->td))
+  ((Exp_Decl*)decl)->type = NULL;
+  Var_Decl_List list = decl->list;
+  do nspc_add_value(env->curr, list->self->xid, NULL);
+  while((list = list->next));
+  CHECK_BO(traverse_decl(env, decl))
+  return decl->type;
+}
+
 ANN Type check_exp_decl(const Env env, const Exp_Decl* decl) {
   Var_Decl_List list = decl->list;
   CHECK_BO(switch_decl(env, exp_self(decl)->pos))
-  if(!decl->td->xid) {
-    DECL_OO(const Type, t, = check_td(env, decl->td))
-    ((Exp_Decl*)decl)->type = NULL;
-    CHECK_BO(scan1_exp(env, exp_self(decl)))
-    CHECK_BO(scan2_exp(env, exp_self(decl)))
-  }
+  if(!decl->td->xid)
+    return no_xid(env, decl);
   if(decl->td->xid->xid == insert_symbol("auto")) { // should be better
     CHECK_BO(scan1_exp(env, exp_self(decl)))
     CHECK_BO(scan2_exp(env, exp_self(decl)))
@@ -117,13 +123,14 @@ ANN Type check_exp_decl(const Env env, const Exp_Decl* decl) {
       CHECK_BO(check_exp_decl_parent(env, var))
     if(var->array && var->array->exp)
       CHECK_BO(check_exp_array_subscripts(env, var->array->exp))
-    if(GET_FLAG(decl->td, member) && env->class_def) {
-      decl_member(env, v);
-      if(isa(env->class_def, t_object)  > 0)
-        tuple_info(env, decl->td, var);
+    if(env->class_def)  {
+      if(GET_FLAG(decl->td, member)) {
+        decl_member(env, v);
+        if(isa(env->class_def, t_object)  > 0)
+          tuple_info(env, decl->td, var);
+      } else if(GET_FLAG(decl->td, static))
+        decl_static(env, v);
     }
-    else if(GET_FLAG(decl->td, static))
-      decl_static(env, v);
     else if(global || (env->func && GET_FLAG(env->func->def, global)))
       SET_FLAG(v, abstract);
     if(isa(decl->type, t_fptr) > 0)