Skip to content

Commit 259b4f5

Browse files
committed
Make tests for SimpleNamespace pass
1 parent 24b9235 commit 259b4f5

File tree

3 files changed

+53
-14
lines changed

3 files changed

+53
-14
lines changed

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_types.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,19 @@
2727
*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_iterators
2828
*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_len
2929
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_as_dict
30+
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_attrdel
31+
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_attrget
32+
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_attrset
33+
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_constructor
34+
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_equal
3035
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_fake_namespace_compare
36+
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_nested
37+
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_pickle
3138
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_recursive
39+
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_repr
40+
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_subclass
41+
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_unbound
42+
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_underlying_dict
3243
*graalpython.lib-python.3.test.test_types.TypesTests.test_boolean_ops
3344
*graalpython.lib-python.3.test.test_types.TypesTests.test_comparisons
3445
*graalpython.lib-python.3.test.test_types.TypesTests.test_float__format__

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalPythonModuleBuiltins.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,17 @@
6565
import com.oracle.graal.python.builtins.objects.method.PMethod;
6666
import com.oracle.graal.python.builtins.objects.module.PythonModule;
6767
import com.oracle.graal.python.builtins.objects.object.PythonObject;
68+
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
6869
import com.oracle.graal.python.nodes.ErrorMessages;
6970
import com.oracle.graal.python.nodes.argument.ReadIndexedArgumentNode;
7071
import com.oracle.graal.python.nodes.argument.ReadVarArgsNode;
7172
import com.oracle.graal.python.nodes.function.FunctionRootNode;
7273
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
7374
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
75+
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
7476
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
7577
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
78+
import com.oracle.graal.python.nodes.object.GetClassNode;
7679
import com.oracle.graal.python.nodes.subscript.GetItemNode;
7780
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
7881
import com.oracle.graal.python.nodes.util.CannotCastException;
@@ -456,4 +459,29 @@ protected Object getToolPath(String tool) {
456459
return toolPath.toString();
457460
}
458461
}
462+
463+
// Equivalent of PyType_IsSubtype
464+
@Builtin(name = "is_subtype", minNumOfPositionalArgs = 2)
465+
@GenerateNodeFactory
466+
public abstract static class IsSubtypeNode extends PythonBinaryBuiltinNode {
467+
@Specialization
468+
public boolean isSubtype(VirtualFrame frame, Object derived, Object cls,
469+
@Cached com.oracle.graal.python.nodes.classes.IsSubtypeNode isSubtypeNode) {
470+
return isSubtypeNode.execute(frame, derived, cls);
471+
}
472+
}
473+
474+
// Equivalent of PyObject_TypeCheck
475+
@Builtin(name = "type_check", minNumOfPositionalArgs = 2)
476+
@GenerateNodeFactory
477+
public abstract static class TypeCheckNode extends PythonBinaryBuiltinNode {
478+
@Specialization(limit = "3")
479+
boolean typeCheck(VirtualFrame frame, Object instance, Object cls,
480+
@Cached GetClassNode getClassNode,
481+
@Cached TypeNodes.IsSameTypeNode isSameTypeNode,
482+
@Cached com.oracle.graal.python.nodes.classes.IsSubtypeNode isSubtypeNode) {
483+
Object instanceClass = getClassNode.execute(instance);
484+
return isSameTypeNode.execute(instanceClass, cls) || isSubtypeNode.execute(frame, instanceClass, cls);
485+
}
486+
}
459487
}

graalpython/lib-graalpython/_descriptor.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -77,20 +77,20 @@ def func(self):
7777

7878
class SimpleNamespace(object):
7979
def __init__(self, **kwargs):
80-
object.__setattr__(self, "__ns__", kwargs)
81-
82-
def __delattr__(self, name):
83-
object.__getattribute__(self, "__ns__").__delitem__(name)
84-
85-
def __getattr__(self, name):
86-
return object.__getattribute__(self, "__ns__")[name]
87-
88-
def __setattr__(self, name, value):
89-
object.__getattribute__(self, "__ns__")[name] = value
80+
for k, v in kwargs.items():
81+
setattr(self, k, v)
9082

9183
def __repr__(self):
9284
sb = []
93-
ns = object.__getattribute__(self, "__ns__")
94-
for k,v in ns.items():
95-
sb.append("%s='%s'" % (k,v))
96-
return "namespace(%s)" % ", ".join(sb)
85+
for k, v in sorted(self.__dict__.items()):
86+
sb.append("%s=%r" % (k, v))
87+
name = 'namespace' if type(self) is SimpleNamespace else type(self).__name__
88+
return "%s(%s)" % (name, ", ".join(sb))
89+
90+
def __reduce__(self):
91+
return type(self), (), self.__dict__
92+
93+
def __eq__(self, other):
94+
if __graalpython__.type_check(self, SimpleNamespace) and __graalpython__.type_check(other, SimpleNamespace):
95+
return self.__dict__ == other.__dict__
96+
return NotImplemented

0 commit comments

Comments
 (0)