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 /*! @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