Skip to content

Commit 4771adb

Browse files
author
kr-2003
committed
error handling
1 parent c3a0565 commit 4771adb

File tree

2 files changed

+76
-55
lines changed

2 files changed

+76
-55
lines changed

src/xmagics/execution.cpp

Lines changed: 65 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ namespace xcpp
2929
{
3030
std::string out = Cpp::EndStdStreamCapture();
3131
err = Cpp::EndStdStreamCapture();
32+
std::cout << out;
3233
}
3334
};
3435

@@ -163,34 +164,43 @@ namespace xcpp
163164

164165
try
165166
{
166-
if (number == 0)
167-
{
168-
for (std::size_t n = 0; n < 10; ++n)
169-
{
170-
number = std::pow(10, n);
171-
std::string timeit_code = inner(number, code, exec_counter);
172-
std::ostringstream buffer_out, buffer_err;
173-
std::streambuf* old_cout = std::cout.rdbuf(buffer_out.rdbuf());
174-
std::streambuf* old_cerr = std::cerr.rdbuf(buffer_err.rdbuf());
175-
StreamRedirectRAII R(err);
176-
auto res_ptr = Cpp::Evaluate(timeit_code.c_str(), &hadError);
177-
std::cout.rdbuf(old_cout);
178-
std::cerr.rdbuf(old_cerr);
179-
output = std::to_string(res_ptr);
180-
err += buffer_err.str();
181-
double elapsed_time = std::stod(output) * 1e-6;
182-
if (elapsed_time >= 0.2)
183-
{
184-
break;
185-
}
186-
}
187-
}
167+
StreamRedirectRAII R(err);
168+
std::ostringstream buffer_out, buffer_err;
169+
std::streambuf* old_cout = std::cout.rdbuf(buffer_out.rdbuf());
170+
std::streambuf* old_cerr = std::cerr.rdbuf(buffer_err.rdbuf());
171+
compilation_result = Cpp::Declare(code.c_str());
172+
std::cout.rdbuf(old_cout);
173+
std::cerr.rdbuf(old_cerr);
174+
}
175+
catch (std::exception& e)
176+
{
177+
errorlevel = 1;
178+
ename = "Standard Exception: ";
179+
evalue = e.what();
180+
return;
181+
}
182+
catch (...)
183+
{
184+
errorlevel = 1;
185+
ename = "Error: ";
186+
return;
187+
}
188+
189+
if (compilation_result)
190+
{
191+
errorlevel = 1;
192+
ename = "Error: ";
193+
evalue = "Compilation error! " + err;
194+
std::cerr << err;
195+
return;
196+
}
188197

189-
std::vector<double> all_runs;
190-
double mean = 0;
191-
double stdev = 0;
192-
for (std::size_t r = 0; r < static_cast<std::size_t>(repeat); ++r)
198+
199+
if (number == 0)
200+
{
201+
for (std::size_t n = 0; n < 10; ++n)
193202
{
203+
number = std::pow(10, n);
194204
std::string timeit_code = inner(number, code, exec_counter);
195205
std::ostringstream buffer_out, buffer_err;
196206
std::streambuf* old_cout = std::cout.rdbuf(buffer_out.rdbuf());
@@ -202,41 +212,41 @@ namespace xcpp
202212
output = std::to_string(res_ptr);
203213
err += buffer_err.str();
204214
double elapsed_time = std::stod(output) * 1e-6;
205-
all_runs.push_back(elapsed_time / number);
206-
mean += all_runs.back();
207-
}
208-
mean /= repeat;
209-
for (std::size_t r = 0; r < static_cast<std::size_t>(repeat); ++r)
210-
{
211-
stdev += (all_runs[r] - mean) * (all_runs[r] - mean);
215+
if (elapsed_time >= 0.2)
216+
{
217+
break;
218+
}
212219
}
213-
stdev = std::sqrt(stdev / repeat);
214-
215-
std::cout << _format_time(mean, precision) << " +- " << _format_time(stdev, precision);
216-
std::cout << " per loop (mean +- std. dev. of " << repeat << " run"
217-
<< ((repeat == 1) ? ", " : "s ");
218-
std::cout << number << " loop" << ((number == 1) ? "" : "s") << " each)" << std::endl;
219220
}
220-
catch (std::exception& e)
221+
222+
std::vector<double> all_runs;
223+
double mean = 0;
224+
double stdev = 0;
225+
for (std::size_t r = 0; r < static_cast<std::size_t>(repeat); ++r)
221226
{
222-
errorlevel = 1;
223-
ename = "Standard Exception: ";
224-
evalue = e.what();
227+
std::string timeit_code = inner(number, code, exec_counter);
228+
std::ostringstream buffer_out, buffer_err;
229+
std::streambuf* old_cout = std::cout.rdbuf(buffer_out.rdbuf());
230+
std::streambuf* old_cerr = std::cerr.rdbuf(buffer_err.rdbuf());
231+
StreamRedirectRAII R(err);
232+
auto res_ptr = Cpp::Evaluate(timeit_code.c_str(), &hadError);
233+
std::cout.rdbuf(old_cout);
234+
std::cerr.rdbuf(old_cerr);
235+
output = std::to_string(res_ptr);
236+
err += buffer_err.str();
237+
double elapsed_time = std::stod(output) * 1e-6;
238+
all_runs.push_back(elapsed_time / number);
239+
mean += all_runs.back();
225240
}
226-
catch (...)
241+
mean /= repeat;
242+
for (std::size_t r = 0; r < static_cast<std::size_t>(repeat); ++r)
227243
{
228-
errorlevel = 1;
229-
ename = "Error: ";
244+
stdev += (all_runs[r] - mean) * (all_runs[r] - mean);
230245
}
246+
stdev = std::sqrt(stdev / repeat);
231247

232-
if (hadError)
233-
{
234-
errorlevel = 1;
235-
ename = "Error: ";
236-
evalue = "Compilation error! " + err;
237-
std::cerr << err;
238-
std::cerr << "Error: " << evalue << std::endl;
239-
std::cerr << "Error: " << err << std::endl;
240-
}
248+
std::cout << _format_time(mean, precision) << " +- " << _format_time(stdev, precision);
249+
std::cout << " per loop (mean +- std. dev. of " << repeat << " run" << ((repeat == 1) ? ", " : "s ");
250+
std::cout << number << " loop" << ((number == 1) ? "" : "s") << " each)" << std::endl;
241251
}
242252
}

test/test_interpreter.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1087,4 +1087,15 @@ TEST_SUITE("timeit")
10871087
std::string output = redirect.getCaptured();
10881088
REQUIRE(output.find("mean +- std. dev. of 1 run, 10 loops each") != std::string::npos);
10891089
}
1090+
1091+
TEST_CASE("fail_check")
1092+
{
1093+
std::string line = "timeit";
1094+
std::string cell = "int x = ";
1095+
StreamRedirectRAII redirect(std::cerr);
1096+
xcpp::timeit ti;
1097+
ti(line, cell);
1098+
std::string output = redirect.getCaptured();
1099+
REQUIRE(output.find("expected expression") != std::string::npos);
1100+
}
10901101
}

0 commit comments

Comments
 (0)