mbed I/F binding for mruby

Dependents:   mruby_mbed_web mirb_mbed

mbed-mruby

How to use

Class

Committer:
mzta
Date:
Mon Apr 13 05:20:15 2015 +0000
Revision:
1:8ccd1d494a4b
Parent:
0:158c61bb030f
- code refactoring.; - add SPI, SPISlave, I2C class to mruby-mbed (Incomplete).

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mzta 0:158c61bb030f 1 /*
mzta 0:158c61bb030f 2 ** mruby - An embeddable Ruby implementation
mzta 0:158c61bb030f 3 **
mzta 0:158c61bb030f 4 ** Copyright (c) mruby developers 2010-2014
mzta 0:158c61bb030f 5 **
mzta 0:158c61bb030f 6 ** Permission is hereby granted, free of charge, to any person obtaining
mzta 0:158c61bb030f 7 ** a copy of this software and associated documentation files (the
mzta 0:158c61bb030f 8 ** "Software"), to deal in the Software without restriction, including
mzta 0:158c61bb030f 9 ** without limitation the rights to use, copy, modify, merge, publish,
mzta 0:158c61bb030f 10 ** distribute, sublicense, and/or sell copies of the Software, and to
mzta 0:158c61bb030f 11 ** permit persons to whom the Software is furnished to do so, subject to
mzta 0:158c61bb030f 12 ** the following conditions:
mzta 0:158c61bb030f 13 **
mzta 0:158c61bb030f 14 ** The above copyright notice and this permission notice shall be
mzta 0:158c61bb030f 15 ** included in all copies or substantial portions of the Software.
mzta 0:158c61bb030f 16 **
mzta 0:158c61bb030f 17 ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
mzta 0:158c61bb030f 18 ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
mzta 0:158c61bb030f 19 ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
mzta 0:158c61bb030f 20 ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
mzta 0:158c61bb030f 21 ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
mzta 0:158c61bb030f 22 ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
mzta 0:158c61bb030f 23 ** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
mzta 0:158c61bb030f 24 **
mzta 0:158c61bb030f 25 ** [ MIT license: http://www.opensource.org/licenses/mit-license.php ]
mzta 0:158c61bb030f 26 */
mzta 0:158c61bb030f 27
mzta 0:158c61bb030f 28 #ifndef MRUBY_H
mzta 0:158c61bb030f 29 #define MRUBY_H
mzta 0:158c61bb030f 30
mzta 0:158c61bb030f 31 #if defined(__cplusplus)
mzta 0:158c61bb030f 32 extern "C" {
mzta 0:158c61bb030f 33 #endif
mzta 0:158c61bb030f 34
mzta 0:158c61bb030f 35 #include <stdint.h>
mzta 0:158c61bb030f 36 #include <stddef.h>
mzta 0:158c61bb030f 37 #include <limits.h>
mzta 0:158c61bb030f 38
mzta 0:158c61bb030f 39 #include "mrbconf.h"
mzta 0:158c61bb030f 40 #include "mruby/value.h"
mzta 0:158c61bb030f 41 #include "mruby/version.h"
mzta 0:158c61bb030f 42
mzta 0:158c61bb030f 43 typedef uint32_t mrb_code;
mzta 0:158c61bb030f 44 typedef uint32_t mrb_aspec;
mzta 0:158c61bb030f 45
mzta 0:158c61bb030f 46 struct mrb_irep;
mzta 0:158c61bb030f 47 struct mrb_state;
mzta 0:158c61bb030f 48
mzta 0:158c61bb030f 49 typedef void* (*mrb_allocf) (struct mrb_state *mrb, void*, size_t, void *ud);
mzta 0:158c61bb030f 50
mzta 0:158c61bb030f 51 #ifndef MRB_GC_ARENA_SIZE
mzta 0:158c61bb030f 52 #define MRB_GC_ARENA_SIZE 100
mzta 0:158c61bb030f 53 #endif
mzta 0:158c61bb030f 54
mzta 0:158c61bb030f 55 #ifndef MRB_FIXED_STATE_ATEXIT_STACK_SIZE
mzta 0:158c61bb030f 56 #define MRB_FIXED_STATE_ATEXIT_STACK_SIZE 5
mzta 0:158c61bb030f 57 #endif
mzta 0:158c61bb030f 58
mzta 0:158c61bb030f 59 typedef struct {
mzta 0:158c61bb030f 60 mrb_sym mid;
mzta 0:158c61bb030f 61 struct RProc *proc;
mzta 0:158c61bb030f 62 mrb_value *stackent;
mzta 0:158c61bb030f 63 int nregs;
mzta 0:158c61bb030f 64 int ridx;
mzta 0:158c61bb030f 65 int eidx;
mzta 0:158c61bb030f 66 struct REnv *env;
mzta 0:158c61bb030f 67 mrb_code *pc; /* return address */
mzta 0:158c61bb030f 68 mrb_code *err; /* error position */
mzta 0:158c61bb030f 69 int argc;
mzta 0:158c61bb030f 70 int acc;
mzta 0:158c61bb030f 71 struct RClass *target_class;
mzta 0:158c61bb030f 72 } mrb_callinfo;
mzta 0:158c61bb030f 73
mzta 0:158c61bb030f 74 enum mrb_fiber_state {
mzta 0:158c61bb030f 75 MRB_FIBER_CREATED = 0,
mzta 0:158c61bb030f 76 MRB_FIBER_RUNNING,
mzta 0:158c61bb030f 77 MRB_FIBER_RESUMING,
mzta 0:158c61bb030f 78 MRB_FIBER_SUSPENDED,
mzta 0:158c61bb030f 79 MRB_FIBER_TRANSFERRED,
mzta 0:158c61bb030f 80 MRB_FIBER_TERMINATED,
mzta 0:158c61bb030f 81 };
mzta 0:158c61bb030f 82
mzta 0:158c61bb030f 83 struct mrb_context {
mzta 0:158c61bb030f 84 struct mrb_context *prev;
mzta 0:158c61bb030f 85
mzta 0:158c61bb030f 86 mrb_value *stack; /* stack of virtual machine */
mzta 0:158c61bb030f 87 mrb_value *stbase, *stend;
mzta 0:158c61bb030f 88
mzta 0:158c61bb030f 89 mrb_callinfo *ci;
mzta 0:158c61bb030f 90 mrb_callinfo *cibase, *ciend;
mzta 0:158c61bb030f 91
mzta 0:158c61bb030f 92 mrb_code **rescue; /* exception handler stack */
mzta 0:158c61bb030f 93 int rsize;
mzta 0:158c61bb030f 94 struct RProc **ensure; /* ensure handler stack */
mzta 0:158c61bb030f 95 int esize;
mzta 0:158c61bb030f 96
mzta 0:158c61bb030f 97 enum mrb_fiber_state status;
mzta 0:158c61bb030f 98 struct RFiber *fib;
mzta 0:158c61bb030f 99 };
mzta 0:158c61bb030f 100
mzta 0:158c61bb030f 101 enum gc_state {
mzta 0:158c61bb030f 102 GC_STATE_ROOT = 0,
mzta 0:158c61bb030f 103 GC_STATE_MARK,
mzta 0:158c61bb030f 104 GC_STATE_SWEEP
mzta 0:158c61bb030f 105 };
mzta 0:158c61bb030f 106
mzta 0:158c61bb030f 107 struct mrb_jmpbuf;
mzta 0:158c61bb030f 108
mzta 0:158c61bb030f 109 typedef void (*mrb_atexit_func)(struct mrb_state*);
mzta 0:158c61bb030f 110
mzta 0:158c61bb030f 111 typedef struct mrb_state {
mzta 0:158c61bb030f 112 struct mrb_jmpbuf *jmp;
mzta 0:158c61bb030f 113
mzta 0:158c61bb030f 114 mrb_allocf allocf; /* memory allocation function */
mzta 0:158c61bb030f 115 void *allocf_ud; /* auxiliary data of allocf */
mzta 0:158c61bb030f 116
mzta 0:158c61bb030f 117 struct mrb_context *c;
mzta 0:158c61bb030f 118 struct mrb_context *root_c;
mzta 0:158c61bb030f 119
mzta 0:158c61bb030f 120 struct RObject *exc; /* exception */
mzta 0:158c61bb030f 121 struct iv_tbl *globals; /* global variable table */
mzta 0:158c61bb030f 122
mzta 0:158c61bb030f 123 struct RObject *top_self;
mzta 0:158c61bb030f 124 struct RClass *object_class; /* Object class */
mzta 0:158c61bb030f 125 struct RClass *class_class;
mzta 0:158c61bb030f 126 struct RClass *module_class;
mzta 0:158c61bb030f 127 struct RClass *proc_class;
mzta 0:158c61bb030f 128 struct RClass *string_class;
mzta 0:158c61bb030f 129 struct RClass *array_class;
mzta 0:158c61bb030f 130 struct RClass *hash_class;
mzta 0:158c61bb030f 131
mzta 0:158c61bb030f 132 struct RClass *float_class;
mzta 0:158c61bb030f 133 struct RClass *fixnum_class;
mzta 0:158c61bb030f 134 struct RClass *true_class;
mzta 0:158c61bb030f 135 struct RClass *false_class;
mzta 0:158c61bb030f 136 struct RClass *nil_class;
mzta 0:158c61bb030f 137 struct RClass *symbol_class;
mzta 0:158c61bb030f 138 struct RClass *kernel_module;
mzta 0:158c61bb030f 139
mzta 0:158c61bb030f 140 struct heap_page *heaps; /* heaps for GC */
mzta 0:158c61bb030f 141 struct heap_page *sweeps;
mzta 0:158c61bb030f 142 struct heap_page *free_heaps;
mzta 0:158c61bb030f 143 size_t live; /* count of live objects */
mzta 0:158c61bb030f 144 #ifdef MRB_GC_FIXED_ARENA
mzta 0:158c61bb030f 145 struct RBasic *arena[MRB_GC_ARENA_SIZE]; /* GC protection array */
mzta 0:158c61bb030f 146 #else
mzta 0:158c61bb030f 147 struct RBasic **arena; /* GC protection array */
mzta 0:158c61bb030f 148 int arena_capa;
mzta 0:158c61bb030f 149 #endif
mzta 0:158c61bb030f 150 int arena_idx;
mzta 0:158c61bb030f 151
mzta 0:158c61bb030f 152 enum gc_state gc_state; /* state of gc */
mzta 0:158c61bb030f 153 int current_white_part; /* make white object by white_part */
mzta 0:158c61bb030f 154 struct RBasic *gray_list; /* list of gray objects to be traversed incrementally */
mzta 0:158c61bb030f 155 struct RBasic *atomic_gray_list; /* list of objects to be traversed atomically */
mzta 0:158c61bb030f 156 size_t gc_live_after_mark;
mzta 0:158c61bb030f 157 size_t gc_threshold;
mzta 0:158c61bb030f 158 int gc_interval_ratio;
mzta 0:158c61bb030f 159 int gc_step_ratio;
mzta 0:158c61bb030f 160 mrb_bool gc_disabled:1;
mzta 0:158c61bb030f 161 mrb_bool gc_full:1;
mzta 0:158c61bb030f 162 mrb_bool is_generational_gc_mode:1;
mzta 0:158c61bb030f 163 mrb_bool out_of_memory:1;
mzta 0:158c61bb030f 164 size_t majorgc_old_threshold;
mzta 0:158c61bb030f 165 struct alloca_header *mems;
mzta 0:158c61bb030f 166
mzta 0:158c61bb030f 167 mrb_sym symidx;
mzta 0:158c61bb030f 168 struct kh_n2s *name2sym; /* symbol hash */
mzta 0:158c61bb030f 169 struct symbol_name *symtbl; /* symbol table */
mzta 0:158c61bb030f 170 size_t symcapa;
mzta 0:158c61bb030f 171
mzta 0:158c61bb030f 172 #ifdef ENABLE_DEBUG
mzta 0:158c61bb030f 173 void (*code_fetch_hook)(struct mrb_state* mrb, struct mrb_irep *irep, mrb_code *pc, mrb_value *regs);
mzta 0:158c61bb030f 174 void (*debug_op_hook)(struct mrb_state* mrb, struct mrb_irep *irep, mrb_code *pc, mrb_value *regs);
mzta 0:158c61bb030f 175 #endif
mzta 0:158c61bb030f 176
mzta 0:158c61bb030f 177 struct RClass *eException_class;
mzta 0:158c61bb030f 178 struct RClass *eStandardError_class;
mzta 0:158c61bb030f 179 struct RObject *nomem_err; /* pre-allocated NoMemoryError */
mzta 0:158c61bb030f 180
mzta 0:158c61bb030f 181 void *ud; /* auxiliary data */
mzta 0:158c61bb030f 182
mzta 0:158c61bb030f 183 #ifdef MRB_FIXED_STATE_ATEXIT_STACK
mzta 0:158c61bb030f 184 mrb_atexit_func atexit_stack[MRB_FIXED_STATE_ATEXIT_STACK_SIZE];
mzta 0:158c61bb030f 185 #else
mzta 0:158c61bb030f 186 mrb_atexit_func *atexit_stack;
mzta 0:158c61bb030f 187 #endif
mzta 0:158c61bb030f 188 mrb_int atexit_stack_len;
mzta 0:158c61bb030f 189 } mrb_state;
mzta 0:158c61bb030f 190
mzta 0:158c61bb030f 191 #if __STDC_VERSION__ >= 201112L
mzta 0:158c61bb030f 192 # define mrb_noreturn _Noreturn
mzta 0:158c61bb030f 193 #elif defined __GNUC__ && !defined __STRICT_ANSI__
mzta 0:158c61bb030f 194 # define mrb_noreturn __attribute__((noreturn))
mzta 0:158c61bb030f 195 #elif defined _MSC_VER
mzta 0:158c61bb030f 196 # define mrb_noreturn __declspec(noreturn)
mzta 0:158c61bb030f 197 #else
mzta 0:158c61bb030f 198 # define mrb_noreturn
mzta 0:158c61bb030f 199 #endif
mzta 0:158c61bb030f 200
mzta 0:158c61bb030f 201 typedef mrb_value (*mrb_func_t)(mrb_state *mrb, mrb_value);
mzta 0:158c61bb030f 202 MRB_API struct RClass *mrb_define_class(mrb_state *, const char*, struct RClass*);
mzta 0:158c61bb030f 203 MRB_API struct RClass *mrb_define_module(mrb_state *, const char*);
mzta 0:158c61bb030f 204 MRB_API mrb_value mrb_singleton_class(mrb_state*, mrb_value);
mzta 0:158c61bb030f 205 MRB_API void mrb_include_module(mrb_state*, struct RClass*, struct RClass*);
mzta 0:158c61bb030f 206
mzta 0:158c61bb030f 207 MRB_API void mrb_define_method(mrb_state*, struct RClass*, const char*, mrb_func_t, mrb_aspec);
mzta 0:158c61bb030f 208 MRB_API void mrb_define_class_method(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec);
mzta 0:158c61bb030f 209 MRB_API void mrb_define_singleton_method(mrb_state*, struct RObject*, const char*, mrb_func_t, mrb_aspec);
mzta 0:158c61bb030f 210 MRB_API void mrb_define_module_function(mrb_state*, struct RClass*, const char*, mrb_func_t, mrb_aspec);
mzta 0:158c61bb030f 211 MRB_API void mrb_define_const(mrb_state*, struct RClass*, const char *name, mrb_value);
mzta 0:158c61bb030f 212 MRB_API void mrb_undef_method(mrb_state*, struct RClass*, const char*);
mzta 0:158c61bb030f 213 MRB_API void mrb_undef_class_method(mrb_state*, struct RClass*, const char*);
mzta 0:158c61bb030f 214 MRB_API mrb_value mrb_obj_new(mrb_state *mrb, struct RClass *c, mrb_int argc, const mrb_value *argv);
mzta 0:158c61bb030f 215 #define mrb_class_new_instance(mrb,argc,argv,c) mrb_obj_new(mrb,c,argc,argv)
mzta 0:158c61bb030f 216 MRB_API mrb_value mrb_instance_new(mrb_state *mrb, mrb_value cv);
mzta 0:158c61bb030f 217 MRB_API struct RClass * mrb_class_new(mrb_state *mrb, struct RClass *super);
mzta 0:158c61bb030f 218 MRB_API struct RClass * mrb_module_new(mrb_state *mrb);
mzta 0:158c61bb030f 219 MRB_API mrb_bool mrb_class_defined(mrb_state *mrb, const char *name);
mzta 0:158c61bb030f 220 MRB_API struct RClass * mrb_class_get(mrb_state *mrb, const char *name);
mzta 0:158c61bb030f 221 MRB_API struct RClass * mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name);
mzta 0:158c61bb030f 222 MRB_API struct RClass * mrb_module_get(mrb_state *mrb, const char *name);
mzta 0:158c61bb030f 223 MRB_API struct RClass * mrb_module_get_under(mrb_state *mrb, struct RClass *outer, const char *name);
mzta 0:158c61bb030f 224 MRB_API mrb_value mrb_notimplement_m(mrb_state*, mrb_value);
mzta 0:158c61bb030f 225
mzta 0:158c61bb030f 226 MRB_API mrb_value mrb_obj_dup(mrb_state *mrb, mrb_value obj);
mzta 0:158c61bb030f 227 MRB_API mrb_value mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method);
mzta 0:158c61bb030f 228 MRB_API mrb_bool mrb_obj_respond_to(mrb_state *mrb, struct RClass* c, mrb_sym mid);
mzta 0:158c61bb030f 229 MRB_API struct RClass * mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super);
mzta 0:158c61bb030f 230 MRB_API struct RClass * mrb_define_module_under(mrb_state *mrb, struct RClass *outer, const char *name);
mzta 0:158c61bb030f 231
mzta 0:158c61bb030f 232 /* required arguments */
mzta 0:158c61bb030f 233 #define MRB_ARGS_REQ(n) ((mrb_aspec)((n)&0x1f) << 18)
mzta 0:158c61bb030f 234 /* optional arguments */
mzta 0:158c61bb030f 235 #define MRB_ARGS_OPT(n) ((mrb_aspec)((n)&0x1f) << 13)
mzta 0:158c61bb030f 236 /* mandatory and optinal arguments */
mzta 0:158c61bb030f 237 #define MRB_ARGS_ARG(n1,n2) (MRB_ARGS_REQ(n1)|MRB_ARGS_OPT(n2))
mzta 0:158c61bb030f 238
mzta 0:158c61bb030f 239 /* rest argument */
mzta 0:158c61bb030f 240 #define MRB_ARGS_REST() ((mrb_aspec)(1 << 12))
mzta 0:158c61bb030f 241 /* required arguments after rest */
mzta 0:158c61bb030f 242 #define MRB_ARGS_POST(n) ((mrb_aspec)((n)&0x1f) << 7)
mzta 0:158c61bb030f 243 /* keyword arguments (n of keys, kdict) */
mzta 0:158c61bb030f 244 #define MRB_ARGS_KEY(n1,n2) ((mrb_aspec)((((n1)&0x1f) << 2) | ((n2)?(1<<1):0)))
mzta 0:158c61bb030f 245 /* block argument */
mzta 0:158c61bb030f 246 #define MRB_ARGS_BLOCK() ((mrb_aspec)1)
mzta 0:158c61bb030f 247
mzta 0:158c61bb030f 248 /* accept any number of arguments */
mzta 0:158c61bb030f 249 #define MRB_ARGS_ANY() MRB_ARGS_REST()
mzta 0:158c61bb030f 250 /* accept no arguments */
mzta 0:158c61bb030f 251 #define MRB_ARGS_NONE() ((mrb_aspec)0)
mzta 0:158c61bb030f 252
mzta 0:158c61bb030f 253 /* compatibility macros; will be removed */
mzta 0:158c61bb030f 254 #define ARGS_REQ(n) MRB_ARGS_REQ(n)
mzta 0:158c61bb030f 255 #define ARGS_OPT(n) MRB_ARGS_OPT(n)
mzta 0:158c61bb030f 256 #define ARGS_REST() MRB_ARGS_REST()
mzta 0:158c61bb030f 257 #define ARGS_POST(n) MRB_ARGS_POST()
mzta 0:158c61bb030f 258 #define ARGS_KEY(n1,n2) MRB_ARGS_KEY(n1,n2)
mzta 0:158c61bb030f 259 #define ARGS_BLOCK() MRB_ARGS_BLOCK()
mzta 0:158c61bb030f 260 #define ARGS_ANY() MRB_ARGS_ANY()
mzta 0:158c61bb030f 261 #define ARGS_NONE() MRB_ARGS_NONE()
mzta 0:158c61bb030f 262
mzta 0:158c61bb030f 263 MRB_API mrb_int mrb_get_args(mrb_state *mrb, const char *format, ...);
mzta 0:158c61bb030f 264
mzta 0:158c61bb030f 265 /* `strlen` for character string literals (use with caution or `strlen` instead)
mzta 0:158c61bb030f 266 Adjacent string literals are concatenated in C/C++ in translation phase 6.
mzta 0:158c61bb030f 267 If `lit` is not one, the compiler will report a syntax error:
mzta 0:158c61bb030f 268 MSVC: "error C2143: syntax error : missing ')' before 'string'"
mzta 0:158c61bb030f 269 GCC: "error: expected ')' before string constant"
mzta 0:158c61bb030f 270 */
mzta 0:158c61bb030f 271 #define mrb_strlen_lit(lit) (sizeof(lit "") - 1)
mzta 0:158c61bb030f 272
mzta 0:158c61bb030f 273 MRB_API mrb_value mrb_funcall(mrb_state*, mrb_value, const char*, mrb_int,...);
mzta 0:158c61bb030f 274 MRB_API mrb_value mrb_funcall_argv(mrb_state*, mrb_value, mrb_sym, mrb_int, const mrb_value*);
mzta 0:158c61bb030f 275 MRB_API mrb_value mrb_funcall_with_block(mrb_state*, mrb_value, mrb_sym, mrb_int, const mrb_value*, mrb_value);
mzta 0:158c61bb030f 276 MRB_API mrb_sym mrb_intern_cstr(mrb_state*,const char*);
mzta 0:158c61bb030f 277 MRB_API mrb_sym mrb_intern(mrb_state*,const char*,size_t);
mzta 0:158c61bb030f 278 MRB_API mrb_sym mrb_intern_static(mrb_state*,const char*,size_t);
mzta 0:158c61bb030f 279 #define mrb_intern_lit(mrb, lit) mrb_intern_static(mrb, lit, mrb_strlen_lit(lit))
mzta 0:158c61bb030f 280 MRB_API mrb_sym mrb_intern_str(mrb_state*,mrb_value);
mzta 0:158c61bb030f 281 MRB_API mrb_value mrb_check_intern_cstr(mrb_state*,const char*);
mzta 0:158c61bb030f 282 MRB_API mrb_value mrb_check_intern(mrb_state*,const char*,size_t);
mzta 0:158c61bb030f 283 MRB_API mrb_value mrb_check_intern_str(mrb_state*,mrb_value);
mzta 0:158c61bb030f 284 MRB_API const char *mrb_sym2name(mrb_state*,mrb_sym);
mzta 0:158c61bb030f 285 MRB_API const char *mrb_sym2name_len(mrb_state*,mrb_sym,mrb_int*);
mzta 0:158c61bb030f 286 MRB_API mrb_value mrb_sym2str(mrb_state*,mrb_sym);
mzta 0:158c61bb030f 287
mzta 0:158c61bb030f 288 MRB_API void *mrb_malloc(mrb_state*, size_t); /* raise RuntimeError if no mem */
mzta 0:158c61bb030f 289 MRB_API void *mrb_calloc(mrb_state*, size_t, size_t); /* ditto */
mzta 0:158c61bb030f 290 MRB_API void *mrb_realloc(mrb_state*, void*, size_t); /* ditto */
mzta 0:158c61bb030f 291 MRB_API void *mrb_realloc_simple(mrb_state*, void*, size_t); /* return NULL if no memory available */
mzta 0:158c61bb030f 292 MRB_API void *mrb_malloc_simple(mrb_state*, size_t); /* return NULL if no memory available */
mzta 0:158c61bb030f 293 MRB_API struct RBasic *mrb_obj_alloc(mrb_state*, enum mrb_vtype, struct RClass*);
mzta 0:158c61bb030f 294 MRB_API void mrb_free(mrb_state*, void*);
mzta 0:158c61bb030f 295
mzta 0:158c61bb030f 296 MRB_API mrb_value mrb_str_new(mrb_state *mrb, const char *p, size_t len);
mzta 0:158c61bb030f 297 MRB_API mrb_value mrb_str_new_cstr(mrb_state*, const char*);
mzta 0:158c61bb030f 298 MRB_API mrb_value mrb_str_new_static(mrb_state *mrb, const char *p, size_t len);
mzta 0:158c61bb030f 299 #define mrb_str_new_lit(mrb, lit) mrb_str_new_static(mrb, (lit), mrb_strlen_lit(lit))
mzta 0:158c61bb030f 300
mzta 0:158c61bb030f 301 MRB_API mrb_state* mrb_open(void);
mzta 0:158c61bb030f 302 MRB_API mrb_state* mrb_open_allocf(mrb_allocf, void *ud);
mzta 0:158c61bb030f 303 MRB_API mrb_state* mrb_open_core(mrb_allocf, void *ud);
mzta 0:158c61bb030f 304 MRB_API void mrb_close(mrb_state*);
mzta 0:158c61bb030f 305
mzta 0:158c61bb030f 306 MRB_API void* mrb_default_allocf(mrb_state*, void*, size_t, void*);
mzta 0:158c61bb030f 307
mzta 0:158c61bb030f 308 MRB_API mrb_value mrb_top_self(mrb_state *);
mzta 0:158c61bb030f 309 MRB_API mrb_value mrb_run(mrb_state*, struct RProc*, mrb_value);
mzta 0:158c61bb030f 310 MRB_API mrb_value mrb_toplevel_run(mrb_state*, struct RProc*);
mzta 0:158c61bb030f 311 MRB_API mrb_value mrb_context_run(mrb_state*, struct RProc*, mrb_value, unsigned int);
mzta 0:158c61bb030f 312
mzta 0:158c61bb030f 313 MRB_API void mrb_p(mrb_state*, mrb_value);
mzta 0:158c61bb030f 314 MRB_API mrb_int mrb_obj_id(mrb_value obj);
mzta 0:158c61bb030f 315 MRB_API mrb_sym mrb_obj_to_sym(mrb_state *mrb, mrb_value name);
mzta 0:158c61bb030f 316
mzta 0:158c61bb030f 317 MRB_API mrb_bool mrb_obj_eq(mrb_state*, mrb_value, mrb_value);
mzta 0:158c61bb030f 318 MRB_API mrb_bool mrb_obj_equal(mrb_state*, mrb_value, mrb_value);
mzta 0:158c61bb030f 319 MRB_API mrb_bool mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2);
mzta 0:158c61bb030f 320 MRB_API mrb_value mrb_convert_to_integer(mrb_state *mrb, mrb_value val, int base);
mzta 0:158c61bb030f 321 MRB_API mrb_value mrb_Integer(mrb_state *mrb, mrb_value val);
mzta 0:158c61bb030f 322 MRB_API mrb_value mrb_Float(mrb_state *mrb, mrb_value val);
mzta 0:158c61bb030f 323 MRB_API mrb_value mrb_inspect(mrb_state *mrb, mrb_value obj);
mzta 0:158c61bb030f 324 MRB_API mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2);
mzta 0:158c61bb030f 325
mzta 0:158c61bb030f 326 MRB_API void mrb_garbage_collect(mrb_state*);
mzta 0:158c61bb030f 327 MRB_API void mrb_full_gc(mrb_state*);
mzta 0:158c61bb030f 328 MRB_API void mrb_incremental_gc(mrb_state *);
mzta 0:158c61bb030f 329 MRB_API int mrb_gc_arena_save(mrb_state*);
mzta 0:158c61bb030f 330 MRB_API void mrb_gc_arena_restore(mrb_state*,int);
mzta 0:158c61bb030f 331 MRB_API void mrb_gc_mark(mrb_state*,struct RBasic*);
mzta 0:158c61bb030f 332 #define mrb_gc_mark_value(mrb,val) do {\
mzta 0:158c61bb030f 333 if (!mrb_immediate_p(val)) mrb_gc_mark((mrb), mrb_basic_ptr(val)); \
mzta 0:158c61bb030f 334 } while (0)
mzta 0:158c61bb030f 335 MRB_API void mrb_field_write_barrier(mrb_state *, struct RBasic*, struct RBasic*);
mzta 0:158c61bb030f 336 #define mrb_field_write_barrier_value(mrb, obj, val) do{\
mzta 0:158c61bb030f 337 if (!mrb_immediate_p(val)) mrb_field_write_barrier((mrb), (obj), mrb_basic_ptr(val)); \
mzta 0:158c61bb030f 338 } while (0)
mzta 0:158c61bb030f 339 MRB_API void mrb_write_barrier(mrb_state *, struct RBasic*);
mzta 0:158c61bb030f 340
mzta 0:158c61bb030f 341 MRB_API mrb_value mrb_check_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method);
mzta 0:158c61bb030f 342 MRB_API mrb_value mrb_any_to_s(mrb_state *mrb, mrb_value obj);
mzta 0:158c61bb030f 343 MRB_API const char * mrb_obj_classname(mrb_state *mrb, mrb_value obj);
mzta 0:158c61bb030f 344 MRB_API struct RClass* mrb_obj_class(mrb_state *mrb, mrb_value obj);
mzta 0:158c61bb030f 345 MRB_API mrb_value mrb_class_path(mrb_state *mrb, struct RClass *c);
mzta 0:158c61bb030f 346 MRB_API mrb_value mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method);
mzta 0:158c61bb030f 347 MRB_API mrb_bool mrb_obj_is_kind_of(mrb_state *mrb, mrb_value obj, struct RClass *c);
mzta 0:158c61bb030f 348 MRB_API mrb_value mrb_obj_inspect(mrb_state *mrb, mrb_value self);
mzta 0:158c61bb030f 349 MRB_API mrb_value mrb_obj_clone(mrb_state *mrb, mrb_value self);
mzta 0:158c61bb030f 350
mzta 0:158c61bb030f 351 /* need to include <ctype.h> to use these macros */
mzta 0:158c61bb030f 352 #ifndef ISPRINT
mzta 0:158c61bb030f 353 #define ISASCII(c) (!(((int)(unsigned char)(c)) & ~0x7f))
mzta 0:158c61bb030f 354 #define ISPRINT(c) (ISASCII(c) && isprint((int)(unsigned char)(c)))
mzta 0:158c61bb030f 355 #define ISSPACE(c) (ISASCII(c) && isspace((int)(unsigned char)(c)))
mzta 0:158c61bb030f 356 #define ISUPPER(c) (ISASCII(c) && isupper((int)(unsigned char)(c)))
mzta 0:158c61bb030f 357 #define ISLOWER(c) (ISASCII(c) && islower((int)(unsigned char)(c)))
mzta 0:158c61bb030f 358 #define ISALNUM(c) (ISASCII(c) && isalnum((int)(unsigned char)(c)))
mzta 0:158c61bb030f 359 #define ISALPHA(c) (ISASCII(c) && isalpha((int)(unsigned char)(c)))
mzta 0:158c61bb030f 360 #define ISDIGIT(c) (ISASCII(c) && isdigit((int)(unsigned char)(c)))
mzta 0:158c61bb030f 361 #define ISXDIGIT(c) (ISASCII(c) && isxdigit((int)(unsigned char)(c)))
mzta 0:158c61bb030f 362 #define ISBLANK(c) (ISASCII(c) && isblank((int)(unsigned char)(c)))
mzta 0:158c61bb030f 363 #define ISCNTRL(c) (ISASCII(c) && iscntrl((int)(unsigned char)(c)))
mzta 0:158c61bb030f 364 #define TOUPPER(c) (ISASCII(c) ? toupper((int)(unsigned char)(c)) : (c))
mzta 0:158c61bb030f 365 #define TOLOWER(c) (ISASCII(c) ? tolower((int)(unsigned char)(c)) : (c))
mzta 0:158c61bb030f 366 #endif
mzta 0:158c61bb030f 367
mzta 0:158c61bb030f 368 MRB_API mrb_value mrb_exc_new(mrb_state *mrb, struct RClass *c, const char *ptr, long len);
mzta 0:158c61bb030f 369 MRB_API mrb_noreturn void mrb_exc_raise(mrb_state *mrb, mrb_value exc);
mzta 0:158c61bb030f 370
mzta 0:158c61bb030f 371 MRB_API mrb_noreturn void mrb_raise(mrb_state *mrb, struct RClass *c, const char *msg);
mzta 0:158c61bb030f 372 MRB_API mrb_noreturn void mrb_raisef(mrb_state *mrb, struct RClass *c, const char *fmt, ...);
mzta 0:158c61bb030f 373 MRB_API mrb_noreturn void mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...);
mzta 0:158c61bb030f 374 MRB_API void mrb_warn(mrb_state *mrb, const char *fmt, ...);
mzta 0:158c61bb030f 375 MRB_API mrb_noreturn void mrb_bug(mrb_state *mrb, const char *fmt, ...);
mzta 0:158c61bb030f 376 MRB_API void mrb_print_backtrace(mrb_state *mrb);
mzta 0:158c61bb030f 377 MRB_API void mrb_print_error(mrb_state *mrb);
mzta 0:158c61bb030f 378
mzta 0:158c61bb030f 379 /* macros to get typical exception objects
mzta 0:158c61bb030f 380 note:
mzta 0:158c61bb030f 381 + those E_* macros requires mrb_state* variable named mrb.
mzta 0:158c61bb030f 382 + exception objects obtained from those macros are local to mrb
mzta 0:158c61bb030f 383 */
mzta 0:158c61bb030f 384 #define E_RUNTIME_ERROR (mrb_class_get(mrb, "RuntimeError"))
mzta 0:158c61bb030f 385 #define E_TYPE_ERROR (mrb_class_get(mrb, "TypeError"))
mzta 0:158c61bb030f 386 #define E_ARGUMENT_ERROR (mrb_class_get(mrb, "ArgumentError"))
mzta 0:158c61bb030f 387 #define E_INDEX_ERROR (mrb_class_get(mrb, "IndexError"))
mzta 0:158c61bb030f 388 #define E_RANGE_ERROR (mrb_class_get(mrb, "RangeError"))
mzta 0:158c61bb030f 389 #define E_NAME_ERROR (mrb_class_get(mrb, "NameError"))
mzta 0:158c61bb030f 390 #define E_NOMETHOD_ERROR (mrb_class_get(mrb, "NoMethodError"))
mzta 0:158c61bb030f 391 #define E_SCRIPT_ERROR (mrb_class_get(mrb, "ScriptError"))
mzta 0:158c61bb030f 392 #define E_SYNTAX_ERROR (mrb_class_get(mrb, "SyntaxError"))
mzta 0:158c61bb030f 393 #define E_LOCALJUMP_ERROR (mrb_class_get(mrb, "LocalJumpError"))
mzta 0:158c61bb030f 394 #define E_REGEXP_ERROR (mrb_class_get(mrb, "RegexpError"))
mzta 0:158c61bb030f 395 #define E_SYSSTACK_ERROR (mrb_class_get(mrb, "SystemStackError"))
mzta 0:158c61bb030f 396
mzta 0:158c61bb030f 397 #define E_NOTIMP_ERROR (mrb_class_get(mrb, "NotImplementedError"))
mzta 0:158c61bb030f 398 #define E_FLOATDOMAIN_ERROR (mrb_class_get(mrb, "FloatDomainError"))
mzta 0:158c61bb030f 399
mzta 0:158c61bb030f 400 #define E_KEY_ERROR (mrb_class_get(mrb, "KeyError"))
mzta 0:158c61bb030f 401
mzta 0:158c61bb030f 402 MRB_API mrb_value mrb_yield(mrb_state *mrb, mrb_value b, mrb_value arg);
mzta 0:158c61bb030f 403 MRB_API mrb_value mrb_yield_argv(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value *argv);
mzta 0:158c61bb030f 404 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);
mzta 0:158c61bb030f 405
mzta 0:158c61bb030f 406 MRB_API void mrb_gc_protect(mrb_state *mrb, mrb_value obj);
mzta 0:158c61bb030f 407 MRB_API mrb_value mrb_to_int(mrb_state *mrb, mrb_value val);
mzta 0:158c61bb030f 408 #define mrb_int(mrb, val) mrb_fixnum(mrb_to_int(mrb, val))
mzta 0:158c61bb030f 409 MRB_API void mrb_check_type(mrb_state *mrb, mrb_value x, enum mrb_vtype t);
mzta 0:158c61bb030f 410
mzta 0:158c61bb030f 411 typedef enum call_type {
mzta 0:158c61bb030f 412 CALL_PUBLIC,
mzta 0:158c61bb030f 413 CALL_FCALL,
mzta 0:158c61bb030f 414 CALL_VCALL,
mzta 0:158c61bb030f 415 CALL_TYPE_MAX
mzta 0:158c61bb030f 416 } call_type;
mzta 0:158c61bb030f 417
mzta 0:158c61bb030f 418 MRB_API void mrb_define_alias(mrb_state *mrb, struct RClass *klass, const char *name1, const char *name2);
mzta 0:158c61bb030f 419 MRB_API const char *mrb_class_name(mrb_state *mrb, struct RClass* klass);
mzta 0:158c61bb030f 420 MRB_API void mrb_define_global_const(mrb_state *mrb, const char *name, mrb_value val);
mzta 0:158c61bb030f 421
mzta 0:158c61bb030f 422 MRB_API mrb_value mrb_attr_get(mrb_state *mrb, mrb_value obj, mrb_sym id);
mzta 0:158c61bb030f 423
mzta 0:158c61bb030f 424 MRB_API mrb_bool mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid);
mzta 0:158c61bb030f 425 MRB_API mrb_bool mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c);
mzta 0:158c61bb030f 426
mzta 0:158c61bb030f 427 /* fiber functions (you need to link mruby-fiber mrbgem to use) */
mzta 0:158c61bb030f 428 MRB_API mrb_value mrb_fiber_yield(mrb_state *mrb, mrb_int argc, const mrb_value *argv);
mzta 0:158c61bb030f 429 #define E_FIBER_ERROR (mrb_class_get(mrb, "FiberError"))
mzta 0:158c61bb030f 430
mzta 0:158c61bb030f 431 /* memory pool implementation */
mzta 0:158c61bb030f 432 typedef struct mrb_pool mrb_pool;
mzta 0:158c61bb030f 433 MRB_API struct mrb_pool* mrb_pool_open(mrb_state*);
mzta 0:158c61bb030f 434 MRB_API void mrb_pool_close(struct mrb_pool*);
mzta 0:158c61bb030f 435 MRB_API void* mrb_pool_alloc(struct mrb_pool*, size_t);
mzta 0:158c61bb030f 436 MRB_API void* mrb_pool_realloc(struct mrb_pool*, void*, size_t oldlen, size_t newlen);
mzta 0:158c61bb030f 437 MRB_API mrb_bool mrb_pool_can_realloc(struct mrb_pool*, void*, size_t);
mzta 0:158c61bb030f 438 MRB_API void* mrb_alloca(mrb_state *mrb, size_t);
mzta 0:158c61bb030f 439
mzta 0:158c61bb030f 440 MRB_API void mrb_state_atexit(mrb_state *mrb, mrb_atexit_func func);
mzta 0:158c61bb030f 441
mzta 0:158c61bb030f 442 #ifdef MRB_DEBUG
mzta 0:158c61bb030f 443 #include <assert.h>
mzta 0:158c61bb030f 444 #define mrb_assert(p) assert(p)
mzta 0:158c61bb030f 445 #define mrb_assert_int_fit(t1,n,t2,max) assert((n)>=0 && ((sizeof(n)<=sizeof(t2))||(n<=(t1)(max))))
mzta 0:158c61bb030f 446 #else
mzta 0:158c61bb030f 447 #define mrb_assert(p) ((void)0)
mzta 0:158c61bb030f 448 #define mrb_assert_int_fit(t1,n,t2,max) ((void)0)
mzta 0:158c61bb030f 449 #endif
mzta 0:158c61bb030f 450
mzta 0:158c61bb030f 451 #if __STDC_VERSION__ >= 201112L
mzta 0:158c61bb030f 452 #define mrb_static_assert(exp, str) _Static_assert(exp, str)
mzta 0:158c61bb030f 453 #else
mzta 0:158c61bb030f 454 #define mrb_static_assert(exp, str) mrb_assert(exp)
mzta 0:158c61bb030f 455 #endif
mzta 0:158c61bb030f 456
mzta 0:158c61bb030f 457 MRB_API mrb_value mrb_format(mrb_state *mrb, const char *format, ...);
mzta 0:158c61bb030f 458
mzta 0:158c61bb030f 459 #if defined(__cplusplus)
mzta 0:158c61bb030f 460 } /* extern "C" { */
mzta 0:158c61bb030f 461 #endif
mzta 0:158c61bb030f 462
mzta 0:158c61bb030f 463 #endif /* MRUBY_H */
mzta 0:158c61bb030f 464