source: EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-object-ext/src/object.c@ 331

Last change on this file since 331 was 331, checked in by coas-nagasima, 6 years ago

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 2.3 KB
Line 
1#include <mruby.h>
2#include <mruby/array.h>
3#include <mruby/class.h>
4#include <mruby/proc.h>
5
6/*
7 * call-seq:
8 * nil.to_a -> []
9 *
10 * Always returns an empty array.
11 */
12
13static mrb_value
14nil_to_a(mrb_state *mrb, mrb_value obj)
15{
16 return mrb_ary_new(mrb);
17}
18
19/*
20 * call-seq:
21 * nil.to_f -> 0.0
22 *
23 * Always returns zero.
24 */
25
26static mrb_value
27nil_to_f(mrb_state *mrb, mrb_value obj)
28{
29 return mrb_float_value(mrb, 0.0);
30}
31
32/*
33 * call-seq:
34 * nil.to_i -> 0
35 *
36 * Always returns zero.
37 */
38
39static mrb_value
40nil_to_i(mrb_state *mrb, mrb_value obj)
41{
42 return mrb_fixnum_value(0);
43}
44
45/*
46 * call-seq:
47 * obj.instance_exec(arg...) {|var...| block } -> obj
48 *
49 * Executes the given block within the context of the receiver
50 * (_obj_). In order to set the context, the variable +self+ is set
51 * to _obj_ while the code is executing, giving the code access to
52 * _obj_'s instance variables. Arguments are passed as block parameters.
53 *
54 * class KlassWithSecret
55 * def initialize
56 * @secret = 99
57 * end
58 * end
59 * k = KlassWithSecret.new
60 * k.instance_exec(5) {|x| @secret+x } #=> 104
61 */
62
63static mrb_value
64mrb_obj_instance_exec(mrb_state *mrb, mrb_value self)
65{
66 const mrb_value *argv;
67 mrb_int argc;
68 mrb_value blk;
69 struct RClass *c;
70 mrb_value args;
71
72 mrb_get_args(mrb, "*&", &argv, &argc, &blk);
73
74 if (mrb_nil_p(blk)) {
75 mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
76 }
77
78 switch (mrb_type(self)) {
79 case MRB_TT_SYMBOL:
80 case MRB_TT_FIXNUM:
81 case MRB_TT_FLOAT:
82 c = NULL;
83 break;
84 default:
85 c = mrb_class_ptr(mrb_singleton_class(mrb, self));
86 break;
87 }
88 args = mrb_ary_new_from_values(mrb, argc, argv);
89 argv = RARRAY_PTR(args);
90 mrb->c->ci->target_class = c;
91 return mrb_yield_cont(mrb, blk, self, argc, argv);
92}
93
94void
95mrb_mruby_object_ext_gem_init(mrb_state* mrb)
96{
97 struct RClass * n = mrb->nil_class;
98
99 mrb_define_method(mrb, n, "to_a", nil_to_a, MRB_ARGS_NONE());
100 mrb_define_method(mrb, n, "to_f", nil_to_f, MRB_ARGS_NONE());
101 mrb_define_method(mrb, n, "to_i", nil_to_i, MRB_ARGS_NONE());
102
103 mrb_define_method(mrb, mrb->kernel_module, "instance_exec", mrb_obj_instance_exec, MRB_ARGS_ANY() | MRB_ARGS_BLOCK());
104}
105
106void
107mrb_mruby_object_ext_gem_final(mrb_state* mrb)
108{
109}
Note: See TracBrowser for help on using the repository browser.