Skip to content

Commit 7388d1b

Browse files
author
Stefan Anzinger
committed
[GR-23249] Get test_module to pass.
PullRequest: graalpython/1140
2 parents 23920c6 + 6ec5af3 commit 7388d1b

File tree

15 files changed

+309
-92
lines changed

15 files changed

+309
-92
lines changed

graalpython/com.oracle.graal.python.test/src/graalpytest.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -579,8 +579,7 @@ def find_conftest(test_module_path):
579579
return join(test_module_dir, "conftest.py")
580580
return None
581581

582-
@staticmethod
583-
def load_module(path):
582+
def load_module(self, path):
584583
name = path.rpartition("/")[2].partition(".")[0].replace('.py', '')
585584
directory = path.rpartition("/")[0]
586585
pkg = []
@@ -621,10 +620,10 @@ def load_module(path):
621620

622621
def test_modules(self):
623622
for testfile in self.testfiles:
624-
yield TestRunner.load_module(testfile)
623+
yield self.load_module(testfile)
625624

626625
def load_conftest(self, testfile):
627-
TestRunner.load_module(testfile)
626+
self.load_module(testfile)
628627

629628
def run(self):
630629
# eval session scope
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,30 @@
1+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_ascii_docstring
2+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_clear_dict_in_ref_cycle
13
*graalpython.lib-python.3.test.test_module.ModuleTests.test_descriptor_errors_propagate
24
*graalpython.lib-python.3.test.test_module.ModuleTests.test_dont_clear_dict
35
*graalpython.lib-python.3.test.test_module.ModuleTests.test_missing_getattr
6+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_dir
7+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_dir_errors
8+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_finalization_at_shutdown
49
*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_getattr
510
*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_getattr_errors
611
*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_getattr_tricky
12+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_builtin
13+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_minimal
14+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_source
15+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_bare_loader
16+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_bare_loader_and_filename
17+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_bare_loader_but_no_name
18+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_filename_only
19+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_full_loader
20+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_full_loader_and_filename
21+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_full_loader_but_no_name
22+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_loader_as_None
23+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_name
24+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_name_and_filename
725
*graalpython.lib-python.3.test.test_module.ModuleTests.test_no_docstring
26+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_reinit
27+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_unicode_docstring
28+
*graalpython.lib-python.3.test.test_module.ModuleTests.test_uninitialized
829
*graalpython.lib-python.3.test.test_module.ModuleTests.test_uninitialized_missing_getattr
930
*graalpython.lib-python.3.test.test_module.ModuleTests.test_weakref

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2342,6 +2342,7 @@ private PythonClass typeMetaclass(VirtualFrame frame, String name, PTuple bases,
23422342
// copy the dictionary slots over, as CPython does through PyDict_Copy
23432343
// Also check for a __slots__ sequence variable in dict
23442344
Object slots = null;
2345+
boolean qualnameSet = false;
23452346
for (DictEntry entry : nslib.entries(namespace.getDictStorage())) {
23462347
Object key = entry.getKey();
23472348
Object value = entry.getValue();
@@ -2380,11 +2381,22 @@ private PythonClass typeMetaclass(VirtualFrame frame, String name, PTuple bases,
23802381
}
23812382
}
23822383
pythonClass.setAttribute(key, value);
2384+
} else if (SpecialAttributeNames.__QUALNAME__.equals(key)) {
2385+
try {
2386+
pythonClass.setQualName(ensureCastToStringNode().execute(value));
2387+
qualnameSet = true;
2388+
} catch (CannotCastException e) {
2389+
throw raise(PythonBuiltinClassType.TypeError, ErrorMessages.MUST_BE_S_NOT_P, "type __qualname__", "str", value);
2390+
}
23832391
} else {
23842392
pythonClass.setAttribute(key, value);
23852393
}
23862394
}
23872395

2396+
if (!qualnameSet) {
2397+
pythonClass.setQualName(name);
2398+
}
2399+
23882400
// CPython masks the __hash__ method with None when __eq__ is overriden, but __hash__ is
23892401
// not
23902402
Object hashMethod = nslib.getItem(namespace.getDictStorage(), __HASH__);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/MethodBuiltins.java

