From c7a15d8f8db94c7841529403a1dccdefa1ee07f5 Mon Sep 17 00:00:00 2001 From: vsakkas Date: Sat, 21 Nov 2020 13:18:22 +0200 Subject: [PATCH 1/5] Implement list insert primitive --- mypyc/primitives/list_ops.py | 8 ++++++++ mypyc/test-data/irbuild-lists.test | 15 +++++++++++++++ mypyc/test-data/run-lists.test | 6 ++++++ 3 files changed, 29 insertions(+) diff --git a/mypyc/primitives/list_ops.py b/mypyc/primitives/list_ops.py index e94f63dbb0305..00165d2b7e70b 100644 --- a/mypyc/primitives/list_ops.py +++ b/mypyc/primitives/list_ops.py @@ -105,6 +105,14 @@ c_function_name='CPyList_Count', error_kind=ERR_MAGIC) +# list.insert(index, obj) +method_op( + name='insert', + arg_types=[list_rprimitive, int_rprimitive, object_rprimitive], + return_type=int_rprimitive, + c_function_name='PyList_Insert', + error_kind=ERR_MAGIC) + # list * int binary_op( name='*', diff --git a/mypyc/test-data/irbuild-lists.test b/mypyc/test-data/irbuild-lists.test index 826c04ea64800..84a544b8a6156 100644 --- a/mypyc/test-data/irbuild-lists.test +++ b/mypyc/test-data/irbuild-lists.test @@ -233,3 +233,18 @@ L0: r2 = r1 >= 0 :: signed r3 = truncate r1: int32 to builtins.bool return r3 + +[case testListInsert] +from typing import List +def f(x: List[int], y: int) -> None: + x.insert(0, y) +[out] +def f(x, y): + x :: list + y :: int + r0 :: object + r1 :: int +L0: + r0 = box(int, y) + r1 = PyList_Insert(x, 0, r0) + return 1 diff --git a/mypyc/test-data/run-lists.test b/mypyc/test-data/run-lists.test index 2f02be67d358a..dc5e9862e7ef0 100644 --- a/mypyc/test-data/run-lists.test +++ b/mypyc/test-data/run-lists.test @@ -103,6 +103,12 @@ pop(l, -2) assert l == [1, 3] assert count(l, 1) == 1 assert count(l, 2) == 0 +l.insert(0, 0) +assert l == [0, 1, 3] +l.insert(2, 2) +assert l == [0, 1, 2, 3] +l.insert(4, 4) +assert l == [0, 1, 2, 3, 4] [case testListOfUserDefinedClass] class C: From 1b7105e17da813054ebcb53239d4cf434303a1b1 Mon Sep 17 00:00:00 2001 From: vsakkas Date: Sat, 21 Nov 2020 23:46:30 +0200 Subject: [PATCH 2/5] Implement list insert C helper function --- mypyc/lib-rt/CPy.h | 1 + mypyc/lib-rt/list_ops.c | 9 +++++++++ mypyc/primitives/list_ops.py | 2 +- mypyc/test-data/irbuild-lists.test | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/mypyc/lib-rt/CPy.h b/mypyc/lib-rt/CPy.h index fa5e9ee499a84..a8c86a74ce6ac 100644 --- a/mypyc/lib-rt/CPy.h +++ b/mypyc/lib-rt/CPy.h @@ -323,6 +323,7 @@ bool CPyList_SetItem(PyObject *list, CPyTagged index, PyObject *value); PyObject *CPyList_PopLast(PyObject *obj); PyObject *CPyList_Pop(PyObject *obj, CPyTagged index); CPyTagged CPyList_Count(PyObject *obj, PyObject *value); +CPyTagged CPyList_Insert(PyObject *list, CPyTagged index, PyObject *value); PyObject *CPyList_Extend(PyObject *o1, PyObject *o2); PyObject *CPySequence_Multiply(PyObject *seq, CPyTagged t_size); PyObject *CPySequence_RMultiply(CPyTagged t_size, PyObject *seq); diff --git a/mypyc/lib-rt/list_ops.c b/mypyc/lib-rt/list_ops.c index 5c8fa42fc683b..c3b9f68a363a4 100644 --- a/mypyc/lib-rt/list_ops.c +++ b/mypyc/lib-rt/list_ops.c @@ -108,6 +108,15 @@ CPyTagged CPyList_Count(PyObject *obj, PyObject *value) return list_count((PyListObject *)obj, value); } +CPyTagged CPyList_Insert(PyObject *list, CPyTagged index, PyObject *value) +{ + if (CPyTagged_CheckShort(index)) { + Py_ssize_t n = CPyTagged_ShortAsSsize_t(index); + return PyList_Insert(list, n, value); + } + return -1; +} + PyObject *CPyList_Extend(PyObject *o1, PyObject *o2) { return _PyList_Extend((PyListObject *)o1, o2); } diff --git a/mypyc/primitives/list_ops.py b/mypyc/primitives/list_ops.py index 00165d2b7e70b..6c66699b7338a 100644 --- a/mypyc/primitives/list_ops.py +++ b/mypyc/primitives/list_ops.py @@ -110,7 +110,7 @@ name='insert', arg_types=[list_rprimitive, int_rprimitive, object_rprimitive], return_type=int_rprimitive, - c_function_name='PyList_Insert', + c_function_name='CPyList_Insert', error_kind=ERR_MAGIC) # list * int diff --git a/mypyc/test-data/irbuild-lists.test b/mypyc/test-data/irbuild-lists.test index 84a544b8a6156..bb33b4f2b19dc 100644 --- a/mypyc/test-data/irbuild-lists.test +++ b/mypyc/test-data/irbuild-lists.test @@ -246,5 +246,5 @@ def f(x, y): r1 :: int L0: r0 = box(int, y) - r1 = PyList_Insert(x, 0, r0) + r1 = CPyList_Insert(x, 0, r0) return 1 From 8a2e0f0b04b68c1d8b0f83bc975c36162e998a93 Mon Sep 17 00:00:00 2001 From: vsakkas Date: Sun, 22 Nov 2020 10:48:18 +0200 Subject: [PATCH 3/5] Change list insert C helper return type to int --- mypyc/lib-rt/CPy.h | 2 +- mypyc/lib-rt/list_ops.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mypyc/lib-rt/CPy.h b/mypyc/lib-rt/CPy.h index a8c86a74ce6ac..4eab87e4c0116 100644 --- a/mypyc/lib-rt/CPy.h +++ b/mypyc/lib-rt/CPy.h @@ -323,7 +323,7 @@ bool CPyList_SetItem(PyObject *list, CPyTagged index, PyObject *value); PyObject *CPyList_PopLast(PyObject *obj); PyObject *CPyList_Pop(PyObject *obj, CPyTagged index); CPyTagged CPyList_Count(PyObject *obj, PyObject *value); -CPyTagged CPyList_Insert(PyObject *list, CPyTagged index, PyObject *value); +int CPyList_Insert(PyObject *list, CPyTagged index, PyObject *value); PyObject *CPyList_Extend(PyObject *o1, PyObject *o2); PyObject *CPySequence_Multiply(PyObject *seq, CPyTagged t_size); PyObject *CPySequence_RMultiply(CPyTagged t_size, PyObject *seq); diff --git a/mypyc/lib-rt/list_ops.c b/mypyc/lib-rt/list_ops.c index c3b9f68a363a4..2c7623398580e 100644 --- a/mypyc/lib-rt/list_ops.c +++ b/mypyc/lib-rt/list_ops.c @@ -108,7 +108,7 @@ CPyTagged CPyList_Count(PyObject *obj, PyObject *value) return list_count((PyListObject *)obj, value); } -CPyTagged CPyList_Insert(PyObject *list, CPyTagged index, PyObject *value) +int CPyList_Insert(PyObject *list, CPyTagged index, PyObject *value) { if (CPyTagged_CheckShort(index)) { Py_ssize_t n = CPyTagged_ShortAsSsize_t(index); From 7d836410eff87a03c7a7d7a5adea5ab8fd45ebd2 Mon Sep 17 00:00:00 2001 From: vsakkas Date: Sun, 22 Nov 2020 11:31:19 +0200 Subject: [PATCH 4/5] Update list insert error kind to neg int --- mypyc/primitives/list_ops.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mypyc/primitives/list_ops.py b/mypyc/primitives/list_ops.py index 6c66699b7338a..a8f6eccbf5d29 100644 --- a/mypyc/primitives/list_ops.py +++ b/mypyc/primitives/list_ops.py @@ -111,7 +111,7 @@ arg_types=[list_rprimitive, int_rprimitive, object_rprimitive], return_type=int_rprimitive, c_function_name='CPyList_Insert', - error_kind=ERR_MAGIC) + error_kind=ERR_NEG_INT) # list * int binary_op( From a740332cf5ec227689be0053378f3e7bd30f1cb2 Mon Sep 17 00:00:00 2001 From: vsakkas Date: Sun, 22 Nov 2020 13:09:57 +0200 Subject: [PATCH 5/5] Update list insert return type to C int --- mypyc/primitives/list_ops.py | 2 +- mypyc/test-data/irbuild-lists.test | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/mypyc/primitives/list_ops.py b/mypyc/primitives/list_ops.py index a8f6eccbf5d29..fad7a4aacef27 100644 --- a/mypyc/primitives/list_ops.py +++ b/mypyc/primitives/list_ops.py @@ -109,7 +109,7 @@ method_op( name='insert', arg_types=[list_rprimitive, int_rprimitive, object_rprimitive], - return_type=int_rprimitive, + return_type=c_int_rprimitive, c_function_name='CPyList_Insert', error_kind=ERR_NEG_INT) diff --git a/mypyc/test-data/irbuild-lists.test b/mypyc/test-data/irbuild-lists.test index bb33b4f2b19dc..5126ca213d261 100644 --- a/mypyc/test-data/irbuild-lists.test +++ b/mypyc/test-data/irbuild-lists.test @@ -243,8 +243,10 @@ def f(x, y): x :: list y :: int r0 :: object - r1 :: int + r1 :: int32 + r2 :: bit L0: r0 = box(int, y) r1 = CPyList_Insert(x, 0, r0) + r2 = r1 >= 0 :: signed return 1