rev 655 - in trunk: pr/test src
SVN User <[email protected]> Wed, 23 Jun 2004 02:28:18 -0400
| Newsgroups | gmane.comp.lang.prothon.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: mark
Date: 2004-06-23 02:28:15 -0400 (Wed, 23 Jun 2004)
New Revision: 655
Modified:
trunk/pr/test/test.pr
trunk/src/interp.c
trunk/src/parser.h
trunk/src/parser_routines.c
trunk/src/prothon.y
Log:
added support for multiple exception types in exception keyword, changed syntax to "except label = Exception"
Modified: trunk/pr/test/test.pr
===================================================================
--- trunk/pr/test/test.pr 2004-06-23 06:01:44 UTC (rev 654)
+++ trunk/pr/test/test.pr 2004-06-23 06:28:15 UTC (rev 655)
@@ -1,4 +1,6 @@
#!/usr/bin/env prothon
-def func():
- raise 'abc'
+try:
+ x = 1//0
+except e = (DivideByZero, Exception):
+ print e
Modified: trunk/src/interp.c
===================================================================
--- trunk/src/interp.c 2004-06-23 06:01:44 UTC (rev 654)
+++ trunk/src/interp.c 2004-06-23 06:28:15 UTC (rev 655)
@@ -1145,19 +1145,27 @@
fr_sp--;
exc_proto = fr_tos;
fr_sp--;
- if (!has_proto(ist, exc_waiting, exc_proto)) { // need to support list XXX
+ if (has_proto(ist, exc_proto, OBJ(TUPLE_PROTO))) {
+ int i, llen = (int) list_len(ist, exc_proto);
+ for (i=0; i < llen; i++) {
+ if (has_proto(ist, exc_waiting, list_item(ist, exc_proto, i))) goto do_exc;
+ IF_EXC_BREAK;
+ }
IF_EXC_BREAK;
-#ifdef TRACE_INTERPRETER
- if (trace_interpreter) trace_step(frame);
-#endif
- fr_pc += param;
- continue;
- }
+ goto op_exc_cont;
+ } else if (!has_proto(ist, exc_waiting, exc_proto)) goto op_exc_cont;
IF_EXC_BREAK;
+do_exc:
if (exc_obj_label && exc_obj_label != OBJ(NONE))
set_attr(ist, frame->locals, exc_obj_label, exc_waiting);
exc_waiting = 0;
} break;
+op_exc_cont:
+#ifdef TRACE_INTERPRETER
+ if (trace_interpreter) trace_step(frame);
+#endif
+ fr_pc += param;
+ continue;
case OP_RERAISE:
ist->exception_obj = exc_waiting;
exc_waiting = 0;
Modified: trunk/src/parser.h
===================================================================
--- trunk/src/parser.h 2004-06-23 06:01:44 UTC (rev 654)
+++ trunk/src/parser.h 2004-06-23 06:28:15 UTC (rev 655)
@@ -167,7 +167,7 @@
code_p exceptall(void* param);
code_p exec_expr(void* param, code_p expr);
code_p expr_andor_expr(void* param, code_p lparm, code_p rparm, int andor_flg);
-code_p expr_label_body_to_except(void* param, code_p expr, obj_p label, code_p body);
+code_p expr_label_body_to_except(void* param, obj_p label, code_p expr, code_p body);
code_p expr_to_param(void* param, code_p expr);
code_p expr_to_slice(void* param, code_p expr);
code_p expr_to_sparm(void* param, code_p p1);
Modified: trunk/src/parser_routines.c
===================================================================
--- trunk/src/parser_routines.c 2004-06-23 06:01:44 UTC (rev 654)
+++ trunk/src/parser_routines.c 2004-06-23 06:28:15 UTC (rev 655)
@@ -1596,7 +1596,7 @@
res->code_data[1].data = OBJ(EXCEPTION);
return debug_retrn(__LINE__, res);
}
-code_p expr_label_body_to_except(void* param, code_p expr, obj_p label, code_p body){
+code_p expr_label_body_to_except(void* param, obj_p label, code_p expr, code_p body) {
code *res;
int k=0, len=3, stack_depth=1, max_stack_depth = 1;
calc_code(expr, &len, &stack_depth, &max_stack_depth);
Modified: trunk/src/prothon.y
===================================================================
--- trunk/src/prothon.y 2004-06-23 06:01:44 UTC (rev 654)
+++ trunk/src/prothon.y 2004-06-23 06:28:15 UTC (rev 655)
@@ -372,8 +372,8 @@
| mul_except except { $$ = append_list(yylex_param, $1, $2); }
;
except:
- EXCEPT_ expr compound_body { $$ = expr_label_body_to_except(yylex_param, $2, NULL, $3); }
- | EXCEPT_ expr ',' LABEL compound_body { $$ = expr_label_body_to_except(yylex_param, $2, $4, $5); }
+ EXCEPT_ expr compound_body { $$ = expr_label_body_to_except(yylex_param, NULL, $2, $3); }
+ | EXCEPT_ LABEL '=' expr compound_body { $$ = expr_label_body_to_except(yylex_param, $2, $4, $5); }
;
else_except:
/* empty string */ { $$ = none(yylex_param); }