]> Nishi Git Mirror - gwion.git/commitdiff
:art: Add missing file
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Sun, 10 May 2020 20:56:13 +0000 (22:56 +0200)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Sun, 10 May 2020 20:56:13 +0000 (22:56 +0200)
src/lib/func.c
src/lib/vararg.c
src/parse/func_operator.c [new file with mode: 0644]
src/parse/type_decl.c

index 105d567809f7880a05869c2b4770c57dd761e027..ce84739e26f7c7aec4e63c1d6ad658acb4a3f68f 100644 (file)
@@ -185,7 +185,7 @@ ANN static m_bool fptr_do(const Env env, struct FptrInfo *info) {
     m_bool nonnull = GET_FLAG(info->exp->info->type, nonnull);
     CHECK_BB(fptr_check(env, info))
     DECL_OB(const Type, t, = fptr_type(env, info))
-    info->exp->info->type = !nonnull ? t : type_nonnull(env, t);
+    info->exp->info->type = !nonnull ? t : nonnul_type(env, t);
     return GW_OK;
   }
   Exp_Lambda *l = &info->exp->d.exp_lambda;
index 9d357c00ecfb22a4cbcf87dd4dcdc75c2b01daca..2d2526861fddaff0d2f91f71b15a388409b4e7c8 100644 (file)
@@ -122,7 +122,7 @@ static FREEARG(freearg_vararg) {
 
 static ID_CHECK(idck_vararg) {
   if(env->func && GET_FLAG(env->func->def, variadic))
-    return type_nonnull(env, exp_self(prim)->info->type);
+    return nonnul_type(env, exp_self(prim)->info->type);
   ERR_O(exp_self(prim)->pos, _("'vararg' must be used inside variadic function"))
 }
 
diff --git a/src/parse/func_operator.c b/src/parse/func_operator.c
new file mode 100644 (file)
index 0000000..82afc43
--- /dev/null
@@ -0,0 +1,21 @@
+#include "gwion_util.h"
+#include "gwion_ast.h"
+#include "gwion_env.h"
+#include "vm.h"
+#include "instr.h"
+#include "object.h"
+#include "gwion.h"
+#include "operator.h"
+
+ANN void func_operator(const Func_Def fdef, struct Op_Import *opi) {
+  opi->op =fdef->base->xid;
+  const m_str str = s_name(fdef->base->xid);
+  const uint is_unary = GET_FLAG(fdef, unary) +
+    (!strcmp(str, "@conditionnal") || !strcmp(str, "@unconditionnal"));
+  const Arg_List args = fdef->base->args;
+  opi->lhs = is_unary ? NULL :
+    args ? args->var_decl->value->type : NULL;
+  opi->rhs = args ? is_unary ? args->var_decl->value->type :
+    args->next ? args->next->var_decl->value->type :
+    fdef->base->ret_type : NULL;
+}
index 9771edd95393e4c3a45c7bce7b945e1148bd44eb..806492500b6850984809dca9482ba6bac08ace50 100644 (file)
@@ -8,7 +8,7 @@
 #define STR_NONNULL ":nonnull"
 #define STRLEN_NONNULL strlen(STR_NONNULL)
 
-ANN Type type_nonnull(const Env env, const Type base) {
+ANN Type nonnul_type(const Env env, const Type base) {
   char c[strlen(base->name) + 9];
   sprintf(c, "%s%s", base->name, STR_NONNULL);
   const Symbol sym = insert_symbol(c);
@@ -58,7 +58,7 @@ ANN Type type_decl_resolve(const Env env, Type_Decl* td) {
       ERR_O(td_pos(td), _("void types can't be nonnull."))
     if(isa(ret, env->gwion->type[et_object]) < 0 && isa(ret, env->gwion->type[et_fptr]) < 0)
       return ret;
-    return type_nonnull(env, ret);
+    return nonnul_type(env, ret);
   }
   return ret;
 }