Skip to content

Commit 917a300

Browse files
committed
get attributes from the object __dict__ (if set)
1 parent e3178ab commit 917a300

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_object.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,5 @@ class MyClass(object):
6666
assert m.__dict__ == {}
6767
m.__dict__ = {'a': 10}
6868
assert m.__dict__ == {'a': 10}
69+
assert m.a == 10
70+

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/ObjectBuiltins.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import com.oracle.graal.python.builtins.objects.PNone;
5858
import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass;
5959
import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject;
60+
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes;
6061
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
6162
import com.oracle.graal.python.builtins.objects.dict.PDict;
6263
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
@@ -401,6 +402,19 @@ private LazyPythonClass getDataClass(Object descr) {
401402
@Builtin(name = SpecialMethodNames.__GETATTR__, fixedNumOfPositionalArgs = 2)
402403
@GenerateNodeFactory
403404
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+
404418
@Specialization
405419
Object getattr(Object object, Object key) {
406420
throw raise(AttributeError, "'%p' object has no attribute %s", object, key);
@@ -489,7 +503,7 @@ Object dict(PythonClass self, PNone none) {
489503
throw new AssertionError();
490504
}
491505

492-
@Specialization(guards = {"!isBuiltinObject(self)", "!isClass(self)", "!isExactObjectInstance(self)"})
506+
@Specialization(guards = {"!isBuiltinObject(self)", "!isClass(self)", "!isExactObjectInstance(self)", "isNoValue(none)"})
493507
Object dict(PythonObject self, @SuppressWarnings("unused") PNone none) {
494508
PHashingCollection dict = self.getDict();
495509
if (dict == null) {

0 commit comments

Comments
 (0)