mruby/c VM Source Code release 3.4
Loading...
Searching...
No Matches
class.h
Go to the documentation of this file.
1
13
14#ifndef MRBC_SRC_CLASS_H_
15#define MRBC_SRC_CLASS_H_
16
17/***** Feature test switches ************************************************/
18/***** System headers *******************************************************/
19//@cond
20#include "vm_config.h"
21#include <stdint.h>
22//@endcond
23
24/***** Local headers ********************************************************/
25#include "value.h"
26#include "keyvalue.h"
27#include "error.h"
28
29#ifdef __cplusplus
30extern "C" {
31#endif
32
33/***** Constant values ******************************************************/
34#define MRBC_TRAVERSE_NEST_LEVEL 3
35
36
37/***** Macros ***************************************************************/
51#define MRBC_CLASS(cls) ((mrbc_class *)(&mrbc_class_##cls))
52
75#define MRBC_INSTANCE_DATA_PTR(v, t) ((t *)((v)->instance->data))
76
77
78/***** Typedefs *************************************************************/
79//================================================================
83typedef struct RClass {
85 unsigned int flag_builtin : 1;
86 unsigned int flag_module : 1;
87 unsigned int flag_alias : 1;
89 struct RClass *super;
90 union {
92 struct RClass *aliased;
93 };
94#if defined(MRBC_DEBUG)
95 const char *name;
96#endif
97
98 void (*destructor)( mrbc_value * );
100typedef struct RClass mrb_class;
101
102//================================================================
110 unsigned int flag_builtin : 1;
111 unsigned int flag_module : 1;
112 unsigned int flag_alias : 1;
114 struct RClass *super;
115 union {
117 struct RClass *aliased;
118 };
119#if defined(MRBC_DEBUG)
120 const char *name;
121#endif
122
125};
126
127//================================================================
135 unsigned int flag_builtin : 1;
136 unsigned int flag_module : 1;
137 unsigned int flag_alias : 1;
139 struct RClass *super;
140 union {
142 struct RClass *aliased;
143 };
144#if defined(MRBC_DEBUG)
145 const char *name;
146#endif
147};
148
149//================================================================
155typedef struct RInstance {
157
158 struct RClass *cls;
160 uint8_t data[];
161
163typedef struct RInstance mrb_instance;
164
165
166//================================================================
170typedef struct RMethod {
171 uint8_t type;
172 uint8_t c_func;
174 union {
175 struct IREP *irep;
177 };
178 union {
179 struct RMethod *next;
180 struct RClass *cls;
181 };
183
184
185//================================================================
190 const char *name;
192};
193
194
195/***** Global variables *****************************************************/
196extern struct RClass * const mrbc_class_tbl[];
197#include "_autogen_builtin_class.h"
198
199// for old version compatibility.
200#define mrbc_class_object ((struct RClass*)(&mrbc_class_Object))
201
202
203/***** Function prototypes **************************************************/
204//@cond
205mrbc_class *mrbc_traverse_class_tree(mrbc_class *cls, mrbc_class *nest_buf[], int *nest_idx);
206mrbc_class *mrbc_traverse_class_tree_skip(mrbc_class *nest_buf[], int *nest_idx);
207mrbc_class *mrbc_define_class(struct VM *vm, const char *name, mrbc_class *super);
208mrbc_class *mrbc_define_class_under(struct VM *vm, const mrbc_class *outer, const char *name, mrbc_class *super);
209mrbc_class *mrbc_define_module(struct VM *vm, const char *name);
210mrbc_class *mrbc_define_module_under(struct VM *vm, const mrbc_class *outer, const char *name);
211void mrbc_define_method(struct VM *vm, mrbc_class *cls, const char *name, mrbc_func_t cfunc);
212mrbc_value mrbc_instance_new(struct VM *vm, mrbc_class *cls, int size);
216void mrbc_instance_clear_vm_id(mrbc_value *v);
217int mrbc_obj_is_kind_of(const mrbc_value *obj, const mrbc_class *tcls);
219mrbc_class *mrbc_get_class_by_name(const char *name);
220mrbc_value mrbc_send(struct VM *vm, mrbc_value *v, int argc, mrbc_value *recv, const char *method_name, int n_params, ...);
221void c_ineffect(struct VM *vm, mrbc_value v[], int argc);
222int mrbc_run_mrblib(const void *bytecode);
223void mrbc_init_class(void);
224//@endcond
225
226
227/***** Inline functions *****************************************************/
228
229//================================================================
236{
237 assert( mrbc_type(*obj) >= 0 );
238 assert( mrbc_type(*obj) <= MRBC_TT_MAXVAL );
239
240 mrbc_class *cls = mrbc_class_tbl[ mrbc_type(*obj) ];
241 if( !cls ) {
242 switch( mrbc_type(*obj) ) {
243 case MRBC_TT_CLASS: // fall through.
244 case MRBC_TT_MODULE: cls = obj->cls; break;
245 case MRBC_TT_OBJECT: cls = obj->instance->cls; break;
246 case MRBC_TT_EXCEPTION: cls = obj->exception->cls; break;
247 default:
248 assert(!"Invalid value type.");
249 }
250 }
251
252 return cls;
253}
254
255
256//================================================================
265static inline void mrbc_define_destructor( mrbc_class *cls, void (*destructor)(mrbc_value *) )
266{
267 assert( cls->flag_builtin == 0 );
268 assert( cls->flag_module == 0 );
269
270 cls->destructor = destructor;
271}
272
273
274//================================================================
282{
283 return mrbc_kv_get( &obj->instance->ivar, sym_id );
284}
285
286
287//================================================================
311static inline void mrbc_define_method_list(struct VM *vm, mrbc_class *cls, const struct MRBC_DEFINE_METHOD_LIST list[], int list_size)
312{
313 for( int i = 0; i < list_size; i++ ) {
314 mrbc_define_method(vm, cls, list[i].name, list[i].cfunc);
315 }
316}
317
318#ifdef __cplusplus
319}
320#endif
321#endif
mrbc_value mrbc_instance_new(struct VM *vm, mrbc_class *cls, int size)
Definition class.c:331
mrbc_class * mrbc_get_class_by_name(const char *name)
Definition class.c:501
void mrbc_init_class(void)
Definition class.c:633
mrbc_class * mrbc_define_module_under(struct VM *vm, const mrbc_class *outer, const char *name)
Definition class.c:255
void c_ineffect(struct VM *vm, mrbc_value v[], int argc)
Definition class.c:591
int mrbc_obj_is_kind_of(const mrbc_value *obj, const mrbc_class *tcls)
Definition class.c:419
void mrbc_define_method(struct VM *vm, mrbc_class *cls, const char *name, mrbc_func_t cfunc)
Definition class.c:304
mrbc_value mrbc_instance_getiv(mrbc_value *obj, mrbc_sym sym_id)
Definition class.c:388
mrbc_class * mrbc_traverse_class_tree(mrbc_class *cls, mrbc_class *nest_buf[], int *nest_idx)
Definition class.c:67
void mrbc_instance_delete(mrbc_value *v)
Definition class.c:355
mrbc_class * mrbc_define_module(struct VM *vm, const char *name)
Definition class.c:210
int mrbc_run_mrblib(const void *bytecode)
Definition class.c:603
void mrbc_instance_setiv(mrbc_value *obj, mrbc_sym sym_id, mrbc_value *v)
Definition class.c:374
mrbc_method * mrbc_find_method(mrbc_method *r_method, mrbc_class *cls, mrbc_sym sym_id)
Definition class.c:442
mrbc_value mrbc_send(struct VM *vm, mrbc_value *v, int argc, mrbc_value *recv, const char *method_name, int n_params,...)
Definition class.c:538
mrbc_class * mrbc_define_class_under(struct VM *vm, const mrbc_class *outer, const char *name, mrbc_class *super)
Definition class.c:163
mrbc_class *const mrbc_class_tbl[MRBC_TT_MAXVAL+1]
Definition class.c:37
mrbc_class * mrbc_define_class(struct VM *vm, const char *name, mrbc_class *super)
Definition class.c:118
mrbc_class * mrbc_traverse_class_tree_skip(mrbc_class *nest_buf[], int *nest_idx)
Definition class.c:102
struct RClass mrb_class
Definition class.h:100
static void mrbc_define_destructor(mrbc_class *cls, void(*destructor)(mrbc_value *))
Definition class.h:265
struct RInstance mrbc_instance
Instance object.
struct RMethod mrbc_method
Method management structure.
static mrbc_value * mrbc_instance_getiv_p(mrbc_value *obj, mrbc_sym sym_id)
Definition class.h:281
static mrbc_class * find_class_by_object(const mrbc_value *obj)
Definition class.h:235
static void mrbc_define_method_list(struct VM *vm, mrbc_class *cls, const struct MRBC_DEFINE_METHOD_LIST list[], int list_size)
Definition class.h:311
struct RInstance mrb_instance
Definition class.h:163
struct RClass mrbc_class
Class object.
exception classes
mrbc_value * mrbc_kv_get(mrbc_kv_handle *kvh, mrbc_sym sym_id)
Definition keyvalue.c:292
mruby/c Key(Symbol) - Value store.
IREP Internal REPresentation.
Definition vm.h:42
for mrbc_define_method_list function.
Definition class.h:189
const char * name
method name
Definition class.h:190
const mrbc_func_t cfunc
pointer to method function
Definition class.h:191
Built-in class object.
Definition class.h:108
unsigned int flag_builtin
is built-in class? (= 1)
Definition class.h:110
uint8_t num_builtin_method
num of built-in method.
Definition class.h:113
unsigned int flag_module
is module?
Definition class.h:111
mrbc_sym sym_id
class name's symbol ID
Definition class.h:109
struct RClass * aliased
aliased class or module.
Definition class.h:117
const mrbc_sym * method_symbols
built-in method sym-id table.
Definition class.h:123
unsigned int flag_alias
is alias class?
Definition class.h:112
struct RMethod * method_link
pointer to method link.
Definition class.h:116
struct RClass * super
pointer to super class.
Definition class.h:114
const mrbc_func_t * method_functions
built-in method function table.
Definition class.h:124
Built-in No method class object.
Definition class.h:133
unsigned int flag_alias
is alias class?
Definition class.h:137
struct RClass * super
pointer to super class.
Definition class.h:139
unsigned int flag_builtin
is built-in class? (= 1)
Definition class.h:135
mrbc_sym sym_id
class name's symbol ID
Definition class.h:134
struct RClass * aliased
aliased class or module.
Definition class.h:142
uint8_t num_builtin_method
num of built-in method.
Definition class.h:138
struct RMethod * method_link
pointer to method link.
Definition class.h:141
unsigned int flag_module
is module?
Definition class.h:136
Class object.
Definition class.h:83
struct RMethod * method_link
pointer to method link.
Definition class.h:91
unsigned int flag_alias
is module alias?
Definition class.h:87
struct RClass * super
pointer to super class.
Definition class.h:89
struct RClass * aliased
aliased class or module.
Definition class.h:92
unsigned int flag_builtin
is built-in class? (= 0)
Definition class.h:85
mrbc_sym sym_id
class name's symbol ID
Definition class.h:84
void(* destructor)(mrbc_value *)
specify a destructor if need.
Definition class.h:98
uint8_t num_builtin_method
num of built-in method.
Definition class.h:88
unsigned int flag_module
is module?
Definition class.h:86
struct RClass * cls
exception class.
Definition error.h:50
Instance object.
Definition class.h:155
struct RClass * cls
pointer to class of this object.
Definition class.h:158
MRBC_OBJECT_HEADER
Definition class.h:156
struct RKeyValueHandle ivar
instance variable.
Definition class.h:159
uint8_t data[]
extended data
Definition class.h:160
Key-Value handle.
Definition keyvalue.h:52
Method management structure.
Definition class.h:170
struct RClass * cls
return value for mrbc_find_method.
Definition class.h:180
mrbc_sym sym_id
function names symbol ID
Definition class.h:173
uint8_t type
M:OP_DEF or OP_ALIAS, m:mrblib or define_method()
Definition class.h:171
struct IREP * irep
to IREP for ruby proc.
Definition class.h:175
struct RMethod * next
link to next method.
Definition class.h:179
uint8_t c_func
0:IREP, 1:C Func, 2:C Func (built-in)
Definition class.h:172
mrbc_func_t func
to C function.
Definition class.h:176
struct RException * exception
Definition value.h:167
struct RInstance * instance
Definition value.h:161
struct RClass * cls
Definition value.h:160
Virtual Machine.
Definition vm.h:140
mruby/c value definitions
void(* mrbc_func_t)(struct VM *vm, struct RObject *v, int argc)
Definition value.h:60
#define MRBC_TT_MAXVAL
Definition value.h:101
#define mrbc_type(o)
Definition value.h:193
int16_t mrbc_sym
mruby/c symbol ID
Definition value.h:59
@ MRBC_TT_EXCEPTION
Exception.
Definition value.h:98
@ MRBC_TT_OBJECT
General instance.
Definition value.h:92
@ MRBC_TT_MODULE
Module.
Definition value.h:88
@ MRBC_TT_CLASS
Class.
Definition value.h:87
struct RObject mrbc_value
Definition value.h:174
Global configuration of mruby/c VM's.