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
tk_takateku 0:33feccbba3ff 2 #include "value.h"
tk_takateku 0:33feccbba3ff 3 #include "static.h"
tk_takateku 0:33feccbba3ff 4 #include "vm_config.h"
tk_takateku 0:33feccbba3ff 5
tk_takateku 0:33feccbba3ff 6 /*
tk_takateku 0:33feccbba3ff 7
tk_takateku 0:33feccbba3ff 8 GLobal objects are stored in 'mrbc_global' array.
tk_takateku 0:33feccbba3ff 9 'mrbc_global' array is decending order by sym_id.
tk_takateku 0:33feccbba3ff 10 In case of searching a global object, binary search is used.
tk_takateku 0:33feccbba3ff 11 In case of adding a global object, insertion sort is used.
tk_takateku 0:33feccbba3ff 12
tk_takateku 0:33feccbba3ff 13 */
tk_takateku 0:33feccbba3ff 14
tk_takateku 0:33feccbba3ff 15 /* search */
tk_takateku 0:33feccbba3ff 16 static int search_global_object(mrb_sym sym_id)
tk_takateku 0:33feccbba3ff 17 {
tk_takateku 0:33feccbba3ff 18 int left = 0, right = MAX_GLOBAL_OBJECT_SIZE-1;
tk_takateku 0:33feccbba3ff 19 while( left <= right ){
tk_takateku 0:33feccbba3ff 20 int mid = (left+right)/2;
tk_takateku 0:33feccbba3ff 21 if( mrbc_global[mid].sym_id == sym_id ) return mid;
tk_takateku 0:33feccbba3ff 22 if( mrbc_global[mid].sym_id < sym_id ){
tk_takateku 0:33feccbba3ff 23 right = mid - 1;
tk_takateku 0:33feccbba3ff 24 } else {
tk_takateku 0:33feccbba3ff 25 left = mid + 1;
tk_takateku 0:33feccbba3ff 26 }
tk_takateku 0:33feccbba3ff 27 }
tk_takateku 0:33feccbba3ff 28 return -1;
tk_takateku 0:33feccbba3ff 29 }
tk_takateku 0:33feccbba3ff 30
tk_takateku 0:33feccbba3ff 31 static int search_const(mrb_sym sym_id) {
tk_takateku 0:33feccbba3ff 32 int left = 0, right = MAX_CONST_COUNT-1;
tk_takateku 0:33feccbba3ff 33 while (left <= right) {
tk_takateku 0:33feccbba3ff 34 int mid = (left + right) / 2;
tk_takateku 0:33feccbba3ff 35 if ( mrbc_const[mid].sym_id == sym_id ) return mid;
tk_takateku 0:33feccbba3ff 36 if ( mrbc_const[mid].sym_id < sym_id ) {
tk_takateku 0:33feccbba3ff 37 right = mid - 1;
tk_takateku 0:33feccbba3ff 38 } else {
tk_takateku 0:33feccbba3ff 39 left = mid + 1;
tk_takateku 0:33feccbba3ff 40 }
tk_takateku 0:33feccbba3ff 41 }
tk_takateku 0:33feccbba3ff 42 return -1;
tk_takateku 0:33feccbba3ff 43 }
tk_takateku 0:33feccbba3ff 44
tk_takateku 0:33feccbba3ff 45 /* add */
tk_takateku 0:33feccbba3ff 46 void global_object_add(mrb_sym sym_id, mrb_object *obj)
tk_takateku 0:33feccbba3ff 47 {
tk_takateku 0:33feccbba3ff 48 int index = search_global_object(sym_id);
tk_takateku 0:33feccbba3ff 49 if( index == -1 ){
tk_takateku 0:33feccbba3ff 50 index = MAX_GLOBAL_OBJECT_SIZE-1;
tk_takateku 0:33feccbba3ff 51 while( index > 0 && mrbc_global[index].sym_id < sym_id ){
tk_takateku 0:33feccbba3ff 52 mrbc_global[index] = mrbc_global[index-1];
tk_takateku 0:33feccbba3ff 53 index--;
tk_takateku 0:33feccbba3ff 54 }
tk_takateku 0:33feccbba3ff 55 }
tk_takateku 0:33feccbba3ff 56 mrbc_global[index].sym_id = sym_id;
tk_takateku 0:33feccbba3ff 57 mrbc_global[index].obj = *obj;
tk_takateku 0:33feccbba3ff 58 }
tk_takateku 0:33feccbba3ff 59
tk_takateku 0:33feccbba3ff 60 void const_add(mrb_sym sym_id, mrb_object *obj)
tk_takateku 0:33feccbba3ff 61 {
tk_takateku 0:33feccbba3ff 62 int index = search_const(sym_id);
tk_takateku 0:33feccbba3ff 63 if( index == -1 ){
tk_takateku 0:33feccbba3ff 64 index = MAX_CONST_COUNT-1;
tk_takateku 0:33feccbba3ff 65 while(index > 0 && mrbc_const[index].sym_id < sym_id ){
tk_takateku 0:33feccbba3ff 66 mrbc_const[index] = mrbc_const[index-1];
tk_takateku 0:33feccbba3ff 67 index--;
tk_takateku 0:33feccbba3ff 68 }
tk_takateku 0:33feccbba3ff 69 }
tk_takateku 0:33feccbba3ff 70 mrbc_const[index].sym_id = sym_id;
tk_takateku 0:33feccbba3ff 71 mrbc_const[index].obj = *obj;
tk_takateku 0:33feccbba3ff 72 }
tk_takateku 0:33feccbba3ff 73
tk_takateku 0:33feccbba3ff 74 /* get */
tk_takateku 0:33feccbba3ff 75 mrb_object global_object_get(mrb_sym sym_id)
tk_takateku 0:33feccbba3ff 76 {
tk_takateku 0:33feccbba3ff 77 int index = search_global_object(sym_id);
tk_takateku 0:33feccbba3ff 78 if( index >= 0 ){
tk_takateku 0:33feccbba3ff 79 return mrbc_global[index].obj;
tk_takateku 0:33feccbba3ff 80 } else {
tk_takateku 0:33feccbba3ff 81 /* nil */
tk_takateku 0:33feccbba3ff 82 mrb_object obj;
tk_takateku 0:33feccbba3ff 83 obj.tt = MRB_TT_FALSE;
tk_takateku 0:33feccbba3ff 84 return obj;
tk_takateku 0:33feccbba3ff 85 }
tk_takateku 0:33feccbba3ff 86 }
tk_takateku 0:33feccbba3ff 87
tk_takateku 0:33feccbba3ff 88 mrb_object const_get(mrb_sym sym_id) {
tk_takateku 0:33feccbba3ff 89 int index = search_const(sym_id);
tk_takateku 0:33feccbba3ff 90 if (index >= 0){
tk_takateku 0:33feccbba3ff 91 return mrbc_const[index].obj;
tk_takateku 0:33feccbba3ff 92 } else {
tk_takateku 0:33feccbba3ff 93 mrb_object obj;
tk_takateku 0:33feccbba3ff 94 obj.tt = MRB_TT_FALSE;
tk_takateku 0:33feccbba3ff 95 return obj;
tk_takateku 0:33feccbba3ff 96 }
tk_takateku 0:33feccbba3ff 97 }
tk_takateku 0:33feccbba3ff 98