summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/mruby.h3
-rw-r--r--mrbgems/mruby-symbol-ext/mrblib/symbol.rb23
-rw-r--r--mrbgems/mruby-symbol-ext/src/symbol.c16
-rw-r--r--mrbgems/mruby-symbol-ext/test/symbol.rb3
-rw-r--r--src/init.c5
-rw-r--r--src/state.c22
6 files changed, 47 insertions, 25 deletions
diff --git a/include/mruby.h b/include/mruby.h
index 7b9f1b428..80bbe2d68 100644
--- a/include/mruby.h
+++ b/include/mruby.h
@@ -296,8 +296,11 @@ mrb_value mrb_str_new_static(mrb_state *mrb, const char *p, size_t len);
mrb_state* mrb_open(void);
mrb_state* mrb_open_allocf(mrb_allocf, void *ud);
+mrb_state* mrb_open_core(mrb_allocf, void *ud);
void mrb_close(mrb_state*);
+void* mrb_default_allocf(mrb_state*, void*, size_t, void*);
+
mrb_value mrb_top_self(mrb_state *);
mrb_value mrb_run(mrb_state*, struct RProc*, mrb_value);
mrb_value mrb_toplevel_run(mrb_state*, struct RProc*);
diff --git a/mrbgems/mruby-symbol-ext/mrblib/symbol.rb b/mrbgems/mruby-symbol-ext/mrblib/symbol.rb
index 4cf18f647..acb2a562c 100644
--- a/mrbgems/mruby-symbol-ext/mrblib/symbol.rb
+++ b/mrbgems/mruby-symbol-ext/mrblib/symbol.rb
@@ -9,23 +9,12 @@ class Symbol
##
# call-seq:
- # sym.length -> integer
- #
- # Same as <code>sym.to_s.length</code>.
-
- def length
- self.to_s.length
- end
- alias :size :length
-
- ##
- # call-seq:
# sym.capitalize -> symbol
#
# Same as <code>sym.to_s.capitalize.intern</code>.
def capitalize
- self.to_s.capitalize.intern
+ (self.to_s.capitalize! || self).to_sym
end
##
@@ -35,7 +24,7 @@ class Symbol
# Same as <code>sym.to_s.downcase.intern</code>.
def downcase
- self.to_s.downcase.intern
+ (self.to_s.downcase! || self).to_sym
end
##
@@ -45,7 +34,7 @@ class Symbol
# Same as <code>sym.to_s.upcase.intern</code>.
def upcase
- self.to_s.upcase.intern
+ (self.to_s.upcase! || self).to_sym
end
##
@@ -56,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
#
@@ -66,7 +57,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 <code>sym.to_s.length</code>.
+ */
+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
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
diff --git a/src/init.c b/src/init.c
index 9489cea10..955d6e3a1 100644
--- a/src/init.c
+++ b/src/init.c
@@ -24,8 +24,6 @@ void mrb_init_gc(mrb_state*);
void mrb_init_math(mrb_state*);
void mrb_init_version(mrb_state*);
void mrb_init_mrblib(mrb_state*);
-void mrb_init_mrbgems(mrb_state*);
-void mrb_final_mrbgems(mrb_state*);
#define DONE mrb_gc_arena_restore(mrb, 0);
void
@@ -50,7 +48,4 @@ mrb_init_core(mrb_state *mrb)
mrb_init_gc(mrb); DONE;
mrb_init_version(mrb); DONE;
mrb_init_mrblib(mrb); DONE;
-#ifndef DISABLE_GEMS
- mrb_init_mrbgems(mrb); DONE;
-#endif
}
diff --git a/src/state.c b/src/state.c
index 3e82a159d..8857d3294 100644
--- a/src/state.c
+++ b/src/state.c
@@ -14,6 +14,7 @@
void mrb_init_heap(mrb_state*);
void mrb_init_core(mrb_state*);
+void mrb_init_mrbgems(mrb_state*);
static mrb_value
inspect_main(mrb_state *mrb, mrb_value mod)
@@ -22,7 +23,7 @@ inspect_main(mrb_state *mrb, mrb_value mod)
}
mrb_state*
-mrb_open_allocf(mrb_allocf f, void *ud)
+mrb_open_core(mrb_allocf f, void *ud)
{
static const mrb_state mrb_state_zero = { 0 };
static const struct mrb_context mrb_context_zero = { 0 };
@@ -50,13 +51,14 @@ mrb_open_allocf(mrb_allocf f, void *ud)
mrb->c = (struct mrb_context*)mrb_malloc(mrb, sizeof(struct mrb_context));
*mrb->c = mrb_context_zero;
mrb->root_c = mrb->c;
+
mrb_init_core(mrb);
return mrb;
}
-static void*
-allocf(mrb_state *mrb, void *p, size_t size, void *ud)
+void*
+mrb_default_allocf(mrb_state *mrb, void *p, size_t size, void *ud)
{
if (size == 0) {
free(p);
@@ -102,8 +104,20 @@ mrb_alloca_free(mrb_state *mrb)
mrb_state*
mrb_open(void)
{
- mrb_state *mrb = mrb_open_allocf(allocf, NULL);
+ mrb_state *mrb = mrb_open_allocf(mrb_default_allocf, NULL);
+
+ return mrb;
+}
+mrb_state*
+mrb_open_allocf(mrb_allocf f, void *ud)
+{
+ mrb_state *mrb = mrb_open_core(f, ud);
+
+#ifndef DISABLE_GEMS
+ mrb_init_mrbgems(mrb);
+ mrb_gc_arena_restore(mrb, 0);
+#endif
return mrb;
}