/
enumimpl.py
65 lines (53 loc) · 2.09 KB
/
enumimpl.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
"""
Implementation of enums.
"""
from llvmlite import ir
from .imputils import (lower_builtin, lower_getattr, lower_getattr_generic,
lower_cast, lower_constant, impl_ret_untracked)
from .. import typing, types, cgutils
@lower_builtin('==', types.EnumMember, types.EnumMember)
def enum_eq(context, builder, sig, args):
tu, tv = sig.args
u, v = args
res = context.generic_compare(builder, "==",
(tu.dtype, tv.dtype), (u, v))
return impl_ret_untracked(context, builder, sig.return_type, res)
@lower_builtin('is', types.EnumMember, types.EnumMember)
def enum_is(context, builder, sig, args):
tu, tv = sig.args
u, v = args
if tu == tv:
res = context.generic_compare(builder, "==",
(tu.dtype, tv.dtype), (u, v))
else:
res = context.get_constant(sig.return_type, False)
return impl_ret_untracked(context, builder, sig.return_type, res)
@lower_builtin('!=', types.EnumMember, types.EnumMember)
def enum_eq(context, builder, sig, args):
tu, tv = sig.args
u, v = args
res = context.generic_compare(builder, "!=",
(tu.dtype, tv.dtype), (u, v))
return impl_ret_untracked(context, builder, sig.return_type, res)
@lower_getattr(types.EnumMember, 'value')
def enum_value(context, builder, ty, val):
return val
@lower_cast(types.IntEnumMember, types.Integer)
def int_enum_to_int(context, builder, fromty, toty, val):
"""
Convert an IntEnum member to its raw integer value.
"""
return context.cast(builder, val, fromty.dtype, toty)
@lower_constant(types.EnumMember)
def enum_constant(context, builder, ty, pyval):
"""
Return a LLVM constant representing enum member *pyval*.
"""
return context.get_constant_generic(builder, ty.dtype, pyval.value)
@lower_getattr_generic(types.EnumClass)
def enum_class_lookup(context, builder, ty, val, attr):
"""
Return an enum member by name.
"""
member = getattr(ty.instance_class, attr)
return context.get_constant_generic(builder, ty.dtype, member.value)