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/value.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 | #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 |