]> Nishi Git Mirror - gwion.git/commitdiff
:art: Context can be errored
authorfennecdjay <astor.jeremie@wanadoo.fr>
Wed, 3 Jul 2019 15:41:11 +0000 (17:41 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Wed, 3 Jul 2019 15:41:11 +0000 (17:41 +0200)
include/context.h
src/emit/emit.c
src/gwion.c
src/parse/check.c
tests/error/func_exist.gw [deleted file]

index 8b70552a8c605cd78a9d28c00a549adb821dcde1..3abafca35fde807728f87a18ba7143a0d2414775 100644 (file)
@@ -7,6 +7,7 @@ struct Context_ {
   Nspc        nspc;
   struct Map_ lbls;
   HAS_OBJ
+  m_bool error;
 };
 
 ANN2(2) ANEW Context new_context(MemPool p, const Ast, const m_str);
index 290722cd2d829528460d2bc0fae7b118df525c37..a50ac62fa125d473f6b727edf5083c4ea5edff49 100644 (file)
@@ -1285,7 +1285,7 @@ ANN static m_bool emit_stmt_jump(const Emitter emit, const Stmt_Jump stmt) {
   if(!stmt->is_label)
     stmt->data.instr = emit_add_instr(emit, Goto);
   else {
-    if(switch_inside(emit->env, stmt_self(stmt)->pos) > 0 && !strcmp(s_name(stmt->name), "default"))
+    if(!strcmp(s_name(stmt->name), "default") && switch_inside(emit->env, stmt_self(stmt)->pos) > 0)
       return switch_default(emit->env, emit_code_size(emit), stmt_self(stmt)->pos);
     if(!stmt->data.v.ptr)
       ERR_B(stmt_self(stmt)->pos, _("illegal case"))
index 6ed44bb301822031001b06ef1b6e567c74e52d4e..774f22931868a886c9646a80416562cfece91865 100644 (file)
@@ -4,6 +4,7 @@
 #include "oo.h"
 #include "vm.h"
 #include "env.h"
+#include "context.h"
 #include "type.h"
 #include "func.h"
 #include "value.h"
@@ -106,6 +107,8 @@ ANN void gwion_end(const Gwion gwion) {
 }
 
 ANN void env_err(const Env env, const struct YYLTYPE* pos, const m_str fmt, ...) {
+  if(env->context->error)
+    return;
   if(env->class_def)
     gw_err(_("in class: '%s'\n"), env->class_def->name);
   if(env->func)
@@ -117,4 +120,5 @@ ANN void env_err(const Env env, const struct YYLTYPE* pos, const m_str fmt, ...)
   va_end(arg);
   fprintf(stderr, "\n");
   loc_err(pos, env->name);
+  env->context->error = 1;
 }
index ac0749154b5fc655e43c625f1b152c019350e3ee..c8cba0e4b49f70ec115f0000423fb1a57ee18b37 100644 (file)
@@ -611,8 +611,9 @@ ANN static Type check_exp_call_template(const Env env, const Exp_Call *exp) {
 }
 
 ANN static m_bool check_exp_call1_check(const Env env, const Exp exp) {
-  if(!check_exp(env, exp))
-    ERR_B(exp->pos, _("function call using a non-existing function"))
+  CHECK_OB(check_exp(env, exp))
+//  if(!check_exp(env, exp))
+//    ERR_B(exp->pos, _("function call using a non-existing function"))
   if(isa(exp->type, t_function) < 0)
     ERR_B(exp->pos, _("function call using a non-function value"))
   return GW_OK;
diff --git a/tests/error/func_exist.gw b/tests/error/func_exist.gw
deleted file mode 100644 (file)
index da0581c..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-// [contains] function call using a non-existing function
- test();