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.h@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 | |
tk_takateku | 0:33feccbba3ff | 5 | <pre> |
tk_takateku | 0:33feccbba3ff | 6 | Copyright (C) 2015 Kyushu Institute of Technology. |
tk_takateku | 0:33feccbba3ff | 7 | Copyright (C) 2015 Shimane IT Open-Innovation Center. |
tk_takateku | 0:33feccbba3ff | 8 | |
tk_takateku | 0:33feccbba3ff | 9 | This file is distributed under BSD 3-Clause License. |
tk_takateku | 0:33feccbba3ff | 10 | |
tk_takateku | 0:33feccbba3ff | 11 | |
tk_takateku | 0:33feccbba3ff | 12 | </pre> |
tk_takateku | 0:33feccbba3ff | 13 | */ |
tk_takateku | 0:33feccbba3ff | 14 | |
tk_takateku | 0:33feccbba3ff | 15 | #ifndef MRBC_SRC_VALUE_H_ |
tk_takateku | 0:33feccbba3ff | 16 | #define MRBC_SRC_VALUE_H_ |
tk_takateku | 0:33feccbba3ff | 17 | |
tk_takateku | 0:33feccbba3ff | 18 | #include <stdint.h> |
tk_takateku | 0:33feccbba3ff | 19 | #include "vm_config.h" |
tk_takateku | 0:33feccbba3ff | 20 | |
tk_takateku | 0:33feccbba3ff | 21 | #ifdef __cplusplus |
tk_takateku | 0:33feccbba3ff | 22 | extern "C" { |
tk_takateku | 0:33feccbba3ff | 23 | #endif |
tk_takateku | 0:33feccbba3ff | 24 | |
tk_takateku | 0:33feccbba3ff | 25 | |
tk_takateku | 0:33feccbba3ff | 26 | // mrb types |
tk_takateku | 0:33feccbba3ff | 27 | //typedef float mrb_float; |
tk_takateku | 0:33feccbba3ff | 28 | typedef int32_t mrb_int; |
tk_takateku | 0:33feccbba3ff | 29 | typedef int32_t mrb_sym; |
tk_takateku | 0:33feccbba3ff | 30 | |
tk_takateku | 0:33feccbba3ff | 31 | /* aspec access ? */ |
tk_takateku | 0:33feccbba3ff | 32 | #define MRB_ASPEC_REQ(a) (((a) >> 18) & 0x1f) |
tk_takateku | 0:33feccbba3ff | 33 | #define MRB_ASPEC_OPT(a) (((a) >> 13) & 0x1f) |
tk_takateku | 0:33feccbba3ff | 34 | #define MRB_ASPEC_REST(a) (((a) >> 12) & 0x1) |
tk_takateku | 0:33feccbba3ff | 35 | #define MRB_ASPEC_POST(a) (((a) >> 7) & 0x1f) |
tk_takateku | 0:33feccbba3ff | 36 | |
tk_takateku | 0:33feccbba3ff | 37 | // #define GET_TYPE(v) ((v).tt) |
tk_takateku | 0:33feccbba3ff | 38 | #define IS_FIXNUM(v) (((v).tt)==MRB_TT_FIXNUM) |
tk_takateku | 0:33feccbba3ff | 39 | |
tk_takateku | 0:33feccbba3ff | 40 | #pragma pack(2) |
tk_takateku | 0:33feccbba3ff | 41 | |
tk_takateku | 0:33feccbba3ff | 42 | //================================================================ |
tk_takateku | 0:33feccbba3ff | 43 | /*!@brief |
tk_takateku | 0:33feccbba3ff | 44 | |
tk_takateku | 0:33feccbba3ff | 45 | */ |
tk_takateku | 0:33feccbba3ff | 46 | typedef enum { |
tk_takateku | 0:33feccbba3ff | 47 | /* internal use */ |
tk_takateku | 0:33feccbba3ff | 48 | MRB_TT_HANDLE = -1, |
tk_takateku | 0:33feccbba3ff | 49 | /* primitive */ |
tk_takateku | 0:33feccbba3ff | 50 | MRB_TT_EMPTY = 0, |
tk_takateku | 0:33feccbba3ff | 51 | MRB_TT_TRUE, |
tk_takateku | 0:33feccbba3ff | 52 | MRB_TT_FALSE, |
tk_takateku | 0:33feccbba3ff | 53 | MRB_TT_NIL, |
tk_takateku | 0:33feccbba3ff | 54 | MRB_TT_FIXNUM, |
tk_takateku | 0:33feccbba3ff | 55 | MRB_TT_FLOAT, |
tk_takateku | 0:33feccbba3ff | 56 | MRB_TT_SYMBOL, |
tk_takateku | 0:33feccbba3ff | 57 | /* non-primitive */ |
tk_takateku | 0:33feccbba3ff | 58 | MRB_TT_OBJECT = 20, |
tk_takateku | 0:33feccbba3ff | 59 | MRB_TT_CLASS, |
tk_takateku | 0:33feccbba3ff | 60 | MRB_TT_PROC, |
tk_takateku | 0:33feccbba3ff | 61 | MRB_TT_ARRAY, |
tk_takateku | 0:33feccbba3ff | 62 | MRB_TT_STRING, |
tk_takateku | 0:33feccbba3ff | 63 | MRB_TT_RANGE, |
tk_takateku | 0:33feccbba3ff | 64 | MRB_TT_HASH, |
tk_takateku | 0:33feccbba3ff | 65 | |
tk_takateku | 0:33feccbba3ff | 66 | } mrb_vtype; |
tk_takateku | 0:33feccbba3ff | 67 | |
tk_takateku | 0:33feccbba3ff | 68 | |
tk_takateku | 0:33feccbba3ff | 69 | //================================================================ |
tk_takateku | 0:33feccbba3ff | 70 | /*!@brief |
tk_takateku | 0:33feccbba3ff | 71 | |
tk_takateku | 0:33feccbba3ff | 72 | */ |
tk_takateku | 0:33feccbba3ff | 73 | typedef struct RClass { |
tk_takateku | 0:33feccbba3ff | 74 | struct RClass *next; // linked list |
tk_takateku | 0:33feccbba3ff | 75 | mrb_vtype tt:8; |
tk_takateku | 0:33feccbba3ff | 76 | mrb_sym name; // class name |
tk_takateku | 0:33feccbba3ff | 77 | struct RClass *super; // mrbc_class[super] |
tk_takateku | 0:33feccbba3ff | 78 | struct RProc *procs; // mrbc_proc[rprocs], linked list |
tk_takateku | 0:33feccbba3ff | 79 | } mrb_class; |
tk_takateku | 0:33feccbba3ff | 80 | |
tk_takateku | 0:33feccbba3ff | 81 | |
tk_takateku | 0:33feccbba3ff | 82 | //================================================================ |
tk_takateku | 0:33feccbba3ff | 83 | /*!@brief |
tk_takateku | 0:33feccbba3ff | 84 | |
tk_takateku | 0:33feccbba3ff | 85 | */ |
tk_takateku | 0:33feccbba3ff | 86 | typedef struct RObject { |
tk_takateku | 0:33feccbba3ff | 87 | struct RObject *next; |
tk_takateku | 0:33feccbba3ff | 88 | mrb_vtype tt; |
tk_takateku | 0:33feccbba3ff | 89 | union { |
tk_takateku | 0:33feccbba3ff | 90 | int32_t i; // MRB_TT_FIXNUM |
tk_takateku | 0:33feccbba3ff | 91 | struct RObject *obj; // MRB_TT_OBJECT : link to object |
tk_takateku | 0:33feccbba3ff | 92 | struct RClass *cls; // MRB_TT_CLASS : link to class |
tk_takateku | 0:33feccbba3ff | 93 | struct RProc *proc; // MRB_TT_PROC : link to proc |
tk_takateku | 0:33feccbba3ff | 94 | struct RObject *array; // MRB_TT_ARRAY : array of objects |
tk_takateku | 0:33feccbba3ff | 95 | struct RObject *range; // MRB_TT_RANGE : link to range |
tk_takateku | 0:33feccbba3ff | 96 | double d; // MRB_TT_FLOAT : float |
tk_takateku | 0:33feccbba3ff | 97 | char *str; // MRB_TT_STRING : C-string |
tk_takateku | 0:33feccbba3ff | 98 | } value; |
tk_takateku | 0:33feccbba3ff | 99 | } mrb_object; |
tk_takateku | 0:33feccbba3ff | 100 | typedef struct RObject mrb_value; |
tk_takateku | 0:33feccbba3ff | 101 | |
tk_takateku | 0:33feccbba3ff | 102 | |
tk_takateku | 0:33feccbba3ff | 103 | struct VM; |
tk_takateku | 0:33feccbba3ff | 104 | typedef void (*mrb_func_t)(struct VM *vm, mrb_value *v); |
tk_takateku | 0:33feccbba3ff | 105 | |
tk_takateku | 0:33feccbba3ff | 106 | |
tk_takateku | 0:33feccbba3ff | 107 | |
tk_takateku | 0:33feccbba3ff | 108 | //================================================================ |
tk_takateku | 0:33feccbba3ff | 109 | /*!@brief |
tk_takateku | 0:33feccbba3ff | 110 | |
tk_takateku | 0:33feccbba3ff | 111 | */ |
tk_takateku | 0:33feccbba3ff | 112 | typedef struct RProc { |
tk_takateku | 0:33feccbba3ff | 113 | struct RProc *next; |
tk_takateku | 0:33feccbba3ff | 114 | unsigned int c_func:1; // 0:IREP, 1:C Func |
tk_takateku | 0:33feccbba3ff | 115 | int16_t sym_id; |
tk_takateku | 0:33feccbba3ff | 116 | union { |
tk_takateku | 0:33feccbba3ff | 117 | struct IREP *irep; |
tk_takateku | 0:33feccbba3ff | 118 | mrb_func_t func; |
tk_takateku | 0:33feccbba3ff | 119 | } func; |
tk_takateku | 0:33feccbba3ff | 120 | } mrb_proc; |
tk_takateku | 0:33feccbba3ff | 121 | |
tk_takateku | 0:33feccbba3ff | 122 | |
tk_takateku | 0:33feccbba3ff | 123 | // alloc one object |
tk_takateku | 0:33feccbba3ff | 124 | mrb_object *mrbc_obj_alloc(struct VM *vm, mrb_vtype tt); |
tk_takateku | 0:33feccbba3ff | 125 | |
tk_takateku | 0:33feccbba3ff | 126 | // alloc one class |
tk_takateku | 0:33feccbba3ff | 127 | mrb_class *mrbc_class_alloc(struct VM *vm, const char *name, mrb_class *super); |
tk_takateku | 0:33feccbba3ff | 128 | |
tk_takateku | 0:33feccbba3ff | 129 | |
tk_takateku | 0:33feccbba3ff | 130 | // alloc one RProc |
tk_takateku | 0:33feccbba3ff | 131 | mrb_proc *mrbc_rproc_alloc(struct VM *vm, const char *name); |
tk_takateku | 0:33feccbba3ff | 132 | mrb_proc *mrbc_rproc_alloc_to_class(struct VM *vm, const char *name, mrb_class *cls); |
tk_takateku | 0:33feccbba3ff | 133 | |
tk_takateku | 0:33feccbba3ff | 134 | // EQ two objects |
tk_takateku | 0:33feccbba3ff | 135 | int mrbc_eq(mrb_value *v1, mrb_value *v2); |
tk_takateku | 0:33feccbba3ff | 136 | |
tk_takateku | 0:33feccbba3ff | 137 | |
tk_takateku | 0:33feccbba3ff | 138 | // for C call |
tk_takateku | 0:33feccbba3ff | 139 | #define SET_INT_RETURN(n) {v[0].tt=MRB_TT_FIXNUM;v[0].value.i=(n);} |
tk_takateku | 0:33feccbba3ff | 140 | #define SET_NIL_RETURN() v[0].tt=MRB_TT_NIL |
tk_takateku | 0:33feccbba3ff | 141 | #define SET_FALSE_RETURN() v[0].tt=MRB_TT_FALSE |
tk_takateku | 0:33feccbba3ff | 142 | #define SET_TRUE_RETURN() v[0].tt=MRB_TT_TRUE |
tk_takateku | 0:33feccbba3ff | 143 | #define SET_RETURN(n) v[0]=n |
tk_takateku | 0:33feccbba3ff | 144 | |
tk_takateku | 0:33feccbba3ff | 145 | #define GET_TT_ARG(n) v[(n)+1].tt |
tk_takateku | 0:33feccbba3ff | 146 | #define GET_INT_ARG(n) v[(n)+1].value.i |
tk_takateku | 0:33feccbba3ff | 147 | #define GET_ARY_ARG(n) v[(n)+1] |
tk_takateku | 0:33feccbba3ff | 148 | #define GET_ARG(n) v[(n)+1] |
tk_takateku | 0:33feccbba3ff | 149 | #define GET_FLOAT_ARG(n) v[(n)+1].value.d |
tk_takateku | 0:33feccbba3ff | 150 | #define GET_STRING_ARG(n) v[(n)+1].value.str |
tk_takateku | 0:33feccbba3ff | 151 | |
tk_takateku | 0:33feccbba3ff | 152 | #ifdef __cplusplus |
tk_takateku | 0:33feccbba3ff | 153 | } |
tk_takateku | 0:33feccbba3ff | 154 | #endif |
tk_takateku | 0:33feccbba3ff | 155 | #endif |
tk_takateku | 0:33feccbba3ff | 156 |