|
51 | 51 | import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; |
52 | 52 | import com.oracle.graal.python.builtins.objects.function.PFunction; |
53 | 53 | import com.oracle.graal.python.builtins.objects.function.PKeyword; |
54 | | -import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins; |
| 54 | +import com.oracle.graal.python.builtins.objects.str.StringNodes; |
55 | 55 | import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; |
56 | 56 | import com.oracle.graal.python.builtins.objects.type.TpSlots; |
| 57 | +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; |
| 58 | +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.CallSlotDescrGet; |
57 | 59 | import com.oracle.graal.python.builtins.objects.type.slots.TpSlotGetAttr.GetAttrBuiltinNode; |
58 | 60 | import com.oracle.graal.python.lib.PyCallableCheckNode; |
59 | 61 | import com.oracle.graal.python.lib.PyObjectGetAttr; |
|
62 | 64 | import com.oracle.graal.python.nodes.ErrorMessages; |
63 | 65 | import com.oracle.graal.python.nodes.PGuards; |
64 | 66 | import com.oracle.graal.python.nodes.PRaiseNode; |
| 67 | +import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode; |
65 | 68 | import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetDefaultsNode; |
66 | 69 | import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetKeywordDefaultsNode; |
67 | 70 | import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; |
68 | 71 | import com.oracle.graal.python.nodes.function.PythonBuiltinNode; |
69 | 72 | import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; |
70 | 73 | import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; |
71 | | -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; |
| 74 | +import com.oracle.graal.python.nodes.object.GetClassNode; |
72 | 75 | import com.oracle.graal.python.nodes.object.GetOrCreateDictNode; |
73 | 76 | import com.oracle.graal.python.nodes.util.CannotCastException; |
74 | 77 | import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; |
75 | | -import com.oracle.graal.python.runtime.exception.PException; |
76 | 78 | import com.oracle.graal.python.runtime.object.PFactory; |
77 | 79 | import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; |
78 | 80 | import com.oracle.truffle.api.dsl.Bind; |
@@ -162,25 +164,22 @@ public abstract static class GetattributeNode extends GetAttrBuiltinNode { |
162 | 164 | @Specialization |
163 | 165 | static Object doIt(VirtualFrame frame, PMethod self, Object keyObj, |
164 | 166 | @Bind Node inliningTarget, |
165 | | - @Cached ObjectBuiltins.GetAttributeNode objectGetattrNode, |
166 | | - @Cached IsBuiltinObjectProfile errorProfile, |
167 | | - @Cached CastToTruffleStringNode castKeyToStringNode, |
168 | | - @Cached PRaiseNode raiseNode) { |
169 | | - // TODO: (GR-53090) this is different to what CPython does and CPython also does not |
170 | | - // define tp_descrget for method |
171 | | - TruffleString key; |
172 | | - try { |
173 | | - key = castKeyToStringNode.execute(inliningTarget, keyObj); |
174 | | - } catch (CannotCastException e) { |
175 | | - throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ATTR_NAME_MUST_BE_STRING, keyObj); |
176 | | - } |
177 | | - |
178 | | - try { |
179 | | - return objectGetattrNode.execute(frame, self, key); |
180 | | - } catch (PException e) { |
181 | | - e.expectAttributeError(inliningTarget, errorProfile); |
182 | | - return objectGetattrNode.execute(frame, self.getFunction(), key); |
| 167 | + @Cached StringNodes.CastToTruffleStringChecked1Node castToString, |
| 168 | + @Cached GetClassNode.GetPythonObjectClassNode getClassNode, |
| 169 | + @Cached LookupAttributeInMRONode.Dynamic lookup, |
| 170 | + @Cached GetObjectSlotsNode getDescrSlotsNode, |
| 171 | + @Cached CallSlotDescrGet callSlotDescrGet, |
| 172 | + @Cached PyObjectGetAttr getAttrNode) { |
| 173 | + TruffleString key = castToString.cast(inliningTarget, keyObj, ErrorMessages.ATTR_NAME_MUST_BE_STRING, keyObj); |
| 174 | + Object type = getClassNode.execute(inliningTarget, self); |
| 175 | + Object descr = lookup.execute(type, key); |
| 176 | + if (!PGuards.isNoValue(descr)) { |
| 177 | + TpSlots descrSlots = getDescrSlotsNode.execute(inliningTarget, descr); |
| 178 | + if (descrSlots.tp_descr_get() != null) { |
| 179 | + return callSlotDescrGet.execute(frame, inliningTarget, descrSlots.tp_descr_get(), descr, self, type); |
| 180 | + } |
183 | 181 | } |
| 182 | + return getAttrNode.execute(frame, inliningTarget, self.function, key); |
184 | 183 | } |
185 | 184 |
|
186 | 185 | @Specialization(guards = "!isPMethod(self)") |
|
0 commit comments