mercurial/parsers.c
changeset 25583 ce64c9ab19f2
parent 25582 5fa399a0c385
child 25584 72b2711f12ea
equal deleted inserted replaced
25582:5fa399a0c385 25583:ce64c9ab19f2
   171 	if (!PyArg_ParseTuple(args, "O!:asciiupper", &PyBytes_Type, &str_obj))
   171 	if (!PyArg_ParseTuple(args, "O!:asciiupper", &PyBytes_Type, &str_obj))
   172 		return NULL;
   172 		return NULL;
   173 	return _asciitransform(str_obj, uppertable, NULL);
   173 	return _asciitransform(str_obj, uppertable, NULL);
   174 }
   174 }
   175 
   175 
       
   176 static inline PyObject *_dict_new_presized(Py_ssize_t expected_size)
       
   177 {
       
   178 	/* _PyDict_NewPresized expects a minused parameter, but it actually
       
   179 	   creates a dictionary that's the nearest power of two bigger than the
       
   180 	   parameter. For example, with the initial minused = 1000, the
       
   181 	   dictionary created has size 1024. Of course in a lot of cases that
       
   182 	   can be greater than the maximum load factor Python's dict object
       
   183 	   expects (= 2/3), so as soon as we cross the threshold we'll resize
       
   184 	   anyway. So create a dictionary that's at least 3/2 the size. */
       
   185 	return _PyDict_NewPresized(((1 + expected_size) / 2) * 3);
       
   186 }
       
   187 
   176 static PyObject *make_file_foldmap(PyObject *self, PyObject *args)
   188 static PyObject *make_file_foldmap(PyObject *self, PyObject *args)
   177 {
   189 {
   178 	PyObject *dmap, *spec_obj, *normcase_fallback;
   190 	PyObject *dmap, *spec_obj, *normcase_fallback;
   179 	PyObject *file_foldmap = NULL;
   191 	PyObject *file_foldmap = NULL;
   180 	enum normcase_spec spec;
   192 	enum normcase_spec spec;
   203 	default:
   215 	default:
   204 		PyErr_SetString(PyExc_TypeError, "invalid normcasespec");
   216 		PyErr_SetString(PyExc_TypeError, "invalid normcasespec");
   205 		goto quit;
   217 		goto quit;
   206 	}
   218 	}
   207 
   219 
   208 	/* _PyDict_NewPresized expects a minused parameter, but it actually
   220 	/* Add some more entries to deal with additions outside this
   209 	   creates a dictionary that's the nearest power of two bigger than the
   221 	   function. */
   210 	   parameter. For example, with the initial minused = 1000, the
   222 	file_foldmap = _dict_new_presized((PyDict_Size(dmap) / 10) * 11);
   211 	   dictionary created has size 1024. Of course in a lot of cases that
       
   212 	   can be greater than the maximum load factor Python's dict object
       
   213 	   expects (= 2/3), so as soon as we cross the threshold we'll resize
       
   214 	   anyway. So create a dictionary that's 3/2 the size. Also add some
       
   215 	   more to deal with additions outside this function. */
       
   216 	file_foldmap = _PyDict_NewPresized((PyDict_Size(dmap) / 5) * 8);
       
   217 	if (file_foldmap == NULL)
   223 	if (file_foldmap == NULL)
   218 		goto quit;
   224 		goto quit;
   219 
   225 
   220 	while (PyDict_Next(dmap, &pos, &k, &v)) {
   226 	while (PyDict_Next(dmap, &pos, &k, &v)) {
   221 		if (!dirstate_tuple_check(v)) {
   227 		if (!dirstate_tuple_check(v)) {