comparison libinterp/parse-tree/oct-parse.in.yy @ 18158:bf638abc95de

eliminate constant folding in parser * oct-parse.in.yy (fold): Delete functions and all uses.
author John W. Eaton <jwe@octave.org>
date Fri, 13 Dec 2013 17:24:57 -0500
parents c7b68a11074b
children 69990d5edcc2
comparison
equal deleted inserted replaced
18151:1c22f0465c74 18158:bf638abc95de
1938 "variable switch label near line %d, column %d in file '%s'", 1938 "variable switch label near line %d, column %d in file '%s'",
1939 expr->line (), expr->column (), lexer.fcn_file_full_name.c_str ()); 1939 expr->line (), expr->column (), lexer.fcn_file_full_name.c_str ());
1940 } 1940 }
1941 } 1941 }
1942 1942
1943 static tree_expression *
1944 fold (tree_binary_expression *e)
1945 {
1946 tree_expression *retval = e;
1947
1948 unwind_protect frame;
1949
1950 frame.protect_var (error_state);
1951 frame.protect_var (warning_state);
1952
1953 frame.protect_var (discard_error_messages);
1954 frame.protect_var (discard_warning_messages);
1955
1956 discard_error_messages = true;
1957 discard_warning_messages = true;
1958
1959 tree_expression *op1 = e->lhs ();
1960 tree_expression *op2 = e->rhs ();
1961
1962 if (op1->is_constant () && op2->is_constant ())
1963 {
1964 octave_value tmp = e->rvalue1 ();
1965
1966 if (! (error_state || warning_state))
1967 {
1968 tree_constant *tc_retval
1969 = new tree_constant (tmp, op1->line (), op1->column ());
1970
1971 std::ostringstream buf;
1972
1973 tree_print_code tpc (buf);
1974
1975 e->accept (tpc);
1976
1977 tc_retval->stash_original_text (buf.str ());
1978
1979 delete e;
1980
1981 retval = tc_retval;
1982 }
1983 }
1984
1985 return retval;
1986 }
1987
1988 static tree_expression *
1989 fold (tree_unary_expression *e)
1990 {
1991 tree_expression *retval = e;
1992
1993 unwind_protect frame;
1994
1995 frame.protect_var (error_state);
1996 frame.protect_var (warning_state);
1997
1998 frame.protect_var (discard_error_messages);
1999 frame.protect_var (discard_warning_messages);
2000
2001 discard_error_messages = true;
2002 discard_warning_messages = true;
2003
2004 tree_expression *op = e->operand ();
2005
2006 if (op->is_constant ())
2007 {
2008 octave_value tmp = e->rvalue1 ();
2009
2010 if (! (error_state || warning_state))
2011 {
2012 tree_constant *tc_retval
2013 = new tree_constant (tmp, op->line (), op->column ());
2014
2015 std::ostringstream buf;
2016
2017 tree_print_code tpc (buf);
2018
2019 e->accept (tpc);
2020
2021 tc_retval->stash_original_text (buf.str ());
2022
2023 delete e;
2024
2025 retval = tc_retval;
2026 }
2027 }
2028
2029 return retval;
2030 }
2031
2032 // Finish building a range. 1943 // Finish building a range.
2033 1944
2034 tree_expression * 1945 tree_expression *
2035 octave_base_parser::finish_colon_expression (tree_colon_expression *e) 1946 octave_base_parser::finish_colon_expression (tree_colon_expression *e)
2036 { 1947 {
2082 else 1993 else
2083 { 1994 {
2084 e->preserve_base (); 1995 e->preserve_base ();
2085 delete e; 1996 delete e;
2086 1997
2087 // FIXME -- need to attempt constant folding here
2088 // too (we need a generic way to do that).
2089 retval = base; 1998 retval = base;
2090 } 1999 }
2091 } 2000 }
2092 2001
2093 return retval; 2002 return retval;
2296 } 2205 }
2297 2206
2298 int l = tok_val->line (); 2207 int l = tok_val->line ();
2299 int c = tok_val->column (); 2208 int c = tok_val->column ();
2300 2209
2301 tree_binary_expression *e 2210 return maybe_compound_binary_expression (op1, op2, l, c, t);
2302 = maybe_compound_binary_expression (op1, op2, l, c, t);
2303
2304 return fold (e);
2305 } 2211 }
2306 2212
2307 // Build a boolean expression. 2213 // Build a boolean expression.
2308 2214
2309 tree_expression * 2215 tree_expression *
2328 } 2234 }
2329 2235
2330 int l = tok_val->line (); 2236 int l = tok_val->line ();
2331 int c = tok_val->column (); 2237 int c = tok_val->column ();
2332 2238
2333 tree_boolean_expression *e 2239 return new tree_boolean_expression (op1, op2, l, c, t);
2334 = new tree_boolean_expression (op1, op2, l, c, t);
2335
2336 return fold (e);
2337 } 2240 }
2338 2241
2339 // Build a prefix expression. 2242 // Build a prefix expression.
2340 2243
2341 tree_expression * 2244 tree_expression *
2372 } 2275 }
2373 2276
2374 int l = tok_val->line (); 2277 int l = tok_val->line ();
2375 int c = tok_val->column (); 2278 int c = tok_val->column ();
2376 2279
2377 tree_prefix_expression *e 2280 return new tree_prefix_expression (op1, l, c, t);
2378 = new tree_prefix_expression (op1, l, c, t);
2379
2380 return fold (e);
2381 } 2281 }
2382 2282
2383 // Build a postfix expression. 2283 // Build a postfix expression.
2384 2284
2385 tree_expression * 2285 tree_expression *
2412 } 2312 }
2413 2313
2414 int l = tok_val->line (); 2314 int l = tok_val->line ();
2415 int c = tok_val->column (); 2315 int c = tok_val->column ();
2416 2316
2417 tree_postfix_expression *e 2317 return new tree_postfix_expression (op1, l, c, t);
2418 = new tree_postfix_expression (op1, l, c, t);
2419
2420 return fold (e);
2421 } 2318 }
2422 2319
2423 // Build an unwind-protect command. 2320 // Build an unwind-protect command.
2424 2321
2425 tree_command * 2322 tree_command *