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/global.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 | |
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 |