|
6 | 6 |
|
7 | 7 | from __future__ import annotations |
8 | 8 |
|
| 9 | +import math |
9 | 10 | from typing import Callable, Sequence |
10 | 11 |
|
11 | 12 | from mypy.nodes import ( |
@@ -128,6 +129,10 @@ def transform_name_expr(builder: IRBuilder, expr: NameExpr) -> Value: |
128 | 129 | if fullname == "builtins.False": |
129 | 130 | return builder.false() |
130 | 131 |
|
| 132 | + math_literal = transform_math_literal(builder, fullname) |
| 133 | + if math_literal is not None: |
| 134 | + return math_literal |
| 135 | + |
131 | 136 | if isinstance(expr.node, Var) and expr.node.is_final: |
132 | 137 | value = builder.emit_load_final( |
133 | 138 | expr.node, |
@@ -192,6 +197,10 @@ def transform_member_expr(builder: IRBuilder, expr: MemberExpr) -> Value: |
192 | 197 | if value is not None: |
193 | 198 | return value |
194 | 199 |
|
| 200 | + math_literal = transform_math_literal(builder, expr.fullname) |
| 201 | + if math_literal is not None: |
| 202 | + return math_literal |
| 203 | + |
195 | 204 | if isinstance(expr.node, MypyFile) and expr.node.fullname in builder.imports: |
196 | 205 | return builder.load_module(expr.node.fullname) |
197 | 206 |
|
@@ -1043,3 +1052,18 @@ def transform_assignment_expr(builder: IRBuilder, o: AssignmentExpr) -> Value: |
1043 | 1052 | target = builder.get_assignment_target(o.target) |
1044 | 1053 | builder.assign(target, value, o.line) |
1045 | 1054 | return value |
| 1055 | + |
| 1056 | + |
| 1057 | +def transform_math_literal(builder: IRBuilder, fullname: str) -> Value | None: |
| 1058 | + if fullname == "math.e": |
| 1059 | + return builder.load_float(math.e) |
| 1060 | + if fullname == "math.pi": |
| 1061 | + return builder.load_float(math.pi) |
| 1062 | + if fullname == "math.inf": |
| 1063 | + return builder.load_float(math.inf) |
| 1064 | + if fullname == "math.nan": |
| 1065 | + return builder.load_float(math.nan) |
| 1066 | + if fullname == "math.tau": |
| 1067 | + return builder.load_float(math.tau) |
| 1068 | + |
| 1069 | + return None |
0 commit comments