summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorKOBAYASHI Shuji <[email protected]>2019-10-13 16:43:56 +0900
committerKOBAYASHI Shuji <[email protected]>2019-10-13 17:03:39 +0900
commit6377c9bce5a54bdacbeb86f2e9aa8497cfc671e8 (patch)
tree4fea36e57cccb9a38011e0e6333f70131dedf5c6
parentd128e2d09eaed2f094dcc72f52d3b1c3378cff10 (diff)
downloadmruby-6377c9bce5a54bdacbeb86f2e9aa8497cfc671e8.tar.gz
mruby-6377c9bce5a54bdacbeb86f2e9aa8497cfc671e8.zip
Refactor `mrb_class_name_class`
- Use `mrb_sym_name_len` instead of `mrb_sym_name` (class name should not be escaped). - Avoid `mrb_str_dup` (it is unnecessary to be shared string because it is changed).
-rw-r--r--src/class.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/class.c b/src/class.c
index d03b99750..b1c7513de 100644
--- a/src/class.c
+++ b/src/class.c
@@ -65,17 +65,22 @@ mrb_class_name_class(mrb_state *mrb, struct RClass *outer, struct RClass *c, mrb
name = mrb_symbol_value(id);
}
else {
- name = mrb_class_path(mrb, outer);
- if (mrb_nil_p(name)) { /* unnamed outer class */
+ const char *n;
+ mrb_int len;
+ mrb_value outer_name = mrb_class_path(mrb, outer);
+
+ if (mrb_nil_p(outer_name)) { /* unnamed outer class */
if (outer != mrb->object_class && outer != c) {
mrb_obj_iv_set_force(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__"),
mrb_obj_value(outer));
}
return;
}
- name = mrb_str_dup(mrb, name);
- mrb_str_cat_cstr(mrb, name, "::");
- mrb_str_cat_cstr(mrb, name, mrb_sym_name(mrb, id));
+ n = mrb_sym_name_len(mrb, id, &len);
+ name = mrb_str_new_capa(mrb, RSTRING_LEN(outer_name) + 2 + len);
+ mrb_str_cat_str(mrb, name, outer_name);
+ mrb_str_cat_lit(mrb, name, "::");
+ mrb_str_cat(mrb, name, n, len);
MRB_SET_FROZEN_FLAG(mrb_obj_ptr(name));
}
mrb_obj_iv_set_force(mrb, (struct RObject*)c, nsym, name);