Second stage of qstr revamp: uPy str object can be qstr or not.
diff --git a/py/objfun.c b/py/objfun.c
index b749860..1f6ad68 100644
--- a/py/objfun.c
+++ b/py/objfun.c
@@ -56,8 +56,7 @@
         // TODO if n_kw==0 then don't allocate any memory for map (either pass NULL or allocate it on the heap)
         mp_map_t *kw_args = mp_map_new(n_kw);
         for (int i = 0; i < 2 * n_kw; i += 2) {
-            qstr name = mp_obj_str_get(args[n_args + i]);
-            mp_map_lookup(kw_args, MP_OBJ_NEW_QSTR(name), MP_MAP_LOOKUP_ADD_IF_NOT_FOUND)->value = args[n_args + i + 1];
+            mp_map_lookup(kw_args, args[n_args + i], MP_MAP_LOOKUP_ADD_IF_NOT_FOUND)->value = args[n_args + i + 1];
         }
         mp_obj_t res = ((mp_fun_kw_t)self->fun)(n_args, args, kw_args);
         // TODO clean up kw_args
@@ -214,9 +213,10 @@
         return 0;
     } else if (obj == mp_const_true) {
         return 1;
-    } else if (MP_OBJ_IS_TYPE(obj, &str_type)) {
+    } else if (MP_OBJ_IS_STR(obj)) {
         // pointer to the string (it's probably constant though!)
-        return (machine_uint_t)qstr_str(mp_obj_str_get(obj));
+        uint l;
+        return (machine_uint_t)mp_obj_str_get_data(obj, &l);
 #if MICROPY_ENABLE_FLOAT
     } else if (MP_OBJ_IS_TYPE(obj, &float_type)) {
         // convert float to int (could also pass in float registers)