comparison libinterp/parse-tree/oct-parse.yy @ 27516:c3e24c82157f

skip constant folding if expression evaluation generates warning * oct-parse.yy (base_parser::make_colon_expression, base_parser::finish_array_list): Skip constant folding if expression evaluation generates a warning. Save and restore last warning message. Move unwind_protect frame inside try-catch block.
author John W. Eaton <jwe@octave.org>
date Wed, 16 Oct 2019 13:35:08 -0400
parents 257105b5193a
children 5e92bff668d6
comparison
equal deleted inserted replaced
27515:466e61c5fb4b 27516:c3e24c82157f
2439 tree_expression *limit, 2439 tree_expression *limit,
2440 tree_expression *incr) 2440 tree_expression *incr)
2441 { 2441 {
2442 tree_expression *retval = nullptr; 2442 tree_expression *retval = nullptr;
2443 2443
2444 interpreter& interp = __get_interpreter__ ("finish_colon_expression");
2445 error_system& es = interp.get_error_system ();
2446
2447 unwind_protect frame;
2448
2449 frame.add_method (es, &error_system::set_discard_warning_messages,
2450 es.discard_warning_messages ());
2451
2452 es.discard_warning_messages (true);
2453
2454 if (! base || ! limit) 2444 if (! base || ! limit)
2455 { 2445 {
2456 delete base; 2446 delete base;
2457 delete limit; 2447 delete limit;
2458 delete incr; 2448 delete incr;
2461 } 2451 }
2462 2452
2463 int l = base->line (); 2453 int l = base->line ();
2464 int c = base->column (); 2454 int c = base->column ();
2465 2455
2466 tree_colon_expression *e 2456 tree_colon_expression *expr
2467 = new tree_colon_expression (base, limit, incr, l, c); 2457 = new tree_colon_expression (base, limit, incr, l, c);
2458
2459 retval = expr;
2468 2460
2469 if (base->is_constant () && limit->is_constant () 2461 if (base->is_constant () && limit->is_constant ()
2470 && (! incr || incr->is_constant ())) 2462 && (! incr || incr->is_constant ()))
2471 { 2463 {
2464 interpreter& interp = __get_interpreter__ ("finish_colon_expression");
2465
2472 try 2466 try
2473 { 2467 {
2468 // If the evaluation generates a warning message, restore
2469 // the previous value of last_warning_message and skip the
2470 // conversion to a constant value.
2471
2472 unwind_protect frame;
2473
2474 error_system& es = interp.get_error_system ();
2475
2476 frame.add_method (es, &error_system::set_last_warning_message,
2477 es.last_warning_message (""));
2478
2479 frame.add_method (es, &error_system::set_discard_warning_messages,
2480 es.discard_warning_messages (true));
2481
2474 tree_evaluator& tw = interp.get_evaluator (); 2482 tree_evaluator& tw = interp.get_evaluator ();
2475 2483
2476 octave_value tmp = e->evaluate (tw); 2484 octave_value tmp = expr->evaluate (tw);
2477 2485
2478 tree_constant *tc_retval 2486 std::string msg = es.last_warning_message ();
2479 = new tree_constant (tmp, e->line (), e->column ()); 2487
2480 2488 if (msg.empty ())
2481 std::ostringstream buf; 2489 {
2482 2490 tree_constant *tc_retval
2483 tree_print_code tpc (buf); 2491 = new tree_constant (tmp, expr->line (), expr->column ());
2484 2492
2485 e->accept (tpc); 2493 std::ostringstream buf;
2486 2494
2487 tc_retval->stash_original_text (buf.str ()); 2495 tree_print_code tpc (buf);
2488 2496
2489 delete e; 2497 expr->accept (tpc);
2490 2498
2491 retval = tc_retval; 2499 tc_retval->stash_original_text (buf.str ());
2500
2501 delete expr;
2502
2503 retval = tc_retval;
2504 }
2492 } 2505 }
2493 catch (const execution_exception&) 2506 catch (const execution_exception&)
2494 { 2507 {
2495 interp.recover_from_exception (); 2508 interp.recover_from_exception ();
2496 } 2509 }
2497 } 2510 }
2498 else
2499 retval = e;
2500 2511
2501 return retval; 2512 return retval;
2502 } 2513 }
2503 2514
2504 // Build a binary expression. 2515 // Build a binary expression.
4132 tree_expression * 4143 tree_expression *
4133 base_parser::finish_array_list (tree_array_list *array_list) 4144 base_parser::finish_array_list (tree_array_list *array_list)
4134 { 4145 {
4135 tree_expression *retval = array_list; 4146 tree_expression *retval = array_list;
4136 4147
4137 interpreter& interp = __get_interpreter__ ("finish_array_list");
4138 error_system& es = interp.get_error_system ();
4139
4140 unwind_protect frame;
4141
4142 frame.add_method (es, &error_system::set_discard_warning_messages,
4143 es.discard_warning_messages ());
4144
4145 es.discard_warning_messages (true);
4146
4147 if (array_list->all_elements_are_constant ()) 4148 if (array_list->all_elements_are_constant ())
4148 { 4149 {
4150 interpreter& interp = __get_interpreter__ ("finish_array_list");
4151
4149 try 4152 try
4150 { 4153 {
4154 // If the evaluation generates a warning message, restore
4155 // the previous value of last_warning_message and skip the
4156 // conversion to a constant value.
4157
4158 unwind_protect frame;
4159
4160 error_system& es = interp.get_error_system ();
4161
4162 frame.add_method (es, &error_system::set_last_warning_message,
4163 es.last_warning_message (""));
4164
4165 frame.add_method (es, &error_system::set_discard_warning_messages,
4166 es.discard_warning_messages (true));
4167
4151 tree_evaluator& tw = interp.get_evaluator (); 4168 tree_evaluator& tw = interp.get_evaluator ();
4152 4169
4153 octave_value tmp = array_list->evaluate (tw); 4170 octave_value tmp = array_list->evaluate (tw);
4154 4171
4155 tree_constant *tc_retval 4172 std::string msg = es.last_warning_message ();
4156 = new tree_constant (tmp, array_list->line (), 4173
4157 array_list->column ()); 4174 if (msg.empty ())
4158 4175 {
4159 std::ostringstream buf; 4176 tree_constant *tc_retval
4160 4177 = new tree_constant (tmp, array_list->line (),
4161 tree_print_code tpc (buf); 4178 array_list->column ());
4162 4179
4163 array_list->accept (tpc); 4180 std::ostringstream buf;
4164 4181
4165 tc_retval->stash_original_text (buf.str ()); 4182 tree_print_code tpc (buf);
4166 4183
4167 delete array_list; 4184 array_list->accept (tpc);
4168 4185
4169 retval = tc_retval; 4186 tc_retval->stash_original_text (buf.str ());
4187
4188 delete array_list;
4189
4190 retval = tc_retval;
4191 }
4170 } 4192 }
4171 catch (const execution_exception&) 4193 catch (const execution_exception&)
4172 { 4194 {
4173 interp.recover_from_exception (); 4195 interp.recover_from_exception ();
4174 } 4196 }