summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-struct
diff options
context:
space:
mode:
authordearblue <[email protected]>2018-08-18 11:44:44 +0900
committerdearblue <[email protected]>2019-06-22 17:49:07 +0900
commita76da32567f9c6f8aea5c697f3ec68f31b99fb16 (patch)
tree655f24bc6d3ce382371a725b4aeab3c472811bdc /mrbgems/mruby-struct
parentc53b7cedccf7f5260dc8b4f88c5f93ea550bc5df (diff)
downloadmruby-a76da32567f9c6f8aea5c697f3ec68f31b99fb16.tar.gz
mruby-a76da32567f9c6f8aea5c697f3ec68f31b99fb16.zip
Use stack memory for small name of Struct members
Diffstat (limited to 'mrbgems/mruby-struct')
-rw-r--r--mrbgems/mruby-struct/src/struct.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/mrbgems/mruby-struct/src/struct.c b/mrbgems/mruby-struct/src/struct.c
index 44822a03e..e1f64df55 100644
--- a/mrbgems/mruby-struct/src/struct.c
+++ b/mrbgems/mruby-struct/src/struct.c
@@ -123,18 +123,29 @@ mrb_struct_ref(mrb_state *mrb, mrb_value obj)
static mrb_sym
mrb_id_attrset(mrb_state *mrb, mrb_sym id)
{
+#define STACKED_ALLOC_MAX 32
+#define STACKED_STRING_MAX (STACKED_ALLOC_MAX - 1) /* '=' character */
+
const char *name;
char *buf;
mrb_int len;
mrb_sym mid;
+ char stacked[STACKED_ALLOC_MAX];
name = mrb_sym2name_len(mrb, id, &len);
- buf = (char *)mrb_malloc(mrb, (size_t)len+1);
+ if (len > STACKED_STRING_MAX) {
+ buf = (char *)mrb_malloc(mrb, (size_t)len+1);
+ }
+ else {
+ buf = stacked;
+ }
memcpy(buf, name, (size_t)len);
buf[len] = '=';
mid = mrb_intern(mrb, buf, len+1);
- mrb_free(mrb, buf);
+ if (buf != stacked) {
+ mrb_free(mrb, buf);
+ }
return mid;
}