Skip to content

Commit 4182d11

Browse files
authored
Don't do a py_getattr when calling a non-method attr (mypyc/mypyc#685)
1 parent 39fe615 commit 4182d11

File tree

2 files changed

+14
-13
lines changed

2 files changed

+14
-13
lines changed

mypyc/genops.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1100,7 +1100,6 @@ def handle_ext_method(self, cdef: ClassDef, fdef: FuncDef) -> None:
11001100

11011101
# Set the callable object representing the decorated method as an attribute of the
11021102
# extension class.
1103-
class_ir.attributes[name] = decorated_func.type
11041103
self.primitive_op(py_setattr_op,
11051104
[typ, self.load_static_unicode(name), decorated_func], fdef.line)
11061105

@@ -3213,6 +3212,11 @@ def gen_method_call(self,
32133212
arg_values = self.native_args_to_positional(
32143213
arg_values, arg_kinds, arg_names, decl.bound_sig, line)
32153214
return self.add(MethodCall(base, name, arg_values, line))
3215+
elif base.type.class_ir.has_attr(name):
3216+
function = self.add(GetAttr(base, name, line))
3217+
return self.py_call(function, arg_values, line,
3218+
arg_kinds=arg_kinds, arg_names=arg_names)
3219+
32163220
elif isinstance(base.type, RUnion):
32173221
return self.union_method_call(base, base.type, name, arg_values, return_rtype, line,
32183222
arg_kinds, arg_names)

test-data/genops-basic.test

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2136,16 +2136,15 @@ def DerivedProperty.next(self):
21362136
self :: DerivedProperty
21372137
r0 :: object
21382138
r1 :: int
2139-
r2 :: str
2140-
r3, r4 :: object
2139+
r2, r3, r4 :: object
21412140
r5 :: int
21422141
r6 :: DerivedProperty
21432142
L0:
21442143
r0 = self._incr_func
21452144
r1 = self.value
2146-
r2 = unicode_6 :: static ('_incr_func')
2145+
r2 = self._incr_func
21472146
r3 = box(int, r1)
2148-
r4 = py_method_call(self, r2, r3)
2147+
r4 = py_call(r2, r3)
21492148
r5 = unbox(int, r4)
21502149
r6 = DerivedProperty(r0, r5)
21512150
return r6
@@ -2170,23 +2169,21 @@ def AgainProperty.next(self):
21702169
self :: AgainProperty
21712170
r0 :: object
21722171
r1 :: int
2173-
r2 :: str
2174-
r3, r4 :: object
2172+
r2, r3, r4 :: object
21752173
r5 :: int
2176-
r6 :: str
2177-
r7, r8 :: object
2174+
r6, r7, r8 :: object
21782175
r9 :: int
21792176
r10 :: AgainProperty
21802177
L0:
21812178
r0 = self._incr_func
21822179
r1 = self.value
2183-
r2 = unicode_6 :: static ('_incr_func')
2180+
r2 = self._incr_func
21842181
r3 = box(int, r1)
2185-
r4 = py_method_call(self, r2, r3)
2182+
r4 = py_call(r2, r3)
21862183
r5 = unbox(int, r4)
2187-
r6 = unicode_6 :: static ('_incr_func')
2184+
r6 = self._incr_func
21882185
r7 = box(int, r5)
2189-
r8 = py_method_call(self, r6, r7)
2186+
r8 = py_call(r6, r7)
21902187
r9 = unbox(int, r8)
21912188
r10 = AgainProperty(r0, r9)
21922189
return r10

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy