Revision: 257
http://pure-lang.svn.sourceforge.net/pure-lang/?rev=257&view=rev
Author: agraef
Date: 2008-06-18 08:43:29 -0700 (Wed, 18 Jun 2008)
Log Message:
-----------
Bugfix: Handle execeptions in default_lhs().
Modified Paths:
--------------
pure/trunk/parser.yy
Modified: pure/trunk/parser.yy
===================================================================
--- pure/trunk/parser.yy 2008-06-18 08:53:21 UTC (rev 256)
+++ pure/trunk/parser.yy 2008-06-18 15:43:29 UTC (rev 257)
@@ -275,8 +275,9 @@
| LET simple_rule
{ action(interp.define($2), delete $2); }
| rule
-{ rulel *rl = interp.default_lhs(interp.last, $1);
- action(interp.add_rules(interp.globenv, rl, true), delete rl); }
+{ rulel *rl = 0;
+ action(interp.add_rules(interp.globenv,
+ (rl = interp.default_lhs(interp.last, $1)), true), if (rl) delete rl); }
| fixity
/* Lexical tie-in: We need to tell the lexer that we're defining new operator
symbols (interp.declare_op = true) instead of searching for existing ones
@@ -577,14 +578,20 @@
rulel
: rule
{ $$ = new rule_info;
- rulel *rl = interp.default_lhs($$->l, $1);
- try { interp.add_rules($$->e, rl); }
- catch (err &e) { delete rl; interp.error(yyloc, e.what()); } }
+ rulel *rl = 0;
+ try {
+ rl = interp.default_lhs($$->l, $1);
+ interp.add_rules($$->e, rl);
+ }
+ catch (err &e) { if (rl) delete rl; interp.error(yyloc, e.what()); } }
| rulel ';' rule
{ $$ = $1;
- rulel *rl = interp.default_lhs($$->l, $3);
- try { interp.add_rules($$->e, rl); }
- catch (err &e) { delete rl; interp.error(yyloc, e.what()); } }
+ rulel *rl = 0;
+ try {
+ rl = interp.default_lhs($$->l, $3);
+ interp.add_rules($$->e, rl);
+ }
+ catch (err &e) { if (rl) delete rl; interp.error(yyloc, e.what()); } }
;
/* Same for pattern rules (pattern binding in 'case' clauses). */
@@ -597,14 +604,20 @@
pat_rulel
: rule
{ $$ = new pat_rule_info;
- rulel *rl = interp.default_lhs($$->l, $1);
- try { interp.add_rules($$->rl, rl, true); }
- catch (err &e) { delete rl; interp.error(yyloc, e.what()); } }
+ rulel *rl = 0;
+ try {
+ rl = interp.default_lhs($$->l, $1);
+ interp.add_rules($$->rl, rl, true);
+ }
+ catch (err &e) { if (rl) delete rl; interp.error(yyloc, e.what()); } }
| pat_rulel ';' rule
{ $$ = $1;
- rulel *rl = interp.default_lhs($$->l, $3);
- try { interp.add_rules($$->rl, rl, true); }
- catch (err &e) { delete rl; interp.error(yyloc, e.what()); } }
+ rulel *rl = 0;
+ try {
+ rl = interp.default_lhs($$->l, $3);
+ interp.add_rules($$->rl, rl, true);
+ }
+ catch (err &e) { if (rl) delete rl; interp.error(yyloc, e.what()); } }
;
/* Same for simple rules (pattern binding in 'when' clauses, no guards). */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|