Parcourir la source

[4203] Added new fatal class method for yy_fatal_error fix

Francis Dupont il y a 9 ans
Parent
commit
3d663ac34a
3 fichiers modifiés avec 23 ajouts et 2 suppressions
  1. 6 0
      src/lib/eval/eval_context.cc
  2. 5 0
      src/lib/eval/eval_context.h
  3. 12 2
      src/lib/eval/lexer.ll

+ 6 - 0
src/lib/eval/eval_context.cc

@@ -50,3 +50,9 @@ EvalContext::error (const std::string& what)
 {
     isc_throw(EvalParseError, what);
 }
+
+void
+EvalContext::fatal (const std::string& what)
+{
+    isc_throw(Unexpected, what);
+}

+ 5 - 0
src/lib/eval/eval_context.h

@@ -81,6 +81,11 @@ public:
     /// cases when the EvalParser is not able to handle the packet.
     void error(const std::string& what);
 
+    /// @brief Fatal error handler
+    ///
+    /// This is for should not happen but fatal errors
+    static void fatal(const std::string& what);
+
  private:
     /// @brief Flag determining scanner debugging.
     bool trace_scanning_;

+ 12 - 2
src/lib/eval/lexer.ll

@@ -31,6 +31,9 @@
 // The location of the current token. The lexer will keep updating it. This
 // variable will be useful for logging errors.
 static isc::eval::location loc;
+
+// To avoid the call to exit... oops!
+#define YY_FATAL_ERROR(msg) isc::eval::EvalContext::fatal(msg)
 %}
 
 /* noyywrap disables automatic rewinding for the next file to parse. Since we
@@ -144,8 +147,8 @@ EvalContext::scanStringBegin()
     YY_BUFFER_STATE buffer;
     buffer = yy_scan_bytes(string_.c_str(), string_.size());
     if (!buffer) {
-        error("cannot scan string");
-	// error throws an exception so this can't be reached
+        fatal("cannot scan string");
+	// fatal() throws an exception so this can't be reached
     }
 }
 
@@ -154,3 +157,10 @@ EvalContext::scanStringEnd()
 {
     yy_delete_buffer(YY_CURRENT_BUFFER);
 }
+
+namespace {
+/// To avoid unused function error
+class Dummy {
+    void dummy() { yy_fatal_error("Fix me: how to disable its definition?"); }
+};
+}