Skip to content

Commit a74315a

Browse files
committed
[GR-33592] Intrinsify _collections.
PullRequest: graalpython/1968
2 parents bfdba59 + 9b80551 commit a74315a

File tree

16 files changed

+598
-106
lines changed

16 files changed

+598
-106
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@
166166
import com.oracle.graal.python.builtins.objects.complex.ComplexBuiltins;
167167
import com.oracle.graal.python.builtins.objects.deque.DequeBuiltins;
168168
import com.oracle.graal.python.builtins.objects.deque.DequeIterBuiltins;
169+
import com.oracle.graal.python.builtins.objects.dict.DefaultDictBuiltins;
169170
import com.oracle.graal.python.builtins.objects.dict.DictBuiltins;
170171
import com.oracle.graal.python.builtins.objects.dict.DictReprBuiltin;
171172
import com.oracle.graal.python.builtins.objects.dict.DictValuesBuiltins;
@@ -238,6 +239,7 @@
238239
import com.oracle.graal.python.builtins.objects.thread.ThreadLocalBuiltins;
239240
import com.oracle.graal.python.builtins.objects.traceback.TracebackBuiltins;
240241
import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltins;
242+
import com.oracle.graal.python.builtins.objects.tuple.TupleGetterBuiltins;
241243
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
242244
import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot;
243245
import com.oracle.graal.python.builtins.objects.type.TypeBuiltins;
@@ -302,7 +304,6 @@ private static String[] initializeCoreFiles() {
302304
"faulthandler",
303305
"base_exception",
304306
PythonCextBuiltins.PYTHON_CEXT,
305-
"_collections",
306307
"bytes",
307308
"bytearray",
308309
"time",
@@ -462,6 +463,8 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed)
462463
new DequeBuiltins(),
463464
new DequeIterBuiltins(),
464465
new CollectionsModuleBuiltins(),
466+
new DefaultDictBuiltins(),
467+
new TupleGetterBuiltins(),
465468
new JavaModuleBuiltins(),
466469
new JArrayModuleBuiltins(),
467470
new JSONModuleBuiltins(),
@@ -815,7 +818,7 @@ private void initializeTypes() {
815818
}
816819
// publish builtin types in the corresponding modules
817820
for (PythonBuiltinClassType builtinClass : PythonBuiltinClassType.VALUES) {
818-
String module = builtinClass.getPublicInModule();
821+
String module = builtinClass.getPublishInModule();
819822
if (module != null) {
820823
PythonModule pythonModule = lookupBuiltinModule(module);
821824
if (pythonModule != null) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltinClassType.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
package com.oracle.graal.python.builtins;
2727

2828
import static com.oracle.graal.python.nodes.BuiltinNames.BUILTINS;
29+
import static com.oracle.graal.python.nodes.BuiltinNames.DEFAULTDICT;
2930
import static com.oracle.graal.python.nodes.BuiltinNames.DEQUE;
3031
import static com.oracle.graal.python.nodes.BuiltinNames.DEQUE_ITER;
3132
import static com.oracle.graal.python.nodes.BuiltinNames.DEQUE_REV_ITER;
@@ -42,6 +43,7 @@
4243
import static com.oracle.graal.python.nodes.BuiltinNames.MEMBER_DESCRIPTOR;
4344
import static com.oracle.graal.python.nodes.BuiltinNames.PROPERTY;
4445
import static com.oracle.graal.python.nodes.BuiltinNames.SIMPLE_QUEUE;
46+
import static com.oracle.graal.python.nodes.BuiltinNames.TUPLE_GETTER;
4547
import static com.oracle.graal.python.nodes.BuiltinNames.WRAPPER_DESCRIPTOR;
4648

4749
import java.util.Arrays;
@@ -95,7 +97,9 @@ public enum PythonBuiltinClassType implements TruffleObject {
9597
PByteArray("bytearray", BUILTINS),
9698
PBytes("bytes", BUILTINS),
9799
PCell("cell", Flags.PRIVATE_DERIVED_WODICT),
100+
PDefaultDict(DEFAULTDICT, "_collections", "collections", Flags.PUBLIC_BASE_WODICT),
98101
PDeque(DEQUE, "_collections", Flags.PUBLIC_BASE_WODICT),
102+
PTupleGetter(TUPLE_GETTER, "_collections", Flags.PUBLIC_BASE_WODICT),
99103
PDequeIter(DEQUE_ITER, "_collections", Flags.PUBLIC_DERIVED_WODICT),
100104
PDequeRevIter(DEQUE_REV_ITER, "_collections", Flags.PUBLIC_DERIVED_WODICT),
101105
PComplex("complex", BUILTINS),
@@ -368,7 +372,8 @@ private static class Flags {
368372
}
369373

370374
private final String name;
371-
private final String publicInModule;
375+
private final String publishInModule;
376+
private final String moduleName;
372377
// This is the name qualified by module used for printing. But the actual __qualname__ is just
373378
// plain name without module
374379
private final String printName;
@@ -395,10 +400,15 @@ private static class Flags {
395400
private Object[] specialMethodSlots;
396401

397402
PythonBuiltinClassType(String name, String module, Flags flags) {
403+
this(name, module, module, flags);
404+
}
405+
406+
PythonBuiltinClassType(String name, String publishInModule, String moduleName, Flags flags) {
398407
this.name = name;
399-
this.publicInModule = flags.isPublic ? module : null;
400-
if (module != null && module != BUILTINS) {
401-
printName = module + "." + name;
408+
this.publishInModule = publishInModule;
409+
this.moduleName = flags.isPublic ? moduleName : null;
410+
if (publishInModule != null && publishInModule != BUILTINS) {
411+
printName = moduleName + "." + name;
402412
} else {
403413
printName = name;
404414
}
@@ -443,8 +453,12 @@ public boolean isBuiltinWithDict() {
443453
return isBuiltinWithDict;
444454
}
445455

446-
public String getPublicInModule() {
447-
return publicInModule;
456+
public String getPublishInModule() {
457+
return publishInModule;
458+
}
459+
460+
public String getModuleName() {
461+
return moduleName;
448462
}
449463

450464
/**
@@ -631,6 +645,7 @@ public final Shape getInstanceShape(PythonLanguage lang) {
631645
PHashInfo.base = PTuple;
632646
PThreadInfo.base = PTuple;
633647
PUnraisableHookArgs.base = PTuple;
648+
PDefaultDict.base = PDict;
634649

635650
PArrayIterator.type = PythonClass;
636651
PSocket.type = PythonClass;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltins.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import com.oracle.graal.python.builtins.objects.PNone;
3838
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
3939
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
40+
import com.oracle.graal.python.nodes.PGuards;
4041
import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode;
4142
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4243
import com.oracle.graal.python.util.BiConsumer;
@@ -94,7 +95,10 @@ public void initialize(Python3Core core) {
9495
PBuiltinFunction newFunc = core.factory().createBuiltinFunction(__NEW__, constructsClass, numDefaults(builtin), flags, callTarget);
9596
PythonBuiltinClass builtinClass = core.lookupType(constructsClass);
9697
builtinClass.setAttributeUnsafe(__NEW__, newFunc);
97-
builtinClass.setAttribute(__DOC__, builtinDoc);
98+
final Object currentBuiltinDoc = builtinClass.getAttribute(__DOC__);
99+
if (PGuards.isPNone(currentBuiltinDoc)) {
100+
builtinClass.setAttribute(__DOC__, builtinDoc);
101+
}
98102
} else {
99103
PBuiltinFunction function = core.factory().createBuiltinFunction(builtin.name(), null, numDefaults(builtin), flags, callTarget);
100104
function.setAttribute(__DOC__, builtinDoc);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3006,7 +3006,7 @@ Object methodGeneric(@SuppressWarnings("unused") Object cls, Object func, Object
30063006
if (callableCheck.execute(func)) {
30073007
return factory().createMethod(self, func);
30083008
} else {
3009-
throw raise(TypeError, ErrorMessages.FIRST_ARG_MUST_BE_CALLABLE);
3009+
throw raise(TypeError, ErrorMessages.FIRST_ARG_MUST_BE_CALLABLE_S, "");
30103010
}
30113011
}
30123012
}

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,11 @@
4040
*/
4141
package com.oracle.graal.python.builtins.modules;
4242

43+
import static com.oracle.graal.python.nodes.BuiltinNames.TUPLE_GETTER;
44+
4345
import java.util.List;
4446

47+
import com.oracle.graal.python.annotations.ArgumentClinic;
4548
import com.oracle.graal.python.builtins.Builtin;
4649
import com.oracle.graal.python.builtins.CoreFunctions;
4750
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
@@ -50,13 +53,16 @@
5053
import com.oracle.graal.python.builtins.objects.deque.DequeIterBuiltins.DequeIterNextNode;
5154
import com.oracle.graal.python.builtins.objects.deque.PDeque;
5255
import com.oracle.graal.python.builtins.objects.deque.PDequeIter;
56+
import com.oracle.graal.python.builtins.objects.dict.PDefaultDict;
5357
import com.oracle.graal.python.builtins.objects.function.PKeyword;
5458
import com.oracle.graal.python.lib.PyNumberIndexNode;
5559
import com.oracle.graal.python.nodes.BuiltinNames;
5660
import com.oracle.graal.python.nodes.ErrorMessages;
5761
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5862
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
63+
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode;
5964
import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
65+
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
6066
import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode;
6167
import com.oracle.truffle.api.CompilerDirectives;
6268
import com.oracle.truffle.api.dsl.Cached;
@@ -167,4 +173,31 @@ PDequeIter doGeneric(VirtualFrame frame, @SuppressWarnings("unused") Object cls,
167173
throw raise(PythonBuiltinClassType.TypeError, ErrorMessages.EXPECTED_OBJ_TYPE_S_GOT_P, BuiltinNames.DEQUE, deque);
168174
}
169175
}
176+
177+
// _collections.defaultdict
178+
@Builtin(name = BuiltinNames.DEFAULTDICT, minNumOfPositionalArgs = 1, constructsClass = PythonBuiltinClassType.PDefaultDict, takesVarArgs = true, takesVarKeywordArgs = true)
179+
@GenerateNodeFactory
180+
abstract static class DefaultDictNode extends PythonVarargsBuiltinNode {
181+
@Specialization
182+
@SuppressWarnings("unused")
183+
PDefaultDict doGeneric(Object cls, Object[] args, PKeyword[] kwargs) {
184+
return factory().createDefaultDict(cls);
185+
}
186+
}
187+
188+
// _collections._tuplegetter
189+
@Builtin(name = TUPLE_GETTER, parameterNames = {"cls", "index", "doc"}, constructsClass = PythonBuiltinClassType.PTupleGetter)
190+
@ArgumentClinic(name = "index", conversion = ArgumentClinic.ClinicConversion.Index)
191+
@GenerateNodeFactory
192+
abstract static class TupleGetterNode extends PythonTernaryClinicBuiltinNode {
193+
@Override
194+
protected ArgumentClinicProvider getArgumentClinic() {
195+
return CollectionsModuleBuiltinsClinicProviders.TupleGetterNodeClinicProviderGen.INSTANCE;
196+
}
197+
198+
@Specialization
199+
Object construct(Object cls, int index, Object doc) {
200+
return factory().createTupleGetter(cls, index, doc);
201+
}
202+
}
170203
}

0 commit comments

Comments
 (0)