diff options
| -rw-r--r-- | MITL | 2 | ||||
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | include/mruby.h | 2 | ||||
| -rw-r--r-- | include/mruby/class.h | 1 | ||||
| -rw-r--r-- | src/class.c | 23 | ||||
| -rw-r--r-- | src/dump.c | 18 | ||||
| -rw-r--r-- | src/vm.c | 3 |
7 files changed, 8 insertions, 43 deletions
@@ -1,4 +1,4 @@ -Copyright (c) 2014 mruby developers +Copyright (c) 2015 mruby developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -70,7 +70,7 @@ how to use mrbgems look into the folder *examples/mrbgems/*. ## License -Copyright (c) 2014 mruby developers +Copyright (c) 2015 mruby developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), diff --git a/include/mruby.h b/include/mruby.h index 1e616a1ee..6c84a0e87 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -1,7 +1,7 @@ /* ** mruby - An embeddable Ruby implementation ** -** Copyright (c) mruby developers 2010-2014 +** Copyright (c) mruby developers 2010-2015 ** ** Permission is hereby granted, free of charge, to any person obtaining ** a copy of this software and associated documentation files (the diff --git a/include/mruby/class.h b/include/mruby/class.h index 17d53bea2..9d5260a24 100644 --- a/include/mruby/class.h +++ b/include/mruby/class.h @@ -55,7 +55,6 @@ MRB_API struct RClass* mrb_define_class_id(mrb_state*, mrb_sym, struct RClass*); MRB_API struct RClass* mrb_define_module_id(mrb_state*, mrb_sym); MRB_API struct RClass *mrb_vm_define_class(mrb_state*, mrb_value, mrb_value, mrb_sym); MRB_API struct RClass *mrb_vm_define_module(mrb_state*, mrb_value, mrb_sym); -MRB_API void mrb_define_method_vm(mrb_state*, struct RClass*, mrb_sym, mrb_value); MRB_API void mrb_define_method_raw(mrb_state*, struct RClass*, mrb_sym, struct RProc *); MRB_API void mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, mrb_aspec aspec); MRB_API void mrb_alias_method(mrb_state *mrb, struct RClass *c, mrb_sym a, mrb_sym b); diff --git a/src/class.c b/src/class.c index dc396f277..7ec6e6944 100644 --- a/src/class.c +++ b/src/class.c @@ -347,22 +347,6 @@ mrb_define_method(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t mrb_define_method_id(mrb, c, mrb_intern_cstr(mrb, name), func, aspec); } -MRB_API void -mrb_define_method_vm(mrb_state *mrb, struct RClass *c, mrb_sym name, mrb_value body) -{ - khash_t(mt) *h = c->mt; - khiter_t k; - struct RProc *p; - - if (!h) h = c->mt = kh_init(mt, mrb); - k = kh_put(mt, mrb, h, name); - p = mrb_proc_ptr(body); - kh_value(h, k) = p; - if (p) { - mrb_field_write_barrier(mrb, (struct RBasic *)c, (struct RBasic *)p); - } -} - /* a function to raise NotImplementedError with current method name */ MRB_API void mrb_notimplement(mrb_state *mrb) @@ -1516,7 +1500,7 @@ mrb_alias_method(mrb_state *mrb, struct RClass *c, mrb_sym a, mrb_sym b) { struct RProc *m = mrb_method_search(mrb, c, b); - mrb_define_method_vm(mrb, c, a, mrb_obj_value(m)); + mrb_define_method_raw(mrb, c, a, m); } /*! @@ -1608,14 +1592,11 @@ mrb_mod_alias(mrb_state *mrb, mrb_value mod) static void undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a) { - mrb_value m; - if (!mrb_obj_respond_to(mrb, c, a)) { mrb_name_error(mrb, a, "undefined method '%S' for class '%S'", mrb_sym2str(mrb, a), mrb_obj_value(c)); } else { - SET_PROC_VALUE(m, 0); - mrb_define_method_vm(mrb, c, a, m); + mrb_define_method_raw(mrb, c, a, NULL); } } diff --git a/src/dump.c b/src/dump.c index 285aa08d9..1ab4c47c5 100644 --- a/src/dump.c +++ b/src/dump.c @@ -1020,22 +1020,6 @@ mrb_dump_irep_binary(mrb_state *mrb, mrb_irep *irep, uint8_t flags, FILE* fp) } static mrb_bool -is_valid_c_symbol_name(const char *name) -{ - const char *c = NULL; - - if (name == NULL || name[0] == '\0') return FALSE; - if (!ISALPHA(name[0]) && name[0] != '_') return FALSE; - - c = &name[1]; - for (; *c != '\0'; ++c) { - if (!ISALNUM(*c) && *c != '_') return FALSE; - } - - return TRUE; -} - -static mrb_bool dump_bigendian_p(uint8_t flags) { switch (flags & DUMP_ENDIAN_NAT) { @@ -1056,7 +1040,7 @@ mrb_dump_irep_cfunc(mrb_state *mrb, mrb_irep *irep, uint8_t flags, FILE *fp, con size_t bin_size = 0, bin_idx = 0; int result; - if (fp == NULL || initname == NULL || !is_valid_c_symbol_name(initname)) { + if (fp == NULL || initname == NULL || initname[0] == '\0') { return MRB_DUMP_INVALID_ARGUMENT; } flags = dump_flags(flags, FLAG_BYTEORDER_NATIVE); @@ -2303,8 +2303,9 @@ RETRY_TRY_BLOCK: /* A B R(A).newmethod(Syms(B),R(A+1)) */ int a = GETARG_A(i); struct RClass *c = mrb_class_ptr(regs[a]); + struct RProc *p = mrb_proc_ptr(regs[a+1]); - mrb_define_method_vm(mrb, c, syms[GETARG_B(i)], regs[a+1]); + mrb_define_method_raw(mrb, c, syms[GETARG_B(i)], p); ARENA_RESTORE(mrb, ai); NEXT; } |
