From 8d2f9b3d1269f5025d3f76b73e3ec384c6a28baa Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 28 Jul 2023 23:45:25 +0900 Subject: [PATCH] mruby-data/data.c: skip inefficient env for first some accessors --- mrbgems/mruby-data/src/data.c | 62 +++++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/mrbgems/mruby-data/src/data.c b/mrbgems/mruby-data/src/data.c index 62e1450de..1232f8fd1 100644 --- a/mrbgems/mruby-data/src/data.c +++ b/mrbgems/mruby-data/src/data.c @@ -109,6 +109,50 @@ mrb_data_ref(mrb_state *mrb, mrb_value obj) return ptr[i]; } +static mrb_value +data_ref(mrb_state *mrb, mrb_value obj, mrb_int i) +{ + mrb_int len = RDATA_LEN(obj); + mrb_value *ptr = RDATA_PTR(obj); + + if (!ptr || len <= i) + return mrb_nil_value(); + return ptr[i]; +} + +static mrb_value +data_ref_0(mrb_state *mrb, mrb_value obj) +{ + return data_ref(mrb, obj, 0); +} + +static mrb_value +data_ref_1(mrb_state *mrb, mrb_value obj) +{ + return data_ref(mrb, obj, 1); +} + +static mrb_value +data_ref_2(mrb_state *mrb, mrb_value obj) +{ + return data_ref(mrb, obj, 2); +} + +static mrb_value +data_ref_3(mrb_state *mrb, mrb_value obj) +{ + return data_ref(mrb, obj, 3); +} + +#define DATA_DIRECT_REF_MAX 4 + +static mrb_func_t aref[DATA_DIRECT_REF_MAX] = { + data_ref_0, + data_ref_1, + data_ref_2, + data_ref_3, +}; + static void make_data_define_accessors(mrb_state *mrb, mrb_value members, struct RClass *c) { @@ -118,12 +162,18 @@ make_data_define_accessors(mrb_state *mrb, mrb_value members, struct RClass *c) for (mrb_int i=0; i