mruby/c VM Source Code release 4.0.0
Loading...
Searching...
No Matches
class.h
Go to the documentation of this file.
1
14
15#ifndef MRBC_SRC_CLASS_H_
16#define MRBC_SRC_CLASS_H_
17
18/***** Feature test switches ************************************************/
19/***** System headers *******************************************************/
20//@cond
21#include "vm_config.h"
22#include <stdint.h>
23//@endcond
24
25/***** Local headers ********************************************************/
26#include "value.h"
27#include "keyvalue.h"
28#include "error.h"
29
30#ifdef __cplusplus
31extern "C" {
32#endif
33
34/***** Constant values ******************************************************/
35#define MRBC_TRAVERSE_NEST_LEVEL 3
36#if !defined(MRBC_INSTANCE_DESTRUCTOR)
37# define MRBC_INSTANCE_DESTRUCTOR 1
38#endif
39
40
41/***** Macros ***************************************************************/
55#define MRBC_CLASS(cls) ((mrbc_class *)(&mrbc_class_##cls))
56
79#define MRBC_INSTANCE_DATA_PTR(v, t) ((t *)((v)->instance->data))
80
81
82/***** Typedefs *************************************************************/
83//================================================================
87typedef struct RClass {
88 /* (note)
89 Must match the initial layout of RClass, RBuiltinClass,
90 and RBuiltinNoMethodClass for safe casting.
91 */
92#if defined(MRBC_DEBUG)
93 uint8_t obj_mark_[2];
94 const char *name;
95#endif
96
98 unsigned int flag_builtin : 1;
99 unsigned int flag_nomethod : 1;
100 unsigned int flag_module : 1;
101 unsigned int flag_alias : 1;
103 struct RClass *super;
104
105 // --- Specific members ---
106 union {
108 struct RClass *aliased;
109 };
110
111#if MRBC_INSTANCE_DESTRUCTOR
113#endif
114
116
117//@cond
118typedef struct RClass mrb_class;
119//@endcond
120
121//================================================================
128#if defined(MRBC_DEBUG)
129 uint8_t obj_mark_[2];
130 const char *name;
131#endif
132
134 unsigned int flag_builtin : 1;
135 unsigned int flag_nomethod : 1;
136 unsigned int flag_module : 1;
137 unsigned int flag_alias : 1;
139 struct RClass *super;
140
141 // --- Specific members ---
142 union {
144 struct RClass *aliased;
145 };
146
149};
150
151//================================================================
158#if defined(MRBC_DEBUG)
159 uint8_t obj_mark_[2];
160 const char *name;
161#endif
162
164 unsigned int flag_builtin : 1;
165 unsigned int flag_nomethod : 1;
166 unsigned int flag_module : 1;
167 unsigned int flag_alias : 1;
169 struct RClass *super;
170};
171
172
173//================================================================
179typedef struct RInstance {
181
182 struct RClass *cls;
184 uint8_t data[];
185
187
188//@cond
189typedef struct RInstance mrb_instance;
190//@endcond
191
192
193//================================================================
197typedef struct RMethod {
198 uint8_t type;
199 uint8_t c_func;
201 union {
202 struct IREP *irep;
204 };
205 union {
206 struct RMethod *next;
207 struct RClass *cls;
208 };
210
211
212//================================================================
217 const char *name;
219};
220
221
222/***** Global variables *****************************************************/
223extern struct RClass * const mrbc_class_tbl[];
224#include "_autogen_builtin_class.h"
225
226// for old version compatibility.
227#define mrbc_class_object ((struct RClass*)(&mrbc_class_Object))
228
229
230/***** Function prototypes **************************************************/
231//@cond
232mrbc_class *mrbc_traverse_class_tree(mrbc_class *cls, mrbc_class *nest_buf[], int *nest_idx);
233mrbc_class *mrbc_traverse_class_tree_skip(mrbc_class *nest_buf[], int *nest_idx);
234mrbc_class *mrbc_define_class(struct VM *vm, const char *name, mrbc_class *super);
235mrbc_class *mrbc_define_class_under(struct VM *vm, const mrbc_class *outer, const char *name, mrbc_class *super);
236mrbc_class *mrbc_define_module(struct VM *vm, const char *name);
237mrbc_class *mrbc_define_module_under(struct VM *vm, const mrbc_class *outer, const char *name);
238void mrbc_define_method(struct VM *vm, mrbc_class *cls, const char *name, mrbc_func_t cfunc);
239mrbc_value mrbc_instance_new(struct VM *vm, mrbc_class *cls, int size);
243void mrbc_instance_clear_vm_id(mrbc_value *v);
244int mrbc_obj_is_kind_of(const mrbc_value *obj, const mrbc_class *tcls);
246mrbc_class *mrbc_get_class_by_name(const char *name);
247mrbc_value mrbc_send(struct VM *vm, mrbc_value *v, int argc, mrbc_value *recv, const char *method_name, int n_params, ...);
248void c_ineffect(struct VM *vm, mrbc_value v[], int argc);
249int mrbc_run_mrblib(const void *bytecode);
250void mrbc_init_class(void);
251//@endcond
252
253
254/***** Inline functions *****************************************************/
255
256//================================================================
263{
264 assert( mrbc_type(*obj) >= 0 );
265 assert( mrbc_type(*obj) <= MRBC_TT_MAXVAL );
266
267 mrbc_class *cls = mrbc_class_tbl[ mrbc_type(*obj) ];
268 if( !cls ) {
269 switch( mrbc_type(*obj) ) {
270 case MRBC_TT_CLASS: // fall through.
271 case MRBC_TT_MODULE: cls = obj->cls; break;
272 case MRBC_TT_OBJECT: cls = obj->instance->cls; break;
273 case MRBC_TT_EXCEPTION: cls = obj->exception->cls; break;
274 default:
275 assert(!"Invalid value type.");
276 }
277 }
278
279 return cls;
280}
281
282
283#if MRBC_INSTANCE_DESTRUCTOR
284//================================================================
293static inline void mrbc_define_destructor( mrbc_class *cls, void (*destructor)(mrbc_value *) )
294{
295 assert( cls->flag_builtin == 0 );
296 assert( cls->flag_module == 0 );
297
298 cls->destructor = destructor;
299}
300#endif
301
302
303//================================================================
311{
312 return mrbc_kv_get( &obj->instance->ivar, sym_id );
313}
314
315
316//================================================================
340static inline void mrbc_define_method_list(struct VM *vm, mrbc_class *cls, const struct MRBC_DEFINE_METHOD_LIST list[], int list_size)
341{
342 for( int i = 0; i < list_size; i++ ) {
343 mrbc_define_method(vm, cls, list[i].name, list[i].cfunc);
344 }
345}
346
347#ifdef __cplusplus
348}
349#endif
350#endif
#define mrbc_type(o)
Definition boxing_no.h:57
struct RObject mrbc_value
Value object. Default version.
mrbc_value mrbc_instance_new(struct VM *vm, mrbc_class *cls, int size)
Definition class.c:306
mrbc_class * mrbc_get_class_by_name(const char *name)
Definition class.c:489
mrbc_class * mrbc_find_method(mrbc_method *r_method, mrbc_class *cls, mrbc_sym sym_id)
Definition class.c:415
void mrbc_init_class(void)
Definition class.c:622
mrbc_class * mrbc_define_module_under(struct VM *vm, const mrbc_class *outer, const char *name)
Definition class.c:259
void c_ineffect(struct VM *vm, mrbc_value v[], int argc)
Definition class.c:581
int mrbc_obj_is_kind_of(const mrbc_value *obj, const mrbc_class *tcls)
Definition class.c:391
void mrbc_define_method(struct VM *vm, mrbc_class *cls, const char *name, mrbc_func_t cfunc)
Definition class.c:274
mrbc_value mrbc_instance_getiv(mrbc_value *obj, mrbc_sym sym_id)
Definition class.c:360
mrbc_class * mrbc_traverse_class_tree(mrbc_class *cls, mrbc_class *nest_buf[], int *nest_idx)
Definition class.c:68
void mrbc_instance_delete(mrbc_value *v)
Definition class.c:325
mrbc_class * mrbc_define_module(struct VM *vm, const char *name)
Definition class.c:245
int mrbc_run_mrblib(const void *bytecode)
Definition class.c:593
void mrbc_instance_setiv(mrbc_value *obj, mrbc_sym sym_id, mrbc_value *v)
Definition class.c:346
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:526
mrbc_class * mrbc_define_class_under(struct VM *vm, const mrbc_class *outer, const char *name, mrbc_class *super)
Definition class.c:231
mrbc_class *const mrbc_class_tbl[MRBC_TT_MAXVAL+1]
Definition class.c:38
mrbc_class * mrbc_define_class(struct VM *vm, const char *name, mrbc_class *super)
Definition class.c:215
mrbc_class * mrbc_traverse_class_tree_skip(mrbc_class *nest_buf[], int *nest_idx)
Definition class.c:99
static void mrbc_define_destructor(mrbc_class *cls, void(*destructor)(mrbc_value *))
Definition class.h:293
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:310
static mrbc_class * find_class_by_object(const mrbc_value *obj)
Definition class.h:262
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:340
struct RClass mrbc_class
Class object.
exception classes
mrbc_value * mrbc_kv_get(mrbc_kv_handle *kvh, mrbc_sym sym_id)
Definition keyvalue.c:284
mruby/c Key(Symbol) - Value store.
IREP Internal REPresentation.
Definition vm.h:43
for mrbc_define_method_list function.
Definition class.h:216
const char * name
method name
Definition class.h:217
const mrbc_func_t cfunc
pointer to method function
Definition class.h:218
Built-in class object.
Definition class.h:127
unsigned int flag_builtin
is built-in class? (= 1)
Definition class.h:134
uint8_t num_builtin_method
num of built-in method.
Definition class.h:138
unsigned int flag_nomethod
is built-in no method class? (= 0)
Definition class.h:135
unsigned int flag_module
is module?
Definition class.h:136
mrbc_sym sym_id
class name's symbol ID
Definition class.h:133
struct RClass * aliased
aliased class or module.
Definition class.h:144
const mrbc_sym * method_symbols
built-in method sym-id table.
Definition class.h:147
unsigned int flag_alias
is module alias?
Definition class.h:137
struct RMethod * method_link
pointer to method link.
Definition class.h:143
struct RClass * super
pointer to super class.
Definition class.h:139
const mrbc_func_t * method_functions
built-in method function table.
Definition class.h:148
Built-in No method class object.
Definition class.h:157
unsigned int flag_alias
is module alias?
Definition class.h:167
struct RClass * super
pointer to super class.
Definition class.h:169
unsigned int flag_builtin
is built-in class? (= 1)
Definition class.h:164
unsigned int flag_nomethod
is built-in no method class? (= 1)
Definition class.h:165
mrbc_sym sym_id
class name's symbol ID
Definition class.h:163
uint8_t num_builtin_method
num of built-in method.
Definition class.h:168
unsigned int flag_module
is module?
Definition class.h:166
Class object.
Definition class.h:87
struct RMethod * method_link
pointer to method link.
Definition class.h:107
unsigned int flag_alias
is module alias?
Definition class.h:101
struct RClass * super
pointer to super class.
Definition class.h:103
struct RClass * aliased
aliased class or module.
Definition class.h:108
unsigned int flag_builtin
is built-in class? (= 0)
Definition class.h:98
mrbc_sym sym_id
class name's symbol ID
Definition class.h:97
void(* destructor)(mrbc_value *)
specify a destructor if need.
Definition class.h:112
uint8_t num_builtin_method
num of built-in method.
Definition class.h:102
unsigned int flag_nomethod
is built-in no method class? (= 0)
Definition class.h:99
unsigned int flag_module
is module?
Definition class.h:100
struct RClass * cls
exception class.
Definition error.h:51
Instance object.
Definition class.h:179
struct RClass * cls
pointer to class of this object.
Definition class.h:182
MRBC_OBJECT_HEADER
Definition class.h:180
struct RKeyValueHandle ivar
instance variable.
Definition class.h:183
uint8_t data[]
extended data
Definition class.h:184
Key-Value handle.
Definition keyvalue.h:53
Method management structure.
Definition class.h:197
struct RClass * cls
return value for mrbc_find_method.
Definition class.h:207
mrbc_sym sym_id
function names symbol ID
Definition class.h:200
uint8_t type
M:OP_DEF or OP_ALIAS, m:mrblib or define_method().
Definition class.h:198
struct IREP * irep
to IREP for ruby proc.
Definition class.h:202
struct RMethod * next
link to next method.
Definition class.h:206
uint8_t c_func
0:IREP, 1:C Func, 2:C Func (built-in)
Definition class.h:199
mrbc_func_t func
to C function.
Definition class.h:203
struct RException * exception
Definition boxing_no.h:35
struct RInstance * instance
Definition boxing_no.h:29
struct RClass * cls
Definition boxing_no.h:28
Virtual Machine.
Definition vm.h:150
mruby/c value definitions
void(* mrbc_func_t)(struct VM *vm, struct RObject *v, int argc)
Definition value.h:63
#define MRBC_TT_MAXVAL
Definition value.h:104
int16_t mrbc_sym
mruby/c symbol ID
Definition value.h:62
@ MRBC_TT_EXCEPTION
Exception.
Definition value.h:101
@ MRBC_TT_OBJECT
General instance.
Definition value.h:95
@ MRBC_TT_MODULE
Module.
Definition value.h:91
@ MRBC_TT_CLASS
Class.
Definition value.h:90
Global configuration of mruby/c VM's.