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 #include <stdint.h>
tk_takateku 0:33feccbba3ff 2 #include <string.h>
tk_takateku 0:33feccbba3ff 3 #include "value.h"
tk_takateku 0:33feccbba3ff 4 #include "static.h"
tk_takateku 0:33feccbba3ff 5 #include "symbol.h"
tk_takateku 0:33feccbba3ff 6 #include "alloc.h"
tk_takateku 0:33feccbba3ff 7 #include "vm.h"
tk_takateku 0:33feccbba3ff 8
tk_takateku 0:33feccbba3ff 9 mrb_object *mrbc_obj_alloc(mrb_vm *vm, mrb_vtype tt)
tk_takateku 0:33feccbba3ff 10 {
tk_takateku 0:33feccbba3ff 11 mrb_object *ptr = (mrb_object *)mrbc_alloc(vm, sizeof(mrb_object));
tk_takateku 0:33feccbba3ff 12 if( ptr ){
tk_takateku 0:33feccbba3ff 13 ptr->tt = tt;
tk_takateku 0:33feccbba3ff 14 ptr->next = 0;
tk_takateku 0:33feccbba3ff 15 }
tk_takateku 0:33feccbba3ff 16 return ptr;
tk_takateku 0:33feccbba3ff 17 }
tk_takateku 0:33feccbba3ff 18
tk_takateku 0:33feccbba3ff 19 mrb_class *mrbc_class_alloc(mrb_vm *vm, const char *name, mrb_class *super)
tk_takateku 0:33feccbba3ff 20 {
tk_takateku 0:33feccbba3ff 21 mrb_class *ptr = (mrb_class *)mrbc_alloc(vm, sizeof(mrb_class));
tk_takateku 0:33feccbba3ff 22 if( ptr ){
tk_takateku 0:33feccbba3ff 23 ptr->tt = MRB_TT_CLASS;
tk_takateku 0:33feccbba3ff 24 ptr->super = super;
tk_takateku 0:33feccbba3ff 25 ptr->name = add_sym(name);
tk_takateku 0:33feccbba3ff 26 ptr->procs = 0;
tk_takateku 0:33feccbba3ff 27 ptr->next = 0;
tk_takateku 0:33feccbba3ff 28 }
tk_takateku 0:33feccbba3ff 29 return ptr;
tk_takateku 0:33feccbba3ff 30 }
tk_takateku 0:33feccbba3ff 31
tk_takateku 0:33feccbba3ff 32 mrb_proc *mrbc_rproc_alloc(mrb_vm *vm, const char *name)
tk_takateku 0:33feccbba3ff 33 {
tk_takateku 0:33feccbba3ff 34 mrb_proc *ptr = (mrb_proc *)mrbc_alloc(vm, sizeof(mrb_proc));
tk_takateku 0:33feccbba3ff 35 if( ptr ) {
tk_takateku 0:33feccbba3ff 36 ptr->sym_id = add_sym(name);
tk_takateku 0:33feccbba3ff 37 ptr->next = 0;
tk_takateku 0:33feccbba3ff 38 }
tk_takateku 0:33feccbba3ff 39 return ptr;
tk_takateku 0:33feccbba3ff 40 }
tk_takateku 0:33feccbba3ff 41
tk_takateku 0:33feccbba3ff 42 mrb_proc *mrbc_rproc_alloc_to_class(mrb_vm *vm, const char *name, mrb_class *cls)
tk_takateku 0:33feccbba3ff 43 {
tk_takateku 0:33feccbba3ff 44 mrb_proc *rproc = mrbc_rproc_alloc(vm, name);
tk_takateku 0:33feccbba3ff 45 if( rproc != 0 ){
tk_takateku 0:33feccbba3ff 46 rproc->next = cls->procs;
tk_takateku 0:33feccbba3ff 47 cls->procs = rproc;
tk_takateku 0:33feccbba3ff 48 }
tk_takateku 0:33feccbba3ff 49 return rproc;
tk_takateku 0:33feccbba3ff 50 }
tk_takateku 0:33feccbba3ff 51
tk_takateku 0:33feccbba3ff 52
tk_takateku 0:33feccbba3ff 53 // EQ? two objects
tk_takateku 0:33feccbba3ff 54 // EQ: return true
tk_takateku 0:33feccbba3ff 55 // NEQ: return false
tk_takateku 0:33feccbba3ff 56 int mrbc_eq(mrb_value *v1, mrb_value *v2)
tk_takateku 0:33feccbba3ff 57 {
tk_takateku 0:33feccbba3ff 58 // TT_XXX is different
tk_takateku 0:33feccbba3ff 59 if( v1->tt != v2->tt ) return 0;
tk_takateku 0:33feccbba3ff 60 // check value
tk_takateku 0:33feccbba3ff 61 switch( v1->tt ){
tk_takateku 0:33feccbba3ff 62 case MRB_TT_TRUE:
tk_takateku 0:33feccbba3ff 63 case MRB_TT_FALSE:
tk_takateku 0:33feccbba3ff 64 case MRB_TT_NIL:
tk_takateku 0:33feccbba3ff 65 return 1;
tk_takateku 0:33feccbba3ff 66 case MRB_TT_FIXNUM:
tk_takateku 0:33feccbba3ff 67 case MRB_TT_SYMBOL:
tk_takateku 0:33feccbba3ff 68 return v1->value.i == v2->value.i;
tk_takateku 0:33feccbba3ff 69 case MRB_TT_FLOAT:
tk_takateku 0:33feccbba3ff 70 return v1->value.d == v2->value.d;
tk_takateku 0:33feccbba3ff 71 case MRB_TT_STRING:
tk_takateku 0:33feccbba3ff 72 return !strcmp(v1->value.str, v2->value.str);
tk_takateku 0:33feccbba3ff 73 case MRB_TT_ARRAY: {
tk_takateku 0:33feccbba3ff 74 mrb_value *array1 = v1->value.obj;
tk_takateku 0:33feccbba3ff 75 mrb_value *array2 = v2->value.obj;
tk_takateku 0:33feccbba3ff 76 int i, len = array1[0].value.i;
tk_takateku 0:33feccbba3ff 77 if( len != array2[0].value.i ) return 0;
tk_takateku 0:33feccbba3ff 78 for( i=1 ; i<=len ; i++ ){
tk_takateku 0:33feccbba3ff 79 if( !mrbc_eq(array1+i, array2+i) ) break;
tk_takateku 0:33feccbba3ff 80 }
tk_takateku 0:33feccbba3ff 81 if( i > len ){
tk_takateku 0:33feccbba3ff 82 return 1;
tk_takateku 0:33feccbba3ff 83 } else {
tk_takateku 0:33feccbba3ff 84 return 0;
tk_takateku 0:33feccbba3ff 85 }
tk_takateku 0:33feccbba3ff 86 } break;
tk_takateku 0:33feccbba3ff 87 default:
tk_takateku 0:33feccbba3ff 88 return 0;
tk_takateku 0:33feccbba3ff 89 }
tk_takateku 0:33feccbba3ff 90 }
tk_takateku 0:33feccbba3ff 91