mbed I/F binding for mruby

Dependents:   mruby_mbed_web mirb_mbed

mbed-mruby

How to use

Class

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?

UserRevisionLine numberNew 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