Skip to content

Commit

Permalink
Reduce copy to symbol in class and method defining.
Browse files Browse the repository at this point in the history
  • Loading branch information
take-cheeze committed Jul 4, 2018
1 parent 5bb3f60 commit 3767b11
Show file tree
Hide file tree
Showing 13 changed files with 319 additions and 124 deletions.
3 changes: 3 additions & 0 deletions include/mrbconf.h
Expand Up @@ -72,6 +72,9 @@

/* argv max size in mrb_funcall */
//#define MRB_FUNCALL_ARGC_MAX 16
#ifndef MRB_FUNCALL_ARGC_MAX
#define MRB_FUNCALL_ARGC_MAX 16
#endif

/* number of object per heap page */
//#define MRB_HEAP_PAGE_SIZE 1024
Expand Down
119 changes: 96 additions & 23 deletions include/mruby.h

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion mrbgems/mruby-struct/src/struct.c
Expand Up @@ -223,7 +223,7 @@ make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass *kl
mrb_warn(mrb, "redefining constant Struct::%S", name);
mrb_const_remove(mrb, mrb_obj_value(klass), id);
}
c = mrb_define_class_under(mrb, klass, RSTRING_PTR(name), klass);
c = mrb_define_class_under_id(mrb, klass, mrb_intern_str(mrb, name), klass);
}
MRB_SET_INSTANCE_TT(c, MRB_TT_ARRAY);
nstr = mrb_obj_value(c);
Expand Down
132 changes: 129 additions & 3 deletions mrbgems/mruby-symbol-ext/src/symbol.c
@@ -1,7 +1,133 @@
#define MRB_DISABLE_LITERAL_INTERN

#include <mruby.h>
#include <mruby/khash.h>
#include <mruby/array.h>

#include <stdarg.h>

MRB_API struct RClass*
mrb_define_module(mrb_state *mrb, const char *name)
{
return mrb_define_module_id(mrb, mrb_intern_cstr(mrb, name));
}

MRB_API struct RClass*
mrb_define_module_under(mrb_state *mrb, struct RClass *outer, const char *name)
{
return mrb_define_module_under_id(mrb, outer, mrb_intern_cstr(mrb, name));
}

MRB_API struct RClass*
mrb_define_class(mrb_state *mrb, const char *name, struct RClass *super)
{
return mrb_define_class_id(mrb, mrb_intern_cstr(mrb, name), super);
}

MRB_API mrb_bool
mrb_class_defined(mrb_state *mrb, const char *name)
{
return mrb_class_defined_id(mrb, mrb_intern_cstr(mrb, name));
}

MRB_API struct RClass *
mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name)
{
return mrb_class_get_under_id(mrb, outer, mrb_intern_cstr(mrb, name));
}

MRB_API struct RClass *
mrb_class_get(mrb_state *mrb, const char *name)
{
return mrb_class_get_id(mrb, mrb_intern_cstr(mrb, name));
}

MRB_API struct RClass *
mrb_module_get_under(mrb_state *mrb, struct RClass *outer, const char *name)
{
return mrb_module_get_under_id(mrb, outer, mrb_intern_cstr(mrb, name));
}

MRB_API struct RClass *
mrb_module_get(mrb_state *mrb, const char *name)
{
return mrb_module_get_id(mrb, mrb_intern_cstr(mrb, name));
}

MRB_API struct RClass *
mrb_define_classunder(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super)
{
return mrb_define_class_under_id(mrb, outer, mrb_intern_cstr(mrb, name), super);
}

MRB_API void
mrb_define_method(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, mrb_aspec aspec)
{
mrb_define_method_id(mrb, c, mrb_intern_cstr(mrb, name), func, aspec);
}

MRB_API void
mrb_define_singleton_method(mrb_state *mrb, struct RObject *o, const char *name, mrb_func_t func, mrb_aspec aspec)
{
mrb_define_singleton_method_id(mrb, o, mrb_intern_cstr(mrb, name), func, aspec);
}

