mbed I/F binding for mruby
Dependents: mruby_mbed_web mirb_mbed
mbed-mruby
How to use
Class
mrbgems/mruby-object-ext/object.c@1:8ccd1d494a4b, 2015-04-13 (annotated)
- Committer:
- mzta
- Date:
- Mon Apr 13 05:20:15 2015 +0000
- Revision:
- 1:8ccd1d494a4b
- Parent:
- 0:158c61bb030f
- code refactoring.; - add SPI, SPISlave, I2C class to mruby-mbed (Incomplete).
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mzta | 0:158c61bb030f | 1 | #include "mruby.h" |
mzta | 0:158c61bb030f | 2 | #include "mruby/array.h" |
mzta | 0:158c61bb030f | 3 | #include "mruby/class.h" |
mzta | 0:158c61bb030f | 4 | |
mzta | 0:158c61bb030f | 5 | /* |
mzta | 0:158c61bb030f | 6 | * call-seq: |
mzta | 0:158c61bb030f | 7 | * nil.to_a -> [] |
mzta | 0:158c61bb030f | 8 | * |
mzta | 0:158c61bb030f | 9 | * Always returns an empty array. |
mzta | 0:158c61bb030f | 10 | */ |
mzta | 0:158c61bb030f | 11 | |
mzta | 0:158c61bb030f | 12 | static mrb_value |
mzta | 0:158c61bb030f | 13 | nil_to_a(mrb_state *mrb, mrb_value obj) |
mzta | 0:158c61bb030f | 14 | { |
mzta | 0:158c61bb030f | 15 | return mrb_ary_new(mrb); |
mzta | 0:158c61bb030f | 16 | } |
mzta | 0:158c61bb030f | 17 | |
mzta | 0:158c61bb030f | 18 | /* |
mzta | 0:158c61bb030f | 19 | * call-seq: |
mzta | 0:158c61bb030f | 20 | * nil.to_f -> 0.0 |
mzta | 0:158c61bb030f | 21 | * |
mzta | 0:158c61bb030f | 22 | * Always returns zero. |
mzta | 0:158c61bb030f | 23 | */ |
mzta | 0:158c61bb030f | 24 | |
mzta | 0:158c61bb030f | 25 | static mrb_value |
mzta | 0:158c61bb030f | 26 | nil_to_f(mrb_state *mrb, mrb_value obj) |
mzta | 0:158c61bb030f | 27 | { |
mzta | 0:158c61bb030f | 28 | return mrb_float_value(mrb, 0.0); |
mzta | 0:158c61bb030f | 29 | } |
mzta | 0:158c61bb030f | 30 | |
mzta | 0:158c61bb030f | 31 | /* |
mzta | 0:158c61bb030f | 32 | * call-seq: |
mzta | 0:158c61bb030f | 33 | * nil.to_i -> 0 |
mzta | 0:158c61bb030f | 34 | * |
mzta | 0:158c61bb030f | 35 | * Always returns zero. |
mzta | 0:158c61bb030f | 36 | */ |
mzta | 0:158c61bb030f | 37 | |
mzta | 0:158c61bb030f | 38 | static mrb_value |
mzta | 0:158c61bb030f | 39 | nil_to_i(mrb_state *mrb, mrb_value obj) |
mzta | 0:158c61bb030f | 40 | { |
mzta | 0:158c61bb030f | 41 | return mrb_fixnum_value(0); |
mzta | 0:158c61bb030f | 42 | } |
mzta | 0:158c61bb030f | 43 | |
mzta | 0:158c61bb030f | 44 | /* |
mzta | 0:158c61bb030f | 45 | * call-seq: |
mzta | 0:158c61bb030f | 46 | * obj.instance_exec(arg...) {|var...| block } -> obj |
mzta | 0:158c61bb030f | 47 | * |
mzta | 0:158c61bb030f | 48 | * Executes the given block within the context of the receiver |
mzta | 0:158c61bb030f | 49 | * (_obj_). In order to set the context, the variable +self+ is set |
mzta | 0:158c61bb030f | 50 | * to _obj_ while the code is executing, giving the code access to |
mzta | 0:158c61bb030f | 51 | * _obj_'s instance variables. Arguments are passed as block parameters. |
mzta | 0:158c61bb030f | 52 | * |
mzta | 0:158c61bb030f | 53 | * class KlassWithSecret |
mzta | 0:158c61bb030f | 54 | * def initialize |
mzta | 0:158c61bb030f | 55 | * @secret = 99 |
mzta | 0:158c61bb030f | 56 | * end |
mzta | 0:158c61bb030f | 57 | * end |
mzta | 0:158c61bb030f | 58 | * k = KlassWithSecret.new |
mzta | 0:158c61bb030f | 59 | * k.instance_exec(5) {|x| @secret+x } #=> 104 |
mzta | 0:158c61bb030f | 60 | */ |
mzta | 0:158c61bb030f | 61 | |
mzta | 0:158c61bb030f | 62 | static mrb_value |
mzta | 0:158c61bb030f | 63 | mrb_obj_instance_exec(mrb_state *mrb, mrb_value self) |
mzta | 0:158c61bb030f | 64 | { |
mzta | 0:158c61bb030f | 65 | mrb_value *argv; |
mzta | 0:158c61bb030f | 66 | mrb_int argc; |
mzta | 0:158c61bb030f | 67 | mrb_value blk; |
mzta | 0:158c61bb030f | 68 | struct RClass *c; |
mzta | 0:158c61bb030f | 69 | |
mzta | 0:158c61bb030f | 70 | mrb_get_args(mrb, "*&", &argv, &argc, &blk); |
mzta | 0:158c61bb030f | 71 | |
mzta | 0:158c61bb030f | 72 | if (mrb_nil_p(blk)) { |
mzta | 0:158c61bb030f | 73 | mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given"); |
mzta | 0:158c61bb030f | 74 | } |
mzta | 0:158c61bb030f | 75 | |
mzta | 0:158c61bb030f | 76 | switch (mrb_type(self)) { |
mzta | 0:158c61bb030f | 77 | case MRB_TT_SYMBOL: |
mzta | 0:158c61bb030f | 78 | case MRB_TT_FIXNUM: |
mzta | 0:158c61bb030f | 79 | case MRB_TT_FLOAT: |
mzta | 0:158c61bb030f | 80 | c = NULL; |
mzta | 0:158c61bb030f | 81 | break; |
mzta | 0:158c61bb030f | 82 | default: |
mzta | 0:158c61bb030f | 83 | c = mrb_class_ptr(mrb_singleton_class(mrb, self)); |
mzta | 0:158c61bb030f | 84 | break; |
mzta | 0:158c61bb030f | 85 | } |
mzta | 0:158c61bb030f | 86 | |
mzta | 0:158c61bb030f | 87 | return mrb_yield_with_class(mrb, blk, argc, argv, self, c); |
mzta | 0:158c61bb030f | 88 | } |
mzta | 0:158c61bb030f | 89 | |
mzta | 0:158c61bb030f | 90 | void |
mzta | 0:158c61bb030f | 91 | mrb_mruby_object_ext_gem_init(mrb_state* mrb) |
mzta | 0:158c61bb030f | 92 | { |
mzta | 0:158c61bb030f | 93 | struct RClass * n = mrb->nil_class; |
mzta | 0:158c61bb030f | 94 | |
mzta | 0:158c61bb030f | 95 | mrb_define_method(mrb, n, "to_a", nil_to_a, MRB_ARGS_NONE()); |
mzta | 0:158c61bb030f | 96 | mrb_define_method(mrb, n, "to_f", nil_to_f, MRB_ARGS_NONE()); |
mzta | 0:158c61bb030f | 97 | mrb_define_method(mrb, n, "to_i", nil_to_i, MRB_ARGS_NONE()); |
mzta | 0:158c61bb030f | 98 | |
mzta | 0:158c61bb030f | 99 | mrb_define_method(mrb, mrb->object_class, "instance_exec", mrb_obj_instance_exec, MRB_ARGS_ANY() | MRB_ARGS_BLOCK()); |
mzta | 0:158c61bb030f | 100 | } |
mzta | 0:158c61bb030f | 101 | |
mzta | 0:158c61bb030f | 102 | void |
mzta | 0:158c61bb030f | 103 | mrb_mruby_object_ext_gem_final(mrb_state* mrb) |
mzta | 0:158c61bb030f | 104 | { |
mzta | 0:158c61bb030f | 105 | } |
mzta | 0:158c61bb030f | 106 |