Groonga 3.0.9 Source Code Document
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
mruby.h
Go to the documentation of this file.
1 /*
2 ** mruby - An embeddable Ruby implementation
3 **
4 ** Copyright (c) mruby developers 2010-2013
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 
28 #ifndef MRUBY_H
29 #define MRUBY_H
30 
31 #if defined(__cplusplus)
32 extern "C" {
33 #endif
34 
35 #include <stdint.h>
36 #include <stddef.h>
37 
38 #include "mrbconf.h"
39 #include "mruby/value.h"
40 
41 typedef uint32_t mrb_code;
42 typedef uint32_t mrb_aspec;
43 
44 struct mrb_state;
45 
46 typedef void* (*mrb_allocf) (struct mrb_state *mrb, void*, size_t, void *ud);
47 
48 #ifndef MRB_ARENA_SIZE
49 #define MRB_ARENA_SIZE 100
50 #endif
51 
52 typedef struct {
54  struct RProc *proc;
55  int stackidx;
56  int nregs;
57  int argc;
58  mrb_code *pc;
59  int acc;
61  int ridx;
62  int eidx;
63  struct REnv *env;
64 } mrb_callinfo;
65 
71 };
72 
73 struct mrb_context {
74  struct mrb_context *prev;
75 
76  mrb_value *stack; /* stack of virtual machine */
78 
81 
82  mrb_code **rescue; /* exception handler stack */
83  int rsize;
84  struct RProc **ensure; /* ensure handler stack */
85  int esize;
86 
87  uint8_t status;
88  struct RFiber *fib;
89 };
90 
91 enum gc_state {
95 };
96 
97 typedef struct mrb_state {
98  void *jmp;
99 
100  mrb_allocf allocf; /* memory allocation function */
101 
102  struct mrb_context *c;
104 
105  struct RObject *exc; /* exception */
106  struct iv_tbl *globals; /* global variable table */
107  struct mrb_irep **irep; /* program data array */
109 
110  struct RObject *top_self;
111  struct RClass *object_class; /* Object class */
118 
123  struct RClass *nil_class;
126 
127  struct heap_page *heaps; /* heaps for GC */
128  struct heap_page *sweeps;
130  size_t live; /* count of live objects */
131  struct RBasic *arena[MRB_ARENA_SIZE]; /* GC protection array */
133 
134  enum gc_state gc_state; /* state of gc */
135  int current_white_part; /* make white object by white_part */
136  struct RBasic *gray_list; /* list of gray objects to be traversed incrementally */
137  struct RBasic *atomic_gray_list; /* list of objects to be traversed atomically */
139  size_t gc_threshold;
148 
150  struct kh_n2s *name2sym; /* symbol table */
151 
152 #ifdef ENABLE_DEBUG
153  void (*code_fetch_hook)(struct mrb_state* mrb, struct mrb_irep *irep, mrb_code *pc, mrb_value *regs);
154 #endif
155 
158 
159  void *ud; /* auxiliary data */
160 } mrb_state;
161 
163 struct RClass *mrb_define_class(mrb_state *, const char*, struct RClass*);
164 struct RClass *mrb_define_module(mrb_state *, const char*);
166 void mrb_include_module(mrb_state*, struct RClass*, struct RClass*);
167 
168 void mrb_define_method(mrb_state*, struct RClass*, const char*, mrb_func_t, mrb_aspec);
169 void mrb_define_class_method(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec);
170 void mrb_define_singleton_method(mrb_state*, struct RObject*, const char*, mrb_func_t, mrb_aspec);
171 void mrb_define_module_function(mrb_state*, struct RClass*, const char*, mrb_func_t, mrb_aspec);
172 void mrb_define_const(mrb_state*, struct RClass*, const char *name, mrb_value);
173 void mrb_undef_method(mrb_state*, struct RClass*, const char*);
174 void mrb_undef_class_method(mrb_state*, struct RClass*, const char*);
175 mrb_value mrb_obj_new(mrb_state *mrb, struct RClass *c, int argc, mrb_value *argv);
176 #define mrb_class_new_instance(mrb,argc,argv,c) mrb_obj_new(mrb,c,argc,argv)
178 struct RClass * mrb_class_new(mrb_state *mrb, struct RClass *super);
179 struct RClass * mrb_module_new(mrb_state *mrb);
180 mrb_bool mrb_class_defined(mrb_state *mrb, const char *name);
181 struct RClass * mrb_class_get(mrb_state *mrb, const char *name);
182 struct RClass * mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name);
183 
185 mrb_value mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method);
186 mrb_bool mrb_obj_respond_to(struct RClass* c, mrb_sym mid);
187 struct RClass * mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super);
188 struct RClass * mrb_define_module_under(mrb_state *mrb, struct RClass *outer, const char *name);
189 
190 /* required arguments */
191 #define MRB_ARGS_REQ(n) ((mrb_aspec)((n)&0x1f) << 18)
192 /* optional arguments */
193 #define MRB_ARGS_OPT(n) ((mrb_aspec)((n)&0x1f) << 13)
194 /* mandatory and optinal arguments */
195 #define MRB_ARGS_ARG(n1,n2) (MRB_ARGS_REQ(n1)|MRB_ARGS_OPT(n2))
196 
197 /* rest argument */
198 #define MRB_ARGS_REST() ((mrb_aspec)(1 << 12))
199 /* required arguments after rest */
200 #define MRB_ARGS_POST(n) ((mrb_aspec)((n)&0x1f) << 7)
201 /* keyword arguments (n of keys, kdict) */
202 #define MRB_ARGS_KEY(n1,n2) ((mrb_aspec)((((n1)&0x1f) << 2) | ((n2)?(1<<1):0)))
203 /* block argument */
204 #define MRB_ARGS_BLOCK() ((mrb_aspec)1)
205 
206 /* accept any number of arguments */
207 #define MRB_ARGS_ANY() ARGS_REST()
208 /* accept no arguments */
209 #define MRB_ARGS_NONE() ((mrb_aspec)0)
210 
211 /* compatibility macros; will be removed */
212 #define ARGS_REQ(n) MRB_ARGS_REQ(n)
213 #define ARGS_OPT(n) MRB_ARGS_OPT(n)
214 #define ARGS_REST() MRB_ARGS_REST()
215 #define ARGS_POST(n) MRB_ARGS_POST()
216 #define ARGS_KEY(n1,n2) MRB_ARGS_KEY(n1,n2)
217 #define ARGS_BLOCK() MRB_ARGS_BLOCK()
218 #define ARGS_ANY() MRB_ARGS_ANY()
219 #define ARGS_NONE() MRB_ARGS_NONE()
220 
221 int mrb_get_args(mrb_state *mrb, const char *format, ...);
222 
223 mrb_value mrb_funcall(mrb_state*, mrb_value, const char*, int,...);
226 mrb_sym mrb_intern_cstr(mrb_state*,const char*);
227 mrb_sym mrb_intern2(mrb_state*,const char*,size_t);
230 mrb_value mrb_check_intern(mrb_state*,const char*,size_t);
232 const char *mrb_sym2name(mrb_state*,mrb_sym);
233 const char *mrb_sym2name_len(mrb_state*,mrb_sym,size_t*);
236 
237 /* For backward compatibility. */
238 static inline
239 mrb_sym mrb_intern(mrb_state *mrb,const char *cstr)
240 {
241  return mrb_intern_cstr(mrb, cstr);
242 }
243 
244 void *mrb_malloc(mrb_state*, size_t); /* raise RuntimeError if no mem */
245 void *mrb_calloc(mrb_state*, size_t, size_t); /* ditto */
246 void *mrb_realloc(mrb_state*, void*, size_t); /* ditto */
247 void *mrb_realloc_simple(mrb_state*, void*, size_t); /* return NULL if no memory available */
248 void *mrb_malloc_simple(mrb_state*, size_t); /* return NULL if no memory available */
249 struct RBasic *mrb_obj_alloc(mrb_state*, enum mrb_vtype, struct RClass*);
250 void mrb_free(mrb_state*, void*);
251 
252 mrb_value mrb_str_new(mrb_state *mrb, const char *p, size_t len);
253 mrb_value mrb_str_new_cstr(mrb_state*, const char*);
254 mrb_value mrb_str_new_static(mrb_state *mrb, const char *p, size_t len);
255 
256 mrb_state* mrb_open(void);
258 void mrb_irep_free(mrb_state*, struct mrb_irep*);
259 void mrb_close(mrb_state*);
260 
263 
264 void mrb_p(mrb_state*, mrb_value);
267 
274 mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2);
275 
277 void mrb_full_gc(mrb_state*);
281 void mrb_gc_mark(mrb_state*,struct RBasic*);
282 #define mrb_gc_mark_value(mrb,val) do {\
283  if (mrb_type(val) >= MRB_TT_HAS_BASIC) mrb_gc_mark((mrb), mrb_basic_ptr(val));\
284 } while (0)
285 void mrb_field_write_barrier(mrb_state *, struct RBasic*, struct RBasic*);
286 #define mrb_field_write_barrier_value(mrb, obj, val) do{\
287  if ((val.tt >= MRB_TT_HAS_BASIC)) mrb_field_write_barrier((mrb), (obj), mrb_basic_ptr(val));\
288 } while (0)
289 void mrb_write_barrier(mrb_state *, struct RBasic*);
290 
291 mrb_value mrb_check_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method);
293 const char * mrb_obj_classname(mrb_state *mrb, mrb_value obj);
294 struct RClass* mrb_obj_class(mrb_state *mrb, mrb_value obj);
295 mrb_value mrb_class_path(mrb_state *mrb, struct RClass *c);
296 mrb_value mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method);
300 
301 /* need to include <ctype.h> to use these macros */
302 #ifndef ISPRINT
303 //#define ISASCII(c) isascii((int)(unsigned char)(c))
304 #define ISASCII(c) 1
305 #define ISPRINT(c) (ISASCII(c) && isprint((int)(unsigned char)(c)))
306 #define ISSPACE(c) (ISASCII(c) && isspace((int)(unsigned char)(c)))
307 #define ISUPPER(c) (ISASCII(c) && isupper((int)(unsigned char)(c)))
308 #define ISLOWER(c) (ISASCII(c) && islower((int)(unsigned char)(c)))
309 #define ISALNUM(c) (ISASCII(c) && isalnum((int)(unsigned char)(c)))
310 #define ISALPHA(c) (ISASCII(c) && isalpha((int)(unsigned char)(c)))
311 #define ISDIGIT(c) (ISASCII(c) && isdigit((int)(unsigned char)(c)))
312 #define ISXDIGIT(c) (ISASCII(c) && isxdigit((int)(unsigned char)(c)))
313 #define TOUPPER(c) (ISASCII(c) ? toupper((int)(unsigned char)(c)) : (c))
314 #define TOLOWER(c) (ISASCII(c) ? tolower((int)(unsigned char)(c)) : (c))
315 #endif
316 
317 mrb_value mrb_exc_new(mrb_state *mrb, struct RClass *c, const char *ptr, long len);
318 void mrb_exc_raise(mrb_state *mrb, mrb_value exc);
319 
320 void mrb_raise(mrb_state *mrb, struct RClass *c, const char *msg);
321 void mrb_raisef(mrb_state *mrb, struct RClass *c, const char *fmt, ...);
322 void mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...);
323 void mrb_warn(mrb_state *mrb, const char *fmt, ...);
324 void mrb_bug(mrb_state *mrb, const char *fmt, ...);
325 void mrb_print_backtrace(mrb_state *mrb);
327 void mrb_print_error(mrb_state *mrb);
328 
329 /* macros to get typical exception objects
330  note:
331  + those E_* macros requires mrb_state* variable named mrb.
332  + exception objects obtained from those macros are local to mrb
333 */
334 #define E_RUNTIME_ERROR (mrb_class_get(mrb, "RuntimeError"))
335 #define E_TYPE_ERROR (mrb_class_get(mrb, "TypeError"))
336 #define E_ARGUMENT_ERROR (mrb_class_get(mrb, "ArgumentError"))
337 #define E_INDEX_ERROR (mrb_class_get(mrb, "IndexError"))
338 #define E_RANGE_ERROR (mrb_class_get(mrb, "RangeError"))
339 #define E_NAME_ERROR (mrb_class_get(mrb, "NameError"))
340 #define E_NOMETHOD_ERROR (mrb_class_get(mrb, "NoMethodError"))
341 #define E_SCRIPT_ERROR (mrb_class_get(mrb, "ScriptError"))
342 #define E_SYNTAX_ERROR (mrb_class_get(mrb, "SyntaxError"))
343 #define E_LOCALJUMP_ERROR (mrb_class_get(mrb, "LocalJumpError"))
344 #define E_REGEXP_ERROR (mrb_class_get(mrb, "RegexpError"))
345 
346 #define E_NOTIMP_ERROR (mrb_class_get(mrb, "NotImplementedError"))
347 #define E_FLOATDOMAIN_ERROR (mrb_class_get(mrb, "FloatDomainError"))
348 
349 #define E_KEY_ERROR (mrb_class_get(mrb, "KeyError"))
350 
352 mrb_value mrb_yield_argv(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv);
353 
354 void mrb_gc_protect(mrb_state *mrb, mrb_value obj);
356 void mrb_check_type(mrb_state *mrb, mrb_value x, enum mrb_vtype t);
357 
358 typedef enum call_type {
363 } call_type;
364 
365 void mrb_define_alias(mrb_state *mrb, struct RClass *klass, const char *name1, const char *name2);
366 const char *mrb_class_name(mrb_state *mrb, struct RClass* klass);
367 void mrb_define_global_const(mrb_state *mrb, const char *name, mrb_value val);
368 
371 
374 
375 /* memory pool implementation */
376 typedef struct mrb_pool mrb_pool;
378 void mrb_pool_close(struct mrb_pool*);
379 void* mrb_pool_alloc(struct mrb_pool*, size_t);
380 void* mrb_pool_realloc(struct mrb_pool*, void*, size_t oldlen, size_t newlen);
381 mrb_bool mrb_pool_can_realloc(struct mrb_pool*, void*, size_t);
382 void* mrb_alloca(mrb_state *mrb, size_t);
383 
384 #ifdef MRB_DEBUG
385 #include <assert.h>
386 #define mrb_assert(p) assert(p)
387 #else
388 #define mrb_assert(p) ((void)0)
389 #endif
390 
391 #if defined(__cplusplus)
392 } /* extern "C" { */
393 #endif
394 
395 #endif /* MRUBY_H */