Skip to content

Commit ec24380

Browse files
committed
intrinsified dict_from_list
1 parent aa6eef8 commit ec24380

File tree

4 files changed

+39
-12
lines changed

4 files changed

+39
-12
lines changed

graalpython/com.oracle.graal.python.cext/src/modsupport.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -443,7 +443,7 @@ MUST_INLINE static PyObject* _PyTruffle_BuildValue(const char* format, va_list v
443443
if (v->prev == NULL) {
444444
PyErr_SetString(PyExc_SystemError, "'}' without '{' in Py_BuildValue");
445445
} else {
446-
PyList_Append(v->prev->list, to_sulong(polyglot_invoke(PY_TRUFFLE_CEXT, "dict_from_list", to_java(v->list))));
446+
PyList_Append(v->prev->list, to_sulong(polyglot_invoke(PY_TRUFFLE_CEXT, "PyTruffle_Dict_From_List", to_java(v->list))));
447447
next = v;
448448
v = v->prev;
449449
free(next);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBuiltins.java

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError;
4545
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
4646
import static com.oracle.graal.python.builtins.objects.cext.common.CExtContext.METH_CLASS;
47+
import static com.oracle.graal.python.nodes.ErrorMessages.LIST_CANNOT_BE_CONVERTED_TO_DICT;
4748
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DOC__;
4849
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__MODULE__;
4950
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__NAME__;
@@ -177,6 +178,7 @@
177178
import com.oracle.graal.python.builtins.objects.function.Signature;
178179
import com.oracle.graal.python.builtins.objects.getsetdescriptor.GetSetDescriptor;
179180
import com.oracle.graal.python.builtins.objects.ints.PInt;
181+
import com.oracle.graal.python.builtins.objects.list.ListBuiltins;
180182
import com.oracle.graal.python.builtins.objects.memoryview.BufferLifecycleManager;
181183
import com.oracle.graal.python.builtins.objects.memoryview.MemoryViewNodes;
182184
import com.oracle.graal.python.builtins.objects.memoryview.NativeBufferLifecycleManager;
@@ -284,7 +286,9 @@
284286
import com.oracle.truffle.api.nodes.RootNode;
285287
import com.oracle.truffle.api.object.DynamicObjectLibrary;
286288
import com.oracle.truffle.api.object.HiddenKey;
289+
import com.oracle.truffle.api.profiles.BranchProfile;
287290
import com.oracle.truffle.api.profiles.ConditionProfile;
291+
import com.oracle.truffle.api.profiles.LoopConditionProfile;
288292
import com.oracle.truffle.api.profiles.ValueProfile;
289293
import com.oracle.truffle.api.utilities.CyclicAssumption;
290294

@@ -407,7 +411,38 @@ static Object run() {
407411
}
408412
}
409413

410-
///////////// mappingproxy /////////////
414+
@Builtin(name = "PyTruffle_Dict_From_List", minNumOfPositionalArgs = 1)
415+
@GenerateNodeFactory
416+
public abstract static class DictFromListNode extends PythonUnaryBuiltinNode {
417+
@Specialization
418+
public Object values(VirtualFrame frame, Object list,
419+
@Cached com.oracle.graal.python.lib.PyObjectSizeNode sizeNode,
420+
@Cached ListBuiltins.GetItemNode getItemNode,
421+
@Cached BranchProfile wrongLenProfile,
422+
@Cached LoopConditionProfile loopProfile,
423+
@CachedLibrary(limit = "3") HashingStorageLibrary lib,
424+
@Cached PRaiseNativeNode raiseNativeNode,
425+
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode) {
426+
try {
427+
int size = sizeNode.execute(frame, list);
428+
if (size % 2 != 0) {
429+
wrongLenProfile.enter();
430+
return raiseNativeNode.raise(frame, getContext().getNativeNull(), PythonBuiltinClassType.SystemError, LIST_CANNOT_BE_CONVERTED_TO_DICT);
431+
}
432+
HashingStorage store = PDict.createNewStorage(false, size);
433+
loopProfile.profileCounted(size);
434+
for (int i = 0; loopProfile.profile(i < size); i = i + 2) {
435+
Object k = getItemNode.execute(frame, list, i);
436+
Object v = getItemNode.execute(frame, list, i + 1);
437+
store = lib.setItem(store, k, v);
438+
}
439+
return factory().createDict(store);
440+
} catch (PException e) {
441+
transformExceptionToNativeNode.execute(e);
442+
return getContext().getNativeNull();
443+
}
444+
}
445+
}
411446

412447
@Builtin(name = "Py_DECREF", minNumOfPositionalArgs = 1)
413448
@Builtin(name = "Py_INCREF", minNumOfPositionalArgs = 1)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,7 @@ public abstract class ErrorMessages {
405405
public static final String LEN_SHOULD_RETURN_GT_ZERO = "__len__() should return >= 0";
406406
public static final String LENGTH_HINT_SHOULD_RETURN_MT_ZERO = "__length_hint__() should return >= 0";
407407
public static final String LIST_ASSIGMENT_INDEX_OUT_OF_RANGE = "list assignment index out of range";
408+
public static final String LIST_CANNOT_BE_CONVERTED_TO_DICT = "list cannot be converted to dict";
408409
public static final String LIST_INDEX_OUT_OF_RANGE = "list index out of range";
409410
public static final String LIST_LENGTH_OUT_OF_RANGE = "list length out of range";
410411
public static final String LOCAL_VAR_REFERENCED_BEFORE_ASSIGMENT = "local variable '%s' referenced before assignment";

graalpython/lib-graalpython/python_cext.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,6 @@ def decorator(fun):
5353
return make_may_raise_wrapper(fun, error_result)
5454
return decorator
5555

56-
@may_raise
57-
def dict_from_list(lst):
58-
if len(lst) % 2 != 0:
59-
raise SystemError("list cannot be converted to dict")
60-
d = {}
61-
for i in range(0, len(lst), 2):
62-
d[lst[i]] = lst[i + 1]
63-
return d
64-
6556
##################### C EXT HELPERS
6657

6758
def PyTruffle_Debug(*args):

0 commit comments

Comments
 (0)