From 29c4f92e13f27a6fabf7556184325c2483ace358 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky <pfalcon@users.sourceforge.net> Date: Sun, 15 Feb 2015 22:19:30 +0300 Subject: [PATCH] objexcept: Optimize using messages without formatting substitutions. They are directly cast to str object, skipping allocation of formatting buffer. --- py/objexcept.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/py/objexcept.c b/py/objexcept.c index f2f4012bc..a8b81448e 100644 --- a/py/objexcept.c +++ b/py/objexcept.c @@ -349,15 +349,19 @@ mp_obj_t mp_obj_new_exception_msg_varg(const mp_obj_type_t *exc_type, const char // no message assert(0); } else { - // render exception message and store as .args[0] - // TODO: optimize bufferbloat - vstr_t vstr; - vstr_init(&vstr, 16); - va_list ap; - va_start(ap, fmt); - vstr_vprintf(&vstr, fmt, ap); - va_end(ap); - o->args->items[0] = mp_obj_new_str_from_vstr(&mp_type_str, &vstr); + if (strchr(fmt, '%') == NULL) { + // no formatting substitutions, avoid allocating vstr. + o->args->items[0] = mp_obj_new_str(fmt, strlen(fmt), false); + } else { + // render exception message and store as .args[0] + va_list ap; + vstr_t vstr; + vstr_init(&vstr, 16); + va_start(ap, fmt); + vstr_vprintf(&vstr, fmt, ap); + va_end(ap); + o->args->items[0] = mp_obj_new_str_from_vstr(&mp_type_str, &vstr); + } } } -- GitLab