Skip to content

Commit f8c2709

Browse files
author
whitequark
committedJul 22, 2015
Make division by zero raise an exception.
1 parent 4cfe4ea commit f8c2709

File tree

3 files changed

+24
-13
lines changed

3 files changed

+24
-13
lines changed
 

Diff for: ‎artiq/compiler/builtins.py

+7
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ class TValueError(TException):
8383
def __init__(self):
8484
super().__init__("ValueError")
8585

86+
class TZeroDivisionError(TException):
87+
def __init__(self):
88+
super().__init__("ZeroDivisionError")
89+
8690
def fn_bool():
8791
return types.TConstructor("bool")
8892

@@ -107,6 +111,9 @@ def fn_IndexError():
107111
def fn_ValueError():
108112
return types.TExceptionConstructor("ValueError")
109113

114+
def fn_ZeroDivisionError():
115+
return types.TExceptionConstructor("ZeroDivisionError")
116+
110117
def fn_range():
111118
return types.TBuiltinFunction("range")
112119

Diff for: ‎artiq/compiler/prelude.py

+13-12
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,17 @@
77

88
def globals():
99
return {
10-
"bool": builtins.fn_bool(),
11-
"int": builtins.fn_int(),
12-
"float": builtins.fn_float(),
13-
"list": builtins.fn_list(),
14-
"range": builtins.fn_range(),
15-
"Exception": builtins.fn_Exception(),
16-
"IndexError": builtins.fn_IndexError(),
17-
"ValueError": builtins.fn_ValueError(),
18-
"len": builtins.fn_len(),
19-
"round": builtins.fn_round(),
20-
"print": builtins.fn_print(),
21-
"syscall": builtins.fn_syscall(),
10+
"bool": builtins.fn_bool(),
11+
"int": builtins.fn_int(),
12+
"float": builtins.fn_float(),
13+
"list": builtins.fn_list(),
14+
"range": builtins.fn_range(),
15+
"Exception": builtins.fn_Exception(),
16+
"IndexError": builtins.fn_IndexError(),
17+
"ValueError": builtins.fn_ValueError(),
18+
"ZeroDivisionError": builtins.fn_ZeroDivisionError(),
19+
"len": builtins.fn_len(),
20+
"round": builtins.fn_round(),
21+
"print": builtins.fn_print(),
22+
"syscall": builtins.fn_syscall(),
2223
}

Diff for: ‎artiq/compiler/transforms/artiq_ir_generator.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -899,13 +899,16 @@ def visit_CoerceT(self, node):
899899

900900
def visit_BinOpT(self, node):
901901
if builtins.is_numeric(node.type):
902-
# TODO: check for division by zero
903902
rhs = self.visit(node.right)
904903
if isinstance(node.op, (ast.LShift, ast.RShift)):
905904
# Check for negative shift amount.
906905
self._make_check(self.append(ir.Compare(ast.GtE(loc=None), rhs,
907906
ir.Constant(0, rhs.type))),
908907
lambda: self.append(ir.Alloc([], builtins.TValueError())))
908+
elif isinstance(node.op, (ast.Div, ast.FloorDiv)):
909+
self._make_check(self.append(ir.Compare(ast.NotEq(loc=None), rhs,
910+
ir.Constant(0, rhs.type))),
911+
lambda: self.append(ir.Alloc([], builtins.TZeroDivisionError())))
909912

910913
return self.append(ir.Arith(node.op, self.visit(node.left), rhs))
911914
elif isinstance(node.op, ast.Add): # list + list, tuple + tuple

0 commit comments

Comments
 (0)
Please sign in to comment.