This is a port of the mruby/c tutorial Chapter 03 to the mbed environment.
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.
mrubyc/class.c@0:33feccbba3ff, 2017-02-15 (annotated)
- Committer:
- tk_takateku
- Date:
- Wed Feb 15 01:03:35 2017 +0000
- Revision:
- 0:33feccbba3ff
Commit before publishing
Who changed what in which revision?
User | Revision | Line number | New 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 |