|
44 | 44 | import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError;
|
45 | 45 | import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
|
46 | 46 | 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; |
47 | 48 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DOC__;
|
48 | 49 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__MODULE__;
|
49 | 50 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__NAME__;
|
|
177 | 178 | import com.oracle.graal.python.builtins.objects.function.Signature;
|
178 | 179 | import com.oracle.graal.python.builtins.objects.getsetdescriptor.GetSetDescriptor;
|
179 | 180 | import com.oracle.graal.python.builtins.objects.ints.PInt;
|
| 181 | +import com.oracle.graal.python.builtins.objects.list.ListBuiltins; |
180 | 182 | import com.oracle.graal.python.builtins.objects.memoryview.BufferLifecycleManager;
|
181 | 183 | import com.oracle.graal.python.builtins.objects.memoryview.MemoryViewNodes;
|
182 | 184 | import com.oracle.graal.python.builtins.objects.memoryview.NativeBufferLifecycleManager;
|
|
284 | 286 | import com.oracle.truffle.api.nodes.RootNode;
|
285 | 287 | import com.oracle.truffle.api.object.DynamicObjectLibrary;
|
286 | 288 | import com.oracle.truffle.api.object.HiddenKey;
|
| 289 | +import com.oracle.truffle.api.profiles.BranchProfile; |
287 | 290 | import com.oracle.truffle.api.profiles.ConditionProfile;
|
| 291 | +import com.oracle.truffle.api.profiles.LoopConditionProfile; |
288 | 292 | import com.oracle.truffle.api.profiles.ValueProfile;
|
289 | 293 | import com.oracle.truffle.api.utilities.CyclicAssumption;
|
290 | 294 |
|
@@ -407,7 +411,38 @@ static Object run() {
|
407 | 411 | }
|
408 | 412 | }
|
409 | 413 |
|
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 | + } |
411 | 446 |
|
412 | 447 | @Builtin(name = "Py_DECREF", minNumOfPositionalArgs = 1)
|
413 | 448 | @Builtin(name = "Py_INCREF", minNumOfPositionalArgs = 1)
|
|
0 commit comments