mruby/c VM Source Code master (2026/08/06)
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
115
117
118//@cond
119typedef struct RClass mrb_class;
120//@endcond
121
122//================================================================
129#if defined(MRBC_DEBUG)
130 uint8_t obj_mark_[2];
131 const char *name;
132#endif
133
135 unsigned int flag_builtin : 1;
136 unsigned int flag_nomethod : 1;
137 unsigned int flag_module : 1;
138 unsigned int flag_alias : 1;
140 struct RClass *super;
141
142 // --- Specific members ---
143 union {
145 struct RClass *aliased;
146 };
147
150};
151
152//================================================================
159#if defined(MRBC_DEBUG)
160 uint8_t obj_mark_[2];
161 const char *name;
162#endif
163
165 unsigned int flag_builtin : 1;
166 unsigned int flag_nomethod : 1;
167 unsigned int flag_module : 1;
168 unsigned int flag_alias : 1;
170 struct RClass *super;
171};
172
173
174//================================================================
180typedef struct RInstance {
182
183 struct RClass *cls;
185 uint8_t data[];
186
188
189//@cond
190typedef struct RInstance mrb_instance;
191//@endcond
192
193
194//================================================================
198typedef struct RMethod {
199 uint8_t type;
200 uint8_t c_func;
202 union {
203 struct IREP *irep;
205 };
206 union {
207 struct RMethod *next;
208 struct RClass *cls;
209 };
211
212
213//================================================================
218 const char *name;
220};
221
222
223/***** Global variables *****************************************************/
224extern struct RClass * const mrbc_class_tbl[];
225#include "_autogen_builtin_class.h"
226
227// for old version compatibility.
228#define mrbc_class_object ((struct RClass*)(&mrbc_class_Object))
229
230
231/***** Function prototypes **************************************************/
232//@cond
233mrbc_class *mrbc_traverse_class_tree(mrbc_class *cls, mrbc_class *nest_buf[], int *nest_idx);
234mrbc_class *mrbc_traverse_class_tree_skip(mrbc_class *nest_buf[], int *nest_idx);
235mrbc_class *mrbc_define_class(struct VM *vm, const char *name, mrbc_class *super);
236mrbc_class *mrbc_define_class_under(struct VM *vm, const mrbc_class *outer, const char *name, mrbc_class *super);
237mrbc_class *mrbc_define_module(struct VM *vm, const char *name);
238mrbc_class *mrbc_define_module_under(struct VM *vm, const mrbc_class *outer, const char *name);
239void mrbc_define_method(struct VM *vm, mrbc_class *cls, const char *name, mrbc_func_t cfunc);
240mrbc_value mrbc_instance_new(struct VM *vm, mrbc_class *cls, int size);
244void mrbc_instance_clear_vm_id(mrbc_value *v);
245int mrbc_obj_is_kind_of(const mrbc_value *obj, const mrbc_class *tcls);
247mrbc_class *mrbc_get_class_by_name(const char *name);
248mrbc_value mrbc_send(struct VM *vm, mrbc_value *v, int argc, mrbc_value *recv, const char *method_name, int n_params, ...);
249void c_ineffect(struct VM *vm, mrbc_value v[], int argc);
250int mrbc_run_mrblib(const void *bytecode);
251void mrbc_init_class(void);
252void mrbc_init_class_c(void);
253void mrbc_init_class_mrblib(void);
254//@endcond
255
256
257/***** Inline functions *****************************************************/
258
259//================================================================
266{
267 assert( mrbc_type(*obj) >= 0 );
268 assert( mrbc_type(*obj) <= MRBC_TT_MAXVAL );
269
270 mrbc_class *cls = mrbc_class_tbl[ mrbc_type(*obj) ];
271 if( !cls ) {
272 switch( mrbc_type(*obj) ) {
273 case MRBC_TT_CLASS: // fall through.
274 case MRBC_TT_MODULE: cls = obj->cls; break;
275 case MRBC_TT_OBJECT: cls = obj->instance->cls; break;
276 case MRBC_TT_EXCEPTION: cls = obj->exception->cls; break;
277 default:
278 assert(!"Invalid value type.");
279 }
280 }
281
282 return cls;
283}
284
285
286#if MRBC_INSTANCE_DESTRUCTOR
287//================================================================
296static inline void mrbc_define_destructor( mrbc_class *cls, void (*destructor)(mrbc_value *) )
297{
298 assert( cls->flag_builtin == 0 );
299 assert( cls->flag_module == 0 );
300
301 cls->destructor = destructor;
302}
303#endif
304
305
306//================================================================
314{
315 return mrbc_kv_get( &obj->instance->ivar, sym_id );
316}
317
318
319//================================================================
343static inline void mrbc_define_method_list(struct VM *vm, mrbc_class *cls, const struct MRBC_DEFINE_METHOD_LIST list[], int list_size)
344{
345 for( int i = 0; i < list_size; i++ ) {
346 mrbc_define_method(vm, cls, list[i].name, list[i].cfunc);
347 }
348}
349
350#ifdef __cplusplus
351}
352#endif
353#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:281
mrbc_class * mrbc_get_class_by_name(const char *name)
Definition class.c:491
mrbc_class * mrbc_find_method(mrbc_method *r_method, mrbc_class *cls, mrbc_sym sym_id)
Definition class.c:417
void mrbc_init_class(void)
Definition class.c:623
mrbc_class * mrbc_define_module_under(struct VM *vm, const mrbc_class *outer, const char *name)
Definition class.c:235
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:393
void mrbc_init_class_c(void)
Definition class.c:633
void mrbc_define_method(struct VM *vm, mrbc_class *cls, const char *name, mrbc_func_t cfunc)
Definition class.c:249
mrbc_value mrbc_instance_getiv(mrbc_value *target, mrbc_sym sym_id)
Definition class.c:350
mrbc_class * mrbc_traverse_class_tree(mrbc_class *cls, mrbc_class *nest_buf[], int *nest_idx)
Definition class.c:80
void mrbc_init_class_mrblib(void)
Definition class.c:657
void mrbc_instance_delete(mrbc_value *v)
Definition class.c:300
mrbc_class * mrbc_define_module(struct VM *vm, const char *name)
Definition class.c:221
int mrbc_run_mrblib(const void *bytecode)
Definition class.c:593
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:207
int mrbc_instance_setiv(mrbc_value *target, mrbc_sym sym_id, mrbc_value *v)
Definition class.c:322
mrbc_class *const mrbc_class_tbl[MRBC_TT_MAXVAL+1]
Definition class.c:42
mrbc_class * mrbc_define_class(struct VM *vm, const char *name, mrbc_class *super)
Definition class.c:191
mrbc_class * mrbc_traverse_class_tree_skip(mrbc_class *nest_buf[], int *nest_idx)
Definition class.c:111
static void mrbc_define_destructor(mrbc_class *cls, void(*destructor)(mrbc_value *))
Definition class.h:296
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:313
static mrbc_class * find_class_by_object(const mrbc_value *obj)
Definition class.h:265
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:343
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.
struct RKeyValueHandle mrbc_kv_handle
Key-Value handle.
IREP Internal REPresentation.
Definition vm.h:43
for mrbc_define_method_list function.
Definition class.h:217
const char * name
method name
Definition class.h:218
const mrbc_func_t cfunc
pointer to method function
Definition class.h:219
Built-in class object.
Definition class.h:128
unsigned int flag_builtin
is built-in class? (= 1)
Definition class.h:135
uint8_t num_builtin_method
num of built-in method.
Definition class.h:139
unsigned int flag_nomethod
is built-in no method class? (= 0)
Definition class.h:136
unsigned int flag_module
is module?
Definition class.h:137
mrbc_sym sym_id
class name's symbol ID
Definition class.h:134
struct RClass * aliased
aliased class or module.
Definition class.h:145
const mrbc_sym * method_symbols
built-in method sym-id table.
Definition class.h:148
unsigned int flag_alias
is module alias?
Definition class.h:138
struct RMethod * method_link
pointer to method link.
Definition class.h:144
struct RClass * super
pointer to super class.
Definition class.h:140
const mrbc_func_t * method_functions
built-in method function table.
Definition class.h:149
Built-in No method class object.
Definition class.h:158
unsigned int flag_alias
is module alias?
Definition class.h:168
struct RClass * super
pointer to super class.
Definition class.h:170
unsigned int flag_builtin
is built-in class? (= 1)
Definition class.h:165
unsigned int flag_nomethod
is built-in no method class? (= 1)
Definition class.h:166
mrbc_sym sym_id
class name's symbol ID
Definition class.h:164
uint8_t num_builtin_method
num of built-in method (=0)
Definition class.h:169
unsigned int flag_module
is module?
Definition class.h:167
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
mrbc_kv_handle ivar
class instance valiables.
Definition class.h:114
unsigned int flag_module
is module?
Definition class.h:100
struct RClass * cls
exception class.
Definition error.h:51
Instance object.
Definition class.h:180
struct RClass * cls
pointer to class of this object.
Definition class.h:183
MRBC_OBJECT_HEADER
Definition class.h:181
struct RKeyValueHandle ivar
instance variable.
Definition class.h:184
uint8_t data[]
extended data
Definition class.h:185
Key-Value handle.
Definition keyvalue.h:53
Method management structure.
Definition class.h:198
struct RClass * cls
return value for mrbc_find_method.
Definition class.h:208
mrbc_sym sym_id
function names symbol ID
Definition class.h:201
uint8_t type
M:OP_DEF or OP_ALIAS, m:mrblib or define_method().
Definition class.h:199
struct IREP * irep
to IREP for ruby proc.
Definition class.h:203
struct RMethod * next
link to next method.
Definition class.h:207
uint8_t c_func
0:IREP, 1:C Func, 2:C Func (built-in)
Definition class.h:200
mrbc_func_t func
to C function.
Definition class.h:204
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.