This is a port of the mruby/c tutorial Chapter 03 to the mbed environment.

Dependencies:   mbed

For details, refer to the following.

http://www.s-itoc.jp/activity/research/mrubyc/mrubyc_tutorial/436

Note:There is a change in rtt0.h from the original source in the mruby/c. It was necessary for inclusion in C ++ source.

Committer:
tk_takateku
Date:
Wed Feb 15 01:03:35 2017 +0000
Revision:
0:33feccbba3ff
Commit before publishing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tk_takateku 0:33feccbba3ff 1 /*! @file
tk_takateku 0:33feccbba3ff 2 @brief
tk_takateku 0:33feccbba3ff 3
tk_takateku 0:33feccbba3ff 4 <pre>
tk_takateku 0:33feccbba3ff 5 Copyright (C) 2015-2016 Kyushu Institute of Technology.
tk_takateku 0:33feccbba3ff 6 Copyright (C) 2015-2016 Shimane IT Open-Innovation Center.
tk_takateku 0:33feccbba3ff 7
tk_takateku 0:33feccbba3ff 8 This file is distributed under BSD 3-Clause License.
tk_takateku 0:33feccbba3ff 9
tk_takateku 0:33feccbba3ff 10
tk_takateku 0:33feccbba3ff 11 </pre>
tk_takateku 0:33feccbba3ff 12 */
tk_takateku 0:33feccbba3ff 13
tk_takateku 0:33feccbba3ff 14 #include "value.h"
tk_takateku 0:33feccbba3ff 15 #include "class.h"
tk_takateku 0:33feccbba3ff 16 #include "static.h"
tk_takateku 0:33feccbba3ff 17 #include "console.h"
tk_takateku 0:33feccbba3ff 18
tk_takateku 0:33feccbba3ff 19 #include "c_array.h"
tk_takateku 0:33feccbba3ff 20 #include "c_hash.h"
tk_takateku 0:33feccbba3ff 21 #include "c_numeric.h"
tk_takateku 0:33feccbba3ff 22 #include "c_string.h"
tk_takateku 0:33feccbba3ff 23 #include "c_symbol.h"
tk_takateku 0:33feccbba3ff 24 #include "c_range.h"
tk_takateku 0:33feccbba3ff 25
tk_takateku 0:33feccbba3ff 26
tk_takateku 0:33feccbba3ff 27
tk_takateku 0:33feccbba3ff 28 //================================================================
tk_takateku 0:33feccbba3ff 29 /*!@brief
tk_takateku 0:33feccbba3ff 30 find class from a object
tk_takateku 0:33feccbba3ff 31
tk_takateku 0:33feccbba3ff 32 @param vm
tk_takateku 0:33feccbba3ff 33 @param obj
tk_takateku 0:33feccbba3ff 34 @return pointer to mrb_class
tk_takateku 0:33feccbba3ff 35 */
tk_takateku 0:33feccbba3ff 36 mrb_class *find_class_by_object(mrb_vm *vm, mrb_object *obj)
tk_takateku 0:33feccbba3ff 37 {
tk_takateku 0:33feccbba3ff 38 mrb_class *cls = mrbc_class_object;
tk_takateku 0:33feccbba3ff 39 switch( obj->tt ){
tk_takateku 0:33feccbba3ff 40 case MRB_TT_ARRAY:
tk_takateku 0:33feccbba3ff 41 cls = mrbc_class_array;
tk_takateku 0:33feccbba3ff 42 break;
tk_takateku 0:33feccbba3ff 43 case MRB_TT_HASH:
tk_takateku 0:33feccbba3ff 44 cls = mrbc_class_hash;
tk_takateku 0:33feccbba3ff 45 break;
tk_takateku 0:33feccbba3ff 46 case MRB_TT_FIXNUM:
tk_takateku 0:33feccbba3ff 47 cls = mrbc_class_fixnum;
tk_takateku 0:33feccbba3ff 48 break;
tk_takateku 0:33feccbba3ff 49 case MRB_TT_SYMBOL:
tk_takateku 0:33feccbba3ff 50 cls = mrbc_class_symbol;
tk_takateku 0:33feccbba3ff 51 break;
tk_takateku 0:33feccbba3ff 52 case MRB_TT_FALSE:
tk_takateku 0:33feccbba3ff 53 cls = mrbc_class_false;
tk_takateku 0:33feccbba3ff 54 break;
tk_takateku 0:33feccbba3ff 55 case MRB_TT_TRUE:
tk_takateku 0:33feccbba3ff 56 cls = mrbc_class_true;
tk_takateku 0:33feccbba3ff 57 break;
tk_takateku 0:33feccbba3ff 58 #if MRBC_USE_FLOAT
tk_takateku 0:33feccbba3ff 59 case MRB_TT_FLOAT:
tk_takateku 0:33feccbba3ff 60 cls = mrbc_class_float;
tk_takateku 0:33feccbba3ff 61 break;
tk_takateku 0:33feccbba3ff 62 #endif
tk_takateku 0:33feccbba3ff 63 #if MRBC_USE_STRING
tk_takateku 0:33feccbba3ff 64 case MRB_TT_STRING:
tk_takateku 0:33feccbba3ff 65 cls = mrbc_class_string;
tk_takateku 0:33feccbba3ff 66 break;
tk_takateku 0:33feccbba3ff 67 #endif
tk_takateku 0:33feccbba3ff 68 default:
tk_takateku 0:33feccbba3ff 69 break;
tk_takateku 0:33feccbba3ff 70 }
tk_takateku 0:33feccbba3ff 71 return cls;
tk_takateku 0:33feccbba3ff 72 }
tk_takateku 0:33feccbba3ff 73
tk_takateku 0:33feccbba3ff 74
tk_takateku 0:33feccbba3ff 75
tk_takateku 0:33feccbba3ff 76 //================================================================
tk_takateku 0:33feccbba3ff 77 /*!@brief
tk_takateku 0:33feccbba3ff 78 find method from
tk_takateku 0:33feccbba3ff 79
tk_takateku 0:33feccbba3ff 80 @param vm
tk_takateku 0:33feccbba3ff 81 @param recv
tk_takateku 0:33feccbba3ff 82 @param sym_id
tk_takateku 0:33feccbba3ff 83 @return
tk_takateku 0:33feccbba3ff 84 */
tk_takateku 0:33feccbba3ff 85 mrb_proc *find_method(mrb_vm *vm, mrb_value recv, mrb_sym sym_id)
tk_takateku 0:33feccbba3ff 86 {
tk_takateku 0:33feccbba3ff 87 mrb_class *cls = find_class_by_object(vm, &recv);
tk_takateku 0:33feccbba3ff 88
tk_takateku 0:33feccbba3ff 89 while( cls != 0 ) {
tk_takateku 0:33feccbba3ff 90 mrb_proc *proc = cls->procs;
tk_takateku 0:33feccbba3ff 91 while( proc != 0 ) {
tk_takateku 0:33feccbba3ff 92 if( proc->sym_id == sym_id ) {
tk_takateku 0:33feccbba3ff 93 return proc;
tk_takateku 0:33feccbba3ff 94 }
tk_takateku 0:33feccbba3ff 95 proc = proc->next;
tk_takateku 0:33feccbba3ff 96 }
tk_takateku 0:33feccbba3ff 97 cls = cls->super;
tk_takateku 0:33feccbba3ff 98 }
tk_takateku 0:33feccbba3ff 99 return 0;
tk_takateku 0:33feccbba3ff 100 }
tk_takateku 0:33feccbba3ff 101
tk_takateku 0:33feccbba3ff 102
tk_takateku 0:33feccbba3ff 103
tk_takateku 0:33feccbba3ff 104 void mrbc_define_method(mrb_vm *vm, mrb_class *cls, const char *name, mrb_func_t cfunc)
tk_takateku 0:33feccbba3ff 105 {
tk_takateku 0:33feccbba3ff 106 mrb_proc *rproc = mrbc_rproc_alloc(vm, name);
tk_takateku 0:33feccbba3ff 107 rproc->c_func = 1; // c-func
tk_takateku 0:33feccbba3ff 108 rproc->next = cls->procs;
tk_takateku 0:33feccbba3ff 109 cls->procs = rproc;
tk_takateku 0:33feccbba3ff 110 rproc->func.func = cfunc;
tk_takateku 0:33feccbba3ff 111 }
tk_takateku 0:33feccbba3ff 112
tk_takateku 0:33feccbba3ff 113
tk_takateku 0:33feccbba3ff 114
tk_takateku 0:33feccbba3ff 115
tk_takateku 0:33feccbba3ff 116 void mrbc_define_method_proc(mrb_vm *vm, mrb_class *cls, mrb_sym sym_id, mrb_proc *rproc)
tk_takateku 0:33feccbba3ff 117 {
tk_takateku 0:33feccbba3ff 118 rproc->c_func = 0;
tk_takateku 0:33feccbba3ff 119 rproc->sym_id = sym_id;
tk_takateku 0:33feccbba3ff 120 rproc->next = cls->procs;
tk_takateku 0:33feccbba3ff 121 cls->procs = rproc;
tk_takateku 0:33feccbba3ff 122 }
tk_takateku 0:33feccbba3ff 123
tk_takateku 0:33feccbba3ff 124
tk_takateku 0:33feccbba3ff 125
tk_takateku 0:33feccbba3ff 126 // Object - puts
tk_takateku 0:33feccbba3ff 127 void c_puts(mrb_vm *vm, mrb_value *v)
tk_takateku 0:33feccbba3ff 128 {
tk_takateku 0:33feccbba3ff 129 mrb_value *arg0 = v+1;
tk_takateku 0:33feccbba3ff 130 switch( arg0->tt ){
tk_takateku 0:33feccbba3ff 131 case MRB_TT_FIXNUM:
tk_takateku 0:33feccbba3ff 132 console_printf("%d", arg0->value.i);
tk_takateku 0:33feccbba3ff 133 break;
tk_takateku 0:33feccbba3ff 134 case MRB_TT_NIL:
tk_takateku 0:33feccbba3ff 135 console_printf("");
tk_takateku 0:33feccbba3ff 136 break;
tk_takateku 0:33feccbba3ff 137 case MRB_TT_TRUE:
tk_takateku 0:33feccbba3ff 138 console_printf("true");
tk_takateku 0:33feccbba3ff 139 break;
tk_takateku 0:33feccbba3ff 140 case MRB_TT_FALSE:
tk_takateku 0:33feccbba3ff 141 console_printf("false");
tk_takateku 0:33feccbba3ff 142 break;
tk_takateku 0:33feccbba3ff 143 #if MRBC_USE_FLOAT
tk_takateku 0:33feccbba3ff 144 case MRB_TT_FLOAT:
tk_takateku 0:33feccbba3ff 145 console_printf("%f", arg0->value.d);
tk_takateku 0:33feccbba3ff 146 break;
tk_takateku 0:33feccbba3ff 147 #endif
tk_takateku 0:33feccbba3ff 148 #if MRBC_USE_STRING
tk_takateku 0:33feccbba3ff 149 case MRB_TT_STRING:
tk_takateku 0:33feccbba3ff 150 console_printf("%s", arg0->value.str);
tk_takateku 0:33feccbba3ff 151 break;
tk_takateku 0:33feccbba3ff 152 #endif
tk_takateku 0:33feccbba3ff 153 case MRB_TT_RANGE:{
tk_takateku 0:33feccbba3ff 154 mrb_value *ptr = arg0->value.range;
tk_takateku 0:33feccbba3ff 155 if( ptr[0].tt == MRB_TT_TRUE ){
tk_takateku 0:33feccbba3ff 156 console_printf("%d...%d", ptr[1].value.i, ptr[2].value.i);
tk_takateku 0:33feccbba3ff 157 } else {
tk_takateku 0:33feccbba3ff 158 console_printf("%d..%d", ptr[1].value.i, ptr[2].value.i);
tk_takateku 0:33feccbba3ff 159 }
tk_takateku 0:33feccbba3ff 160 } break;
tk_takateku 0:33feccbba3ff 161 default:
tk_takateku 0:33feccbba3ff 162 console_printf("Not supported: MRB_TT_XX(%d)", arg0->tt);
tk_takateku 0:33feccbba3ff 163 break;
tk_takateku 0:33feccbba3ff 164 }
tk_takateku 0:33feccbba3ff 165 console_printf("\n");
tk_takateku 0:33feccbba3ff 166 }
tk_takateku 0:33feccbba3ff 167
tk_takateku 0:33feccbba3ff 168 // Object !=
tk_takateku 0:33feccbba3ff 169 void c_object_neq(mrb_vm *vm, mrb_value *v)
tk_takateku 0:33feccbba3ff 170 {
tk_takateku 0:33feccbba3ff 171 if( mrbc_eq(v, &GET_ARG(0)) ){
tk_takateku 0:33feccbba3ff 172 SET_FALSE_RETURN();
tk_takateku 0:33feccbba3ff 173 } else {
tk_takateku 0:33feccbba3ff 174 SET_TRUE_RETURN();
tk_takateku 0:33feccbba3ff 175 }
tk_takateku 0:33feccbba3ff 176 }
tk_takateku 0:33feccbba3ff 177
tk_takateku 0:33feccbba3ff 178 static void mrbc_init_class_object(mrb_vm *vm)
tk_takateku 0:33feccbba3ff 179 {
tk_takateku 0:33feccbba3ff 180 // Class
tk_takateku 0:33feccbba3ff 181 mrbc_class_object = mrbc_class_alloc(vm, "Object", 0);
tk_takateku 0:33feccbba3ff 182 // Methods
tk_takateku 0:33feccbba3ff 183 mrbc_define_method(vm, mrbc_class_object, "puts", c_puts);
tk_takateku 0:33feccbba3ff 184 mrbc_define_method(vm, mrbc_class_object, "!=", c_object_neq);
tk_takateku 0:33feccbba3ff 185 }
tk_takateku 0:33feccbba3ff 186
tk_takateku 0:33feccbba3ff 187
tk_takateku 0:33feccbba3ff 188 // =============== FalseClass
tk_takateku 0:33feccbba3ff 189
tk_takateku 0:33feccbba3ff 190 void c_false_ne(mrb_vm *vm, mrb_value *v)
tk_takateku 0:33feccbba3ff 191 {
tk_takateku 0:33feccbba3ff 192 mrb_object *arg0 = v+1;
tk_takateku 0:33feccbba3ff 193 if( arg0->tt == MRB_TT_FALSE ){
tk_takateku 0:33feccbba3ff 194 SET_FALSE_RETURN();
tk_takateku 0:33feccbba3ff 195 } else {
tk_takateku 0:33feccbba3ff 196 SET_TRUE_RETURN();
tk_takateku 0:33feccbba3ff 197 }
tk_takateku 0:33feccbba3ff 198 }
tk_takateku 0:33feccbba3ff 199
tk_takateku 0:33feccbba3ff 200 void c_false_not(mrb_vm *vm, mrb_value *v)
tk_takateku 0:33feccbba3ff 201 {
tk_takateku 0:33feccbba3ff 202 SET_TRUE_RETURN();
tk_takateku 0:33feccbba3ff 203 }
tk_takateku 0:33feccbba3ff 204
tk_takateku 0:33feccbba3ff 205 static void mrbc_init_class_false(mrb_vm *vm)
tk_takateku 0:33feccbba3ff 206 {
tk_takateku 0:33feccbba3ff 207 // Class
tk_takateku 0:33feccbba3ff 208 mrbc_class_false = mrbc_class_alloc(vm, "FalseClass", mrbc_class_object);
tk_takateku 0:33feccbba3ff 209 // Methods
tk_takateku 0:33feccbba3ff 210 mrbc_define_method(vm, mrbc_class_false, "!=", c_false_ne);
tk_takateku 0:33feccbba3ff 211 mrbc_define_method(vm, mrbc_class_false, "!", c_false_not);
tk_takateku 0:33feccbba3ff 212 }
tk_takateku 0:33feccbba3ff 213
tk_takateku 0:33feccbba3ff 214
tk_takateku 0:33feccbba3ff 215 // =============== TrueClass
tk_takateku 0:33feccbba3ff 216
tk_takateku 0:33feccbba3ff 217 void c_true_ne(mrb_vm *vm, mrb_value *v)
tk_takateku 0:33feccbba3ff 218 {
tk_takateku 0:33feccbba3ff 219 mrb_object *arg0 = v+1;
tk_takateku 0:33feccbba3ff 220 if( arg0->tt == MRB_TT_TRUE ){
tk_takateku 0:33feccbba3ff 221 SET_FALSE_RETURN();
tk_takateku 0:33feccbba3ff 222 } else {
tk_takateku 0:33feccbba3ff 223 SET_TRUE_RETURN();
tk_takateku 0:33feccbba3ff 224 }
tk_takateku 0:33feccbba3ff 225 }
tk_takateku 0:33feccbba3ff 226
tk_takateku 0:33feccbba3ff 227 void c_true_not(mrb_vm *vm, mrb_value *v)
tk_takateku 0:33feccbba3ff 228 {
tk_takateku 0:33feccbba3ff 229 SET_FALSE_RETURN();
tk_takateku 0:33feccbba3ff 230 }
tk_takateku 0:33feccbba3ff 231
tk_takateku 0:33feccbba3ff 232
tk_takateku 0:33feccbba3ff 233
tk_takateku 0:33feccbba3ff 234 static void mrbc_init_class_true(mrb_vm *vm)
tk_takateku 0:33feccbba3ff 235 {
tk_takateku 0:33feccbba3ff 236 // Class
tk_takateku 0:33feccbba3ff 237 mrbc_class_true = mrbc_class_alloc(vm, "TrueClass", mrbc_class_object);
tk_takateku 0:33feccbba3ff 238 // Methods
tk_takateku 0:33feccbba3ff 239 mrbc_define_method(vm, mrbc_class_true, "!=", c_true_ne);
tk_takateku 0:33feccbba3ff 240 mrbc_define_method(vm, mrbc_class_true, "!", c_true_not);
tk_takateku 0:33feccbba3ff 241
tk_takateku 0:33feccbba3ff 242 }
tk_takateku 0:33feccbba3ff 243
tk_takateku 0:33feccbba3ff 244
tk_takateku 0:33feccbba3ff 245 void mrbc_init_class(void)
tk_takateku 0:33feccbba3ff 246 {
tk_takateku 0:33feccbba3ff 247 mrbc_init_class_object(0);
tk_takateku 0:33feccbba3ff 248 mrbc_init_class_false(0);
tk_takateku 0:33feccbba3ff 249 mrbc_init_class_true(0);
tk_takateku 0:33feccbba3ff 250
tk_takateku 0:33feccbba3ff 251 mrbc_init_class_fixnum(0);
tk_takateku 0:33feccbba3ff 252 mrbc_init_class_symbol(0);
tk_takateku 0:33feccbba3ff 253 #if MRBC_USE_FLOAT
tk_takateku 0:33feccbba3ff 254 mrbc_init_class_float(0);
tk_takateku 0:33feccbba3ff 255 #endif
tk_takateku 0:33feccbba3ff 256 #if MRBC_USE_STRING
tk_takateku 0:33feccbba3ff 257 mrbc_init_class_string(0);
tk_takateku 0:33feccbba3ff 258 #endif
tk_takateku 0:33feccbba3ff 259 mrbc_init_class_array(0);
tk_takateku 0:33feccbba3ff 260 mrbc_init_class_range(0);
tk_takateku 0:33feccbba3ff 261 mrbc_init_class_hash(0);
tk_takateku 0:33feccbba3ff 262 }
tk_takateku 0:33feccbba3ff 263