From e2e663291dd1408cc9c5118d258a568470e32f8c Mon Sep 17 00:00:00 2001
From: Paul Sokolovsky <pfalcon@users.sourceforge.net>
Date: Fri, 27 Jan 2017 00:40:47 +0300
Subject: [PATCH] py/objstr: Optimize string concatenation with empty string.

In this, don't allocate copy, just return non-empty string. This helps
with a standard pattern of buffering data in case of short reads:

    buf = b""
    while ...:
        s = f.read(...)
        buf += s
        ...

For a typical case when single read returns all data needed, there won't
be extra allocation. This optimization helps uasyncio.
---
 py/objstr.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/py/objstr.c b/py/objstr.c
index f082e9559..7478198e0 100644
--- a/py/objstr.c
+++ b/py/objstr.c
@@ -358,6 +358,13 @@ mp_obj_t mp_obj_str_binary_op(mp_uint_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
     switch (op) {
         case MP_BINARY_OP_ADD:
         case MP_BINARY_OP_INPLACE_ADD: {
+            if (lhs_len == 0) {
+                return rhs_in;
+            }
+            if (rhs_len == 0) {
+                return lhs_in;
+            }
+
             vstr_t vstr;
             vstr_init_len(&vstr, lhs_len + rhs_len);
             memcpy(vstr.buf, lhs_data, lhs_len);
-- 
GitLab