Groonga 3.0.9 Source Code Document
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
kernel.c
Go to the documentation of this file.
1 /*
2 ** kernel.c - Kernel module
3 **
4 ** See Copyright Notice in mruby.h
5 */
6 
7 #include "mruby.h"
8 #include "mruby/array.h"
9 #include "mruby/class.h"
10 #include "mruby/proc.h"
11 #include "mruby/string.h"
12 #include "mruby/variable.h"
13 #include "error.h"
14 
15 typedef enum {
16  NOEX_PUBLIC = 0x00,
17  NOEX_NOSUPER = 0x01,
18  NOEX_PRIVATE = 0x02,
20  NOEX_MASK = 0x06,
21  NOEX_BASIC = 0x08,
23  NOEX_MODFUNC = 0x12,
24  NOEX_SUPER = 0x20,
25  NOEX_VCALL = 0x40,
28 
31 {
32  struct RProc *me = mrb_method_search(mrb, mrb_class(mrb, obj), mrb_intern2(mrb, "to_s", 4));
33  if (me && MRB_PROC_CFUNC_P(me) && (me->body.func == mrb_any_to_s))
34  return TRUE;
35  return FALSE;
36 }
37 
38 /* 15.3.1.3.17 */
39 /*
40  * call-seq:
41  * obj.inspect -> string
42  *
43  * Returns a string containing a human-readable representation of
44  * <i>obj</i>. If not overridden and no instance variables, uses the
45  * <code>to_s</code> method to generate the string.
46  * <i>obj</i>. If not overridden, uses the <code>to_s</code> method to
47  * generate the string.
48  *
49  * [ 1, 2, 3..4, 'five' ].inspect #=> "[1, 2, 3..4, \"five\"]"
50  * Time.new.inspect #=> "2008-03-08 19:43:39 +0900"
51  */
54 {
55  if ((mrb_type(obj) == MRB_TT_OBJECT) && mrb_obj_basic_to_s_p(mrb, obj)) {
56  return mrb_obj_iv_inspect(mrb, mrb_obj_ptr(obj));
57  }
58  return mrb_any_to_s(mrb, obj);
59 }
60 
61 /* 15.3.1.3.1 */
62 /* 15.3.1.3.10 */
63 /* 15.3.1.3.11 */
64 /*
65  * call-seq:
66  * obj == other -> true or false
67  * obj.equal?(other) -> true or false
68  * obj.eql?(other) -> true or false
69  *
70  * Equality---At the <code>Object</code> level, <code>==</code> returns
71  * <code>true</code> only if <i>obj</i> and <i>other</i> are the
72  * same object. Typically, this method is overridden in descendant
73  * classes to provide class-specific meaning.
74  *
75  * Unlike <code>==</code>, the <code>equal?</code> method should never be
76  * overridden by subclasses: it is used to determine object identity
77  * (that is, <code>a.equal?(b)</code> iff <code>a</code> is the same
78  * object as <code>b</code>).
79  *
80  * The <code>eql?</code> method returns <code>true</code> if
81  * <i>obj</i> and <i>anObject</i> have the same value. Used by
82  * <code>Hash</code> to test members for equality. For objects of
83  * class <code>Object</code>, <code>eql?</code> is synonymous with
84  * <code>==</code>. Subclasses normally continue this tradition, but
85  * there are exceptions. <code>Numeric</code> types, for example,
86  * perform type conversion across <code>==</code>, but not across
87  * <code>eql?</code>, so:
88  *
89  * 1 == 1.0 #=> true
90  * 1.eql? 1.0 #=> false
91  */
92 static mrb_value
93 mrb_obj_equal_m(mrb_state *mrb, mrb_value self)
94 {
95  mrb_value arg;
96  mrb_bool eql_p;
97 
98  mrb_get_args(mrb, "o", &arg);
99  eql_p = mrb_obj_equal(mrb, self, arg);
100 
101  return mrb_bool_value(eql_p);
102 }
103 
104 static mrb_value
105 mrb_obj_not_equal_m(mrb_state *mrb, mrb_value self)
106 {
107  mrb_value arg;
108  mrb_bool eql_p;
109 
110  mrb_get_args(mrb, "o", &arg);
111  eql_p = mrb_equal(mrb, self, arg);
112 
113  return mrb_bool_value(!eql_p);
114 }
115 
116 /* 15.3.1.3.2 */
117 /*
118  * call-seq:
119  * obj === other -> true or false
120  *
121  * Case Equality---For class <code>Object</code>, effectively the same
122  * as calling <code>#==</code>, but typically overridden by descendants
123  * to provide meaningful semantics in <code>case</code> statements.
124  */
125 static mrb_value
126 mrb_equal_m(mrb_state *mrb, mrb_value self)
127 {
128  mrb_value arg;
129  mrb_bool equal_p;
130 
131  mrb_get_args(mrb, "o", &arg);
132  equal_p = mrb_equal(mrb, self, arg);
133 
134  return mrb_bool_value(equal_p);
135 }
136 
137 /* 15.3.1.3.3 */
138 /* 15.3.1.3.33 */
139 /*
140  * Document-method: __id__
141  * Document-method: object_id
142  *
143  * call-seq:
144  * obj.__id__ -> fixnum
145  * obj.object_id -> fixnum
146  *
147  * Returns an integer identifier for <i>obj</i>. The same number will
148  * be returned on all calls to <code>id</code> for a given object, and
149  * no two active objects will share an id.
150  * <code>Object#object_id</code> is a different concept from the
151  * <code>:name</code> notation, which returns the symbol id of
152  * <code>name</code>. Replaces the deprecated <code>Object#id</code>.
153  */
154 static mrb_value
155 mrb_obj_id_m(mrb_state *mrb, mrb_value self)
156 {
157  return mrb_fixnum_value(mrb_obj_id(self));
158 }
159 
160 /* 15.3.1.3.4 */
161 /* 15.3.1.3.44 */
162 /*
163  * call-seq:
164  * obj.send(symbol [, args...]) -> obj
165  * obj.__send__(symbol [, args...]) -> obj
166  *
167  * Invokes the method identified by _symbol_, passing it any
168  * arguments specified. You can use <code>__send__</code> if the name
169  * +send+ clashes with an existing method in _obj_.
170  *
171  * class Klass
172  * def hello(*args)
173  * "Hello " + args.join(' ')
174  * end
175  * end
176  * k = Klass.new
177  * k.send :hello, "gentle", "readers" #=> "Hello gentle readers"
178  */
179 static mrb_value
180 mrb_f_send(mrb_state *mrb, mrb_value self)
181 {
182  mrb_sym name;
183  mrb_value block, *argv;
184  int argc;
185 
186  mrb_get_args(mrb, "n*&", &name, &argv, &argc, &block);
187  return mrb_funcall_with_block(mrb,self, name, argc, argv, block);
188 }
189 
190 /* 15.3.1.2.2 */
191 /* 15.3.1.2.5 */
192 /* 15.3.1.3.6 */
193 /* 15.3.1.3.25 */
194 /*
195  * call-seq:
196  * block_given? -> true or false
197  * iterator? -> true or false
198  *
199  * Returns <code>true</code> if <code>yield</code> would execute a
200  * block in the current context. The <code>iterator?</code> form
201  * is mildly deprecated.
202  *
203  * def try
204  * if block_given?
205  * yield
206  * else
207  * "no block"
208  * end
209  * end
210  * try #=> "no block"
211  * try { "hello" } #=> "hello"
212  * try do "hello" end #=> "hello"
213  */
214 static mrb_value
215 mrb_f_block_given_p_m(mrb_state *mrb, mrb_value self)
216 {
217  mrb_callinfo *ci = mrb->c->ci;
218  mrb_value *bp;
219  mrb_bool given_p;
220 
221  bp = mrb->c->stbase + ci->stackidx + 1;
222  ci--;
223  if (ci <= mrb->c->cibase) {
224  given_p = 0;
225  }
226  else {
227  /* block_given? called within block; check upper scope */
228  if (ci->proc->env && ci->proc->env->stack) {
229  given_p = !(ci->proc->env->stack == mrb->c->stbase ||
230  mrb_nil_p(ci->proc->env->stack[1]));
231  }
232  else {
233  if (ci->argc > 0) {
234  bp += ci->argc;
235  }
236  given_p = !mrb_nil_p(*bp);
237  }
238  }
239 
240  return mrb_bool_value(given_p);
241 }
242 
243 /* 15.3.1.3.7 */
244 /*
245  * call-seq:
246  * obj.class -> class
247  *
248  * Returns the class of <i>obj</i>. This method must always be
249  * called with an explicit receiver, as <code>class</code> is also a
250  * reserved word in Ruby.
251  *
252  * 1.class #=> Fixnum
253  * self.class #=> Object
254  */
255 static mrb_value
256 mrb_obj_class_m(mrb_state *mrb, mrb_value self)
257 {
258  return mrb_obj_value(mrb_obj_class(mrb, self));
259 }
260 
261 struct RClass*
263 {
264  struct RClass *klass = mrb_basic_ptr(obj)->c;
265 
266  if (klass->tt != MRB_TT_SCLASS)
267  return klass;
268  else {
269  /* copy singleton(unnamed) class */
270  struct RClass *clone = (struct RClass*)mrb_obj_alloc(mrb, klass->tt, mrb->class_class);
271 
272  if ((mrb_type(obj) == MRB_TT_CLASS) ||
273  (mrb_type(obj) == MRB_TT_SCLASS)) { /* BUILTIN_TYPE(obj) == T_CLASS */
274  clone->c = clone;
275  }
276  else {
277  clone->c = mrb_singleton_class_clone(mrb, mrb_obj_value(klass));
278  }
279 
280  clone->super = klass->super;
281  if (klass->iv) {
282  mrb_iv_copy(mrb, mrb_obj_value(clone), mrb_obj_value(klass));
283  mrb_obj_iv_set(mrb, (struct RObject*)clone, mrb_intern2(mrb, "__attached__", 12), obj);
284  }
285  if (klass->mt) {
286  clone->mt = kh_copy(mt, mrb, klass->mt);
287  }
288  else {
289  clone->mt = kh_init(mt, mrb);
290  }
291  clone->tt = MRB_TT_SCLASS;
292  return clone;
293  }
294 }
295 
296 static void
297 init_copy(mrb_state *mrb, mrb_value dest, mrb_value obj)
298 {
299  switch (mrb_type(obj)) {
300  case MRB_TT_OBJECT:
301  case MRB_TT_CLASS:
302  case MRB_TT_MODULE:
303  case MRB_TT_SCLASS:
304  case MRB_TT_HASH:
305  case MRB_TT_DATA:
306  mrb_iv_copy(mrb, dest, obj);
307  break;
308 
309  default:
310  break;
311  }
312  mrb_funcall(mrb, dest, "initialize_copy", 1, obj);
313 }
314 
315 /* 15.3.1.3.8 */
316 /*
317  * call-seq:
318  * obj.clone -> an_object
319  *
320  * Produces a shallow copy of <i>obj</i>---the instance variables of
321  * <i>obj</i> are copied, but not the objects they reference. Copies
322  * the frozen state of <i>obj</i>. See also the discussion
323  * under <code>Object#dup</code>.
324  *
325  * class Klass
326  * attr_accessor :str
327  * end
328  * s1 = Klass.new #=> #<Klass:0x401b3a38>
329  * s1.str = "Hello" #=> "Hello"
330  * s2 = s1.clone #=> #<Klass:0x401b3998 @str="Hello">
331  * s2.str[1,4] = "i" #=> "i"
332  * s1.inspect #=> "#<Klass:0x401b3a38 @str=\"Hi\">"
333  * s2.inspect #=> "#<Klass:0x401b3998 @str=\"Hi\">"
334  *
335  * This method may have class-specific behavior. If so, that
336  * behavior will be documented under the #+initialize_copy+ method of
337  * the class.
338  *
339  * Some Class(True False Nil Symbol Fixnum Float) Object cannot clone.
340  */
341 mrb_value
343 {
344  struct RObject *p;
345  mrb_value clone;
346 
347  if (mrb_special_const_p(self)) {
348  mrb_raisef(mrb, E_TYPE_ERROR, "can't clone %S", self);
349  }
350  p = (struct RObject*)mrb_obj_alloc(mrb, mrb_type(self), mrb_obj_class(mrb, self));
351  p->c = mrb_singleton_class_clone(mrb, self);
352  clone = mrb_obj_value(p);
353  init_copy(mrb, clone, self);
354 
355  return clone;
356 }
357 
358 /* 15.3.1.3.9 */
359 /*
360  * call-seq:
361  * obj.dup -> an_object
362  *
363  * Produces a shallow copy of <i>obj</i>---the instance variables of
364  * <i>obj</i> are copied, but not the objects they reference.
365  * <code>dup</code> copies the frozen state of <i>obj</i>. See also
366  * the discussion under <code>Object#clone</code>. In general,
367  * <code>clone</code> and <code>dup</code> may have different semantics
368  * in descendant classes. While <code>clone</code> is used to duplicate
369  * an object, including its internal state, <code>dup</code> typically
370  * uses the class of the descendant object to create the new instance.
371  *
372  * This method may have class-specific behavior. If so, that
373  * behavior will be documented under the #+initialize_copy+ method of
374  * the class.
375  */
376 
377 mrb_value
379 {
380  struct RBasic *p;
381  mrb_value dup;
382 
383  if (mrb_special_const_p(obj)) {
384  mrb_raisef(mrb, E_TYPE_ERROR, "can't dup %S", obj);
385  }
386  p = mrb_obj_alloc(mrb, mrb_type(obj), mrb_obj_class(mrb, obj));
387  dup = mrb_obj_value(p);
388  init_copy(mrb, dup, obj);
389 
390  return dup;
391 }
392 
393 static mrb_value
394 mrb_obj_extend(mrb_state *mrb, int argc, mrb_value *argv, mrb_value obj)
395 {
396  int i;
397 
398  if (argc == 0) {
399  mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (at least 1)");
400  }
401  for (i = 0; i < argc; i++) {
402  mrb_check_type(mrb, argv[i], MRB_TT_MODULE);
403  }
404  while (argc--) {
405  mrb_funcall(mrb, argv[argc], "extend_object", 1, obj);
406  mrb_funcall(mrb, argv[argc], "extended", 1, obj);
407  }
408  return obj;
409 }
410 
411 /* 15.3.1.3.13 */
412 /*
413  * call-seq:
414  * obj.extend(module, ...) -> obj
415  *
416  * Adds to _obj_ the instance methods from each module given as a
417  * parameter.
418  *
419  * module Mod
420  * def hello
421  * "Hello from Mod.\n"
422  * end
423  * end
424  *
425  * class Klass
426  * def hello
427  * "Hello from Klass.\n"
428  * end
429  * end
430  *
431  * k = Klass.new
432  * k.hello #=> "Hello from Klass.\n"
433  * k.extend(Mod) #=> #<Klass:0x401b3bc8>
434  * k.hello #=> "Hello from Mod.\n"
435  */
436 mrb_value
438 {
439  mrb_value *argv;
440  int argc;
441 
442  mrb_get_args(mrb, "*", &argv, &argc);
443  return mrb_obj_extend(mrb, argc, argv, self);
444 }
445 
446 /* 15.3.1.3.15 */
447 /*
448  * call-seq:
449  * obj.hash -> fixnum
450  *
451  * Generates a <code>Fixnum</code> hash value for this object. This
452  * function must have the property that <code>a.eql?(b)</code> implies
453  * <code>a.hash == b.hash</code>. The hash value is used by class
454  * <code>Hash</code>. Any hash value that exceeds the capacity of a
455  * <code>Fixnum</code> will be truncated before being used.
456  */
457 mrb_value
459 {
460  return mrb_fixnum_value(mrb_obj_id(self));
461 }
462 
463 /* 15.3.1.3.16 */
464 mrb_value
466 {
467  mrb_value orig;
468 
469  mrb_get_args(mrb, "o", &orig);
470  if (mrb_obj_equal(mrb, self, orig)) return self;
471  if ((mrb_type(self) != mrb_type(orig)) || (mrb_obj_class(mrb, self) != mrb_obj_class(mrb, orig))) {
472  mrb_raise(mrb, E_TYPE_ERROR, "initialize_copy should take same class object");
473  }
474  return self;
475 }
476 
477 mrb_value mrb_yield_internal(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv, mrb_value self, struct RClass *c);
478 
479 /* 15.3.1.3.18 */
480 /*
481  * call-seq:
482  * obj.instance_eval {| | block } -> obj
483  *
484  * Evaluates the given block,within the context of the receiver (_obj_).
485  * In order to set the context, the variable +self+ is set to _obj_ while
486  * the code is executing, giving the code access to _obj_'s
487  * instance variables. In the version of <code>instance_eval</code>
488  * that takes a +String+, the optional second and third
489  * parameters supply a filename and starting line number that are used
490  * when reporting compilation errors.
491  *
492  * class KlassWithSecret
493  * def initialize
494  * @secret = 99
495  * end
496  * end
497  * k = KlassWithSecret.new
498  * k.instance_eval { @secret } #=> 99
499  */
500 mrb_value
502 {
503  mrb_value a, b;
504  mrb_value cv;
505  struct RClass *c;
506 
507  if (mrb_get_args(mrb, "|S&", &a, &b) == 1) {
508  mrb_raise(mrb, E_NOTIMP_ERROR, "instance_eval with string not implemented");
509  }
510  switch (mrb_type(self)) {
511  case MRB_TT_SYMBOL:
512  case MRB_TT_FIXNUM:
513  case MRB_TT_FLOAT:
514  c = 0;
515  break;
516  default:
517  cv = mrb_singleton_class(mrb, self);
518  c = mrb_class_ptr(cv);
519  break;
520  }
521  return mrb_yield_internal(mrb, b, 0, 0, self, c);
522 }
523 
524 mrb_bool
526 {
527  if (mrb_obj_class(mrb, obj) == c) return TRUE;
528  return FALSE;
529 }
530 
531 /* 15.3.1.3.19 */
532 /*
533  * call-seq:
534  * obj.instance_of?(class) -> true or false
535  *
536  * Returns <code>true</code> if <i>obj</i> is an instance of the given
537  * class. See also <code>Object#kind_of?</code>.
538  */
539 static mrb_value
540 obj_is_instance_of(mrb_state *mrb, mrb_value self)
541 {
542  mrb_value arg;
543  mrb_bool instance_of_p;
544 
545  mrb_get_args(mrb, "o", &arg);
546  instance_of_p = mrb_obj_is_instance_of(mrb, self, mrb_class_ptr(arg));
547 
548  return mrb_bool_value(instance_of_p);
549 }
550 
551 static void
552 valid_iv_name(mrb_state *mrb, mrb_sym iv_name_id, const char* s, size_t len)
553 {
554  if (len < 2 || !(s[0] == '@' && s[1] != '@')) {
555  mrb_name_error(mrb, iv_name_id, "`%S' is not allowed as an instance variable name", mrb_sym2str(mrb, iv_name_id));
556  }
557 }
558 
559 static void
560 check_iv_name(mrb_state *mrb, mrb_sym iv_name_id)
561 {
562  const char *s;
563  size_t len;
564 
565  s = mrb_sym2name_len(mrb, iv_name_id, &len);
566  valid_iv_name(mrb, iv_name_id, s, len);
567 }
568 
569 static mrb_sym
570 get_valid_iv_sym(mrb_state *mrb, mrb_value iv_name)
571 {
572  mrb_sym iv_name_id;
573 
574  mrb_assert(mrb_symbol_p(iv_name) || mrb_string_p(iv_name));
575 
576  if (mrb_string_p(iv_name)) {
577  iv_name_id = mrb_intern_cstr(mrb, RSTRING_PTR(iv_name));
578  valid_iv_name(mrb, iv_name_id, RSTRING_PTR(iv_name), RSTRING_LEN(iv_name));
579  }
580  else {
581  iv_name_id = mrb_symbol(iv_name);
582  check_iv_name(mrb, iv_name_id);
583  }
584 
585  return iv_name_id;
586 }
587 
588 /* 15.3.1.3.20 */
589 /*
590  * call-seq:
591  * obj.instance_variable_defined?(symbol) -> true or false
592  *
593  * Returns <code>true</code> if the given instance variable is
594  * defined in <i>obj</i>.
595  *
596  * class Fred
597  * def initialize(p1, p2)
598  * @a, @b = p1, p2
599  * end
600  * end
601  * fred = Fred.new('cat', 99)
602  * fred.instance_variable_defined?(:@a) #=> true
603  * fred.instance_variable_defined?("@b") #=> true
604  * fred.instance_variable_defined?("@c") #=> false
605  */
606 mrb_value
608 {
609  mrb_sym mid;
610  mrb_value sym;
611  mrb_bool defined_p;
612 
613  mrb_get_args(mrb, "o", &sym);
614  mid = get_valid_iv_sym(mrb, sym);
615  defined_p = mrb_obj_iv_defined(mrb, mrb_obj_ptr(self), mid);
616 
617  return mrb_bool_value(defined_p);
618 }
619 
620 /* 15.3.1.3.21 */
621 /*
622  * call-seq:
623  * obj.instance_variable_get(symbol) -> obj
624  *
625  * Returns the value of the given instance variable, or nil if the
626  * instance variable is not set. The <code>@</code> part of the
627  * variable name should be included for regular instance
628  * variables. Throws a <code>NameError</code> exception if the
629  * supplied symbol is not valid as an instance variable name.
630  *
631  * class Fred
632  * def initialize(p1, p2)
633  * @a, @b = p1, p2
634  * end
635  * end
636  * fred = Fred.new('cat', 99)
637  * fred.instance_variable_get(:@a) #=> "cat"
638  * fred.instance_variable_get("@b") #=> 99
639  */
640 mrb_value
642 {
643  mrb_sym iv_name_id;
644  mrb_value iv_name;
645 
646  mrb_get_args(mrb, "o", &iv_name);
647 
648  iv_name_id = get_valid_iv_sym(mrb, iv_name);
649  return mrb_iv_get(mrb, self, iv_name_id);
650 }
651 
652 /* 15.3.1.3.22 */
653 /*
654  * call-seq:
655  * obj.instance_variable_set(symbol, obj) -> obj
656  *
657  * Sets the instance variable names by <i>symbol</i> to
658  * <i>object</i>, thereby frustrating the efforts of the class's
659  * author to attempt to provide proper encapsulation. The variable
660  * did not have to exist prior to this call.
661  *
662  * class Fred
663  * def initialize(p1, p2)
664  * @a, @b = p1, p2
665  * end
666  * end
667  * fred = Fred.new('cat', 99)
668  * fred.instance_variable_set(:@a, 'dog') #=> "dog"
669  * fred.instance_variable_set(:@c, 'cat') #=> "cat"
670  * fred.inspect #=> "#<Fred:0x401b3da8 @a=\"dog\", @b=99, @c=\"cat\">"
671  */
672 mrb_value
674 {
675  mrb_sym iv_name_id;
676  mrb_value iv_name, val;
677 
678  mrb_get_args(mrb, "oo", &iv_name, &val);
679 
680  iv_name_id = get_valid_iv_sym(mrb, iv_name);
681  mrb_iv_set(mrb, self, iv_name_id, val);
682  return val;
683 }
684 
685 /* 15.3.1.3.24 */
686 /* 15.3.1.3.26 */
687 /*
688  * call-seq:
689  * obj.is_a?(class) -> true or false
690  * obj.kind_of?(class) -> true or false
691  *
692  * Returns <code>true</code> if <i>class</i> is the class of
693  * <i>obj</i>, or if <i>class</i> is one of the superclasses of
694  * <i>obj</i> or modules included in <i>obj</i>.
695  *
696  * module M; end
697  * class A
698  * include M
699  * end
700  * class B < A; end
701  * class C < B; end
702  * b = B.new
703  * b.instance_of? A #=> false
704  * b.instance_of? B #=> true
705  * b.instance_of? C #=> false
706  * b.instance_of? M #=> false
707  * b.kind_of? A #=> true
708  * b.kind_of? B #=> true
709  * b.kind_of? C #=> false
710  * b.kind_of? M #=> true
711  */
712 mrb_value
714 {
715  mrb_value arg;
716  mrb_bool kind_of_p;
717 
718  mrb_get_args(mrb, "o", &arg);
719  kind_of_p = mrb_obj_is_kind_of(mrb, self, mrb_class_ptr(arg));
720 
721  return mrb_bool_value(kind_of_p);
722 }
723 
724 static void
725 method_entry_loop(mrb_state *mrb, struct RClass* klass, mrb_value ary)
726 {
727  khint_t i;
728 
729  khash_t(mt) *h = klass->mt;
730  if (!h) return;
731  for (i=0;i<kh_end(h);i++) {
732  if (kh_exist(h, i)) {
733  mrb_ary_push(mrb, ary, mrb_symbol_value(kh_key(h,i)));
734  }
735  }
736 }
737 
738 mrb_value
739 class_instance_method_list(mrb_state *mrb, mrb_bool recur, struct RClass* klass, int obj)
740 {
741  mrb_value ary;
742  struct RClass* oldklass;
743 
744  ary = mrb_ary_new(mrb);
745  oldklass = 0;
746  while (klass && (klass != oldklass)) {
747  method_entry_loop(mrb, klass, ary);
748  if ((klass->tt == MRB_TT_ICLASS) ||
749  (klass->tt == MRB_TT_SCLASS)) {
750  }
751  else {
752  if (!recur) break;
753  }
754  oldklass = klass;
755  klass = klass->super;
756  }
757 
758  return ary;
759 }
760 
761 mrb_value
763 {
764  mrb_value ary;
765  struct RClass* klass;
766 
767  klass = mrb_class(mrb, obj);
768  ary = mrb_ary_new(mrb);
769  if (klass && (klass->tt == MRB_TT_SCLASS)) {
770  method_entry_loop(mrb, klass, ary);
771  klass = klass->super;
772  }
773  if (recur) {
774  while (klass && ((klass->tt == MRB_TT_SCLASS) || (klass->tt == MRB_TT_ICLASS))) {
775  method_entry_loop(mrb, klass, ary);
776  klass = klass->super;
777  }
778  }
779 
780  return ary;
781 }
782 
783 mrb_value
785 {
786  if (recur)
787  return class_instance_method_list(mrb, recur, mrb_class(mrb, obj), 0);
788  else
789  return mrb_obj_singleton_methods(mrb, recur, obj);
790 }
791 /* 15.3.1.3.31 */
792 /*
793  * call-seq:
794  * obj.methods -> array
795  *
796  * Returns a list of the names of methods publicly accessible in
797  * <i>obj</i>. This will include all the methods accessible in
798  * <i>obj</i>'s ancestors.
799  *
800  * class Klass
801  * def kMethod()
802  * end
803  * end
804  * k = Klass.new
805  * k.methods[0..9] #=> [:kMethod, :respond_to?, :nil?, :is_a?,
806  * # :class, :instance_variable_set,
807  * # :methods, :extend, :__send__, :instance_eval]
808  * k.methods.length #=> 42
809  */
810 mrb_value
812 {
813  mrb_bool recur = TRUE;
814  mrb_get_args(mrb, "|b", &recur);
815  return mrb_obj_methods(mrb, recur, self, (mrb_method_flag_t)0); /* everything but private */
816 }
817 
818 /* 15.3.1.3.32 */
819 /*
820  * call_seq:
821  * nil.nil? -> true
822  * <anything_else>.nil? -> false
823  *
824  * Only the object <i>nil</i> responds <code>true</code> to <code>nil?</code>.
825  */
826 mrb_value
828 {
829  return mrb_false_value();
830 }
831 
832 /* 15.3.1.3.36 */
833 /*
834  * call-seq:
835  * obj.private_methods(all=true) -> array
836  *
837  * Returns the list of private methods accessible to <i>obj</i>. If
838  * the <i>all</i> parameter is set to <code>false</code>, only those methods
839  * in the receiver will be listed.
840  */
841 mrb_value
843 {
844  mrb_bool recur = TRUE;
845  mrb_get_args(mrb, "|b", &recur);
846  return mrb_obj_methods(mrb, recur, self, NOEX_PRIVATE); /* private attribute not define */
847 }
848 
849 /* 15.3.1.3.37 */
850 /*
851  * call-seq:
852  * obj.protected_methods(all=true) -> array
853  *
854  * Returns the list of protected methods accessible to <i>obj</i>. If
855  * the <i>all</i> parameter is set to <code>false</code>, only those methods
856  * in the receiver will be listed.
857  */
858 mrb_value
860 {
861  mrb_bool recur = TRUE;
862  mrb_get_args(mrb, "|b", &recur);
863  return mrb_obj_methods(mrb, recur, self, NOEX_PROTECTED); /* protected attribute not define */
864 }
865 
866 /* 15.3.1.3.38 */
867 /*
868  * call-seq:
869  * obj.public_methods(all=true) -> array
870  *
871  * Returns the list of public methods accessible to <i>obj</i>. If
872  * the <i>all</i> parameter is set to <code>false</code>, only those methods
873  * in the receiver will be listed.
874  */
875 mrb_value
877 {
878  mrb_bool recur = TRUE;
879  mrb_get_args(mrb, "|b", &recur);
880  return mrb_obj_methods(mrb, recur, self, NOEX_PUBLIC); /* public attribute not define */
881 }
882 
883 /* 15.3.1.2.12 */
884 /* 15.3.1.3.40 */
885 /*
886  * call-seq:
887  * raise
888  * raise(string)
889  * raise(exception [, string])
890  *
891  * With no arguments, raises a <code>RuntimeError</code>
892  * With a single +String+ argument, raises a
893  * +RuntimeError+ with the string as a message. Otherwise,
894  * the first parameter should be the name of an +Exception+
895  * class (or an object that returns an +Exception+ object when sent
896  * an +exception+ message). The optional second parameter sets the
897  * message associated with the exception, and the third parameter is an
898  * array of callback information. Exceptions are caught by the
899  * +rescue+ clause of <code>begin...end</code> blocks.
900  *
901  * raise "Failed to create socket"
902  * raise ArgumentError, "No parameters", caller
903  */
904 mrb_value
906 {
907  mrb_value a[2], exc;
908  int argc;
909 
910 
911  argc = mrb_get_args(mrb, "|oo", &a[0], &a[1]);
912  switch (argc) {
913  case 0:
914  mrb_raise(mrb, E_RUNTIME_ERROR, "");
915  break;
916  case 1:
917  a[1] = mrb_check_string_type(mrb, a[0]);
918  if (!mrb_nil_p(a[1])) {
919  argc = 2;
920  a[0] = mrb_obj_value(E_RUNTIME_ERROR);
921  }
922  /* fall through */
923  default:
924  exc = mrb_make_exception(mrb, argc, a);
925  mrb_obj_iv_set(mrb, mrb_obj_ptr(exc), mrb_intern2(mrb, "lastpc", 6), mrb_cptr_value(mrb, mrb->c->ci->pc));
926  mrb_exc_raise(mrb, exc);
927  break;
928  }
929  return mrb_nil_value(); /* not reached */
930 }
931 
932 /* 15.3.1.3.41 */
933 /*
934  * call-seq:
935  * obj.remove_instance_variable(symbol) -> obj
936  *
937  * Removes the named instance variable from <i>obj</i>, returning that
938  * variable's value.
939  *
940  * class Dummy
941  * attr_reader :var
942  * def initialize
943  * @var = 99
944  * end
945  * def remove
946  * remove_instance_variable(:@var)
947  * end
948  * end
949  * d = Dummy.new
950  * d.var #=> 99
951  * d.remove #=> 99
952  * d.var #=> nil
953  */
954 mrb_value
956 {
957  mrb_sym sym;
958  mrb_value val;
959 
960  mrb_get_args(mrb, "n", &sym);
961  check_iv_name(mrb, sym);
962  val = mrb_iv_remove(mrb, self, sym);
963  if (mrb_undef_p(val)) {
964  mrb_name_error(mrb, sym, "instance variable %S not defined", mrb_sym2str(mrb, sym));
965  }
966  return val;
967 }
968 
969 static inline mrb_bool
970 basic_obj_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym id, int pub)
971 {
972  return mrb_respond_to(mrb, obj, id);
973 }
974 /* 15.3.1.3.43 */
975 /*
976  * call-seq:
977  * obj.respond_to?(symbol, include_private=false) -> true or false
978  *
979  * Returns +true+ if _obj_ responds to the given
980  * method. Private methods are included in the search only if the
981  * optional second parameter evaluates to +true+.
982  *
983  * If the method is not implemented,
984  * as Process.fork on Windows, File.lchmod on GNU/Linux, etc.,
985  * false is returned.
986  *
987  * If the method is not defined, <code>respond_to_missing?</code>
988  * method is called and the result is returned.
989  */
990 mrb_value
992 {
993  mrb_value *argv;
994  int argc;
995  mrb_value mid, priv;
996  mrb_sym id, rtm_id;
997  mrb_bool respond_to_p = TRUE;
998 
999  mrb_get_args(mrb, "*", &argv, &argc);
1000  mid = argv[0];
1001  if (argc > 1) priv = argv[1];
1002  else priv = mrb_nil_value();
1003 
1004  if (mrb_symbol_p(mid)) {
1005  id = mrb_symbol(mid);
1006  }
1007  else {
1008  mrb_value tmp;
1009  if (!mrb_string_p(mid)) {
1010  tmp = mrb_check_string_type(mrb, mid);
1011  if (mrb_nil_p(tmp)) {
1012  tmp = mrb_inspect(mrb, mid);
1013  mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", tmp);
1014  }
1015  }
1016  tmp = mrb_check_intern_str(mrb, mid);
1017  if (mrb_nil_p(tmp)) {
1018  respond_to_p = FALSE;
1019  }
1020  else {
1021  id = mrb_symbol(tmp);
1022  }
1023  }
1024 
1025  if (respond_to_p) {
1026  respond_to_p = basic_obj_respond_to(mrb, self, id, !mrb_test(priv));
1027  }
1028 
1029  if (!respond_to_p) {
1030  rtm_id = mrb_intern2(mrb, "respond_to_missing?", 19);
1031  if (basic_obj_respond_to(mrb, self, rtm_id, !mrb_test(priv))) {
1032  return mrb_funcall_argv(mrb, self, rtm_id, argc, argv);
1033  }
1034  }
1035  return mrb_bool_value(respond_to_p);
1036 }
1037 
1038 /* 15.3.1.3.45 */
1039 /*
1040  * call-seq:
1041  * obj.singleton_methods(all=true) -> array
1042  *
1043  * Returns an array of the names of singleton methods for <i>obj</i>.
1044  * If the optional <i>all</i> parameter is true, the list will include
1045  * methods in modules included in <i>obj</i>.
1046  * Only public and protected singleton methods are returned.
1047  *
1048  * module Other
1049  * def three() end
1050  * end
1051  *
1052  * class Single
1053  * def Single.four() end
1054  * end
1055  *
1056  * a = Single.new
1057  *
1058  * def a.one()
1059  * end
1060  *
1061  * class << a
1062  * include Other
1063  * def two()
1064  * end
1065  * end
1066  *
1067  * Single.singleton_methods #=> [:four]
1068  * a.singleton_methods(false) #=> [:two, :one]
1069  * a.singleton_methods #=> [:two, :one, :three]
1070  */
1071 mrb_value
1073 {
1074  mrb_bool recur = TRUE;
1075  mrb_get_args(mrb, "|b", &recur);
1076  return mrb_obj_singleton_methods(mrb, recur, self);
1077 }
1078 
1079 void
1081 {
1082  struct RClass *krn;
1083 
1084  krn = mrb->kernel_module = mrb_define_module(mrb, "Kernel");
1085  mrb_define_class_method(mrb, krn, "block_given?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.2.2 */
1086  mrb_define_class_method(mrb, krn, "global_variables", mrb_f_global_variables, MRB_ARGS_NONE()); /* 15.3.1.2.4 */
1087  mrb_define_class_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.2.5 */
1088 ; /* 15.3.1.2.11 */
1089  mrb_define_class_method(mrb, krn, "raise", mrb_f_raise, MRB_ARGS_ANY()); /* 15.3.1.2.12 */
1090 
1091  mrb_define_method(mrb, krn, "singleton_class", mrb_singleton_class, MRB_ARGS_NONE());
1092 
1093  mrb_define_method(mrb, krn, "==", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.1 */
1094  mrb_define_method(mrb, krn, "!=", mrb_obj_not_equal_m, MRB_ARGS_REQ(1));
1095  mrb_define_method(mrb, krn, "===", mrb_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.2 */
1096  mrb_define_method(mrb, krn, "__id__", mrb_obj_id_m, MRB_ARGS_NONE()); /* 15.3.1.3.3 */
1097  mrb_define_method(mrb, krn, "__send__", mrb_f_send, MRB_ARGS_ANY()); /* 15.3.1.3.4 */
1098  mrb_define_method(mrb, krn, "block_given?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.3.6 */
1099  mrb_define_method(mrb, krn, "class", mrb_obj_class_m, MRB_ARGS_NONE()); /* 15.3.1.3.7 */
1100  mrb_define_method(mrb, krn, "clone", mrb_obj_clone, MRB_ARGS_NONE()); /* 15.3.1.3.8 */
1101  mrb_define_method(mrb, krn, "dup", mrb_obj_dup, MRB_ARGS_NONE()); /* 15.3.1.3.9 */
1102  mrb_define_method(mrb, krn, "eql?", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.10 */
1103  mrb_define_method(mrb, krn, "equal?", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.11 */
1104  mrb_define_method(mrb, krn, "extend", mrb_obj_extend_m, MRB_ARGS_ANY()); /* 15.3.1.3.13 */
1105  mrb_define_method(mrb, krn, "global_variables", mrb_f_global_variables, MRB_ARGS_NONE()); /* 15.3.1.3.14 */
1106  mrb_define_method(mrb, krn, "hash", mrb_obj_hash, MRB_ARGS_NONE()); /* 15.3.1.3.15 */
1107  mrb_define_method(mrb, krn, "initialize_copy", mrb_obj_init_copy, MRB_ARGS_REQ(1)); /* 15.3.1.3.16 */
1108  mrb_define_method(mrb, krn, "inspect", mrb_obj_inspect, MRB_ARGS_NONE()); /* 15.3.1.3.17 */
1109  mrb_define_method(mrb, krn, "instance_eval", mrb_obj_instance_eval, MRB_ARGS_ANY()); /* 15.3.1.3.18 */
1110  mrb_define_method(mrb, krn, "instance_of?", obj_is_instance_of, MRB_ARGS_REQ(1)); /* 15.3.1.3.19 */
1111  mrb_define_method(mrb, krn, "instance_variable_defined?", mrb_obj_ivar_defined, MRB_ARGS_REQ(1)); /* 15.3.1.3.20 */
1112  mrb_define_method(mrb, krn, "instance_variable_get", mrb_obj_ivar_get, MRB_ARGS_REQ(1)); /* 15.3.1.3.21 */
1113  mrb_define_method(mrb, krn, "instance_variable_set", mrb_obj_ivar_set, MRB_ARGS_REQ(2)); /* 15.3.1.3.22 */
1114  mrb_define_method(mrb, krn, "instance_variables", mrb_obj_instance_variables, MRB_ARGS_NONE()); /* 15.3.1.3.23 */
1115  mrb_define_method(mrb, krn, "is_a?", mrb_obj_is_kind_of_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.24 */
1116  mrb_define_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.3.25 */
1117  mrb_define_method(mrb, krn, "kind_of?", mrb_obj_is_kind_of_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.26 */
1118  mrb_define_method(mrb, krn, "methods", mrb_obj_methods_m, MRB_ARGS_OPT(1)); /* 15.3.1.3.31 */
1119  mrb_define_method(mrb, krn, "nil?", mrb_false, MRB_ARGS_NONE()); /* 15.3.1.3.32 */
1120  mrb_define_method(mrb, krn, "object_id", mrb_obj_id_m, MRB_ARGS_NONE()); /* 15.3.1.3.33 */
1121  mrb_define_method(mrb, krn, "private_methods", mrb_obj_private_methods, MRB_ARGS_OPT(1)); /* 15.3.1.3.36 */
1122  mrb_define_method(mrb, krn, "protected_methods", mrb_obj_protected_methods, MRB_ARGS_OPT(1)); /* 15.3.1.3.37 */
1123  mrb_define_method(mrb, krn, "public_methods", mrb_obj_public_methods, MRB_ARGS_OPT(1)); /* 15.3.1.3.38 */
1124  mrb_define_method(mrb, krn, "raise", mrb_f_raise, MRB_ARGS_ANY()); /* 15.3.1.3.40 */
1125  mrb_define_method(mrb, krn, "remove_instance_variable", mrb_obj_remove_instance_variable,MRB_ARGS_REQ(1)); /* 15.3.1.3.41 */
1126  mrb_define_method(mrb, krn, "respond_to?", obj_respond_to, MRB_ARGS_ANY()); /* 15.3.1.3.43 */
1127  mrb_define_method(mrb, krn, "send", mrb_f_send, MRB_ARGS_ANY()); /* 15.3.1.3.44 */
1128  mrb_define_method(mrb, krn, "singleton_methods", mrb_obj_singleton_methods_m, MRB_ARGS_OPT(1)); /* 15.3.1.3.45 */
1129  mrb_define_method(mrb, krn, "to_s", mrb_any_to_s, MRB_ARGS_NONE()); /* 15.3.1.3.46 */
1130 
1132  mrb_alias_method(mrb, mrb->module_class, mrb_intern2(mrb, "dup", 3), mrb_intern2(mrb, "clone", 5));
1133 }