Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PoC] Reduce copy of C string to symbol in class, module and method definition. #4065

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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