|
40 | 40 | */
|
41 | 41 | package com.oracle.graal.python.builtins.objects.module;
|
42 | 42 |
|
43 |
| -import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DICT__; |
44 | 43 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DOC__;
|
45 | 44 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__LOADER__;
|
46 | 45 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__NAME__;
|
47 | 46 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__PACKAGE__;
|
48 | 47 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__SPEC__;
|
49 |
| -import static com.oracle.graal.python.nodes.SpecialMethodNames.__DIR__; |
50 |
| -import static com.oracle.graal.python.nodes.SpecialMethodNames.__GETATTRIBUTE__; |
51 | 48 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__GETATTR__;
|
52 | 49 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__INIT__;
|
53 | 50 | import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError;
|
|
57 | 54 | import com.oracle.graal.python.builtins.Builtin;
|
58 | 55 | import com.oracle.graal.python.builtins.CoreFunctions;
|
59 | 56 | import com.oracle.graal.python.builtins.PythonBuiltinClassType;
|
| 57 | +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; |
60 | 58 | import com.oracle.graal.python.builtins.PythonBuiltins;
|
61 | 59 | import com.oracle.graal.python.builtins.objects.PNone;
|
62 | 60 | import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
|
63 | 61 | import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes;
|
| 62 | +import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes.GetDictStorageNode; |
64 | 63 | import com.oracle.graal.python.builtins.objects.common.HashingStorage;
|
65 | 64 | import com.oracle.graal.python.builtins.objects.common.HashingStorageLibrary;
|
| 65 | +import com.oracle.graal.python.builtins.objects.common.HashingStorageLibrary.HashingStorageIterator; |
66 | 66 | import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
|
67 | 67 | import com.oracle.graal.python.builtins.objects.dict.PDict;
|
68 | 68 | import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins;
|
69 | 69 | import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
|
70 | 70 | import com.oracle.graal.python.nodes.ErrorMessages;
|
| 71 | +import com.oracle.graal.python.nodes.PRaiseNode; |
| 72 | +import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DICT__; |
| 73 | +import static com.oracle.graal.python.nodes.SpecialMethodNames.SORT; |
| 74 | +import static com.oracle.graal.python.nodes.SpecialMethodNames.__DIR__; |
| 75 | +import static com.oracle.graal.python.nodes.SpecialMethodNames.__GETATTRIBUTE__; |
71 | 76 | import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
|
72 | 77 | import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
|
73 | 78 | import com.oracle.graal.python.nodes.builtins.ListNodes;
|
74 | 79 | import com.oracle.graal.python.nodes.call.CallNode;
|
| 80 | +import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode; |
75 | 81 | import com.oracle.graal.python.nodes.expression.CoerceToBooleanNode;
|
76 | 82 | import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
|
77 | 83 | import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
|
|
83 | 89 | import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
|
84 | 90 | import com.oracle.graal.python.runtime.exception.PException;
|
85 | 91 | import com.oracle.truffle.api.CompilerDirectives;
|
| 92 | +import com.oracle.graal.python.runtime.object.PythonObjectFactory; |
86 | 93 | import com.oracle.truffle.api.dsl.Cached;
|
87 | 94 | import com.oracle.truffle.api.dsl.Fallback;
|
88 | 95 | import com.oracle.truffle.api.dsl.GenerateNodeFactory;
|
@@ -222,6 +229,46 @@ Object raise(Object self, @SuppressWarnings("unused") Object dict) {
|
222 | 229 | }
|
223 | 230 | }
|
224 | 231 |
|
| 232 | + @Builtin(name = __DIR__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 1) |
| 233 | + @GenerateNodeFactory |
| 234 | + @TypeSystemReference(PythonArithmeticTypes.class) |
| 235 | + public abstract static class DirNode extends PythonBuiltinNode { |
| 236 | + @Specialization |
| 237 | + public Object module(VirtualFrame frame, PythonModule self, |
| 238 | + @Cached("create(__GETATTRIBUTE__)") LookupAndCallBinaryNode getDictNode, |
| 239 | + @Cached("create(__GETATTRIBUTE__)") LookupAndCallBinaryNode getSortNode, |
| 240 | + @Cached CallNode callDirNode, |
| 241 | + @Cached CallNode callSortNode, |
| 242 | + @Cached GetDictStorageNode getDictStorageNode, |
| 243 | + @CachedLibrary(limit = "1") HashingStorageLibrary lib, |
| 244 | + @Cached PRaiseNode raiseNode) { |
| 245 | + Object dict = getDictNode.executeObject(frame, self, __DICT__); |
| 246 | + Object res; |
| 247 | + if (dict instanceof PDict) { |
| 248 | + Object dir = HashingStorageLibrary.getUncached().getItem(getDictStorageNode.execute((PHashingCollection) dict), __DIR__); |
| 249 | + if (dir != null && dir != PNone.NO_VALUE) { |
| 250 | + res = callDirNode.execute(dir); |
| 251 | + } else { |
| 252 | + HashingStorage storage = getDictStorageNode.execute((PHashingCollection) dict); |
| 253 | + HashingStorageIterator<Object> keys = lib.keys(storage).iterator(); |
| 254 | + int len = lib.length(storage); |
| 255 | + Object[] a = new Object[len]; |
| 256 | + for (int i = 0; keys.hasNext(); i++) { |
| 257 | + a[i] = keys.next(); |
| 258 | + } |
| 259 | + res = PythonObjectFactory.getUncached().createList(a); |
| 260 | + } |
| 261 | + } else { |
| 262 | + throw raiseNode.raise(TypeError, ErrorMessages.IS_NOT_A_DICTIONARY, self); |
| 263 | + } |
| 264 | + Object sort = getSortNode.executeObject(frame, res, SORT); |
| 265 | + if (sort != PNone.NO_VALUE) { |
| 266 | + callSortNode.execute(sort); |
| 267 | + } |
| 268 | + return res; |
| 269 | + } |
| 270 | + } |
| 271 | + |
225 | 272 | @Builtin(name = __GETATTRIBUTE__, minNumOfPositionalArgs = 2)
|
226 | 273 | @GenerateNodeFactory
|
227 | 274 | public abstract static class ModuleGetattritbuteNode extends PythonBinaryBuiltinNode {
|
|
0 commit comments