From 0a6b54acd63f0f396eda6e1e5e2366ce91a35d79 Mon Sep 17 00:00:00 2001 From: take_cheeze Date: Fri, 20 Jun 2014 21:49:41 +0900 Subject: Reduce new string creation in `capitalize`, `downcase`, `upcase` method of `Symbol` class extension. Add test to check unmodified result is working. --- mrbgems/mruby-symbol-ext/mrblib/symbol.rb | 6 +++--- mrbgems/mruby-symbol-ext/test/symbol.rb | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/mrbgems/mruby-symbol-ext/mrblib/symbol.rb b/mrbgems/mruby-symbol-ext/mrblib/symbol.rb index 4cf18f647..b2615a760 100644 --- a/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +++ b/mrbgems/mruby-symbol-ext/mrblib/symbol.rb @@ -25,7 +25,7 @@ class Symbol # Same as sym.to_s.capitalize.intern. def capitalize - self.to_s.capitalize.intern + (self.to_s.capitalize! || self).to_sym end ## @@ -35,7 +35,7 @@ class Symbol # Same as sym.to_s.downcase.intern. def downcase - self.to_s.downcase.intern + (self.to_s.downcase! || self).to_sym end ## @@ -45,7 +45,7 @@ class Symbol # Same as sym.to_s.upcase.intern. def upcase - self.to_s.upcase.intern + (self.to_s.upcase! || self).to_sym end ## diff --git a/mrbgems/mruby-symbol-ext/test/symbol.rb b/mrbgems/mruby-symbol-ext/test/symbol.rb index 59df7ea9d..c2695f1f8 100644 --- a/mrbgems/mruby-symbol-ext/test/symbol.rb +++ b/mrbgems/mruby-symbol-ext/test/symbol.rb @@ -19,14 +19,17 @@ end assert("Symbol#capitalize") do assert_equal :Hello, :hello.capitalize assert_equal :Hello, :HELLO.capitalize + assert_equal :Hello, :Hello.capitalize end assert("Symbol#downcase") do assert_equal :hello, :hEllO.downcase + assert_equal :hello, :hello.downcase end assert("Symbol#upcase") do assert_equal :HELLO, :hEllO.upcase + assert_equal :HELLO, :HELLO.upcase end assert("Symbol#casecmp") do -- cgit v1.2.3 From 7015493efbc2efe6820d65eabad387f3fea4a414 Mon Sep 17 00:00:00 2001 From: take_cheeze Date: Fri, 20 Jun 2014 21:56:03 +0900 Subject: Reduce string creation of `length`, `size`, `empty?` method of `Symbol` extension. --- mrbgems/mruby-symbol-ext/mrblib/symbol.rb | 13 +------------ mrbgems/mruby-symbol-ext/src/symbol.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/mrbgems/mruby-symbol-ext/mrblib/symbol.rb b/mrbgems/mruby-symbol-ext/mrblib/symbol.rb index b2615a760..1e249c281 100644 --- a/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +++ b/mrbgems/mruby-symbol-ext/mrblib/symbol.rb @@ -7,17 +7,6 @@ class Symbol end end - ## - # call-seq: - # sym.length -> integer - # - # Same as sym.to_s.length. - - def length - self.to_s.length - end - alias :size :length - ## # call-seq: # sym.capitalize -> symbol @@ -66,7 +55,7 @@ class Symbol # Returns that _sym_ is :"" or not. def empty? - self.to_s.empty? + self.length == 0 end end diff --git a/mrbgems/mruby-symbol-ext/src/symbol.c b/mrbgems/mruby-symbol-ext/src/symbol.c index 4ed5d83c6..7ca749999 100644 --- a/mrbgems/mruby-symbol-ext/src/symbol.c +++ b/mrbgems/mruby-symbol-ext/src/symbol.c @@ -42,11 +42,27 @@ mrb_sym_all_symbols(mrb_state *mrb, mrb_value self) return ary; } +/* + * call-seq: + * sym.length -> integer + * + * Same as sym.to_s.length. + */ +static mrb_value +mrb_sym_length(mrb_state *mrb, mrb_value self) +{ + mrb_int len; + mrb_sym2name_len(mrb, mrb_symbol(self), &len); + return mrb_fixnum_value(len); +} + void mrb_mruby_symbol_ext_gem_init(mrb_state* mrb) { struct RClass *s = mrb->symbol_class; mrb_define_class_method(mrb, s, "all_symbols", mrb_sym_all_symbols, MRB_ARGS_NONE()); + mrb_define_method(mrb, s, "length", mrb_sym_length, MRB_ARGS_NONE()); + mrb_define_method(mrb, s, "size", mrb_sym_length, MRB_ARGS_NONE()); } void -- cgit v1.2.3 From 1633469e9c881003caa1589a12b3592289df8901 Mon Sep 17 00:00:00 2001 From: take_cheeze Date: Fri, 20 Jun 2014 22:07:44 +0900 Subject: Reduce string creation in `Symbol#casecmp` by using `case!`. --- mrbgems/mruby-symbol-ext/mrblib/symbol.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mrbgems/mruby-symbol-ext/mrblib/symbol.rb b/mrbgems/mruby-symbol-ext/mrblib/symbol.rb index 1e249c281..acb2a562c 100644 --- a/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +++ b/mrbgems/mruby-symbol-ext/mrblib/symbol.rb @@ -45,7 +45,9 @@ class Symbol def casecmp(other) return nil unless other.kind_of?(Symbol) - self.to_s.upcase <=> other.to_s.upcase + lhs = self.to_s; lhs.upcase! + rhs = other.to_s; rhs.upcase! + lhs <=> rhs end # -- cgit v1.2.3