mruby  2.0.1
mruby is the lightweight implementation of the Ruby language
mruby.h
Go to the documentation of this file.
1 /*
2 ** mruby - An embeddable Ruby implementation
3 **
4 ** Copyright (c) mruby developers 2010-2019
5 **
6 ** Permission is hereby granted, free of charge, to any person obtaining
7 ** a copy of this software and associated documentation files (the
8 ** "Software"), to deal in the Software without restriction, including
9 ** without limitation the rights to use, copy, modify, merge, publish,
10 ** distribute, sublicense, and/or sell copies of the Software, and to
11 ** permit persons to whom the Software is furnished to do so, subject to
12 ** the following conditions:
13 **
14 ** The above copyright notice and this permission notice shall be
15 ** included in all copies or substantial portions of the Software.
16 **
17 ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21 ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22 ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23 ** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 **
25 ** [ MIT license: http://www.opensource.org/licenses/mit-license.php ]
26 */
27 
32 #ifndef MRUBY_H
33 #define MRUBY_H
34 
35 #ifdef __cplusplus
36 #define __STDC_LIMIT_MACROS
37 #define __STDC_CONSTANT_MACROS
38 #define __STDC_FORMAT_MACROS
39 #endif
40 
41 #include <stdarg.h>
42 #include <stdint.h>
43 #include <stddef.h>
44 #include <limits.h>
45 
46 #ifdef __cplusplus
47 #ifndef SIZE_MAX
48 #ifdef __SIZE_MAX__
49 #define SIZE_MAX __SIZE_MAX__
50 #else
51 #define SIZE_MAX std::numeric_limits<size_t>::max()
52 #endif
53 #endif
54 #endif
55 
56 #ifdef MRB_DEBUG
57 #include <assert.h>
58 #define mrb_assert(p) assert(p)
59 #define mrb_assert_int_fit(t1,n,t2,max) assert((n)>=0 && ((sizeof(n)<=sizeof(t2))||(n<=(t1)(max))))
60 #else
61 #define mrb_assert(p) ((void)0)
62 #define mrb_assert_int_fit(t1,n,t2,max) ((void)0)
63 #endif
64 
65 #if defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L
66 #define mrb_static_assert(exp, str) _Static_assert(exp, str)
67 #else
68 #define mrb_static_assert(exp, str) mrb_assert(exp)
69 #endif
70 
71 #include "mrbconf.h"
72 
73 #ifndef MRB_WITHOUT_FLOAT
74 #ifndef FLT_EPSILON
75 #define FLT_EPSILON (1.19209290e-07f)
76 #endif
77 #ifndef DBL_EPSILON
78 #define DBL_EPSILON ((double)2.22044604925031308085e-16L)
79 #endif
80 #ifndef LDBL_EPSILON
81 #define LDBL_EPSILON (1.08420217248550443401e-19L)
82 #endif
83 
84 #ifdef MRB_USE_FLOAT
85 #define MRB_FLOAT_EPSILON FLT_EPSILON
86 #else
87 #define MRB_FLOAT_EPSILON DBL_EPSILON
88 #endif
89 #endif
90 
91 #include <mruby/common.h>
92 #include <mruby/value.h>
93 #include <mruby/gc.h>
94 #include <mruby/version.h>
95 
100 
101 typedef uint8_t mrb_code;
102 
110 typedef uint32_t mrb_aspec;
111 
112 struct mrb_irep;
113 struct mrb_state;
114 
124 typedef void* (*mrb_allocf) (struct mrb_state *mrb, void*, size_t, void *ud);
125 
126 #ifndef MRB_FIXED_STATE_ATEXIT_STACK_SIZE
127 #define MRB_FIXED_STATE_ATEXIT_STACK_SIZE 5
128 #endif
129 
130 typedef struct {
131  mrb_sym mid;
132  struct RProc *proc;
133  mrb_value *stackent;
134  uint16_t ridx;
135  uint16_t epos;
136  struct REnv *env;
137  const mrb_code *pc; /* return address */
138  const mrb_code *err; /* error position */
139  int argc;
140  int acc;
141  struct RClass *target_class;
142 } mrb_callinfo;
143 
144 enum mrb_fiber_state {
145  MRB_FIBER_CREATED = 0,
146  MRB_FIBER_RUNNING,
147  MRB_FIBER_RESUMED,
148  MRB_FIBER_SUSPENDED,
149  MRB_FIBER_TRANSFERRED,
150  MRB_FIBER_TERMINATED,
151 };
152 
153 struct mrb_context {
154  struct mrb_context *prev;
155 
156  mrb_value *stack; /* stack of virtual machine */
157  mrb_value *stbase, *stend;
158 
159  mrb_callinfo *ci;
160  mrb_callinfo *cibase, *ciend;
161 
162  uint16_t *rescue; /* exception handler stack */
163  uint16_t rsize;
164  struct RProc **ensure; /* ensure handler stack */
165  uint16_t esize, eidx;
166 
167  enum mrb_fiber_state status;
168  mrb_bool vmexec;
169  struct RFiber *fib;
170 };
171 
172 #ifdef MRB_METHOD_CACHE_SIZE
173 # define MRB_METHOD_CACHE
174 #else
175 /* default method cache size: 128 */
176 /* cache size needs to be power of 2 */
177 # define MRB_METHOD_CACHE_SIZE (1<<7)
178 #endif
179 
189 typedef mrb_value (*mrb_func_t)(struct mrb_state *mrb, mrb_value self);
190 
191 #ifdef MRB_METHOD_TABLE_INLINE
192 typedef uintptr_t mrb_method_t;
193 #else
194 typedef struct {
195  mrb_bool func_p;
196  union {
197  struct RProc *proc;
198  mrb_func_t func;
199  };
200 } mrb_method_t;
201 #endif
202 
203 #ifdef MRB_METHOD_CACHE
204 struct mrb_cache_entry {
205  struct RClass *c, *c0;
206  mrb_sym mid;
207  mrb_method_t m;
208 };
209 #endif
210 
211 struct mrb_jmpbuf;
212 
213 typedef void (*mrb_atexit_func)(struct mrb_state*);
214 
215 typedef struct mrb_state {
216  struct mrb_jmpbuf *jmp;
217 
218  mrb_allocf allocf; /* memory allocation function */
219  void *allocf_ud; /* auxiliary data of allocf */
220 
221  struct mrb_context *c;
222  struct mrb_context *root_c;
223  struct iv_tbl *globals; /* global variable table */
224 
225  struct RObject *exc; /* exception */
226 
227  struct RObject *top_self;
228  struct RClass *object_class; /* Object class */
229  struct RClass *class_class;
230  struct RClass *module_class;
231  struct RClass *proc_class;
232  struct RClass *string_class;
233  struct RClass *array_class;
234  struct RClass *hash_class;
235  struct RClass *range_class;
236 
237 #ifndef MRB_WITHOUT_FLOAT
238  struct RClass *float_class;
239 #endif
240  struct RClass *fixnum_class;
241  struct RClass *true_class;
242  struct RClass *false_class;
243  struct RClass *nil_class;
244  struct RClass *symbol_class;
245  struct RClass *kernel_module;
246 
247  mrb_gc gc;
248 
249 #ifdef MRB_METHOD_CACHE
250  struct mrb_cache_entry cache[MRB_METHOD_CACHE_SIZE];
251 #endif
252 
253  mrb_sym symidx;
254  struct symbol_name *symtbl; /* symbol table */
255  mrb_sym symhash[256];
256  size_t symcapa;
257 #ifndef MRB_ENABLE_SYMBOLL_ALL
258  char symbuf[8]; /* buffer for small symbol names */
259 #endif
260 
261 #ifdef MRB_ENABLE_DEBUG_HOOK
262  void (*code_fetch_hook)(struct mrb_state* mrb, struct mrb_irep *irep, const mrb_code *pc, mrb_value *regs);
263  void (*debug_op_hook)(struct mrb_state* mrb, struct mrb_irep *irep, const mrb_code *pc, mrb_value *regs);
264 #endif
265 
266 #ifdef MRB_BYTECODE_DECODE_OPTION
267  mrb_code (*bytecode_decoder)(struct mrb_state* mrb, mrb_code code);
268 #endif
269 
270  struct RClass *eException_class;
271  struct RClass *eStandardError_class;
272  struct RObject *nomem_err; /* pre-allocated NoMemoryError */
273  struct RObject *stack_err; /* pre-allocated SysStackError */
274 #ifdef MRB_GC_FIXED_ARENA
275  struct RObject *arena_err; /* pre-allocated arena overfow error */
276 #endif
277 
278  void *ud; /* auxiliary data */
279 
280 #ifdef MRB_FIXED_STATE_ATEXIT_STACK
281  mrb_atexit_func atexit_stack[MRB_FIXED_STATE_ATEXIT_STACK_SIZE];
282 #else
283  mrb_atexit_func *atexit_stack;
284 #endif
285  uint16_t atexit_stack_len;
286  uint16_t ecall_nest; /* prevent infinite recursive ecall() */
287 } mrb_state;
288 
310 MRB_API struct RClass *mrb_define_class(mrb_state *mrb, const char *name, struct RClass *super);
311 
319 MRB_API struct RClass *mrb_define_module(mrb_state *mrb, const char *name);
320 MRB_API mrb_value mrb_singleton_class(mrb_state *mrb, mrb_value val);
321 
333 MRB_API void mrb_include_module(mrb_state *mrb, struct RClass *cla, struct RClass *included);
334 
346 MRB_API void mrb_prepend_module(mrb_state *mrb, struct RClass *cla, struct RClass *prepended);
347 
372 MRB_API void mrb_define_method(mrb_state *mrb, struct RClass *cla, const char *name, mrb_func_t func, mrb_aspec aspec);
373 
399 MRB_API void mrb_define_class_method(mrb_state *mrb, struct RClass *cla, const char *name, mrb_func_t fun, mrb_aspec aspec);
400 
406 MRB_API void mrb_define_singleton_method(mrb_state *mrb, struct RObject *cla, const char *name, mrb_func_t fun, mrb_aspec aspec);
407 
433 MRB_API void mrb_define_module_function(mrb_state *mrb, struct RClass *cla, const char *name, mrb_func_t fun, mrb_aspec aspec);
434 
461 MRB_API void mrb_define_const(mrb_state* mrb, struct RClass* cla, const char *name, mrb_value val);
462 
511 MRB_API void mrb_undef_method(mrb_state *mrb, struct RClass *cla, const char *name);
512 MRB_API void mrb_undef_method_id(mrb_state*, struct RClass*, mrb_sym);
513 
551 MRB_API void mrb_undef_class_method(mrb_state *mrb, struct RClass *cls, const char *name);
552 
581 MRB_API mrb_value mrb_obj_new(mrb_state *mrb, struct RClass *c, mrb_int argc, const mrb_value *argv);
582 
584 MRB_INLINE mrb_value mrb_class_new_instance(mrb_state *mrb, mrb_int argc, const mrb_value *argv, struct RClass *c)
585 {
586  return mrb_obj_new(mrb,c,argc,argv);
587 }
588 
608 MRB_API struct RClass * mrb_class_new(mrb_state *mrb, struct RClass *super);
609 
624 MRB_API struct RClass * mrb_module_new(mrb_state *mrb);
625 
652 MRB_API mrb_bool mrb_class_defined(mrb_state *mrb, const char *name);
653 
660 MRB_API struct RClass * mrb_class_get(mrb_state *mrb, const char *name);
661 
668 MRB_API struct RClass * mrb_exc_get(mrb_state *mrb, const char *name);
669 
699 MRB_API mrb_bool mrb_class_defined_under(mrb_state *mrb, struct RClass *outer, const char *name);
700 
708 MRB_API struct RClass * mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name);
709 
716 MRB_API struct RClass * mrb_module_get(mrb_state *mrb, const char *name);
717 
725 MRB_API struct RClass * mrb_module_get_under(mrb_state *mrb, struct RClass *outer, const char *name);
726 /* a function to raise NotImplementedError with current method name */
727 MRB_API void mrb_notimplement(mrb_state*);
728 /* a function to be replacement of unimplemented method */
729 MRB_API mrb_value mrb_notimplement_m(mrb_state*, mrb_value);
730 
741 
783 
794 MRB_API struct RClass * mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super);
795 
796 MRB_API struct RClass * mrb_define_module_under(mrb_state *mrb, struct RClass *outer, const char *name);
797 
804 #define MRB_ARGS_REQ(n) ((mrb_aspec)((n)&0x1f) << 18)
805 
812 #define MRB_ARGS_OPT(n) ((mrb_aspec)((n)&0x1f) << 13)
813 
822 #define MRB_ARGS_ARG(n1,n2) (MRB_ARGS_REQ(n1)|MRB_ARGS_OPT(n2))
823 
825 #define MRB_ARGS_REST() ((mrb_aspec)(1 << 12))
826 
828 #define MRB_ARGS_POST(n) ((mrb_aspec)((n)&0x1f) << 7)
829 
831 #define MRB_ARGS_KEY(n1,n2) ((mrb_aspec)((((n1)&0x1f) << 2) | ((n2)?(1<<1):0)))
832 
836 #define MRB_ARGS_BLOCK() ((mrb_aspec)1)
837 
841 #define MRB_ARGS_ANY() MRB_ARGS_REST()
842 
846 #define MRB_ARGS_NONE() ((mrb_aspec)0)
847 
876 typedef const char *mrb_args_format;
877 
887 MRB_API mrb_int mrb_get_args(mrb_state *mrb, mrb_args_format format, ...);
888 
890 mrb_get_mid(mrb_state *mrb) /* get method symbol */
891 {
892  return mrb->c->ci->mid;
893 }
894 
900 MRB_API mrb_int mrb_get_argc(mrb_state *mrb);
901 
902 MRB_API mrb_value* mrb_get_argv(mrb_state *mrb);
903 
904 /* `strlen` for character string literals (use with caution or `strlen` instead)
905  Adjacent string literals are concatenated in C/C++ in translation phase 6.
906  If `lit` is not one, the compiler will report a syntax error:
907  MSVC: "error C2143: syntax error : missing ')' before 'string'"
908  GCC: "error: expected ')' before string constant"
909 */
910 #define mrb_strlen_lit(lit) (sizeof(lit "") - 1)
911 
942 MRB_API mrb_value mrb_funcall(mrb_state *mrb, mrb_value val, const char *name, mrb_int argc, ...);
972 MRB_API mrb_value mrb_funcall_argv(mrb_state *mrb, mrb_value val, mrb_sym name_sym, mrb_int argc, const mrb_value* obj);
992 MRB_API mrb_sym mrb_intern_cstr(mrb_state *mrb, const char* str);
993 MRB_API mrb_sym mrb_intern(mrb_state*,const char*,size_t);
994 MRB_API mrb_sym mrb_intern_static(mrb_state*,const char*,size_t);
995 #define mrb_intern_lit(mrb, lit) mrb_intern_static(mrb, lit, mrb_strlen_lit(lit))
996 MRB_API mrb_sym mrb_intern_str(mrb_state*,mrb_value);
997 MRB_API mrb_value mrb_check_intern_cstr(mrb_state*,const char*);
998 MRB_API mrb_value mrb_check_intern(mrb_state*,const char*,size_t);
999 MRB_API mrb_value mrb_check_intern_str(mrb_state*,mrb_value);
1000 MRB_API const char *mrb_sym2name(mrb_state*,mrb_sym);
1001 MRB_API const char *mrb_sym2name_len(mrb_state*,mrb_sym,mrb_int*);
1002 MRB_API mrb_value mrb_sym2str(mrb_state*,mrb_sym);
1003 
1004 MRB_API void *mrb_malloc(mrb_state*, size_t); /* raise RuntimeError if no mem */
1005 MRB_API void *mrb_calloc(mrb_state*, size_t, size_t); /* ditto */
1006 MRB_API void *mrb_realloc(mrb_state*, void*, size_t); /* ditto */
1007 MRB_API void *mrb_realloc_simple(mrb_state*, void*, size_t); /* return NULL if no memory available */
1008 MRB_API void *mrb_malloc_simple(mrb_state*, size_t); /* return NULL if no memory available */
1009 MRB_API struct RBasic *mrb_obj_alloc(mrb_state*, enum mrb_vtype, struct RClass*);
1010 MRB_API void mrb_free(mrb_state*, void*);
1011 
1012 MRB_API mrb_value mrb_str_new(mrb_state *mrb, const char *p, size_t len);
1013 
1018 MRB_API mrb_value mrb_str_new_static(mrb_state *mrb, const char *p, size_t len);
1019 #define mrb_str_new_lit(mrb, lit) mrb_str_new_static(mrb, (lit), mrb_strlen_lit(lit))
1020 
1021 #ifdef _WIN32
1022 MRB_API char* mrb_utf8_from_locale(const char *p, int len);
1023 MRB_API char* mrb_locale_from_utf8(const char *p, int len);
1024 #define mrb_locale_free(p) free(p)
1025 #define mrb_utf8_free(p) free(p)
1026 #else
1027 #define mrb_utf8_from_locale(p, l) ((char*)(p))
1028 #define mrb_locale_from_utf8(p, l) ((char*)(p))
1029 #define mrb_locale_free(p)
1030 #define mrb_utf8_free(p)
1031 #endif
1032 
1039 MRB_API mrb_state* mrb_open(void);
1040 
1053 
1067 
1074 MRB_API void mrb_close(mrb_state *mrb);
1075 
1081 MRB_API void* mrb_default_allocf(mrb_state*, void*, size_t, void*);
1082 
1083 MRB_API mrb_value mrb_top_self(mrb_state *);
1084 MRB_API mrb_value mrb_run(mrb_state*, struct RProc*, mrb_value);
1085 MRB_API mrb_value mrb_top_run(mrb_state*, struct RProc*, mrb_value, unsigned int);
1086 MRB_API mrb_value mrb_vm_run(mrb_state*, struct RProc*, mrb_value, unsigned int);
1087 MRB_API mrb_value mrb_vm_exec(mrb_state*, struct RProc*, const mrb_code*);
1088 /* compatibility macros */
1089 #define mrb_toplevel_run_keep(m,p,k) mrb_top_run((m),(p),mrb_top_self(m),(k))
1090 #define mrb_toplevel_run(m,p) mrb_toplevel_run_keep((m),(p),0)
1091 #define mrb_context_run(m,p,s,k) mrb_vm_run((m),(p),(s),(k))
1092 
1093 MRB_API void mrb_p(mrb_state*, mrb_value);
1094 MRB_API mrb_int mrb_obj_id(mrb_value obj);
1095 MRB_API mrb_sym mrb_obj_to_sym(mrb_state *mrb, mrb_value name);
1096 
1098 MRB_API mrb_bool mrb_obj_equal(mrb_state*, mrb_value, mrb_value);
1099 MRB_API mrb_bool mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2);
1100 MRB_API mrb_value mrb_convert_to_integer(mrb_state *mrb, mrb_value val, mrb_int base);
1101 MRB_API mrb_value mrb_Integer(mrb_state *mrb, mrb_value val);
1102 #ifndef MRB_WITHOUT_FLOAT
1103 MRB_API mrb_value mrb_Float(mrb_state *mrb, mrb_value val);
1104 #endif
1105 MRB_API mrb_value mrb_inspect(mrb_state *mrb, mrb_value obj);
1106 MRB_API mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2);
1107 
1108 MRB_INLINE int
1109 mrb_gc_arena_save(mrb_state *mrb)
1110 {
1111  return mrb->gc.arena_idx;
1112 }
1113 
1114 MRB_INLINE void
1115 mrb_gc_arena_restore(mrb_state *mrb, int idx)
1116 {
1117  mrb->gc.arena_idx = idx;
1118 }
1119 
1120 MRB_API void mrb_garbage_collect(mrb_state*);
1121 MRB_API void mrb_full_gc(mrb_state*);
1122 MRB_API void mrb_incremental_gc(mrb_state *);
1123 MRB_API void mrb_gc_mark(mrb_state*,struct RBasic*);
1124 #define mrb_gc_mark_value(mrb,val) do {\
1125  if (!mrb_immediate_p(val)) mrb_gc_mark((mrb), mrb_basic_ptr(val)); \
1126 } while (0)
1127 MRB_API void mrb_field_write_barrier(mrb_state *, struct RBasic*, struct RBasic*);
1128 #define mrb_field_write_barrier_value(mrb, obj, val) do{\
1129  if (!mrb_immediate_p(val)) mrb_field_write_barrier((mrb), (obj), mrb_basic_ptr(val)); \
1130 } while (0)
1131 MRB_API void mrb_write_barrier(mrb_state *, struct RBasic*);
1132 
1133 MRB_API mrb_value mrb_check_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method);
1134 MRB_API mrb_value mrb_any_to_s(mrb_state *mrb, mrb_value obj);
1135 MRB_API const char * mrb_obj_classname(mrb_state *mrb, mrb_value obj);
1136 MRB_API struct RClass* mrb_obj_class(mrb_state *mrb, mrb_value obj);
1137 MRB_API mrb_value mrb_class_path(mrb_state *mrb, struct RClass *c);
1138 MRB_API mrb_value mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method);
1139 MRB_API mrb_bool mrb_obj_is_kind_of(mrb_state *mrb, mrb_value obj, struct RClass *c);
1140 MRB_API mrb_value mrb_obj_inspect(mrb_state *mrb, mrb_value self);
1141 MRB_API mrb_value mrb_obj_clone(mrb_state *mrb, mrb_value self);
1142 
1143 #ifndef ISPRINT
1144 #define ISASCII(c) ((unsigned)(c) <= 0x7f)
1145 #define ISPRINT(c) (((unsigned)(c) - 0x20) < 0x5f)
1146 #define ISSPACE(c) ((c) == ' ' || (unsigned)(c) - '\t' < 5)
1147 #define ISUPPER(c) (((unsigned)(c) - 'A') < 26)
1148 #define ISLOWER(c) (((unsigned)(c) - 'a') < 26)
1149 #define ISALPHA(c) ((((unsigned)(c) | 0x20) - 'a') < 26)
1150 #define ISDIGIT(c) (((unsigned)(c) - '0') < 10)
1151 #define ISXDIGIT(c) (ISDIGIT(c) || ((unsigned)(c) | 0x20) - 'a' < 6)
1152 #define ISALNUM(c) (ISALPHA(c) || ISDIGIT(c))
1153 #define ISBLANK(c) ((c) == ' ' || (c) == '\t')
1154 #define ISCNTRL(c) ((unsigned)(c) < 0x20 || (c) == 0x7f)
1155 #define TOUPPER(c) (ISLOWER(c) ? ((c) & 0x5f) : (c))
1156 #define TOLOWER(c) (ISUPPER(c) ? ((c) | 0x20) : (c))
1157 #endif
1158 
1159 MRB_API mrb_value mrb_exc_new(mrb_state *mrb, struct RClass *c, const char *ptr, size_t len);
1160 MRB_API mrb_noreturn void mrb_exc_raise(mrb_state *mrb, mrb_value exc);
1161 
1162 MRB_API mrb_noreturn void mrb_raise(mrb_state *mrb, struct RClass *c, const char *msg);
1163 MRB_API mrb_noreturn void mrb_raisef(mrb_state *mrb, struct RClass *c, const char *fmt, ...);
1164 MRB_API mrb_noreturn void mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...);
1165 MRB_API mrb_noreturn void mrb_frozen_error(mrb_state *mrb, void *frozen_obj);
1166 MRB_API void mrb_warn(mrb_state *mrb, const char *fmt, ...);
1167 MRB_API mrb_noreturn void mrb_bug(mrb_state *mrb, const char *fmt, ...);
1168 MRB_API void mrb_print_backtrace(mrb_state *mrb);
1169 MRB_API void mrb_print_error(mrb_state *mrb);
1170 /* function for `raisef` formatting */
1171 MRB_API mrb_value mrb_vformat(mrb_state *mrb, const char *format, va_list ap);
1172 
1173 /* macros to get typical exception objects
1174  note:
1175  + those E_* macros requires mrb_state* variable named mrb.
1176  + exception objects obtained from those macros are local to mrb
1177 */
1178 #define E_RUNTIME_ERROR (mrb_exc_get(mrb, "RuntimeError"))
1179 #define E_TYPE_ERROR (mrb_exc_get(mrb, "TypeError"))
1180 #define E_ARGUMENT_ERROR (mrb_exc_get(mrb, "ArgumentError"))
1181 #define E_INDEX_ERROR (mrb_exc_get(mrb, "IndexError"))
1182 #define E_RANGE_ERROR (mrb_exc_get(mrb, "RangeError"))
1183 #define E_NAME_ERROR (mrb_exc_get(mrb, "NameError"))
1184 #define E_NOMETHOD_ERROR (mrb_exc_get(mrb, "NoMethodError"))
1185 #define E_SCRIPT_ERROR (mrb_exc_get(mrb, "ScriptError"))
1186 #define E_SYNTAX_ERROR (mrb_exc_get(mrb, "SyntaxError"))
1187 #define E_LOCALJUMP_ERROR (mrb_exc_get(mrb, "LocalJumpError"))
1188 #define E_REGEXP_ERROR (mrb_exc_get(mrb, "RegexpError"))
1189 #define E_FROZEN_ERROR (mrb_exc_get(mrb, "FrozenError"))
1190 
1191 #define E_NOTIMP_ERROR (mrb_exc_get(mrb, "NotImplementedError"))
1192 #ifndef MRB_WITHOUT_FLOAT
1193 #define E_FLOATDOMAIN_ERROR (mrb_exc_get(mrb, "FloatDomainError"))
1194 #endif
1195 
1196 #define E_KEY_ERROR (mrb_exc_get(mrb, "KeyError"))
1197 
1198 MRB_API mrb_value mrb_yield(mrb_state *mrb, mrb_value b, mrb_value arg);
1199 MRB_API mrb_value mrb_yield_argv(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value *argv);
1200 MRB_API mrb_value mrb_yield_with_class(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value *argv, mrb_value self, struct RClass *c);
1201 
1202 /* continue execution to the proc */
1203 /* this function should always be called as the last function of a method */
1204 /* e.g. return mrb_yield_cont(mrb, proc, self, argc, argv); */
1205 mrb_value mrb_yield_cont(mrb_state *mrb, mrb_value b, mrb_value self, mrb_int argc, const mrb_value *argv);
1206 
1207 /* mrb_gc_protect() leaves the object in the arena */
1208 MRB_API void mrb_gc_protect(mrb_state *mrb, mrb_value obj);
1209 /* mrb_gc_register() keeps the object from GC. */
1210 MRB_API void mrb_gc_register(mrb_state *mrb, mrb_value obj);
1211 /* mrb_gc_unregister() removes the object from GC root. */
1212 MRB_API void mrb_gc_unregister(mrb_state *mrb, mrb_value obj);
1213 
1214 MRB_API mrb_value mrb_to_int(mrb_state *mrb, mrb_value val);
1215 #define mrb_int(mrb, val) mrb_fixnum(mrb_to_int(mrb, val))
1216 /* string type checking (contrary to the name, it doesn't convert) */
1217 MRB_API mrb_value mrb_to_str(mrb_state *mrb, mrb_value val);
1218 MRB_API void mrb_check_type(mrb_state *mrb, mrb_value x, enum mrb_vtype t);
1219 
1220 MRB_INLINE void mrb_check_frozen(mrb_state *mrb, void *o)
1221 {
1222  if (MRB_FROZEN_P((struct RBasic*)o)) mrb_frozen_error(mrb, o);
1223 }
1224 
1225 typedef enum call_type {
1226  CALL_PUBLIC,
1227  CALL_FCALL,
1228  CALL_VCALL,
1229  CALL_TYPE_MAX
1230 } call_type;
1231 
1232 MRB_API void mrb_define_alias(mrb_state *mrb, struct RClass *c, const char *a, const char *b);
1233 MRB_API const char *mrb_class_name(mrb_state *mrb, struct RClass* klass);
1234 MRB_API void mrb_define_global_const(mrb_state *mrb, const char *name, mrb_value val);
1235 
1236 MRB_API mrb_value mrb_attr_get(mrb_state *mrb, mrb_value obj, mrb_sym id);
1237 
1238 MRB_API mrb_bool mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid);
1239 MRB_API mrb_bool mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c);
1240 MRB_API mrb_bool mrb_func_basic_p(mrb_state *mrb, mrb_value obj, mrb_sym mid, mrb_func_t func);
1241 
1242 
1248 MRB_API mrb_value mrb_fiber_resume(mrb_state *mrb, mrb_value fib, mrb_int argc, const mrb_value *argv);
1249 
1255 MRB_API mrb_value mrb_fiber_yield(mrb_state *mrb, mrb_int argc, const mrb_value *argv);
1256 
1263 
1269 #define E_FIBER_ERROR (mrb_exc_get(mrb, "FiberError"))
1270 MRB_API void mrb_stack_extend(mrb_state*, mrb_int);
1271 
1272 /* memory pool implementation */
1273 typedef struct mrb_pool mrb_pool;
1274 MRB_API struct mrb_pool* mrb_pool_open(mrb_state*);
1275 MRB_API void mrb_pool_close(struct mrb_pool*);
1276 MRB_API void* mrb_pool_alloc(struct mrb_pool*, size_t);
1277 MRB_API void* mrb_pool_realloc(struct mrb_pool*, void*, size_t oldlen, size_t newlen);
1278 MRB_API mrb_bool mrb_pool_can_realloc(struct mrb_pool*, void*, size_t);
1279 /* temporary memory allocation, only effective while GC arena is kept */
1280 MRB_API void* mrb_alloca(mrb_state *mrb, size_t);
1281 
1282 MRB_API void mrb_state_atexit(mrb_state *mrb, mrb_atexit_func func);
1283 
1284 MRB_API void mrb_show_version(mrb_state *mrb);
1285 MRB_API void mrb_show_copyright(mrb_state *mrb);
1286 
1287 MRB_API mrb_value mrb_format(mrb_state *mrb, const char *format, ...);
1288 
1289 #if 0
1290 /* memcpy and memset does not work with gdb reverse-next on my box */
1291 /* use naive memcpy and memset instead */
1292 #undef memcpy
1293 #undef memset
1294 static void*
1295 mrbmemcpy(void *dst, const void *src, size_t n)
1296 {
1297  char *d = (char*)dst;
1298  const char *s = (const char*)src;
1299  while (n--)
1300  *d++ = *s++;
1301  return d;
1302 }
1303 #define memcpy(a,b,c) mrbmemcpy(a,b,c)
1304 
1305 static void*
1306 mrbmemset(void *s, int c, size_t n)
1307 {
1308  char *t = (char*)s;
1309  while (n--)
1310  *t++ = c;
1311  return s;
1312 }
1313 #define memset(a,b,c) mrbmemset(a,b,c)
1314 #endif
1315 
1317 
1318 #endif /* MRUBY_H */
void mrb_undef_method(mrb_state *mrb, struct RClass *cla, const char *name)
Undefines a method.
Definition: class.c:1841
void mrb_close(mrb_state *mrb)
Closes and frees a mrb_state.
Definition: state.c:158
void mrb_define_const(mrb_state *mrb, struct RClass *cla, const char *name, mrb_value val)
Defines a constant.
Definition: variable.c:864
struct RClass * mrb_define_class(mrb_state *mrb, const char *name, struct RClass *super)
Defines a new class.
Definition: class.c:272
Definition: variable.c:25
Definition: proc.h:36
void mrb_define_singleton_method(mrb_state *mrb, struct RObject *cla, const char *name, mrb_func_t fun, mrb_aspec aspec)
Defines a singleton method.
Definition: class.c:1228
mruby Symbol.
Definition: gc.h:57
uint8_t mrb_code
MRuby C API entry point.
Definition: mruby.h:101
mrb_state * mrb_open_core(mrb_allocf f, void *ud)
Create new mrb_state with just the MRuby core.
Definition: state.c:23
mrb_value mrb_obj_new(mrb_state *mrb, struct RClass *c, mrb_int argc, const mrb_value *argv)
Initialize a new object instance of c class.
Definition: class.c:1502
struct RClass * mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name)
Gets a child class.
Definition: class.c:364
mrb_value mrb_funcall_argv(mrb_state *mrb, mrb_value val, mrb_sym name_sym, mrb_int argc, const mrb_value *obj)
Call existing ruby functions.
Definition: vm.c:537
mrb_int mrb_get_argc(mrb_state *mrb)
Retrieve number of arguments from mrb_state.
Definition: class.c:518
Proc class.
Definition: proc.h:18
static mrb_value mrb_class_new_instance(mrb_state *mrb, mrb_int argc, const mrb_value *argv, struct RClass *c)
Definition: mruby.h:584
garbage collector for mruby
void mrb_define_class_method(mrb_state *mrb, struct RClass *cla, const char *name, mrb_func_t fun, mrb_aspec aspec)
Defines a class method.
Definition: class.c:1235
Definition: mruby.h:153
#define mrb_noreturn
Shared compiler macros.
Definition: common.h:44
mrb_int mrb_get_args(mrb_state *mrb, mrb_args_format format,...)
Retrieve arguments from mrb_state.
Definition: class.c:577
mruby Boolean.
mrb_value mrb_obj_dup(mrb_state *mrb, mrb_value obj)
Duplicate an object.
Definition: kernel.c:363
mrb_value mrb_fiber_yield(mrb_state *mrb, mrb_int argc, const mrb_value *argv)
Yield a Fiber.
Definition: object.h:19
Class class.
Definition: class.h:17
mrb_value mrb_funcall_with_block(mrb_state *, mrb_value, mrb_sym, mrb_int, const mrb_value *, mrb_value)
Call existing ruby functions with a block.
Definition: vm.c:428
struct RClass * mrb_module_new(mrb_state *mrb)
Creates a new module, Module.
Definition: class.c:1733
mrb_value mrb_str_new_cstr(mrb_state *, const char *)
Turns a C string into a Ruby string value.
Definition: string.c:214
Definition: symbol.c:16
void mrb_undef_class_method(mrb_state *mrb, struct RClass *cls, const char *name)
Undefine a class method.
Definition: class.c:1847
Definition: mruby.h:194
void mrb_define_alias(mrb_state *mrb, struct RClass *c, const char *a, const char *b)
Definition: class.c:1776
const char * mrb_args_format
Format specifiers for {mrb_get_args} function.
Definition: mruby.h:876
#define MRB_BEGIN_DECL
Start declarations in C mode.
Definition: common.h:26
Definition: object.h:29
mrb_value mrb_funcall(mrb_state *mrb, mrb_value val, const char *name, mrb_int argc,...)
Call existing ruby functions.
Definition: vm.c:384
mrb_bool mrb_class_defined_under(mrb_state *mrb, struct RClass *outer, const char *name)
Returns an mrb_bool.
Definition: class.c:354
Definition: irep.h:30
mrb_value(* mrb_func_t)(struct mrb_state *mrb, mrb_value self)
Function pointer type for a function callable by mruby.
Definition: mruby.h:189
void mrb_prepend_module(mrb_state *mrb, struct RClass *cla, struct RClass *prepended)
Prepends a module in another class or module.
Definition: class.c:1065
struct RClass * mrb_class_new(mrb_state *mrb, struct RClass *super)
Creates a new instance of Class, Class.
Definition: class.c:1713
#define MRB_API
Declare a public MRuby API function.
Definition: common.h:73
struct RClass * mrb_define_module(mrb_state *mrb, const char *name)
Defines a new module.
Definition: class.c:204
Definition: mruby.h:130
mruby version definition
void * mrb_default_allocf(mrb_state *, void *, size_t, void *)
The default allocation function.
Definition: state.c:49
Definition: throw.h:46
Definition: object.h:38
struct RClass * mrb_module_get(mrb_state *mrb, const char *name)
Gets a module.
Definition: class.c:402
Specifies the number of arguments a function takes.
struct RClass * mrb_class_get(mrb_state *mrb, const char *name)
Gets a class.
Definition: class.c:370
mrb_bool mrb_class_defined(mrb_state *mrb, const char *name)
Returns an mrb_bool.
Definition: class.c:344
struct RClass * mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super)
Defines a new class under a given module.
Definition: class.c:424
#define MRB_END_DECL
End declarations in C mode.
Definition: common.h:28
Definition: pool.c:47
mruby value definitions
mruby common platform definition"
mrb_state * mrb_open_allocf(mrb_allocf f, void *ud)
Create new mrb_state with custom allocators.
Definition: state.c:69
void *(* mrb_allocf)(struct mrb_state *mrb, void *, size_t, void *ud)
Function pointer type of custom allocator used in.
Definition: mruby.h:124
struct RClass * mrb_exc_get(mrb_state *mrb, const char *name)
Gets a exception class.
Definition: class.c:376
mrb_bool mrb_obj_respond_to(mrb_state *mrb, struct RClass *c, mrb_sym mid)
Returns true if obj responds to the given method.
Definition: class.c:1627
struct RClass * mrb_module_get_under(mrb_state *mrb, struct RClass *outer, const char *name)
Gets a module defined under another module.
Definition: class.c:396
mrb_value mrb_fiber_resume(mrb_state *mrb, mrb_value fib, mrb_int argc, const mrb_value *argv)
Resume a Fiber.
void mrb_include_module(mrb_state *mrb, struct RClass *cla, struct RClass *included)
Include a module in another class or module.
Definition: class.c:1056
mrb_value mrb_fiber_alive_p(mrb_state *mrb, mrb_value fib)
Check if a Fiber is alive.
mrb_state * mrb_open(void)
Creates new mrb_state.
Definition: state.c:61
void mrb_define_module_function(mrb_state *mrb, struct RClass *cla, const char *name, mrb_func_t fun, mrb_aspec aspec)
Defines a module function.
Definition: class.c:1241
Definition: boxing_nan.h:39
Definition: mruby.h:215
mrb_sym mrb_intern_cstr(mrb_state *mrb, const char *str)
Create a symbol.
Definition: symbol.c:219
void mrb_define_method(mrb_state *mrb, struct RClass *cla, const char *name, mrb_func_t func, mrb_aspec aspec)
Defines a global function in ruby.
Definition: class.c:476
#define MRB_INLINE
Declare a function as always inlined.
Definition: common.h:62