Lines changed: 74 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DICT__;
3232
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__FUNC__;
3333
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__KWDEFAULTS__;
34+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__NAME__;
35+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__QUALNAME__;
3436
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GETATTRIBUTE__;
3537
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GET__;
3638
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REDUCE__;
@@ -44,22 +46,24 @@
4446
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4547
import com.oracle.graal.python.builtins.PythonBuiltins;
4648
import com.oracle.graal.python.builtins.objects.PNone;
47-
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
4849
import com.oracle.graal.python.builtins.objects.function.PKeyword;
50+
import com.oracle.graal.python.builtins.objects.module.PythonModule;
4951
import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins;
5052
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
51-
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode;
53+
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
5254
import com.oracle.graal.python.nodes.ErrorMessages;
53-
import com.oracle.graal.python.nodes.SpecialAttributeNames;
5455
import com.oracle.graal.python.nodes.attributes.GetAttributeNode;
5556
import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetDefaultsNode;
5657
import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetKeywordDefaultsNode;
5758
import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode;
59+
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
5860
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5961
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
6062
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
6163
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
6264
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
65+
import com.oracle.graal.python.nodes.util.CannotCastException;
66+
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
6367
import com.oracle.graal.python.runtime.exception.PException;
6468
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
6569
import com.oracle.truffle.api.dsl.Cached;
@@ -130,23 +134,31 @@ protected Object doIt(VirtualFrame frame, PMethod self, Object key,
130134
@Builtin(name = __REPR__, minNumOfPositionalArgs = 1)
131135
@GenerateNodeFactory
132136
public abstract static class ReprNode extends PythonUnaryBuiltinNode {
133-
@Specialization(limit = "3")
134-
Object reprMethod(VirtualFrame frame, PMethod self,
135-
@CachedLibrary("self.getSelf()") PythonObjectLibrary lib,
136-
@Cached("createGetAttributeNode()") GetAttributeNode getNameAttrNode,
137-
@Cached GetNameNode getTypeNameNode) {
138-
String typeName = getTypeNameNode.execute(lib.getLazyPythonClass(self.getSelf()));
139-
return strFormat("<bound method %s of %s object at 0x%x>", getNameAttrNode.executeObject(frame, self.getFunction()), typeName, PythonAbstractObject.systemHashCode(self.getSelf()));
137+
@Specialization
138+
Object reprMethod(VirtualFrame frame, PMethod method,
139+
@Cached("create(__REPR__)") LookupAndCallUnaryNode callReprNode,
140+
@Cached CastToJavaStringNode toJavaStringNode,
141+
@CachedLibrary(limit = "1") PythonObjectLibrary pol) {
142+
Object self = method.getSelf();
143+
Object func = method.getFunction();
144+
String defname = "?";
145+
146+
Object funcName = pol.lookupAttribute(func, __QUALNAME__);
147+
if (funcName == PNone.NO_VALUE) {
148+
funcName = pol.lookupAttribute(func, __NAME__);
149+
}
150+
151+
try {
152+
return strFormat("<bound method %s of %s>", toJavaStringNode.execute(funcName), callReprNode.executeObject(frame, self));
153+
} catch (CannotCastException e) {
154+
return strFormat("<bound method %s of %s>", defname, callReprNode.executeObject(frame, self));
155+
}
140156
}
141157

142158
@TruffleBoundary
143159
private static String strFormat(String fmt, Object... objects) {
144160
return String.format(fmt, objects);
145161
}
146-
147-
protected static GetAttributeNode createGetAttributeNode() {
148-
return GetAttributeNode.create(SpecialAttributeNames.__QUALNAME__, null);
149-
}
150162
}
151163

152164
@Builtin(name = __DEFAULTS__, minNumOfPositionalArgs = 1, isGetter = true)
@@ -194,4 +206,52 @@ PMethod doGeneric(@SuppressWarnings("unused") PMethod self, Object obj, @Suppres
194206
return factory().createMethod(obj, self.getFunction());
195207
}
196208
}
209+
210+
@Builtin(name = __NAME__, minNumOfPositionalArgs = 1, isGetter = true)
211+
@GenerateNodeFactory
212+
public abstract static class MethodName extends PythonUnaryBuiltinNode {
213+
@Specialization
214+
Object getName(VirtualFrame frame, PMethod method,
215+
@Cached("create(__NAME__)") GetAttributeNode getNameAttrNode) {
216+
return getNameAttrNode.executeObject(frame, method.getFunction());
217+
}
218+
}
219+
220+
@Builtin(name = __QUALNAME__, minNumOfPositionalArgs = 1, isGetter = true)
221+
@GenerateNodeFactory
222+
public abstract static class MethodQualName extends PythonUnaryBuiltinNode {
223+
@Specialization(limit = "3")
224+
Object getQualName(VirtualFrame frame, PMethod method,
225+
@Cached("create(__NAME__)") GetAttributeNode getNameAttrNode,
226+
@Cached("create(__QUALNAME__)") GetAttributeNode getQualNameAttrNode,
227+
@Cached TypeNodes.IsTypeNode isTypeNode,
228+
@Cached CastToJavaStringNode castToJavaStringNode,
229+
@CachedLibrary("method.getSelf()") PythonObjectLibrary pol) {
230+
Object self = method.getSelf();
231+
String methodName;
232+
try {
233+
methodName = castToJavaStringNode.execute(getNameAttrNode.executeObject(frame, method));
234+
} catch (CannotCastException e) {
235+
throw raise(PythonBuiltinClassType.TypeError, ErrorMessages.IS_NOT_A, __NAME__, "unicode object");
236+
}
237+
if (self == null || self instanceof PythonModule) {
238+
return methodName;
239+
}
240+
241+
Object type = isTypeNode.execute(self) ? self : pol.getLazyPythonClass(self);
242+
String typeQualName;
243+
try {
244+
typeQualName = castToJavaStringNode.execute(getQualNameAttrNode.executeObject(frame, type));
245+
} catch (CannotCastException e) {
246+
throw raise(PythonBuiltinClassType.TypeError, ErrorMessages.IS_NOT_A, __QUALNAME__, "unicode object");
247+
}
248+
249+
return getQualNameGeneric(typeQualName, methodName);
250+
}
251+
252+
@TruffleBoundary
253+
private static Object getQualNameGeneric(String typeQualName, String name) {
254+
return String.format("%s.%s", typeQualName, name);
255+
}
256+
}
197257
}

0 commit comments

Comments
 (0)