|
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