Imported Upstream version 1.46.0
[platform/upstream/nghttp2.git] / third-party / mruby / mrbgems / mruby-class-ext / src / class.c
1 #include "mruby.h"
2 #include "mruby/class.h"
3 #include "mruby/string.h"
4
5 static mrb_value
6 mrb_mod_name(mrb_state *mrb, mrb_value self)
7 {
8   mrb_value name =  mrb_class_path(mrb, mrb_class_ptr(self));
9   if (mrb_string_p(name)) {
10     MRB_SET_FROZEN_FLAG(mrb_basic_ptr(name));
11   }
12   return name;
13 }
14
15 static mrb_value
16 mrb_mod_singleton_class_p(mrb_state *mrb, mrb_value self)
17 {
18   return mrb_bool_value(mrb_sclass_p(self));
19 }
20
21 /*
22  *  call-seq:
23  *     module_exec(arg...) {|var...| block } -> obj
24  *     class_exec(arg...) {|var...| block } -> obj
25  *
26  * Evaluates the given block in the context of the
27  * class/module. The method defined in the block will belong
28  * to the receiver. Any arguments passed to the method will be
29  * passed to the block. This can be used if the block needs to
30  * access instance variables.
31  *
32  *     class Thing
33  *     end
34  *     Thing.class_exec{
35  *       def hello() "Hello there!" end
36  *     }
37  *     puts Thing.new.hello()
38  */
39
40 static mrb_value
41 mrb_mod_module_exec(mrb_state *mrb, mrb_value self)
42 {
43   const mrb_value *argv;
44   mrb_int argc;
45   mrb_value blk;
46   struct RClass *c;
47
48   mrb_get_args(mrb, "*&!", &argv, &argc, &blk);
49
50   c = mrb_class_ptr(self);
51   if (mrb->c->ci->acc < 0) {
52     return mrb_yield_with_class(mrb, blk, argc, argv, self, c);
53   }
54   mrb->c->ci->target_class = c;
55   return mrb_yield_cont(mrb, blk, self, argc, argv);
56 }
57
58 void
59 mrb_mruby_class_ext_gem_init(mrb_state *mrb)
60 {
61   struct RClass *mod = mrb->module_class;
62
63   mrb_define_method(mrb, mod, "name", mrb_mod_name, MRB_ARGS_NONE());
64   mrb_define_method(mrb, mod, "singleton_class?", mrb_mod_singleton_class_p, MRB_ARGS_NONE());
65   mrb_define_method(mrb, mod, "module_exec", mrb_mod_module_exec, MRB_ARGS_ANY()|MRB_ARGS_BLOCK());
66   mrb_define_method(mrb, mod, "class_exec", mrb_mod_module_exec, MRB_ARGS_ANY()|MRB_ARGS_BLOCK());
67 }
68
69 void
70 mrb_mruby_class_ext_gem_final(mrb_state *mrb)
71 {
72 }