Skip to content

Commit 24da149

Browse files
committed
added module dir builtin
1 parent 4deb7a6 commit 24da149

File tree

2 files changed

+52
-3
lines changed

2 files changed

+52
-3
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/ModuleBuiltins.java

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,11 @@
4040
*/
4141
package com.oracle.graal.python.builtins.objects.module;
4242

43-
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DICT__;
4443
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DOC__;
4544
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__LOADER__;
4645
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__NAME__;
4746
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__PACKAGE__;
4847
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__;
5148
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GETATTR__;
5249
import static com.oracle.graal.python.nodes.SpecialMethodNames.__INIT__;
5350
import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError;
@@ -57,21 +54,30 @@
5754
import com.oracle.graal.python.builtins.Builtin;
5855
import com.oracle.graal.python.builtins.CoreFunctions;
5956
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
57+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
6058
import com.oracle.graal.python.builtins.PythonBuiltins;
6159
import com.oracle.graal.python.builtins.objects.PNone;
6260
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
6361
import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes;
62+
import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes.GetDictStorageNode;
6463
import com.oracle.graal.python.builtins.objects.common.HashingStorage;
6564
import com.oracle.graal.python.builtins.objects.common.HashingStorageLibrary;
65+
import com.oracle.graal.python.builtins.objects.common.HashingStorageLibrary.HashingStorageIterator;
6666
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
6767
import com.oracle.graal.python.builtins.objects.dict.PDict;
6868
import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins;
6969
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
7070
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__;
7176
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
7277
import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
7378
import com.oracle.graal.python.nodes.builtins.ListNodes;
7479
import com.oracle.graal.python.nodes.call.CallNode;
80+
import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode;
7581
import com.oracle.graal.python.nodes.expression.CoerceToBooleanNode;
7682
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
7783
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
@@ -83,6 +89,7 @@
8389
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
8490
import com.oracle.graal.python.runtime.exception.PException;
8591
import com.oracle.truffle.api.CompilerDirectives;
92+
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
8693
import com.oracle.truffle.api.dsl.Cached;
8794
import com.oracle.truffle.api.dsl.Fallback;
8895
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
@@ -222,6 +229,46 @@ Object raise(Object self, @SuppressWarnings("unused") Object dict) {
222229
}
223230
}
224231

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+
225272
@Builtin(name = __GETATTRIBUTE__, minNumOfPositionalArgs = 2)
226273
@GenerateNodeFactory
227274
public abstract static class ModuleGetattritbuteNode extends PythonBinaryBuiltinNode {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/ErrorMessages.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ public abstract class ErrorMessages {
139139
public static final String CANNOT_SPECIFY_MEM_LIMIT = "Cannot specify memory limit with FORMAT_RAW";
140140
public static final String CANNOT_SPECIFY_PREST_AND_FILTER_CHAIN = "Cannot specify both preset and filter chain";
141141
public static final String CANNOT_USE_TO_INITIALIZE_ARRAY = "cannot use a %p to initialize an array with typecode '%s'";
142+
public static final String CANT_APPLY_THIS_S_TO_P_OBJECT = "can't apply this %s to %p object";
142143
public static final String CANT_CONCAT_S_TO_P = "can't concat %s to %p";
143144
public static final String CANT_CONVERT_TO_FLOAT = "can't convert %s to float";
144145
public static final String CANT_CONVERT_TO_STR_EXPLICITELY = "Can't convert '%p' object to str implicitly";
@@ -298,6 +299,7 @@ public abstract class ErrorMessages {
298299
public static final String INVALID_SYNTAX = "invalid syntax";
299300
public static final String INVALID_USE_OF_W_FORMAT_CHAR = "invalid use of 'w' format character";
300301
public static final String IS_EMPTY = "%s is empty";
302+
public static final String IS_NOT_A_DICTIONARY = "%s is not a dictionary";
301303
public static final String IS_NOT_IN_RANGE = "%s is not in range";
302304
public static final String IS_NOT_A = "%s is not a %s";
303305
public static final String D_IS_NOT_IN_RANGE = "%d is not in range";

0 commit comments

Comments
 (0)