Skip to content

Commit 1fc66d1

Browse files
committed
Implement dict copy C helper function
1 parent 2a23ccb commit 1fc66d1

File tree

4 files changed

+11
-4
lines changed

4 files changed

+11
-4
lines changed

mypyc/lib-rt/CPy.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,7 @@ PyObject *CPyDict_ItemsView(PyObject *dict);
347347
PyObject *CPyDict_Keys(PyObject *dict);
348348
PyObject *CPyDict_Values(PyObject *dict);
349349
PyObject *CPyDict_Items(PyObject *dict);
350+
PyObject *CPyDict_Copy(PyObject *dict);
350351
PyObject *CPyDict_GetKeysIter(PyObject *dict);
351352
PyObject *CPyDict_GetItemsIter(PyObject *dict);
352353
PyObject *CPyDict_GetValuesIter(PyObject *dict);

mypyc/lib-rt/dict_ops.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,13 @@ PyObject *CPyDict_Items(PyObject *dict) {
226226
return list;
227227
}
228228

229+
PyObject *CPyDict_Copy(PyObject *dict) {
230+
if (PyDict_CheckExact(dict)) {
231+
return PyDict_Copy(dict);
232+
}
233+
return PyObject_CallMethod(dict, "copy", NULL);
234+
}
235+
229236
PyObject *CPyDict_GetKeysIter(PyObject *dict) {
230237
if (PyDict_CheckExact(dict)) {
231238
// Return dict itself to indicate we can use fast path instead.

mypyc/primitives/dict_ops.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,8 @@
147147
name='copy',
148148
arg_types=[dict_rprimitive],
149149
return_type=dict_rprimitive,
150-
c_function_name='PyDict_Copy',
151-
error_kind=ERR_MAGIC,
152-
)
150+
c_function_name='CPyDict_Copy',
151+
error_kind=ERR_MAGIC)
153152

154153
# list(dict.keys())
155154
dict_keys_op = custom_op(

mypyc/test-data/irbuild-dict.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,5 +321,5 @@ def f(d: Dict[int, int]) -> Dict[int, int]:
321321
def f(d):
322322
d, r0 :: dict
323323
L0:
324-
r0 = PyDict_Copy(d)
324+
r0 = CPyDict_Copy(d)
325325
return r0

0 commit comments

Comments
 (0)