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); }