MRB_API void
mrb_define_class_method(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, mrb_aspec aspec)
{
mrb_define_class_method_id(mrb, c, mrb_intern_cstr(mrb, name), func, aspec);
}

MRB_API void
mrb_define_module_function(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, mrb_aspec aspec)
{
mrb_define_module_function_id(mrb, c, mrb_intern_cstr(mrb, name), func, aspec);
}

MRB_API void
mrb_undef_method(mrb_state *mrb, struct RClass *c, const char *name)
{
mrb_undef_method_id(mrb, c, mrb_intern_cstr(mrb, name));
}

MRB_API void
mrb_undef_class_method(mrb_state *mrb, struct RClass *c, const char *name)
{
mrb_undef_class_method_id(mrb, c, mrb_intern_cstr(mrb, name));
}

MRB_API void
mrb_define_const(mrb_state *mrb, struct RClass *mod, const char *name, mrb_value v)
{
mrb_define_const_id(mrb, mod, mrb_intern_cstr(mrb, name), v);
}

MRB_API void
mrb_define_global_const(mrb_state *mrb, const char *name, mrb_value val)
{
mrb_define_global_const_id(mrb, mrb_intern_cstr(mrb, name), val);
}

MRB_API mrb_value
mrb_funcall(mrb_state *mrb, mrb_value self, const char *name, mrb_int argc, ...)
{
mrb_value argv[MRB_FUNCALL_ARGC_MAX];
va_list ap;
mrb_int i;
mrb_sym mid = mrb_intern_cstr(mrb, name);

if (argc > MRB_FUNCALL_ARGC_MAX) {
mrb_raise(mrb, mrb_exc_get_id(mrb, mrb_intern_lit(mrb, "ArgumentError")), "Too long arguments. (limit=" MRB_STRINGIZE(MRB_FUNCALL_ARGC_MAX) ")");
}

va_start(ap, argc);
for (i = 0; i < argc; i++) {
argv[i] = va_arg(ap, mrb_value);
}
va_end(ap);
return mrb_funcall_argv(mrb, self, mid, argc, argv);
}

typedef struct symbol_name {
size_t len;
const char *name;
Expand Down Expand Up @@ -53,9 +179,9 @@ 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());
mrb_define_class_method_id(mrb, s, mrb_intern_lit(mrb, "all_symbols"), mrb_sym_all_symbols, MRB_ARGS_NONE());
mrb_define_method_id(mrb, s, mrb_intern_lit(mrb, "length"), mrb_sym_length, MRB_ARGS_NONE());
mrb_define_method_id(mrb, s, mrb_intern_lit(mrb, "size"), mrb_sym_length, MRB_ARGS_NONE());
}

void
Expand Down
16 changes: 16 additions & 0 deletions mrbgems/mruby-test/driver.c
Expand Up @@ -81,13 +81,29 @@ mrb_t_printstr(mrb_state *mrb, mrb_value self)
return argv;
}

mrb_int mrb_symbol_lit_count(mrb_state *mrb);

static mrb_value
mrb_t_lit_symbols_count(mrb_state *mrb, mrb_value self)
{
return mrb_fixnum_value(mrb_symbol_lit_count(mrb));
}

static mrb_value
mrb_t_symbols_count(mrb_state *mrb, mrb_value self)
{
return mrb_fixnum_value(mrb->symidx);
}

void
mrb_init_test_driver(mrb_state *mrb, mrb_bool verbose)
{
struct RClass *krn, *mrbtest;

krn = mrb->kernel_module;
mrb_define_method(mrb, krn, "__t_printstr__", mrb_t_printstr, MRB_ARGS_REQ(1));
mrb_define_method(mrb, krn, "__t_lit_symbols_count__", mrb_t_lit_symbols_count, MRB_ARGS_NONE());
mrb_define_method(mrb, krn, "__t_symbols_count__", mrb_t_symbols_count, MRB_ARGS_NONE());

mrbtest = mrb_define_module(mrb, "Mrbtest");

Expand Down

0 comments on commit 3767b11

Please sign in to comment.