From 3b79c1d1483f02f00ee9e3cbdd1d0537dd66269e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alexis=20Laferri=C3=A8re?= Date: Wed, 23 Aug 2017 11:40:27 -0400 Subject: [PATCH] nitc & niti: explain failed assert to stderr MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Alexis Laferrière --- src/compiler/abstract_compiler.nit | 22 ++++++++++++++++++++++ src/interpreter/naive_interpreter.nit | 17 +++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/compiler/abstract_compiler.nit b/src/compiler/abstract_compiler.nit index a3a0bc8..a21456d 100644 --- a/src/compiler/abstract_compiler.nit +++ b/src/compiler/abstract_compiler.nit @@ -24,6 +24,7 @@ import c_tools private import annotation import mixin import counter +private import explain_assert_api # Add compiling options redef class ToolContext @@ -3606,6 +3607,9 @@ redef class AAssertExpr var cond = v.expr_bool(self.n_expr) v.add("if (unlikely(!{cond})) \{") v.stmt(self.n_else) + + explain_assert v + var nid = self.n_id if nid != null then v.add_abort("Assert '{nid.text}' failed") @@ -3614,6 +3618,24 @@ redef class AAssertExpr end v.add("\}") end + + # Explain assert if it fails + private fun explain_assert(v: AbstractCompilerVisitor) + do + var explain_assert_str = explain_assert_str + if explain_assert_str == null then return + + var nas = v.compiler.modelbuilder.model.get_mclasses_by_name("NativeArray") + if nas == null then return + + var expr = explain_assert_str.expr(v) + if expr == null then return + + var cstr = v.send(v.get_property("to_cstring", expr.mtype), [expr]) + if cstr == null then return + + v.add "PRINT_ERROR(\"Runtime assert: %s\\n\", {cstr});" + end end redef class AOrExpr diff --git a/src/interpreter/naive_interpreter.nit b/src/interpreter/naive_interpreter.nit index 616977a..6c899bd 100644 --- a/src/interpreter/naive_interpreter.nit +++ b/src/interpreter/naive_interpreter.nit @@ -23,6 +23,7 @@ private import parser::tables import mixin import primitive_types private import model::serialize_model +private import frontend::explain_assert_api redef class ToolContext # --discover-call-trace @@ -1875,6 +1876,22 @@ redef class AAssertExpr if not cond.is_true then v.stmt(self.n_else) if v.is_escaping then return + + # Explain assert if it fails + var explain_assert_str = explain_assert_str + if explain_assert_str != null then + var i = v.expr(explain_assert_str) + if i isa MutableInstance then + var res = v.send(v.force_get_primitive_method("to_cstring", i.mtype), [i]) + if res != null then + var val = res.val + if val != null then + print_error "Runtime assert: {val.to_s}" + end + end + end + end + var nid = self.n_id if nid != null then fatal(v, "Assert '{nid.text}' failed") -- 1.7.9.5