@@ -841,12 +841,18 @@ match_keys(PyThreadState *tstate, PyObject *map, PyObject *keys)
841
841
PyObject * seen = NULL ;
842
842
PyObject * dummy = NULL ;
843
843
PyObject * values = NULL ;
844
+ PyObject * get_name = NULL ;
845
+ PyObject * get = NULL ;
844
846
// We use the two argument form of map.get(key, default) for two reasons:
845
847
// - Atomically check for a key and get its value without error handling.
846
848
// - Don't cause key creation or resizing in dict subclasses like
847
849
// collections.defaultdict that define __missing__ (or similar).
848
850
_Py_IDENTIFIER (get );
849
- PyObject * get = _PyObject_GetAttrId (map , & PyId_get );
851
+ get_name = _PyUnicode_FromId (& PyId_get ); // borrowed
852
+ if (get_name == NULL ) {
853
+ return NULL ;
854
+ }
855
+ int meth_found = _PyObject_GetMethod (map , get_name , & get );
850
856
if (get == NULL ) {
851
857
goto fail ;
852
858
}
@@ -859,7 +865,7 @@ match_keys(PyThreadState *tstate, PyObject *map, PyObject *keys)
859
865
if (dummy == NULL ) {
860
866
goto fail ;
861
867
}
862
- values = PyList_New ( 0 );
868
+ values = PyTuple_New ( nkeys );
863
869
if (values == NULL ) {
864
870
goto fail ;
865
871
}
@@ -873,7 +879,14 @@ match_keys(PyThreadState *tstate, PyObject *map, PyObject *keys)
873
879
}
874
880
goto fail ;
875
881
}
876
- PyObject * value = PyObject_CallFunctionObjArgs (get , key , dummy , NULL );
882
+ PyObject * args [] = { map , key , dummy };
883
+ PyObject * value = NULL ;
884
+ if (meth_found ) {
885
+ value = PyObject_Vectorcall (get , args , 3 , NULL );
886
+ }
887
+ else {
888
+ value = PyObject_Vectorcall (get , & args [1 ], 2 , NULL );
889
+ }
877
890
if (value == NULL ) {
878
891
goto fail ;
879
892
}
@@ -886,10 +899,8 @@ match_keys(PyThreadState *tstate, PyObject *map, PyObject *keys)
886
899
values = Py_None ;
887
900
goto done ;
888
901
}
889
- PyList_Append (values , value );
890
- Py_DECREF (value );
902
+ PyTuple_SET_ITEM (values , i , value );
891
903
}
892
- Py_SETREF (values , PyList_AsTuple (values ));
893
904
// Success:
894
905
done :
895
906
Py_DECREF (get );
0 commit comments