How is string multiplication implemented in CPython?

cpython, multiplication, python, string

Solution

Note: I'm going to answer for Python 3, where the string type is called `PyUnicode`. Python 2 is similar.

When a `BINARY_MULTIPLY` opcode is executed (in `Python/ceval.c`), there are two possible slots that can get called: `PyNumberMethods.nb_multiply` and `PySequenceMethods.sq_repeat`. (This is in `PyNumber_Multiply`, in `Objects/abstract.c`):

PyObject *
PyNumber_Multiply(PyObject *v, PyObject *w)
{
    PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
    if (result == Py_NotImplemented) {
        // call sq_repeat on either side if available

`PyUnicode` implements the latter, in `unicode_repeat`:

static PyObject*
unicode_repeat(PyObject *str, Py_ssize_t len)
{
    // ...

Problem

Python allows the multiplication of strings by integers: ``` >>> 'hello' * 5 'hellohellohellohellohello' ``` How is this implemented in CPython? I would particularly appreciate a pointer to the source code; the Mercurial repository is a labyrinth beyond my abilities to navigate.

Original source