Ignore:
Timestamp:
Jul 9, 2020, 8:51:43 AM (4 years ago)
Author:
coas-nagasima
Message:

mrubyを2.1.1に更新

Location:
EcnlProtoTool/trunk/mruby-2.1.1
Files:
1 edited
1 moved

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/mruby-2.1.1/src/class.c

    r331 r439  
    88#include <mruby.h>
    99#include <mruby/array.h>
     10#include <mruby/hash.h>
    1011#include <mruby/class.h>
    1112#include <mruby/numeric.h>
     
    1617#include <mruby/data.h>
    1718#include <mruby/istruct.h>
    18 
    19 KHASH_DEFINE(mt, mrb_sym, struct RProc*, TRUE, kh_int_hash_func, kh_int_hash_equal)
     19#include <mruby/opcode.h>
     20
     21KHASH_DEFINE(mt, mrb_sym, mrb_method_t, TRUE, kh_int_hash_func, kh_int_hash_equal)
    2022
    2123void
     
    2830  for (k = kh_begin(h); k != kh_end(h); k++) {
    2931    if (kh_exist(h, k)) {
    30       struct RProc *m = kh_value(h, k);
    31       if (m) {
    32         mrb_gc_mark(mrb, (struct RBasic*)m);
     32      mrb_method_t m = kh_value(h, k);
     33
     34      if (MRB_METHOD_PROC_P(m)) {
     35        struct RProc *p = MRB_METHOD_PROC(m);
     36        mrb_gc_mark(mrb, (struct RBasic*)p);
    3337      }
    3438    }
     
    5155}
    5256
    53 static void
    54 name_class(mrb_state *mrb, struct RClass *c, mrb_sym name)
    55 {
    56   mrb_obj_iv_set(mrb, (struct RObject*)c,
    57                  mrb_intern_lit(mrb, "__classid__"), mrb_symbol_value(name));
     57void
     58mrb_class_name_class(mrb_state *mrb, struct RClass *outer, struct RClass *c, mrb_sym id)
     59{
     60  mrb_value name;
     61  mrb_sym nsym = mrb_intern_lit(mrb, "__classname__");
     62
     63  if (mrb_obj_iv_defined(mrb, (struct RObject*)c, nsym)) return;
     64  if (outer == NULL || outer == mrb->object_class) {
     65    name = mrb_symbol_value(id);
     66  }
     67  else {
     68    name = mrb_class_path(mrb, outer);
     69    if (mrb_nil_p(name)) {      /* unnamed outer class */
     70      if (outer != mrb->object_class && outer != c) {
     71        mrb_obj_iv_set_force(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__"),
     72                             mrb_obj_value(outer));
     73      }
     74      return;
     75    }
     76    else {
     77      mrb_int len;
     78      const char *n = mrb_sym_name_len(mrb, id, &len);
     79
     80      mrb_str_cat_lit(mrb, name, "::");
     81      mrb_str_cat(mrb, name, n, len);
     82    }
     83  }
     84  mrb_obj_iv_set_force(mrb, (struct RObject*)c, nsym, name);
     85}
     86
     87mrb_bool
     88mrb_const_name_p(mrb_state *mrb, const char *name, mrb_int len)
     89{
     90  return len > 0 && ISUPPER(name[0]) && mrb_ident_p(name+1, len-1);
    5891}
    5992
     
    6194setup_class(mrb_state *mrb, struct RClass *outer, struct RClass *c, mrb_sym id)
    6295{
    63   name_class(mrb, c, id);
     96  mrb_class_name_class(mrb, outer, c, id);
    6497  mrb_obj_iv_set(mrb, (struct RObject*)outer, id, mrb_obj_value(c));
    65   if (outer != mrb->object_class) {
    66     mrb_obj_iv_set(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__"),
    67                    mrb_obj_value(outer));
    68   }
    6998}
    7099
     
    78107  if (o->c->tt == MRB_TT_SCLASS) return;
    79108  sc = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_SCLASS, mrb->class_class);
     109  sc->flags |= MRB_FL_CLASS_IS_INHERITED;
    80110  sc->mt = kh_init(mt, mrb);
    81111  sc->iv = 0;
     
    104134  mrb_field_write_barrier(mrb, (struct RBasic*)sc, (struct RBasic*)o);
    105135  mrb_obj_iv_set(mrb, (struct RObject*)sc, mrb_intern_lit(mrb, "__attached__"), mrb_obj_value(o));
    106 }
    107 
    108 static struct RClass *
     136  sc->flags |= o->flags & MRB_FL_OBJ_IS_FROZEN;
     137}
     138
     139static mrb_value
     140class_name_str(mrb_state *mrb, struct RClass* c)
     141{
     142  mrb_value path = mrb_class_path(mrb, c);
     143  if (mrb_nil_p(path)) {
     144    path = c->tt == MRB_TT_MODULE ? mrb_str_new_lit(mrb, "#<Module:") :
     145                                    mrb_str_new_lit(mrb, "#<Class:");
     146    mrb_str_cat_str(mrb, path, mrb_ptr_to_str(mrb, c));
     147    mrb_str_cat_lit(mrb, path, ">");
     148  }
     149  return path;
     150}
     151
     152static struct RClass*
    109153class_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id)
    110154{
     
    115159}
    116160
    117 static struct RClass *
     161static struct RClass*
    118162module_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id)
    119163{
     
    137181}
    138182
    139 MRB_API struct RClass*
    140 mrb_class_outer_module(mrb_state *mrb, struct RClass *c)
    141 {
    142   mrb_value outer;
    143   struct RClass *cls;
    144 
    145   outer = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__"));
    146   if (mrb_nil_p(outer)) return NULL;
    147   cls = mrb_class_ptr(outer);
    148   if (cls->tt == MRB_TT_SCLASS)
    149   {
    150     mrb_value klass;
    151     klass = mrb_obj_iv_get(mrb, (struct RObject *)cls,
    152                            mrb_intern_lit(mrb, "__attached__"));
    153     if (class_ptr_p(klass)) {
    154       cls = mrb_class_ptr(klass);
    155     }
    156   }
    157   return cls;
    158 }
    159 
    160183static void
    161184check_if_class_or_module(mrb_state *mrb, mrb_value obj)
    162185{
    163186  if (!class_ptr_p(obj)) {
    164     mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a class/module", mrb_inspect(mrb, obj));
     187    mrb_raisef(mrb, E_TYPE_ERROR, "%!v is not a class/module", obj);
    165188  }
    166189}
     
    192215}
    193216
    194 MRB_API struct RClass*
     217struct RClass*
    195218mrb_vm_define_module(mrb_state *mrb, mrb_value outer, mrb_sym id)
    196219{
     
    199222    mrb_value old = mrb_const_get(mrb, outer, id);
    200223
    201     if (mrb_type(old) != MRB_TT_MODULE) {
    202       mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a module", mrb_inspect(mrb, old));
     224    if (!mrb_module_p(old)) {
     225      mrb_raisef(mrb, E_TYPE_ERROR, "%!v is not a module", old);
    203226    }
    204227    return mrb_class_ptr(old);
     
    233256    MRB_CLASS_ORIGIN(c);
    234257    if (super && mrb_class_real(c->super) != super) {
    235       mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for Class %S (%S not %S)",
    236                  mrb_sym2str(mrb, name),
    237                  mrb_obj_value(c->super), mrb_obj_value(super));
     258      mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for Class %n (%C not %C)",
     259                 name, c->super, super);
    238260    }
    239261    return c;
     
    250272{
    251273  if (!super) {
    252     mrb_warn(mrb, "no super class for '%S', Object assumed", mrb_sym2str(mrb, name));
     274    mrb_warn(mrb, "no super class for '%n', Object assumed", name);
    253275  }
    254276  return define_class(mrb, name, super, mrb->object_class);
     
    261283}
    262284
    263 static mrb_value mrb_bob_init(mrb_state *mrb, mrb_value cv);
     285static mrb_value mrb_bob_init(mrb_state *mrb, mrb_value);
     286#ifdef MRB_METHOD_CACHE
     287static void mc_clear_all(mrb_state *mrb);
     288static void mc_clear_by_id(mrb_state *mrb, struct RClass*, mrb_sym);
     289#else
     290#define mc_clear_all(mrb)
     291#define mc_clear_by_id(mrb,c,s)
     292#endif
    264293
    265294static void
     
    271300  if (!super)
    272301    super = mrb->object_class;
     302  super->flags |= MRB_FL_CLASS_IS_INHERITED;
    273303  s = mrb_obj_value(super);
     304  mrb_mc_clear_by_class(mrb, klass);
    274305  mid = mrb_intern_lit(mrb, "inherited");
    275306  if (!mrb_func_basic_p(mrb, s, mid, mrb_bob_init)) {
    276307    mrb_value c = mrb_obj_value(klass);
    277     mrb_funcall_argv(mrb, mrb_obj_value(super), mid, 1, &c);
    278   }
    279 }
    280 
    281 MRB_API struct RClass*
     308    mrb_funcall_argv(mrb, s, mid, 1, &c);
     309  }
     310}
     311
     312struct RClass*
    282313mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id)
    283314{
     
    286317
    287318  if (!mrb_nil_p(super)) {
    288     if (mrb_type(super) != MRB_TT_CLASS) {
    289       mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%S given)",
    290                  mrb_inspect(mrb, super));
     319    if (!mrb_class_p(super)) {
     320      mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%!v given)", super);
    291321    }
    292322    s = mrb_class_ptr(super);
     
    299329    mrb_value old = mrb_const_get(mrb, outer, id);
    300330
    301     if (mrb_type(old) != MRB_TT_CLASS) {
    302       mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a class", mrb_inspect(mrb, old));
     331    if (!mrb_class_p(old)) {
     332      mrb_raisef(mrb, E_TYPE_ERROR, "%!v is not a class", old);
    303333    }
    304334    c = mrb_class_ptr(old);
     
    306336      /* check super class */
    307337      if (mrb_class_real(c->super) != s) {
    308         mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for class %S", old);
     338        mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for class %v", old);
    309339      }
    310340    }
     
    337367}
    338368
    339 MRB_API struct RClass *
     369MRB_API struct RClass*
    340370mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name)
    341371{
     
    343373}
    344374
    345 MRB_API struct RClass *
     375MRB_API struct RClass*
    346376mrb_class_get(mrb_state *mrb, const char *name)
    347377{
     
    349379}
    350380
    351 MRB_API struct RClass *
     381MRB_API struct RClass*
    352382mrb_exc_get(mrb_state *mrb, const char *name)
    353383{
     
    356386                              mrb_intern_cstr(mrb, name));
    357387
    358   if (mrb_type(c) != MRB_TT_CLASS) {
     388  if (!mrb_class_p(c)) {
    359389    mrb_raise(mrb, mrb->eException_class, "exception corrupted");
    360390  }
     
    369399}
    370400
    371 MRB_API struct RClass *
     401MRB_API struct RClass*
    372402mrb_module_get_under(mrb_state *mrb, struct RClass *outer, const char *name)
    373403{
     
    375405}
    376406
    377 MRB_API struct RClass *
     407MRB_API struct RClass*
    378408mrb_module_get(mrb_state *mrb, const char *name)
    379409{
     
    384414 * Defines a class under the namespace of \a outer.
    385415 * \param outer  a class which contains the new class.
    386  * \param id     name of the new class
     416 * \param name     name of the new class
    387417 * \param super  a class from which the new class will derive.
    388418 *               NULL means \c Object class.
     
    397427 *       \a super, the function just returns the defined class.
    398428 */
    399 MRB_API struct RClass *
     429MRB_API struct RClass*
    400430mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super)
    401431{
     
    405435#if 0
    406436  if (!super) {
    407     mrb_warn(mrb, "no super class for '%S::%S', Object assumed",
    408              mrb_obj_value(outer), mrb_sym2str(mrb, id));
     437    mrb_warn(mrb, "no super class for '%C::%n', Object assumed", outer, id);
    409438  }
    410439#endif
     
    415444
    416445MRB_API void
    417 mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p)
     446mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_method_t m)
    418447{
    419448  khash_t(mt) *h;
     
    422451  h = c->mt;
    423452
    424   if (MRB_FROZEN_P(c)) {
    425     if (c->tt == MRB_TT_MODULE)
    426       mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen module");
    427     else
    428       mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen class");
    429   }
     453  mrb_check_frozen(mrb, c);
    430454  if (!h) h = c->mt = kh_init(mt, mrb);
    431455  k = kh_put(mt, mrb, h, mid);
    432   kh_value(h, k) = p;
    433   if (p) {
     456  kh_value(h, k) = m;
     457  if (MRB_METHOD_PROC_P(m) && !MRB_METHOD_UNDEF_P(m)) {
     458    struct RProc *p = MRB_METHOD_PROC(m);
     459
     460    p->flags |= MRB_PROC_SCOPE;
    434461    p->c = NULL;
    435     mrb_field_write_barrier(mrb, (struct RBasic *)c, (struct RBasic *)p);
    436   }
     462    mrb_field_write_barrier(mrb, (struct RBasic*)c, (struct RBasic*)p);
     463    if (!MRB_PROC_ENV_P(p)) {
     464      MRB_PROC_SET_TARGET_CLASS(p, c);
     465    }
     466  }
     467  mc_clear_by_id(mrb, c, mid);
    437468}
    438469
     
    440471mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, mrb_aspec aspec)
    441472{
    442   struct RProc *p;
     473  mrb_method_t m;
    443474  int ai = mrb_gc_arena_save(mrb);
    444475
    445   p = mrb_proc_new_cfunc(mrb, func);
    446   p->target_class = c;
    447   mrb_define_method_raw(mrb, c, mid, p);
     476  MRB_METHOD_FROM_FUNC(m, func);
     477  if (aspec == MRB_ARGS_NONE()) {
     478    MRB_METHOD_NOARG_SET(m);
     479  }
     480  mrb_define_method_raw(mrb, c, mid, m);
    448481  mrb_gc_arena_restore(mrb, ai);
    449482}
     
    459492mrb_notimplement(mrb_state *mrb)
    460493{
    461   const char *str;
    462   mrb_int len;
    463494  mrb_callinfo *ci = mrb->c->ci;
    464495
    465496  if (ci->mid) {
    466     str = mrb_sym2name_len(mrb, ci->mid, &len);
    467     mrb_raisef(mrb, E_NOTIMP_ERROR,
    468       "%S() function is unimplemented on this machine",
    469       mrb_str_new_static(mrb, str, (size_t)len));
     497    mrb_raisef(mrb, E_NOTIMP_ERROR, "%n() function is unimplemented on this machine", ci->mid);
    470498  }
    471499}
     
    481509
    482510static mrb_value
    483 check_type(mrb_state *mrb, mrb_value val, enum mrb_vtype t, const char *c, const char *m)
    484 {
    485   mrb_value tmp;
    486 
    487   tmp = mrb_check_convert_type(mrb, val, t, c, m);
    488   if (mrb_nil_p(tmp)) {
    489     mrb_raisef(mrb, E_TYPE_ERROR, "expected %S", mrb_str_new_cstr(mrb, c));
    490   }
    491   return tmp;
    492 }
    493 
    494 static mrb_value
    495 to_str(mrb_state *mrb, mrb_value val)
    496 {
    497   return check_type(mrb, val, MRB_TT_STRING, "String", "to_str");
    498 }
    499 
    500 static mrb_value
    501511to_ary(mrb_state *mrb, mrb_value val)
    502512{
    503   return check_type(mrb, val, MRB_TT_ARRAY, "Array", "to_ary");
     513  mrb_check_type(mrb, val, MRB_TT_ARRAY);
     514  return val;
    504515}
    505516
     
    507518to_hash(mrb_state *mrb, mrb_value val)
    508519{
    509   return check_type(mrb, val, MRB_TT_HASH, "Hash", "to_hash");
    510 }
    511 
    512 static mrb_sym
    513 to_sym(mrb_state *mrb, mrb_value ss)
    514 {
    515   if (mrb_type(ss) == MRB_TT_SYMBOL) {
    516     return mrb_symbol(ss);
    517   }
    518   else if (mrb_string_p(ss)) {
    519     return mrb_intern_str(mrb, to_str(mrb, ss));
    520   }
    521   else {
    522     mrb_value obj = mrb_funcall(mrb, ss, "inspect", 0);
    523     mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", obj);
    524     /* not reached */
    525     return 0;
    526   }
    527 }
     520  mrb_check_type(mrb, val, MRB_TT_HASH);
     521  return val;
     522}
     523
     524#define to_sym(mrb, ss) mrb_obj_to_sym(mrb, ss)
     525
     526MRB_API mrb_int
     527mrb_get_argc(mrb_state *mrb)
     528{
     529  mrb_int argc = mrb->c->ci->argc;
     530
     531  if (argc < 0) {
     532    struct RArray *a = mrb_ary_ptr(mrb->c->stack[1]);
     533
     534    argc = ARY_LEN(a);
     535  }
     536  return argc;
     537}
     538
     539MRB_API mrb_value*
     540mrb_get_argv(mrb_state *mrb)
     541{
     542  mrb_int argc = mrb->c->ci->argc;
     543  mrb_value *array_argv = mrb->c->stack + 1;
     544  if (argc < 0) {
     545    struct RArray *a = mrb_ary_ptr(*array_argv);
     546
     547    array_argv = ARY_PTR(a);
     548  }
     549  return array_argv;
     550}
     551
     552void mrb_hash_check_kdict(mrb_state *mrb, mrb_value self);
    528553
    529554/*
     
    539564    ----------------------------------------------------------------------------------------------
    540565    o:      Object         [mrb_value]
    541     C:      class/module   [mrb_value]
     566    C:      Class/Module   [mrb_value]
    542567    S:      String         [mrb_value]            when ! follows, the value may be nil
    543568    A:      Array          [mrb_value]            when ! follows, the value may be nil
     
    546571    z:      String         [char*]                NUL terminated string; z! gives NULL for nil
    547572    a:      Array          [mrb_value*,mrb_int]   Receive two arguments; a! gives (NULL,0) for nil
    548     f:      Float          [mrb_float]
    549     i:      Integer        [mrb_int]
    550     b:      Boolean        [mrb_bool]
    551     n:      Symbol         [mrb_sym]
    552     d:      Data           [void*,mrb_data_type const] 2nd argument will be used to check data type so it won't be modified
    553     I:      Inline struct  [void*]
    554     &:      Block          [mrb_value]
    555     *:      rest argument  [mrb_value*,mrb_int]   Receive the rest of the arguments as an array.
    556     |:      optional                              Next argument of '|' and later are optional.
    557     ?:      optional given [mrb_bool]             true if preceding argument (optional) is given.
     573    f:      Fixnum/Float   [mrb_float]
     574    i:      Fixnum/Float   [mrb_int]
     575    b:      boolean        [mrb_bool]
     576    n:      String/Symbol  [mrb_sym]
     577    d:      data           [void*,mrb_data_type const] 2nd argument will be used to check data type so it won't be modified; when ! follows, the value may be nil
     578    I:      inline struct  [void*]
     579    &:      block          [mrb_value]            &! raises exception if no block given
     580    *:      rest argument  [mrb_value*,mrb_int]   The rest of the arguments as an array; *! avoid copy of the stack
     581    |:      optional                              Following arguments are optional
     582    ?:      optional given [mrb_bool]             true if preceding argument (optional) is given
     583    ':':    keyword args   [mrb_kwargs const]     Get keyword arguments
    558584 */
    559585MRB_API mrb_int
    560586mrb_get_args(mrb_state *mrb, const char *format, ...)
    561587{
     588  const char *fmt = format;
    562589  char c;
    563   int i = 0;
     590  mrb_int i = 0;
    564591  va_list ap;
    565   int argc = mrb->c->ci->argc;
    566   int arg_i = 0;
    567   mrb_bool array_argv;
     592  mrb_int argc = mrb->c->ci->argc;
     593  mrb_value *array_argv = mrb->c->stack+1;
     594  mrb_bool argv_on_stack = argc >= 0;
    568595  mrb_bool opt = FALSE;
     596  mrb_bool opt_skip = TRUE;
    569597  mrb_bool given = TRUE;
    570 
     598  mrb_value kdict;
     599  mrb_bool reqkarg = FALSE;
     600  mrb_int needargc = 0;
     601
     602  if (!argv_on_stack) {
     603    struct RArray *a = mrb_ary_ptr(*array_argv);
     604    array_argv = ARY_PTR(a);
     605    argc = ARY_LEN(a);
     606  }
    571607  va_start(ap, format);
    572   if (argc < 0) {
    573     struct RArray *a = mrb_ary_ptr(mrb->c->stack[1]);
    574 
    575     argc = a->len;
    576     array_argv = TRUE;
     608
     609#define ARGV array_argv
     610
     611  while ((c = *fmt++)) {
     612    switch (c) {
     613    case '|':
     614      opt = TRUE;
     615      break;
     616    case '*':
     617      opt_skip = FALSE;
     618      if (!reqkarg) reqkarg = strchr(fmt, ':') ? TRUE : FALSE;
     619      goto check_exit;
     620    case '!':
     621      break;
     622    case ':':
     623      reqkarg = TRUE;
     624      /* fall through */
     625    case '&': case '?':
     626      if (opt) opt_skip = FALSE;
     627      break;
     628    default:
     629      if (!opt) needargc ++;
     630      break;
     631    }
     632  }
     633
     634 check_exit:
     635  if (reqkarg && argc > needargc && mrb_hash_p(kdict = ARGV[argc - 1])) {
     636    mrb_hash_check_kdict(mrb, kdict);
     637    argc --;
    577638  }
    578639  else {
    579     array_argv = FALSE;
    580   }
    581 
    582 #define ARGV \
    583   (array_argv ? mrb_ary_ptr(mrb->c->stack[1])->ptr : (mrb->c->stack + 1))
    584 
     640    kdict = mrb_nil_value();
     641  }
     642
     643  opt = FALSE;
     644  i = 0;
    585645  while ((c = *format++)) {
     646    mrb_value *argv = ARGV;
     647    mrb_bool altmode;
     648
    586649    switch (c) {
    587     case '|': case '*': case '&': case '?':
     650    case '|': case '*': case '&': case '?': case ':':
    588651      break;
    589652    default:
     
    599662    }
    600663
     664    if (*format == '!') {
     665      format ++;
     666      altmode = TRUE;
     667    }
     668    else {
     669      altmode = FALSE;
     670    }
     671
    601672    switch (c) {
    602673    case 'o':
     
    606677        p = va_arg(ap, mrb_value*);
    607678        if (i < argc) {
    608           *p = ARGV[arg_i++];
    609           i++;
     679          *p = argv[i++];
    610680        }
    611681      }
     
    619689          mrb_value ss;
    620690
    621           ss = ARGV[arg_i++];
     691          ss = argv[i++];
    622692          if (!class_ptr_p(ss)) {
    623             mrb_raisef(mrb, E_TYPE_ERROR, "%S is not class/module", ss);
     693            mrb_raisef(mrb, E_TYPE_ERROR, "%v is not class/module", ss);
    624694          }
    625695          *p = ss;
    626           i++;
    627696        }
    628697      }
     
    633702
    634703        p = va_arg(ap, mrb_value*);
    635         if (*format == '!') {
    636           format++;
    637           if (i < argc && mrb_nil_p(ARGV[arg_i])) {
    638             *p = ARGV[arg_i++];
    639             i++;
    640             break;
     704        if (i < argc) {
     705          *p = argv[i++];
     706          if (!(altmode && mrb_nil_p(*p))) {
     707            mrb_to_str(mrb, *p);
    641708          }
    642         }
    643         if (i < argc) {
    644           *p = to_str(mrb, ARGV[arg_i++]);
    645           i++;
    646709        }
    647710      }
     
    652715
    653716        p = va_arg(ap, mrb_value*);
    654         if (*format == '!') {
    655           format++;
    656           if (i < argc && mrb_nil_p(ARGV[arg_i])) {
    657             *p = ARGV[arg_i++];
    658             i++;
    659             break;
     717        if (i < argc) {
     718          *p = argv[i++];
     719          if (!(altmode && mrb_nil_p(*p))) {
     720            *p = to_ary(mrb, *p);
    660721          }
    661         }
    662         if (i < argc) {
    663           *p = to_ary(mrb, ARGV[arg_i++]);
    664           i++;
    665722        }
    666723      }
     
    671728
    672729        p = va_arg(ap, mrb_value*);
    673         if (*format == '!') {
    674           format++;
    675           if (i < argc && mrb_nil_p(ARGV[arg_i])) {
    676             *p = ARGV[arg_i++];
    677             i++;
    678             break;
     730        if (i < argc) {
     731          *p = argv[i++];
     732          if (!(altmode && mrb_nil_p(*p))) {
     733            *p = to_hash(mrb, *p);
    679734          }
    680         }
    681         if (i < argc) {
    682           *p = to_hash(mrb, ARGV[arg_i++]);
    683           i++;
    684735        }
    685736      }
     
    693744        ps = va_arg(ap, char**);
    694745        pl = va_arg(ap, mrb_int*);
    695         if (*format == '!') {
    696           format++;
    697           if (i < argc && mrb_nil_p(ARGV[arg_i])) {
     746        if (i < argc) {
     747          ss = argv[i++];
     748          if (altmode && mrb_nil_p(ss)) {
    698749            *ps = NULL;
    699750            *pl = 0;
    700             i++; arg_i++;
    701             break;
    702751          }
    703         }
    704         if (i < argc) {
    705           ss = to_str(mrb, ARGV[arg_i++]);
    706           *ps = RSTRING_PTR(ss);
    707           *pl = RSTRING_LEN(ss);
    708           i++;
     752          else {
     753            mrb_to_str(mrb, ss);
     754            *ps = RSTRING_PTR(ss);
     755            *pl = RSTRING_LEN(ss);
     756          }
    709757        }
    710758      }
     
    716764
    717765        ps = va_arg(ap, const char**);
    718         if (*format == '!') {
    719           format++;
    720           if (i < argc && mrb_nil_p(ARGV[arg_i])) {
     766        if (i < argc) {
     767          ss = argv[i++];
     768          if (altmode && mrb_nil_p(ss)) {
    721769            *ps = NULL;
    722             i++; arg_i++;
    723             break;
    724770          }
    725         }
    726         if (i < argc) {
    727           ss = to_str(mrb, ARGV[arg_i++]);
    728           *ps = mrb_string_value_cstr(mrb, &ss);
    729           i++;
     771          else {
     772            mrb_to_str(mrb, ss);
     773            *ps = RSTRING_CSTR(mrb, ss);
     774          }
    730775        }
    731776      }
     
    740785        pb = va_arg(ap, mrb_value**);
    741786        pl = va_arg(ap, mrb_int*);
    742         if (*format == '!') {
    743           format++;
    744           if (i < argc && mrb_nil_p(ARGV[arg_i])) {
     787        if (i < argc) {
     788          aa = argv[i++];
     789          if (altmode && mrb_nil_p(aa)) {
    745790            *pb = 0;
    746791            *pl = 0;
    747             i++; arg_i++;
    748             break;
    749792          }
    750         }
    751         if (i < argc) {
    752           aa = to_ary(mrb, ARGV[arg_i++]);
    753           a = mrb_ary_ptr(aa);
    754           *pb = a->ptr;
    755           *pl = a->len;
    756           i++;
     793          else {
     794            aa = to_ary(mrb, aa);
     795            a = mrb_ary_ptr(aa);
     796            *pb = ARY_PTR(a);
     797            *pl = ARY_LEN(a);
     798          }
    757799        }
    758800      }
     
    765807        p = va_arg(ap, void**);
    766808        if (i < argc) {
    767           ss = ARGV[arg_i];
    768           if (mrb_type(ss) != MRB_TT_ISTRUCT)
     809          ss = argv[i++];
     810          if (!mrb_istruct_p(ss))
    769811          {
    770             mrb_raisef(mrb, E_TYPE_ERROR, "%S is not inline struct", ss);
     812            mrb_raisef(mrb, E_TYPE_ERROR, "%v is not inline struct", ss);
    771813          }
    772814          *p = mrb_istruct_ptr(ss);
    773           arg_i++;
    774           i++;
    775         }
    776       }
    777       break;
     815        }
     816      }
     817      break;
     818#ifndef MRB_WITHOUT_FLOAT
    778819    case 'f':
    779820      {
     
    782823        p = va_arg(ap, mrb_float*);
    783824        if (i < argc) {
    784           *p = mrb_to_flo(mrb, ARGV[arg_i]);
    785           arg_i++;
    786           i++;
    787         }
    788       }
    789       break;
     825          *p = mrb_to_flo(mrb, argv[i++]);
     826        }
     827      }
     828      break;
     829#endif
    790830    case 'i':
    791831      {
     
    794834        p = va_arg(ap, mrb_int*);
    795835        if (i < argc) {
    796           switch (mrb_type(ARGV[arg_i])) {
    797             case MRB_TT_FIXNUM:
    798               *p = mrb_fixnum(ARGV[arg_i]);
    799               break;
    800             case MRB_TT_FLOAT:
    801               {
    802                 mrb_float f = mrb_float(ARGV[arg_i]);
    803 
    804                 if (!FIXABLE_FLOAT(f)) {
    805                   mrb_raise(mrb, E_RANGE_ERROR, "float too big for int");
    806                 }
    807                 *p = (mrb_int)f;
    808               }
    809               break;
    810             case MRB_TT_STRING:
    811               mrb_raise(mrb, E_TYPE_ERROR, "no implicit conversion of String into Integer");
    812               break;
    813             default:
    814               *p = mrb_fixnum(mrb_Integer(mrb, ARGV[arg_i]));
    815               break;
    816           }
    817           arg_i++;
    818           i++;
     836          *p = mrb_fixnum(mrb_to_int(mrb, argv[i++]));
    819837        }
    820838      }
     
    825843
    826844        if (i < argc) {
    827           mrb_value b = ARGV[arg_i++];
     845          mrb_value b = argv[i++];
    828846          *boolp = mrb_test(b);
    829           i++;
    830847        }
    831848      }
     
    839856          mrb_value ss;
    840857
    841           ss = ARGV[arg_i++];
     858          ss = argv[i++];
    842859          *symp = to_sym(mrb, ss);
    843           i++;
    844860        }
    845861      }
     
    852868        datap = va_arg(ap, void**);
    853869        type = va_arg(ap, struct mrb_data_type const*);
    854         if (*format == '!') {
    855           format++;
    856           if (i < argc && mrb_nil_p(ARGV[arg_i])) {
     870        if (i < argc) {
     871          mrb_value dd = argv[i++];
     872          if (altmode && mrb_nil_p(dd)) {
    857873            *datap = 0;
    858             i++; arg_i++;
    859             break;
    860874          }
    861         }
    862         if (i < argc) {
    863           *datap = mrb_data_get_ptr(mrb, ARGV[arg_i++], type);
    864           ++i;
     875          else {
     876            *datap = mrb_data_get_ptr(mrb, dd, type);
     877          }
    865878        }
    866879      }
     
    878891          bp = mrb->c->stack + mrb->c->ci->argc + 1;
    879892        }
     893        if (altmode && mrb_nil_p(*bp)) {
     894          mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
     895        }
    880896        *p = *bp;
    881897      }
    882898      break;
    883899    case '|':
     900      if (opt_skip && i == argc) goto finish;
    884901      opt = TRUE;
    885902      break;
     
    897914        mrb_value **var;
    898915        mrb_int *pl;
     916        mrb_bool nocopy = (altmode || !argv_on_stack) ? TRUE : FALSE;
    899917
    900918        var = va_arg(ap, mrb_value**);
     
    903921          *pl = argc-i;
    904922          if (*pl > 0) {
    905             *var = ARGV + arg_i;
     923            if (nocopy) {
     924              *var = argv+i;
     925            }
     926            else {
     927              mrb_value args = mrb_ary_new_from_values(mrb, *pl, argv+i);
     928              RARRAY(args)->c = NULL;
     929              *var = RARRAY_PTR(args);
     930            }
    906931          }
    907932          i = argc;
    908           arg_i += *pl;
    909933        }
    910934        else {
     
    914938      }
    915939      break;
     940
     941    case ':':
     942      {
     943        mrb_value ksrc = mrb_hash_p(kdict) ? mrb_hash_dup(mrb, kdict) : mrb_hash_new(mrb);
     944        const mrb_kwargs *kwargs = va_arg(ap, const mrb_kwargs*);
     945        mrb_value *rest;
     946
     947        if (kwargs == NULL) {
     948          rest = NULL;
     949        }
     950        else {
     951          uint32_t kwnum = kwargs->num;
     952          uint32_t required = kwargs->required;
     953          const char *const *kname = kwargs->table;
     954          mrb_value *values = kwargs->values;
     955          uint32_t j;
     956          const uint32_t keyword_max = 40;
     957
     958          if (kwnum > keyword_max || required > kwnum) {
     959            mrb_raise(mrb, E_ARGUMENT_ERROR, "keyword number is too large");
     960          }
     961
     962          for (j = required; j > 0; j --, kname ++, values ++) {
     963            mrb_value k = mrb_symbol_value(mrb_intern_cstr(mrb, *kname));
     964            if (!mrb_hash_key_p(mrb, ksrc, k)) {
     965              mrb_raisef(mrb, E_ARGUMENT_ERROR, "missing keyword: %s", *kname);
     966            }
     967            *values = mrb_hash_delete_key(mrb, ksrc, k);
     968            mrb_gc_protect(mrb, *values);
     969          }
     970
     971          for (j = kwnum - required; j > 0; j --, kname ++, values ++) {
     972            mrb_value k = mrb_symbol_value(mrb_intern_cstr(mrb, *kname));
     973            if (mrb_hash_key_p(mrb, ksrc, k)) {
     974              *values = mrb_hash_delete_key(mrb, ksrc, k);
     975              mrb_gc_protect(mrb, *values);
     976            }
     977            else {
     978              *values = mrb_undef_value();
     979            }
     980          }
     981
     982          rest = kwargs->rest;
     983        }
     984
     985        if (rest) {
     986          *rest = ksrc;
     987        }
     988        else if (!mrb_hash_empty_p(mrb, ksrc)) {
     989          ksrc = mrb_hash_keys(mrb, ksrc);
     990          ksrc = RARRAY_PTR(ksrc)[0];
     991          mrb_raisef(mrb, E_ARGUMENT_ERROR, "unknown keyword: %v", ksrc);
     992        }
     993      }
     994      break;
     995
    916996    default:
    917       mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid argument specifier %S", mrb_str_new(mrb, &c, 1));
     997      mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid argument specifier %c", c);
    918998      break;
    919999    }
     
    9251005    mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
    9261006  }
     1007
     1008finish:
    9271009  va_end(ap);
    9281010  return i;
     
    9831065    int superclass_seen = 0;
    9841066
    985     if (m->flags & MRB_FLAG_IS_PREPENDED)
     1067    if (m->flags & MRB_FL_CLASS_IS_PREPENDED)
    9861068      goto skip;
    9871069
     
    9901072
    9911073    p = c->super;
    992     while(p) {
     1074    while (p) {
    9931075      if (p->tt == MRB_TT_ICLASS) {
    9941076        if (p->mt == m->mt) {
     
    10061088
    10071089    ic = include_class_new(mrb, m, ins_pos->super);
     1090    m->flags |= MRB_FL_CLASS_IS_INHERITED;
    10081091    ins_pos->super = ic;
    1009     mrb_field_write_barrier(mrb, (struct RBasic*)ins_pos, (struct RBasic*)ins_pos->super);
     1092    mrb_field_write_barrier(mrb, (struct RBasic*)ins_pos, (struct RBasic*)ic);
     1093    mrb_mc_clear_by_class(mrb, ins_pos);
    10101094    ins_pos = ic;
    10111095  skip:
    10121096    m = m->super;
    10131097  }
     1098  mc_clear_all(mrb);
    10141099  return 0;
    10151100}
     
    10181103mrb_include_module(mrb_state *mrb, struct RClass *c, struct RClass *m)
    10191104{
    1020   int changed = include_module_at(mrb, c, find_origin(c), m, 1);
    1021   if (changed < 0) {
     1105  mrb_check_frozen(mrb, c);
     1106  if (include_module_at(mrb, c, find_origin(c), m, 1) < 0) {
    10221107    mrb_raise(mrb, E_ARGUMENT_ERROR, "cyclic include detected");
    10231108  }
     
    10301115  int changed = 0;
    10311116
    1032   if (!(c->flags & MRB_FLAG_IS_PREPENDED)) {
     1117  mrb_check_frozen(mrb, c);
     1118  if (!(c->flags & MRB_FL_CLASS_IS_PREPENDED)) {
    10331119    origin = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_ICLASS, c);
    1034     origin->flags |= MRB_FLAG_IS_ORIGIN;
     1120    origin->flags |= MRB_FL_CLASS_IS_ORIGIN | MRB_FL_CLASS_IS_INHERITED;
    10351121    origin->super = c->super;
    10361122    c->super = origin;
     
    10381124    c->mt = kh_init(mt, mrb);
    10391125    mrb_field_write_barrier(mrb, (struct RBasic*)c, (struct RBasic*)origin);
    1040     c->flags |= MRB_FLAG_IS_PREPENDED;
     1126    c->flags |= MRB_FL_CLASS_IS_PREPENDED;
    10411127  }
    10421128  changed = include_module_at(mrb, c, c, m, 0);
     
    11151201      mrb_ary_push(mrb, result, mrb_obj_value(c->c));
    11161202    }
    1117     else if (!(c->flags & MRB_FLAG_IS_PREPENDED)) {
     1203    else if (!(c->flags & MRB_FL_CLASS_IS_PREPENDED)) {
    11181204      mrb_ary_push(mrb, result, mrb_obj_value(c));
    11191205    }
     
    11331219  mrb_include_module(mrb, mrb_class_ptr(mrb_singleton_class(mrb, obj)), mrb_class_ptr(mod));
    11341220  return mod;
    1135 }
    1136 
    1137 static mrb_value
    1138 mrb_mod_included_modules(mrb_state *mrb, mrb_value self)
    1139 {
    1140   mrb_value result;
    1141   struct RClass *c = mrb_class_ptr(self);
    1142   struct RClass *origin = c;
    1143 
    1144   MRB_CLASS_ORIGIN(origin);
    1145   result = mrb_ary_new(mrb);
    1146   while (c) {
    1147     if (c != origin && c->tt == MRB_TT_ICLASS) {
    1148       if (c->c->tt == MRB_TT_MODULE) {
    1149         mrb_ary_push(mrb, result, mrb_obj_value(c->c));
    1150       }
    1151     }
    1152     c = c->super;
    1153   }
    1154 
    1155   return result;
    11561221}
    11571222
     
    11671232  }
    11681233  return mod;
    1169 }
    1170 
    1171 mrb_value mrb_class_instance_method_list(mrb_state*, mrb_bool, struct RClass*, int);
    1172 
    1173 /* 15.2.2.4.33 */
    1174 /*
    1175  *  call-seq:
    1176  *     mod.instance_methods(include_super=true)   -> array
    1177  *
    1178  *  Returns an array containing the names of the public and protected instance
    1179  *  methods in the receiver. For a module, these are the public and protected methods;
    1180  *  for a class, they are the instance (not singleton) methods. With no
    1181  *  argument, or with an argument that is <code>false</code>, the
    1182  *  instance methods in <i>mod</i> are returned, otherwise the methods
    1183  *  in <i>mod</i> and <i>mod</i>'s superclasses are returned.
    1184  *
    1185  *     module A
    1186  *       def method1()  end
    1187  *     end
    1188  *     class B
    1189  *       def method2()  end
    1190  *     end
    1191  *     class C < B
    1192  *       def method3()  end
    1193  *     end
    1194  *
    1195  *     A.instance_methods                #=> [:method1]
    1196  *     B.instance_methods(false)         #=> [:method2]
    1197  *     C.instance_methods(false)         #=> [:method3]
    1198  *     C.instance_methods(true).length   #=> 43
    1199  */
    1200 
    1201 static mrb_value
    1202 mrb_mod_instance_methods(mrb_state *mrb, mrb_value mod)
    1203 {
    1204   struct RClass *c = mrb_class_ptr(mod);
    1205   mrb_bool recur = TRUE;
    1206   mrb_get_args(mrb, "|b", &recur);
    1207   return mrb_class_instance_method_list(mrb, recur, c, 0);
    12081234}
    12091235
     
    12331259  case MRB_TT_SYMBOL:
    12341260  case MRB_TT_FIXNUM:
     1261#ifndef MRB_WITHOUT_FLOAT
    12351262  case MRB_TT_FLOAT:
     1263#endif
    12361264    mrb_raise(mrb, E_TYPE_ERROR, "can't define singleton");
    12371265    return mrb_nil_value();    /* not reached */
     
    12641292}
    12651293
    1266 MRB_API struct RProc*
     1294#ifdef MRB_METHOD_CACHE
     1295static void
     1296mc_clear_all(mrb_state *mrb)
     1297{
     1298  struct mrb_cache_entry *mc = mrb->cache;
     1299  int i;
     1300
     1301  for (i=0; i<MRB_METHOD_CACHE_SIZE; i++) {
     1302    mc[i].c = 0;
     1303  }
     1304}
     1305
     1306void
     1307mrb_mc_clear_by_class(mrb_state *mrb, struct RClass *c)
     1308{
     1309  struct mrb_cache_entry *mc = mrb->cache;
     1310  int i;
     1311
     1312  if (c->flags & MRB_FL_CLASS_IS_INHERITED) {
     1313    mc_clear_all(mrb);
     1314    c->flags &= ~MRB_FL_CLASS_IS_INHERITED;
     1315    return;
     1316  }
     1317  for (i=0; i<MRB_METHOD_CACHE_SIZE; i++) {
     1318    if (mc[i].c == c) mc[i].c = 0;
     1319  }
     1320}
     1321
     1322static void
     1323mc_clear_by_id(mrb_state *mrb, struct RClass *c, mrb_sym mid)
     1324{
     1325  struct mrb_cache_entry *mc = mrb->cache;
     1326  int i;
     1327
     1328  if (c->flags & MRB_FL_CLASS_IS_INHERITED) {
     1329    mc_clear_all(mrb);
     1330    c->flags &= ~MRB_FL_CLASS_IS_INHERITED;
     1331    return;
     1332  }
     1333  for (i=0; i<MRB_METHOD_CACHE_SIZE; i++) {
     1334    if (mc[i].c == c || mc[i].mid == mid)
     1335      mc[i].c = 0;
     1336  }
     1337}
     1338#endif
     1339
     1340MRB_API mrb_method_t
    12671341mrb_method_search_vm(mrb_state *mrb, struct RClass **cp, mrb_sym mid)
    12681342{
    12691343  khiter_t k;
    1270   struct RProc *m;
     1344  mrb_method_t m;
    12711345  struct RClass *c = *cp;
     1346#ifdef MRB_METHOD_CACHE
     1347  struct RClass *oc = c;
     1348  int h = kh_int_hash_func(mrb, ((intptr_t)oc) ^ mid) & (MRB_METHOD_CACHE_SIZE-1);
     1349  struct mrb_cache_entry *mc = &mrb->cache[h];
     1350
     1351  if (mc->c == c && mc->mid == mid) {
     1352    *cp = mc->c0;
     1353    return mc->m;
     1354  }
     1355#endif
    12721356
    12731357  while (c) {
     
    12781362      if (k != kh_end(h)) {
    12791363        m = kh_value(h, k);
    1280         if (!m) break;
     1364        if (MRB_METHOD_UNDEF_P(m)) break;
    12811365        *cp = c;
     1366#ifdef MRB_METHOD_CACHE
     1367        mc->c = oc;
     1368        mc->c0 = c;
     1369        mc->mid = mid;
     1370        mc->m = m;
     1371#endif
    12821372        return m;
    12831373      }
     
    12851375    c = c->super;
    12861376  }
    1287   return NULL;                  /* no method */
    1288 }
    1289 
    1290 MRB_API struct RProc*
     1377  MRB_METHOD_FROM_PROC(m, NULL);
     1378  return m;                  /* no method */
     1379}
     1380
     1381MRB_API mrb_method_t
    12911382mrb_method_search(mrb_state *mrb, struct RClass* c, mrb_sym mid)
    12921383{
    1293   struct RProc *m;
     1384  mrb_method_t m;
    12941385
    12951386  m = mrb_method_search_vm(mrb, &c, mid);
    1296   if (!m) {
    1297     mrb_value inspect = mrb_funcall(mrb, mrb_obj_value(c), "inspect", 0);
    1298     if (mrb_string_p(inspect) && RSTRING_LEN(inspect) > 64) {
    1299       inspect = mrb_any_to_s(mrb, mrb_obj_value(c));
    1300     }
    1301     mrb_name_error(mrb, mid, "undefined method '%S' for class %S",
    1302                mrb_sym2str(mrb, mid), inspect);
     1387  if (MRB_METHOD_UNDEF_P(m)) {
     1388    mrb_name_error(mrb, mid, "undefined method '%n' for class %C", mid, c);
    13031389  }
    13041390  return m;
    13051391}
    13061392
    1307 static mrb_value
    1308 attr_reader(mrb_state *mrb, mrb_value obj)
    1309 {
    1310   mrb_value name = mrb_proc_cfunc_env_get(mrb, 0);
    1311   return mrb_iv_get(mrb, obj, to_sym(mrb, name));
    1312 }
    1313 
    1314 static mrb_value
    1315 mrb_mod_attr_reader(mrb_state *mrb, mrb_value mod)
     1393#define ONSTACK_ALLOC_MAX 32
     1394
     1395static mrb_sym
     1396prepare_name_common(mrb_state *mrb, mrb_sym sym, const char *prefix, const char *suffix)
     1397{
     1398  char onstack[ONSTACK_ALLOC_MAX];
     1399  mrb_int sym_len;
     1400  const char *sym_str = mrb_sym_name_len(mrb, sym, &sym_len);
     1401  size_t prefix_len = prefix ? strlen(prefix) : 0;
     1402  size_t suffix_len = suffix ? strlen(suffix) : 0;
     1403  size_t name_len = sym_len + prefix_len + suffix_len;
     1404  char *buf = name_len > sizeof(onstack) ? (char *)mrb_alloca(mrb, name_len) : onstack;
     1405  char *p = buf;
     1406
     1407  if (prefix_len > 0) {
     1408    memcpy(p, prefix, prefix_len);
     1409    p += prefix_len;
     1410  }
     1411
     1412  memcpy(p, sym_str, sym_len);
     1413  p += sym_len;
     1414
     1415  if (suffix_len > 0) {
     1416    memcpy(p, suffix, suffix_len);
     1417    p += suffix_len;
     1418  }
     1419
     1420  return mrb_intern(mrb, buf, name_len);
     1421}
     1422
     1423static mrb_value
     1424prepare_ivar_name(mrb_state *mrb, mrb_sym sym)
     1425{
     1426  sym = prepare_name_common(mrb, sym, "@", NULL);
     1427  mrb_iv_name_sym_check(mrb, sym);
     1428  return mrb_symbol_value(sym);
     1429}
     1430
     1431static mrb_sym
     1432prepare_writer_name(mrb_state *mrb, mrb_sym sym)
     1433{
     1434  return prepare_name_common(mrb, sym, NULL, "=");
     1435}
     1436
     1437static mrb_value
     1438mod_attr_define(mrb_state *mrb, mrb_value mod, mrb_value (*accessor)(mrb_state *, mrb_value), mrb_sym (*access_name)(mrb_state *, mrb_sym))
    13161439{
    13171440  struct RClass *c = mrb_class_ptr(mod);
     
    13231446  ai = mrb_gc_arena_save(mrb);
    13241447  for (i=0; i<argc; i++) {
    1325     mrb_value name, str;
    1326     mrb_sym method, sym;
     1448    mrb_value name;
     1449    mrb_sym method;
     1450    struct RProc *p;
     1451    mrb_method_t m;
    13271452
    13281453    method = to_sym(mrb, argv[i]);
    1329     name = mrb_sym2str(mrb, method);
    1330     str = mrb_str_buf_new(mrb, RSTRING_LEN(name)+1);
    1331     mrb_str_cat_lit(mrb, str, "@");
    1332     mrb_str_cat_str(mrb, str, name);
    1333     sym = mrb_intern_str(mrb, str);
    1334     mrb_iv_check(mrb, sym);
    1335     name = mrb_symbol_value(sym);
    1336     mrb_define_method_raw(mrb, c, method,
    1337                           mrb_proc_new_cfunc_with_env(mrb, attr_reader, 1, &name));
     1454    name = prepare_ivar_name(mrb, method);
     1455    if (access_name) {
     1456      method = access_name(mrb, method);
     1457    }
     1458
     1459    p = mrb_proc_new_cfunc_with_env(mrb, accessor, 1, &name);
     1460    MRB_METHOD_FROM_PROC(m, p);
     1461    mrb_define_method_raw(mrb, c, method, m);
    13381462    mrb_gc_arena_restore(mrb, ai);
    13391463  }
    13401464  return mrb_nil_value();
     1465}
     1466
     1467static mrb_value
     1468attr_reader(mrb_state *mrb, mrb_value obj)
     1469{
     1470  mrb_value name = mrb_proc_cfunc_env_get(mrb, 0);
     1471  return mrb_iv_get(mrb, obj, to_sym(mrb, name));
     1472}
     1473
     1474static mrb_value
     1475mrb_mod_attr_reader(mrb_state *mrb, mrb_value mod)
     1476{
     1477  return mod_attr_define(mrb, mod, attr_reader, NULL);
    13411478}
    13421479
     
    13551492mrb_mod_attr_writer(mrb_state *mrb, mrb_value mod)
    13561493{
    1357   struct RClass *c = mrb_class_ptr(mod);
    1358   mrb_value *argv;
    1359   mrb_int argc, i;
    1360   int ai;
    1361 
    1362   mrb_get_args(mrb, "*", &argv, &argc);
    1363   ai = mrb_gc_arena_save(mrb);
    1364   for (i=0; i<argc; i++) {
    1365     mrb_value name, str, attr;
    1366     mrb_sym method, sym;
    1367 
    1368     method = to_sym(mrb, argv[i]);
    1369 
    1370     /* prepare iv name (@name) */
    1371     name = mrb_sym2str(mrb, method);
    1372     str = mrb_str_buf_new(mrb, RSTRING_LEN(name)+1);
    1373     mrb_str_cat_lit(mrb, str, "@");
    1374     mrb_str_cat_str(mrb, str, name);
    1375     sym = mrb_intern_str(mrb, str);
    1376     mrb_iv_check(mrb, sym);
    1377     attr = mrb_symbol_value(sym);
    1378 
    1379     /* prepare method name (name=) */
    1380     str = mrb_str_buf_new(mrb, RSTRING_LEN(str));
    1381     mrb_str_cat_str(mrb, str, name);
    1382     mrb_str_cat_lit(mrb, str, "=");
    1383     method = mrb_intern_str(mrb, str);
    1384 
    1385     mrb_define_method_raw(mrb, c, method,
    1386                           mrb_proc_new_cfunc_with_env(mrb, attr_writer, 1, &attr));
    1387     mrb_gc_arena_restore(mrb, ai);
    1388   }
    1389   return mrb_nil_value();
     1494  return mod_attr_define(mrb, mod, attr_writer, prepare_writer_name);
    13901495}
    13911496
     
    14021507  if (ttype == 0) ttype = MRB_TT_OBJECT;
    14031508  if (ttype <= MRB_TT_CPTR) {
    1404     mrb_raisef(mrb, E_TYPE_ERROR, "can't create instance of %S", cv);
     1509    mrb_raisef(mrb, E_TYPE_ERROR, "can't create instance of %v", cv);
    14051510  }
    14061511  o = (struct RObject*)mrb_obj_alloc(mrb, ttype, c);
     
    14201525 */
    14211526
    1422 MRB_API mrb_value
     1527mrb_value
    14231528mrb_instance_new(mrb_state *mrb, mrb_value cv)
    14241529{
     
    14261531  mrb_value *argv;
    14271532  mrb_int argc;
    1428 
    1429   mrb_get_args(mrb, "*&", &argv, &argc, &blk);
     1533  mrb_sym init;
     1534
     1535  mrb_get_args(mrb, "*!&", &argv, &argc, &blk);
    14301536  obj = mrb_instance_alloc(mrb, cv);
    1431   mrb_funcall_with_block(mrb, obj, mrb_intern_lit(mrb, "initialize"), argc, argv, blk);
    1432 
     1537  init = mrb_intern_lit(mrb, "initialize");
     1538  if (!mrb_func_basic_p(mrb, obj, init, mrb_bob_init)) {
     1539    mrb_funcall_with_block(mrb, obj, init, argc, argv, blk);
     1540  }
    14331541  return obj;
    14341542}
     
    14741582  new_class = mrb_obj_value(mrb_class_new(mrb, mrb_class_ptr(super)));
    14751583  mid = mrb_intern_lit(mrb, "initialize");
    1476   if (!mrb_func_basic_p(mrb, new_class, mid, mrb_bob_init)) {
     1584  if (mrb_func_basic_p(mrb, new_class, mid, mrb_class_initialize)) {
     1585    mrb_class_initialize(mrb, new_class);
     1586  }
     1587  else {
    14771588    mrb_funcall_with_block(mrb, new_class, mid, n, &super, blk);
    14781589  }
     
    15591670mrb_obj_respond_to(mrb_state *mrb, struct RClass* c, mrb_sym mid)
    15601671{
    1561   khiter_t k;
    1562 
    1563   while (c) {
    1564     khash_t(mt) *h = c->mt;
    1565 
    1566     if (h) {
    1567       k = kh_get(mt, mrb, h, mid);
    1568       if (k != kh_end(h)) {
    1569         if (kh_value(h, k)) {
    1570           return TRUE;  /* method exists */
    1571         }
    1572         else {
    1573           return FALSE; /* undefined method */
    1574         }
    1575       }
    1576     }
    1577     c = c->super;
    1578   }
    1579   return FALSE;         /* no method */
     1672  mrb_method_t m;
     1673
     1674  m = mrb_method_search_vm(mrb, &c, mid);
     1675  if (MRB_METHOD_UNDEF_P(m)) {
     1676    return FALSE;
     1677  }
     1678  return TRUE;
    15801679}
    15811680
     
    15901689{
    15911690  mrb_value path;
    1592   const char *name;
    1593   mrb_sym classpath = mrb_intern_lit(mrb, "__classpath__");
    1594 
    1595   path = mrb_obj_iv_get(mrb, (struct RObject*)c, classpath);
     1691  mrb_sym nsym = mrb_intern_lit(mrb, "__classname__");
     1692
     1693  path = mrb_obj_iv_get(mrb, (struct RObject*)c, nsym);
    15961694  if (mrb_nil_p(path)) {
    1597     struct RClass *outer = mrb_class_outer_module(mrb, c);
    1598     mrb_sym sym = mrb_class_sym(mrb, c, outer);
    1599     mrb_int len;
    1600 
    1601     if (sym == 0) {
    1602       return mrb_nil_value();
    1603     }
    1604     else if (outer && outer != c && outer != mrb->object_class) {
    1605       mrb_value base = mrb_class_path(mrb, outer);
    1606       path = mrb_str_buf_new(mrb, 0);
    1607       if (mrb_nil_p(base)) {
    1608         mrb_str_cat_lit(mrb, path, "#<Class:");
    1609         mrb_str_concat(mrb, path, mrb_ptr_to_str(mrb, outer));
    1610         mrb_str_cat_lit(mrb, path, ">");
    1611       }
    1612       else {
    1613         mrb_str_concat(mrb, path, base);
    1614       }
    1615       mrb_str_cat_lit(mrb, path, "::");
    1616       name = mrb_sym2name_len(mrb, sym, &len);
    1617       mrb_str_cat(mrb, path, name, len);
    1618     }
    1619     else {
    1620       name = mrb_sym2name_len(mrb, sym, &len);
    1621       path = mrb_str_new(mrb, name, len);
    1622     }
    1623     if (!MRB_FROZEN_P(c)) {
    1624       mrb_obj_iv_set(mrb, (struct RObject*)c, classpath, path);
    1625     }
     1695    /* no name (yet) */
     1696    return mrb_class_find_path(mrb, c);
     1697  }
     1698  else if (mrb_symbol_p(path)) {
     1699    /* toplevel class/module */
     1700    return mrb_sym_str(mrb, mrb_symbol(path));
    16261701  }
    16271702  return mrb_str_dup(mrb, path);
    16281703}
    16291704
    1630 MRB_API struct RClass *
     1705MRB_API struct RClass*
    16311706mrb_class_real(struct RClass* cl)
    16321707{
    1633   if (cl == 0)
    1634     return NULL;
     1708  if (cl == 0) return NULL;
    16351709  while ((cl->tt == MRB_TT_SCLASS) || (cl->tt == MRB_TT_ICLASS)) {
    16361710    cl = cl->super;
     1711    if (cl == 0) return NULL;
    16371712  }
    16381713  return cl;
     
    16421717mrb_class_name(mrb_state *mrb, struct RClass* c)
    16431718{
    1644   mrb_value path = mrb_class_path(mrb, c);
    1645   if (mrb_nil_p(path)) {
    1646     path = mrb_str_new_lit(mrb, "#<Class:");
    1647     mrb_str_concat(mrb, path, mrb_ptr_to_str(mrb, c));
    1648     mrb_str_cat_lit(mrb, path, ">");
    1649   }
    1650   return RSTRING_PTR(path);
     1719  mrb_value name = class_name_str(mrb, c);
     1720  return RSTRING_PTR(name);
    16511721}
    16521722
     
    16671737{
    16681738  if (super->tt != MRB_TT_CLASS) {
    1669     mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%S given)", mrb_obj_value(super));
     1739    mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%C given)", super);
    16701740  }
    16711741  if (super->tt == MRB_TT_SCLASS) {
     
    17341804mrb_alias_method(mrb_state *mrb, struct RClass *c, mrb_sym a, mrb_sym b)
    17351805{
    1736   struct RProc *m = mrb_method_search(mrb, c, b);
    1737 
     1806  mrb_method_t m = mrb_method_search(mrb, c, b);
     1807
     1808  if (!MRB_METHOD_CFUNC_P(m)) {
     1809    struct RProc *p = MRB_METHOD_PROC(m);
     1810
     1811    if (MRB_PROC_ENV_P(p)) {
     1812      MRB_PROC_ENV(p)->mid = b;
     1813    }
     1814    else {
     1815      struct RClass *tc = MRB_PROC_TARGET_CLASS(p);
     1816      struct REnv *e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, NULL);
     1817
     1818      e->mid = b;
     1819      if (tc) {
     1820        e->c = tc;
     1821        mrb_field_write_barrier(mrb, (struct RBasic*)e, (struct RBasic*)tc);
     1822      }
     1823      p->e.env = e;
     1824      p->flags |= MRB_PROC_ENVSET;
     1825    }
     1826  }
    17381827  mrb_define_method_raw(mrb, c, a, m);
    17391828}
     
    17411830/*!
    17421831 * Defines an alias of a method.
     1832 * \param mrb    the mruby state
    17431833 * \param klass  the class which the original method belongs to
    17441834 * \param name1  a new name for the method
     
    17601850 */
    17611851
    1762 static mrb_value
     1852mrb_value
    17631853mrb_mod_to_s(mrb_state *mrb, mrb_value klass)
    17641854{
    1765   mrb_value str;
    1766 
    1767   if (mrb_type(klass) == MRB_TT_SCLASS) {
     1855
     1856  if (mrb_sclass_p(klass)) {
    17681857    mrb_value v = mrb_iv_get(mrb, klass, mrb_intern_lit(mrb, "__attached__"));
    1769 
    1770     str = mrb_str_new_lit(mrb, "#<Class:");
     1858    mrb_value str = mrb_str_new_lit(mrb, "#<Class:");
    17711859
    17721860    if (class_ptr_p(v)) {
     
    17791867  }
    17801868  else {
    1781     struct RClass *c;
    1782     mrb_value path;
    1783 
    1784     str = mrb_str_buf_new(mrb, 32);
    1785     c = mrb_class_ptr(klass);
    1786     path = mrb_class_path(mrb, c);
    1787 
    1788     if (mrb_nil_p(path)) {
    1789       switch (mrb_type(klass)) {
    1790         case MRB_TT_CLASS:
    1791           mrb_str_cat_lit(mrb, str, "#<Class:");
    1792           break;
    1793 
    1794         case MRB_TT_MODULE:
    1795           mrb_str_cat_lit(mrb, str, "#<Module:");
    1796           break;
    1797 
    1798         default:
    1799           /* Shouldn't be happened? */
    1800           mrb_str_cat_lit(mrb, str, "#<??????:");
    1801           break;
    1802       }
    1803       mrb_str_concat(mrb, str, mrb_ptr_to_str(mrb, c));
    1804       return mrb_str_cat_lit(mrb, str, ">");
    1805     }
    1806     else {
    1807       return path;
    1808     }
     1869    return class_name_str(mrb, mrb_class_ptr(klass));
    18091870  }
    18101871}
     
    18181879  mrb_get_args(mrb, "nn", &new_name, &old_name);
    18191880  mrb_alias_method(mrb, c, new_name, old_name);
    1820   return mrb_nil_value();
     1881  return mod;
    18211882}
    18221883
     
    18241885undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a)
    18251886{
     1887  mrb_method_t m;
     1888
     1889  MRB_METHOD_FROM_PROC(m, NULL);
     1890  mrb_define_method_raw(mrb, c, a, m);
     1891}
     1892
     1893void
     1894mrb_undef_method_id(mrb_state *mrb, struct RClass *c, mrb_sym a)
     1895{
    18261896  if (!mrb_obj_respond_to(mrb, c, a)) {
    1827     mrb_name_error(mrb, a, "undefined method '%S' for class '%S'", mrb_sym2str(mrb, a), mrb_obj_value(c));
    1828   }
    1829   else {
    1830     mrb_define_method_raw(mrb, c, a, NULL);
    1831   }
     1897    mrb_name_error(mrb, a, "undefined method '%n' for class '%C'", a, c);
     1898  }
     1899  undef_method(mrb, c, a);
    18321900}
    18331901
     
    18531921  mrb_get_args(mrb, "*", &argv, &argc);
    18541922  while (argc--) {
    1855     undef_method(mrb, c, to_sym(mrb, *argv));
     1923    mrb_undef_method_id(mrb, c, to_sym(mrb, *argv));
    18561924    argv++;
    18571925  }
     
    18591927}
    18601928
    1861 static mrb_value
    1862 mod_define_method(mrb_state *mrb, mrb_value self)
    1863 {
    1864   struct RClass *c = mrb_class_ptr(self);
    1865   struct RProc *p;
    1866   mrb_sym mid;
    1867   mrb_value proc = mrb_undef_value();
    1868   mrb_value blk;
    1869 
    1870   mrb_get_args(mrb, "n|o&", &mid, &proc, &blk);
    1871   switch (mrb_type(proc)) {
    1872     case MRB_TT_PROC:
    1873       blk = proc;
    1874       break;
    1875     case MRB_TT_UNDEF:
    1876       /* ignored */
    1877       break;
    1878     default:
    1879       mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %S (expected Proc)", mrb_obj_value(mrb_obj_class(mrb, proc)));
    1880       break;
    1881   }
    1882   if (mrb_nil_p(blk)) {
    1883     mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
    1884   }
    1885   p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);
    1886   mrb_proc_copy(p, mrb_proc_ptr(blk));
    1887   p->flags |= MRB_PROC_STRICT;
    1888   mrb_define_method_raw(mrb, c, mid, p);
    1889   return mrb_symbol_value(mid);
    1890 }
    1891 
    18921929static void
    1893 check_cv_name_str(mrb_state *mrb, mrb_value str)
    1894 {
    1895   const char *s = RSTRING_PTR(str);
    1896   mrb_int len = RSTRING_LEN(str);
    1897 
    1898   if (len < 3 || !(s[0] == '@' && s[1] == '@')) {
    1899     mrb_name_error(mrb, mrb_intern_str(mrb, str), "'%S' is not allowed as a class variable name", str);
    1900   }
    1901 }
    1902 
    1903 static void
    1904 check_cv_name_sym(mrb_state *mrb, mrb_sym id)
    1905 {
    1906   check_cv_name_str(mrb, mrb_sym2str(mrb, id));
    1907 }
    1908 
    1909 /* 15.2.2.4.16 */
    1910 /*
    1911  *  call-seq:
    1912  *     obj.class_variable_defined?(symbol)    -> true or false
    1913  *
    1914  *  Returns <code>true</code> if the given class variable is defined
    1915  *  in <i>obj</i>.
    1916  *
    1917  *     class Fred
    1918  *       @@foo = 99
    1919  *     end
    1920  *     Fred.class_variable_defined?(:@@foo)    #=> true
    1921  *     Fred.class_variable_defined?(:@@bar)    #=> false
    1922  */
    1923 
    1924 static mrb_value
    1925 mrb_mod_cvar_defined(mrb_state *mrb, mrb_value mod)
     1930check_const_name_sym(mrb_state *mrb, mrb_sym id)
     1931{
     1932  mrb_int len;
     1933  const char *name = mrb_sym_name_len(mrb, id, &len);
     1934  if (!mrb_const_name_p(mrb, name, len)) {
     1935    mrb_name_error(mrb, id, "wrong constant name %n", id);
     1936  }
     1937}
     1938
     1939static mrb_value
     1940mrb_mod_const_defined(mrb_state *mrb, mrb_value mod)
    19261941{
    19271942  mrb_sym id;
     1943  mrb_bool inherit = TRUE;
     1944
     1945  mrb_get_args(mrb, "n|b", &id, &inherit);
     1946  check_const_name_sym(mrb, id);
     1947  if (inherit) {
     1948    return mrb_bool_value(mrb_const_defined(mrb, mod, id));
     1949  }
     1950  return mrb_bool_value(mrb_const_defined_at(mrb, mod, id));
     1951}
     1952
     1953static mrb_value
     1954mrb_const_get_sym(mrb_state *mrb, mrb_value mod, mrb_sym id)
     1955{
     1956  check_const_name_sym(mrb, id);
     1957  return mrb_const_get(mrb, mod, id);
     1958}
     1959
     1960static mrb_value
     1961mrb_mod_const_get(mrb_state *mrb, mrb_value mod)
     1962{
     1963  mrb_value path;
     1964  mrb_sym id;
     1965  char *ptr;
     1966  mrb_int off, end, len;
     1967
     1968  mrb_get_args(mrb, "o", &path);
     1969
     1970  if (mrb_symbol_p(path)) {
     1971    /* const get with symbol */
     1972    id = mrb_symbol(path);
     1973    return mrb_const_get_sym(mrb, mod, id);
     1974  }
     1975
     1976  /* const get with class path string */
     1977  path = mrb_ensure_string_type(mrb, path);
     1978  ptr = RSTRING_PTR(path);
     1979  len = RSTRING_LEN(path);
     1980  off = 0;
     1981
     1982  while (off < len) {
     1983    end = mrb_str_index_lit(mrb, path, "::", off);
     1984    end = (end == -1) ? len : end;
     1985    id = mrb_intern(mrb, ptr+off, end-off);
     1986    mod = mrb_const_get_sym(mrb, mod, id);
     1987    if (end == len)
     1988      off = end;
     1989    else {
     1990      off = end + 2;
     1991      if (off == len) {         /* trailing "::" */
     1992        mrb_name_error(mrb, id, "wrong constant name '%v'", path);
     1993      }
     1994    }
     1995  }
     1996
     1997  return mod;
     1998}
     1999
     2000static mrb_value
     2001mrb_mod_const_set(mrb_state *mrb, mrb_value mod)
     2002{
     2003  mrb_sym id;
     2004  mrb_value value;
     2005
     2006  mrb_get_args(mrb, "no", &id, &value);
     2007  check_const_name_sym(mrb, id);
     2008  mrb_const_set(mrb, mod, id, value);
     2009  return value;
     2010}
     2011
     2012static mrb_value
     2013mrb_mod_remove_const(mrb_state *mrb, mrb_value mod)
     2014{
     2015  mrb_sym id;
     2016  mrb_value val;
    19282017
    19292018  mrb_get_args(mrb, "n", &id);
    1930   check_cv_name_sym(mrb, id);
    1931   return mrb_bool_value(mrb_cv_defined(mrb, mod, id));
    1932 }
    1933 
    1934 /* 15.2.2.4.17 */
    1935 /*
    1936  *  call-seq:
    1937  *     mod.class_variable_get(symbol)    -> obj
    1938  *
    1939  *  Returns the value of the given class variable (or throws a
    1940  *  <code>NameError</code> exception). The <code>@@</code> part of the
    1941  *  variable name should be included for regular class variables
    1942  *
    1943  *     class Fred
    1944  *       @@foo = 99
    1945  *     end
    1946  *     Fred.class_variable_get(:@@foo)     #=> 99
    1947  */
    1948 
    1949 static mrb_value
    1950 mrb_mod_cvar_get(mrb_state *mrb, mrb_value mod)
    1951 {
    1952   mrb_sym id;
    1953 
    1954   mrb_get_args(mrb, "n", &id);
    1955   check_cv_name_sym(mrb, id);
    1956   return mrb_cv_get(mrb, mod, id);
    1957 }
    1958 
    1959 /* 15.2.2.4.18 */
    1960 /*
    1961  *  call-seq:
    1962  *     obj.class_variable_set(symbol, obj)    -> obj
    1963  *
    1964  *  Sets the class variable names by <i>symbol</i> to
    1965  *  <i>object</i>.
    1966  *
    1967  *     class Fred
    1968  *       @@foo = 99
    1969  *       def foo
    1970  *         @@foo
    1971  *       end
    1972  *     end
    1973  *     Fred.class_variable_set(:@@foo, 101)     #=> 101
    1974  *     Fred.new.foo                             #=> 101
    1975  */
    1976 
    1977 static mrb_value
    1978 mrb_mod_cvar_set(mrb_state *mrb, mrb_value mod)
    1979 {
    1980   mrb_value value;
    1981   mrb_sym id;
    1982 
    1983   mrb_get_args(mrb, "no", &id, &value);
    1984   check_cv_name_sym(mrb, id);
    1985   mrb_cv_set(mrb, mod, id, value);
    1986   return value;
    1987 }
    1988 
    1989 /* 15.2.2.4.39 */
    1990 /*
    1991  *  call-seq:
    1992  *     remove_class_variable(sym)    -> obj
    1993  *
    1994  *  Removes the definition of the <i>sym</i>, returning that
    1995  *  constant's value.
    1996  *
    1997  *     class Dummy
    1998  *       @@var = 99
    1999  *       puts @@var
    2000  *       p class_variables
    2001  *       remove_class_variable(:@@var)
    2002  *       p class_variables
    2003  *     end
    2004  *
    2005  *  <em>produces:</em>
    2006  *
    2007  *     99
    2008  *     [:@@var]
    2009  *     []
    2010  */
    2011 
    2012 static mrb_value
    2013 mrb_mod_remove_cvar(mrb_state *mrb, mrb_value mod)
    2014 {
    2015   mrb_value val;
    2016   mrb_sym id;
    2017 
    2018   mrb_get_args(mrb, "n", &id);
    2019   check_cv_name_sym(mrb, id);
    2020 
     2019  check_const_name_sym(mrb, id);
    20212020  val = mrb_iv_remove(mrb, mod, id);
    2022   if (!mrb_undef_p(val)) return val;
    2023 
    2024   if (mrb_cv_defined(mrb, mod, id)) {
    2025     mrb_name_error(mrb, id, "cannot remove %S for %S",
    2026                    mrb_sym2str(mrb, id), mod);
    2027   }
    2028 
    2029   mrb_name_error(mrb, id, "class variable %S not defined for %S",
    2030                  mrb_sym2str(mrb, id), mod);
    2031 
    2032  /* not reached */
    2033  return mrb_nil_value();
     2021  if (mrb_undef_p(val)) {
     2022    mrb_name_error(mrb, id, "constant %n not defined", id);
     2023  }
     2024  return val;
     2025}
     2026
     2027static mrb_value
     2028mrb_mod_const_missing(mrb_state *mrb, mrb_value mod)
     2029{
     2030  mrb_sym sym;
     2031
     2032  mrb_get_args(mrb, "n", &sym);
     2033
     2034  if (mrb_class_real(mrb_class_ptr(mod)) != mrb->object_class) {
     2035    mrb_name_error(mrb, sym, "uninitialized constant %v::%n", mod, sym);
     2036  }
     2037  else {
     2038    mrb_name_error(mrb, sym, "uninitialized constant %n", sym);
     2039  }
     2040  /* not reached */
     2041  return mrb_nil_value();
    20342042}
    20352043
     
    20702078}
    20712079
    2072 static void
    2073 remove_method(mrb_state *mrb, mrb_value mod, mrb_sym mid)
    2074 {
    2075   struct RClass *c = mrb_class_ptr(mod);
    2076   khash_t(mt) *h = find_origin(c)->mt;
    2077   khiter_t k;
    2078 
    2079   if (h) {
    2080     k = kh_get(mt, mrb, h, mid);
    2081     if (k != kh_end(h)) {
    2082       kh_del(mt, mrb, h, k);
    2083       mrb_funcall(mrb, mod, "method_removed", 1, mrb_symbol_value(mid));
    2084       return;
    2085     }
    2086   }
    2087 
    2088   mrb_name_error(mrb, mid, "method '%S' not defined in %S",
    2089     mrb_sym2str(mrb, mid), mod);
    2090 }
    2091 
    2092 /* 15.2.2.4.41 */
    2093 /*
    2094  *  call-seq:
    2095  *     remove_method(symbol)   -> self
    2096  *
    2097  *  Removes the method identified by _symbol_ from the current
    2098  *  class. For an example, see <code>Module.undef_method</code>.
    2099  */
    2100 
    2101 static mrb_value
    2102 mrb_mod_remove_method(mrb_state *mrb, mrb_value mod)
    2103 {
    2104   mrb_int argc;
    2105   mrb_value *argv;
    2106 
    2107   mrb_get_args(mrb, "*", &argv, &argc);
    2108   while (argc--) {
    2109     remove_method(mrb, mod, to_sym(mrb, *argv));
    2110     argv++;
    2111   }
    2112   return mod;
    2113 }
    2114 
    2115 
    2116 
    2117 static void
    2118 check_const_name_str(mrb_state *mrb, mrb_value str)
    2119 {
    2120   if (RSTRING_LEN(str) < 1 || !ISUPPER(*RSTRING_PTR(str))) {
    2121     mrb_name_error(mrb, mrb_intern_str(mrb, str), "wrong constant name %S", str);
    2122   }
    2123 }
    2124 
    2125 static void
    2126 check_const_name_sym(mrb_state *mrb, mrb_sym id)
    2127 {
    2128   check_const_name_str(mrb, mrb_sym2str(mrb, id));
    2129 }
    2130 
    2131 static mrb_value
    2132 const_defined(mrb_state *mrb, mrb_value mod, mrb_sym id, mrb_bool inherit)
    2133 {
    2134   if (inherit) {
    2135     return mrb_bool_value(mrb_const_defined(mrb, mod, id));
    2136   }
    2137   return mrb_bool_value(mrb_const_defined_at(mrb, mod, id));
    2138 }
    2139 
    2140 static mrb_value
    2141 mrb_mod_const_defined(mrb_state *mrb, mrb_value mod)
    2142 {
    2143   mrb_sym id;
    2144   mrb_bool inherit = TRUE;
    2145 
    2146   mrb_get_args(mrb, "n|b", &id, &inherit);
    2147   check_const_name_sym(mrb, id);
    2148   return const_defined(mrb, mod, id, inherit);
    2149 }
    2150 
    2151 static mrb_value
    2152 mrb_mod_const_get(mrb_state *mrb, mrb_value mod)
    2153 {
    2154   mrb_sym id;
    2155 
    2156   mrb_get_args(mrb, "n", &id);
    2157   check_const_name_sym(mrb, id);
    2158   return mrb_const_get(mrb, mod, id);
    2159 }
    2160 
    2161 static mrb_value
    2162 mrb_mod_const_set(mrb_state *mrb, mrb_value mod)
    2163 {
    2164   mrb_sym id;
    2165   mrb_value value;
    2166 
    2167   mrb_get_args(mrb, "no", &id, &value);
    2168   check_const_name_sym(mrb, id);
    2169   mrb_const_set(mrb, mod, id, value);
    2170   return value;
    2171 }
    2172 
    2173 static mrb_value
    2174 mrb_mod_remove_const(mrb_state *mrb, mrb_value mod)
    2175 {
    2176   mrb_sym id;
    2177   mrb_value val;
    2178 
    2179   mrb_get_args(mrb, "n", &id);
    2180   check_const_name_sym(mrb, id);
    2181   val = mrb_iv_remove(mrb, mod, id);
    2182   if (mrb_undef_p(val)) {
    2183     mrb_name_error(mrb, id, "constant %S not defined", mrb_sym2str(mrb, id));
    2184   }
    2185   return val;
    2186 }
    2187 
    2188 static mrb_value
    2189 mrb_mod_const_missing(mrb_state *mrb, mrb_value mod)
    2190 {
    2191   mrb_sym sym;
    2192 
    2193   mrb_get_args(mrb, "n", &sym);
    2194 
    2195   if (mrb_class_real(mrb_class_ptr(mod)) != mrb->object_class) {
    2196     mrb_name_error(mrb, sym, "uninitialized constant %S::%S",
    2197                    mod,
    2198                    mrb_sym2str(mrb, sym));
    2199   }
    2200   else {
    2201     mrb_name_error(mrb, sym, "uninitialized constant %S",
    2202                    mrb_sym2str(mrb, sym));
    2203   }
    2204   /* not reached */
    2205   return mrb_nil_value();
    2206 }
    2207 
    2208 static mrb_value
    2209 mrb_mod_s_constants(mrb_state *mrb, mrb_value mod)
    2210 {
    2211   mrb_raise(mrb, E_NOTIMP_ERROR, "Module.constants not implemented");
    2212   return mrb_nil_value();       /* not reached */
     2080static mrb_value
     2081mod_define_method(mrb_state *mrb, mrb_value self)
     2082{
     2083  struct RClass *c = mrb_class_ptr(self);
     2084  struct RProc *p;
     2085  mrb_method_t m;
     2086  mrb_sym mid;
     2087  mrb_value proc = mrb_undef_value();
     2088  mrb_value blk;
     2089
     2090  mrb_get_args(mrb, "n|o&", &mid, &proc, &blk);
     2091  switch (mrb_type(proc)) {
     2092    case MRB_TT_PROC:
     2093      blk = proc;
     2094      break;
     2095    case MRB_TT_UNDEF:
     2096      /* ignored */
     2097      break;
     2098    default:
     2099      mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %T (expected Proc)", proc);
     2100      break;
     2101  }
     2102  if (mrb_nil_p(blk)) {
     2103    mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
     2104  }
     2105  p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);
     2106  mrb_proc_copy(p, mrb_proc_ptr(blk));
     2107  p->flags |= MRB_PROC_STRICT;
     2108  MRB_METHOD_FROM_PROC(m, p);
     2109  mrb_define_method_raw(mrb, c, mid, m);
     2110  return mrb_symbol_value(mid);
     2111}
     2112
     2113static mrb_value
     2114top_define_method(mrb_state *mrb, mrb_value self)
     2115{
     2116  return mod_define_method(mrb, mrb_obj_value(mrb->object_class));
    22132117}
    22142118
     
    22252129}
    22262130
    2227 MRB_API mrb_value
     2131static mrb_value
     2132mrb_mod_dup(mrb_state *mrb, mrb_value self)
     2133{
     2134  mrb_value mod = mrb_obj_clone(mrb, self);
     2135  MRB_UNSET_FROZEN_FLAG(mrb_obj_ptr(mod));
     2136  return mod;
     2137}
     2138
     2139static mrb_value
    22282140mrb_mod_module_function(mrb_state *mrb, mrb_value mod)
    22292141{
     
    22312143  mrb_int argc, i;
    22322144  mrb_sym mid;
    2233   struct RProc *method_rproc;
     2145  mrb_method_t m;
    22342146  struct RClass *rclass;
    22352147  int ai;
     
    22512163    mid = mrb_symbol(argv[i]);
    22522164    rclass = mrb_class_ptr(mod);
    2253     method_rproc = mrb_method_search(mrb, rclass, mid);
     2165    m = mrb_method_search(mrb, rclass, mid);
    22542166
    22552167    prepare_singleton_class(mrb, (struct RBasic*)rclass);
    22562168    ai = mrb_gc_arena_save(mrb);
    2257     mrb_define_method_raw(mrb, rclass->c, mid, method_rproc);
     2169    mrb_define_method_raw(mrb, rclass->c, mid, m);
    22582170    mrb_gc_arena_restore(mrb, ai);
    22592171  }
     
    22662178/* implementation of instance_eval */
    22672179mrb_value mrb_obj_instance_eval(mrb_state*, mrb_value);
     2180
     2181static mrb_value
     2182inspect_main(mrb_state *mrb, mrb_value mod)
     2183{
     2184  return mrb_str_new_lit(mrb, "main");
     2185}
     2186
     2187static const mrb_code new_iseq[] = {
     2188  OP_ENTER, 0x0, 0x10, 0x1,  /* OP_ENTER     0:0:1:0:0:0:1 */
     2189  OP_LOADSELF, 0x3,          /* OP_LOADSELF  R3 */
     2190  OP_SEND, 0x3, 0x0, 0x0,    /* OP_SEND      R3  :allocate  0 */
     2191  OP_MOVE, 0x0, 0x3,         /* OP_MOVE      R0  R3 */
     2192  OP_MOVE, 0x4, 0x1,         /* OP_MOVE      R4  R1 */
     2193  OP_MOVE, 0x5, 0x2,         /* OP_MOVE      R5  R2 */
     2194  OP_SENDVB, 0x3, 0x1,       /* OP_SENDVB    R4  :initialize */
     2195  OP_RETURN, 0x0             /* OP_RETURN    R0 */
     2196};
     2197
     2198static void
     2199init_class_new(mrb_state *mrb, struct RClass *cls)
     2200{
     2201  struct RProc *p;
     2202  mrb_method_t m;
     2203  mrb_irep *new_irep = (mrb_irep*)mrb_malloc(mrb, sizeof(mrb_irep));
     2204  static const mrb_irep mrb_irep_zero = { 0 };
     2205
     2206  *new_irep = mrb_irep_zero;
     2207  new_irep->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*2);
     2208  new_irep->syms[0] = mrb_intern_lit(mrb, "allocate");
     2209  new_irep->syms[1] = mrb_intern_lit(mrb, "initialize");
     2210  new_irep->slen = 2;
     2211  new_irep->flags = MRB_ISEQ_NO_FREE;
     2212  new_irep->iseq = new_iseq;
     2213  new_irep->ilen = sizeof(new_iseq);
     2214  new_irep->nregs = 6;
     2215  new_irep->nlocals = 3;
     2216  p = mrb_proc_new(mrb, new_irep);
     2217  MRB_METHOD_FROM_PROC(m, p);
     2218  mrb_define_method_raw(mrb, cls, mrb_intern_lit(mrb, "new"), m);
     2219}
    22682220
    22692221void
     
    22892241  /* name basic classes */
    22902242  mrb_define_const(mrb, bob, "BasicObject", mrb_obj_value(bob));
    2291   mrb_define_const(mrb, obj, "BasicObject", mrb_obj_value(bob));
    22922243  mrb_define_const(mrb, obj, "Object",      mrb_obj_value(obj));
    22932244  mrb_define_const(mrb, obj, "Module",      mrb_obj_value(mod));
     
    22952246
    22962247  /* name each classes */
    2297   name_class(mrb, bob, mrb_intern_lit(mrb, "BasicObject"));
    2298   name_class(mrb, obj, mrb_intern_lit(mrb, "Object"));          /* 15.2.1 */
    2299   name_class(mrb, mod, mrb_intern_lit(mrb, "Module"));          /* 15.2.2 */
    2300   name_class(mrb, cls, mrb_intern_lit(mrb, "Class"));            /* 15.2.3 */
     2248  mrb_class_name_class(mrb, NULL, bob, mrb_intern_lit(mrb, "BasicObject"));
     2249  mrb_class_name_class(mrb, NULL, obj, mrb_intern_lit(mrb, "Object")); /* 15.2.1 */
     2250  mrb_class_name_class(mrb, NULL, mod, mrb_intern_lit(mrb, "Module")); /* 15.2.2 */
     2251  mrb_class_name_class(mrb, NULL, cls, mrb_intern_lit(mrb, "Class"));  /* 15.2.3 */
    23012252
    23022253  mrb->proc_class = mrb_define_class(mrb, "Proc", mrb->object_class);  /* 15.2.17 */
     
    23082259  mrb_define_method(mrb, bob, "==",                      mrb_obj_equal_m,          MRB_ARGS_REQ(1)); /* 15.3.1.3.1  */
    23092260  mrb_define_method(mrb, bob, "!=",                      mrb_obj_not_equal_m,      MRB_ARGS_REQ(1));
    2310   mrb_define_method(mrb, bob, "__id__",                  mrb_obj_id_m,             MRB_ARGS_NONE()); /* 15.3.1.3.3  */
    2311   mrb_define_method(mrb, bob, "__send__",                mrb_f_send,               MRB_ARGS_ANY());  /* 15.3.1.3.4  */
    2312   mrb_define_method(mrb, bob, "instance_eval",           mrb_obj_instance_eval,    MRB_ARGS_ANY());  /* 15.3.1.3.18 */
    2313 
    2314   mrb_define_class_method(mrb, cls, "new",               mrb_class_new_class,      MRB_ARGS_OPT(1));
     2261  mrb_define_method(mrb, bob, "__id__",                  mrb_obj_id_m,             MRB_ARGS_NONE()); /* 15.3.1.3.4  */
     2262  mrb_define_method(mrb, bob, "__send__",                mrb_f_send,               MRB_ARGS_REQ(1)|MRB_ARGS_REST()|MRB_ARGS_BLOCK());  /* 15.3.1.3.5  */
     2263  mrb_define_method(mrb, bob, "equal?",                  mrb_obj_equal_m,          MRB_ARGS_REQ(1)); /* 15.3.1.3.11 */
     2264  mrb_define_method(mrb, bob, "instance_eval",           mrb_obj_instance_eval,    MRB_ARGS_OPT(1)|MRB_ARGS_BLOCK());  /* 15.3.1.3.18 */
     2265
     2266  mrb_define_class_method(mrb, cls, "new",               mrb_class_new_class,      MRB_ARGS_OPT(1)|MRB_ARGS_BLOCK());
     2267  mrb_define_method(mrb, cls, "allocate",                mrb_instance_alloc,       MRB_ARGS_NONE());
    23152268  mrb_define_method(mrb, cls, "superclass",              mrb_class_superclass,     MRB_ARGS_NONE()); /* 15.2.3.3.4 */
    2316   mrb_define_method(mrb, cls, "new",                     mrb_instance_new,         MRB_ARGS_ANY());  /* 15.2.3.3.3 */
    23172269  mrb_define_method(mrb, cls, "initialize",              mrb_class_initialize,     MRB_ARGS_OPT(1)); /* 15.2.3.3.1 */
    23182270  mrb_define_method(mrb, cls, "inherited",               mrb_bob_init,             MRB_ARGS_REQ(1));
    23192271
     2272  init_class_new(mrb, cls);
     2273
    23202274  MRB_SET_INSTANCE_TT(mod, MRB_TT_MODULE);
    2321   mrb_define_method(mrb, mod, "class_variable_defined?", mrb_mod_cvar_defined,     MRB_ARGS_REQ(1)); /* 15.2.2.4.16 */
    2322   mrb_define_method(mrb, mod, "class_variable_get",      mrb_mod_cvar_get,         MRB_ARGS_REQ(1)); /* 15.2.2.4.17 */
    2323   mrb_define_method(mrb, mod, "class_variable_set",      mrb_mod_cvar_set,         MRB_ARGS_REQ(2)); /* 15.2.2.4.18 */
    23242275  mrb_define_method(mrb, mod, "extend_object",           mrb_mod_extend_object,    MRB_ARGS_REQ(1)); /* 15.2.2.4.25 */
    23252276  mrb_define_method(mrb, mod, "extended",                mrb_bob_init,             MRB_ARGS_REQ(1)); /* 15.2.2.4.26 */
     
    23302281  mrb_define_method(mrb, mod, "class_eval",              mrb_mod_module_eval,      MRB_ARGS_ANY());  /* 15.2.2.4.15 */
    23312282  mrb_define_method(mrb, mod, "included",                mrb_bob_init,             MRB_ARGS_REQ(1)); /* 15.2.2.4.29 */
    2332   mrb_define_method(mrb, mod, "included_modules",        mrb_mod_included_modules, MRB_ARGS_NONE()); /* 15.2.2.4.30 */
    23332283  mrb_define_method(mrb, mod, "initialize",              mrb_mod_initialize,       MRB_ARGS_NONE()); /* 15.2.2.4.31 */
    2334   mrb_define_method(mrb, mod, "instance_methods",        mrb_mod_instance_methods, MRB_ARGS_ANY());  /* 15.2.2.4.33 */
    2335   mrb_define_method(mrb, mod, "method_defined?",         mrb_mod_method_defined,   MRB_ARGS_REQ(1)); /* 15.2.2.4.34 */
    23362284  mrb_define_method(mrb, mod, "module_eval",             mrb_mod_module_eval,      MRB_ARGS_ANY());  /* 15.2.2.4.35 */
    23372285  mrb_define_method(mrb, mod, "module_function",         mrb_mod_module_function,  MRB_ARGS_ANY());
     
    23392287  mrb_define_method(mrb, mod, "protected",               mrb_mod_dummy_visibility, MRB_ARGS_ANY());  /* 15.2.2.4.37 */
    23402288  mrb_define_method(mrb, mod, "public",                  mrb_mod_dummy_visibility, MRB_ARGS_ANY());  /* 15.2.2.4.38 */
    2341   mrb_define_method(mrb, mod, "remove_class_variable",   mrb_mod_remove_cvar,      MRB_ARGS_REQ(1)); /* 15.2.2.4.39 */
    2342   mrb_define_method(mrb, mod, "remove_method",           mrb_mod_remove_method,    MRB_ARGS_ANY());  /* 15.2.2.4.41 */
    2343   mrb_define_method(mrb, mod, "method_removed",          mrb_bob_init,             MRB_ARGS_REQ(1));
    23442289  mrb_define_method(mrb, mod, "attr_reader",             mrb_mod_attr_reader,      MRB_ARGS_ANY());  /* 15.2.2.4.13 */
    23452290  mrb_define_method(mrb, mod, "attr_writer",             mrb_mod_attr_writer,      MRB_ARGS_ANY());  /* 15.2.2.4.14 */
     
    23522297  mrb_define_method(mrb, mod, "const_get",               mrb_mod_const_get,        MRB_ARGS_REQ(1)); /* 15.2.2.4.21 */
    23532298  mrb_define_method(mrb, mod, "const_set",               mrb_mod_const_set,        MRB_ARGS_REQ(2)); /* 15.2.2.4.23 */
    2354   mrb_define_method(mrb, mod, "constants",               mrb_mod_constants,        MRB_ARGS_OPT(1)); /* 15.2.2.4.24 */
    23552299  mrb_define_method(mrb, mod, "remove_const",            mrb_mod_remove_const,     MRB_ARGS_REQ(1)); /* 15.2.2.4.40 */
    23562300  mrb_define_method(mrb, mod, "const_missing",           mrb_mod_const_missing,    MRB_ARGS_REQ(1));
     2301  mrb_define_method(mrb, mod, "method_defined?",         mrb_mod_method_defined,   MRB_ARGS_REQ(1)); /* 15.2.2.4.34 */
    23572302  mrb_define_method(mrb, mod, "define_method",           mod_define_method,        MRB_ARGS_ARG(1,1));
    2358   mrb_define_method(mrb, mod, "class_variables",         mrb_mod_class_variables,  MRB_ARGS_NONE()); /* 15.2.2.4.19 */
    2359   mrb_define_method(mrb, mod, "===",                     mrb_mod_eqq,              MRB_ARGS_REQ(1));
    2360   mrb_define_class_method(mrb, mod, "constants",         mrb_mod_s_constants,      MRB_ARGS_ANY());  /* 15.2.2.3.1 */
     2303  mrb_define_method(mrb, mod, "===",                     mrb_mod_eqq,              MRB_ARGS_REQ(1)); /* 15.2.2.4.7 */
     2304  mrb_define_method(mrb, mod, "dup",                     mrb_mod_dup,              MRB_ARGS_NONE());
    23612305
    23622306  mrb_undef_method(mrb, cls, "append_features");
     2307  mrb_undef_method(mrb, cls, "prepend_features");
    23632308  mrb_undef_method(mrb, cls, "extend_object");
    2364 }
     2309  mrb_undef_method(mrb, cls, "module_function");
     2310
     2311  mrb->top_self = (struct RObject*)mrb_obj_alloc(mrb, MRB_TT_OBJECT, mrb->object_class);
     2312  mrb_define_singleton_method(mrb, mrb->top_self, "inspect", inspect_main, MRB_ARGS_NONE());
     2313  mrb_define_singleton_method(mrb, mrb->top_self, "to_s", inspect_main, MRB_ARGS_NONE());
     2314  mrb_define_singleton_method(mrb, mrb->top_self, "define_method", top_define_method, MRB_ARGS_ARG(1,1));
     2315}
Note: See TracChangeset for help on using the changeset viewer.