|
81 | 81 | import com.oracle.graal.python.builtins.objects.deque.DequeBuiltinsClinicProviders.DequeDelItemNodeClinicProviderGen;
|
82 | 82 | import com.oracle.graal.python.builtins.objects.deque.DequeBuiltinsClinicProviders.DequeGetItemNodeClinicProviderGen;
|
83 | 83 | import com.oracle.graal.python.builtins.objects.deque.DequeBuiltinsClinicProviders.DequeInplaceMulNodeClinicProviderGen;
|
| 84 | +import com.oracle.graal.python.builtins.objects.deque.DequeBuiltinsClinicProviders.DequeInsertNodeClinicProviderGen; |
84 | 85 | import com.oracle.graal.python.builtins.objects.deque.DequeBuiltinsClinicProviders.DequeMulNodeClinicProviderGen;
|
85 | 86 | import com.oracle.graal.python.builtins.objects.deque.DequeBuiltinsClinicProviders.DequeRMulNodeClinicProviderGen;
|
86 | 87 | import com.oracle.graal.python.builtins.objects.deque.DequeBuiltinsClinicProviders.DequeRotateNodeClinicProviderGen;
|
@@ -441,6 +442,44 @@ private static Object next(Iterator<?> it) {
|
441 | 442 | }
|
442 | 443 | }
|
443 | 444 |
|
| 445 | + // deque.insert() |
| 446 | + @Builtin(name = "insert", minNumOfPositionalArgs = 3, parameterNames = {"$self", "index", "object"}) |
| 447 | + @GenerateNodeFactory |
| 448 | + @ArgumentClinic(name = "index", conversion = ClinicConversion.Index) |
| 449 | + public abstract static class DequeInsertNode extends PythonTernaryClinicBuiltinNode { |
| 450 | + |
| 451 | + @Override |
| 452 | + protected ArgumentClinicProvider getArgumentClinic() { |
| 453 | + return DequeInsertNodeClinicProviderGen.INSTANCE; |
| 454 | + } |
| 455 | + |
| 456 | + @Specialization |
| 457 | + @TruffleBoundary |
| 458 | + PNone doGeneric(PDeque self, int index, Object value) { |
| 459 | + int n = self.getSize(); |
| 460 | + if (self.getMaxLength() == n) { |
| 461 | + throw PRaiseNode.raiseUncached(this, IndexError, "deque already at its maximum size"); |
| 462 | + } |
| 463 | + |
| 464 | + // shortcuts for simple cases |
| 465 | + if (index >= n) { |
| 466 | + self.append(value); |
| 467 | + } else if (index <= -n || index == 0) { |
| 468 | + self.appendLeft(value); |
| 469 | + } |
| 470 | + |
| 471 | + DequeRotateNode.doLeft(self, -index); |
| 472 | + if (index < 0) { |
| 473 | + self.append(value); |
| 474 | + } else { |
| 475 | + self.appendLeft(value); |
| 476 | + } |
| 477 | + DequeRotateNode.doRight(self, index); |
| 478 | + |
| 479 | + return PNone.NONE; |
| 480 | + } |
| 481 | + } |
| 482 | + |
444 | 483 | // deque.pop()
|
445 | 484 | @Builtin(name = "pop", minNumOfPositionalArgs = 1)
|
446 | 485 | @GenerateNodeFactory
|
|
0 commit comments