105
105
get_exc_info_op ,
106
106
get_exc_value_op ,
107
107
keep_propagating_op ,
108
+ err_occurred_op ,
108
109
no_err_occurred_op ,
109
110
propagate_if_error_op ,
110
111
raise_exception_op ,
111
112
reraise_exception_op ,
112
113
restore_exc_info_op ,
114
+ error_clear_op ,
113
115
)
114
116
from mypyc .primitives .generic_ops import iter_op , next_op , next_raw_op , py_delattr_op
115
117
from mypyc .primitives .misc_ops import (
@@ -1018,24 +1020,47 @@ def try_body() -> None:
1018
1020
with_body ()
1019
1021
1020
1022
# except Exception as e:
1021
- # exc = True
1022
1023
# try:
1023
1024
# gen.throw(e)
1024
1025
# except StopIteration as e2:
1025
1026
# if e2 is not e:
1026
1027
# raise
1027
1028
# return
1028
1029
# except RuntimeError:
1029
- # # TODO: some other stuff
1030
- # ...
1030
+ # # TODO: check the traceback munging
1031
+ # raise
1031
1032
# except BaseException:
1032
- # # TODO: some other stuff
1033
- # ...
1033
+ # # approximately
1034
+ # raise
1034
1035
1035
1036
def except_body () -> None :
1036
- builder .add (RaiseStandardError (RaiseStandardError .RUNTIME_ERROR , "TODO" , line ))
1037
+ exc_original = builder .call_c (get_exc_value_op , [], line )
1038
+
1039
+ builder .py_call (builder .py_get_attr (gen , "throw" , line ), [], line )
1040
+ err_occurred = builder .call_c (err_occurred_op , [], line )
1041
+
1042
+ error_block , no_error_block = BasicBlock (), BasicBlock ()
1043
+ builder .add (Branch (err_occurred , error_block , no_error_block , Branch .BOOL ))
1044
+
1045
+ builder .activate_block (error_block )
1046
+
1047
+ stop_iteration = builder .call_c (check_stop_op , [], line )
1048
+ is_same_exc = builder .binary_op (stop_iteration , exc_original , "is" , line )
1049
+
1050
+ suppress_block , propagate_block = BasicBlock (), BasicBlock ()
1051
+ builder .add (Branch (is_same_exc , suppress_block , propagate_block , Branch .BOOL ))
1052
+
1053
+ builder .activate_block (propagate_block )
1054
+ builder .call_c (keep_propagating_op , [], line )
1055
+ builder .add (Unreachable ())
1056
+
1057
+ builder .activate_block (no_error_block )
1058
+ builder .add (RaiseStandardError (RaiseStandardError .RUNTIME_ERROR , "generator didn't stop after throw()" , line ))
1037
1059
builder .add (Unreachable ())
1038
1060
1061
+ builder .activate_block (suppress_block )
1062
+ builder .call_c (error_clear_op , [], - 1 )
1063
+
1039
1064
# TODO: actually do the exceptions
1040
1065
handlers = [(None , None , except_body )]
1041
1066
@@ -1062,7 +1087,8 @@ def else_body() -> None:
1062
1087
builder .add (Unreachable ())
1063
1088
1064
1089
builder .activate_block (stop_block )
1065
- builder .call_c (error_catch_op , [], - 1 )
1090
+ # TODO: should check for StopIteration
1091
+ builder .call_c (error_clear_op , [], - 1 )
1066
1092
1067
1093
transform_try_except (
1068
1094
builder ,
0 commit comments