diff options
Diffstat (limited to 'src/systemc/tests/systemc/utils/sc_report/test05/catch_actions.cpp')
-rw-r--r-- | src/systemc/tests/systemc/utils/sc_report/test05/catch_actions.cpp | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/systemc/tests/systemc/utils/sc_report/test05/catch_actions.cpp b/src/systemc/tests/systemc/utils/sc_report/test05/catch_actions.cpp new file mode 100644 index 000000000..cdc94543b --- /dev/null +++ b/src/systemc/tests/systemc/utils/sc_report/test05/catch_actions.cpp @@ -0,0 +1,93 @@ +/***************************************************************************** + + Licensed to Accellera Systems Initiative Inc. (Accellera) under one or + more contributor license agreements. See the NOTICE file distributed + with this work for additional information regarding copyright ownership. + Accellera licenses this file to you under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with the + License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied. See the License for the specific language governing + permissions and limitations under the License. + + *****************************************************************************/ + +/***************************************************************************** + + catch_actions.cpp -- Test for catch actions used with a custom report handler + + Original Author: Philipp A. Hartmann, Intel, 2017-01-22 + + *****************************************************************************/ + +#include <systemc> + +using std::cout; +using std::endl; +using sc_core::sc_actions; +using sc_core::SC_DISPLAY; +using sc_core::SC_ERROR; +using sc_core::SC_LOG; +using sc_core::SC_THROW; +using sc_core::sc_report; +using sc_core::sc_report_handler; + +/* anonymous */ namespace { +bool last_report_thrown = false; +void custom_handler(const sc_report& rep, const sc_actions& actions) +{ + if ( actions & SC_DISPLAY ) { + cout << endl + // if last_report_thrown is set, we're in a catch action + << (last_report_thrown ? "[caught] " : "[normal] ") + << sc_core::sc_report_compose_message(rep) + << endl; + } + + // only log errors from catch actions + if (rep.get_severity() == SC_ERROR) { + if (actions & SC_LOG) { + sc_assert( !(actions & SC_THROW) ); + } else { + sc_assert( actions & SC_THROW ); + } + } + + // cache SC_THROW state of current report + last_report_thrown = (actions & SC_THROW); + + // delegate other actions to default handler + sc_report_handler::default_handler(rep, actions & ~SC_DISPLAY); + +} /* custom_handler */ +} /* anonymous namespace */ + +int sc_main(int,char*[]) +{ + // extended report logging, currently not checked in verify.pl + sc_report_handler::set_log_file_name("catch_actions.ext.log"); + + sc_report_handler::set_handler(custom_handler); + SC_REPORT_INFO("catch_actions", "prepared custom handler"); + sc_assert(last_report_thrown == false); + + SC_REPORT_INFO("catch_actions", "preparing catch actions"); + sc_actions act = sc_report_handler::set_catch_actions(SC_DISPLAY | SC_LOG); + sc_assert(act == SC_DISPLAY); + sc_assert(sc_report_handler::get_catch_actions() == (SC_DISPLAY | SC_LOG)); + + SC_REPORT_INFO("catch_actions", "only log errors from catch actions"); + act = sc_report_handler::set_actions + (SC_ERROR, (sc_core::SC_DEFAULT_ERROR_ACTIONS & ~SC_LOG)); + + // real test + SC_REPORT_ERROR("catch_actions", "throwing an exception"); + + // not reached + return 0; +} |