|
57 | 57 | import com.oracle.graal.python.builtins.objects.PNone;
|
58 | 58 | import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass;
|
59 | 59 | import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject;
|
| 60 | +import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes; |
60 | 61 | import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
|
61 | 62 | import com.oracle.graal.python.builtins.objects.dict.PDict;
|
62 | 63 | import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
|
@@ -401,6 +402,19 @@ private LazyPythonClass getDataClass(Object descr) {
|
401 | 402 | @Builtin(name = SpecialMethodNames.__GETATTR__, fixedNumOfPositionalArgs = 2)
|
402 | 403 | @GenerateNodeFactory
|
403 | 404 | public abstract static class GetattrNode extends PythonBinaryBuiltinNode {
|
| 405 | + @Specialization |
| 406 | + Object getattr(PythonObject object, Object key, |
| 407 | + @Cached("create()") HashingStorageNodes.GetItemNode getItemNode) { |
| 408 | + PHashingCollection dict = object.getDict(); |
| 409 | + if (dict != null) { |
| 410 | + Object value = getItemNode.execute(dict.getDictStorage(), key); |
| 411 | + if (value != null) { |
| 412 | + return value; |
| 413 | + } |
| 414 | + } |
| 415 | + throw raise(AttributeError, "'%p' object has no attribute %s", object, key); |
| 416 | + } |
| 417 | + |
404 | 418 | @Specialization
|
405 | 419 | Object getattr(Object object, Object key) {
|
406 | 420 | throw raise(AttributeError, "'%p' object has no attribute %s", object, key);
|
@@ -489,7 +503,7 @@ Object dict(PythonClass self, PNone none) {
|
489 | 503 | throw new AssertionError();
|
490 | 504 | }
|
491 | 505 |
|
492 |
| - @Specialization(guards = {"!isBuiltinObject(self)", "!isClass(self)", "!isExactObjectInstance(self)"}) |
| 506 | + @Specialization(guards = {"!isBuiltinObject(self)", "!isClass(self)", "!isExactObjectInstance(self)", "isNoValue(none)"}) |
493 | 507 | Object dict(PythonObject self, @SuppressWarnings("unused") PNone none) {
|
494 | 508 | PHashingCollection dict = self.getDict();
|
495 | 509 | if (dict == null) {
|
|
0 commit comments