From 75f8aab247abf58b61b3700c078d61ccf7e168bf Mon Sep 17 00:00:00 2001 From: Ryan Scott Date: Thu, 18 Jul 2013 07:54:16 +1000 Subject: First round of trying to improve the performance of attr_reader and attr_writer. From ~24sec to ~15sec --- src/kernel.c | 45 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 10 deletions(-) (limited to 'src/kernel.c') diff --git a/src/kernel.c b/src/kernel.c index ae8d24710..068b80f62 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -548,6 +548,14 @@ obj_is_instance_of(mrb_state *mrb, mrb_value self) return mrb_bool_value(instance_of_p); } +static void +valid_iv_name(mrb_state *mrb, mrb_sym id, const char* s, size_t len) +{ + if (len < 2 || !(s[0] == '@' && s[1] != '@')) { + mrb_name_error(mrb, id, "`%S' is not allowed as an instance variable name", mrb_sym2str(mrb, id)); + } +} + static void check_iv_name(mrb_state *mrb, mrb_sym id) { @@ -555,9 +563,23 @@ check_iv_name(mrb_state *mrb, mrb_sym id) size_t len; s = mrb_sym2name_len(mrb, id, &len); - if (len < 2 || !(s[0] == '@' && s[1] != '@')) { - mrb_name_error(mrb, id, "`%S' is not allowed as an instance variable name", mrb_sym2str(mrb, id)); + valid_iv_name(mrb, id, s, len); +} + +static mrb_sym +get_valid_iv_sym(mrb_state *mrb, mrb_value val) +{ + mrb_sym id; + + if (mrb_string_p(val)) { + id = mrb_intern_cstr(mrb, RSTRING_PTR(val)); + valid_iv_name(mrb, id, RSTRING_PTR(val), RSTRING_LEN(val)); + } else if(mrb_symbol_p(val)) { + id = mrb_symbol(val); + check_iv_name(mrb, id); } + + return id; } /* 15.3.1.3.20 */ @@ -582,10 +604,11 @@ mrb_value mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self) { mrb_sym mid; + mrb_value sym; mrb_bool defined_p; - mrb_get_args(mrb, "n", &mid); - check_iv_name(mrb, mid); + mrb_get_args(mrb, "o", &sym); + mid = get_valid_iv_sym(mrb, sym); defined_p = mrb_obj_iv_defined(mrb, mrb_obj_ptr(self), mid); return mrb_bool_value(defined_p); @@ -615,10 +638,11 @@ mrb_value mrb_obj_ivar_get(mrb_state *mrb, mrb_value self) { mrb_sym id; + mrb_value sym; + + mrb_get_args(mrb, "o", &sym); - mrb_get_args(mrb, "n", &id); - - check_iv_name(mrb, id); + id = get_valid_iv_sym(mrb, sym); return mrb_iv_get(mrb, self, id); } @@ -646,10 +670,11 @@ mrb_value mrb_obj_ivar_set(mrb_state *mrb, mrb_value self) { mrb_sym id; - mrb_value val; + mrb_value sym, val; - mrb_get_args(mrb, "no", &id, &val); - check_iv_name(mrb, id); + mrb_get_args(mrb, "oo", &sym, &val); + + id = get_valid_iv_sym(mrb, sym); mrb_iv_set(mrb, self, id, val); return val; } -- cgit v1.2.3 From 3ebd8167e149c66e7b9a822b196ea610fe07a419 Mon Sep 17 00:00:00 2001 From: Ryan Scott Date: Sun, 21 Jul 2013 18:05:45 +1000 Subject: Slight cleanup of code --- src/kernel.c | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) (limited to 'src/kernel.c') diff --git a/src/kernel.c b/src/kernel.c index 068b80f62..f2c7f182f 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -549,37 +549,37 @@ obj_is_instance_of(mrb_state *mrb, mrb_value self) } static void -valid_iv_name(mrb_state *mrb, mrb_sym id, const char* s, size_t len) +valid_iv_name(mrb_state *mrb, mrb_sym iv_name_id, const char* s, size_t len) { if (len < 2 || !(s[0] == '@' && s[1] != '@')) { - mrb_name_error(mrb, id, "`%S' is not allowed as an instance variable name", mrb_sym2str(mrb, id)); + mrb_name_error(mrb, iv_name_id, "`%S' is not allowed as an instance variable name", mrb_sym2str(mrb, iv_name_id)); } } static void -check_iv_name(mrb_state *mrb, mrb_sym id) +check_iv_name(mrb_state *mrb, mrb_sym iv_name_id) { const char *s; size_t len; - s = mrb_sym2name_len(mrb, id, &len); - valid_iv_name(mrb, id, s, len); + s = mrb_sym2name_len(mrb, iv_name_id, &len); + valid_iv_name(mrb, iv_name_id, s, len); } static mrb_sym -get_valid_iv_sym(mrb_state *mrb, mrb_value val) +get_valid_iv_sym(mrb_state *mrb, mrb_value iv_name) { - mrb_sym id; - - if (mrb_string_p(val)) { - id = mrb_intern_cstr(mrb, RSTRING_PTR(val)); - valid_iv_name(mrb, id, RSTRING_PTR(val), RSTRING_LEN(val)); - } else if(mrb_symbol_p(val)) { - id = mrb_symbol(val); - check_iv_name(mrb, id); + mrb_sym iv_name_id; + + if (mrb_string_p(iv_name)) { + iv_name_id = mrb_intern_cstr(mrb, RSTRING_PTR(iv_name)); + valid_iv_name(mrb, iv_name_id, RSTRING_PTR(iv_name), RSTRING_LEN(iv_name)); + } else if(mrb_symbol_p(iv_name)) { + iv_name_id = mrb_symbol(iv_name); + check_iv_name(mrb, iv_name_id); } - return id; + return iv_name_id; } /* 15.3.1.3.20 */ @@ -637,13 +637,13 @@ mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self) mrb_value mrb_obj_ivar_get(mrb_state *mrb, mrb_value self) { - mrb_sym id; - mrb_value sym; + mrb_sym iv_name_id; + mrb_value iv_name; - mrb_get_args(mrb, "o", &sym); + mrb_get_args(mrb, "o", &iv_name); - id = get_valid_iv_sym(mrb, sym); - return mrb_iv_get(mrb, self, id); + iv_name_id = get_valid_iv_sym(mrb, iv_name); + return mrb_iv_get(mrb, self, iv_name_id); } /* 15.3.1.3.22 */ @@ -669,13 +669,13 @@ mrb_obj_ivar_get(mrb_state *mrb, mrb_value self) mrb_value mrb_obj_ivar_set(mrb_state *mrb, mrb_value self) { - mrb_sym id; - mrb_value sym, val; + mrb_sym iv_name_id; + mrb_value iv_name, val; - mrb_get_args(mrb, "oo", &sym, &val); + mrb_get_args(mrb, "oo", &iv_name, &val); - id = get_valid_iv_sym(mrb, sym); - mrb_iv_set(mrb, self, id, val); + iv_name_id = get_valid_iv_sym(mrb, iv_name); + mrb_iv_set(mrb, self, iv_name_id, val); return val; } -- cgit v1.2.3