Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: mruby_mbed_web mirb_mbed
Revision 0:158c61bb030f, committed 2015-03-25
- Comitter:
- mzta
- Date:
- Wed Mar 25 17:36:16 2015 +0000
- Child:
- 1:8ccd1d494a4b
- Commit message:
- mirb_mbed initial commit;
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/mrbconf.h Wed Mar 25 17:36:16 2015 +0000 @@ -0,0 +1,115 @@ +/* +** mrbconf.h - mruby core configuration +** +** See Copyright Notice in mruby.h +*/ + +#ifndef MRUBYCONF_H +#define MRUBYCONF_H + +/* configuration options: */ +/* add -DMRB_USE_FLOAT to use float instead of double for floating point numbers */ +//#define MRB_USE_FLOAT + +/* add -DMRB_INT16 to use 16bit integer for mrb_int; conflict with MRB_INT64 */ +//#define MRB_INT16 + +/* add -DMRB_INT64 to use 64bit integer for mrb_int; conflict with MRB_INT16 */ +//#define MRB_INT64 + +/* represent mrb_value in boxed double; conflict with MRB_USE_FLOAT */ +//#define MRB_NAN_BOXING + +/* define on big endian machines; used by MRB_NAN_BOXING */ +//#define MRB_ENDIAN_BIG + +/* represent mrb_value as a word (natural unit of data for the processor) */ +//#define MRB_WORD_BOXING + +/* argv max size in mrb_funcall */ +//#define MRB_FUNCALL_ARGC_MAX 16 + +/* number of object per heap page */ +//#define MRB_HEAP_PAGE_SIZE 1024 + +/* use segmented list for IV table */ +//#define MRB_USE_IV_SEGLIST + +/* initial size for IV khash; ignored when MRB_USE_IV_SEGLIST is set */ +//#define MRB_IVHASH_INIT_SIZE 8 + +/* if _etext and _edata available, mruby can reduce memory used by symbols */ +//#define MRB_USE_ETEXT_EDATA + +/* do not use __init_array_start to determine readonly data section; + effective only when MRB_USE_ETEXT_EDATA is defined */ +//#define MRB_NO_INIT_ARRAY_START + +/* turn off generational GC by default */ +//#define MRB_GC_TURN_OFF_GENERATIONAL + +/* default size of khash table bucket */ +//#define KHASH_DEFAULT_SIZE 32 + +/* allocated memory address alignment */ +//#define POOL_ALIGNMENT 4 + +/* page size of memory pool */ +//#define POOL_PAGE_SIZE 16000 + +/* initial minimum size for string buffer */ +//#define MRB_STR_BUF_MIN_SIZE 128 + +/* arena size */ +//#define MRB_GC_ARENA_SIZE 100 + +/* fixed size GC arena */ +//#define MRB_GC_FIXED_ARENA + +/* state atexit stack size */ +//#define MRB_FIXED_STATE_ATEXIT_STACK_SIZE 5 + +/* fixed size state atexit stack */ +//#define MRB_FIXED_STATE_ATEXIT_STACK + +/* -DDISABLE_XXXX to drop following features */ +//#define DISABLE_STDIO /* use of stdio */ + +/* -DENABLE_XXXX to enable following features */ +//#define ENABLE_DEBUG /* hooks for debugger */ + +/* end of configuration */ + +/* define ENABLE_XXXX from DISABLE_XXX */ +#ifndef DISABLE_STDIO +#define ENABLE_STDIO +#endif +#ifndef ENABLE_DEBUG +#define DISABLE_DEBUG +#endif + +#ifdef ENABLE_STDIO +# include <stdio.h> +#endif + +#ifndef FALSE +# define FALSE 0 +#endif + +#ifndef TRUE +# define TRUE 1 +#endif + +#if defined(MRB_BUILD_AS_DLL) + +#if defined(MRB_CORE) || defined(MRB_LIB) +#define MRB_API __declspec(dllexport) +#else +#define MRB_API __declspec(dllimport) +#endif +#else +#define MRB_API extern +#endif + +#endif /* MRUBYCONF_H */ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,464 @@
+/*
+** mruby - An embeddable Ruby implementation
+**
+** Copyright (c) mruby developers 2010-2014
+**
+** Permission is hereby granted, free of charge, to any person obtaining
+** a copy of this software and associated documentation files (the
+** "Software"), to deal in the Software without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Software, and to
+** permit persons to whom the Software is furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be
+** included in all copies or substantial portions of the Software.
+**
+** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+**
+** [ MIT license: http://www.opensource.org/licenses/mit-license.php ]
+*/
+
+#ifndef MRUBY_H
+#define MRUBY_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <stddef.h>
+#include <limits.h>
+
+#include "mrbconf.h"
+#include "mruby/value.h"
+#include "mruby/version.h"
+
+typedef uint32_t mrb_code;
+typedef uint32_t mrb_aspec;
+
+struct mrb_irep;
+struct mrb_state;
+
+typedef void* (*mrb_allocf) (struct mrb_state *mrb, void*, size_t, void *ud);
+
+#ifndef MRB_GC_ARENA_SIZE
+#define MRB_GC_ARENA_SIZE 100
+#endif
+
+#ifndef MRB_FIXED_STATE_ATEXIT_STACK_SIZE
+#define MRB_FIXED_STATE_ATEXIT_STACK_SIZE 5
+#endif
+
+typedef struct {
+ mrb_sym mid;
+ struct RProc *proc;
+ mrb_value *stackent;
+ int nregs;
+ int ridx;
+ int eidx;
+ struct REnv *env;
+ mrb_code *pc; /* return address */
+ mrb_code *err; /* error position */
+ int argc;
+ int acc;
+ struct RClass *target_class;
+} mrb_callinfo;
+
+enum mrb_fiber_state {
+ MRB_FIBER_CREATED = 0,
+ MRB_FIBER_RUNNING,
+ MRB_FIBER_RESUMING,
+ MRB_FIBER_SUSPENDED,
+ MRB_FIBER_TRANSFERRED,
+ MRB_FIBER_TERMINATED,
+};
+
+struct mrb_context {
+ struct mrb_context *prev;
+
+ mrb_value *stack; /* stack of virtual machine */
+ mrb_value *stbase, *stend;
+
+ mrb_callinfo *ci;
+ mrb_callinfo *cibase, *ciend;
+
+ mrb_code **rescue; /* exception handler stack */
+ int rsize;
+ struct RProc **ensure; /* ensure handler stack */
+ int esize;
+
+ enum mrb_fiber_state status;
+ struct RFiber *fib;
+};
+
+enum gc_state {
+ GC_STATE_ROOT = 0,
+ GC_STATE_MARK,
+ GC_STATE_SWEEP
+};
+
+struct mrb_jmpbuf;
+
+typedef void (*mrb_atexit_func)(struct mrb_state*);
+
+typedef struct mrb_state {
+ struct mrb_jmpbuf *jmp;
+
+ mrb_allocf allocf; /* memory allocation function */
+ void *allocf_ud; /* auxiliary data of allocf */
+
+ struct mrb_context *c;
+ struct mrb_context *root_c;
+
+ struct RObject *exc; /* exception */
+ struct iv_tbl *globals; /* global variable table */
+
+ struct RObject *top_self;
+ struct RClass *object_class; /* Object class */
+ struct RClass *class_class;
+ struct RClass *module_class;
+ struct RClass *proc_class;
+ struct RClass *string_class;
+ struct RClass *array_class;
+ struct RClass *hash_class;
+
+ struct RClass *float_class;
+ struct RClass *fixnum_class;
+ struct RClass *true_class;
+ struct RClass *false_class;
+ struct RClass *nil_class;
+ struct RClass *symbol_class;
+ struct RClass *kernel_module;
+
+ struct heap_page *heaps; /* heaps for GC */
+ struct heap_page *sweeps;
+ struct heap_page *free_heaps;
+ size_t live; /* count of live objects */
+#ifdef MRB_GC_FIXED_ARENA
+ struct RBasic *arena[MRB_GC_ARENA_SIZE]; /* GC protection array */
+#else
+ struct RBasic **arena; /* GC protection array */
+ int arena_capa;
+#endif
+ int arena_idx;
+
+ enum gc_state gc_state; /* state of gc */
+ int current_white_part; /* make white object by white_part */
+ struct RBasic *gray_list; /* list of gray objects to be traversed incrementally */
+ struct RBasic *atomic_gray_list; /* list of objects to be traversed atomically */
+ size_t gc_live_after_mark;
+ size_t gc_threshold;
+ int gc_interval_ratio;
+ int gc_step_ratio;
+ mrb_bool gc_disabled:1;
+ mrb_bool gc_full:1;
+ mrb_bool is_generational_gc_mode:1;
+ mrb_bool out_of_memory:1;
+ size_t majorgc_old_threshold;
+ struct alloca_header *mems;
+
+ mrb_sym symidx;
+ struct kh_n2s *name2sym; /* symbol hash */
+ struct symbol_name *symtbl; /* symbol table */
+ size_t symcapa;
+
+#ifdef ENABLE_DEBUG
+ void (*code_fetch_hook)(struct mrb_state* mrb, struct mrb_irep *irep, mrb_code *pc, mrb_value *regs);
+ void (*debug_op_hook)(struct mrb_state* mrb, struct mrb_irep *irep, mrb_code *pc, mrb_value *regs);
+#endif
+
+ struct RClass *eException_class;
+ struct RClass *eStandardError_class;
+ struct RObject *nomem_err; /* pre-allocated NoMemoryError */
+
+ void *ud; /* auxiliary data */
+
+#ifdef MRB_FIXED_STATE_ATEXIT_STACK
+ mrb_atexit_func atexit_stack[MRB_FIXED_STATE_ATEXIT_STACK_SIZE];
+#else
+ mrb_atexit_func *atexit_stack;
+#endif
+ mrb_int atexit_stack_len;
+} mrb_state;
+
+#if __STDC_VERSION__ >= 201112L
+# define mrb_noreturn _Noreturn
+#elif defined __GNUC__ && !defined __STRICT_ANSI__
+# define mrb_noreturn __attribute__((noreturn))
+#elif defined _MSC_VER
+# define mrb_noreturn __declspec(noreturn)
+#else
+# define mrb_noreturn
+#endif
+
+typedef mrb_value (*mrb_func_t)(mrb_state *mrb, mrb_value);
+MRB_API struct RClass *mrb_define_class(mrb_state *, const char*, struct RClass*);
+MRB_API struct RClass *mrb_define_module(mrb_state *, const char*);
+MRB_API mrb_value mrb_singleton_class(mrb_state*, mrb_value);
+MRB_API void mrb_include_module(mrb_state*, struct RClass*, struct RClass*);
+
+MRB_API void mrb_define_method(mrb_state*, struct RClass*, const char*, mrb_func_t, mrb_aspec);
+MRB_API void mrb_define_class_method(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec);
+MRB_API void mrb_define_singleton_method(mrb_state*, struct RObject*, const char*, mrb_func_t, mrb_aspec);
+MRB_API void mrb_define_module_function(mrb_state*, struct RClass*, const char*, mrb_func_t, mrb_aspec);
+MRB_API void mrb_define_const(mrb_state*, struct RClass*, const char *name, mrb_value);
+MRB_API void mrb_undef_method(mrb_state*, struct RClass*, const char*);
+MRB_API void mrb_undef_class_method(mrb_state*, struct RClass*, const char*);
+MRB_API mrb_value mrb_obj_new(mrb_state *mrb, struct RClass *c, mrb_int argc, const mrb_value *argv);
+#define mrb_class_new_instance(mrb,argc,argv,c) mrb_obj_new(mrb,c,argc,argv)
+MRB_API mrb_value mrb_instance_new(mrb_state *mrb, mrb_value cv);
+MRB_API struct RClass * mrb_class_new(mrb_state *mrb, struct RClass *super);
+MRB_API struct RClass * mrb_module_new(mrb_state *mrb);
+MRB_API mrb_bool mrb_class_defined(mrb_state *mrb, const char *name);
+MRB_API struct RClass * mrb_class_get(mrb_state *mrb, const char *name);
+MRB_API struct RClass * mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name);
+MRB_API struct RClass * mrb_module_get(mrb_state *mrb, const char *name);
+MRB_API struct RClass * mrb_module_get_under(mrb_state *mrb, struct RClass *outer, const char *name);
+MRB_API mrb_value mrb_notimplement_m(mrb_state*, mrb_value);
+
+MRB_API mrb_value mrb_obj_dup(mrb_state *mrb, mrb_value obj);
+MRB_API mrb_value mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method);
+MRB_API mrb_bool mrb_obj_respond_to(mrb_state *mrb, struct RClass* c, mrb_sym mid);
+MRB_API struct RClass * mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super);
+MRB_API struct RClass * mrb_define_module_under(mrb_state *mrb, struct RClass *outer, const char *name);
+
+/* required arguments */
+#define MRB_ARGS_REQ(n) ((mrb_aspec)((n)&0x1f) << 18)
+/* optional arguments */
+#define MRB_ARGS_OPT(n) ((mrb_aspec)((n)&0x1f) << 13)
+/* mandatory and optinal arguments */
+#define MRB_ARGS_ARG(n1,n2) (MRB_ARGS_REQ(n1)|MRB_ARGS_OPT(n2))
+
+/* rest argument */
+#define MRB_ARGS_REST() ((mrb_aspec)(1 << 12))
+/* required arguments after rest */
+#define MRB_ARGS_POST(n) ((mrb_aspec)((n)&0x1f) << 7)
+/* keyword arguments (n of keys, kdict) */
+#define MRB_ARGS_KEY(n1,n2) ((mrb_aspec)((((n1)&0x1f) << 2) | ((n2)?(1<<1):0)))
+/* block argument */
+#define MRB_ARGS_BLOCK() ((mrb_aspec)1)
+
+/* accept any number of arguments */
+#define MRB_ARGS_ANY() MRB_ARGS_REST()
+/* accept no arguments */
+#define MRB_ARGS_NONE() ((mrb_aspec)0)
+
+/* compatibility macros; will be removed */
+#define ARGS_REQ(n) MRB_ARGS_REQ(n)
+#define ARGS_OPT(n) MRB_ARGS_OPT(n)
+#define ARGS_REST() MRB_ARGS_REST()
+#define ARGS_POST(n) MRB_ARGS_POST()
+#define ARGS_KEY(n1,n2) MRB_ARGS_KEY(n1,n2)
+#define ARGS_BLOCK() MRB_ARGS_BLOCK()
+#define ARGS_ANY() MRB_ARGS_ANY()
+#define ARGS_NONE() MRB_ARGS_NONE()
+
+MRB_API mrb_int mrb_get_args(mrb_state *mrb, const char *format, ...);
+
+/* `strlen` for character string literals (use with caution or `strlen` instead)
+ Adjacent string literals are concatenated in C/C++ in translation phase 6.
+ If `lit` is not one, the compiler will report a syntax error:
+ MSVC: "error C2143: syntax error : missing ')' before 'string'"
+ GCC: "error: expected ')' before string constant"
+*/
+#define mrb_strlen_lit(lit) (sizeof(lit "") - 1)
+
+MRB_API mrb_value mrb_funcall(mrb_state*, mrb_value, const char*, mrb_int,...);
+MRB_API mrb_value mrb_funcall_argv(mrb_state*, mrb_value, mrb_sym, mrb_int, const mrb_value*);
+MRB_API mrb_value mrb_funcall_with_block(mrb_state*, mrb_value, mrb_sym, mrb_int, const mrb_value*, mrb_value);
+MRB_API mrb_sym mrb_intern_cstr(mrb_state*,const char*);
+MRB_API mrb_sym mrb_intern(mrb_state*,const char*,size_t);
+MRB_API mrb_sym mrb_intern_static(mrb_state*,const char*,size_t);
+#define mrb_intern_lit(mrb, lit) mrb_intern_static(mrb, lit, mrb_strlen_lit(lit))
+MRB_API mrb_sym mrb_intern_str(mrb_state*,mrb_value);
+MRB_API mrb_value mrb_check_intern_cstr(mrb_state*,const char*);
+MRB_API mrb_value mrb_check_intern(mrb_state*,const char*,size_t);
+MRB_API mrb_value mrb_check_intern_str(mrb_state*,mrb_value);
+MRB_API const char *mrb_sym2name(mrb_state*,mrb_sym);
+MRB_API const char *mrb_sym2name_len(mrb_state*,mrb_sym,mrb_int*);
+MRB_API mrb_value mrb_sym2str(mrb_state*,mrb_sym);
+
+MRB_API void *mrb_malloc(mrb_state*, size_t); /* raise RuntimeError if no mem */
+MRB_API void *mrb_calloc(mrb_state*, size_t, size_t); /* ditto */
+MRB_API void *mrb_realloc(mrb_state*, void*, size_t); /* ditto */
+MRB_API void *mrb_realloc_simple(mrb_state*, void*, size_t); /* return NULL if no memory available */
+MRB_API void *mrb_malloc_simple(mrb_state*, size_t); /* return NULL if no memory available */
+MRB_API struct RBasic *mrb_obj_alloc(mrb_state*, enum mrb_vtype, struct RClass*);
+MRB_API void mrb_free(mrb_state*, void*);
+
+MRB_API mrb_value mrb_str_new(mrb_state *mrb, const char *p, size_t len);
+MRB_API mrb_value mrb_str_new_cstr(mrb_state*, const char*);
+MRB_API mrb_value mrb_str_new_static(mrb_state *mrb, const char *p, size_t len);
+#define mrb_str_new_lit(mrb, lit) mrb_str_new_static(mrb, (lit), mrb_strlen_lit(lit))
+
+MRB_API mrb_state* mrb_open(void);
+MRB_API mrb_state* mrb_open_allocf(mrb_allocf, void *ud);
+MRB_API mrb_state* mrb_open_core(mrb_allocf, void *ud);
+MRB_API void mrb_close(mrb_state*);
+
+MRB_API void* mrb_default_allocf(mrb_state*, void*, size_t, void*);
+
+MRB_API mrb_value mrb_top_self(mrb_state *);
+MRB_API mrb_value mrb_run(mrb_state*, struct RProc*, mrb_value);
+MRB_API mrb_value mrb_toplevel_run(mrb_state*, struct RProc*);
+MRB_API mrb_value mrb_context_run(mrb_state*, struct RProc*, mrb_value, unsigned int);
+
+MRB_API void mrb_p(mrb_state*, mrb_value);
+MRB_API mrb_int mrb_obj_id(mrb_value obj);
+MRB_API mrb_sym mrb_obj_to_sym(mrb_state *mrb, mrb_value name);
+
+MRB_API mrb_bool mrb_obj_eq(mrb_state*, mrb_value, mrb_value);
+MRB_API mrb_bool mrb_obj_equal(mrb_state*, mrb_value, mrb_value);
+MRB_API mrb_bool mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2);
+MRB_API mrb_value mrb_convert_to_integer(mrb_state *mrb, mrb_value val, int base);
+MRB_API mrb_value mrb_Integer(mrb_state *mrb, mrb_value val);
+MRB_API mrb_value mrb_Float(mrb_state *mrb, mrb_value val);
+MRB_API mrb_value mrb_inspect(mrb_state *mrb, mrb_value obj);
+MRB_API mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2);
+
+MRB_API void mrb_garbage_collect(mrb_state*);
+MRB_API void mrb_full_gc(mrb_state*);
+MRB_API void mrb_incremental_gc(mrb_state *);
+MRB_API int mrb_gc_arena_save(mrb_state*);
+MRB_API void mrb_gc_arena_restore(mrb_state*,int);
+MRB_API void mrb_gc_mark(mrb_state*,struct RBasic*);
+#define mrb_gc_mark_value(mrb,val) do {\
+ if (!mrb_immediate_p(val)) mrb_gc_mark((mrb), mrb_basic_ptr(val)); \
+} while (0)
+MRB_API void mrb_field_write_barrier(mrb_state *, struct RBasic*, struct RBasic*);
+#define mrb_field_write_barrier_value(mrb, obj, val) do{\
+ if (!mrb_immediate_p(val)) mrb_field_write_barrier((mrb), (obj), mrb_basic_ptr(val)); \
+} while (0)
+MRB_API void mrb_write_barrier(mrb_state *, struct RBasic*);
+
+MRB_API mrb_value mrb_check_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method);
+MRB_API mrb_value mrb_any_to_s(mrb_state *mrb, mrb_value obj);
+MRB_API const char * mrb_obj_classname(mrb_state *mrb, mrb_value obj);
+MRB_API struct RClass* mrb_obj_class(mrb_state *mrb, mrb_value obj);
+MRB_API mrb_value mrb_class_path(mrb_state *mrb, struct RClass *c);
+MRB_API mrb_value mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method);
+MRB_API mrb_bool mrb_obj_is_kind_of(mrb_state *mrb, mrb_value obj, struct RClass *c);
+MRB_API mrb_value mrb_obj_inspect(mrb_state *mrb, mrb_value self);
+MRB_API mrb_value mrb_obj_clone(mrb_state *mrb, mrb_value self);
+
+/* need to include <ctype.h> to use these macros */
+#ifndef ISPRINT
+#define ISASCII(c) (!(((int)(unsigned char)(c)) & ~0x7f))
+#define ISPRINT(c) (ISASCII(c) && isprint((int)(unsigned char)(c)))
+#define ISSPACE(c) (ISASCII(c) && isspace((int)(unsigned char)(c)))
+#define ISUPPER(c) (ISASCII(c) && isupper((int)(unsigned char)(c)))
+#define ISLOWER(c) (ISASCII(c) && islower((int)(unsigned char)(c)))
+#define ISALNUM(c) (ISASCII(c) && isalnum((int)(unsigned char)(c)))
+#define ISALPHA(c) (ISASCII(c) && isalpha((int)(unsigned char)(c)))
+#define ISDIGIT(c) (ISASCII(c) && isdigit((int)(unsigned char)(c)))
+#define ISXDIGIT(c) (ISASCII(c) && isxdigit((int)(unsigned char)(c)))
+#define ISBLANK(c) (ISASCII(c) && isblank((int)(unsigned char)(c)))
+#define ISCNTRL(c) (ISASCII(c) && iscntrl((int)(unsigned char)(c)))
+#define TOUPPER(c) (ISASCII(c) ? toupper((int)(unsigned char)(c)) : (c))
+#define TOLOWER(c) (ISASCII(c) ? tolower((int)(unsigned char)(c)) : (c))
+#endif
+
+MRB_API mrb_value mrb_exc_new(mrb_state *mrb, struct RClass *c, const char *ptr, long len);
+MRB_API mrb_noreturn void mrb_exc_raise(mrb_state *mrb, mrb_value exc);
+
+MRB_API mrb_noreturn void mrb_raise(mrb_state *mrb, struct RClass *c, const char *msg);
+MRB_API mrb_noreturn void mrb_raisef(mrb_state *mrb, struct RClass *c, const char *fmt, ...);
+MRB_API mrb_noreturn void mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...);
+MRB_API void mrb_warn(mrb_state *mrb, const char *fmt, ...);
+MRB_API mrb_noreturn void mrb_bug(mrb_state *mrb, const char *fmt, ...);
+MRB_API void mrb_print_backtrace(mrb_state *mrb);
+MRB_API void mrb_print_error(mrb_state *mrb);
+
+/* macros to get typical exception objects
+ note:
+ + those E_* macros requires mrb_state* variable named mrb.
+ + exception objects obtained from those macros are local to mrb
+*/
+#define E_RUNTIME_ERROR (mrb_class_get(mrb, "RuntimeError"))
+#define E_TYPE_ERROR (mrb_class_get(mrb, "TypeError"))
+#define E_ARGUMENT_ERROR (mrb_class_get(mrb, "ArgumentError"))
+#define E_INDEX_ERROR (mrb_class_get(mrb, "IndexError"))
+#define E_RANGE_ERROR (mrb_class_get(mrb, "RangeError"))
+#define E_NAME_ERROR (mrb_class_get(mrb, "NameError"))
+#define E_NOMETHOD_ERROR (mrb_class_get(mrb, "NoMethodError"))
+#define E_SCRIPT_ERROR (mrb_class_get(mrb, "ScriptError"))
+#define E_SYNTAX_ERROR (mrb_class_get(mrb, "SyntaxError"))
+#define E_LOCALJUMP_ERROR (mrb_class_get(mrb, "LocalJumpError"))
+#define E_REGEXP_ERROR (mrb_class_get(mrb, "RegexpError"))
+#define E_SYSSTACK_ERROR (mrb_class_get(mrb, "SystemStackError"))
+
+#define E_NOTIMP_ERROR (mrb_class_get(mrb, "NotImplementedError"))
+#define E_FLOATDOMAIN_ERROR (mrb_class_get(mrb, "FloatDomainError"))
+
+#define E_KEY_ERROR (mrb_class_get(mrb, "KeyError"))
+
+MRB_API mrb_value mrb_yield(mrb_state *mrb, mrb_value b, mrb_value arg);
+MRB_API mrb_value mrb_yield_argv(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value *argv);
+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);
+
+MRB_API void mrb_gc_protect(mrb_state *mrb, mrb_value obj);
+MRB_API mrb_value mrb_to_int(mrb_state *mrb, mrb_value val);
+#define mrb_int(mrb, val) mrb_fixnum(mrb_to_int(mrb, val))
+MRB_API void mrb_check_type(mrb_state *mrb, mrb_value x, enum mrb_vtype t);
+
+typedef enum call_type {
+ CALL_PUBLIC,
+ CALL_FCALL,
+ CALL_VCALL,
+ CALL_TYPE_MAX
+} call_type;
+
+MRB_API void mrb_define_alias(mrb_state *mrb, struct RClass *klass, const char *name1, const char *name2);
+MRB_API const char *mrb_class_name(mrb_state *mrb, struct RClass* klass);
+MRB_API void mrb_define_global_const(mrb_state *mrb, const char *name, mrb_value val);
+
+MRB_API mrb_value mrb_attr_get(mrb_state *mrb, mrb_value obj, mrb_sym id);
+
+MRB_API mrb_bool mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid);
+MRB_API mrb_bool mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c);
+
+/* fiber functions (you need to link mruby-fiber mrbgem to use) */
+MRB_API mrb_value mrb_fiber_yield(mrb_state *mrb, mrb_int argc, const mrb_value *argv);
+#define E_FIBER_ERROR (mrb_class_get(mrb, "FiberError"))
+
+/* memory pool implementation */
+typedef struct mrb_pool mrb_pool;
+MRB_API struct mrb_pool* mrb_pool_open(mrb_state*);
+MRB_API void mrb_pool_close(struct mrb_pool*);
+MRB_API void* mrb_pool_alloc(struct mrb_pool*, size_t);
+MRB_API void* mrb_pool_realloc(struct mrb_pool*, void*, size_t oldlen, size_t newlen);
+MRB_API mrb_bool mrb_pool_can_realloc(struct mrb_pool*, void*, size_t);
+MRB_API void* mrb_alloca(mrb_state *mrb, size_t);
+
+MRB_API void mrb_state_atexit(mrb_state *mrb, mrb_atexit_func func);
+
+#ifdef MRB_DEBUG
+#include <assert.h>
+#define mrb_assert(p) assert(p)
+#define mrb_assert_int_fit(t1,n,t2,max) assert((n)>=0 && ((sizeof(n)<=sizeof(t2))||(n<=(t1)(max))))
+#else
+#define mrb_assert(p) ((void)0)
+#define mrb_assert_int_fit(t1,n,t2,max) ((void)0)
+#endif
+
+#if __STDC_VERSION__ >= 201112L
+#define mrb_static_assert(exp, str) _Static_assert(exp, str)
+#else
+#define mrb_static_assert(exp, str) mrb_assert(exp)
+#endif
+
+MRB_API mrb_value mrb_format(mrb_state *mrb, const char *format, ...);
+
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
+#endif /* MRUBY_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/array.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,75 @@
+/*
+** mruby/array.h - Array class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_ARRAY_H
+#define MRUBY_ARRAY_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef struct mrb_shared_array {
+ int refcnt;
+ mrb_int len;
+ mrb_value *ptr;
+} mrb_shared_array;
+
+struct RArray {
+ MRB_OBJECT_HEADER;
+ mrb_int len;
+ union {
+ mrb_int capa;
+ mrb_shared_array *shared;
+ } aux;
+ mrb_value *ptr;
+};
+
+#define mrb_ary_ptr(v) ((struct RArray*)(mrb_ptr(v)))
+#define mrb_ary_value(p) mrb_obj_value((void*)(p))
+#define RARRAY(v) ((struct RArray*)(mrb_ptr(v)))
+
+#define RARRAY_LEN(a) (RARRAY(a)->len)
+#define RARRAY_PTR(a) ((const mrb_value*)RARRAY(a)->ptr)
+#define MRB_ARY_SHARED 256
+#define ARY_SHARED_P(a) ((a)->flags & MRB_ARY_SHARED)
+#define ARY_SET_SHARED_FLAG(a) ((a)->flags |= MRB_ARY_SHARED)
+#define ARY_UNSET_SHARED_FLAG(a) ((a)->flags &= ~MRB_ARY_SHARED)
+
+void mrb_ary_decref(mrb_state*, mrb_shared_array*);
+MRB_API void mrb_ary_modify(mrb_state*, struct RArray*);
+MRB_API mrb_value mrb_ary_new_capa(mrb_state*, mrb_int);
+MRB_API mrb_value mrb_ary_new(mrb_state *mrb);
+MRB_API mrb_value mrb_ary_new_from_values(mrb_state *mrb, mrb_int size, const mrb_value *vals);
+MRB_API mrb_value mrb_assoc_new(mrb_state *mrb, mrb_value car, mrb_value cdr);
+MRB_API void mrb_ary_concat(mrb_state*, mrb_value, mrb_value);
+MRB_API mrb_value mrb_ary_splat(mrb_state*, mrb_value);
+MRB_API void mrb_ary_push(mrb_state*, mrb_value, mrb_value);
+MRB_API mrb_value mrb_ary_pop(mrb_state *mrb, mrb_value ary);
+MRB_API mrb_value mrb_ary_ref(mrb_state *mrb, mrb_value ary, mrb_int n);
+MRB_API void mrb_ary_set(mrb_state *mrb, mrb_value ary, mrb_int n, mrb_value val);
+MRB_API void mrb_ary_replace(mrb_state *mrb, mrb_value a, mrb_value b);
+MRB_API mrb_value mrb_check_array_type(mrb_state *mrb, mrb_value self);
+MRB_API mrb_value mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item);
+MRB_API mrb_value mrb_ary_entry(mrb_value ary, mrb_int offset);
+MRB_API mrb_value mrb_ary_shift(mrb_state *mrb, mrb_value self);
+MRB_API mrb_value mrb_ary_clear(mrb_state *mrb, mrb_value self);
+MRB_API mrb_value mrb_ary_join(mrb_state *mrb, mrb_value ary, mrb_value sep);
+MRB_API mrb_value mrb_ary_resize(mrb_state *mrb, mrb_value ary, mrb_int len);
+
+static inline mrb_int
+mrb_ary_len(mrb_state *mrb, mrb_value ary)
+{
+ (void)mrb;
+ mrb_assert(mrb_array_p(ary));
+ return RARRAY_LEN(ary);
+}
+
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
+#endif /* MRUBY_ARRAY_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/boxing_nan.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,95 @@
+/*
+** mruby/boxing_nan.h - nan boxing mrb_value definition
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_BOXING_NAN_H
+#define MRUBY_BOXING_NAN_H
+
+#ifdef MRB_USE_FLOAT
+# error ---->> MRB_NAN_BOXING and MRB_USE_FLOAT conflict <<----
+#endif
+
+#ifdef MRB_INT64
+# error ---->> MRB_NAN_BOXING and MRB_INT64 conflict <<----
+#endif
+
+#define MRB_FIXNUM_SHIFT 0
+#define MRB_TT_HAS_BASIC MRB_TT_OBJECT
+
+#ifdef MRB_ENDIAN_BIG
+#define MRB_ENDIAN_LOHI(a,b) a b
+#else
+#define MRB_ENDIAN_LOHI(a,b) b a
+#endif
+
+/* value representation by nan-boxing:
+ * float : FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF
+ * object: 111111111111TTTT TTPPPPPPPPPPPPPP PPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPP
+ * int : 1111111111110001 0000000000000000 IIIIIIIIIIIIIIII IIIIIIIIIIIIIIII
+ * sym : 1111111111110001 0100000000000000 SSSSSSSSSSSSSSSS SSSSSSSSSSSSSSSS
+ * In order to get enough bit size to save TT, all pointers are shifted 2 bits
+ * in the right direction. Also, TTTTTT is the mrb_vtype + 1;
+ */
+typedef struct mrb_value {
+ union {
+ mrb_float f;
+ union {
+ void *p;
+ struct {
+ MRB_ENDIAN_LOHI(
+ uint32_t ttt;
+ ,union {
+ mrb_int i;
+ mrb_sym sym;
+ };
+ )
+ };
+ } value;
+ };
+} mrb_value;
+
+#define mrb_float_pool(mrb,f) mrb_float_value(mrb,f)
+
+#define mrb_tt(o) ((enum mrb_vtype)(((o).value.ttt & 0xfc000)>>14)-1)
+#define mrb_type(o) ((uint32_t)0xfff00000 < (o).value.ttt ? mrb_tt(o) : MRB_TT_FLOAT)
+#define mrb_ptr(o) ((void*)((((uintptr_t)0x3fffffffffff)&((uintptr_t)((o).value.p)))<<2))
+#define mrb_float(o) (o).f
+#define mrb_cptr(o) mrb_ptr(o)
+#define mrb_fixnum(o) (o).value.i
+#define mrb_symbol(o) (o).value.sym
+
+#define BOXNAN_SET_VALUE(o, tt, attr, v) do {\
+ (o).value.ttt = (0xfff00000|(((tt)+1)<<14));\
+ switch (tt) {\
+ case MRB_TT_FALSE:\
+ case MRB_TT_TRUE:\
+ case MRB_TT_UNDEF:\
+ case MRB_TT_FIXNUM:\
+ case MRB_TT_SYMBOL: (o).attr = (v); break;\
+ default: (o).value.i = 0; (o).value.p = (void*)((uintptr_t)(o).value.p | (((uintptr_t)(v))>>2)); break;\
+ }\
+} while (0)
+
+#define SET_FLOAT_VALUE(mrb,r,v) do { \
+ if (v != v) { \
+ (r).value.ttt = 0x7ff80000; \
+ (r).value.i = 0; \
+ } else { \
+ (r).f = v; \
+ }} while(0)
+
+#define SET_NIL_VALUE(r) BOXNAN_SET_VALUE(r, MRB_TT_FALSE, value.i, 0)
+#define SET_FALSE_VALUE(r) BOXNAN_SET_VALUE(r, MRB_TT_FALSE, value.i, 1)
+#define SET_TRUE_VALUE(r) BOXNAN_SET_VALUE(r, MRB_TT_TRUE, value.i, 1)
+#define SET_BOOL_VALUE(r,b) BOXNAN_SET_VALUE(r, b ? MRB_TT_TRUE : MRB_TT_FALSE, value.i, 1)
+#define SET_INT_VALUE(r,n) BOXNAN_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n))
+#define SET_SYM_VALUE(r,v) BOXNAN_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v))
+#define SET_OBJ_VALUE(r,v) BOXNAN_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v))
+#define SET_PROC_VALUE(r,v) BOXNAN_SET_VALUE(r, MRB_TT_PROC, value.p, v)
+#define SET_CPTR_VALUE(mrb,r,v) BOXNAN_SET_VALUE(r, MRB_TT_CPTR, value.p, v)
+#define SET_UNDEF_VALUE(r) BOXNAN_SET_VALUE(r, MRB_TT_UNDEF, value.i, 0)
+
+#endif /* MRUBY_BOXING_NAN_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/boxing_no.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,50 @@
+/*
+** mruby/boxing_no.h - unboxed mrb_value definition
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_BOXING_NO_H
+#define MRUBY_BOXING_NO_H
+
+#define MRB_FIXNUM_SHIFT 0
+#define MRB_TT_HAS_BASIC MRB_TT_OBJECT
+
+typedef struct mrb_value {
+ union {
+ mrb_float f;
+ void *p;
+ mrb_int i;
+ mrb_sym sym;
+ } value;
+ enum mrb_vtype tt;
+} mrb_value;
+
+#define mrb_float_pool(mrb,f) mrb_float_value(mrb,f)
+
+#define mrb_ptr(o) (o).value.p
+#define mrb_cptr(o) mrb_ptr(o)
+#define mrb_float(o) (o).value.f
+#define mrb_fixnum(o) (o).value.i
+#define mrb_symbol(o) (o).value.sym
+#define mrb_type(o) (o).tt
+
+#define BOXNIX_SET_VALUE(o, ttt, attr, v) do {\
+ (o).tt = ttt;\
+ (o).attr = v;\
+} while (0)
+
+#define SET_NIL_VALUE(r) BOXNIX_SET_VALUE(r, MRB_TT_FALSE, value.i, 0)
+#define SET_FALSE_VALUE(r) BOXNIX_SET_VALUE(r, MRB_TT_FALSE, value.i, 1)
+#define SET_TRUE_VALUE(r) BOXNIX_SET_VALUE(r, MRB_TT_TRUE, value.i, 1)
+#define SET_BOOL_VALUE(r,b) BOXNIX_SET_VALUE(r, b ? MRB_TT_TRUE : MRB_TT_FALSE, value.i, 1)
+#define SET_INT_VALUE(r,n) BOXNIX_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n))
+#define SET_FLOAT_VALUE(mrb,r,v) BOXNIX_SET_VALUE(r, MRB_TT_FLOAT, value.f, (v))
+#define SET_SYM_VALUE(r,v) BOXNIX_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v))
+#define SET_OBJ_VALUE(r,v) BOXNIX_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v))
+#define SET_PROC_VALUE(r,v) BOXNIX_SET_VALUE(r, MRB_TT_PROC, value.p, v)
+#define SET_CPTR_VALUE(mrb,r,v) BOXNIX_SET_VALUE(r, MRB_TT_CPTR, value.p, v)
+#define SET_UNDEF_VALUE(r) BOXNIX_SET_VALUE(r, MRB_TT_UNDEF, value.i, 0)
+
+#endif /* MRUBY_BOXING_NO_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/boxing_word.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,120 @@
+/*
+** mruby/boxing_word.h - word boxing mrb_value definition
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_BOXING_WORD_H
+#define MRUBY_BOXING_WORD_H
+
+#if defined(MRB_INT16)
+# error MRB_INT16 is too small for MRB_WORD_BOXING.
+#endif
+
+struct RFloat {
+ MRB_OBJECT_HEADER;
+ mrb_float f;
+};
+
+struct RCptr {
+ MRB_OBJECT_HEADER;
+ void *p;
+};
+
+#define MRB_FIXNUM_SHIFT 1
+#define MRB_TT_HAS_BASIC MRB_TT_FLOAT
+
+enum mrb_special_consts {
+ MRB_Qnil = 0,
+ MRB_Qfalse = 2,
+ MRB_Qtrue = 4,
+ MRB_Qundef = 6,
+};
+
+#define MRB_FIXNUM_FLAG 0x01
+#define MRB_SYMBOL_FLAG 0x0e
+#define MRB_SPECIAL_SHIFT 8
+
+typedef union mrb_value {
+ union {
+ void *p;
+ struct {
+ unsigned int i_flag : MRB_FIXNUM_SHIFT;
+ mrb_int i : (MRB_INT_BIT - MRB_FIXNUM_SHIFT);
+ };
+ struct {
+ unsigned int sym_flag : MRB_SPECIAL_SHIFT;
+ mrb_sym sym : (sizeof(mrb_sym) * CHAR_BIT);
+ };
+ struct RBasic *bp;
+ struct RFloat *fp;
+ struct RCptr *vp;
+ } value;
+ unsigned long w;
+} mrb_value;
+
+MRB_API mrb_value mrb_word_boxing_cptr_value(struct mrb_state*, void*);
+MRB_API mrb_value mrb_word_boxing_float_value(struct mrb_state*, mrb_float);
+MRB_API mrb_value mrb_word_boxing_float_pool(struct mrb_state*, mrb_float);
+
+#define mrb_float_pool(mrb,f) mrb_word_boxing_float_pool(mrb,f)
+
+#define mrb_ptr(o) (o).value.p
+#define mrb_cptr(o) (o).value.vp->p
+#define mrb_float(o) (o).value.fp->f
+#define mrb_fixnum(o) (o).value.i
+#define mrb_symbol(o) (o).value.sym
+
+static inline enum mrb_vtype
+mrb_type(mrb_value o)
+{
+ switch (o.w) {
+ case MRB_Qfalse:
+ case MRB_Qnil:
+ return MRB_TT_FALSE;
+ case MRB_Qtrue:
+ return MRB_TT_TRUE;
+ case MRB_Qundef:
+ return MRB_TT_UNDEF;
+ }
+ if (o.value.i_flag == MRB_FIXNUM_FLAG) {
+ return MRB_TT_FIXNUM;
+ }
+ if (o.value.sym_flag == MRB_SYMBOL_FLAG) {
+ return MRB_TT_SYMBOL;
+ }
+ return o.value.bp->tt;
+}
+
+#define mrb_bool(o) ((o).w != MRB_Qnil && (o).w != MRB_Qfalse)
+#define mrb_fixnum_p(o) ((o).value.i_flag == MRB_FIXNUM_FLAG)
+#define mrb_undef_p(o) ((o).w == MRB_Qundef)
+#define mrb_nil_p(o) ((o).w == MRB_Qnil)
+
+#define BOXWORD_SET_VALUE(o, ttt, attr, v) do {\
+ (o).w = 0;\
+ (o).attr = (v);\
+ switch (ttt) {\
+ case MRB_TT_FALSE: (o).w = (v) ? MRB_Qfalse : MRB_Qnil; break;\
+ case MRB_TT_TRUE: (o).w = MRB_Qtrue; break;\
+ case MRB_TT_UNDEF: (o).w = MRB_Qundef; break;\
+ case MRB_TT_FIXNUM: (o).value.i_flag = MRB_FIXNUM_FLAG; break;\
+ case MRB_TT_SYMBOL: (o).value.sym_flag = MRB_SYMBOL_FLAG; break;\
+ default: if ((o).value.bp) (o).value.bp->tt = ttt; break;\
+ }\
+} while (0)
+
+#define SET_FLOAT_VALUE(mrb,r,v) r = mrb_word_boxing_float_value(mrb, v)
+#define SET_CPTR_VALUE(mrb,r,v) r = mrb_word_boxing_cptr_value(mrb, v)
+#define SET_NIL_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_FALSE, value.i, 0)
+#define SET_FALSE_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_FALSE, value.i, 1)
+#define SET_TRUE_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_TRUE, value.i, 1)
+#define SET_BOOL_VALUE(r,b) BOXWORD_SET_VALUE(r, b ? MRB_TT_TRUE : MRB_TT_FALSE, value.i, 1)
+#define SET_INT_VALUE(r,n) BOXWORD_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n))
+#define SET_SYM_VALUE(r,v) BOXWORD_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v))
+#define SET_OBJ_VALUE(r,v) BOXWORD_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v))
+#define SET_PROC_VALUE(r,v) BOXWORD_SET_VALUE(r, MRB_TT_PROC, value.p, v)
+#define SET_UNDEF_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_UNDEF, value.i, 0)
+
+#endif /* MRUBY_BOXING_WORD_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/class.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,78 @@
+/*
+** mruby/class.h - Class class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_CLASS_H
+#define MRUBY_CLASS_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+struct RClass {
+ MRB_OBJECT_HEADER;
+ struct iv_tbl *iv;
+ struct kh_mt *mt;
+ struct RClass *super;
+};
+
+#define mrb_class_ptr(v) ((struct RClass*)(mrb_ptr(v)))
+#define RCLASS_SUPER(v) (((struct RClass*)(mrb_ptr(v)))->super)
+#define RCLASS_IV_TBL(v) (((struct RClass*)(mrb_ptr(v)))->iv)
+#define RCLASS_M_TBL(v) (((struct RClass*)(mrb_ptr(v)))->mt)
+
+static inline struct RClass*
+mrb_class(mrb_state *mrb, mrb_value v)
+{
+ switch (mrb_type(v)) {
+ case MRB_TT_FALSE:
+ if (mrb_fixnum(v))
+ return mrb->false_class;
+ return mrb->nil_class;
+ case MRB_TT_TRUE:
+ return mrb->true_class;
+ case MRB_TT_SYMBOL:
+ return mrb->symbol_class;
+ case MRB_TT_FIXNUM:
+ return mrb->fixnum_class;
+ case MRB_TT_FLOAT:
+ return mrb->float_class;
+ case MRB_TT_CPTR:
+ return mrb->object_class;
+ case MRB_TT_ENV:
+ return NULL;
+ default:
+ return mrb_obj_ptr(v)->c;
+ }
+}
+
+#define MRB_SET_INSTANCE_TT(c, tt) c->flags = ((c->flags & ~0xff) | (char)tt)
+#define MRB_INSTANCE_TT(c) (enum mrb_vtype)(c->flags & 0xff)
+
+MRB_API struct RClass* mrb_define_class_id(mrb_state*, mrb_sym, struct RClass*);
+MRB_API struct RClass* mrb_define_module_id(mrb_state*, mrb_sym);
+MRB_API struct RClass *mrb_vm_define_class(mrb_state*, mrb_value, mrb_value, mrb_sym);
+MRB_API struct RClass *mrb_vm_define_module(mrb_state*, mrb_value, mrb_sym);
+MRB_API void mrb_define_method_vm(mrb_state*, struct RClass*, mrb_sym, mrb_value);
+MRB_API void mrb_define_method_raw(mrb_state*, struct RClass*, mrb_sym, struct RProc *);
+MRB_API void mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, mrb_aspec aspec);
+MRB_API void mrb_alias_method(mrb_state *mrb, struct RClass *c, mrb_sym a, mrb_sym b);
+
+MRB_API struct RClass *mrb_class_outer_module(mrb_state*, struct RClass *);
+MRB_API struct RProc *mrb_method_search_vm(mrb_state*, struct RClass**, mrb_sym);
+MRB_API struct RProc *mrb_method_search(mrb_state*, struct RClass*, mrb_sym);
+
+MRB_API struct RClass* mrb_class_real(struct RClass* cl);
+
+void mrb_gc_mark_mt(mrb_state*, struct RClass*);
+size_t mrb_gc_mark_mt_size(mrb_state*, struct RClass*);
+void mrb_gc_free_mt(mrb_state*, struct RClass*);
+
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
+#endif /* MRUBY_CLASS_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/compile.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,191 @@
+/*
+** mruby/compile.h - mruby parser
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_COMPILE_H
+#define MRUBY_COMPILE_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#include "mruby.h"
+
+struct mrb_jmpbuf;
+
+struct mrb_parser_state;
+/* load context */
+typedef struct mrbc_context {
+ mrb_sym *syms;
+ int slen;
+ char *filename;
+ short lineno;
+ int (*partial_hook)(struct mrb_parser_state*);
+ void *partial_data;
+ struct RClass *target_class;
+ mrb_bool capture_errors:1;
+ mrb_bool dump_result:1;
+ mrb_bool no_exec:1;
+ mrb_bool keep_lv:1;
+ mrb_bool no_optimize:1;
+} mrbc_context;
+
+MRB_API mrbc_context* mrbc_context_new(mrb_state *mrb);
+MRB_API void mrbc_context_free(mrb_state *mrb, mrbc_context *cxt);
+MRB_API const char *mrbc_filename(mrb_state *mrb, mrbc_context *c, const char *s);
+MRB_API void mrbc_partial_hook(mrb_state *mrb, mrbc_context *c, int (*partial_hook)(struct mrb_parser_state*), void*data);
+
+MRB_API mrb_value mrb_toplevel_run_keep(mrb_state*, struct RProc*, unsigned int);
+
+/* AST node structure */
+typedef struct mrb_ast_node {
+ struct mrb_ast_node *car, *cdr;
+ uint16_t lineno, filename_index;
+} mrb_ast_node;
+
+/* lexer states */
+enum mrb_lex_state_enum {
+ EXPR_BEG, /* ignore newline, +/- is a sign. */
+ EXPR_END, /* newline significant, +/- is an operator. */
+ EXPR_ENDARG, /* ditto, and unbound braces. */
+ EXPR_ENDFN, /* ditto, and unbound braces. */
+ EXPR_ARG, /* newline significant, +/- is an operator. */
+ EXPR_CMDARG, /* newline significant, +/- is an operator. */
+ EXPR_MID, /* newline significant, +/- is an operator. */
+ EXPR_FNAME, /* ignore newline, no reserved words. */
+ EXPR_DOT, /* right after `.' or `::', no reserved words. */
+ EXPR_CLASS, /* immediate after `class', no here document. */
+ EXPR_VALUE, /* alike EXPR_BEG but label is disallowed. */
+ EXPR_MAX_STATE
+};
+
+/* saved error message */
+struct mrb_parser_message {
+ int lineno;
+ int column;
+ char* message;
+};
+
+#define STR_FUNC_PARSING 0x01
+#define STR_FUNC_EXPAND 0x02
+#define STR_FUNC_REGEXP 0x04
+#define STR_FUNC_WORD 0x08
+#define STR_FUNC_SYMBOL 0x10
+#define STR_FUNC_ARRAY 0x20
+#define STR_FUNC_HEREDOC 0x40
+#define STR_FUNC_XQUOTE 0x80
+
+enum mrb_string_type {
+ str_not_parsing = (0),
+ str_squote = (STR_FUNC_PARSING),
+ str_dquote = (STR_FUNC_PARSING|STR_FUNC_EXPAND),
+ str_regexp = (STR_FUNC_PARSING|STR_FUNC_REGEXP|STR_FUNC_EXPAND),
+ str_sword = (STR_FUNC_PARSING|STR_FUNC_WORD|STR_FUNC_ARRAY),
+ str_dword = (STR_FUNC_PARSING|STR_FUNC_WORD|STR_FUNC_ARRAY|STR_FUNC_EXPAND),
+ str_ssym = (STR_FUNC_PARSING|STR_FUNC_SYMBOL),
+ str_ssymbols = (STR_FUNC_PARSING|STR_FUNC_SYMBOL|STR_FUNC_ARRAY),
+ str_dsymbols = (STR_FUNC_PARSING|STR_FUNC_SYMBOL|STR_FUNC_ARRAY|STR_FUNC_EXPAND),
+ str_heredoc = (STR_FUNC_PARSING|STR_FUNC_HEREDOC),
+ str_xquote = (STR_FUNC_PARSING|STR_FUNC_XQUOTE|STR_FUNC_EXPAND),
+};
+
+/* heredoc structure */
+struct mrb_parser_heredoc_info {
+ mrb_bool allow_indent:1;
+ mrb_bool line_head:1;
+ enum mrb_string_type type;
+ const char *term;
+ int term_len;
+ mrb_ast_node *doc;
+};
+
+#define MRB_PARSER_BUF_SIZE 1024
+
+/* parser structure */
+struct mrb_parser_state {
+ mrb_state *mrb;
+ struct mrb_pool *pool;
+ mrb_ast_node *cells;
+ const char *s, *send;
+#ifdef ENABLE_STDIO
+ FILE *f;
+#endif
+ mrbc_context *cxt;
+ char const *filename;
+ int lineno;
+ int column;
+
+ enum mrb_lex_state_enum lstate;
+ mrb_ast_node *lex_strterm; /* (type nest_level beg . end) */
+
+ unsigned int cond_stack;
+ unsigned int cmdarg_stack;
+ int paren_nest;
+ int lpar_beg;
+ int in_def, in_single;
+ mrb_bool cmd_start:1;
+ mrb_ast_node *locals;
+
+ mrb_ast_node *pb;
+ char buf[MRB_PARSER_BUF_SIZE];
+ int bidx;
+
+ mrb_ast_node *all_heredocs; /* list of mrb_parser_heredoc_info* */
+ mrb_ast_node *heredocs_from_nextline;
+ mrb_ast_node *parsing_heredoc;
+ mrb_ast_node *lex_strterm_before_heredoc;
+ mrb_bool heredoc_end_now:1; /* for mirb */
+
+ void *ylval;
+
+ size_t nerr;
+ size_t nwarn;
+ mrb_ast_node *tree;
+
+ mrb_bool no_optimize:1;
+ mrb_bool capture_errors:1;
+ struct mrb_parser_message error_buffer[10];
+ struct mrb_parser_message warn_buffer[10];
+
+ mrb_sym* filename_table;
+ size_t filename_table_length;
+ int current_filename_index;
+
+ struct mrb_jmpbuf* jmp;
+};
+
+MRB_API struct mrb_parser_state* mrb_parser_new(mrb_state*);
+MRB_API void mrb_parser_free(struct mrb_parser_state*);
+MRB_API void mrb_parser_parse(struct mrb_parser_state*,mrbc_context*);
+
+MRB_API void mrb_parser_set_filename(struct mrb_parser_state*, char const*);
+MRB_API char const* mrb_parser_get_filename(struct mrb_parser_state*, uint16_t idx);
+
+/* utility functions */
+#ifdef ENABLE_STDIO
+MRB_API struct mrb_parser_state* mrb_parse_file(mrb_state*,FILE*,mrbc_context*);
+#endif
+MRB_API struct mrb_parser_state* mrb_parse_string(mrb_state*,const char*,mrbc_context*);
+MRB_API struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,int,mrbc_context*);
+MRB_API struct RProc* mrb_generate_code(mrb_state*, struct mrb_parser_state*);
+
+/* program load functions */
+#ifdef ENABLE_STDIO
+MRB_API mrb_value mrb_load_file(mrb_state*,FILE*);
+#endif
+MRB_API mrb_value mrb_load_string(mrb_state *mrb, const char *s);
+MRB_API mrb_value mrb_load_nstring(mrb_state *mrb, const char *s, int len);
+#ifdef ENABLE_STDIO
+MRB_API mrb_value mrb_load_file_cxt(mrb_state*,FILE*, mrbc_context *cxt);
+#endif
+MRB_API mrb_value mrb_load_string_cxt(mrb_state *mrb, const char *s, mrbc_context *cxt);
+MRB_API mrb_value mrb_load_nstring_cxt(mrb_state *mrb, const char *s, int len, mrbc_context *cxt);
+
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
+#endif /* MRUBY_COMPILE_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/data.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,67 @@
+/*
+** mruby/data.h - Data class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_DATA_H
+#define MRUBY_DATA_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef struct mrb_data_type {
+ const char *struct_name;
+ void (*dfree)(mrb_state *mrb, void*);
+} mrb_data_type;
+
+struct RData {
+ MRB_OBJECT_HEADER;
+ struct iv_tbl *iv;
+ const mrb_data_type *type;
+ void *data;
+};
+
+MRB_API struct RData *mrb_data_object_alloc(mrb_state *mrb, struct RClass* klass, void *datap, const mrb_data_type *type);
+
+#define Data_Wrap_Struct(mrb,klass,type,ptr)\
+ mrb_data_object_alloc(mrb,klass,ptr,type)
+
+#define Data_Make_Struct(mrb,klass,strct,type,sval,data) do { \
+ sval = mrb_malloc(mrb, sizeof(strct)); \
+ { static const strct zero = { 0 }; *sval = zero; };\
+ data = Data_Wrap_Struct(mrb,klass,type,sval);\
+} while (0)
+
+#define RDATA(obj) ((struct RData *)(mrb_ptr(obj)))
+#define DATA_PTR(d) (RDATA(d)->data)
+#define DATA_TYPE(d) (RDATA(d)->type)
+MRB_API void mrb_data_check_type(mrb_state *mrb, mrb_value, const mrb_data_type*);
+MRB_API void *mrb_data_get_ptr(mrb_state *mrb, mrb_value, const mrb_data_type*);
+#define DATA_GET_PTR(mrb,obj,dtype,type) (type*)mrb_data_get_ptr(mrb,obj,dtype)
+MRB_API void *mrb_data_check_get_ptr(mrb_state *mrb, mrb_value, const mrb_data_type*);
+#define DATA_CHECK_GET_PTR(mrb,obj,dtype,type) (type*)mrb_data_check_get_ptr(mrb,obj,dtype)
+
+/* obsolete functions and macros */
+#define mrb_data_check_and_get(mrb,obj,dtype) mrb_data_get_ptr(mrb,obj,dtype)
+#define mrb_get_datatype(mrb,val,type) mrb_data_get_ptr(mrb, val, type)
+#define mrb_check_datatype(mrb,val,type) mrb_data_get_ptr(mrb, val, type)
+#define Data_Get_Struct(mrb,obj,type,sval) do {\
+ *(void**)&sval = mrb_data_get_ptr(mrb, obj, type); \
+} while (0)
+
+static inline void
+mrb_data_init(mrb_value v, void *ptr, const mrb_data_type *type)
+{
+ mrb_assert(mrb_type(v) == MRB_TT_DATA);
+ DATA_PTR(v) = ptr;
+ DATA_TYPE(v) = type;
+}
+
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
+#endif /* MRUBY_DATA_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/debug.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,66 @@
+/*
+** mruby/debug.h - mruby debug info
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_DEBUG_H
+#define MRUBY_DEBUG_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef enum mrb_debug_line_type {
+ mrb_debug_line_ary = 0,
+ mrb_debug_line_flat_map = 1
+} mrb_debug_line_type;
+
+typedef struct mrb_irep_debug_info_line {
+ uint32_t start_pos;
+ uint16_t line;
+} mrb_irep_debug_info_line;
+
+typedef struct mrb_irep_debug_info_file {
+ uint32_t start_pos;
+ const char *filename;
+ mrb_sym filename_sym;
+ uint32_t line_entry_count;
+ mrb_debug_line_type line_type;
+ union {
+ void *ptr;
+ mrb_irep_debug_info_line *flat_map;
+ uint16_t *ary;
+ } lines;
+} mrb_irep_debug_info_file;
+
+typedef struct mrb_irep_debug_info {
+ uint32_t pc_count;
+ uint16_t flen;
+ mrb_irep_debug_info_file **files;
+} mrb_irep_debug_info;
+
+/*
+ * get line from irep's debug info and program counter
+ * @return returns NULL if not found
+ */
+MRB_API const char *mrb_debug_get_filename(mrb_irep *irep, uint32_t pc);
+
+/*
+ * get line from irep's debug info and program counter
+ * @return returns -1 if not found
+ */
+MRB_API int32_t mrb_debug_get_line(mrb_irep *irep, uint32_t pc);
+
+MRB_API mrb_irep_debug_info_file *mrb_debug_info_append_file(
+ mrb_state *mrb, mrb_irep *irep,
+ uint32_t start_pos, uint32_t end_pos);
+MRB_API mrb_irep_debug_info *mrb_debug_info_alloc(mrb_state *mrb, mrb_irep *irep);
+MRB_API void mrb_debug_info_free(mrb_state *mrb, mrb_irep_debug_info *d);
+
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
+#endif /* MRUBY_DEBUG_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/dump.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,160 @@
+/*
+** mruby/dump.h - mruby binary dumper (mrbc binary format)
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_DUMP_H
+#define MRUBY_DUMP_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#include "mruby.h"
+#include "mruby/irep.h"
+
+int mrb_dump_irep(mrb_state *mrb, mrb_irep *irep, int debug_info, uint8_t **bin, size_t *bin_size);
+#ifdef ENABLE_STDIO
+int mrb_dump_irep_binary(mrb_state*, mrb_irep*, int, FILE*);
+int mrb_dump_irep_cfunc(mrb_state *mrb, mrb_irep*, int, FILE *f, const char *initname);
+mrb_irep *mrb_read_irep_file(mrb_state*, FILE*);
+MRB_API mrb_value mrb_load_irep_file(mrb_state*,FILE*);
+MRB_API mrb_value mrb_load_irep_file_cxt(mrb_state*, FILE*, mrbc_context*);
+#endif
+MRB_API mrb_irep *mrb_read_irep(mrb_state*, const uint8_t*);
+
+/* dump/load error code
+ *
+ * NOTE: MRB_DUMP_GENERAL_FAILURE is caused by
+ * unspecified issues like malloc failed.
+ */
+#define MRB_DUMP_OK 0
+#define MRB_DUMP_GENERAL_FAILURE (-1)
+#define MRB_DUMP_WRITE_FAULT (-2)
+#define MRB_DUMP_READ_FAULT (-3)
+#define MRB_DUMP_CRC_ERROR (-4)
+#define MRB_DUMP_INVALID_FILE_HEADER (-5)
+#define MRB_DUMP_INVALID_IREP (-6)
+#define MRB_DUMP_INVALID_ARGUMENT (-7)
+
+/* null symbol length */
+#define MRB_DUMP_NULL_SYM_LEN 0xFFFF
+
+/* Rite Binary File header */
+#define RITE_BINARY_IDENTIFIER "RITE"
+#define RITE_BINARY_FORMAT_VER "0003"
+#define RITE_COMPILER_NAME "MATZ"
+#define RITE_COMPILER_VERSION "0000"
+
+#define RITE_VM_VER "0000"
+
+#define RITE_BINARY_EOF "END\0"
+#define RITE_SECTION_IREP_IDENTIFIER "IREP"
+#define RITE_SECTION_LINENO_IDENTIFIER "LINE"
+#define RITE_SECTION_DEBUG_IDENTIFIER "DBG\0"
+#define RITE_SECTION_LV_IDENTIFIER "LVAR"
+
+#define MRB_DUMP_DEFAULT_STR_LEN 128
+#define MRB_DUMP_ALIGNMENT sizeof(uint32_t)
+
+/* binary header */
+struct rite_binary_header {
+ uint8_t binary_identify[4]; /* Binary Identifier */
+ uint8_t binary_version[4]; /* Binary Format Version */
+ uint8_t binary_crc[2]; /* Binary CRC */
+ uint8_t binary_size[4]; /* Binary Size */
+ uint8_t compiler_name[4]; /* Compiler name */
+ uint8_t compiler_version[4];
+};
+
+/* section header */
+#define RITE_SECTION_HEADER \
+ uint8_t section_identify[4]; \
+ uint8_t section_size[4]
+
+struct rite_section_header {
+ RITE_SECTION_HEADER;
+};
+
+struct rite_section_irep_header {
+ RITE_SECTION_HEADER;
+
+ uint8_t rite_version[4]; /* Rite Instruction Specification Version */
+};
+
+struct rite_section_lineno_header {
+ RITE_SECTION_HEADER;
+};
+
+struct rite_section_debug_header {
+ RITE_SECTION_HEADER;
+};
+
+struct rite_section_lv_header {
+ RITE_SECTION_HEADER;
+};
+
+#define RITE_LV_NULL_MARK UINT16_MAX
+
+struct rite_binary_footer {
+ RITE_SECTION_HEADER;
+};
+
+static inline size_t
+uint8_to_bin(uint8_t s, uint8_t *bin)
+{
+ *bin = s;
+ return sizeof(uint8_t);
+}
+
+static inline size_t
+uint16_to_bin(uint16_t s, uint8_t *bin)
+{
+ *bin++ = (s >> 8) & 0xff;
+ *bin = s & 0xff;
+ return sizeof(uint16_t);
+}
+
+static inline size_t
+uint32_to_bin(uint32_t l, uint8_t *bin)
+{
+ *bin++ = (l >> 24) & 0xff;
+ *bin++ = (l >> 16) & 0xff;
+ *bin++ = (l >> 8) & 0xff;
+ *bin = l & 0xff;
+ return sizeof(uint32_t);
+}
+
+static inline uint32_t
+bin_to_uint32(const uint8_t *bin)
+{
+ return (uint32_t)bin[0] << 24 |
+ (uint32_t)bin[1] << 16 |
+ (uint32_t)bin[2] << 8 |
+ (uint32_t)bin[3];
+}
+
+static inline uint16_t
+bin_to_uint16(const uint8_t *bin)
+{
+ return (uint16_t)bin[0] << 8 |
+ (uint16_t)bin[1];
+}
+
+static inline uint8_t
+bin_to_uint8(const uint8_t *bin)
+{
+ return (uint8_t)bin[0];
+}
+
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
+/* crc.c */
+uint16_t
+calc_crc_16_ccitt(const uint8_t *src, size_t nbytes, uint16_t crc);
+
+#endif /* MRUBY_DUMP_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/error.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,37 @@
+/*
+** mruby/error.h - Exception class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_ERROR_H
+#define MRUBY_ERROR_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+struct RException {
+ MRB_OBJECT_HEADER;
+ struct iv_tbl *iv;
+};
+
+#define mrb_exc_ptr(v) ((struct RException*)mrb_ptr(v))
+
+MRB_API void mrb_sys_fail(mrb_state *mrb, const char *mesg);
+MRB_API mrb_value mrb_exc_new_str(mrb_state *mrb, struct RClass* c, mrb_value str);
+#define mrb_exc_new_str_lit(mrb, c, lit) mrb_exc_new_str(mrb, c, mrb_str_new_lit(mrb, lit))
+MRB_API mrb_value mrb_make_exception(mrb_state *mrb, int argc, const mrb_value *argv);
+MRB_API mrb_value mrb_exc_backtrace(mrb_state *mrb, mrb_value exc);
+MRB_API mrb_value mrb_get_backtrace(mrb_state *mrb);
+MRB_API mrb_noreturn void mrb_no_method_error(mrb_state *mrb, mrb_sym id, mrb_int argc, const mrb_value *argv, const char *fmt, ...);
+
+/* declaration for fail method */
+MRB_API mrb_value mrb_f_raise(mrb_state*, mrb_value);
+
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
+#endif /* MRUBY_ERROR_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/gc.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,23 @@
+/*
+** mruby/gc.h - garbage collector for mruby
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_GC_H
+#define MRUBY_GC_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef void (mrb_each_object_callback)(mrb_state *mrb, struct RBasic *obj, void *data);
+void mrb_objspace_each_objects(mrb_state *mrb, mrb_each_object_callback *callback, void *data);
+MRB_API void mrb_free_context(mrb_state *mrb, struct mrb_context *c);
+
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
+#endif /* MRUBY_GC_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/hash.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,55 @@
+/*
+** mruby/hash.h - Hash class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_HASH_H
+#define MRUBY_HASH_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+struct RHash {
+ MRB_OBJECT_HEADER;
+ struct iv_tbl *iv;
+ struct kh_ht *ht;
+};
+
+#define mrb_hash_ptr(v) ((struct RHash*)(mrb_ptr(v)))
+#define mrb_hash_value(p) mrb_obj_value((void*)(p))
+
+MRB_API mrb_value mrb_hash_new_capa(mrb_state*, int);
+MRB_API mrb_value mrb_hash_new(mrb_state *mrb);
+
+MRB_API void mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val);
+MRB_API mrb_value mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key);
+MRB_API mrb_value mrb_hash_fetch(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value def);
+MRB_API mrb_value mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key);
+MRB_API mrb_value mrb_hash_keys(mrb_state *mrb, mrb_value hash);
+MRB_API mrb_value mrb_check_hash_type(mrb_state *mrb, mrb_value hash);
+MRB_API mrb_value mrb_hash_empty_p(mrb_state *mrb, mrb_value self);
+MRB_API mrb_value mrb_hash_clear(mrb_state *mrb, mrb_value hash);
+
+/* RHASH_TBL allocates st_table if not available. */
+#define RHASH(obj) ((struct RHash*)(mrb_ptr(obj)))
+#define RHASH_TBL(h) (RHASH(h)->ht)
+#define RHASH_IFNONE(h) mrb_iv_get(mrb, (h), mrb_intern_lit(mrb, "ifnone"))
+#define RHASH_PROCDEFAULT(h) RHASH_IFNONE(h)
+MRB_API struct kh_ht * mrb_hash_tbl(mrb_state *mrb, mrb_value hash);
+
+#define MRB_HASH_PROC_DEFAULT 256
+#define MRB_RHASH_PROCDEFAULT_P(h) (RHASH(h)->flags & MRB_HASH_PROC_DEFAULT)
+
+/* GC functions */
+void mrb_gc_mark_hash(mrb_state*, struct RHash*);
+size_t mrb_gc_mark_hash_size(mrb_state*, struct RHash*);
+void mrb_gc_free_hash(mrb_state*, struct RHash*);
+
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
+#endif /* MRUBY_HASH_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/irep.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,61 @@
+/*
+** mruby/irep.h - mrb_irep structure
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_IREP_H
+#define MRUBY_IREP_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#include "mruby/compile.h"
+
+enum irep_pool_type {
+ IREP_TT_STRING,
+ IREP_TT_FIXNUM,
+ IREP_TT_FLOAT,
+};
+
+struct mrb_locals {
+ mrb_sym name;
+ uint16_t r;
+};
+
+/* Program data array struct */
+typedef struct mrb_irep {
+ uint16_t nlocals; /* Number of local variables */
+ uint16_t nregs; /* Number of register variables */
+ uint8_t flags;
+
+ mrb_code *iseq;
+ mrb_value *pool;
+ mrb_sym *syms;
+ struct mrb_irep **reps;
+
+ struct mrb_locals *lv;
+ /* debug info */
+ const char *filename;
+ uint16_t *lines;
+ struct mrb_irep_debug_info* debug_info;
+
+ size_t ilen, plen, slen, rlen, refcnt;
+} mrb_irep;
+
+#define MRB_ISEQ_NO_FREE 1
+
+MRB_API mrb_irep *mrb_add_irep(mrb_state *mrb);
+MRB_API mrb_value mrb_load_irep(mrb_state*, const uint8_t*);
+MRB_API mrb_value mrb_load_irep_cxt(mrb_state*, const uint8_t*, mrbc_context*);
+void mrb_irep_free(mrb_state*, struct mrb_irep*);
+void mrb_irep_incref(mrb_state*, struct mrb_irep*);
+void mrb_irep_decref(mrb_state*, struct mrb_irep*);
+
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
+#endif /* MRUBY_IREP_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/khash.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,271 @@
+/*
+** mruby/khash.c - Hash for mruby
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_KHASH_H
+#define MRUBY_KHASH_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#include "mruby.h"
+#include <string.h>
+
+typedef uint32_t khint_t;
+typedef khint_t khiter_t;
+
+#ifndef KHASH_DEFAULT_SIZE
+# define KHASH_DEFAULT_SIZE 32
+#endif
+#define KHASH_MIN_SIZE 8
+
+#define UPPER_BOUND(x) ((x)>>2|(x)>>1)
+
+/* extern uint8_t __m[]; */
+
+/* mask for flags */
+static const uint8_t __m_empty[] = {0x02, 0x08, 0x20, 0x80};
+static const uint8_t __m_del[] = {0x01, 0x04, 0x10, 0x40};
+static const uint8_t __m_either[] = {0x03, 0x0c, 0x30, 0xc0};
+
+
+#define __ac_isempty(ed_flag, i) (ed_flag[(i)/4]&__m_empty[(i)%4])
+#define __ac_isdel(ed_flag, i) (ed_flag[(i)/4]&__m_del[(i)%4])
+#define __ac_iseither(ed_flag, i) (ed_flag[(i)/4]&__m_either[(i)%4])
+#define khash_power2(v) do { \
+ v--;\
+ v |= v >> 1;\
+ v |= v >> 2;\
+ v |= v >> 4;\
+ v |= v >> 8;\
+ v |= v >> 16;\
+ v++;\
+} while (0)
+#define khash_mask(h) ((h)->n_buckets-1)
+#define khash_upper_bound(h) (UPPER_BOUND((h)->n_buckets))
+
+/* declare struct kh_xxx and kh_xxx_funcs
+
+ name: hash name
+ khkey_t: key data type
+ khval_t: value data type
+ kh_is_map: (0: hash set / 1: hash map)
+*/
+#define KHASH_DECLARE(name, khkey_t, khval_t, kh_is_map) \
+ typedef struct kh_##name { \
+ khint_t n_buckets; \
+ khint_t size; \
+ khint_t n_occupied; \
+ uint8_t *ed_flags; \
+ khkey_t *keys; \
+ khval_t *vals; \
+ } kh_##name##_t; \
+ void kh_alloc_##name(mrb_state *mrb, kh_##name##_t *h); \
+ kh_##name##_t *kh_init_##name##_size(mrb_state *mrb, khint_t size); \
+ kh_##name##_t *kh_init_##name(mrb_state *mrb); \
+ void kh_destroy_##name(mrb_state *mrb, kh_##name##_t *h); \
+ void kh_clear_##name(mrb_state *mrb, kh_##name##_t *h); \
+ khint_t kh_get_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key); \
+ khint_t kh_put_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key, int *ret); \
+ void kh_resize_##name(mrb_state *mrb, kh_##name##_t *h, khint_t new_n_buckets); \
+ void kh_del_##name(mrb_state *mrb, kh_##name##_t *h, khint_t x); \
+ kh_##name##_t *kh_copy_##name(mrb_state *mrb, kh_##name##_t *h);
+
+static inline void
+kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
+{
+ while (len-- > 0) {
+ *p++ = c;
+ }
+}
+
+/* define kh_xxx_funcs
+
+ name: hash name
+ khkey_t: key data type
+ khval_t: value data type
+ kh_is_map: (0: hash set / 1: hash map)
+ __hash_func: hash function
+ __hash_equal: hash comparation function
+*/
+#define KHASH_DEFINE(name, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \
+ void kh_alloc_##name(mrb_state *mrb, kh_##name##_t *h) \
+ { \
+ khint_t sz = h->n_buckets; \
+ size_t len = sizeof(khkey_t) + (kh_is_map ? sizeof(khval_t) : 0); \
+ uint8_t *p = (uint8_t*)mrb_malloc(mrb, sizeof(uint8_t)*sz/4+len*sz); \
+ h->size = h->n_occupied = 0; \
+ h->keys = (khkey_t *)p; \
+ h->vals = kh_is_map ? (khval_t *)(p+sizeof(khkey_t)*sz) : NULL; \
+ h->ed_flags = p+len*sz; \
+ kh_fill_flags(h->ed_flags, 0xaa, sz/4); \
+ } \
+ kh_##name##_t *kh_init_##name##_size(mrb_state *mrb, khint_t size) { \
+ kh_##name##_t *h = (kh_##name##_t*)mrb_calloc(mrb, 1, sizeof(kh_##name##_t)); \
+ if (size < KHASH_MIN_SIZE) \
+ size = KHASH_MIN_SIZE; \
+ khash_power2(size); \
+ h->n_buckets = size; \
+ kh_alloc_##name(mrb, h); \
+ return h; \
+ } \
+ kh_##name##_t *kh_init_##name(mrb_state *mrb) { \
+ return kh_init_##name##_size(mrb, KHASH_DEFAULT_SIZE); \
+ } \
+ void kh_destroy_##name(mrb_state *mrb, kh_##name##_t *h) \
+ { \
+ if (h) { \
+ mrb_free(mrb, h->keys); \
+ mrb_free(mrb, h); \
+ } \
+ } \
+ void kh_clear_##name(mrb_state *mrb, kh_##name##_t *h) \
+ { \
+ (void)mrb; \
+ if (h && h->ed_flags) { \
+ kh_fill_flags(h->ed_flags, 0xaa, h->n_buckets/4); \
+ h->size = h->n_occupied = 0; \
+ } \
+ } \
+ khint_t kh_get_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key) \
+ { \
+ khint_t k = __hash_func(mrb,key) & khash_mask(h), step = 0; \
+ (void)mrb; \
+ while (!__ac_isempty(h->ed_flags, k)) { \
+ if (!__ac_isdel(h->ed_flags, k)) { \
+ if (__hash_equal(mrb,h->keys[k], key)) return k; \
+ } \
+ k = (k+(++step)) & khash_mask(h); \
+ } \
+ return kh_end(h); \
+ } \
+ void kh_resize_##name(mrb_state *mrb, kh_##name##_t *h, khint_t new_n_buckets) \
+ { \
+ if (new_n_buckets < KHASH_MIN_SIZE) \
+ new_n_buckets = KHASH_MIN_SIZE; \
+ khash_power2(new_n_buckets); \
+ { \
+ uint8_t *old_ed_flags = h->ed_flags; \
+ khkey_t *old_keys = h->keys; \
+ khval_t *old_vals = h->vals; \
+ khint_t old_n_buckets = h->n_buckets; \
+ khint_t i; \
+ h->n_buckets = new_n_buckets; \
+ kh_alloc_##name(mrb, h); \
+ /* relocate */ \
+ for (i=0 ; i<old_n_buckets ; i++) { \
+ if (!__ac_iseither(old_ed_flags, i)) { \
+ khint_t k = kh_put_##name(mrb, h, old_keys[i], NULL); \
+ if (kh_is_map) kh_value(h,k) = old_vals[i]; \
+ } \
+ } \
+ mrb_free(mrb, old_keys); \
+ } \
+ } \
+ khint_t kh_put_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key, int *ret) \
+ { \
+ khint_t k, del_k, step = 0; \
+ if (h->n_occupied >= khash_upper_bound(h)) { \
+ kh_resize_##name(mrb, h, h->n_buckets*2); \
+ } \
+ k = __hash_func(mrb,key) & khash_mask(h); \
+ del_k = kh_end(h); \
+ while (!__ac_isempty(h->ed_flags, k)) { \
+ if (!__ac_isdel(h->ed_flags, k)) { \
+ if (__hash_equal(mrb,h->keys[k], key)) { \
+ if (ret) *ret = 0; \
+ return k; \
+ } \
+ } \
+ else if (del_k == kh_end(h)) { \
+ del_k = k; \
+ } \
+ k = (k+(++step)) & khash_mask(h); \
+ } \
+ if (del_k != kh_end(h)) { \
+ /* put at del */ \
+ h->keys[del_k] = key; \
+ h->ed_flags[del_k/4] &= ~__m_del[del_k%4]; \
+ h->size++; \
+ if (ret) *ret = 2; \
+ return del_k; \
+ } \
+ else { \
+ /* put at empty */ \
+ h->keys[k] = key; \
+ h->ed_flags[k/4] &= ~__m_empty[k%4]; \
+ h->size++; \
+ h->n_occupied++; \
+ if (ret) *ret = 1; \
+ return k; \
+ } \
+ } \
+ void kh_del_##name(mrb_state *mrb, kh_##name##_t *h, khint_t x) \
+ { \
+ (void)mrb; \
+ mrb_assert(x != h->n_buckets && !__ac_iseither(h->ed_flags, x)); \
+ h->ed_flags[x/4] |= __m_del[x%4]; \
+ h->size--; \
+ } \
+ kh_##name##_t *kh_copy_##name(mrb_state *mrb, kh_##name##_t *h) \
+ { \
+ kh_##name##_t *h2; \
+ khiter_t k, k2; \
+ \
+ h2 = kh_init_##name(mrb); \
+ for (k = kh_begin(h); k != kh_end(h); k++) { \
+ if (kh_exist(h, k)) { \
+ k2 = kh_put_##name(mrb, h2, kh_key(h, k), NULL); \
+ if (kh_is_map) kh_value(h2, k2) = kh_value(h, k); \
+ } \
+ } \
+ return h2; \
+ }
+
+
+#define khash_t(name) kh_##name##_t
+
+#define kh_init_size(name,mrb,size) kh_init_##name##_size(mrb,size)
+#define kh_init(name,mrb) kh_init_##name(mrb)
+#define kh_destroy(name, mrb, h) kh_destroy_##name(mrb, h)
+#define kh_clear(name, mrb, h) kh_clear_##name(mrb, h)
+#define kh_resize(name, mrb, h, s) kh_resize_##name(mrb, h, s)
+#define kh_put(name, mrb, h, k) kh_put_##name(mrb, h, k, NULL)
+#define kh_put2(name, mrb, h, k, r) kh_put_##name(mrb, h, k, r)
+#define kh_get(name, mrb, h, k) kh_get_##name(mrb, h, k)
+#define kh_del(name, mrb, h, k) kh_del_##name(mrb, h, k)
+#define kh_copy(name, mrb, h) kh_copy_##name(mrb, h)
+
+#define kh_exist(h, x) (!__ac_iseither((h)->ed_flags, (x)))
+#define kh_key(h, x) ((h)->keys[x])
+#define kh_val(h, x) ((h)->vals[x])
+#define kh_value(h, x) ((h)->vals[x])
+#define kh_begin(h) (khint_t)(0)
+#define kh_end(h) ((h)->n_buckets)
+#define kh_size(h) ((h)->size)
+#define kh_n_buckets(h) ((h)->n_buckets)
+
+#define kh_int_hash_func(mrb,key) (khint_t)((key)^((key)<<2)^((key)>>2))
+#define kh_int_hash_equal(mrb,a, b) (a == b)
+#define kh_int64_hash_func(mrb,key) (khint_t)((key)>>33^(key)^(key)<<11)
+#define kh_int64_hash_equal(mrb,a, b) (a == b)
+static inline khint_t __ac_X31_hash_string(const char *s)
+{
+ khint_t h = *s;
+ if (h) for (++s ; *s; ++s) h = (h << 5) - h + *s;
+ return h;
+}
+#define kh_str_hash_func(mrb,key) __ac_X31_hash_string(key)
+#define kh_str_hash_equal(mrb,a, b) (strcmp(a, b) == 0)
+
+typedef const char *kh_cstr_t;
+
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
+#endif /* MRUBY_KHASH_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/numeric.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,67 @@
+/*
+** mruby/numeric.h - Numeric, Integer, Float, Fixnum class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_NUMERIC_H
+#define MRUBY_NUMERIC_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#define POSFIXABLE(f) ((f) <= MRB_INT_MAX)
+#define NEGFIXABLE(f) ((f) >= MRB_INT_MIN)
+#define FIXABLE(f) (POSFIXABLE(f) && NEGFIXABLE(f))
+
+MRB_API mrb_value mrb_flo_to_fixnum(mrb_state *mrb, mrb_value val);
+MRB_API mrb_value mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, int base);
+MRB_API mrb_float mrb_to_flo(mrb_state *mrb, mrb_value x);
+
+mrb_value mrb_fixnum_plus(mrb_state *mrb, mrb_value x, mrb_value y);
+mrb_value mrb_fixnum_minus(mrb_state *mrb, mrb_value x, mrb_value y);
+mrb_value mrb_fixnum_mul(mrb_state *mrb, mrb_value x, mrb_value y);
+mrb_value mrb_num_div(mrb_state *mrb, mrb_value x, mrb_value y);
+
+#define MRB_UINT_MAKE2(n) uint ## n ## _t
+#define MRB_UINT_MAKE(n) MRB_UINT_MAKE2(n)
+#define mrb_uint MRB_UINT_MAKE(MRB_INT_BIT)
+
+#ifdef MRB_WORD_BOXING
+# define MRB_INT_OVERFLOW_MASK ((mrb_uint)1 << (MRB_INT_BIT - 1 - MRB_FIXNUM_SHIFT))
+#else
+# define MRB_INT_OVERFLOW_MASK ((mrb_uint)1 << (MRB_INT_BIT - 1))
+#endif
+
+static inline mrb_bool
+mrb_int_add_overflow(mrb_int augend, mrb_int addend, mrb_int *sum)
+{
+ mrb_uint x = (mrb_uint)augend;
+ mrb_uint y = (mrb_uint)addend;
+ mrb_uint z = (mrb_uint)(x + y);
+ *sum = (mrb_int)z;
+ return !!(((x ^ z) & (y ^ z)) & MRB_INT_OVERFLOW_MASK);
+}
+
+static inline mrb_bool
+mrb_int_sub_overflow(mrb_int minuend, mrb_int subtrahend, mrb_int *difference)
+{
+ mrb_uint x = (mrb_uint)minuend;
+ mrb_uint y = (mrb_uint)subtrahend;
+ mrb_uint z = (mrb_uint)(x - y);
+ *difference = (mrb_int)z;
+ return !!(((x ^ z) & (~y ^ z)) & MRB_INT_OVERFLOW_MASK);
+}
+
+#undef MRB_INT_OVERFLOW_MASK
+#undef mrb_uint
+#undef MRB_UINT_MAKE
+#undef MRB_UINT_MAKE2
+
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
+#endif /* MRUBY_NUMERIC_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/object.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,56 @@
+/*
+** mruby/object.h - mruby object definition
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_OBJECT_H
+#define MRUBY_OBJECT_H
+
+#define MRB_OBJECT_HEADER \
+ enum mrb_vtype tt:8;\
+ uint32_t color:3;\
+ uint32_t flags:21;\
+ struct RClass *c;\
+ struct RBasic *gcnext
+
+/* white: 011, black: 100, gray: 000 */
+#define MRB_GC_GRAY 0
+#define MRB_GC_WHITE_A 1
+#define MRB_GC_WHITE_B (1 << 1)
+#define MRB_GC_BLACK (1 << 2)
+#define MRB_GC_WHITES (MRB_GC_WHITE_A | MRB_GC_WHITE_B)
+#define MRB_GC_COLOR_MASK 7
+
+#define paint_gray(o) ((o)->color = MRB_GC_GRAY)
+#define paint_black(o) ((o)->color = MRB_GC_BLACK)
+#define paint_white(o) ((o)->color = MRB_GC_WHITES)
+#define paint_partial_white(s, o) ((o)->color = (s)->current_white_part)
+#define is_gray(o) ((o)->color == MRB_GC_GRAY)
+#define is_white(o) ((o)->color & MRB_GC_WHITES)
+#define is_black(o) ((o)->color & MRB_GC_BLACK)
+#define is_dead(s, o) (((o)->color & other_white_part(s) & MRB_GC_WHITES) || (o)->tt == MRB_TT_FREE)
+#define flip_white_part(s) ((s)->current_white_part = other_white_part(s))
+#define other_white_part(s) ((s)->current_white_part ^ MRB_GC_WHITES)
+
+struct RBasic {
+ MRB_OBJECT_HEADER;
+};
+#define mrb_basic_ptr(v) ((struct RBasic*)(mrb_ptr(v)))
+
+struct RObject {
+ MRB_OBJECT_HEADER;
+ struct iv_tbl *iv;
+};
+#define mrb_obj_ptr(v) ((struct RObject*)(mrb_ptr(v)))
+
+#define mrb_immediate_p(x) (mrb_type(x) < MRB_TT_HAS_BASIC)
+#define mrb_special_const_p(x) mrb_immediate_p(x)
+
+struct RFiber {
+ MRB_OBJECT_HEADER;
+ struct mrb_context *cxt;
+};
+
+#endif /* MRUBY_OBJECT_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/opcode.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,161 @@
+/*
+** mruby/opcode.h - RiteVM operation codes
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_OPCODE_H
+#define MRUBY_OPCODE_H
+
+#define MAXARG_Bx (0xffff)
+#define MAXARG_sBx (MAXARG_Bx>>1) /* `sBx' is signed */
+
+/* instructions: packed 32 bit */
+/* ------------------------------- */
+/* A:B:C:OP = 9: 9: 7: 7 */
+/* A:Bx:OP = 9:16: 7 */
+/* Ax:OP = 25: 7 */
+/* A:Bz:Cz:OP = 9:14: 2: 7 */
+
+#define GET_OPCODE(i) ((int)(((mrb_code)(i)) & 0x7f))
+#define GETARG_A(i) ((int)((((mrb_code)(i)) >> 23) & 0x1ff))
+#define GETARG_B(i) ((int)((((mrb_code)(i)) >> 14) & 0x1ff))
+#define GETARG_C(i) ((int)((((mrb_code)(i)) >> 7) & 0x7f))
+#define GETARG_Bx(i) ((int)((((mrb_code)(i)) >> 7) & 0xffff))
+#define GETARG_sBx(i) ((int)(GETARG_Bx(i)-MAXARG_sBx))
+#define GETARG_Ax(i) ((int32_t)((((mrb_code)(i)) >> 7) & 0x1ffffff))
+#define GETARG_UNPACK_b(i,n1,n2) ((int)((((mrb_code)(i)) >> (7+(n2))) & (((1<<(n1))-1))))
+#define GETARG_UNPACK_c(i,n1,n2) ((int)((((mrb_code)(i)) >> 7) & (((1<<(n2))-1))))
+#define GETARG_b(i) GETARG_UNPACK_b(i,14,2)
+#define GETARG_c(i) GETARG_UNPACK_c(i,14,2)
+
+#define MKOPCODE(op) ((op) & 0x7f)
+#define MKARG_A(c) ((mrb_code)((c) & 0x1ff) << 23)
+#define MKARG_B(c) ((mrb_code)((c) & 0x1ff) << 14)
+#define MKARG_C(c) (((c) & 0x7f) << 7)
+#define MKARG_Bx(v) ((mrb_code)((v) & 0xffff) << 7)
+#define MKARG_sBx(v) MKARG_Bx((v)+MAXARG_sBx)
+#define MKARG_Ax(v) ((mrb_code)((v) & 0x1ffffff) << 7)
+#define MKARG_PACK(b,n1,c,n2) ((((b) & ((1<<n1)-1)) << (7+n2))|(((c) & ((1<<n2)-1)) << 7))
+#define MKARG_bc(b,c) MKARG_PACK(b,14,c,2)
+
+#define MKOP_A(op,a) (MKOPCODE(op)|MKARG_A(a))
+#define MKOP_AB(op,a,b) (MKOP_A(op,a)|MKARG_B(b))
+#define MKOP_ABC(op,a,b,c) (MKOP_AB(op,a,b)|MKARG_C(c))
+#define MKOP_ABx(op,a,bx) (MKOP_A(op,a)|MKARG_Bx(bx))
+#define MKOP_Bx(op,bx) (MKOPCODE(op)|MKARG_Bx(bx))
+#define MKOP_sBx(op,sbx) (MKOPCODE(op)|MKARG_sBx(sbx))
+#define MKOP_AsBx(op,a,sbx) (MKOP_A(op,a)|MKARG_sBx(sbx))
+#define MKOP_Ax(op,ax) (MKOPCODE(op)|MKARG_Ax(ax))
+#define MKOP_Abc(op,a,b,c) (MKOP_A(op,a)|MKARG_bc(b,c))
+
+enum {
+ /*-----------------------------------------------------------------------
+ operation code operand description
+ ------------------------------------------------------------------------*/
+ OP_NOP=0,/* */
+ OP_MOVE,/* A B R(A) := R(B) */
+ OP_LOADL,/* A Bx R(A) := Pool(Bx) */
+ OP_LOADI,/* A sBx R(A) := sBx */
+ OP_LOADSYM,/* A Bx R(A) := Syms(Bx) */
+ OP_LOADNIL,/* A R(A) := nil */
+ OP_LOADSELF,/* A R(A) := self */
+ OP_LOADT,/* A R(A) := true */
+ OP_LOADF,/* A R(A) := false */
+
+ OP_GETGLOBAL,/* A Bx R(A) := getglobal(Syms(Bx)) */
+ OP_SETGLOBAL,/* A Bx setglobal(Syms(Bx), R(A)) */
+ OP_GETSPECIAL,/*A Bx R(A) := Special[Bx] */
+ OP_SETSPECIAL,/*A Bx Special[Bx] := R(A) */
+ OP_GETIV,/* A Bx R(A) := ivget(Syms(Bx)) */
+ OP_SETIV,/* A Bx ivset(Syms(Bx),R(A)) */
+ OP_GETCV,/* A Bx R(A) := cvget(Syms(Bx)) */
+ OP_SETCV,/* A Bx cvset(Syms(Bx),R(A)) */
+ OP_GETCONST,/* A Bx R(A) := constget(Syms(Bx)) */
+ OP_SETCONST,/* A Bx constset(Syms(Bx),R(A)) */
+ OP_GETMCNST,/* A Bx R(A) := R(A)::Syms(Bx) */
+ OP_SETMCNST,/* A Bx R(A+1)::Syms(Bx) := R(A) */
+ OP_GETUPVAR,/* A B C R(A) := uvget(B,C) */
+ OP_SETUPVAR,/* A B C uvset(B,C,R(A)) */
+
+ OP_JMP,/* sBx pc+=sBx */
+ OP_JMPIF,/* A sBx if R(A) pc+=sBx */
+ OP_JMPNOT,/* A sBx if !R(A) pc+=sBx */
+ OP_ONERR,/* sBx rescue_push(pc+sBx) */
+ OP_RESCUE,/* A clear(exc); R(A) := exception (ignore when A=0) */
+ OP_POPERR,/* A A.times{rescue_pop()} */
+ OP_RAISE,/* A raise(R(A)) */
+ OP_EPUSH,/* Bx ensure_push(SEQ[Bx]) */
+ OP_EPOP,/* A A.times{ensure_pop().call} */
+
+ OP_SEND,/* A B C R(A) := call(R(A),Syms(B),R(A+1),...,R(A+C)) */
+ OP_SENDB,/* A B C R(A) := call(R(A),Syms(B),R(A+1),...,R(A+C),&R(A+C+1))*/
+ OP_FSEND,/* A B C R(A) := fcall(R(A),Syms(B),R(A+1),...,R(A+C-1)) */
+ OP_CALL,/* A R(A) := self.call(frame.argc, frame.argv) */
+ OP_SUPER,/* A C R(A) := super(R(A+1),... ,R(A+C+1)) */
+ OP_ARGARY,/* A Bx R(A) := argument array (16=6:1:5:4) */
+ OP_ENTER,/* Ax arg setup according to flags (23=5:5:1:5:5:1:1) */
+ OP_KARG,/* A B C R(A) := kdict[Syms(B)]; if C kdict.rm(Syms(B)) */
+ OP_KDICT,/* A C R(A) := kdict */
+
+ OP_RETURN,/* A B return R(A) (B=normal,in-block return/break) */
+ OP_TAILCALL,/* A B C return call(R(A),Syms(B),*R(C)) */
+ OP_BLKPUSH,/* A Bx R(A) := block (16=6:1:5:4) */
+
+ OP_ADD,/* A B C R(A) := R(A)+R(A+1) (Syms[B]=:+,C=1) */
+ OP_ADDI,/* A B C R(A) := R(A)+C (Syms[B]=:+) */
+ OP_SUB,/* A B C R(A) := R(A)-R(A+1) (Syms[B]=:-,C=1) */
+ OP_SUBI,/* A B C R(A) := R(A)-C (Syms[B]=:-) */
+ OP_MUL,/* A B C R(A) := R(A)*R(A+1) (Syms[B]=:*,C=1) */
+ OP_DIV,/* A B C R(A) := R(A)/R(A+1) (Syms[B]=:/,C=1) */
+ OP_EQ,/* A B C R(A) := R(A)==R(A+1) (Syms[B]=:==,C=1) */
+ OP_LT,/* A B C R(A) := R(A)<R(A+1) (Syms[B]=:<,C=1) */
+ OP_LE,/* A B C R(A) := R(A)<=R(A+1) (Syms[B]=:<=,C=1) */
+ OP_GT,/* A B C R(A) := R(A)>R(A+1) (Syms[B]=:>,C=1) */
+ OP_GE,/* A B C R(A) := R(A)>=R(A+1) (Syms[B]=:>=,C=1) */
+
+ OP_ARRAY,/* A B C R(A) := ary_new(R(B),R(B+1)..R(B+C)) */
+ OP_ARYCAT,/* A B ary_cat(R(A),R(B)) */
+ OP_ARYPUSH,/* A B ary_push(R(A),R(B)) */
+ OP_AREF,/* A B C R(A) := R(B)[C] */
+ OP_ASET,/* A B C R(B)[C] := R(A) */
+ OP_APOST,/* A B C *R(A),R(A+1)..R(A+C) := R(A) */
+
+ OP_STRING,/* A Bx R(A) := str_dup(Lit(Bx)) */
+ OP_STRCAT,/* A B str_cat(R(A),R(B)) */
+
+ OP_HASH,/* A B C R(A) := hash_new(R(B),R(B+1)..R(B+C)) */
+ OP_LAMBDA,/* A Bz Cz R(A) := lambda(SEQ[Bz],Cz) */
+ OP_RANGE,/* A B C R(A) := range_new(R(B),R(B+1),C) */
+
+ OP_OCLASS,/* A R(A) := ::Object */
+ OP_CLASS,/* A B R(A) := newclass(R(A),Syms(B),R(A+1)) */
+ OP_MODULE,/* A B R(A) := newmodule(R(A),Syms(B)) */
+ OP_EXEC,/* A Bx R(A) := blockexec(R(A),SEQ[Bx]) */
+ OP_METHOD,/* A B R(A).newmethod(Syms(B),R(A+1)) */
+ OP_SCLASS,/* A B R(A) := R(B).singleton_class */
+ OP_TCLASS,/* A R(A) := target_class */
+
+ OP_DEBUG,/* A B C print R(A),R(B),R(C) */
+ OP_STOP,/* stop VM */
+ OP_ERR,/* Bx raise RuntimeError with message Lit(Bx) */
+
+ OP_RSVD1,/* reserved instruction #1 */
+ OP_RSVD2,/* reserved instruction #2 */
+ OP_RSVD3,/* reserved instruction #3 */
+ OP_RSVD4,/* reserved instruction #4 */
+ OP_RSVD5,/* reserved instruction #5 */
+};
+
+#define OP_L_STRICT 1
+#define OP_L_CAPTURE 2
+#define OP_L_METHOD OP_L_STRICT
+#define OP_L_LAMBDA (OP_L_STRICT|OP_L_CAPTURE)
+#define OP_L_BLOCK OP_L_CAPTURE
+
+#define OP_R_NORMAL 0
+#define OP_R_BREAK 1
+#define OP_R_RETURN 2
+
+#endif /* MRUBY_OPCODE_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/proc.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,77 @@
+/*
+** mruby/proc.h - Proc class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_PROC_H
+#define MRUBY_PROC_H
+
+#include "mruby/irep.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+struct REnv {
+ MRB_OBJECT_HEADER;
+ mrb_value *stack;
+ mrb_sym mid;
+ ptrdiff_t cioff;
+};
+
+#define MRB_SET_ENV_STACK_LEN(e,len) (e)->flags = (unsigned int)(len)
+#define MRB_ENV_STACK_LEN(e) ((mrb_int)(e)->flags)
+#define MRB_ENV_UNSHARE_STACK(e) ((e)->cioff = -1)
+#define MRB_ENV_STACK_SHARED_P(e) ((e)->cioff >= 0)
+
+struct RProc {
+ MRB_OBJECT_HEADER;
+ union {
+ mrb_irep *irep;
+ mrb_func_t func;
+ } body;
+ struct RClass *target_class;
+ struct REnv *env;
+};
+
+/* aspec access */
+#define MRB_ASPEC_REQ(a) (((a) >> 18) & 0x1f)
+#define MRB_ASPEC_OPT(a) (((a) >> 13) & 0x1f)
+#define MRB_ASPEC_REST(a) (((a) >> 12) & 0x1)
+#define MRB_ASPEC_POST(a) (((a) >> 7) & 0x1f)
+#define MRB_ASPEC_KEY(a) (((a) >> 2) & 0x1f)
+#define MRB_ASPEC_KDICT(a) ((a) & (1<<1))
+#define MRB_ASPEC_BLOCK(a) ((a) & 1)
+
+#define MRB_PROC_CFUNC 128
+#define MRB_PROC_CFUNC_P(p) (((p)->flags & MRB_PROC_CFUNC) != 0)
+#define MRB_PROC_STRICT 256
+#define MRB_PROC_STRICT_P(p) (((p)->flags & MRB_PROC_STRICT) != 0)
+
+#define mrb_proc_ptr(v) ((struct RProc*)(mrb_ptr(v)))
+
+struct RProc *mrb_proc_new(mrb_state*, mrb_irep*);
+struct RProc *mrb_closure_new(mrb_state*, mrb_irep*);
+MRB_API struct RProc *mrb_proc_new_cfunc(mrb_state*, mrb_func_t);
+MRB_API struct RProc *mrb_closure_new_cfunc(mrb_state *mrb, mrb_func_t func, int nlocals);
+void mrb_proc_copy(struct RProc *a, struct RProc *b);
+
+/* implementation of #send method */
+MRB_API mrb_value mrb_f_send(mrb_state *mrb, mrb_value self);
+
+/* following functions are defined in mruby-proc-ext so please include it when using */
+MRB_API struct RProc *mrb_proc_new_cfunc_with_env(mrb_state*, mrb_func_t, mrb_int, const mrb_value*);
+MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state*, mrb_int);
+/* old name */
+#define mrb_cfunc_env_get(mrb, idx) mrb_proc_cfunc_env_get(mrb, idx)
+
+#include "mruby/khash.h"
+KHASH_DECLARE(mt, mrb_sym, struct RProc*, TRUE)
+
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
+#endif /* MRUBY_PROC_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/range.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,37 @@
+/*
+** mruby/range.h - Range class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_RANGE_H
+#define MRUBY_RANGE_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef struct mrb_range_edges {
+ mrb_value beg;
+ mrb_value end;
+} mrb_range_edges;
+
+struct RRange {
+ MRB_OBJECT_HEADER;
+ mrb_range_edges *edges;
+ mrb_bool excl : 1;
+};
+
+#define mrb_range_ptr(v) ((struct RRange*)(mrb_ptr(v)))
+#define mrb_range_value(p) mrb_obj_value((void*)(p))
+
+MRB_API mrb_value mrb_range_new(mrb_state*, mrb_value, mrb_value, mrb_bool);
+MRB_API mrb_bool mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len);
+mrb_value mrb_get_values_at(mrb_state *mrb, mrb_value obj, mrb_int olen, mrb_int argc, const mrb_value *argv, mrb_value (*func)(mrb_state*, mrb_value, mrb_int));
+
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
+#endif /* MRUBY_RANGE_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/re.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,21 @@
+/*
+** mruby/re.h - Regexp class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_RE_H
+#define MRUBY_RE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define REGEXP_CLASS "Regexp"
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* RE_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/string.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,123 @@
+/*
+** mruby/string.h - String class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_STRING_H
+#define MRUBY_STRING_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+extern const char mrb_digitmap[];
+
+#define RSTRING_EMBED_LEN_MAX ((mrb_int)(sizeof(void*) * 3 - 1))
+
+struct RString {
+ MRB_OBJECT_HEADER;
+ union {
+ struct {
+ mrb_int len;
+ union {
+ mrb_int capa;
+ struct mrb_shared_string *shared;
+ } aux;
+ char *ptr;
+ } heap;
+ char ary[RSTRING_EMBED_LEN_MAX + 1];
+ } as;
+};
+
+#define RSTR_EMBED_P(s) ((s)->flags & MRB_STR_EMBED)
+#define RSTR_SET_EMBED_FLAG(s) ((s)->flags |= MRB_STR_EMBED)
+#define RSTR_UNSET_EMBED_FLAG(s) ((s)->flags &= ~(MRB_STR_EMBED|MRB_STR_EMBED_LEN_MASK))
+#define RSTR_SET_EMBED_LEN(s, n) do {\
+ size_t tmp_n = (n);\
+ s->flags &= ~MRB_STR_EMBED_LEN_MASK;\
+ s->flags |= (tmp_n) << MRB_STR_EMBED_LEN_SHIFT;\
+} while (0)
+#define RSTR_SET_LEN(s, n) do {\
+ if (RSTR_EMBED_P(s)) {\
+ RSTR_SET_EMBED_LEN((s),(n));\
+ } else {\
+ s->as.heap.len = (mrb_int)(n);\
+ }\
+} while (0)
+#define RSTR_EMBED_LEN(s)\
+ (mrb_int)(((s)->flags & MRB_STR_EMBED_LEN_MASK) >> MRB_STR_EMBED_LEN_SHIFT)
+#define RSTR_PTR(s) ((RSTR_EMBED_P(s)) ? (s)->as.ary : (s)->as.heap.ptr)
+#define RSTR_LEN(s) ((RSTR_EMBED_P(s)) ? RSTR_EMBED_LEN(s) : (s)->as.heap.len)
+#define RSTR_CAPA(s) (RSTR_EMBED_P(s) ? RSTRING_EMBED_LEN_MAX : (s)->as.heap.aux.capa)
+
+#define RSTR_SHARED_P(s) ((s)->flags & MRB_STR_SHARED)
+#define RSTR_SET_SHARED_FLAG(s) ((s)->flags |= MRB_STR_SHARED)
+#define RSTR_UNSET_SHARED_FLAG(s) ((s)->flags &= ~MRB_STR_SHARED)
+
+#define RSTR_NOFREE_P(s) ((s)->flags & MRB_STR_NOFREE)
+#define RSTR_SET_NOFREE_FLAG(s) ((s)->flags |= MRB_STR_NOFREE)
+#define RSTR_UNSET_NOFREE_FLAG(s) ((s)->flags &= ~MRB_STR_NOFREE)
+
+#define mrb_str_ptr(s) ((struct RString*)(mrb_ptr(s)))
+#define RSTRING(s) mrb_str_ptr(s)
+#define RSTRING_PTR(s) RSTR_PTR(RSTRING(s))
+#define RSTRING_EMBED_LEN(s) RSTR_ENBED_LEN(RSTRING(s))
+#define RSTRING_LEN(s) RSTR_LEN(RSTRING(s))
+#define RSTRING_CAPA(s) RSTR_CAPA(RSTRING(s))
+#define RSTRING_END(s) (RSTRING_PTR(s) + RSTRING_LEN(s))
+mrb_int mrb_str_strlen(mrb_state*, struct RString*);
+
+#define MRB_STR_SHARED 1
+#define MRB_STR_NOFREE 2
+#define MRB_STR_EMBED 4
+#define MRB_STR_EMBED_LEN_MASK 0xf8
+#define MRB_STR_EMBED_LEN_SHIFT 3
+
+void mrb_gc_free_str(mrb_state*, struct RString*);
+MRB_API void mrb_str_modify(mrb_state*, struct RString*);
+MRB_API void mrb_str_concat(mrb_state*, mrb_value, mrb_value);
+MRB_API mrb_value mrb_str_plus(mrb_state*, mrb_value, mrb_value);
+MRB_API mrb_value mrb_ptr_to_str(mrb_state *, void*);
+MRB_API mrb_value mrb_obj_as_string(mrb_state *mrb, mrb_value obj);
+MRB_API mrb_value mrb_str_resize(mrb_state *mrb, mrb_value str, mrb_int len);
+MRB_API mrb_value mrb_str_substr(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len);
+MRB_API mrb_value mrb_string_type(mrb_state *mrb, mrb_value str);
+MRB_API mrb_value mrb_check_string_type(mrb_state *mrb, mrb_value str);
+MRB_API mrb_value mrb_str_buf_new(mrb_state *mrb, size_t capa);
+
+MRB_API const char *mrb_string_value_cstr(mrb_state *mrb, mrb_value *ptr);
+MRB_API const char *mrb_string_value_ptr(mrb_state *mrb, mrb_value ptr);
+MRB_API mrb_value mrb_str_dup(mrb_state *mrb, mrb_value str);
+MRB_API mrb_value mrb_str_intern(mrb_state *mrb, mrb_value self);
+MRB_API mrb_value mrb_str_to_inum(mrb_state *mrb, mrb_value str, mrb_int base, mrb_bool badcheck);
+MRB_API double mrb_str_to_dbl(mrb_state *mrb, mrb_value str, mrb_bool badcheck);
+MRB_API mrb_value mrb_str_to_str(mrb_state *mrb, mrb_value str);
+MRB_API mrb_bool mrb_str_equal(mrb_state *mrb, mrb_value str1, mrb_value str2);
+MRB_API mrb_value mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len);
+MRB_API mrb_value mrb_str_cat_cstr(mrb_state *mrb, mrb_value str, const char *ptr);
+MRB_API mrb_value mrb_str_cat_str(mrb_state *mrb, mrb_value str, mrb_value str2);
+#define mrb_str_cat_lit(mrb, str, lit) mrb_str_cat(mrb, str, lit, mrb_strlen_lit(lit))
+MRB_API mrb_value mrb_str_append(mrb_state *mrb, mrb_value str, mrb_value str2);
+
+MRB_API int mrb_str_cmp(mrb_state *mrb, mrb_value str1, mrb_value str2);
+MRB_API char *mrb_str_to_cstr(mrb_state *mrb, mrb_value str);
+mrb_value mrb_str_pool(mrb_state *mrb, mrb_value str);
+mrb_int mrb_str_hash(mrb_state *mrb, mrb_value str);
+mrb_value mrb_str_dump(mrb_state *mrb, mrb_value str);
+mrb_value mrb_str_inspect(mrb_state *mrb, mrb_value str);
+
+void mrb_noregexp(mrb_state *mrb, mrb_value self);
+void mrb_regexp_check(mrb_state *mrb, mrb_value obj);
+
+/* For backward compatibility */
+#define mrb_str_cat2(mrb, str, ptr) mrb_str_cat_cstr(mrb, str, ptr)
+#define mrb_str_buf_cat(mrb, str, ptr, len) mrb_str_cat(mrb, str, ptr, len)
+#define mrb_str_buf_append(mrb, str, str2) mrb_str_cat_str(mrb, str, str2)
+
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
+#endif /* MRUBY_STRING_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/value.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,238 @@
+/*
+** mruby/value.h - mruby value definitions
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_VALUE_H
+#define MRUBY_VALUE_H
+
+typedef uint32_t mrb_sym;
+typedef uint8_t mrb_bool;
+struct mrb_state;
+
+#if defined(MRB_INT16) && defined(MRB_INT64)
+# error "You can't define MRB_INT16 and MRB_INT64 at the same time."
+#endif
+
+#if defined(MRB_INT64)
+ typedef int64_t mrb_int;
+# define MRB_INT_BIT 64
+# define MRB_INT_MIN (INT64_MIN>>MRB_FIXNUM_SHIFT)
+# define MRB_INT_MAX (INT64_MAX>>MRB_FIXNUM_SHIFT)
+#elif defined(MRB_INT16)
+ typedef int16_t mrb_int;
+# define MRB_INT_BIT 16
+# define MRB_INT_MIN (INT16_MIN>>MRB_FIXNUM_SHIFT)
+# define MRB_INT_MAX (INT16_MAX>>MRB_FIXNUM_SHIFT)
+#else
+ typedef int32_t mrb_int;
+# define MRB_INT_BIT 32
+# define MRB_INT_MIN (INT32_MIN>>MRB_FIXNUM_SHIFT)
+# define MRB_INT_MAX (INT32_MAX>>MRB_FIXNUM_SHIFT)
+#endif
+
+#ifdef MRB_USE_FLOAT
+ typedef float mrb_float;
+# define mrb_float_to_str(buf, i) sprintf(buf, "%.7e", i)
+# define str_to_mrb_float(buf) strtof(buf, NULL)
+#else
+ typedef double mrb_float;
+# define mrb_float_to_str(buf, i) sprintf(buf, "%.16e", i)
+# define str_to_mrb_float(buf) strtod(buf, NULL)
+#endif
+
+#ifdef _MSC_VER
+# ifndef __cplusplus
+# define inline __inline
+# endif
+# if _MSC_VER < 1900
+# include <stdarg.h>
+MRB_API int mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg);
+MRB_API int mrb_msvc_snprintf(char *s, size_t n, const char *format, ...);
+# define vsnprintf(s, n, format, arg) mrb_msvc_vsnprintf(s, n, format, arg)
+# define snprintf(s, n, format, ...) mrb_msvc_snprintf(s, n, format, __VA_ARGS__)
+# endif
+# if _MSC_VER < 1800
+# include <float.h>
+# define isfinite(n) _finite(n)
+# define isnan _isnan
+# define isinf(n) (!_finite(n) && !_isnan(n))
+# define signbit(n) (_copysign(1.0, (n)) < 0.0)
+# define strtof (float)strtod
+static const unsigned int IEEE754_INFINITY_BITS_SINGLE = 0x7F800000;
+# define INFINITY (*(float *)&IEEE754_INFINITY_BITS_SINGLE)
+# define NAN ((float)(INFINITY - INFINITY))
+# else
+# include <inttypes.h>
+# endif
+#else
+# include <inttypes.h>
+#endif
+
+enum mrb_vtype {
+ MRB_TT_FALSE = 0, /* 0 */
+ MRB_TT_FREE, /* 1 */
+ MRB_TT_TRUE, /* 2 */
+ MRB_TT_FIXNUM, /* 3 */
+ MRB_TT_SYMBOL, /* 4 */
+ MRB_TT_UNDEF, /* 5 */
+ MRB_TT_FLOAT, /* 6 */
+ MRB_TT_CPTR, /* 7 */
+ MRB_TT_OBJECT, /* 8 */
+ MRB_TT_CLASS, /* 9 */
+ MRB_TT_MODULE, /* 10 */
+ MRB_TT_ICLASS, /* 11 */
+ MRB_TT_SCLASS, /* 12 */
+ MRB_TT_PROC, /* 13 */
+ MRB_TT_ARRAY, /* 14 */
+ MRB_TT_HASH, /* 15 */
+ MRB_TT_STRING, /* 16 */
+ MRB_TT_RANGE, /* 17 */
+ MRB_TT_EXCEPTION, /* 18 */
+ MRB_TT_FILE, /* 19 */
+ MRB_TT_ENV, /* 20 */
+ MRB_TT_DATA, /* 21 */
+ MRB_TT_FIBER, /* 22 */
+ MRB_TT_MAXDEFINE /* 23 */
+};
+
+#include "mruby/object.h"
+
+#if defined(MRB_NAN_BOXING)
+#include "boxing_nan.h"
+#elif defined(MRB_WORD_BOXING)
+#include "boxing_word.h"
+#else
+#include "boxing_no.h"
+#endif
+
+#ifndef mrb_fixnum_p
+#define mrb_fixnum_p(o) (mrb_type(o) == MRB_TT_FIXNUM)
+#endif
+#ifndef mrb_undef_p
+#define mrb_undef_p(o) (mrb_type(o) == MRB_TT_UNDEF)
+#endif
+#ifndef mrb_nil_p
+#define mrb_nil_p(o) (mrb_type(o) == MRB_TT_FALSE && !mrb_fixnum(o))
+#endif
+#ifndef mrb_bool
+#define mrb_bool(o) (mrb_type(o) != MRB_TT_FALSE)
+#endif
+#define mrb_float_p(o) (mrb_type(o) == MRB_TT_FLOAT)
+#define mrb_symbol_p(o) (mrb_type(o) == MRB_TT_SYMBOL)
+#define mrb_array_p(o) (mrb_type(o) == MRB_TT_ARRAY)
+#define mrb_string_p(o) (mrb_type(o) == MRB_TT_STRING)
+#define mrb_hash_p(o) (mrb_type(o) == MRB_TT_HASH)
+#define mrb_cptr_p(o) (mrb_type(o) == MRB_TT_CPTR)
+#define mrb_exception_p(o) (mrb_type(o) == MRB_TT_EXCEPTION)
+#define mrb_test(o) mrb_bool(o)
+MRB_API mrb_bool mrb_regexp_p(struct mrb_state*, mrb_value);
+
+static inline mrb_value
+mrb_float_value(struct mrb_state *mrb, mrb_float f)
+{
+ mrb_value v;
+ (void) mrb;
+ SET_FLOAT_VALUE(mrb, v, f);
+ return v;
+}
+
+static inline mrb_value
+mrb_cptr_value(struct mrb_state *mrb, void *p)
+{
+ mrb_value v;
+ (void) mrb;
+ SET_CPTR_VALUE(mrb,v,p);
+ return v;
+}
+
+static inline mrb_value
+mrb_fixnum_value(mrb_int i)
+{
+ mrb_value v;
+ SET_INT_VALUE(v, i);
+ return v;
+}
+
+static inline mrb_value
+mrb_symbol_value(mrb_sym i)
+{
+ mrb_value v;
+ SET_SYM_VALUE(v, i);
+ return v;
+}
+
+static inline mrb_value
+mrb_obj_value(void *p)
+{
+ mrb_value v;
+ SET_OBJ_VALUE(v, (struct RBasic*)p);
+ return v;
+}
+
+static inline mrb_value
+mrb_nil_value(void)
+{
+ mrb_value v;
+ SET_NIL_VALUE(v);
+ return v;
+}
+
+static inline mrb_value
+mrb_false_value(void)
+{
+ mrb_value v;
+ SET_FALSE_VALUE(v);
+ return v;
+}
+
+static inline mrb_value
+mrb_true_value(void)
+{
+ mrb_value v;
+ SET_TRUE_VALUE(v);
+ return v;
+}
+
+static inline mrb_value
+mrb_bool_value(mrb_bool boolean)
+{
+ mrb_value v;
+ SET_BOOL_VALUE(v, boolean);
+ return v;
+}
+
+static inline mrb_value
+mrb_undef_value(void)
+{
+ mrb_value v;
+ SET_UNDEF_VALUE(v);
+ return v;
+}
+
+#ifdef MRB_USE_ETEXT_EDATA
+extern char _etext[];
+#ifdef MRB_NO_INIT_ARRAY_START
+extern char _edata[];
+
+static inline mrb_bool
+mrb_ro_data_p(const char *p)
+{
+ return _etext < p && p < _edata;
+}
+#else
+extern char __init_array_start[];
+
+static inline mrb_bool
+mrb_ro_data_p(const char *p)
+{
+ return _etext < p && p < (char*)&__init_array_start;
+}
+#endif
+#else
+# define mrb_ro_data_p(p) FALSE
+#endif
+
+#endif /* MRUBY_VALUE_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/variable.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,82 @@
+/*
+** mruby/variable.h - mruby variables
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_VARIABLE_H
+#define MRUBY_VARIABLE_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef struct global_variable {
+ int counter;
+ mrb_value *data;
+ mrb_value (*getter)(void);
+ void (*setter)(void);
+ /* void (*marker)(); */
+ /* int block_trace; */
+ /* struct trace_var *trace; */
+} global_variable;
+
+struct global_entry {
+ global_variable *var;
+ mrb_sym id;
+};
+
+mrb_value mrb_vm_special_get(mrb_state*, mrb_sym);
+void mrb_vm_special_set(mrb_state*, mrb_sym, mrb_value);
+mrb_value mrb_vm_iv_get(mrb_state*, mrb_sym);
+void mrb_vm_iv_set(mrb_state*, mrb_sym, mrb_value);
+mrb_value mrb_vm_cv_get(mrb_state*, mrb_sym);
+void mrb_vm_cv_set(mrb_state*, mrb_sym, mrb_value);
+mrb_value mrb_vm_const_get(mrb_state*, mrb_sym);
+void mrb_vm_const_set(mrb_state*, mrb_sym, mrb_value);
+MRB_API mrb_value mrb_const_get(mrb_state*, mrb_value, mrb_sym);
+MRB_API void mrb_const_set(mrb_state*, mrb_value, mrb_sym, mrb_value);
+MRB_API mrb_bool mrb_const_defined(mrb_state*, mrb_value, mrb_sym);
+MRB_API void mrb_const_remove(mrb_state*, mrb_value, mrb_sym);
+
+MRB_API mrb_bool mrb_iv_p(mrb_state *mrb, mrb_sym sym);
+MRB_API void mrb_iv_check(mrb_state *mrb, mrb_sym sym);
+MRB_API mrb_value mrb_obj_iv_get(mrb_state *mrb, struct RObject *obj, mrb_sym sym);
+MRB_API void mrb_obj_iv_set(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v);
+MRB_API mrb_bool mrb_obj_iv_defined(mrb_state *mrb, struct RObject *obj, mrb_sym sym);
+MRB_API void mrb_obj_iv_ifnone(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v);
+MRB_API mrb_value mrb_iv_get(mrb_state *mrb, mrb_value obj, mrb_sym sym);
+MRB_API void mrb_iv_set(mrb_state *mrb, mrb_value obj, mrb_sym sym, mrb_value v);
+MRB_API mrb_bool mrb_iv_defined(mrb_state*, mrb_value, mrb_sym);
+MRB_API mrb_value mrb_iv_remove(mrb_state *mrb, mrb_value obj, mrb_sym sym);
+MRB_API void mrb_iv_copy(mrb_state *mrb, mrb_value dst, mrb_value src);
+MRB_API mrb_bool mrb_const_defined_at(mrb_state *mrb, mrb_value mod, mrb_sym id);
+MRB_API mrb_value mrb_gv_get(mrb_state *mrb, mrb_sym sym);
+MRB_API void mrb_gv_set(mrb_state *mrb, mrb_sym sym, mrb_value val);
+MRB_API void mrb_gv_remove(mrb_state *mrb, mrb_sym sym);
+MRB_API mrb_value mrb_cv_get(mrb_state *mrb, mrb_value mod, mrb_sym sym);
+MRB_API void mrb_mod_cv_set(mrb_state *mrb, struct RClass * c, mrb_sym sym, mrb_value v);
+MRB_API void mrb_cv_set(mrb_state *mrb, mrb_value mod, mrb_sym sym, mrb_value v);
+MRB_API mrb_bool mrb_cv_defined(mrb_state *mrb, mrb_value mod, mrb_sym sym);
+mrb_value mrb_obj_iv_inspect(mrb_state*, struct RObject*);
+mrb_value mrb_mod_constants(mrb_state *mrb, mrb_value mod);
+mrb_value mrb_f_global_variables(mrb_state *mrb, mrb_value self);
+mrb_value mrb_obj_instance_variables(mrb_state*, mrb_value);
+mrb_value mrb_mod_class_variables(mrb_state*, mrb_value);
+mrb_value mrb_mod_cv_get(mrb_state *mrb, struct RClass * c, mrb_sym sym);
+mrb_bool mrb_mod_cv_defined(mrb_state *mrb, struct RClass * c, mrb_sym sym);
+mrb_sym mrb_class_sym(mrb_state *mrb, struct RClass *c, struct RClass *outer);
+
+/* GC functions */
+void mrb_gc_mark_gv(mrb_state*);
+void mrb_gc_free_gv(mrb_state*);
+void mrb_gc_mark_iv(mrb_state*, struct RObject*);
+size_t mrb_gc_mark_iv_size(mrb_state*, struct RObject*);
+void mrb_gc_free_iv(mrb_state*, struct RObject*);
+
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
+#endif /* MRUBY_VARIABLE_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/version.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,41 @@
+/*
+** mruby/version.h - mruby version definition
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_VERSION_H
+#define MRUBY_VERSION_H
+
+#define MRUBY_RUBY_VERSION "1.9"
+#define MRUBY_RUBY_ENGINE "mruby"
+
+#define MRUBY_VERSION "1.1.0"
+#define MRUBY_RELEASE_MAJOR 1
+#define MRUBY_RELEASE_MINOR 1
+#define MRUBY_RELEASE_TEENY 1
+#define MRUBY_RELEASE_NO 10101
+#define MRUBY_RELEASE_DATE "2014-11-19"
+#define MRUBY_RELEASE_YEAR 2014
+#define MRUBY_RELEASE_MONTH 11
+#define MRUBY_RELEASE_DAY 19
+
+#define MRUBY_BIRTH_YEAR 2010
+
+#define MRUBY_AUTHOR "mruby developers"
+
+#define MRB_STRINGIZE0(expr) #expr
+#define MRB_STRINGIZE(expr) MRB_STRINGIZE0(expr)
+
+#define MRUBY_DESCRIPTION \
+ "mruby " MRUBY_VERSION \
+ " (" MRUBY_RELEASE_DATE ") " \
+
+#define MRUBY_COPYRIGHT \
+ "mruby - Copyright (c) " \
+ MRB_STRINGIZE(MRUBY_BIRTH_YEAR)"-" \
+ MRB_STRINGIZE(MRUBY_RELEASE_YEAR)" " \
+ MRUBY_AUTHOR \
+
+#endif /* MRUBY_VERSION_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,105 @@
+/*
+ * This file contains a list of all
+ * initializing methods which are
+ * necessary to bootstrap all gems.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+
+#include "mruby.h"
+
+void GENERATED_TMP_mrb_mruby_sprintf_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_sprintf_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_print_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_print_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_math_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_math_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_struct_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_struct_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_enum_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_enum_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_string_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_string_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_numeric_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_numeric_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_array_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_array_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_hash_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_hash_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_range_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_range_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_proc_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_proc_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_symbol_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_symbol_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_random_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_random_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_object_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_object_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_objectspace_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_objectspace_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_fiber_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_fiber_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_enumerator_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_enumerator_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_enum_lazy_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_enum_lazy_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_toplevel_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_toplevel_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_kernel_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_kernel_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_mbed_gem_final(mrb_state*);
+
+static void
+mrb_final_mrbgems(mrb_state *mrb) {
+ GENERATED_TMP_mrb_mruby_sprintf_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_print_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_math_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_struct_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_enum_ext_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_string_ext_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_numeric_ext_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_array_ext_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_hash_ext_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_range_ext_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_proc_ext_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_symbol_ext_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_random_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_object_ext_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_objectspace_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_fiber_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_enumerator_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_enum_lazy_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_toplevel_ext_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_kernel_ext_gem_final(mrb);
+ GENERATED_TMP_mrb_mruby_mbed_gem_final(mrb);
+}
+
+void
+mrb_init_mrbgems(mrb_state *mrb) {
+ GENERATED_TMP_mrb_mruby_sprintf_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_print_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_math_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_struct_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_enum_ext_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_string_ext_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_numeric_ext_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_array_ext_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_hash_ext_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_range_ext_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_proc_ext_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_symbol_ext_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_random_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_object_ext_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_objectspace_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_fiber_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_enumerator_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_enum_lazy_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_toplevel_ext_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_kernel_ext_gem_init(mrb);
+ GENERATED_TMP_mrb_mruby_mbed_gem_init(mrb);
+ mrb_state_atexit(mrb, mrb_final_mrbgems);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-array-ext/array.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,167 @@
+#include "mruby.h"
+#include "mruby/value.h"
+#include "mruby/array.h"
+#include "mruby/range.h"
+#include "mruby/hash.h"
+
+/*
+ * call-seq:
+ * ary.assoc(obj) -> new_ary or nil
+ *
+ * Searches through an array whose elements are also arrays
+ * comparing _obj_ with the first element of each contained array
+ * using obj.==.
+ * Returns the first contained array that matches (that
+ * is, the first associated array),
+ * or +nil+ if no match is found.
+ * See also <code>Array#rassoc</code>.
+ *
+ * s1 = [ "colors", "red", "blue", "green" ]
+ * s2 = [ "letters", "a", "b", "c" ]
+ * s3 = "foo"
+ * a = [ s1, s2, s3 ]
+ * a.assoc("letters") #=> [ "letters", "a", "b", "c" ]
+ * a.assoc("foo") #=> nil
+ */
+
+static mrb_value
+mrb_ary_assoc(mrb_state *mrb, mrb_value ary)
+{
+ mrb_int i;
+ mrb_value v, k;
+
+ mrb_get_args(mrb, "o", &k);
+
+ for (i = 0; i < RARRAY_LEN(ary); ++i) {
+ v = mrb_check_array_type(mrb, RARRAY_PTR(ary)[i]);
+ if (!mrb_nil_p(v) && RARRAY_LEN(v) > 0 &&
+ mrb_equal(mrb, RARRAY_PTR(v)[0], k))
+ return v;
+ }
+ return mrb_nil_value();
+}
+
+/*
+ * call-seq:
+ * ary.rassoc(obj) -> new_ary or nil
+ *
+ * Searches through the array whose elements are also arrays. Compares
+ * _obj_ with the second element of each contained array using
+ * <code>==</code>. Returns the first contained array that matches. See
+ * also <code>Array#assoc</code>.
+ *
+ * a = [ [ 1, "one"], [2, "two"], [3, "three"], ["ii", "two"] ]
+ * a.rassoc("two") #=> [2, "two"]
+ * a.rassoc("four") #=> nil
+ */
+
+static mrb_value
+mrb_ary_rassoc(mrb_state *mrb, mrb_value ary)
+{
+ mrb_int i;
+ mrb_value v, value;
+
+ mrb_get_args(mrb, "o", &value);
+
+ for (i = 0; i < RARRAY_LEN(ary); ++i) {
+ v = RARRAY_PTR(ary)[i];
+ if (mrb_type(v) == MRB_TT_ARRAY &&
+ RARRAY_LEN(v) > 1 &&
+ mrb_equal(mrb, RARRAY_PTR(v)[1], value))
+ return v;
+ }
+ return mrb_nil_value();
+}
+
+/*
+ * call-seq:
+ * ary.at(index) -> obj or nil
+ *
+ * Returns the element at _index_. A
+ * negative index counts from the end of +self+. Returns +nil+
+ * if the index is out of range. See also <code>Array#[]</code>.
+ *
+ * a = [ "a", "b", "c", "d", "e" ]
+ * a.at(0) #=> "a"
+ * a.at(-1) #=> "e"
+ */
+
+static mrb_value
+mrb_ary_at(mrb_state *mrb, mrb_value ary)
+{
+ mrb_int pos;
+ mrb_get_args(mrb, "i", &pos);
+
+ return mrb_ary_entry(ary, pos);
+}
+
+static mrb_value
+mrb_ary_values_at(mrb_state *mrb, mrb_value self)
+{
+ mrb_int argc;
+ mrb_value *argv;
+
+ mrb_get_args(mrb, "*", &argv, &argc);
+
+ return mrb_get_values_at(mrb, self, RARRAY_LEN(self), argc, argv, mrb_ary_ref);
+}
+
+/*
+ * call-seq:
+ * ary.to_h -> Hash
+ *
+ * Returns the result of interpreting <i>aray</i> as an array of
+ * <tt>[key, value]</tt> paris.
+ *
+ * [[:foo, :bar], [1, 2]].to_h
+ * # => {:foo => :bar, 1 => 2}
+ */
+
+static mrb_value
+mrb_ary_to_h(mrb_state *mrb, mrb_value ary)
+{
+ mrb_int i;
+ mrb_value v, hash;
+
+ hash = mrb_hash_new_capa(mrb, 0);
+
+ for (i = 0; i < RARRAY_LEN(ary); ++i) {
+ v = mrb_check_array_type(mrb, RARRAY_PTR(ary)[i]);
+
+ if (mrb_nil_p(v)) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "wrong element type %S at %S (expected array)",
+ mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, RARRAY_PTR(ary)[i])),
+ mrb_fixnum_value(i)
+ );
+ }
+
+ if (RARRAY_LEN(v) != 2) {
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong array length at %S (expected 2, was %S)",
+ mrb_fixnum_value(i),
+ mrb_fixnum_value(RARRAY_LEN(v))
+ );
+ }
+
+ mrb_hash_set(mrb, hash, RARRAY_PTR(v)[0], RARRAY_PTR(v)[1]);
+ }
+
+ return hash;
+}
+
+void
+mrb_mruby_array_ext_gem_init(mrb_state* mrb)
+{
+ struct RClass * a = mrb->array_class;
+
+ mrb_define_method(mrb, a, "assoc", mrb_ary_assoc, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, a, "at", mrb_ary_at, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, a, "rassoc", mrb_ary_rassoc, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, a, "values_at", mrb_ary_values_at, MRB_ARGS_ANY());
+ mrb_define_method(mrb, a, "to_h", mrb_ary_to_h, MRB_ARGS_REQ(0));
+}
+
+void
+mrb_mruby_array_ext_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-array-ext/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,496 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_array_ext[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0xf7,0xae,0x00,0x00,0x1c,0x9e,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x1a,0x4e,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x36,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0x45,0x00,0x80,0x00,
+0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x05,0x41,0x72,
+0x72,0x61,0x79,0x00,0x00,0x00,0x01,0xf3,0x00,0x01,0x00,0x03,0x00,0x15,0x00,0x00,
+0x00,0x44,0x00,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,
+0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,0x46,0x00,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,0x46,0x40,0x81,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x0c,0x00,0x01,0x46,0x80,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0e,0x00,0x01,
+0x46,0xc0,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,0x46,0x00,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x12,0x00,0x01,0x46,0x40,0x82,0x00,0x11,0x05,0x80,0x00,
+0x20,0xc0,0x82,0x00,0x12,0x06,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x14,0x00,0x01,
+0x46,0x40,0x83,0x00,0x48,0x00,0x80,0x00,0xc0,0x16,0x00,0x01,0x46,0x80,0x83,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x18,0x00,0x01,0x46,0xc0,0x83,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x1a,0x00,0x01,0x46,0x00,0x84,0x00,0x48,0x00,0x80,0x00,0xc0,0x1c,0x00,0x01,
+0x46,0x40,0x84,0x00,0x48,0x00,0x80,0x00,0xc0,0x1e,0x00,0x01,0x46,0x80,0x84,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x20,0x00,0x01,0x46,0xc0,0x84,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x22,0x00,0x01,0x46,0x00,0x85,0x00,0x48,0x00,0x80,0x00,0xc0,0x24,0x00,0x01,
+0x46,0x40,0x84,0x00,0x48,0x00,0x80,0x00,0xc0,0x26,0x00,0x01,0x46,0x40,0x85,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x28,0x00,0x01,0x46,0x80,0x85,0x00,0x04,0x0b,0x80,0x00,
+0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x05,0x75,0x6e,
+0x69,0x71,0x21,0x00,0x00,0x04,0x75,0x6e,0x69,0x71,0x00,0x00,0x01,0x2d,0x00,0x00,
+0x01,0x7c,0x00,0x00,0x01,0x26,0x00,0x00,0x07,0x66,0x6c,0x61,0x74,0x74,0x65,0x6e,
+0x00,0x00,0x08,0x66,0x6c,0x61,0x74,0x74,0x65,0x6e,0x21,0x00,0x00,0x07,0x63,0x6f,
+0x6d,0x70,0x61,0x63,0x74,0x00,0x00,0x08,0x63,0x6f,0x6d,0x70,0x61,0x63,0x74,0x21,
+0x00,0x00,0x0c,0x72,0x65,0x76,0x65,0x72,0x73,0x65,0x5f,0x65,0x61,0x63,0x68,0x00,
+0x00,0x06,0x4f,0x62,0x6a,0x65,0x63,0x74,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,
+0x04,0x4e,0x4f,0x4e,0x45,0x00,0x00,0x05,0x66,0x65,0x74,0x63,0x68,0x00,0x00,0x04,
+0x66,0x69,0x6c,0x6c,0x00,0x00,0x06,0x72,0x6f,0x74,0x61,0x74,0x65,0x00,0x00,0x07,
+0x72,0x6f,0x74,0x61,0x74,0x65,0x21,0x00,0x00,0x09,0x64,0x65,0x6c,0x65,0x74,0x65,
+0x5f,0x69,0x66,0x00,0x00,0x07,0x72,0x65,0x6a,0x65,0x63,0x74,0x21,0x00,0x00,0x06,
+0x69,0x6e,0x73,0x65,0x72,0x74,0x00,0x00,0x07,0x62,0x73,0x65,0x61,0x72,0x63,0x68,
+0x00,0x00,0x07,0x6b,0x65,0x65,0x70,0x5f,0x69,0x66,0x00,0x00,0x07,0x73,0x65,0x6c,
+0x65,0x63,0x74,0x21,0x00,0x00,0x00,0x01,0x6c,0x00,0x07,0x00,0x0c,0x00,0x01,0x00,
+0x00,0x00,0x3c,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x03,0x20,0x00,0x80,0x03,
+0x01,0xc0,0x01,0x01,0x37,0xc0,0x81,0x01,0x19,0x0e,0xc0,0x00,0x3f,0xc0,0x01,0x02,
+0x97,0x08,0x40,0x00,0x01,0x80,0x80,0x03,0x20,0x40,0x80,0x03,0x01,0xc0,0x81,0x02,
+0x01,0x40,0x80,0x03,0x01,0x40,0x01,0x04,0xa0,0x80,0x80,0x03,0x01,0xc0,0x01,0x03,
+0x01,0x00,0x81,0x03,0x01,0x80,0x01,0x04,0xa0,0xc0,0x80,0x03,0x99,0x00,0xc0,0x03,
+0x97,0x02,0x40,0x00,0x01,0x40,0x81,0x03,0x01,0x00,0x01,0x04,0x01,0x80,0x81,0x04,
+0x01,0xc0,0x01,0x05,0x20,0x01,0x01,0x04,0x01,0x80,0x80,0x03,0x20,0x40,0x81,0x03,
+0x83,0xff,0x3f,0x04,0xb5,0x80,0x81,0x03,0x18,0xf5,0xbf,0x03,0x01,0x00,0x81,0x03,
+0x40,0x01,0x00,0x04,0x21,0xc0,0x81,0x03,0x17,0x07,0x40,0x00,0x17,0x04,0x40,0x00,
+0x01,0xc0,0x80,0x03,0x01,0x80,0x00,0x04,0x20,0x40,0x00,0x04,0xa0,0x00,0x82,0x03,
+0x01,0x80,0x80,0x03,0x01,0xc0,0x00,0x04,0x20,0x80,0x02,0x04,0xa0,0x40,0x82,0x03,
+0x01,0x80,0x80,0x03,0x20,0x40,0x81,0x03,0x83,0xff,0x3f,0x04,0xb5,0x80,0x81,0x03,
+0x98,0xf9,0xbf,0x03,0x01,0xc0,0x80,0x03,0x20,0x40,0x81,0x03,0x06,0x00,0x00,0x04,
+0x20,0x40,0x01,0x04,0xb2,0xc0,0x82,0x03,0x19,0x01,0xc0,0x03,0x05,0x00,0x80,0x03,
+0x97,0x01,0x40,0x00,0x06,0x00,0x80,0x03,0x01,0xc0,0x00,0x04,0xa0,0x00,0x83,0x03,
+0x29,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x03,0x64,0x75,
+0x70,0x00,0x00,0x05,0x73,0x68,0x69,0x66,0x74,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,
+0x00,0x00,0x08,0x68,0x61,0x73,0x5f,0x6b,0x65,0x79,0x3f,0x00,0x00,0x03,0x5b,0x5d,
+0x3d,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x3e,0x00,0x00,0x0a,0x65,
+0x61,0x63,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,
+0x06,0x64,0x65,0x6c,0x65,0x74,0x65,0x00,0x00,0x04,0x6c,0x61,0x73,0x74,0x00,0x00,
+0x02,0x3d,0x3d,0x00,0x00,0x07,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x00,
+0x00,0x33,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x05,0x26,0x00,0x00,0x02,
+0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x3c,0x3c,0x00,0x00,0x00,0x00,
+0x58,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0xa6,0x00,0x00,0x00,
+0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x01,0xc0,0x00,0x01,0x19,0x02,0xc0,0x00,
+0x01,0x80,0x80,0x01,0x01,0x40,0x00,0x02,0x21,0x40,0x80,0x01,0x17,0x01,0x40,0x00,
+0x01,0x80,0x80,0x01,0x20,0x40,0x80,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x03,0x64,0x75,0x70,0x00,0x00,0x05,0x75,0x6e,0x69,0x71,
+0x21,0x00,0x00,0x00,0x00,0xcd,0x00,0x05,0x00,0x0a,0x00,0x02,0x00,0x00,0x00,0x19,
+0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0x20,0x00,0x80,0x02,0x11,0x01,0x00,0x03,
+0xb2,0x40,0x80,0x02,0x99,0x00,0xc0,0x02,0x97,0x04,0x40,0x00,0x06,0x00,0x80,0x02,
+0x11,0x02,0x00,0x03,0x3d,0x00,0x80,0x03,0x01,0x40,0x00,0x04,0x20,0x00,0x00,0x04,
+0x3e,0x00,0x82,0x03,0xbd,0x00,0x00,0x04,0x3e,0x00,0x82,0x03,0x20,0xc1,0x80,0x02,
+0x3f,0x40,0x81,0x01,0x37,0x40,0x01,0x02,0x01,0x40,0x80,0x02,0x40,0x01,0x00,0x03,
+0x21,0x40,0x81,0x02,0x06,0x00,0x80,0x02,0x40,0x03,0x00,0x03,0x21,0x40,0x81,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x0e,0x63,0x61,0x6e,0x27,0x74,
+0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x00,0x00,0x0b,0x20,0x69,0x6e,0x74,
+0x6f,0x20,0x41,0x72,0x72,0x61,0x79,0x00,0x00,0x00,0x06,0x00,0x05,0x63,0x6c,0x61,
+0x73,0x73,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x05,0x41,0x72,0x72,0x61,0x79,0x00,
+0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,
+0x72,0x6f,0x72,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x3c,0x00,
+0x03,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x26,0x00,0x00,0x02,
+0x07,0x00,0x80,0x01,0x15,0xc0,0x00,0x02,0x01,0x40,0x80,0x02,0x01,0xc0,0x00,0x03,
+0x20,0x01,0x00,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x06,0x00,0x00,
+0x00,0x00,0x00,0x0b,0x26,0x00,0x00,0x02,0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x19,0x01,0xc0,0x01,0x05,0x00,0x80,0x01,0x97,0x01,0x40,0x00,
+0x15,0x00,0x81,0x01,0x01,0x40,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x5b,0x5d,0x00,0x00,0x02,0x3c,
+0x3c,0x00,0x00,0x00,0x00,0xce,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x18,
+0x26,0x00,0x00,0x02,0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,0x11,0x01,0x80,0x02,
+0xb2,0x40,0x00,0x02,0x99,0x00,0x40,0x02,0x97,0x04,0x40,0x00,0x06,0x00,0x00,0x02,
+0x11,0x02,0x80,0x02,0x3d,0x00,0x00,0x03,0x01,0x40,0x80,0x03,0x20,0x00,0x80,0x03,
+0x3e,0xc0,0x01,0x03,0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,0x20,0xc1,0x00,0x02,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xac,0x40,0x01,0x02,0x01,0x00,0x81,0x01,
+0x20,0x80,0x01,0x02,0x98,0x00,0x40,0x02,0x01,0xc0,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x02,0x00,0x00,0x0e,0x63,0x61,0x6e,0x27,0x74,0x20,0x63,0x6f,0x6e,
+0x76,0x65,0x72,0x74,0x20,0x00,0x00,0x0b,0x20,0x69,0x6e,0x74,0x6f,0x20,0x41,0x72,
+0x72,0x61,0x79,0x00,0x00,0x00,0x07,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,
+0x02,0x3d,0x3d,0x00,0x00,0x05,0x41,0x72,0x72,0x61,0x79,0x00,0x00,0x05,0x72,0x61,
+0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,
+0x00,0x01,0x2b,0x00,0x00,0x05,0x75,0x6e,0x69,0x71,0x21,0x00,0x00,0x00,0x00,0xcd,
+0x00,0x05,0x00,0x0a,0x00,0x02,0x00,0x00,0x00,0x19,0x00,0x00,0x26,0x00,0x00,0x02,
+0x01,0x40,0x80,0x02,0x20,0x00,0x80,0x02,0x11,0x01,0x00,0x03,0xb2,0x40,0x80,0x02,
+0x99,0x00,0xc0,0x02,0x97,0x04,0x40,0x00,0x06,0x00,0x80,0x02,0x11,0x02,0x00,0x03,
+0x3d,0x00,0x80,0x03,0x01,0x40,0x00,0x04,0x20,0x00,0x00,0x04,0x3e,0x00,0x82,0x03,
+0xbd,0x00,0x00,0x04,0x3e,0x00,0x82,0x03,0x20,0xc1,0x80,0x02,0x3f,0x40,0x81,0x01,
+0x37,0x40,0x01,0x02,0x01,0x40,0x80,0x02,0x40,0x01,0x00,0x03,0x21,0x40,0x81,0x02,
+0x06,0x00,0x80,0x02,0x40,0x03,0x00,0x03,0x21,0x40,0x81,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x02,0x00,0x00,0x0e,0x63,0x61,0x6e,0x27,0x74,0x20,0x63,0x6f,0x6e,
+0x76,0x65,0x72,0x74,0x20,0x00,0x00,0x0b,0x20,0x69,0x6e,0x74,0x6f,0x20,0x41,0x72,
+0x72,0x61,0x79,0x00,0x00,0x00,0x06,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,
+0x02,0x3d,0x3d,0x00,0x00,0x05,0x41,0x72,0x72,0x61,0x79,0x00,0x00,0x05,0x72,0x61,
+0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,
+0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x3c,0x00,0x03,0x00,0x08,0x00,
+0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x07,0x00,0x80,0x01,
+0x15,0xc0,0x00,0x02,0x01,0x40,0x80,0x02,0x01,0xc0,0x00,0x03,0x20,0x01,0x00,0x02,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x5b,0x5d,
+0x3d,0x00,0x00,0x00,0x00,0x65,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x0e,
+0x26,0x00,0x00,0x02,0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x99,0x03,0xc0,0x01,0x15,0x00,0x81,0x01,0x01,0x40,0x00,0x02,0xa0,0x40,0x80,0x01,
+0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x80,0x80,0x01,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x02,0x5b,0x5d,0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,0x06,0x64,0x65,0x6c,0x65,
+0x74,0x65,0x00,0x00,0x00,0x00,0x45,0x00,0x04,0x00,0x06,0x00,0x01,0x00,0x00,0x00,
+0x09,0x00,0x00,0x00,0x26,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x00,0x37,0x00,0x81,0x01,0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,
+0x21,0x00,0x00,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0xc0,0x00,0x03,0x00,0x08,0x00,
+0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x01,
+0x91,0x00,0x00,0x02,0xa0,0x00,0x80,0x01,0x19,0x03,0xc0,0x01,0x15,0x40,0x80,0x01,
+0x20,0x80,0x80,0x01,0x98,0x01,0xc0,0x01,0x15,0x40,0x80,0x01,0x83,0xff,0x3f,0x02,
+0xb5,0xc0,0x80,0x01,0x99,0x06,0xc0,0x01,0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,
+0x15,0x40,0x80,0x02,0x20,0x80,0x80,0x02,0x19,0x01,0xc0,0x02,0x05,0x00,0x80,0x02,
+0x17,0x01,0x40,0x00,0x15,0x40,0x80,0x02,0xaf,0x40,0x81,0x02,0xa0,0x00,0x01,0x02,
+0xac,0x80,0x81,0x01,0x16,0xc0,0x80,0x01,0x97,0x01,0x40,0x00,0x15,0xc0,0x80,0x01,
+0x01,0x40,0x00,0x02,0xa0,0xc0,0x81,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x08,0x00,0x05,0x69,0x73,0x5f,0x61,0x3f,0x00,0x00,0x05,0x41,0x72,
+0x72,0x61,0x79,0x00,0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,0x00,0x01,0x3e,0x00,0x00,
+0x07,0x66,0x6c,0x61,0x74,0x74,0x65,0x6e,0x00,0x00,0x01,0x2d,0x00,0x00,0x01,0x2b,
+0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,0x00,0x00,0x6b,0x00,0x05,0x00,0x08,0x00,0x01,
+0x00,0x00,0x00,0x10,0x26,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x00,0x08,0x00,0x80,0x01,0x37,0x40,0x01,0x02,0x06,0x00,0x80,0x02,
+0x40,0x01,0x00,0x03,0x21,0x00,0x80,0x02,0x19,0x02,0xc0,0x01,0x06,0x00,0x80,0x02,
+0x01,0x00,0x01,0x03,0xa0,0x40,0x80,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x02,
+0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x07,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x00,0x00,
+0xc8,0x00,0x03,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x26,0x00,0x00,0x02,
+0x01,0x40,0x80,0x01,0x91,0x00,0x00,0x02,0xa0,0x00,0x80,0x01,0x19,0x03,0xc0,0x01,
+0x15,0x40,0x80,0x01,0x20,0x80,0x80,0x01,0x98,0x01,0xc0,0x01,0x15,0x40,0x80,0x01,
+0x83,0xff,0x3f,0x02,0xb5,0xc0,0x80,0x01,0x99,0x07,0xc0,0x01,0x15,0x00,0x81,0x01,
+0x01,0x40,0x00,0x02,0x15,0x40,0x80,0x02,0x20,0x80,0x80,0x02,0x19,0x01,0xc0,0x02,
+0x05,0x00,0x80,0x02,0x17,0x01,0x40,0x00,0x15,0x40,0x80,0x02,0xaf,0x40,0x81,0x02,
+0xa0,0x00,0x01,0x02,0xac,0x80,0x81,0x01,0x16,0x00,0x81,0x01,0x07,0x00,0x80,0x01,
+0x16,0xc0,0x80,0x01,0x97,0x01,0x40,0x00,0x15,0x00,0x81,0x01,0x01,0x40,0x00,0x02,
+0xa0,0xc0,0x81,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+0x00,0x05,0x69,0x73,0x5f,0x61,0x3f,0x00,0x00,0x05,0x41,0x72,0x72,0x61,0x79,0x00,
+0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,0x00,0x01,0x3e,0x00,0x00,0x07,0x66,0x6c,0x61,
+0x74,0x74,0x65,0x6e,0x00,0x00,0x01,0x2d,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x3c,
+0x3c,0x00,0x00,0x00,0x00,0x43,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x06,
+0x26,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x01,0xc0,0x00,0x01,
+0x20,0x40,0x80,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x03,0x64,0x75,0x70,0x00,0x00,0x08,0x63,0x6f,0x6d,0x70,0x61,0x63,0x74,0x21,
+0x00,0x00,0x00,0x00,0x79,0x00,0x03,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x10,0x00,
+0x26,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,
+0x01,0xc0,0x00,0x01,0x20,0x40,0x80,0x01,0x06,0x00,0x00,0x02,0x20,0x40,0x00,0x02,
+0xb2,0x80,0x80,0x01,0x19,0x01,0xc0,0x01,0x05,0x00,0x80,0x01,0x97,0x01,0x40,0x00,
+0x06,0x00,0x80,0x01,0x01,0x80,0x00,0x02,0xa0,0xc0,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x06,0x73,0x65,0x6c,0x65,0x63,0x74,
+0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x07,0x72,
+0x65,0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x00,0x00,0x33,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x01,
+0x05,0x00,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x02,0x21,0x3d,0x00,0x00,0x00,0x00,0xce,0x00,0x03,0x00,
+0x07,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,
+0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,
+0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x06,0x00,0x80,0x01,
+0x20,0xc0,0x80,0x01,0xaf,0x00,0x81,0x01,0x01,0xc0,0x00,0x01,0x17,0x04,0x40,0x00,
+0x01,0x40,0x80,0x01,0x06,0x00,0x00,0x02,0x01,0x80,0x80,0x02,0xa0,0x80,0x01,0x02,
+0xa0,0x40,0x81,0x01,0x01,0x80,0x80,0x01,0xaf,0x00,0x81,0x01,0x01,0xc0,0x00,0x01,
+0x01,0x80,0x80,0x01,0x83,0xff,0x3f,0x02,0xb6,0xc0,0x81,0x01,0x18,0xfa,0xbf,0x01,
+0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x0c,0x72,0x65,0x76,0x65,0x72,
+0x73,0x65,0x5f,0x65,0x61,0x63,0x68,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,
+0x01,0x2d,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,
+0x02,0x3e,0x3d,0x00,0x00,0x00,0x01,0xd9,0x00,0x05,0x00,0x0a,0x00,0x00,0x00,0x00,
+0x00,0x45,0x00,0x00,0xa6,0x00,0x20,0x00,0x17,0x01,0x40,0x00,0x17,0x01,0x40,0x00,
+0x17,0x01,0x40,0x00,0x05,0x00,0x80,0x00,0x11,0x00,0x00,0x01,0x01,0x40,0x80,0x02,
+0x05,0x00,0x00,0x03,0xa0,0x40,0x80,0x02,0x99,0x01,0xc0,0x02,0x01,0x80,0x80,0x02,
+0x11,0x00,0x00,0x03,0xa0,0x40,0x80,0x02,0x99,0x00,0xc0,0x02,0x01,0xc0,0x80,0x02,
+0x99,0x01,0xc0,0x02,0x06,0x00,0x80,0x02,0x3d,0x00,0x00,0x03,0xa0,0x80,0x80,0x02,
+0x01,0x40,0x00,0x02,0x01,0x00,0x81,0x02,0x83,0xff,0x3f,0x03,0xb3,0xc0,0x80,0x02,
+0x99,0x02,0xc0,0x02,0x01,0x00,0x81,0x02,0x06,0x00,0x00,0x03,0x20,0x00,0x01,0x03,
+0xac,0x40,0x81,0x02,0x01,0x40,0x01,0x02,0x01,0x00,0x81,0x02,0x83,0xff,0x3f,0x03,
+0xb3,0xc0,0x80,0x02,0x18,0x02,0xc0,0x02,0x06,0x00,0x80,0x02,0x20,0x00,0x81,0x02,
+0x01,0x00,0x01,0x03,0xb4,0x80,0x81,0x02,0x99,0x0d,0xc0,0x02,0x19,0x02,0xc0,0x01,
+0x01,0xc0,0x80,0x02,0x01,0x40,0x00,0x03,0xa0,0xc0,0x81,0x02,0x29,0x00,0x80,0x02,
+0x01,0x80,0x80,0x02,0x11,0x00,0x00,0x03,0xb2,0x00,0x82,0x02,0x99,0x08,0xc0,0x02,
+0x06,0x00,0x80,0x02,0x11,0x05,0x00,0x03,0xbd,0x00,0x80,0x03,0x01,0x40,0x00,0x04,
+0x3e,0x00,0x82,0x03,0x3d,0x01,0x00,0x04,0x3e,0x00,0x82,0x03,0x06,0x00,0x00,0x04,
+0x20,0x00,0x01,0x04,0x20,0xc0,0x02,0x04,0x3e,0x00,0x82,0x03,0xbd,0x01,0x00,0x04,
+0x3e,0x00,0x82,0x03,0x06,0x00,0x00,0x04,0x20,0x00,0x01,0x04,0x3e,0x00,0x82,0x03,
+0x20,0x41,0x82,0x02,0x29,0x00,0x00,0x01,0x06,0x00,0x80,0x02,0x01,0x00,0x01,0x03,
+0xa0,0x00,0x83,0x02,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x27,0x62,
+0x6c,0x6f,0x63,0x6b,0x20,0x73,0x75,0x70,0x65,0x72,0x73,0x65,0x64,0x65,0x73,0x20,
+0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x61,0x72,
+0x67,0x75,0x6d,0x65,0x6e,0x74,0x00,0x00,0x06,0x69,0x6e,0x64,0x65,0x78,0x20,0x00,
+0x00,0x1a,0x20,0x6f,0x75,0x74,0x73,0x69,0x64,0x65,0x20,0x6f,0x66,0x20,0x61,0x72,
+0x72,0x61,0x79,0x20,0x62,0x6f,0x75,0x6e,0x64,0x73,0x3a,0x20,0x00,0x00,0x03,0x2e,
+0x2e,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x04,0x4e,0x4f,0x4e,0x45,0x00,
+0x00,0x02,0x21,0x3d,0x00,0x00,0x04,0x77,0x61,0x72,0x6e,0x00,0x00,0x01,0x3c,0x00,
+0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x3c,0x3d,0x00,
+0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x05,0x72,0x61,
+0x69,0x73,0x65,0x00,0x00,0x0a,0x49,0x6e,0x64,0x65,0x78,0x45,0x72,0x72,0x6f,0x72,
+0x00,0x00,0x02,0x2d,0x40,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x00,0x04,0x65,0x00,
+0x09,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0xa6,0x00,0x30,0x00,
+0x97,0x01,0x40,0x00,0x97,0x01,0x40,0x00,0x97,0x01,0x40,0x00,0x97,0x01,0x40,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x05,0x00,0x80,0x01,0x01,0x40,0x80,0x04,
+0x05,0x00,0x00,0x05,0xb2,0x00,0x80,0x04,0x99,0x01,0xc0,0x04,0x01,0x80,0x80,0x04,
+0x05,0x00,0x00,0x05,0xb2,0x00,0x80,0x04,0x99,0x01,0xc0,0x04,0x01,0xc0,0x80,0x04,
+0x05,0x00,0x00,0x05,0xb2,0x00,0x80,0x04,0x19,0x01,0xc0,0x04,0x01,0x00,0x81,0x04,
+0x20,0x40,0x80,0x04,0x19,0x02,0xc0,0x04,0x06,0x00,0x80,0x04,0x91,0x01,0x00,0x05,
+0x3d,0x00,0x80,0x05,0x20,0x81,0x80,0x04,0x83,0xff,0xbf,0x04,0x01,0x40,0x02,0x03,
+0x01,0x40,0x82,0x02,0x37,0x40,0x82,0x03,0x19,0x29,0x40,0x02,0x01,0x40,0x80,0x04,
+0x05,0x00,0x00,0x05,0xb2,0x00,0x80,0x04,0x99,0x01,0xc0,0x04,0x01,0x80,0x80,0x04,
+0x05,0x00,0x00,0x05,0xb2,0x00,0x80,0x04,0x99,0x01,0xc0,0x04,0x01,0xc0,0x80,0x04,
+0x05,0x00,0x00,0x05,0xb2,0x00,0x80,0x04,0x99,0x02,0xc0,0x04,0x83,0xff,0xbf,0x02,
+0x06,0x00,0x80,0x04,0x20,0x00,0x81,0x04,0x01,0x40,0x02,0x03,0x17,0x20,0x40,0x00,
+0x01,0x40,0x80,0x04,0x05,0x00,0x00,0x05,0xa0,0x40,0x81,0x04,0x99,0x01,0xc0,0x04,
+0x01,0x40,0x80,0x04,0x91,0x03,0x00,0x05,0xa0,0x80,0x81,0x04,0x19,0x0f,0xc0,0x04,
+0x01,0x40,0x80,0x04,0x20,0x00,0x82,0x04,0x01,0x40,0x82,0x02,0x83,0xff,0x3f,0x05,
+0xb3,0x40,0x82,0x04,0x99,0x02,0xc0,0x04,0x01,0x40,0x81,0x04,0x06,0x00,0x00,0x05,
+0x20,0x00,0x01,0x05,0xac,0x80,0x82,0x04,0x01,0x40,0x82,0x02,0x01,0x40,0x80,0x04,
+0x20,0xc0,0x82,0x04,0x01,0x40,0x02,0x03,0x83,0xff,0x3f,0x05,0xb3,0x40,0x82,0x04,
+0x99,0x02,0xc0,0x04,0x01,0x80,0x81,0x04,0x06,0x00,0x00,0x05,0x20,0x00,0x01,0x05,
+0xac,0x80,0x82,0x04,0x01,0x40,0x02,0x03,0x01,0x40,0x80,0x04,0x20,0x00,0x83,0x04,
+0x99,0x00,0xc0,0x04,0x97,0x01,0x40,0x00,0x01,0x80,0x81,0x04,0xad,0x80,0x82,0x04,
+0x01,0x40,0x02,0x03,0x17,0x0d,0x40,0x00,0x01,0x40,0x80,0x04,0x05,0x00,0x00,0x05,
+0xa0,0x40,0x81,0x04,0x19,0x0b,0xc0,0x04,0x01,0x40,0x80,0x02,0x01,0x40,0x81,0x04,
+0x83,0xff,0x3f,0x05,0xb3,0x40,0x82,0x04,0x99,0x02,0xc0,0x04,0x01,0x40,0x81,0x04,
+0x06,0x00,0x00,0x05,0x20,0x00,0x01,0x05,0xac,0x80,0x82,0x04,0x01,0x40,0x82,0x02,
+0x01,0x80,0x80,0x04,0x05,0x00,0x00,0x05,0xb2,0x00,0x80,0x04,0x19,0x02,0xc0,0x04,
+0x06,0x00,0x80,0x04,0x20,0x00,0x81,0x04,0x01,0x40,0x02,0x03,0x17,0x02,0x40,0x00,
+0x01,0x40,0x80,0x04,0x01,0x80,0x00,0x05,0xac,0x80,0x82,0x04,0x01,0x40,0x02,0x03,
+0x97,0x2c,0x40,0x00,0x01,0x40,0x80,0x04,0x05,0x00,0x00,0x05,0xa0,0x40,0x81,0x04,
+0x99,0x01,0xc0,0x04,0x01,0x80,0x80,0x04,0x05,0x00,0x00,0x05,0xb2,0x00,0x80,0x04,
+0x99,0x01,0xc0,0x04,0x01,0xc0,0x80,0x04,0x05,0x00,0x00,0x05,0xb2,0x00,0x80,0x04,
+0x99,0x02,0xc0,0x04,0x83,0xff,0xbf,0x02,0x06,0x00,0x80,0x04,0x20,0x00,0x81,0x04,
+0x01,0x40,0x02,0x03,0x17,0x24,0x40,0x00,0x01,0x40,0x80,0x04,0x05,0x00,0x00,0x05,
+0xa0,0x40,0x81,0x04,0x99,0x01,0xc0,0x04,0x01,0x80,0x80,0x04,0x05,0x00,0x00,0x05,
+0xa0,0x40,0x81,0x04,0x99,0x01,0xc0,0x04,0x01,0x80,0x80,0x04,0x91,0x03,0x00,0x05,
+0xa0,0x80,0x81,0x04,0x19,0x0f,0xc0,0x04,0x01,0x80,0x80,0x04,0x20,0x00,0x82,0x04,
+0x01,0x40,0x82,0x02,0x83,0xff,0x3f,0x05,0xb3,0x40,0x82,0x04,0x99,0x02,0xc0,0x04,
+0x01,0x40,0x81,0x04,0x06,0x00,0x00,0x05,0x20,0x00,0x01,0x05,0xac,0x80,0x82,0x04,
+0x01,0x40,0x82,0x02,0x01,0x80,0x80,0x04,0x20,0xc0,0x82,0x04,0x01,0x40,0x02,0x03,
+0x83,0xff,0x3f,0x05,0xb3,0x40,0x82,0x04,0x99,0x02,0xc0,0x04,0x01,0x80,0x81,0x04,
+0x06,0x00,0x00,0x05,0x20,0x00,0x01,0x05,0xac,0x80,0x82,0x04,0x01,0x40,0x02,0x03,
+0x01,0x80,0x80,0x04,0x20,0x00,0x83,0x04,0x99,0x00,0xc0,0x04,0x97,0x01,0x40,0x00,
+0x01,0x80,0x81,0x04,0xad,0x80,0x82,0x04,0x01,0x40,0x02,0x03,0x17,0x0f,0x40,0x00,
+0x01,0x40,0x80,0x04,0x05,0x00,0x00,0x05,0xa0,0x40,0x81,0x04,0x99,0x01,0xc0,0x04,
+0x01,0x80,0x80,0x04,0x05,0x00,0x00,0x05,0xa0,0x40,0x81,0x04,0x19,0x0b,0xc0,0x04,
+0x01,0x80,0x80,0x02,0x01,0x40,0x81,0x04,0x83,0xff,0x3f,0x05,0xb3,0x40,0x82,0x04,
+0x99,0x02,0xc0,0x04,0x01,0x40,0x81,0x04,0x06,0x00,0x00,0x05,0x20,0x00,0x01,0x05,
+0xac,0x80,0x82,0x04,0x01,0x40,0x82,0x02,0x01,0xc0,0x80,0x04,0x05,0x00,0x00,0x05,
+0xb2,0x00,0x80,0x04,0x19,0x02,0xc0,0x04,0x06,0x00,0x80,0x04,0x20,0x00,0x81,0x04,
+0x01,0x40,0x02,0x03,0x17,0x02,0x40,0x00,0x01,0x40,0x81,0x04,0x01,0xc0,0x00,0x05,
+0xac,0x80,0x82,0x04,0x01,0x40,0x02,0x03,0x01,0x40,0x01,0x04,0x19,0x08,0x40,0x02,
+0x17,0x05,0x40,0x00,0x01,0x00,0x81,0x04,0x01,0x00,0x02,0x05,0xa0,0x40,0x83,0x04,
+0x06,0x00,0x00,0x05,0x01,0x00,0x82,0x05,0x01,0x40,0x02,0x06,0x20,0x81,0x03,0x05,
+0x01,0x00,0x82,0x04,0xad,0x80,0x82,0x04,0x01,0x40,0x02,0x04,0x01,0x00,0x82,0x04,
+0x01,0x80,0x01,0x05,0xb3,0x40,0x82,0x04,0x18,0xf9,0xbf,0x04,0x97,0x06,0x40,0x00,
+0x17,0x04,0x40,0x00,0x01,0x40,0x80,0x04,0x06,0x00,0x00,0x05,0x01,0x00,0x82,0x05,
+0x01,0x40,0x02,0x06,0x20,0x81,0x03,0x05,0x01,0x00,0x82,0x04,0xad,0x80,0x82,0x04,
+0x01,0x40,0x02,0x04,0x01,0x00,0x82,0x04,0x01,0x80,0x01,0x05,0xb3,0x40,0x82,0x04,
+0x18,0xfa,0xbf,0x04,0x06,0x00,0x80,0x04,0x29,0x00,0x80,0x04,0x00,0x00,0x00,0x01,
+0x00,0x00,0x26,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,
+0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x30,0x20,
+0x66,0x6f,0x72,0x20,0x31,0x2e,0x2e,0x33,0x29,0x00,0x00,0x00,0x0f,0x00,0x02,0x3d,
+0x3d,0x00,0x00,0x01,0x21,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,
+0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x04,
+0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x08,0x6b,0x69,0x6e,0x64,
+0x5f,0x6f,0x66,0x3f,0x00,0x00,0x05,0x52,0x61,0x6e,0x67,0x65,0x00,0x00,0x05,0x62,
+0x65,0x67,0x69,0x6e,0x00,0x00,0x01,0x3c,0x00,0x00,0x01,0x2b,0x00,0x00,0x03,0x65,
+0x6e,0x64,0x00,0x00,0x0c,0x65,0x78,0x63,0x6c,0x75,0x64,0x65,0x5f,0x65,0x6e,0x64,
+0x3f,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,
+0x00,0x00,0xbb,0x00,0x06,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,
+0x26,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,0x03,0x00,0xc0,0x00,
+0x37,0x80,0x81,0x01,0x06,0x00,0x00,0x03,0x20,0x00,0x00,0x03,0x01,0x80,0x01,0x02,
+0x83,0xff,0xbf,0x03,0xb5,0x40,0x00,0x03,0x99,0x09,0x40,0x03,0x01,0x40,0x00,0x03,
+0x83,0xff,0xbf,0x03,0xb3,0x80,0x00,0x03,0x19,0x04,0x40,0x03,0x01,0x00,0x01,0x03,
+0x01,0x40,0x80,0x03,0x20,0x00,0x81,0x03,0x01,0x00,0x01,0x04,0xa0,0x40,0x81,0x03,
+0xae,0xc0,0x00,0x03,0xaf,0xc0,0x00,0x03,0x97,0x01,0x40,0x00,0x01,0x40,0x00,0x03,
+0x01,0x00,0x81,0x03,0xa0,0x40,0x01,0x03,0x01,0x80,0x81,0x02,0x01,0x00,0x01,0x03,
+0x40,0x01,0x80,0x03,0x21,0x80,0x01,0x03,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x07,0x00,0x06,0x6c,0x65,0x6e,0x67,0x74,0x68,0x00,0x00,0x01,0x3e,
+0x00,0x00,0x01,0x3c,0x00,0x00,0x01,0x2d,0x00,0x00,0x01,0x7e,0x00,0x00,0x01,0x25,
+0x00,0x00,0x05,0x74,0x69,0x6d,0x65,0x73,0x00,0x00,0x00,0x00,0x78,0x00,0x01,0x00,
+0x05,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x15,0xc0,0x80,0x00,0x06,0x00,0x00,0x01,
+0x15,0x40,0x81,0x01,0xa0,0x40,0x00,0x01,0xa0,0x00,0x80,0x00,0x15,0x40,0x81,0x00,
+0xad,0x80,0x80,0x00,0x16,0x40,0x81,0x00,0x15,0x40,0x81,0x00,0x15,0x00,0x01,0x01,
+0xaf,0x00,0x01,0x01,0xb5,0xc0,0x80,0x00,0x99,0x01,0xc0,0x00,0x83,0xff,0xbf,0x00,
+0x16,0x40,0x81,0x00,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x00,0x29,0x00,0x80,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x3c,0x3c,0x00,0x00,0x02,0x5b,
+0x5d,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3e,0x00,0x00,0x01,0x2d,0x00,0x00,0x00,
+0x00,0x55,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0a,0x26,0x00,0x10,0x00,
+0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,0x03,0x00,0xc0,0x00,0x06,0x00,0x80,0x01,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x72,0x65,
+0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x06,0x72,0x6f,0x74,0x61,0x74,0x65,0x00,0x00,
+0x00,0x00,0xe2,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,
+0x29,0x00,0x80,0x01,0x83,0xff,0x3f,0x01,0x97,0x06,0x40,0x00,0x01,0x40,0x80,0x01,
+0x06,0x00,0x00,0x02,0x01,0x80,0x80,0x02,0xa0,0x00,0x01,0x02,0xa0,0xc0,0x80,0x01,
+0x19,0x02,0xc0,0x01,0x06,0x00,0x80,0x01,0x01,0x80,0x00,0x02,0xa0,0x40,0x81,0x01,
+0x97,0x01,0x40,0x00,0x01,0x80,0x80,0x01,0xad,0x80,0x81,0x01,0x01,0xc0,0x00,0x01,
+0x01,0x80,0x80,0x01,0x06,0x00,0x00,0x02,0x20,0x00,0x02,0x02,0xb3,0xc0,0x81,0x01,
+0x18,0xf7,0xbf,0x01,0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x09,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x09,0x64,
+0x65,0x6c,0x65,0x74,0x65,0x5f,0x69,0x66,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,
+0x00,0x02,0x5b,0x5d,0x00,0x00,0x09,0x64,0x65,0x6c,0x65,0x74,0x65,0x5f,0x61,0x74,
+0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,
+0x00,0x00,0x01,0x0d,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,0x99,0x00,0x40,0x02,
+0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x02,0x04,0x01,0x80,0x02,0xa0,0x40,0x00,0x02,
+0x29,0x00,0x00,0x02,0x06,0x00,0x00,0x02,0x20,0xc0,0x00,0x02,0x01,0x00,0x01,0x01,
+0x83,0xff,0xbf,0x01,0x97,0x06,0x40,0x00,0x01,0x40,0x00,0x02,0x06,0x00,0x80,0x02,
+0x01,0xc0,0x00,0x03,0xa0,0x40,0x81,0x02,0xa0,0x00,0x01,0x02,0x19,0x02,0x40,0x02,
+0x06,0x00,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0x80,0x01,0x02,0x97,0x01,0x40,0x00,
+0x01,0xc0,0x00,0x02,0xad,0xc0,0x01,0x02,0x01,0x00,0x81,0x01,0x01,0xc0,0x00,0x02,
+0x06,0x00,0x80,0x02,0x20,0xc0,0x80,0x02,0xb3,0x00,0x02,0x02,0x18,0xf7,0x3f,0x02,
+0x06,0x00,0x00,0x02,0x20,0xc0,0x00,0x02,0x01,0x80,0x80,0x02,0xb2,0x40,0x02,0x02,
+0x19,0x01,0x40,0x02,0x05,0x00,0x00,0x02,0x97,0x00,0x40,0x00,0x06,0x00,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x0c,0x62,0x6c,
+0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,
+0x65,0x6e,0x75,0x6d,0x00,0x00,0x07,0x72,0x65,0x6a,0x65,0x63,0x74,0x21,0x00,0x00,
+0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x5b,
+0x5d,0x00,0x00,0x09,0x64,0x65,0x6c,0x65,0x74,0x65,0x5f,0x61,0x74,0x00,0x00,0x01,
+0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x00,0x00,0x7b,0x00,
+0x04,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x26,0x00,0x08,0x02,
+0x01,0x40,0x00,0x02,0x83,0xff,0xbf,0x02,0xb3,0x00,0x00,0x02,0x19,0x03,0x40,0x02,
+0x01,0x40,0x00,0x02,0x06,0x00,0x80,0x02,0x20,0x40,0x80,0x02,0xad,0x80,0x80,0x02,
+0xac,0x80,0x00,0x02,0x01,0x00,0x81,0x00,0x01,0x80,0x00,0x02,0x06,0x00,0x80,0x02,
+0x01,0x40,0x00,0x03,0x83,0xff,0xbf,0x03,0x01,0x00,0x01,0x04,0xa0,0xc1,0x80,0x02,
+0x06,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x01,0x3c,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,
+0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x01,0xde,0x00,0x09,0x00,0x0d,0x00,0x00,0x00,
+0x00,0x00,0x57,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x04,0x20,0x00,0x80,0x04,
+0x99,0x00,0xc0,0x04,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x04,0x04,0x01,0x00,0x05,
+0xa0,0x40,0x80,0x04,0x29,0x00,0x80,0x04,0x83,0xff,0x3f,0x01,0x06,0x00,0x80,0x04,
+0x20,0xc0,0x80,0x04,0x01,0x40,0x82,0x01,0x08,0x00,0x00,0x02,0x97,0x1a,0x40,0x00,
+0x01,0x80,0x80,0x04,0x01,0xc0,0x00,0x05,0x01,0x80,0x80,0x05,0xae,0x40,0x01,0x05,
+0x83,0x00,0xc0,0x05,0xb1,0x80,0x01,0x05,0x20,0xc0,0x01,0x05,0xac,0x00,0x81,0x04,
+0x01,0x40,0x82,0x02,0x06,0x00,0x80,0x04,0x01,0x40,0x01,0x05,0xa0,0x00,0x82,0x04,
+0x01,0x40,0x02,0x03,0x01,0x40,0x80,0x04,0x01,0x80,0x01,0x05,0xa0,0x40,0x82,0x04,
+0x01,0x40,0x82,0x03,0x91,0x05,0x00,0x05,0xa0,0x80,0x82,0x04,0x99,0x05,0xc0,0x04,
+0x01,0xc0,0x81,0x04,0x83,0xff,0x3f,0x05,0xb2,0x00,0x83,0x04,0x19,0x01,0xc0,0x04,
+0x01,0x80,0x81,0x04,0x29,0x80,0x80,0x04,0x01,0xc0,0x81,0x04,0x83,0xff,0x3f,0x05,
+0xb3,0x40,0x83,0x04,0x01,0x40,0x02,0x04,0x17,0x08,0x40,0x00,0x01,0xc0,0x81,0x04,
+0x07,0x00,0x00,0x05,0xb2,0x00,0x83,0x04,0x99,0x01,0xc0,0x04,0x07,0x00,0x00,0x02,
+0x07,0x00,0x00,0x04,0x97,0x04,0x40,0x00,0x01,0xc0,0x81,0x04,0x08,0x00,0x00,0x05,
+0xb2,0x00,0x83,0x04,0x98,0x01,0xc0,0x04,0x01,0xc0,0x81,0x04,0x05,0x00,0x00,0x05,
+0xb2,0x00,0x83,0x04,0x99,0x00,0xc0,0x04,0x08,0x00,0x00,0x04,0x19,0x01,0x40,0x04,
+0x01,0x40,0x81,0x01,0x97,0x01,0x40,0x00,0x01,0x40,0x81,0x04,0xad,0x00,0x81,0x04,
+0x01,0x40,0x02,0x01,0x01,0x80,0x80,0x04,0x01,0xc0,0x00,0x05,0xb3,0x40,0x83,0x04,
+0x98,0xe3,0xbf,0x04,0x01,0x80,0x80,0x04,0x06,0x00,0x00,0x05,0x20,0xc0,0x00,0x05,
+0xb2,0x00,0x83,0x04,0x19,0x01,0xc0,0x04,0x05,0x00,0x80,0x04,0x29,0x00,0x80,0x04,
+0x99,0x00,0x40,0x02,0x17,0x01,0x40,0x00,0x05,0x00,0x80,0x04,0x29,0x00,0x80,0x04,
+0x06,0x00,0x80,0x04,0x01,0x80,0x00,0x05,0xa0,0x00,0x82,0x04,0x29,0x00,0x80,0x04,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x07,0x62,0x73,0x65,0x61,0x72,0x63,0x68,0x00,0x00,0x04,0x73,0x69,0x7a,
+0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x2d,0x00,0x00,0x01,0x2f,0x00,0x00,0x08,
+0x74,0x72,0x75,0x6e,0x63,0x61,0x74,0x65,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x04,
+0x63,0x61,0x6c,0x6c,0x00,0x00,0x05,0x69,0x73,0x5f,0x61,0x3f,0x00,0x00,0x07,0x49,
+0x6e,0x74,0x65,0x67,0x65,0x72,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x01,0x3c,0x00,
+0x00,0x00,0x00,0xe2,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,
+0x29,0x00,0x80,0x01,0x83,0xff,0x3f,0x01,0x97,0x06,0x40,0x00,0x01,0x40,0x80,0x01,
+0x06,0x00,0x00,0x02,0x01,0x80,0x80,0x02,0xa0,0x00,0x01,0x02,0xa0,0xc0,0x80,0x01,
+0x19,0x02,0xc0,0x01,0x06,0x00,0x80,0x01,0x01,0x80,0x00,0x02,0xa0,0x40,0x81,0x01,
+0x97,0x01,0x40,0x00,0x01,0x80,0x80,0x01,0xad,0x80,0x81,0x01,0x01,0xc0,0x00,0x01,
+0x01,0x80,0x80,0x01,0x06,0x00,0x00,0x02,0x20,0x00,0x02,0x02,0xb3,0xc0,0x81,0x01,
+0x18,0xf7,0xbf,0x01,0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x09,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x09,0x64,
+0x65,0x6c,0x65,0x74,0x65,0x5f,0x69,0x66,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,
+0x00,0x02,0x5b,0x5d,0x00,0x00,0x09,0x64,0x65,0x6c,0x65,0x74,0x65,0x5f,0x61,0x74,
+0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,
+0x00,0x00,0x00,0xec,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,0x99,0x00,0x40,0x02,
+0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x02,0x04,0x01,0x80,0x02,0xa0,0x40,0x00,0x02,
+0x29,0x00,0x00,0x02,0x83,0xff,0x3f,0x01,0x06,0x00,0x00,0x02,0x20,0xc0,0x00,0x02,
+0x01,0x00,0x81,0x01,0x97,0x06,0x40,0x00,0x01,0x40,0x00,0x02,0x06,0x00,0x80,0x02,
+0x01,0x80,0x00,0x03,0xa0,0x40,0x81,0x02,0xa0,0x00,0x01,0x02,0x19,0x02,0x40,0x02,
+0x01,0x80,0x00,0x02,0xad,0x80,0x01,0x02,0x01,0x00,0x01,0x01,0x97,0x01,0x40,0x00,
+0x06,0x00,0x00,0x02,0x01,0x80,0x80,0x02,0xa0,0xc0,0x01,0x02,0x01,0x80,0x00,0x02,
+0x06,0x00,0x80,0x02,0x20,0xc0,0x80,0x02,0xb3,0x00,0x02,0x02,0x18,0xf7,0x3f,0x02,
+0x06,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x07,0x6b,0x65,0x65,0x70,0x5f,
+0x69,0x66,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,
+0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x01,0x2b,0x00,0x00,0x09,0x64,0x65,0x6c,0x65,
+0x74,0x65,0x5f,0x61,0x74,0x00,0x00,0x01,0x3c,0x00,0x00,0x00,0x00,0xbe,0x00,0x03,
+0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x19,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,
+0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,
+0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x37,0xc0,0x00,0x01,
+0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x06,0x00,0x80,0x01,
+0x20,0x00,0x81,0x01,0x01,0x80,0x00,0x02,0x20,0x00,0x01,0x02,0xb2,0x40,0x81,0x01,
+0x19,0x01,0xc0,0x01,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x06,0x00,0x80,0x01,
+0x01,0x80,0x00,0x02,0xa0,0x80,0x81,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x07,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x07,0x73,
+0x65,0x6c,0x65,0x63,0x74,0x21,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x04,
+0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x07,0x72,0x65,0x70,0x6c,
+0x61,0x63,0x65,0x00,0x00,0x00,0x00,0x52,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,
+0x00,0x0b,0x00,0x00,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x19,0x02,0xc0,0x01,0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x40,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x02,0x3c,0x3c,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x02,0x32,0x00,0x00,0x00,0x1f,
+0x00,0x05,0x62,0x6c,0x6f,0x63,0x6b,0x00,0x03,0x61,0x72,0x79,0x00,0x06,0x72,0x65,
+0x73,0x75,0x6c,0x74,0x00,0x04,0x68,0x61,0x73,0x68,0x00,0x03,0x76,0x61,0x6c,0x00,
+0x03,0x6b,0x65,0x79,0x00,0x05,0x76,0x61,0x6c,0x75,0x65,0x00,0x04,0x65,0x6c,0x65,
+0x6d,0x00,0x05,0x61,0x72,0x72,0x61,0x79,0x00,0x01,0x78,0x00,0x01,0x76,0x00,0x05,
+0x64,0x65,0x70,0x74,0x68,0x00,0x02,0x61,0x72,0x00,0x01,0x65,0x00,0x08,0x6d,0x6f,
+0x64,0x69,0x66,0x69,0x65,0x64,0x00,0x01,0x69,0x00,0x01,0x6e,0x00,0x06,0x69,0x66,
+0x6e,0x6f,0x6e,0x65,0x00,0x03,0x69,0x64,0x78,0x00,0x04,0x61,0x72,0x67,0x30,0x00,
+0x04,0x61,0x72,0x67,0x31,0x00,0x04,0x61,0x72,0x67,0x32,0x00,0x03,0x62,0x65,0x67,
+0x00,0x03,0x6c,0x65,0x6e,0x00,0x05,0x63,0x6f,0x75,0x6e,0x74,0x00,0x04,0x61,0x72,
+0x67,0x73,0x00,0x03,0x6c,0x6f,0x77,0x00,0x04,0x68,0x69,0x67,0x68,0x00,0x09,0x73,
+0x61,0x74,0x69,0x73,0x66,0x69,0x65,0x64,0x00,0x03,0x6d,0x69,0x64,0x00,0x07,0x73,
+0x6d,0x61,0x6c,0x6c,0x65,0x72,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,
+0x00,0x03,0x00,0x03,0x00,0x04,0x00,0x04,0x00,0x05,0x00,0x05,0x00,0x06,0x00,0x06,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x07,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x08,0x00,0x04,0x00,0x09,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x09,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x07,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x07,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x08,0x00,0x04,0x00,0x0a,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x0a,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0b,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x0c,0x00,0x03,0x00,0x0d,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0b,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0e,0x00,0x03,0x00,0x0c,0x00,0x04,0x00,0x0d,
+0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x02,0xff,0xff,
+0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x0d,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,
+0x00,0x01,0x00,0x0f,0x00,0x02,0x00,0x10,0x00,0x01,0x00,0x11,0x00,0x02,0x00,0x00,
+0x00,0x03,0x00,0x12,0x00,0x04,0x00,0x13,0x00,0x01,0x00,0x14,0x00,0x02,0x00,0x15,
+0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x16,0x00,0x05,0x00,0x17,0x00,0x06,0x00,0x01,
+0x00,0x07,0x00,0x0f,0x00,0x08,0x00,0x18,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,
+0x00,0x03,0x00,0x17,0x00,0x04,0x00,0x12,0x00,0x05,0x00,0x18,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x17,
+0x00,0x02,0x00,0x12,0x00,0x03,0x00,0x12,0x00,0x01,0x00,0x19,0x00,0x02,0xff,0xff,
+0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x1a,0x00,0x02,0x00,0x1b,0x00,0x03,0x00,0x1c,
+0x00,0x04,0x00,0x1d,0x00,0x05,0x00,0x04,0x00,0x06,0x00,0x0a,0x00,0x07,0x00,0x1e,
+0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x12,
+0x00,0x02,0x00,0x17,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x09,
+0x00,0x01,0xff,0xff,0x00,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_array_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_array_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_array_ext_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_mruby_array_ext_gem_init(mrb);
+ mrb_load_irep(mrb, gem_mrblib_irep_mruby_array_ext);
+ if (mrb->exc) {
+ mrb_print_error(mrb);
+ exit(EXIT_FAILURE);
+ }
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_array_ext_gem_final(mrb_state *mrb) {
+ mrb_mruby_array_ext_gem_final(mrb);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-enum-ext/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,648 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_enum_ext[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0x3b,0x5e,0x00,0x00,0x26,0x32,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x23,0x2e,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x37,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04,
+0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x80,0x00,0x4a,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0x45,0x6e,0x75,0x6d,0x65,0x72,
+0x61,0x62,0x6c,0x65,0x00,0x00,0x00,0x02,0x87,0x00,0x01,0x00,0x04,0x00,0x18,0x00,
+0x00,0x00,0x53,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,
+0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,0x46,0x00,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,0x46,0x40,0x81,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x0c,0x00,0x01,0x46,0x80,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0e,0x00,0x01,
+0x46,0xc0,0x81,0x00,0x11,0x04,0x80,0x00,0x20,0x40,0x82,0x00,0x12,0x05,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,0x46,0xc0,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x12,0x00,0x01,0x46,0x00,0x83,0x00,0x48,0x00,0x80,0x00,0xc0,0x14,0x00,0x01,
+0x46,0x40,0x83,0x00,0x48,0x00,0x80,0x00,0x04,0x07,0x00,0x01,0x84,0x06,0x80,0x01,
+0x05,0x00,0x00,0x02,0x20,0xc1,0x83,0x00,0x48,0x00,0x80,0x00,0xc0,0x16,0x00,0x01,
+0x46,0x00,0x84,0x00,0x48,0x00,0x80,0x00,0xc0,0x18,0x00,0x01,0x46,0x40,0x84,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x1a,0x00,0x01,0x46,0x80,0x84,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x1c,0x00,0x01,0x46,0xc0,0x84,0x00,0x48,0x00,0x80,0x00,0xc0,0x1e,0x00,0x01,
+0x46,0x00,0x85,0x00,0x48,0x00,0x80,0x00,0xc0,0x20,0x00,0x01,0x46,0x40,0x85,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x22,0x00,0x01,0x46,0x80,0x85,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x24,0x00,0x01,0x46,0xc0,0x85,0x00,0x48,0x00,0x80,0x00,0xc0,0x26,0x00,0x01,
+0x46,0x00,0x86,0x00,0x48,0x00,0x80,0x00,0xc0,0x28,0x00,0x01,0x46,0x40,0x86,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x2a,0x00,0x01,0x46,0x80,0x86,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x2c,0x00,0x01,0x46,0xc0,0x86,0x00,0x05,0x00,0x80,0x00,0x47,0x40,0x80,0x00,
+0xc0,0x2e,0x00,0x01,0x46,0xc0,0x86,0x00,0x84,0x0d,0x80,0x00,0x29,0x00,0x80,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x04,0x64,0x72,0x6f,0x70,0x00,0x00,
+0x0a,0x64,0x72,0x6f,0x70,0x5f,0x77,0x68,0x69,0x6c,0x65,0x00,0x00,0x04,0x74,0x61,
+0x6b,0x65,0x00,0x00,0x0a,0x74,0x61,0x6b,0x65,0x5f,0x77,0x68,0x69,0x6c,0x65,0x00,
+0x00,0x09,0x65,0x61,0x63,0x68,0x5f,0x63,0x6f,0x6e,0x73,0x00,0x00,0x0a,0x65,0x61,
+0x63,0x68,0x5f,0x73,0x6c,0x69,0x63,0x65,0x00,0x00,0x08,0x67,0x72,0x6f,0x75,0x70,
+0x5f,0x62,0x79,0x00,0x00,0x07,0x73,0x6f,0x72,0x74,0x5f,0x62,0x79,0x00,0x00,0x06,
+0x4f,0x62,0x6a,0x65,0x63,0x74,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x04,0x4e,
+0x4f,0x4e,0x45,0x00,0x00,0x05,0x66,0x69,0x72,0x73,0x74,0x00,0x00,0x05,0x63,0x6f,
+0x75,0x6e,0x74,0x00,0x00,0x08,0x66,0x6c,0x61,0x74,0x5f,0x6d,0x61,0x70,0x00,0x00,
+0x0e,0x63,0x6f,0x6c,0x6c,0x65,0x63,0x74,0x5f,0x63,0x6f,0x6e,0x63,0x61,0x74,0x00,
+0x00,0x0c,0x61,0x6c,0x69,0x61,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,
+0x06,0x6d,0x61,0x78,0x5f,0x62,0x79,0x00,0x00,0x06,0x6d,0x69,0x6e,0x5f,0x62,0x79,
+0x00,0x00,0x06,0x6d,0x69,0x6e,0x6d,0x61,0x78,0x00,0x00,0x09,0x6d,0x69,0x6e,0x6d,
+0x61,0x78,0x5f,0x62,0x79,0x00,0x00,0x05,0x6e,0x6f,0x6e,0x65,0x3f,0x00,0x00,0x04,
+0x6f,0x6e,0x65,0x3f,0x00,0x00,0x10,0x65,0x61,0x63,0x68,0x5f,0x77,0x69,0x74,0x68,
+0x5f,0x6f,0x62,0x6a,0x65,0x63,0x74,0x00,0x00,0x0c,0x72,0x65,0x76,0x65,0x72,0x73,
+0x65,0x5f,0x65,0x61,0x63,0x68,0x00,0x00,0x05,0x63,0x79,0x63,0x6c,0x65,0x00,0x00,
+0x0a,0x66,0x69,0x6e,0x64,0x5f,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x03,0x7a,0x69,
+0x70,0x00,0x00,0x04,0x74,0x6f,0x5f,0x68,0x00,0x00,0x00,0x01,0x31,0x00,0x04,0x00,
+0x09,0x00,0x01,0x00,0x00,0x00,0x1f,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x00,0x02,
+0x84,0x00,0x80,0x02,0xa0,0x00,0x00,0x02,0x99,0x00,0x40,0x02,0x97,0x04,0x40,0x00,
+0x06,0x00,0x00,0x02,0x91,0x01,0x80,0x02,0x3d,0x00,0x00,0x03,0x01,0x40,0x80,0x03,
+0x20,0x00,0x81,0x03,0x3e,0xc0,0x01,0x03,0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,
+0x20,0x81,0x00,0x02,0x01,0x40,0x00,0x02,0x83,0xff,0xbf,0x02,0xb3,0x40,0x01,0x02,
+0x19,0x02,0x40,0x02,0x06,0x00,0x00,0x02,0x11,0x03,0x80,0x02,0x3d,0x01,0x00,0x03,
+0x20,0x81,0x00,0x02,0x01,0x40,0x00,0x02,0x20,0x40,0x00,0x02,0x01,0x00,0x81,0x00,
+0x37,0x00,0x81,0x01,0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0xc0,0x01,0x02,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x1a,0x6e,0x6f,0x20,0x69,0x6d,
+0x70,0x6c,0x69,0x63,0x69,0x74,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x73,0x69,0x6f,
+0x6e,0x20,0x6f,0x66,0x20,0x00,0x00,0x0d,0x20,0x69,0x6e,0x74,0x6f,0x20,0x49,0x6e,
+0x74,0x65,0x67,0x65,0x72,0x00,0x00,0x1d,0x61,0x74,0x74,0x65,0x6d,0x70,0x74,0x20,
+0x74,0x6f,0x20,0x64,0x72,0x6f,0x70,0x20,0x6e,0x65,0x67,0x61,0x74,0x69,0x76,0x65,
+0x20,0x73,0x69,0x7a,0x65,0x00,0x00,0x00,0x08,0x00,0x0b,0x72,0x65,0x73,0x70,0x6f,
+0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x06,0x74,0x6f,0x5f,0x69,0x6e,0x74,0x00,
+0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,
+0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x01,0x3c,0x00,
+0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,
+0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x6b,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,
+0x83,0xff,0x3f,0x02,0xb2,0x00,0x80,0x01,0x99,0x02,0xc0,0x01,0x15,0xc0,0x80,0x01,
+0x01,0x40,0x00,0x02,0x20,0x80,0x00,0x02,0xa0,0x40,0x80,0x01,0x97,0x01,0x40,0x00,
+0x15,0x40,0x80,0x01,0xaf,0xc0,0x80,0x01,0x16,0x40,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x3d,0x3d,0x00,0x00,0x02,0x3c,
+0x3c,0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x01,0x2d,
+0x00,0x00,0x00,0x00,0x8b,0x00,0x04,0x00,0x07,0x00,0x01,0x00,0x00,0x00,0x11,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,0x99,0x00,0x40,0x02,
+0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x02,0x04,0x01,0x80,0x02,0xa0,0x40,0x00,0x02,
+0x29,0x00,0x00,0x02,0x37,0x00,0x01,0x02,0x08,0x00,0x80,0x02,0x01,0x00,0x01,0x01,
+0x01,0x40,0x81,0x01,0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0xc0,0x00,0x02,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,
+0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,
+0x65,0x6e,0x75,0x6d,0x00,0x00,0x0a,0x64,0x72,0x6f,0x70,0x5f,0x77,0x68,0x69,0x6c,
+0x65,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x8d,0x00,0x03,0x00,
+0x06,0x00,0x00,0x00,0x00,0x00,0x16,0x00,0x26,0x00,0x08,0x00,0x15,0xc0,0x80,0x01,
+0x20,0x00,0x80,0x01,0x19,0x03,0xc0,0x01,0x15,0x40,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x7f,0x80,0x01,0x20,0x00,0x80,0x01,
+0x19,0x01,0xc0,0x01,0x07,0x00,0x80,0x01,0x16,0xc0,0x80,0x01,0x15,0xc0,0x80,0x01,
+0x99,0x02,0xc0,0x01,0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,0x20,0xc0,0x00,0x02,
+0xa0,0x80,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x01,0x21,0x00,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,
+0x75,0x65,0x00,0x00,0x00,0x01,0x31,0x00,0x04,0x00,0x09,0x00,0x01,0x00,0x00,0x00,
+0x1f,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x00,0x02,0x84,0x00,0x80,0x02,
+0xa0,0x00,0x00,0x02,0x99,0x00,0x40,0x02,0x97,0x04,0x40,0x00,0x06,0x00,0x00,0x02,
+0x91,0x01,0x80,0x02,0x3d,0x00,0x00,0x03,0x01,0x40,0x80,0x03,0x20,0x00,0x81,0x03,
+0x3e,0xc0,0x01,0x03,0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,0x20,0x81,0x00,0x02,
+0x01,0x40,0x00,0x02,0x83,0xff,0xbf,0x02,0xb3,0x40,0x01,0x02,0x19,0x02,0x40,0x02,
+0x06,0x00,0x00,0x02,0x11,0x03,0x80,0x02,0x3d,0x01,0x00,0x03,0x20,0x81,0x00,0x02,
+0x01,0x40,0x00,0x02,0x20,0x40,0x00,0x02,0x01,0x00,0x81,0x00,0x37,0x00,0x81,0x01,
+0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0xc0,0x01,0x02,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x03,0x00,0x00,0x1a,0x6e,0x6f,0x20,0x69,0x6d,0x70,0x6c,0x69,0x63,
+0x69,0x74,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x6f,0x66,
+0x20,0x00,0x00,0x0d,0x20,0x69,0x6e,0x74,0x6f,0x20,0x49,0x6e,0x74,0x65,0x67,0x65,
+0x72,0x00,0x00,0x1d,0x61,0x74,0x74,0x65,0x6d,0x70,0x74,0x20,0x74,0x6f,0x20,0x74,
+0x61,0x6b,0x65,0x20,0x6e,0x65,0x67,0x61,0x74,0x69,0x76,0x65,0x20,0x73,0x69,0x7a,
+0x65,0x00,0x00,0x00,0x08,0x00,0x0b,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x5f,0x74,
+0x6f,0x3f,0x00,0x00,0x06,0x74,0x6f,0x5f,0x69,0x6e,0x74,0x00,0x00,0x05,0x72,0x61,
+0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,
+0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x01,0x3c,0x00,0x00,0x0d,0x41,0x72,
+0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0x66,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
+0x0c,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0xc0,0x80,0x01,0x20,0x00,0x80,0x01,
+0x15,0x40,0x00,0x02,0xb6,0x40,0x80,0x01,0x99,0x00,0xc0,0x01,0x29,0x40,0x80,0x01,
+0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,0x20,0xc0,0x00,0x02,0xa0,0x80,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x73,0x69,
+0x7a,0x65,0x00,0x00,0x02,0x3e,0x3d,0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,0x08,0x5f,
+0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0x7f,0x00,0x03,0x00,0x06,
+0x00,0x01,0x00,0x00,0x00,0x0e,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,
+0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,
+0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x37,0xc0,0x00,0x01,
+0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x0a,0x74,0x61,0x6b,0x65,0x5f,0x77,0x68,0x69,0x6c,0x65,0x00,0x00,0x04,
+0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x6d,0x00,0x03,0x00,0x06,0x00,0x00,0x00,
+0x00,0x00,0x0f,0x00,0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x17,0x01,0x40,0x00,0x15,0x80,0x80,0x01,0x29,0x80,0x80,0x01,0x15,0x80,0x80,0x01,
+0x01,0x40,0x00,0x02,0x20,0x80,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x02,0x3c,0x3c,0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,
+0x00,0x01,0x21,0x00,0x04,0x00,0x09,0x00,0x01,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,
+0xa6,0x00,0x00,0x02,0x01,0x40,0x00,0x02,0x84,0x00,0x80,0x02,0xa0,0x00,0x00,0x02,
+0x99,0x00,0x40,0x02,0x97,0x04,0x40,0x00,0x06,0x00,0x00,0x02,0x91,0x01,0x80,0x02,
+0x3d,0x00,0x00,0x03,0x01,0x40,0x80,0x03,0x20,0x00,0x81,0x03,0x3e,0xc0,0x01,0x03,
+0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,0x20,0x81,0x00,0x02,0x01,0x40,0x00,0x02,
+0x83,0xff,0xbf,0x02,0xb4,0x40,0x01,0x02,0x19,0x02,0x40,0x02,0x06,0x00,0x00,0x02,
+0x11,0x03,0x80,0x02,0x3d,0x01,0x00,0x03,0x20,0x81,0x00,0x02,0x37,0x00,0x81,0x01,
+0x01,0x40,0x00,0x02,0x20,0x40,0x00,0x02,0x01,0x00,0x81,0x00,0x06,0x00,0x00,0x02,
+0x40,0x01,0x80,0x02,0x21,0xc0,0x01,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x03,
+0x00,0x00,0x1a,0x6e,0x6f,0x20,0x69,0x6d,0x70,0x6c,0x69,0x63,0x69,0x74,0x20,0x63,
+0x6f,0x6e,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x00,0x00,0x0d,
+0x20,0x69,0x6e,0x74,0x6f,0x20,0x49,0x6e,0x74,0x65,0x67,0x65,0x72,0x00,0x00,0x0c,
+0x69,0x6e,0x76,0x61,0x6c,0x69,0x64,0x20,0x73,0x69,0x7a,0x65,0x00,0x00,0x00,0x08,
+0x00,0x0b,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x06,
+0x74,0x6f,0x5f,0x69,0x6e,0x74,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,
+0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,
+0x73,0x73,0x00,0x00,0x02,0x3c,0x3d,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,
+0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x00,0x00,0xab,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,
+0x26,0x00,0x08,0x00,0x15,0xc0,0x80,0x01,0x20,0x00,0x80,0x01,0x15,0x40,0x00,0x02,
+0xb2,0x40,0x80,0x01,0x19,0x01,0xc0,0x01,0x15,0xc0,0x80,0x01,0x20,0x80,0x80,0x01,
+0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,0x20,0x00,0x01,0x02,0xa0,0xc0,0x80,0x01,
+0x15,0xc0,0x80,0x01,0x20,0x00,0x80,0x01,0x15,0x40,0x00,0x02,0xb2,0x40,0x80,0x01,
+0x99,0x02,0xc0,0x01,0x15,0x80,0x80,0x01,0x15,0xc0,0x00,0x02,0x20,0x80,0x01,0x02,
+0xa0,0x40,0x81,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,
+0x02,0x3d,0x3d,0x00,0x00,0x05,0x73,0x68,0x69,0x66,0x74,0x00,0x00,0x02,0x3c,0x3c,
+0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x03,0x64,0x75,0x70,0x00,0x00,0x00,0x01,0x57,0x00,0x04,0x00,
+0x09,0x00,0x01,0x00,0x00,0x00,0x27,0x00,0xa6,0x00,0x00,0x02,0x01,0x40,0x00,0x02,
+0x84,0x00,0x80,0x02,0xa0,0x00,0x00,0x02,0x99,0x00,0x40,0x02,0x97,0x04,0x40,0x00,
+0x06,0x00,0x00,0x02,0x91,0x01,0x80,0x02,0x3d,0x00,0x00,0x03,0x01,0x40,0x80,0x03,
+0x20,0x00,0x81,0x03,0x3e,0xc0,0x01,0x03,0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,
+0x20,0x81,0x00,0x02,0x01,0x40,0x00,0x02,0x83,0xff,0xbf,0x02,0xb4,0x40,0x01,0x02,
+0x19,0x02,0x40,0x02,0x06,0x00,0x00,0x02,0x11,0x03,0x80,0x02,0x3d,0x01,0x00,0x03,
+0x20,0x81,0x00,0x02,0x37,0x00,0x81,0x01,0x01,0x40,0x00,0x02,0x20,0x40,0x00,0x02,
+0x01,0x00,0x81,0x00,0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0xc0,0x01,0x02,
+0x01,0xc0,0x00,0x02,0x20,0x00,0x02,0x02,0x19,0x01,0x40,0x02,0x05,0x00,0x00,0x02,
+0x97,0x01,0x40,0x00,0x01,0x80,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0x40,0x02,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x1a,0x6e,0x6f,0x20,0x69,0x6d,
+0x70,0x6c,0x69,0x63,0x69,0x74,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x73,0x69,0x6f,
+0x6e,0x20,0x6f,0x66,0x20,0x00,0x00,0x0d,0x20,0x69,0x6e,0x74,0x6f,0x20,0x49,0x6e,
+0x74,0x65,0x67,0x65,0x72,0x00,0x00,0x12,0x69,0x6e,0x76,0x61,0x6c,0x69,0x64,0x20,
+0x73,0x6c,0x69,0x63,0x65,0x20,0x73,0x69,0x7a,0x65,0x00,0x00,0x00,0x0a,0x00,0x0b,
+0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x06,0x74,0x6f,
+0x5f,0x69,0x6e,0x74,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,
+0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,
+0x00,0x00,0x02,0x3c,0x3d,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,
+0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x06,0x65,
+0x6d,0x70,0x74,0x79,0x3f,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,
+0x85,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x26,0x00,0x08,0x00,
+0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,0x20,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x15,0xc0,0x80,0x01,0x20,0x80,0x80,0x01,0x15,0x40,0x00,0x02,0xb2,0xc0,0x80,0x01,
+0x19,0x03,0xc0,0x01,0x15,0x80,0x80,0x01,0x15,0xc0,0x00,0x02,0xa0,0x00,0x81,0x01,
+0x37,0xc0,0x80,0x01,0x16,0xc0,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x3c,0x3c,
+0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x04,0x73,0x69,
+0x7a,0x65,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x00,0x00,0x7d,0x00,0x03,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,
+0x29,0x00,0x80,0x01,0x3f,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,
+0x21,0xc0,0x80,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x08,0x67,0x72,0x6f,0x75,0x70,
+0x5f,0x62,0x79,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0xaf,0x00,
+0x05,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x26,0x00,0x08,0x00,
+0x15,0x40,0x80,0x02,0x37,0x80,0x01,0x03,0x01,0x40,0x80,0x03,0x38,0xc0,0x01,0x03,
+0xa0,0x3f,0x80,0x02,0x01,0x40,0x81,0x01,0x01,0x40,0x80,0x02,0x20,0x40,0x80,0x02,
+0x01,0x40,0x01,0x02,0x15,0x80,0x80,0x02,0x01,0xc0,0x00,0x03,0xa0,0x80,0x80,0x02,
+0x19,0x03,0xc0,0x02,0x15,0x80,0x80,0x02,0x01,0xc0,0x00,0x03,0xa0,0xc0,0x80,0x02,
+0x01,0x00,0x01,0x03,0xa0,0x00,0x81,0x02,0x17,0x03,0x40,0x00,0x01,0x00,0x81,0x02,
+0xb7,0x40,0x81,0x02,0x15,0x80,0x00,0x03,0x01,0xc0,0x80,0x03,0x01,0x40,0x01,0x04,
+0x20,0x41,0x01,0x03,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,
+0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,
+0x65,0x00,0x00,0x04,0x6b,0x65,0x79,0x3f,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x02,
+0x3c,0x3c,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x01,0x19,0x00,0x04,0x00,
+0x0c,0x00,0x03,0x00,0x00,0x00,0x25,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x02,
+0x20,0x00,0x00,0x02,0x99,0x00,0x40,0x02,0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x02,
+0x04,0x01,0x80,0x02,0xa0,0x40,0x00,0x02,0x29,0x00,0x00,0x02,0x37,0x00,0x01,0x01,
+0x37,0x00,0x81,0x01,0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0xc0,0x00,0x02,
+0x01,0x80,0x00,0x02,0x20,0x00,0x01,0x02,0x03,0x00,0xc0,0x02,0xb5,0x40,0x01,0x02,
+0x19,0x07,0x40,0x02,0x06,0x00,0x00,0x02,0x01,0x80,0x80,0x02,0x42,0x00,0x00,0x03,
+0x93,0x03,0x00,0x03,0x01,0x80,0x80,0x03,0x20,0x00,0x81,0x03,0xa0,0x00,0x02,0x03,
+0x83,0xff,0xbf,0x03,0x83,0xff,0x3f,0x04,0x01,0x80,0x80,0x04,0x20,0x00,0x81,0x04,
+0xaf,0x40,0x82,0x04,0x40,0x03,0x00,0x05,0xa1,0x82,0x01,0x02,0x01,0x80,0x00,0x02,
+0x40,0x05,0x80,0x02,0x21,0x80,0x02,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x0b,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x07,0x73,
+0x6f,0x72,0x74,0x5f,0x62,0x79,0x00,0x00,0x0f,0x65,0x61,0x63,0x68,0x5f,0x77,0x69,
+0x74,0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,
+0x00,0x01,0x3e,0x00,0x00,0x0c,0x5f,0x5f,0x73,0x6f,0x72,0x74,0x5f,0x73,0x75,0x62,
+0x5f,0x5f,0x00,0x00,0x05,0x41,0x72,0x72,0x61,0x79,0x00,0x00,0x03,0x6e,0x65,0x77,
+0x00,0x00,0x01,0x2d,0x00,0x00,0x07,0x63,0x6f,0x6c,0x6c,0x65,0x63,0x74,0x00,0x00,
+0x00,0x00,0x58,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,
+0x26,0x00,0x00,0x04,0x15,0xc0,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,
+0x15,0x80,0x00,0x02,0x15,0x40,0x80,0x02,0x01,0x40,0x00,0x03,0xa0,0x40,0x80,0x02,
+0x01,0x80,0x00,0x03,0x37,0x41,0x81,0x02,0xa0,0x00,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,
+0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x34,0x00,0x04,0x00,0x07,0x00,0x00,
+0x00,0x00,0x00,0x05,0x26,0x00,0x00,0x04,0x01,0x40,0x00,0x02,0x01,0x80,0x80,0x02,
+0xa0,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x03,0x3c,0x3d,0x3e,0x00,0x00,0x00,0x00,0x33,0x00,0x04,0x00,0x07,0x00,0x00,
+0x00,0x00,0x00,0x05,0x26,0x00,0x00,0x04,0x15,0xc0,0x00,0x02,0x01,0x80,0x80,0x02,
+0xa0,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x02,0x5b,0x5d,0x00,0x00,0x00,0x00,0x81,0x00,0x05,0x00,0x08,0x00,0x02,0x00,
+0x00,0x00,0x15,0x00,0x26,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,
+0x11,0x00,0x80,0x00,0x01,0x40,0x80,0x02,0x11,0x00,0x00,0x03,0xb2,0x40,0x80,0x02,
+0x19,0x03,0xc0,0x02,0x06,0x00,0x80,0x02,0x40,0x01,0x00,0x03,0x21,0x80,0x80,0x02,
+0x05,0x00,0x80,0x02,0x29,0x00,0x80,0x02,0x17,0x03,0x40,0x00,0x37,0x40,0x81,0x01,
+0x83,0xff,0x3f,0x02,0x06,0x00,0x80,0x02,0x40,0x03,0x00,0x03,0x21,0x80,0x80,0x02,
+0x01,0xc0,0x80,0x02,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x04,0x4e,0x4f,0x4e,0x45,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0x35,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x00,
+0x04,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,
+0x29,0x80,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x08,0x5f,0x5f,
+0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0x6d,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,
+0x15,0x00,0x01,0x02,0xb4,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,0x29,0x40,0x80,0x01,
+0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,0x20,0x80,0x00,0x02,0xa0,0x40,0x80,0x01,
+0x15,0x00,0x81,0x01,0xad,0xc0,0x80,0x01,0x16,0x00,0x81,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x3c,0x3d,0x00,0x00,0x04,0x70,
+0x75,0x73,0x68,0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,
+0x01,0x2b,0x00,0x00,0x00,0x00,0x85,0x00,0x04,0x00,0x07,0x00,0x03,0x00,0x00,0x00,
+0x16,0x00,0x00,0x00,0xa6,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,
+0x11,0x00,0x80,0x00,0x83,0xff,0xbf,0x01,0x19,0x02,0x40,0x01,0x06,0x00,0x00,0x02,
+0x40,0x01,0x80,0x02,0x21,0x40,0x00,0x02,0x97,0x05,0x40,0x00,0x01,0x40,0x00,0x02,
+0x11,0x00,0x80,0x02,0xb2,0x80,0x00,0x02,0x19,0x02,0x40,0x02,0x06,0x00,0x00,0x02,
+0x40,0x03,0x80,0x02,0x21,0x40,0x00,0x02,0x97,0x01,0x40,0x00,0x06,0x00,0x00,0x02,
+0x40,0x05,0x80,0x02,0x21,0x40,0x00,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x04,0x4e,0x4f,0x4e,0x45,0x00,0x00,0x04,0x65,0x61,0x63,
+0x68,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x00,0x00,0x59,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x80,0x80,0x01,
+0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,
+0x19,0x02,0xc0,0x01,0x15,0xc0,0x80,0x01,0xad,0x40,0x80,0x01,0x16,0xc0,0x80,0x01,
+0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x2b,0x00,0x00,
+0x00,0x00,0x2e,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+0x15,0xc0,0x80,0x00,0xad,0x00,0x80,0x00,0x16,0xc0,0x80,0x00,0x29,0x00,0x80,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0x5e,
+0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x26,0x00,0x08,0x00,
+0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x15,0x40,0x00,0x02,0xb2,0x40,0x80,0x01,
+0x19,0x02,0xc0,0x01,0x15,0xc0,0x80,0x01,0xad,0x80,0x80,0x01,0x16,0xc0,0x80,0x01,
+0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,
+0x02,0x3d,0x3d,0x00,0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0x7d,0x00,0x03,0x00,0x06,
+0x00,0x01,0x00,0x00,0x00,0x0e,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,
+0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,
+0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x37,0xc0,0x00,0x01,
+0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x08,0x66,0x6c,0x61,0x74,0x5f,0x6d,0x61,0x70,0x00,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0x85,0x00,0x04,0x00,0x07,0x00,0x01,0x00,0x00,0x00,
+0x12,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x40,0x00,0x02,0x37,0x40,0x81,0x02,
+0x01,0x40,0x00,0x03,0x38,0x80,0x81,0x02,0xa0,0x3f,0x00,0x02,0x01,0x00,0x81,0x01,
+0x04,0x01,0x80,0x02,0xa0,0x40,0x00,0x02,0x19,0x02,0x40,0x02,0x01,0xc0,0x00,0x02,
+0x40,0x01,0x80,0x02,0x21,0x80,0x00,0x02,0x97,0x01,0x40,0x00,0x15,0x80,0x00,0x02,
+0x01,0xc0,0x80,0x02,0xa0,0xc0,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x0b,0x72,0x65,0x73,
+0x70,0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,
+0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x00,0x00,0x35,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x95,0x80,0x80,0x01,
+0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x00,0x00,0x83,0x00,
+0x05,0x00,0x08,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,
+0x06,0x00,0x80,0x02,0x20,0x00,0x80,0x02,0x99,0x00,0xc0,0x02,0x17,0x02,0x40,0x00,
+0x06,0x00,0x80,0x02,0x04,0x01,0x00,0x03,0xa0,0x40,0x80,0x02,0x29,0x00,0x80,0x02,
+0x07,0x00,0x00,0x01,0x05,0x00,0x80,0x01,0x05,0x00,0x00,0x02,0x06,0x00,0x80,0x02,
+0x40,0x01,0x00,0x03,0x21,0xc0,0x80,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x06,0x6d,
+0x61,0x78,0x5f,0x62,0x79,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,
+0xb0,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x26,0x00,0x08,0x00,
+0x15,0x80,0x00,0x02,0x19,0x06,0x40,0x02,0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,
+0x16,0xc0,0x00,0x02,0x15,0x40,0x00,0x02,0x37,0x40,0x81,0x02,0x01,0x40,0x00,0x03,
+0x38,0x80,0x81,0x02,0xa0,0x7f,0x00,0x02,0x16,0x00,0x01,0x02,0x08,0x00,0x00,0x02,
+0x16,0x80,0x00,0x02,0x17,0x08,0x40,0x00,0x15,0x40,0x00,0x02,0x37,0x40,0x81,0x02,
+0x01,0x40,0x00,0x03,0x38,0x80,0x81,0x02,0xa0,0x7f,0x00,0x02,0x01,0x00,0x81,0x01,
+0x15,0x00,0x81,0x02,0xb5,0x80,0x00,0x02,0x19,0x03,0x40,0x02,0x01,0x40,0x00,0x02,
+0x20,0x00,0x00,0x02,0x16,0xc0,0x00,0x02,0x01,0xc0,0x00,0x02,0x16,0x00,0x01,0x02,
+0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,
+0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x3e,0x00,0x00,0x00,0x00,0x83,0x00,0x05,
+0x00,0x08,0x00,0x01,0x00,0x00,0x00,0x10,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x02,
+0x20,0x00,0x80,0x02,0x99,0x00,0xc0,0x02,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x02,
+0x04,0x01,0x00,0x03,0xa0,0x40,0x80,0x02,0x29,0x00,0x80,0x02,0x07,0x00,0x00,0x01,
+0x05,0x00,0x80,0x01,0x05,0x00,0x00,0x02,0x06,0x00,0x80,0x02,0x40,0x01,0x00,0x03,
+0x21,0xc0,0x80,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x06,0x6d,0x69,0x6e,0x5f,0x62,
+0x79,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0xb0,0x00,0x04,0x00,
+0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x26,0x00,0x08,0x00,0x15,0x80,0x00,0x02,
+0x19,0x06,0x40,0x02,0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,0x16,0xc0,0x00,0x02,
+0x15,0x40,0x00,0x02,0x37,0x40,0x81,0x02,0x01,0x40,0x00,0x03,0x38,0x80,0x81,0x02,
+0xa0,0x7f,0x00,0x02,0x16,0x00,0x01,0x02,0x08,0x00,0x00,0x02,0x16,0x80,0x00,0x02,
+0x17,0x08,0x40,0x00,0x15,0x40,0x00,0x02,0x37,0x40,0x81,0x02,0x01,0x40,0x00,0x03,
+0x38,0x80,0x81,0x02,0xa0,0x7f,0x00,0x02,0x01,0x00,0x81,0x01,0x15,0x00,0x81,0x02,
+0xb3,0x80,0x00,0x02,0x19,0x03,0x40,0x02,0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,
+0x16,0xc0,0x00,0x02,0x01,0xc0,0x00,0x02,0x16,0x00,0x01,0x02,0x97,0x00,0x40,0x00,
+0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x04,0x63,0x61,0x6c,
+0x6c,0x00,0x00,0x01,0x3c,0x00,0x00,0x00,0x00,0x4d,0x00,0x05,0x00,0x07,0x00,0x01,
+0x00,0x00,0x00,0x0b,0xa6,0x00,0x00,0x00,0x05,0x00,0x00,0x01,0x05,0x00,0x80,0x01,
+0x07,0x00,0x00,0x02,0x06,0x00,0x80,0x02,0x40,0x01,0x00,0x03,0x21,0x00,0x80,0x02,
+0x01,0xc0,0x80,0x02,0x01,0x80,0x00,0x03,0x37,0x41,0x81,0x02,0x29,0x00,0x80,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x00,0x01,0x32,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,
+0x26,0x00,0x08,0x00,0x15,0x00,0x81,0x01,0x19,0x04,0xc0,0x01,0x01,0x40,0x80,0x01,
+0x20,0x00,0x80,0x01,0x01,0xc0,0x80,0x00,0x16,0x80,0x80,0x01,0x16,0xc0,0x80,0x00,
+0x08,0x00,0x80,0x01,0x16,0x00,0x81,0x01,0x17,0x19,0x40,0x00,0x15,0x40,0x80,0x01,
+0x99,0x0e,0xc0,0x01,0x15,0x40,0x80,0x01,0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,
+0x38,0x40,0x01,0x02,0x15,0x80,0x80,0x02,0x39,0x40,0x01,0x02,0xa0,0x7f,0x80,0x01,
+0x83,0xff,0x3f,0x02,0xb5,0x80,0x80,0x01,0x99,0x01,0xc0,0x01,0x01,0x40,0x80,0x01,
+0x20,0x00,0x80,0x01,0x16,0x80,0x80,0x01,0x15,0x40,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0x15,0xc0,0x80,0x02,0x39,0x40,0x01,0x02,
+0xa0,0x7f,0x80,0x01,0x83,0xff,0x3f,0x02,0xb3,0xc0,0x80,0x01,0x19,0x02,0xc0,0x01,
+0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x16,0xc0,0x80,0x01,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x01,0x97,0x09,0x40,0x00,0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,
+0x01,0xc0,0x80,0x00,0x15,0x80,0x00,0x02,0xa0,0x00,0x81,0x01,0x83,0xff,0x3f,0x02,
+0xb5,0x80,0x80,0x01,0x99,0x00,0xc0,0x01,0x16,0x80,0x80,0x00,0x01,0x40,0x80,0x01,
+0x15,0xc0,0x00,0x02,0xa0,0x00,0x81,0x01,0x83,0xff,0x3f,0x02,0xb3,0xc0,0x80,0x01,
+0x99,0x01,0xc0,0x01,0x01,0x40,0x80,0x01,0x16,0xc0,0x80,0x01,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,
+0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x04,0x63,0x61,0x6c,
+0x6c,0x00,0x00,0x01,0x3e,0x00,0x00,0x01,0x3c,0x00,0x00,0x03,0x3c,0x3d,0x3e,0x00,
+0x00,0x00,0x00,0x9a,0x00,0x07,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x15,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x03,0x20,0x00,0x80,0x03,0x99,0x00,0xc0,0x03,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x03,0x04,0x01,0x00,0x04,0xa0,0x40,0x80,0x03,
+0x29,0x00,0x80,0x03,0x05,0x00,0x00,0x01,0x05,0x00,0x80,0x01,0x05,0x00,0x00,0x02,
+0x05,0x00,0x80,0x02,0x07,0x00,0x00,0x03,0x06,0x00,0x80,0x03,0x40,0x01,0x00,0x04,
+0x21,0xc0,0x80,0x03,0x01,0x00,0x81,0x03,0x01,0x80,0x00,0x04,0x37,0xc1,0x81,0x03,
+0x29,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,
+0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,
+0x65,0x6e,0x75,0x6d,0x00,0x00,0x09,0x6d,0x69,0x6e,0x6d,0x61,0x78,0x5f,0x62,0x79,
+0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0xf0,0x00,0x04,0x00,0x07,
+0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x80,0x01,0x02,
+0x19,0x07,0x40,0x02,0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,0x16,0x00,0x01,0x02,
+0x16,0x80,0x00,0x02,0x15,0x40,0x00,0x02,0x37,0x40,0x81,0x02,0x01,0x40,0x00,0x03,
+0x38,0x80,0x81,0x02,0xa0,0x7f,0x00,0x02,0x16,0x40,0x01,0x02,0x16,0xc0,0x00,0x02,
+0x08,0x00,0x00,0x02,0x16,0x80,0x01,0x02,0x97,0x0e,0x40,0x00,0x15,0x40,0x00,0x02,
+0x37,0x40,0x81,0x02,0x01,0x40,0x00,0x03,0x38,0x80,0x81,0x02,0xa0,0x7f,0x00,0x02,
+0x01,0x00,0x81,0x01,0x15,0xc0,0x80,0x02,0xb5,0x80,0x00,0x02,0x19,0x02,0x40,0x02,
+0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,0x16,0x80,0x00,0x02,0x16,0xc0,0x80,0x01,
+0x15,0x40,0x00,0x02,0x37,0x40,0x81,0x02,0x01,0x40,0x00,0x03,0x38,0x80,0x81,0x02,
+0xa0,0x7f,0x00,0x02,0x01,0x00,0x81,0x01,0x15,0x40,0x81,0x02,0xb3,0xc0,0x00,0x02,
+0x19,0x03,0x40,0x02,0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,0x16,0x00,0x01,0x02,
+0x01,0xc0,0x00,0x02,0x16,0x40,0x01,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x5f,0x5f,
+0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,
+0x3e,0x00,0x00,0x01,0x3c,0x00,0x00,0x00,0x00,0x4d,0x00,0x02,0x00,0x04,0x00,0x02,
+0x00,0x00,0x00,0x0b,0xa6,0x00,0x00,0x00,0x19,0x02,0xc0,0x00,0x06,0x00,0x00,0x01,
+0x40,0x01,0x80,0x01,0x21,0x00,0x00,0x01,0x97,0x01,0x40,0x00,0x06,0x00,0x00,0x01,
+0x40,0x03,0x80,0x01,0x21,0x00,0x00,0x01,0x07,0x00,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x00,0x00,0x51,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,
+0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,
+0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x99,0x01,0xc0,0x01,0x08,0x00,0x80,0x01,
+0x29,0x80,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x00,0x00,0x49,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,
+0x26,0x00,0x08,0x00,0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x99,0x01,0xc0,0x01,
+0x08,0x00,0x80,0x01,0x29,0x80,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x08,0x5f,0x5f,
+0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0x6e,0x00,0x03,0x00,0x06,0x00,
+0x02,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x83,0xff,0x3f,0x01,
+0x19,0x02,0xc0,0x00,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,
+0x97,0x01,0x40,0x00,0x06,0x00,0x80,0x01,0x40,0x03,0x00,0x02,0x21,0x00,0x80,0x01,
+0x01,0x80,0x80,0x01,0x03,0x00,0x40,0x02,0xb2,0x40,0x80,0x01,0x19,0x01,0xc0,0x01,
+0x07,0x00,0x80,0x01,0x97,0x00,0x40,0x00,0x08,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x02,0x3d,0x3d,0x00,0x00,0x00,0x00,0x75,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,
+0x00,0x13,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x99,0x01,0xc0,0x01,
+0x15,0x80,0x80,0x01,0xad,0x40,0x80,0x01,0x16,0x80,0x80,0x01,0x15,0x80,0x80,0x01,
+0x03,0x00,0x40,0x02,0xb5,0x80,0x80,0x01,0x99,0x01,0xc0,0x01,0x08,0x00,0x80,0x01,
+0x29,0x80,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x01,0x2b,0x00,0x00,0x01,0x3e,0x00,0x00,0x00,0x00,0x6d,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x01,0x40,0x80,0x01,
+0x20,0x00,0x80,0x01,0x99,0x01,0xc0,0x01,0x15,0x80,0x80,0x01,0xad,0x40,0x80,0x01,
+0x16,0x80,0x80,0x01,0x15,0x80,0x80,0x01,0x03,0x00,0x40,0x02,0xb5,0x80,0x80,0x01,
+0x99,0x01,0xc0,0x01,0x08,0x00,0x80,0x01,0x29,0x80,0x80,0x01,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,
+0x01,0x3e,0x00,0x00,0x00,0x00,0xf4,0x00,0x03,0x00,0x07,0x00,0x01,0x00,0x00,0x00,
+0x19,0x00,0x00,0x00,0xa6,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x00,0x01,0x40,0x80,0x01,0x05,0x00,0x00,0x02,0xb2,0x00,0x80,0x01,
+0x19,0x02,0xc0,0x01,0x06,0x00,0x80,0x01,0x11,0x01,0x00,0x02,0x3d,0x00,0x80,0x02,
+0x20,0x41,0x80,0x01,0x06,0x00,0x80,0x01,0x20,0xc0,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x97,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x84,0x02,0x00,0x02,0x01,0x40,0x80,0x02,
+0x20,0x01,0x81,0x01,0x29,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,
+0x21,0x80,0x81,0x01,0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x23,0x77,
+0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,
+0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x30,0x20,0x66,0x6f,0x72,0x20,
+0x31,0x29,0x00,0x00,0x00,0x07,0x00,0x02,0x3d,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,
+0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,
+0x6f,0x72,0x00,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,
+0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x10,0x65,0x61,
+0x63,0x68,0x5f,0x77,0x69,0x74,0x68,0x5f,0x6f,0x62,0x6a,0x65,0x63,0x74,0x00,0x00,
+0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x48,0x00,0x03,0x00,0x07,0x00,0x00,
+0x00,0x00,0x00,0x07,0x26,0x00,0x08,0x00,0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,
+0x20,0x40,0x00,0x02,0x15,0x40,0x80,0x02,0x20,0x01,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0xdd,0x00,0x04,
+0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x1e,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x02,
+0x20,0x00,0x00,0x02,0x99,0x00,0x40,0x02,0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x02,
+0x04,0x01,0x80,0x02,0xa0,0x40,0x00,0x02,0x29,0x00,0x00,0x02,0x06,0x00,0x00,0x02,
+0x20,0xc0,0x00,0x02,0x01,0x00,0x01,0x01,0x20,0x00,0x01,0x02,0xaf,0x40,0x01,0x02,
+0x01,0x00,0x81,0x01,0x17,0x04,0x40,0x00,0x01,0x40,0x00,0x02,0x01,0x80,0x80,0x02,
+0x01,0xc0,0x00,0x03,0xa0,0xc0,0x81,0x02,0xa0,0x80,0x01,0x02,0x01,0xc0,0x00,0x02,
+0xaf,0x40,0x01,0x02,0x01,0x00,0x81,0x01,0x01,0xc0,0x00,0x02,0x83,0xff,0xbf,0x02,
+0xb6,0x00,0x02,0x02,0x18,0xfa,0x3f,0x02,0x06,0x00,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x0c,0x72,0x65,0x76,0x65,0x72,0x73,0x65,0x5f,0x65,0x61,0x63,0x68,0x00,
+0x00,0x04,0x74,0x6f,0x5f,0x61,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,
+0x2d,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x02,
+0x3e,0x3d,0x00,0x00,0x00,0x01,0xb6,0x00,0x05,0x00,0x0a,0x00,0x04,0x00,0x00,0x00,
+0x3f,0x00,0x00,0x00,0xa6,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x00,0x06,0x00,0x80,0x02,0x20,0x00,0x80,0x02,0x20,0x40,0x80,0x02,
+0x99,0x01,0xc0,0x02,0x01,0x40,0x80,0x02,0x05,0x00,0x00,0x03,0xb2,0x80,0x80,0x02,
+0x99,0x02,0xc0,0x02,0x06,0x00,0x80,0x02,0x04,0x02,0x00,0x03,0x01,0x40,0x80,0x03,
+0x20,0xc1,0x80,0x02,0x29,0x00,0x80,0x02,0x37,0x40,0x81,0x01,0x01,0x40,0x80,0x02,
+0x05,0x00,0x00,0x03,0xb2,0x80,0x80,0x02,0x99,0x03,0xc0,0x02,0x06,0x00,0x80,0x02,
+0x40,0x01,0x00,0x03,0x21,0x40,0x81,0x02,0x06,0x00,0x80,0x02,0x40,0x03,0x00,0x03,
+0x21,0x80,0x81,0x02,0x97,0x10,0x40,0x00,0x01,0x40,0x80,0x02,0x04,0x04,0x00,0x03,
+0xa0,0xc0,0x81,0x02,0x99,0x00,0xc0,0x02,0x97,0x04,0x40,0x00,0x06,0x00,0x80,0x02,
+0x11,0x05,0x00,0x03,0x3d,0x00,0x80,0x03,0x01,0x40,0x00,0x04,0x20,0xc0,0x02,0x04,
+0x3e,0x00,0x82,0x03,0xbd,0x00,0x00,0x04,0x3e,0x00,0x82,0x03,0x20,0x41,0x82,0x02,
+0x01,0x40,0x80,0x02,0x20,0x00,0x82,0x02,0x01,0x40,0x81,0x00,0x06,0x00,0x80,0x02,
+0x40,0x05,0x00,0x03,0x21,0x40,0x81,0x02,0x83,0xff,0x3f,0x02,0x17,0x03,0x40,0x00,
+0x01,0xc0,0x80,0x02,0x40,0x07,0x00,0x03,0x21,0x40,0x81,0x02,0x01,0x00,0x81,0x02,
+0xad,0x00,0x83,0x02,0x01,0x40,0x01,0x02,0x01,0x00,0x81,0x02,0x01,0x40,0x00,0x03,
+0xb3,0x40,0x83,0x02,0x18,0xfb,0xbf,0x02,0x05,0x00,0x80,0x02,0x29,0x00,0x80,0x02,
+0x00,0x00,0x00,0x02,0x00,0x00,0x1a,0x6e,0x6f,0x20,0x69,0x6d,0x70,0x6c,0x69,0x63,
+0x69,0x74,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x6f,0x66,
+0x20,0x00,0x00,0x0d,0x20,0x69,0x6e,0x74,0x6f,0x20,0x49,0x6e,0x74,0x65,0x67,0x65,
+0x72,0x00,0x00,0x00,0x0e,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,
+0x65,0x6e,0x3f,0x00,0x00,0x01,0x21,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x07,0x74,
+0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x05,0x63,0x79,0x63,0x6c,0x65,0x00,0x00,
+0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x04,0x6c,0x6f,0x6f,0x70,0x00,0x00,0x0b,0x72,
+0x65,0x73,0x70,0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x06,0x74,0x6f,0x5f,
+0x69,0x6e,0x74,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,
+0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,
+0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x06,
+0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0xc0,0x80,0x01,
+0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x15,0x80,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x7f,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,
+0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x31,0x00,0x01,0x00,0x03,0x00,0x01,
+0x00,0x00,0x00,0x04,0x15,0xc0,0x80,0x00,0x40,0x01,0x00,0x01,0x21,0x00,0x80,0x00,
+0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0x3d,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
+0x07,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x95,0x80,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x00,0x00,0x35,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,
+0x26,0x00,0x08,0x00,0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x70,0x75,
+0x73,0x68,0x00,0x00,0x00,0x00,0x3d,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
+0x07,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x15,0x80,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x00,0x00,0xc7,0x00,0x04,0x00,0x08,0x00,0x02,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,
+0xa6,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,0x11,0x00,0x80,0x00,
+0x06,0x00,0x00,0x02,0x20,0x40,0x00,0x02,0x20,0x80,0x00,0x02,0x99,0x01,0x40,0x02,
+0x01,0x40,0x00,0x02,0x11,0x00,0x80,0x02,0xb2,0xc0,0x00,0x02,0x99,0x02,0x40,0x02,
+0x06,0x00,0x00,0x02,0x84,0x02,0x80,0x02,0x01,0x40,0x00,0x03,0x20,0x01,0x01,0x02,
+0x29,0x00,0x00,0x02,0x83,0xff,0xbf,0x01,0x19,0x02,0x40,0x01,0x06,0x00,0x00,0x02,
+0x40,0x01,0x80,0x02,0x21,0x80,0x01,0x02,0x97,0x01,0x40,0x00,0x06,0x00,0x00,0x02,
+0x40,0x03,0x80,0x02,0x21,0x80,0x01,0x02,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x04,0x4e,0x4f,0x4e,0x45,0x00,0x00,
+0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x01,
+0x21,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x0a,0x66,0x69,0x6e,0x64,0x5f,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x04,
+0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x59,0x00,0x03,0x00,0x06,0x00,0x00,0x00,
+0x00,0x00,0x0d,0x00,0x26,0x00,0x08,0x00,0x15,0x80,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x19,0x01,0xc0,0x01,
+0x15,0xc0,0x80,0x01,0x29,0x80,0x80,0x01,0x15,0xc0,0x80,0x01,0xad,0x40,0x80,0x01,
+0x16,0xc0,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0x5e,0x00,
+0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x26,0x00,0x08,0x00,
+0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x15,0x40,0x00,0x02,0xb2,0x40,0x80,0x01,
+0x19,0x01,0xc0,0x01,0x15,0xc0,0x80,0x01,0x29,0x80,0x80,0x01,0x15,0xc0,0x80,0x01,
+0xad,0x80,0x80,0x01,0x16,0xc0,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,
+0x02,0x3d,0x3d,0x00,0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0x53,0x00,0x05,0x00,0x07,
+0x00,0x02,0x00,0x00,0x00,0x0b,0x00,0x00,0x26,0x00,0x08,0x00,0x37,0x40,0x81,0x01,
+0x01,0x40,0x80,0x02,0x40,0x01,0x00,0x03,0x21,0x00,0x80,0x02,0x01,0x40,0x81,0x00,
+0x83,0xff,0x3f,0x02,0x06,0x00,0x80,0x02,0x40,0x03,0x00,0x03,0x21,0x40,0x80,0x02,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x6d,0x61,
+0x70,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x31,0x00,0x03,0x00,
+0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x01,
+0x20,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x04,0x74,0x6f,0x5f,0x61,0x00,0x00,0x00,0x00,0xb8,0x00,0x05,0x00,0x09,0x00,
+0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x37,0x40,0x81,0x01,
+0x01,0xc0,0x80,0x02,0x01,0x40,0x00,0x03,0x20,0x40,0x00,0x03,0xa0,0x00,0x80,0x02,
+0x83,0xff,0x3f,0x02,0x17,0x05,0x40,0x00,0x01,0xc0,0x80,0x02,0x15,0x40,0x00,0x03,
+0x01,0x00,0x81,0x03,0xa0,0x80,0x00,0x03,0x15,0x00,0x81,0x03,0xa0,0x80,0x00,0x03,
+0xa0,0x00,0x80,0x02,0x01,0x00,0x81,0x02,0xad,0xc0,0x80,0x02,0x01,0x40,0x01,0x02,
+0x01,0x00,0x81,0x02,0x15,0x40,0x00,0x03,0x20,0x40,0x01,0x03,0xb3,0x00,0x81,0x02,
+0x98,0xf8,0xbf,0x02,0x15,0xc0,0x80,0x02,0x01,0xc0,0x00,0x03,0xa0,0x00,0x80,0x02,
+0x15,0x00,0x81,0x02,0xad,0xc0,0x80,0x02,0x16,0x00,0x81,0x02,0x29,0x00,0x80,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,
+0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,
+0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x00,
+0x00,0x39,0x00,0x03,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x06,0x26,0x00,0x00,0x00,
+0x3f,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x01,0x7d,0x00,0x03,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
+0x29,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,
+0x01,0xc0,0x80,0x00,0x11,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x97,0x04,0x40,0x00,0x06,0x00,0x80,0x01,0x11,0x02,0x00,0x02,0x3d,0x00,0x80,0x02,
+0x01,0x40,0x00,0x03,0x20,0x40,0x01,0x03,0x3e,0x80,0x81,0x02,0xbd,0x00,0x00,0x03,
+0x3e,0x80,0x81,0x02,0x20,0xc1,0x80,0x01,0x01,0x40,0x80,0x01,0x20,0x80,0x81,0x01,
+0x83,0x00,0x40,0x02,0xa0,0xc0,0x81,0x01,0x99,0x04,0xc0,0x01,0x06,0x00,0x80,0x01,
+0x11,0x04,0x00,0x02,0x3d,0x01,0x80,0x02,0x01,0x40,0x00,0x03,0x20,0x80,0x01,0x03,
+0x3e,0x80,0x81,0x02,0xbd,0x01,0x00,0x03,0x3e,0x80,0x81,0x02,0x20,0xc1,0x80,0x01,
+0x01,0x40,0x80,0x01,0x03,0x00,0x40,0x02,0xa0,0x40,0x82,0x01,0x15,0x80,0x00,0x02,
+0x01,0x40,0x80,0x02,0x83,0xff,0x3f,0x03,0xa0,0x40,0x82,0x02,0x01,0xc0,0x00,0x03,
+0x20,0x81,0x02,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x13,0x77,
+0x72,0x6f,0x6e,0x67,0x20,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,
+0x65,0x20,0x00,0x00,0x11,0x20,0x28,0x65,0x78,0x70,0x65,0x63,0x74,0x65,0x64,0x20,
+0x41,0x72,0x72,0x61,0x79,0x29,0x00,0x00,0x30,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,
+0x20,0x68,0x61,0x73,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x61,0x72,0x72,0x61,0x79,
+0x20,0x6c,0x65,0x6e,0x67,0x74,0x68,0x20,0x28,0x65,0x78,0x70,0x65,0x63,0x74,0x65,
+0x64,0x20,0x32,0x2c,0x20,0x77,0x61,0x73,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,
+0x0b,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x05,0x69,0x73,
+0x5f,0x61,0x3f,0x00,0x00,0x05,0x41,0x72,0x72,0x61,0x79,0x00,0x00,0x05,0x72,0x61,
+0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,
+0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,
+0x02,0x21,0x3d,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,
+0x72,0x6f,0x72,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,
+0x00,0x00,0x26,0x00,0x02,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
+0x26,0x00,0x00,0x00,0x3f,0x80,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x02,0xe6,0x00,0x00,0x00,0x1a,
+0x00,0x01,0x6e,0x00,0x03,0x61,0x72,0x79,0x00,0x03,0x76,0x61,0x6c,0x00,0x05,0x62,
+0x6c,0x6f,0x63,0x6b,0x00,0x05,0x73,0x74,0x61,0x74,0x65,0x00,0x01,0x68,0x00,0x03,
+0x6b,0x65,0x79,0x00,0x02,0x73,0x76,0x00,0x04,0x6f,0x72,0x69,0x67,0x00,0x01,0x65,
+0x00,0x01,0x69,0x00,0x01,0x61,0x00,0x01,0x62,0x00,0x01,0x76,0x00,0x05,0x63,0x6f,
+0x75,0x6e,0x74,0x00,0x02,0x65,0x32,0x00,0x02,0x65,0x33,0x00,0x05,0x66,0x69,0x72,
+0x73,0x74,0x00,0x03,0x6d,0x61,0x78,0x00,0x07,0x6d,0x61,0x78,0x5f,0x63,0x6d,0x70,
+0x00,0x03,0x63,0x6d,0x70,0x00,0x03,0x6d,0x69,0x6e,0x00,0x07,0x6d,0x69,0x6e,0x5f,
+0x63,0x6d,0x70,0x00,0x03,0x6f,0x62,0x6a,0x00,0x03,0x69,0x64,0x78,0x00,0x03,0x61,
+0x72,0x67,0x00,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x04,
+0x00,0x03,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,
+0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,
+0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x01,0x00,0x03,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x05,0x00,0x02,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x06,0x00,0x03,0x00,0x07,0x00,0x04,0x00,0x03,
+0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x08,0x00,0x03,0x00,0x09,0x00,0x01,0x00,0x0a,
+0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x0b,0x00,0x01,0x00,0x0c,0x00,0x02,0xff,0xff,
+0x00,0x00,0x00,0x09,0x00,0x01,0x00,0x0a,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x00,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0b,0x00,0x03,0x00,0x0a,0x00,0x04,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0d,
+0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x0e,0x00,0x03,0x00,0x02,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x01,
+0x00,0x02,0x00,0x09,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0f,0x00,0x03,0x00,0x10,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x11,0x00,0x02,0x00,0x12,
+0x00,0x03,0x00,0x13,0x00,0x04,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x14,
+0x00,0x03,0x00,0x03,0x00,0x01,0x00,0x11,0x00,0x02,0x00,0x15,0x00,0x03,0x00,0x16,
+0x00,0x04,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x14,0x00,0x03,0x00,0x03,
+0x00,0x01,0x00,0x12,0x00,0x02,0x00,0x15,0x00,0x03,0x00,0x11,0x00,0x04,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x02,0x00,0x13,
+0x00,0x03,0x00,0x15,0x00,0x04,0x00,0x16,0x00,0x05,0x00,0x11,0x00,0x06,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x14,0x00,0x03,0x00,0x03,0x00,0x01,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,
+0x00,0x01,0x00,0x0e,0x00,0x02,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x17,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x0a,
+0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x01,0x00,0x03,0x00,0x0e,
+0x00,0x04,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x09,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x09,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x18,0x00,0x03,0x00,0x09,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x09,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x19,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x0a,0x00,0x04,0x00,0x0b,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0b,
+0x00,0x03,0x00,0x18,0x00,0x04,0xff,0xff,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x0d,
+0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,
+0x00,0x08,
+};
+void mrb_mruby_enum_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_enum_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_enum_ext_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_load_irep(mrb, gem_mrblib_irep_mruby_enum_ext);
+ if (mrb->exc) {
+ mrb_print_error(mrb);
+ exit(EXIT_FAILURE);
+ }
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_enum_ext_gem_final(mrb_state *mrb) {
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-enum-lazy/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,224 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_enum_lazy[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0x7c,0x72,0x00,0x00,0x0b,0xb7,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x0a,0x41,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x37,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04,
+0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x80,0x00,0x4a,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0x45,0x6e,0x75,0x6d,0x65,0x72,
+0x61,0x62,0x6c,0x65,0x00,0x00,0x00,0x00,0x55,0x00,0x01,0x00,0x03,0x00,0x02,0x00,
+0x00,0x00,0x08,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x05,0x00,0x80,0x00,0x91,0x00,0x00,0x01,0x43,0x80,0x80,0x00,0xc5,0x00,0x80,0x00,
+0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x6c,0x61,
+0x7a,0x79,0x00,0x00,0x0a,0x45,0x6e,0x75,0x6d,0x65,0x72,0x61,0x74,0x6f,0x72,0x00,
+0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,0x00,0x00,0x3b,0x00,0x02,0x00,0x05,0x00,
+0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x11,0x00,0x00,0x01,
+0x06,0x00,0x80,0x01,0xa0,0x40,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,0x03,0x6e,0x65,0x77,
+0x00,0x00,0x00,0x01,0x9b,0x00,0x01,0x00,0x04,0x00,0x0b,0x00,0x00,0x00,0x36,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,0x04,0x01,0x00,0x01,
+0x84,0x00,0x80,0x01,0x05,0x00,0x00,0x02,0x20,0xc1,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x04,0x00,0x01,0x46,0x00,0x81,0x00,0x48,0x00,0x80,0x00,0x84,0x02,0x00,0x01,
+0x04,0x02,0x80,0x01,0x05,0x00,0x00,0x02,0x20,0xc1,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x06,0x00,0x01,0x46,0x80,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,
+0x46,0xc0,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,0x46,0x00,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x0c,0x00,0x01,0x46,0x40,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x0e,0x00,0x01,0x46,0x80,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,
+0x46,0xc0,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x12,0x00,0x01,0x46,0x00,0x83,0x00,
+0x48,0x00,0x80,0x00,0x84,0x06,0x00,0x01,0x04,0x06,0x80,0x01,0x05,0x00,0x00,0x02,
+0x20,0xc1,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x14,0x00,0x01,0x46,0x80,0x83,0x00,
+0x48,0x00,0x80,0x00,0x84,0x07,0x00,0x01,0x04,0x08,0x80,0x01,0x05,0x00,0x00,0x02,
+0x20,0xc1,0x80,0x00,0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,
+0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x03,0x6d,
+0x61,0x70,0x00,0x00,0x07,0x63,0x6f,0x6c,0x6c,0x65,0x63,0x74,0x00,0x00,0x0c,0x61,
+0x6c,0x69,0x61,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x06,0x73,0x65,
+0x6c,0x65,0x63,0x74,0x00,0x00,0x08,0x66,0x69,0x6e,0x64,0x5f,0x61,0x6c,0x6c,0x00,
+0x00,0x06,0x72,0x65,0x6a,0x65,0x63,0x74,0x00,0x00,0x04,0x67,0x72,0x65,0x70,0x00,
+0x00,0x04,0x64,0x72,0x6f,0x70,0x00,0x00,0x0a,0x64,0x72,0x6f,0x70,0x5f,0x77,0x68,
+0x69,0x6c,0x65,0x00,0x00,0x04,0x74,0x61,0x6b,0x65,0x00,0x00,0x0a,0x74,0x61,0x6b,
+0x65,0x5f,0x77,0x68,0x69,0x6c,0x65,0x00,0x00,0x08,0x66,0x6c,0x61,0x74,0x5f,0x6d,
+0x61,0x70,0x00,0x00,0x0e,0x63,0x6f,0x6c,0x6c,0x65,0x63,0x74,0x5f,0x63,0x6f,0x6e,
+0x63,0x61,0x74,0x00,0x00,0x03,0x7a,0x69,0x70,0x00,0x00,0x05,0x66,0x6f,0x72,0x63,
+0x65,0x00,0x00,0x04,0x74,0x6f,0x5f,0x61,0x00,0x00,0x00,0x00,0x2a,0x00,0x03,0x00,
+0x05,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0xa6,0x00,0x00,0x02,0x40,0x01,0x00,0x02,
+0x24,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x7b,0x00,0x03,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,
+0x26,0x00,0x00,0x02,0x1a,0x02,0x40,0x00,0x15,0x40,0x80,0x01,0x40,0x01,0x00,0x02,
+0x21,0x00,0x80,0x01,0x97,0x04,0x40,0x00,0x1b,0x00,0x80,0x01,0x91,0x00,0x00,0x02,
+0x01,0xc0,0x80,0x02,0xa0,0x80,0x00,0x02,0x98,0x00,0x40,0x02,0x17,0x01,0x40,0x00,
+0x05,0x00,0x80,0x01,0x17,0x01,0x40,0x00,0x1d,0x00,0x80,0x01,0x1c,0x00,0x80,0x00,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x0d,0x53,0x74,0x6f,0x70,0x49,0x74,0x65,0x72,0x61,0x74,0x69,
+0x6f,0x6e,0x00,0x00,0x03,0x3d,0x3d,0x3d,0x00,0x00,0x00,0x00,0x56,0x00,0x03,0x00,
+0x07,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x26,0x00,0x00,0x02,0x95,0x80,0x80,0x01,
+0x99,0x02,0xc0,0x01,0x95,0x80,0x80,0x01,0x15,0x40,0x00,0x02,0x01,0x40,0x80,0x02,
+0x20,0x01,0x80,0x01,0x97,0x01,0x40,0x00,0x15,0x40,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,0x00,0x00,0x3f,
+0x00,0x02,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0xa6,0x00,0x00,0x00,
+0x11,0x00,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0xa1,0x40,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x4c,0x61,
+0x7a,0x79,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x00,0x00,0x42,0x00,0x04,0x00,
+0x08,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x26,0x00,0x00,0x04,0x01,0x40,0x00,0x02,
+0x15,0x40,0x80,0x02,0x01,0x80,0x00,0x03,0xa0,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x3c,0x3c,
+0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x3f,0x00,0x02,0x00,0x05,
+0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0xa6,0x00,0x00,0x00,0x11,0x00,0x00,0x01,
+0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0xa1,0x40,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,
+0x03,0x6e,0x65,0x77,0x00,0x00,0x00,0x00,0x52,0x00,0x04,0x00,0x07,0x00,0x00,0x00,
+0x00,0x00,0x0b,0x00,0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,0x01,0x80,0x80,0x02,
+0xa0,0x00,0x00,0x02,0x19,0x02,0x40,0x02,0x01,0x40,0x00,0x02,0x01,0x80,0x80,0x02,
+0xa0,0x40,0x00,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x02,0x3c,0x3c,0x00,0x00,0x00,0x00,0x3f,0x00,0x02,0x00,0x05,0x00,0x01,0x00,0x00,
+0x00,0x06,0x00,0x00,0xa6,0x00,0x00,0x00,0x11,0x00,0x00,0x01,0x06,0x00,0x80,0x01,
+0x40,0x01,0x00,0x02,0xa1,0x40,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,0x03,0x6e,0x65,0x77,
+0x00,0x00,0x00,0x00,0x5a,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,
+0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,0x01,0x80,0x80,0x02,0xa0,0x00,0x00,0x02,
+0x20,0x40,0x00,0x02,0x19,0x02,0x40,0x02,0x01,0x40,0x00,0x02,0x01,0x80,0x80,0x02,
+0xa0,0x80,0x00,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x01,0x21,0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,0x00,0x00,0x3f,0x00,0x03,0x00,0x06,
+0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x26,0x00,0x00,0x02,0x11,0x00,0x80,0x01,
+0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0xa1,0x40,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,
+0x03,0x6e,0x65,0x77,0x00,0x00,0x00,0x00,0x51,0x00,0x04,0x00,0x07,0x00,0x00,0x00,
+0x00,0x00,0x0b,0x00,0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,0x01,0x80,0x80,0x02,
+0xa0,0x00,0x00,0x02,0x19,0x02,0x40,0x02,0x01,0x40,0x00,0x02,0x01,0x80,0x80,0x02,
+0xa0,0x40,0x00,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x3d,0x3d,0x3d,0x00,0x00,0x02,
+0x3c,0x3c,0x00,0x00,0x00,0x00,0x43,0x00,0x04,0x00,0x07,0x00,0x01,0x00,0x00,0x00,
+0x07,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x83,0xff,0xbf,0x01,0x11,0x00,0x00,0x02,
+0x06,0x00,0x80,0x02,0x40,0x01,0x00,0x03,0xa1,0x40,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,
+0x03,0x6e,0x65,0x77,0x00,0x00,0x00,0x00,0x5b,0x00,0x04,0x00,0x07,0x00,0x00,0x00,
+0x00,0x00,0x0d,0x00,0x26,0x00,0x00,0x04,0x15,0xc0,0x00,0x02,0x15,0x40,0x80,0x02,
+0xb3,0x00,0x00,0x02,0x19,0x02,0x40,0x02,0x15,0xc0,0x00,0x02,0xad,0x40,0x00,0x02,
+0x16,0xc0,0x00,0x02,0x97,0x01,0x40,0x00,0x01,0x40,0x00,0x02,0x01,0x80,0x80,0x02,
+0xa0,0x80,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x01,0x3c,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,0x00,0x00,
+0x43,0x00,0x03,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0xa6,0x00,0x00,0x00,
+0x07,0x00,0x00,0x01,0x11,0x00,0x80,0x01,0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,
+0xa1,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x00,0x00,
+0x7a,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x26,0x00,0x00,0x04,
+0x15,0x80,0x00,0x02,0x99,0x06,0x40,0x02,0x15,0x40,0x00,0x02,0x01,0x80,0x80,0x02,
+0xa0,0x00,0x00,0x02,0x20,0x40,0x00,0x02,0x19,0x03,0x40,0x02,0x01,0x40,0x00,0x02,
+0x01,0x80,0x80,0x02,0xa0,0x80,0x00,0x02,0x08,0x00,0x00,0x02,0x16,0x80,0x00,0x02,
+0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x97,0x01,0x40,0x00,0x01,0x40,0x00,0x02,
+0x01,0x80,0x80,0x02,0xa0,0x80,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x21,0x00,0x00,
+0x02,0x3c,0x3c,0x00,0x00,0x00,0x00,0x6c,0x00,0x04,0x00,0x07,0x00,0x02,0x00,0x00,
+0x00,0x10,0x00,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x00,0x02,0x83,0xff,0xbf,0x02,
+0xb2,0x00,0x00,0x02,0x99,0x02,0x40,0x02,0x91,0x00,0x00,0x02,0x06,0x00,0x80,0x02,
+0x40,0x01,0x00,0x03,0xa1,0x80,0x00,0x02,0x29,0x00,0x00,0x02,0x83,0xff,0xbf,0x01,
+0x91,0x00,0x00,0x02,0x06,0x00,0x80,0x02,0x40,0x03,0x00,0x03,0xa1,0x80,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x3d,0x3d,
+0x00,0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x00,
+0x00,0x42,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x06,0x00,0x80,0x00,
+0x91,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x53,0x74,
+0x6f,0x70,0x49,0x74,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x00,0x00,0x00,0x00,0x84,
+0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x26,0x00,0x00,0x04,
+0x01,0x40,0x00,0x02,0x01,0x80,0x80,0x02,0xa0,0x00,0x00,0x02,0x15,0xc0,0x00,0x02,
+0xad,0x40,0x00,0x02,0x16,0xc0,0x00,0x02,0x15,0xc0,0x00,0x02,0x15,0x40,0x80,0x02,
+0xb6,0x80,0x00,0x02,0x19,0x02,0x40,0x02,0x06,0x00,0x00,0x02,0x11,0x02,0x80,0x02,
+0xa0,0xc0,0x00,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x3c,0x3c,0x00,0x00,0x01,0x2b,
+0x00,0x00,0x02,0x3e,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,
+0x53,0x74,0x6f,0x70,0x49,0x74,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x00,0x00,0x00,
+0x00,0x3f,0x00,0x02,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x06,0xa6,0x00,0x00,0x00,
+0x11,0x00,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0xa1,0x40,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x4c,0x61,
+0x7a,0x79,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x00,0x00,0x72,0x00,0x04,0x00,
+0x07,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,
+0x01,0x80,0x80,0x02,0xa0,0x00,0x00,0x02,0x19,0x02,0x40,0x02,0x01,0x40,0x00,0x02,
+0x01,0x80,0x80,0x02,0xa0,0x40,0x00,0x02,0x97,0x01,0x40,0x00,0x06,0x00,0x00,0x02,
+0x91,0x01,0x80,0x02,0xa0,0x80,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x3c,0x3c,0x00,
+0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x53,0x74,0x6f,0x70,0x49,0x74,
+0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x00,0x00,0x00,0x00,0x3f,0x00,0x02,0x00,0x05,
+0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0xa6,0x00,0x00,0x00,0x11,0x00,0x00,0x01,
+0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0xa1,0x40,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,
+0x03,0x6e,0x65,0x77,0x00,0x00,0x00,0x00,0x48,0x00,0x05,0x00,0x08,0x00,0x01,0x00,
+0x00,0x00,0x08,0x00,0x26,0x00,0x00,0x04,0x15,0x40,0x80,0x02,0x01,0x80,0x00,0x03,
+0xa0,0x00,0x80,0x02,0x01,0x40,0x01,0x02,0x40,0x01,0x00,0x03,0x21,0x40,0x80,0x02,
+0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x33,0x00,0x03,
+0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x05,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,
+0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x02,0x3c,0x3c,0x00,0x00,0x00,0x00,0x57,0x00,0x04,0x00,
+0x07,0x00,0x01,0x00,0x00,0x00,0x0b,0x00,0xa6,0x00,0x08,0x00,0x06,0x00,0x00,0x02,
+0xb7,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0xac,0x00,0x00,0x02,0x01,0x00,0x81,0x01,
+0x91,0x00,0x00,0x02,0x06,0x00,0x80,0x02,0x40,0x01,0x00,0x03,0xa1,0x80,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x01,0x2b,0x00,
+0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x00,0x00,
+0x70,0x00,0x05,0x00,0x09,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x26,0x00,0x00,0x04,
+0x15,0xc0,0x80,0x02,0x40,0x01,0x00,0x03,0x21,0x00,0x80,0x02,0x01,0x40,0x01,0x02,
+0x15,0x80,0x80,0x02,0x19,0x03,0xc0,0x02,0x01,0x40,0x80,0x02,0x15,0x80,0x00,0x03,
+0x01,0x00,0x81,0x03,0xa0,0x80,0x00,0x03,0xa0,0x40,0x80,0x02,0x97,0x01,0x40,0x00,
+0x01,0x40,0x80,0x02,0x01,0x00,0x01,0x03,0xa0,0x40,0x80,0x02,0x29,0x00,0x80,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x6d,0x61,0x70,0x00,0x00,0x02,
+0x3c,0x3c,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x31,0x00,0x03,
+0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x01,
+0x20,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x04,0x6e,0x65,0x78,0x74,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x01,0x58,0x00,
+0x00,0x00,0x0e,0x00,0x03,0x6f,0x62,0x6a,0x00,0x05,0x62,0x6c,0x6f,0x63,0x6b,0x00,
+0x07,0x79,0x69,0x65,0x6c,0x64,0x65,0x72,0x00,0x01,0x78,0x00,0x03,0x76,0x61,0x6c,
+0x00,0x07,0x70,0x61,0x74,0x74,0x65,0x72,0x6e,0x00,0x01,0x6e,0x00,0x07,0x64,0x72,
+0x6f,0x70,0x70,0x65,0x64,0x00,0x08,0x64,0x72,0x6f,0x70,0x70,0x69,0x6e,0x67,0x00,
+0x05,0x74,0x61,0x6b,0x65,0x6e,0x00,0x03,0x61,0x72,0x79,0x00,0x04,0x61,0x72,0x67,
+0x73,0x00,0x05,0x65,0x6e,0x75,0x6d,0x73,0x00,0x01,0x65,0xff,0xff,0x00,0x00,0x00,
+0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,
+0x03,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x01,0x00,
+0x04,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x01,0x00,
+0x04,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x01,0x00,
+0x04,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x05,0x00,0x01,0xff,0xff,0x00,0x00,0x00,
+0x02,0x00,0x01,0x00,0x04,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x06,0x00,0x01,0xff,
+0xff,0x00,0x00,0x00,0x07,0x00,0x03,0x00,0x02,0x00,0x01,0x00,0x04,0x00,0x02,0xff,
+0xff,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x02,0x00,0x02,0x00,0x01,0x00,
+0x04,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x06,0x00,0x01,0xff,0xff,0x00,0x00,0x00,
+0x09,0x00,0x03,0x00,0x02,0x00,0x01,0x00,0x04,0x00,0x02,0xff,0xff,0x00,0x00,0x00,
+0x01,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x04,0x00,0x02,0xff,0xff,0x00,0x00,0x00,
+0x01,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x04,0x00,0x02,0xff,0xff,0x00,0x00,0x00,
+0x0a,0x00,0x04,0x00,0x03,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0b,0x00,0x01,0x00,
+0x01,0x00,0x02,0x00,0x0c,0x00,0x03,0x00,0x02,0x00,0x01,0x00,0x04,0x00,0x02,0xff,
+0xff,0x00,0x00,0x00,0x0a,0x00,0x04,0x00,0x0d,0x00,0x01,0xff,0xff,0x00,0x00,0x45,
+0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_enum_lazy_gem_init(mrb_state *mrb);
+void mrb_mruby_enum_lazy_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_enum_lazy_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_load_irep(mrb, gem_mrblib_irep_mruby_enum_lazy);
+ if (mrb->exc) {
+ mrb_print_error(mrb);
+ exit(EXIT_FAILURE);
+ }
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_enum_lazy_gem_final(mrb_state *mrb) {
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-enumerator/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,386 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_enumerator[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0x7c,0x82,0x00,0x00,0x15,0xda,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x14,0x5d,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x69,0x00,0x01,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x0b,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0x45,0x00,0x80,0x00,
+0x05,0x00,0x80,0x00,0x44,0x40,0x80,0x00,0xc5,0x00,0x80,0x00,0x05,0x00,0x80,0x00,
+0x44,0x80,0x80,0x00,0x45,0x01,0x80,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x0a,0x45,0x6e,0x75,0x6d,0x65,0x72,0x61,0x74,0x6f,0x72,
+0x00,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x00,0x00,0x0a,0x45,0x6e,0x75,0x6d,
+0x65,0x72,0x61,0x62,0x6c,0x65,0x00,0x00,0x00,0x02,0x3e,0x00,0x01,0x00,0x07,0x00,
+0x10,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x06,0x00,0x80,0x00,0x91,0x00,0x00,0x01,
+0xa0,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x80,0x80,0x00,
+0x06,0x00,0x80,0x00,0x04,0x02,0x00,0x01,0x84,0x02,0x80,0x01,0x04,0x03,0x00,0x02,
+0x84,0x03,0x80,0x02,0x20,0xc2,0x80,0x00,0x06,0x00,0x80,0x00,0x04,0x02,0x00,0x01,
+0x84,0x02,0x80,0x01,0x04,0x03,0x00,0x02,0x84,0x03,0x80,0x02,0x20,0x02,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x04,0x00,0x01,0x46,0x80,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,
+0x46,0xc0,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,0x46,0x00,0x83,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,0x46,0x40,0x83,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x0c,0x00,0x01,0x46,0x80,0x83,0x00,0x48,0x00,0x80,0x00,0xc0,0x0e,0x00,0x01,
+0x46,0xc0,0x83,0x00,0x06,0x00,0x80,0x00,0x84,0x07,0x00,0x01,0xa0,0x00,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,0x46,0x00,0x84,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x12,0x00,0x01,0x46,0x40,0x84,0x00,0x48,0x00,0x80,0x00,0xc0,0x14,0x00,0x01,
+0x46,0x80,0x84,0x00,0x48,0x00,0x80,0x00,0xc0,0x16,0x00,0x01,0x46,0xc0,0x84,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x18,0x00,0x01,0x46,0x00,0x85,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x1a,0x00,0x01,0x46,0x40,0x85,0x00,0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,
+0x43,0x80,0x85,0x00,0x45,0x07,0x80,0x00,0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,
+0x43,0xc0,0x85,0x00,0xc5,0x07,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x18,0x00,0x07,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x0a,
+0x45,0x6e,0x75,0x6d,0x65,0x72,0x61,0x62,0x6c,0x65,0x00,0x00,0x0a,0x69,0x6e,0x69,
+0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x0d,0x61,0x74,0x74,0x72,0x5f,0x61,
+0x63,0x63,0x65,0x73,0x73,0x6f,0x72,0x00,0x00,0x03,0x6f,0x62,0x6a,0x00,0x00,0x04,
+0x6d,0x65,0x74,0x68,0x00,0x00,0x04,0x61,0x72,0x67,0x73,0x00,0x00,0x03,0x66,0x69,
+0x62,0x00,0x00,0x07,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x00,0x00,0x0f,0x69,0x6e,
+0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x5f,0x63,0x6f,0x70,0x79,0x00,0x00,0x0a,
+0x77,0x69,0x74,0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x0f,0x65,0x61,0x63,
+0x68,0x5f,0x77,0x69,0x74,0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x0b,0x77,
+0x69,0x74,0x68,0x5f,0x6f,0x62,0x6a,0x65,0x63,0x74,0x00,0x00,0x07,0x69,0x6e,0x73,
+0x70,0x65,0x63,0x74,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x15,0x65,0x6e,
+0x75,0x6d,0x65,0x72,0x61,0x74,0x6f,0x72,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x63,
+0x61,0x6c,0x6c,0x00,0x00,0x04,0x6e,0x65,0x78,0x74,0x00,0x00,0x0b,0x6e,0x65,0x78,
+0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x00,0x00,0x04,0x70,0x65,0x65,0x6b,0x00,
+0x00,0x0b,0x70,0x65,0x65,0x6b,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x00,0x00,0x06,
+0x72,0x65,0x77,0x69,0x6e,0x64,0x00,0x00,0x04,0x66,0x65,0x65,0x64,0x00,0x00,0x09,
+0x47,0x65,0x6e,0x65,0x72,0x61,0x74,0x6f,0x72,0x00,0x00,0x07,0x59,0x69,0x65,0x6c,
+0x64,0x65,0x72,0x00,0x00,0x00,0x01,0x37,0x00,0x05,0x00,0x08,0x00,0x00,0x00,0x00,
+0x00,0x23,0x00,0x00,0xa6,0x00,0x28,0x00,0x17,0x01,0x40,0x00,0x17,0x01,0x40,0x00,
+0x17,0x01,0x40,0x00,0x05,0x00,0x80,0x00,0x04,0x00,0x00,0x01,0x06,0x00,0x80,0x02,
+0x20,0x40,0x80,0x02,0x99,0x02,0xc0,0x02,0x11,0x01,0x80,0x02,0x01,0x00,0x01,0x03,
+0x21,0xc0,0x80,0x02,0x01,0x40,0x81,0x00,0x97,0x02,0x40,0x00,0x99,0x00,0xc0,0x00,
+0x97,0x01,0x40,0x00,0x06,0x00,0x80,0x02,0x91,0x02,0x00,0x03,0xa0,0x00,0x81,0x02,
+0x0e,0x03,0x80,0x00,0x8e,0x03,0x00,0x01,0x01,0xc0,0x80,0x02,0x20,0x00,0x82,0x02,
+0x8e,0x04,0x80,0x02,0x05,0x00,0x80,0x02,0x0e,0x05,0x80,0x02,0x05,0x00,0x80,0x02,
+0x8e,0x05,0x80,0x02,0x05,0x00,0x80,0x02,0x0e,0x06,0x80,0x02,0x05,0x00,0x80,0x02,
+0x8e,0x06,0x80,0x02,0x08,0x00,0x80,0x02,0x0e,0x07,0x80,0x02,0x29,0x00,0x80,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x09,
+0x47,0x65,0x6e,0x65,0x72,0x61,0x74,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,
+0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,
+0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x04,0x40,0x6f,0x62,0x6a,0x00,0x00,
+0x05,0x40,0x6d,0x65,0x74,0x68,0x00,0x00,0x03,0x64,0x75,0x70,0x00,0x00,0x05,0x40,
+0x61,0x72,0x67,0x73,0x00,0x00,0x04,0x40,0x66,0x69,0x62,0x00,0x00,0x04,0x40,0x64,
+0x73,0x74,0x00,0x00,0x0a,0x40,0x6c,0x6f,0x6f,0x6b,0x61,0x68,0x65,0x61,0x64,0x00,
+0x00,0x0a,0x40,0x66,0x65,0x65,0x64,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x09,0x40,
+0x73,0x74,0x6f,0x70,0x5f,0x65,0x78,0x63,0x00,0x00,0x00,0x01,0x69,0x00,0x03,0x00,
+0x08,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x01,
+0x91,0x00,0x00,0x02,0xa0,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,0x97,0x03,0x40,0x00,
+0x06,0x00,0x80,0x01,0x91,0x01,0x00,0x02,0x3d,0x00,0x80,0x02,0x01,0x40,0x00,0x03,
+0x20,0x00,0x01,0x03,0x3e,0x80,0x81,0x02,0x20,0x81,0x80,0x01,0x01,0x40,0x80,0x01,
+0x20,0x40,0x81,0x01,0x19,0x02,0xc0,0x01,0x06,0x00,0x80,0x01,0x91,0x01,0x00,0x02,
+0x3d,0x01,0x80,0x02,0x20,0x81,0x80,0x01,0x01,0x40,0x80,0x01,0x20,0x80,0x81,0x01,
+0x8e,0x03,0x80,0x01,0x01,0x40,0x80,0x01,0x20,0x00,0x82,0x01,0x8e,0x04,0x80,0x01,
+0x01,0x40,0x80,0x01,0x20,0x80,0x82,0x01,0x8e,0x05,0x80,0x01,0x05,0x00,0x80,0x01,
+0x0e,0x06,0x80,0x01,0x05,0x00,0x80,0x01,0x8e,0x06,0x80,0x01,0x05,0x00,0x80,0x01,
+0x0e,0x07,0x80,0x01,0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x03,
+0x00,0x00,0x10,0x63,0x61,0x6e,0x27,0x74,0x20,0x63,0x6f,0x70,0x79,0x20,0x74,0x79,
+0x70,0x65,0x20,0x00,0x00,0x00,0x00,0x00,0x1c,0x63,0x61,0x6e,0x27,0x74,0x20,0x63,
+0x6f,0x70,0x79,0x20,0x65,0x78,0x65,0x63,0x75,0x74,0x69,0x6f,0x6e,0x20,0x63,0x6f,
+0x6e,0x74,0x65,0x78,0x74,0x00,0x00,0x00,0x0f,0x00,0x08,0x6b,0x69,0x6e,0x64,0x5f,
+0x6f,0x66,0x3f,0x00,0x00,0x0a,0x45,0x6e,0x75,0x6d,0x65,0x72,0x61,0x74,0x6f,0x72,
+0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,
+0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x03,0x66,
+0x69,0x62,0x00,0x00,0x03,0x6f,0x62,0x6a,0x00,0x00,0x04,0x40,0x6f,0x62,0x6a,0x00,
+0x00,0x04,0x6d,0x65,0x74,0x68,0x00,0x00,0x05,0x40,0x6d,0x65,0x74,0x68,0x00,0x00,
+0x04,0x61,0x72,0x67,0x73,0x00,0x00,0x05,0x40,0x61,0x72,0x67,0x73,0x00,0x00,0x04,
+0x40,0x66,0x69,0x62,0x00,0x00,0x0a,0x40,0x6c,0x6f,0x6f,0x6b,0x61,0x68,0x65,0x61,
+0x64,0x00,0x00,0x0a,0x40,0x66,0x65,0x65,0x64,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,
+0x00,0x01,0x48,0x00,0x04,0x00,0x09,0x00,0x01,0x00,0x00,0x00,0x23,0x00,0x00,0x00,
+0x26,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,0x83,0xff,0xbf,0x00,
+0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,0x99,0x00,0x40,0x02,0x97,0x02,0x40,0x00,
+0x06,0x00,0x00,0x02,0x04,0x01,0x80,0x02,0x01,0x40,0x00,0x03,0x20,0x41,0x00,0x02,
+0x29,0x00,0x00,0x02,0x01,0x40,0x00,0x02,0x04,0x02,0x80,0x02,0xa0,0xc0,0x00,0x02,
+0x99,0x00,0x40,0x02,0x97,0x04,0x40,0x00,0x06,0x00,0x00,0x02,0x11,0x03,0x80,0x02,
+0x3d,0x00,0x00,0x03,0x01,0x40,0x80,0x03,0x20,0xc0,0x81,0x03,0x3e,0xc0,0x01,0x03,
+0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,0x20,0x41,0x01,0x02,0x01,0x40,0x00,0x02,
+0x20,0x00,0x01,0x02,0xaf,0x00,0x02,0x02,0x01,0x00,0x81,0x01,0x06,0x00,0x00,0x02,
+0x40,0x01,0x80,0x02,0x21,0x40,0x02,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x02,
+0x00,0x00,0x1a,0x6e,0x6f,0x20,0x69,0x6d,0x70,0x6c,0x69,0x63,0x69,0x74,0x20,0x63,
+0x6f,0x6e,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x00,0x00,0x0d,
+0x20,0x69,0x6e,0x74,0x6f,0x20,0x49,0x6e,0x74,0x65,0x67,0x65,0x72,0x00,0x00,0x00,
+0x0a,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,
+0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x0a,0x77,0x69,0x74,0x68,
+0x5f,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x0b,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
+0x5f,0x74,0x6f,0x3f,0x00,0x00,0x06,0x74,0x6f,0x5f,0x69,0x6e,0x74,0x00,0x00,0x05,
+0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,
+0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x01,0x2d,0x00,0x00,0x15,
+0x65,0x6e,0x75,0x6d,0x65,0x72,0x61,0x74,0x6f,0x72,0x5f,0x62,0x6c,0x6f,0x63,0x6b,
+0x5f,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x4d,0x00,0x03,0x00,0x06,0x00,0x00,
+0x00,0x00,0x00,0x0a,0x26,0x00,0x00,0x02,0x15,0xc0,0x80,0x01,0xad,0x00,0x80,0x01,
+0x16,0xc0,0x80,0x01,0xab,0x00,0x82,0x01,0x01,0x40,0x00,0x02,0x15,0xc0,0x80,0x02,
+0x37,0x01,0x01,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x01,0x2b,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x00,0x00,0x37,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0x77,0x69,0x74,0x68,0x5f,0x69,
+0x6e,0x64,0x65,0x78,0x00,0x00,0x00,0x00,0x91,0x00,0x03,0x00,0x07,0x00,0x01,0x00,
+0x00,0x00,0x0e,0x00,0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,
+0x99,0x00,0xc0,0x01,0x97,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,
+0x01,0x40,0x80,0x02,0x20,0x41,0x80,0x01,0x29,0x00,0x80,0x01,0x06,0x00,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x0b,0x77,
+0x69,0x74,0x68,0x5f,0x6f,0x62,0x6a,0x65,0x63,0x74,0x00,0x00,0x15,0x65,0x6e,0x75,
+0x6d,0x65,0x72,0x61,0x74,0x6f,0x72,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x00,0x00,0x3d,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
+0x07,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0xab,0x00,0x82,0x01,0x01,0x40,0x00,0x02,
+0x15,0x40,0x80,0x02,0x37,0x01,0x01,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x00,0x01,0x5e,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,
+0x26,0x00,0x00,0x00,0x0d,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,0x97,0x03,0x40,0x00,
+0x3d,0x00,0x80,0x01,0x06,0x00,0x00,0x02,0x20,0x40,0x00,0x02,0x3e,0x00,0x81,0x01,
+0xbd,0x00,0x00,0x02,0x3e,0x00,0x81,0x01,0x29,0x00,0x80,0x01,0x0d,0x01,0x80,0x01,
+0x19,0x02,0xc0,0x01,0x0d,0x01,0x80,0x01,0x20,0xc0,0x80,0x01,0x83,0xff,0x3f,0x02,
+0xb5,0x00,0x81,0x01,0x99,0x0b,0xc0,0x01,0x0d,0x01,0x80,0x01,0x3d,0x01,0x00,0x02,
+0xa0,0x40,0x81,0x01,0x01,0xc0,0x00,0x01,0x3d,0x00,0x80,0x01,0x06,0x00,0x00,0x02,
+0x20,0x40,0x00,0x02,0x3e,0x00,0x81,0x01,0xbd,0x01,0x00,0x02,0x3e,0x00,0x81,0x01,
+0x0d,0x00,0x00,0x02,0x3e,0x00,0x81,0x01,0x3d,0x02,0x00,0x02,0x3e,0x00,0x81,0x01,
+0x0d,0x03,0x00,0x02,0x3e,0x00,0x81,0x01,0xbd,0x02,0x00,0x02,0x3e,0x00,0x81,0x01,
+0x01,0x80,0x00,0x02,0x3e,0x00,0x81,0x01,0x3d,0x03,0x00,0x02,0x3e,0x00,0x81,0x01,
+0x17,0x07,0x40,0x00,0x3d,0x00,0x80,0x01,0x06,0x00,0x00,0x02,0x20,0x40,0x00,0x02,
+0x3e,0x00,0x81,0x01,0xbd,0x01,0x00,0x02,0x3e,0x00,0x81,0x01,0x0d,0x00,0x00,0x02,
+0x3e,0x00,0x81,0x01,0x3d,0x02,0x00,0x02,0x3e,0x00,0x81,0x01,0x0d,0x03,0x00,0x02,
+0x3e,0x00,0x81,0x01,0xbd,0x03,0x00,0x02,0x3e,0x00,0x81,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x08,0x00,0x00,0x02,0x23,0x3c,0x00,0x00,0x10,0x3a,0x20,0x75,0x6e,
+0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x64,0x3e,0x00,0x00,0x02,0x2c,
+0x20,0x00,0x00,0x02,0x3a,0x20,0x00,0x00,0x01,0x3a,0x00,0x00,0x01,0x28,0x00,0x00,
+0x02,0x29,0x3e,0x00,0x00,0x01,0x3e,0x00,0x00,0x00,0x07,0x00,0x04,0x40,0x6f,0x62,
+0x6a,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x05,0x40,0x61,0x72,0x67,
+0x73,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x3e,0x00,0x00,0x04,0x6a,
+0x6f,0x69,0x6e,0x00,0x00,0x05,0x40,0x6d,0x65,0x74,0x68,0x00,0x00,0x00,0x01,0x0d,
+0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0xa6,0x00,0x08,0x00,
+0x06,0x00,0x80,0x01,0x83,0xff,0xbf,0x02,0x01,0x40,0x00,0x03,0x20,0x40,0x00,0x03,
+0xb3,0x00,0x80,0x02,0x99,0x0a,0xc0,0x02,0x06,0x00,0x80,0x02,0x20,0x80,0x80,0x02,
+0x01,0x40,0x81,0x01,0x20,0xc0,0x80,0x02,0x01,0x40,0x01,0x02,0x20,0x00,0x81,0x02,
+0x20,0x40,0x81,0x02,0x19,0x03,0xc0,0x02,0x01,0x00,0x81,0x02,0x20,0x80,0x80,0x02,
+0x01,0x40,0x01,0x02,0x01,0x40,0x00,0x03,0xa0,0x80,0x81,0x02,0x97,0x01,0x40,0x00,
+0x01,0x40,0x80,0x02,0x20,0x80,0x80,0x02,0x01,0x40,0x01,0x02,0x01,0x00,0x81,0x02,
+0x01,0xc0,0x00,0x03,0x01,0x40,0x81,0x03,0xa0,0xc0,0x01,0x03,0x06,0x00,0x80,0x02,
+0x20,0x00,0x82,0x02,0x99,0x00,0xc0,0x02,0x97,0x00,0x40,0x00,0x29,0x00,0x80,0x01,
+0x06,0x00,0x80,0x02,0x01,0x80,0x00,0x03,0x21,0x40,0x82,0x02,0x29,0x00,0x80,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x01,0x3c,0x00,0x00,0x06,0x6c,0x65,
+0x6e,0x67,0x74,0x68,0x00,0x00,0x03,0x64,0x75,0x70,0x00,0x00,0x04,0x61,0x72,0x67,
+0x73,0x00,0x00,0x06,0x65,0x6d,0x70,0x74,0x79,0x3f,0x00,0x00,0x01,0x21,0x00,0x00,
+0x06,0x63,0x6f,0x6e,0x63,0x61,0x74,0x00,0x00,0x05,0x61,0x72,0x67,0x73,0x3d,0x00,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x15,0x65,0x6e,0x75,0x6d,0x65,0x72,0x61,0x74,0x6f,0x72,0x5f,0x62,0x6c,0x6f,0x63,
+0x6b,0x5f,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x60,0x00,0x02,0x00,0x05,0x00,
+0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x0d,0x00,0x00,0x01,
+0x0d,0x01,0x80,0x01,0xb7,0xc0,0x80,0x01,0x8d,0x01,0x00,0x02,0x38,0x00,0x81,0x01,
+0x01,0x40,0x00,0x02,0xa1,0x7f,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x04,0x40,0x6f,0x62,0x6a,0x00,0x00,0x08,0x5f,0x5f,0x73,
+0x65,0x6e,0x64,0x5f,0x5f,0x00,0x00,0x05,0x40,0x6d,0x65,0x74,0x68,0x00,0x00,0x05,
+0x40,0x61,0x72,0x67,0x73,0x00,0x00,0x00,0x00,0x47,0x00,0x02,0x00,0x04,0x00,0x00,
+0x00,0x00,0x00,0x05,0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,
+0x20,0x40,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x0b,0x6e,0x65,0x78,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x00,0x00,0x08,
+0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x01,0x40,0x00,0x04,0x00,
+0x07,0x00,0x01,0x00,0x00,0x00,0x2f,0x00,0x26,0x00,0x00,0x00,0x0d,0x00,0x00,0x02,
+0x19,0x02,0x40,0x02,0x0d,0x00,0x00,0x01,0x05,0x00,0x00,0x02,0x0e,0x00,0x00,0x02,
+0x29,0x00,0x00,0x01,0x8d,0x00,0x00,0x02,0x99,0x01,0x40,0x02,0x06,0x00,0x00,0x02,
+0x8d,0x00,0x80,0x02,0xa0,0x80,0x00,0x02,0x91,0x01,0x00,0x02,0x20,0x00,0x01,0x02,
+0x01,0x00,0x81,0x01,0x8d,0x02,0x00,0x02,0x20,0x80,0x01,0x02,0x98,0x01,0x40,0x02,
+0x8d,0x02,0x00,0x02,0x20,0xc0,0x01,0x02,0x20,0x80,0x01,0x02,0x99,0x03,0x40,0x02,
+0x0e,0x04,0x80,0x01,0x91,0x01,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0x40,0x02,0x02,
+0x8e,0x02,0x00,0x02,0x05,0x00,0x00,0x02,0x0e,0x00,0x00,0x02,0x8d,0x02,0x00,0x02,
+0x01,0xc0,0x80,0x02,0xa0,0x80,0x02,0x02,0x01,0x00,0x01,0x01,0x8d,0x00,0x00,0x02,
+0x99,0x05,0x40,0x02,0x05,0x00,0x00,0x02,0x8e,0x02,0x00,0x02,0x05,0x00,0x00,0x02,
+0x0e,0x04,0x00,0x02,0x05,0x00,0x00,0x02,0x0e,0x00,0x00,0x02,0x05,0x00,0x00,0x02,
+0x8e,0x05,0x00,0x02,0x06,0x00,0x00,0x02,0x8d,0x00,0x80,0x02,0xa0,0x80,0x00,0x02,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x0a,0x40,0x6c,
+0x6f,0x6f,0x6b,0x61,0x68,0x65,0x61,0x64,0x00,0x00,0x09,0x40,0x73,0x74,0x6f,0x70,
+0x5f,0x65,0x78,0x63,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x05,0x46,
+0x69,0x62,0x65,0x72,0x00,0x00,0x07,0x63,0x75,0x72,0x72,0x65,0x6e,0x74,0x00,0x00,
+0x04,0x40,0x66,0x69,0x62,0x00,0x00,0x01,0x21,0x00,0x00,0x06,0x61,0x6c,0x69,0x76,
+0x65,0x3f,0x00,0x00,0x04,0x40,0x64,0x73,0x74,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,
+0x00,0x06,0x72,0x65,0x73,0x75,0x6d,0x65,0x00,0x00,0x0a,0x40,0x66,0x65,0x65,0x64,
+0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0xb8,0x00,0x02,0x00,0x06,0x00,0x01,
+0x00,0x00,0x00,0x10,0x06,0x00,0x00,0x01,0x40,0x01,0x80,0x01,0x21,0x00,0x00,0x01,
+0x01,0x80,0x80,0x00,0x91,0x00,0x00,0x01,0x3d,0x00,0x80,0x01,0xa0,0x80,0x00,0x01,
+0x8e,0x01,0x00,0x01,0x01,0x40,0x00,0x01,0x8d,0x01,0x80,0x01,0x01,0x80,0x00,0x02,
+0xa0,0x00,0x81,0x01,0x91,0x02,0x00,0x01,0x05,0x00,0x80,0x01,0xa0,0x80,0x01,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x18,0x69,0x74,0x65,0x72,0x61,
+0x74,0x69,0x6f,0x6e,0x20,0x72,0x65,0x61,0x63,0x68,0x65,0x64,0x20,0x61,0x6e,0x20,
+0x65,0x6e,0x64,0x00,0x00,0x00,0x07,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x0d,
+0x53,0x74,0x6f,0x70,0x49,0x74,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x00,0x00,0x03,
+0x6e,0x65,0x77,0x00,0x00,0x09,0x40,0x73,0x74,0x6f,0x70,0x5f,0x65,0x78,0x63,0x00,
+0x00,0x07,0x72,0x65,0x73,0x75,0x6c,0x74,0x3d,0x00,0x00,0x05,0x46,0x69,0x62,0x65,
+0x72,0x00,0x00,0x05,0x79,0x69,0x65,0x6c,0x64,0x00,0x00,0x00,0x00,0x63,0x00,0x04,
+0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0b,0x26,0x00,0x08,0x00,0x05,0x00,0x80,0x01,
+0x11,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,0x0d,0x01,0x00,0x02,
+0x99,0x01,0x40,0x02,0x0d,0x01,0x80,0x01,0x05,0x00,0x00,0x02,0x0e,0x01,0x00,0x02,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x05,0x46,0x69,
+0x62,0x65,0x72,0x00,0x00,0x05,0x79,0x69,0x65,0x6c,0x64,0x00,0x00,0x0a,0x40,0x66,
+0x65,0x65,0x64,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0x47,0x00,0x02,0x00,
+0x04,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,
+0x20,0x00,0x00,0x01,0x20,0x40,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x0b,0x70,0x65,0x65,0x6b,0x5f,0x76,0x61,0x6c,0x75,0x65,
+0x73,0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,
+0x6a,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x26,0x00,0x00,0x00,
+0x0d,0x00,0x00,0x01,0x20,0x40,0x00,0x01,0x99,0x01,0x40,0x01,0x06,0x00,0x00,0x01,
+0x20,0x80,0x00,0x01,0x0e,0x00,0x00,0x01,0x0d,0x00,0x00,0x01,0x20,0xc0,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0a,0x40,0x6c,
+0x6f,0x6f,0x6b,0x61,0x68,0x65,0x61,0x64,0x00,0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,
+0x00,0x0b,0x6e,0x65,0x78,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x00,0x00,0x03,
+0x64,0x75,0x70,0x00,0x00,0x00,0x00,0xb8,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,
+0x00,0x13,0x00,0x00,0x26,0x00,0x00,0x00,0x0d,0x00,0x00,0x01,0x04,0x01,0x80,0x01,
+0xa0,0x40,0x00,0x01,0x19,0x01,0x40,0x01,0x0d,0x00,0x00,0x01,0x20,0x80,0x00,0x01,
+0x05,0x00,0x00,0x01,0x8e,0x01,0x00,0x01,0x05,0x00,0x00,0x01,0x0e,0x02,0x00,0x01,
+0x05,0x00,0x00,0x01,0x8e,0x02,0x00,0x01,0x05,0x00,0x00,0x01,0x0e,0x03,0x00,0x01,
+0x08,0x00,0x00,0x01,0x8e,0x03,0x00,0x01,0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x04,0x40,0x6f,0x62,0x6a,0x00,0x00,
+0x0b,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x06,0x72,
+0x65,0x77,0x69,0x6e,0x64,0x00,0x00,0x04,0x40,0x66,0x69,0x62,0x00,0x00,0x04,0x40,
+0x64,0x73,0x74,0x00,0x00,0x0a,0x40,0x6c,0x6f,0x6f,0x6b,0x61,0x68,0x65,0x61,0x64,
+0x00,0x00,0x0a,0x40,0x66,0x65,0x65,0x64,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x09,
+0x40,0x73,0x74,0x6f,0x70,0x5f,0x65,0x78,0x63,0x00,0x00,0x00,0x00,0x7c,0x00,0x03,
+0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0a,0x26,0x00,0x00,0x02,0x0d,0x00,0x80,0x01,
+0x19,0x02,0xc0,0x01,0x06,0x00,0x80,0x01,0x11,0x01,0x00,0x02,0x3d,0x00,0x80,0x02,
+0x20,0x41,0x80,0x01,0x0e,0x00,0x80,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x01,0x00,0x00,0x16,0x66,0x65,0x65,0x64,0x20,0x76,0x61,0x6c,0x75,
+0x65,0x20,0x61,0x6c,0x72,0x65,0x61,0x64,0x79,0x20,0x73,0x65,0x74,0x00,0x00,0x00,
+0x03,0x00,0x0a,0x40,0x66,0x65,0x65,0x64,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x05,
+0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,
+0x72,0x00,0x00,0x00,0x00,0x4e,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x00,0x00,0x08,
+0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x84,0x00,0x80,0x00,0x29,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,
+0x6c,0x69,0x7a,0x65,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0xbe,
+0x00,0x02,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0xa6,0x00,0x00,0x00,
+0x01,0x40,0x00,0x01,0x91,0x00,0x80,0x01,0xa0,0x00,0x00,0x01,0x99,0x00,0x40,0x01,
+0x97,0x04,0x40,0x00,0x06,0x00,0x00,0x01,0x91,0x01,0x80,0x01,0x3d,0x00,0x00,0x02,
+0x06,0x00,0x80,0x02,0x20,0x00,0x81,0x02,0x3e,0x40,0x01,0x02,0xbd,0x00,0x80,0x02,
+0x3e,0x40,0x01,0x02,0x20,0x81,0x00,0x01,0x8e,0x02,0x80,0x00,0x29,0x00,0x80,0x00,
+0x00,0x00,0x00,0x02,0x00,0x00,0x14,0x77,0x72,0x6f,0x6e,0x67,0x20,0x61,0x72,0x67,
+0x75,0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,0x65,0x20,0x00,0x00,0x10,0x20,0x28,
+0x65,0x78,0x70,0x65,0x63,0x74,0x65,0x64,0x20,0x50,0x72,0x6f,0x63,0x29,0x00,0x00,
+0x00,0x06,0x00,0x08,0x6b,0x69,0x6e,0x64,0x5f,0x6f,0x66,0x3f,0x00,0x00,0x04,0x50,
+0x72,0x6f,0x63,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,
+0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,
+0x00,0x05,0x40,0x70,0x72,0x6f,0x63,0x00,0x00,0x00,0x00,0x73,0x00,0x03,0x00,0x06,
+0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0xa6,0x00,0x08,0x00,0x01,0x40,0x80,0x01,
+0x91,0x00,0x00,0x02,0x01,0x80,0x80,0x02,0x21,0x80,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x8d,0x01,0x80,0x01,0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,
+0xa0,0x3f,0x81,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,
+0x00,0x07,0x75,0x6e,0x73,0x68,0x69,0x66,0x74,0x00,0x00,0x07,0x59,0x69,0x65,0x6c,
+0x64,0x65,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x05,0x40,0x70,0x72,0x6f,
+0x63,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x60,0x00,0x01,0x00,
+0x03,0x00,0x03,0x00,0x00,0x00,0x0b,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,
+0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,0x04,0x01,0x80,0x00,
+0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x0a,0x69,0x6e,
+0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x05,0x79,0x69,0x65,0x6c,0x64,
+0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,0x00,0x00,0x87,0x00,0x02,0x00,0x06,0x00,0x00,
+0x00,0x00,0x00,0x0b,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,
+0x99,0x00,0x40,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x01,0x11,0x01,0x80,0x01,
+0x3d,0x00,0x00,0x02,0x20,0x41,0x00,0x01,0x8e,0x01,0x80,0x00,0x29,0x00,0x80,0x00,
+0x00,0x00,0x00,0x01,0x00,0x00,0x0e,0x6e,0x6f,0x20,0x62,0x6c,0x6f,0x63,0x6b,0x20,
+0x67,0x69,0x76,0x65,0x6e,0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,
+0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,
+0x00,0x0e,0x4c,0x6f,0x63,0x61,0x6c,0x4a,0x75,0x6d,0x70,0x45,0x72,0x72,0x6f,0x72,
+0x00,0x00,0x05,0x40,0x70,0x72,0x6f,0x63,0x00,0x00,0x00,0x00,0x45,0x00,0x03,0x00,
+0x06,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x26,0x00,0x08,0x00,0x0d,0x00,0x80,0x01,
+0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x7f,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x40,0x70,
+0x72,0x6f,0x63,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x42,0x00,
+0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x26,0x00,0x08,0x00,
+0x06,0x00,0x80,0x01,0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,
+0xa0,0x3f,0x80,0x01,0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x05,0x79,0x69,0x65,0x6c,0x64,0x00,0x00,0x00,0x00,0x62,
+0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0x84,0x00,0x00,0x01,
+0x04,0x00,0x80,0x01,0x05,0x00,0x00,0x02,0x20,0x81,0x80,0x00,0x29,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,
+0x6d,0x00,0x00,0x08,0x65,0x6e,0x75,0x6d,0x5f,0x66,0x6f,0x72,0x00,0x00,0x0c,0x61,
+0x6c,0x69,0x61,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x64,
+0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x26,0x00,0x18,0x00,
+0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,0x04,0x00,0x80,0x00,0x91,0x00,0x00,0x02,
+0x06,0x00,0x80,0x02,0x01,0x40,0x00,0x03,0x37,0x41,0x81,0x02,0x01,0x80,0x00,0x03,
+0x38,0x80,0x81,0x02,0xa0,0xbf,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x0a,0x45,0x6e,0x75,
+0x6d,0x65,0x72,0x61,0x74,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x00,
+0x00,0x34,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,0x48,0x00,0x80,0x00,
+0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,0x04,0x00,0x80,0x00,0x29,0x00,0x80,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x7a,0x69,0x70,0x00,0x00,0x00,
+0x00,0x53,0x00,0x05,0x00,0x07,0x00,0x02,0x00,0x00,0x00,0x0b,0x26,0x00,0x08,0x00,
+0x37,0x40,0x81,0x01,0x01,0x40,0x80,0x02,0x40,0x01,0x00,0x03,0x21,0x00,0x80,0x02,
+0x01,0x40,0x81,0x00,0x83,0xff,0x3f,0x02,0x06,0x00,0x80,0x02,0x40,0x03,0x00,0x03,
+0x21,0x40,0x80,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x03,0x6d,0x61,0x70,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,
+0x31,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x26,0x00,0x00,0x02,
+0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x01,0x09,0x00,
+0x05,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x26,0x00,0x08,0x00,
+0x37,0x40,0x81,0x01,0x01,0xc0,0x80,0x02,0x01,0x40,0x00,0x03,0x20,0x40,0x00,0x03,
+0xa0,0x00,0x80,0x02,0x83,0xff,0x3f,0x02,0x97,0x0b,0x40,0x00,0x9a,0x03,0x40,0x00,
+0x01,0xc0,0x80,0x02,0x15,0x40,0x00,0x03,0x01,0x00,0x81,0x03,0xa0,0x80,0x00,0x03,
+0x20,0xc0,0x00,0x03,0xa0,0x00,0x80,0x02,0x97,0x05,0x40,0x00,0x1b,0x00,0x80,0x02,
+0x11,0x02,0x00,0x03,0x01,0x40,0x81,0x03,0xa0,0x40,0x01,0x03,0x98,0x00,0x40,0x03,
+0x17,0x02,0x40,0x00,0x01,0xc0,0x80,0x02,0x05,0x00,0x00,0x03,0xa0,0x00,0x80,0x02,
+0x17,0x01,0x40,0x00,0x1d,0x00,0x80,0x02,0x1c,0x00,0x80,0x00,0x01,0x00,0x81,0x02,
+0xad,0x80,0x81,0x02,0x01,0x40,0x01,0x02,0x01,0x00,0x81,0x02,0x15,0x40,0x00,0x03,
+0x20,0x00,0x02,0x03,0xb3,0xc0,0x81,0x02,0x18,0xf2,0xbf,0x02,0x15,0xc0,0x80,0x02,
+0x01,0xc0,0x00,0x03,0xa0,0x00,0x80,0x02,0x15,0x00,0x81,0x02,0xad,0x80,0x81,0x02,
+0x16,0x00,0x81,0x02,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,
+0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,
+0x65,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x04,0x6e,0x65,0x78,0x74,0x00,0x00,0x0d,
+0x53,0x74,0x6f,0x70,0x49,0x74,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x00,0x00,0x03,
+0x3d,0x3d,0x3d,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x04,0x73,0x69,
+0x7a,0x65,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x01,0x5f,0x00,0x00,0x00,0x13,0x00,
+0x03,0x6f,0x62,0x6a,0x00,0x04,0x6d,0x65,0x74,0x68,0x00,0x04,0x61,0x72,0x67,0x73,
+0x00,0x05,0x62,0x6c,0x6f,0x63,0x6b,0x00,0x06,0x6f,0x66,0x66,0x73,0x65,0x74,0x00,
+0x01,0x6e,0x00,0x01,0x69,0x00,0x06,0x6f,0x62,0x6a,0x65,0x63,0x74,0x00,0x04,0x61,
+0x72,0x67,0x76,0x00,0x02,0x76,0x73,0x00,0x04,0x63,0x75,0x72,0x72,0x00,0x06,0x72,
+0x65,0x73,0x75,0x6c,0x74,0x00,0x09,0x66,0x65,0x65,0x64,0x76,0x61,0x6c,0x75,0x65,
+0x00,0x05,0x76,0x61,0x6c,0x75,0x65,0x00,0x03,0x61,0x72,0x67,0x00,0x03,0x61,0x72,
+0x79,0x00,0x01,0x61,0x00,0x03,0x76,0x61,0x6c,0x00,0x03,0x69,0x64,0x78,0x00,0x00,
+0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x03,0x00,0x03,0x00,0x04,0x00,0x00,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x05,
+0x00,0x03,0x00,0x06,0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x07,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x06,0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,
+0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x08,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x00,
+0x00,0x03,0x00,0x02,0x00,0x04,0x00,0x03,0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,
+0x00,0x00,0x00,0x09,0x00,0x02,0x00,0x0a,0x00,0x03,0x00,0x0b,0x00,0x01,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0c,0x00,0x03,0xff,0xff,0x00,0x00,0xff,0xff,
+0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x0d,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,
+0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x03,0x00,0x01,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,
+0x00,0x01,0x00,0x02,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x0e,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x0f,0x00,0x03,0x00,0x06,0x00,0x04,0x00,0x10,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x11,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x10,0x00,0x03,0x00,0x12,
+0x00,0x04,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_enumerator_gem_init(mrb_state *mrb);
+void mrb_mruby_enumerator_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_enumerator_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_load_irep(mrb, gem_mrblib_irep_mruby_enumerator);
+ if (mrb->exc) {
+ mrb_print_error(mrb);
+ exit(EXIT_FAILURE);
+ }
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_enumerator_gem_final(mrb_state *mrb) {
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-eval/eval.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,239 @@
+#include "mruby.h"
+#include "mruby/class.h"
+#include "mruby/compile.h"
+#include "mruby/irep.h"
+#include "mruby/proc.h"
+#include "mruby/opcode.h"
+
+static struct mrb_irep *
+get_closure_irep(mrb_state *mrb, int level)
+{
+ struct REnv *e = mrb->c->ci[-1].proc->env;
+ struct RProc *proc;
+
+ if (level == 0) {
+ proc = mrb->c->ci[-1].proc;
+ if (MRB_PROC_CFUNC_P(proc)) {
+ return NULL;
+ }
+ return proc->body.irep;
+ }
+
+ while (--level) {
+ e = (struct REnv*)e->c;
+ if (!e) return NULL;
+ }
+
+ if (!e) return NULL;
+ proc = mrb->c->cibase[e->cioff].proc;
+
+ if (MRB_PROC_CFUNC_P(proc)) {
+ return NULL;
+ }
+ return proc->body.irep;
+}
+
+static inline mrb_code
+search_variable(mrb_state *mrb, mrb_sym vsym, int bnest)
+{
+ mrb_irep *virep;
+ int level;
+ int pos;
+
+ for (level = 0; (virep = get_closure_irep(mrb, level)); level++) {
+ if (!virep || virep->lv == NULL) {
+ continue;
+ }
+ for (pos = 0; pos < virep->nlocals - 1; pos++) {
+ if (vsym == virep->lv[pos].name) {
+ return (MKARG_B(pos + 1) | MKARG_C(level + bnest));
+ }
+ }
+ }
+
+ return 0;
+}
+
+
+static void
+patch_irep(mrb_state *mrb, mrb_irep *irep, int bnest)
+{
+ size_t i;
+ mrb_code c;
+
+ for (i = 0; i < irep->ilen; i++) {
+ c = irep->iseq[i];
+ switch(GET_OPCODE(c)){
+ case OP_EPUSH:
+ patch_irep(mrb, irep->reps[GETARG_Bx(c)], bnest + 1);
+ break;
+
+ case OP_LAMBDA:
+ {
+ int arg_c = GETARG_c(c);
+ if (arg_c & OP_L_CAPTURE) {
+ patch_irep(mrb, irep->reps[GETARG_b(c)], bnest + 1);
+ }
+ }
+ break;
+
+ case OP_SEND:
+ if (GETARG_C(c) != 0) {
+ break;
+ }
+ {
+ mrb_code arg = search_variable(mrb, irep->syms[GETARG_B(c)], bnest);
+ if (arg != 0) {
+ /* must replace */
+ irep->iseq[i] = MKOPCODE(OP_GETUPVAR) | MKARG_A(GETARG_A(c)) | arg;
+ }
+ }
+ break;
+
+ case OP_MOVE:
+ /* src part */
+ if (GETARG_B(c) < irep->nlocals) {
+ mrb_code arg = search_variable(mrb, irep->lv[GETARG_B(c) - 1].name, bnest);
+ if (arg != 0) {
+ /* must replace */
+ irep->iseq[i] = MKOPCODE(OP_GETUPVAR) | MKARG_A(GETARG_A(c)) | arg;
+ }
+ }
+ /* dst part */
+ if (GETARG_A(c) < irep->nlocals) {
+ mrb_code arg = search_variable(mrb, irep->lv[GETARG_A(c) - 1].name, bnest);
+ if (arg != 0) {
+ /* must replace */
+ irep->iseq[i] = MKOPCODE(OP_SETUPVAR) | MKARG_A(GETARG_B(c)) | arg;
+ }
+ }
+ break;
+ }
+ }
+}
+
+static struct RProc*
+create_proc_from_string(mrb_state *mrb, char *s, int len, mrb_value binding, char *file, mrb_int line)
+{
+ mrbc_context *cxt;
+ struct mrb_parser_state *p;
+ struct RProc *proc;
+ struct REnv *e;
+
+ if (!mrb_nil_p(binding)) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "Binding of eval must be nil.");
+ }
+
+ cxt = mrbc_context_new(mrb);
+ cxt->lineno = line;
+ if (file) {
+ mrbc_filename(mrb, cxt, file);
+ }
+ cxt->capture_errors = TRUE;
+
+ p = mrb_parse_nstring(mrb, s, len, cxt);
+
+ /* only occur when memory ran out */
+ if (!p) {
+ mrb_raise(mrb, E_RUNTIME_ERROR, "Failed to create parser state.");
+ }
+
+ if (0 < p->nerr) {
+ /* parse error */
+ char buf[256];
+ int n;
+ n = snprintf(buf, sizeof(buf), "line %d: %s\n", p->error_buffer[0].lineno, p->error_buffer[0].message);
+ mrb_parser_free(p);
+ mrbc_context_free(mrb, cxt);
+ mrb_exc_raise(mrb, mrb_exc_new(mrb, E_SYNTAX_ERROR, buf, n));
+ }
+
+ proc = mrb_generate_code(mrb, p);
+ if (proc == NULL) {
+ /* codegen error */
+ mrb_parser_free(p);
+ mrbc_context_free(mrb, cxt);
+ mrb_raise(mrb, E_SCRIPT_ERROR, "codegen error");
+ }
+ if (mrb->c->ci[-1].proc->target_class) {
+ proc->target_class = mrb->c->ci[-1].proc->target_class;
+ }
+ e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, (struct RClass*)mrb->c->ci[-1].proc->env);
+ e->mid = mrb->c->ci[-1].mid;
+ e->cioff = mrb->c->ci - mrb->c->cibase - 1;
+ e->stack = mrb->c->ci->stackent;
+ mrb->c->ci->env = e;
+ proc->env = e;
+ patch_irep(mrb, proc->body.irep, 0);
+
+ mrb_parser_free(p);
+ mrbc_context_free(mrb, cxt);
+
+ return proc;
+}
+
+static mrb_value
+f_eval(mrb_state *mrb, mrb_value self)
+{
+ char *s;
+ mrb_int len;
+ mrb_value binding = mrb_nil_value();
+ char *file = NULL;
+ mrb_int line = 1;
+ mrb_value ret;
+ struct RProc *proc;
+
+ mrb_get_args(mrb, "s|ozi", &s, &len, &binding, &file, &line);
+
+ proc = create_proc_from_string(mrb, s, len, binding, file, line);
+ ret = mrb_toplevel_run(mrb, proc);
+ if (mrb->exc) {
+ mrb_exc_raise(mrb, mrb_obj_value(mrb->exc));
+ }
+
+ return ret;
+}
+
+mrb_value mrb_obj_instance_eval(mrb_state *mrb, mrb_value self);
+
+#define CI_ACC_SKIP -1
+
+static mrb_value
+f_instance_eval(mrb_state *mrb, mrb_value self)
+{
+ mrb_value b;
+ mrb_int argc; mrb_value *argv;
+
+ mrb_get_args(mrb, "*&", &argv, &argc, &b);
+
+ if (mrb_nil_p(b)) {
+ char *s;
+ mrb_int len;
+ char *file = NULL;
+ mrb_int line = 1;
+
+ mrb_get_args(mrb, "s|zi", &s, &len, &file, &line);
+ mrb->c->ci->acc = CI_ACC_SKIP;
+ if (mrb->c->ci->target_class->tt == MRB_TT_ICLASS) {
+ mrb->c->ci->target_class = mrb->c->ci->target_class->c;
+ }
+ return mrb_run(mrb, create_proc_from_string(mrb, s, len, mrb_nil_value(), file, line), self);
+ }
+ else {
+ mrb_get_args(mrb, "&", &b);
+ return mrb_obj_instance_eval(mrb, self);
+ }
+}
+
+void
+mrb_mruby_eval_gem_init(mrb_state* mrb)
+{
+ mrb_define_module_function(mrb, mrb->kernel_module, "eval", f_eval, MRB_ARGS_ARG(1, 3));
+ mrb_define_method(mrb, mrb->kernel_module, "instance_eval", f_instance_eval, MRB_ARGS_ARG(1, 2));
+}
+
+void
+mrb_mruby_eval_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-eval/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,22 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include "mruby.h"
+void mrb_mruby_eval_gem_init(mrb_state *mrb);
+void mrb_mruby_eval_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_eval_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_mruby_eval_gem_init(mrb);
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_eval_gem_final(mrb_state *mrb) {
+ mrb_mruby_eval_gem_final(mrb);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-fiber/fiber.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,381 @@
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/proc.h"
+
+#define fiber_ptr(o) ((struct RFiber*)mrb_ptr(o))
+
+#define FIBER_STACK_INIT_SIZE 64
+#define FIBER_CI_INIT_SIZE 8
+
+/*
+ * call-seq:
+ * Fiber.new{...} -> obj
+ *
+ * Creates a fiber, whose execution is suspend until it is explicitly
+ * resumed using <code>Fiber#resume</code> method.
+ * The code running inside the fiber can give up control by calling
+ * <code>Fiber.yield</code> in which case it yields control back to caller
+ * (the caller of the <code>Fiber#resume</code>).
+ *
+ * Upon yielding or termination the Fiber returns the value of the last
+ * executed expression
+ *
+ * For instance:
+ *
+ * fiber = Fiber.new do
+ * Fiber.yield 1
+ * 2
+ * end
+ *
+ * puts fiber.resume
+ * puts fiber.resume
+ * puts fiber.resume
+ *
+ * <em>produces</em>
+ *
+ * 1
+ * 2
+ * resuming dead fiber (FiberError)
+ *
+ * The <code>Fiber#resume</code> method accepts an arbitrary number of
+ * parameters, if it is the first call to <code>resume</code> then they
+ * will be passed as block arguments. Otherwise they will be the return
+ * value of the call to <code>Fiber.yield</code>
+ *
+ * Example:
+ *
+ * fiber = Fiber.new do |first|
+ * second = Fiber.yield first + 2
+ * end
+ *
+ * puts fiber.resume 10
+ * puts fiber.resume 14
+ * puts fiber.resume 18
+ *
+ * <em>produces</em>
+ *
+ * 12
+ * 14
+ * resuming dead fiber (FiberError)
+ *
+ */
+static mrb_value
+fiber_init(mrb_state *mrb, mrb_value self)
+{
+ static const struct mrb_context mrb_context_zero = { 0 };
+ struct RFiber *f = fiber_ptr(self);
+ struct mrb_context *c;
+ struct RProc *p;
+ mrb_callinfo *ci;
+ mrb_value blk;
+ size_t slen;
+
+ mrb_get_args(mrb, "&", &blk);
+
+ if (mrb_nil_p(blk)) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Fiber object without a block");
+ }
+ p = mrb_proc_ptr(blk);
+ if (MRB_PROC_CFUNC_P(p)) {
+ mrb_raise(mrb, E_FIBER_ERROR, "tried to create Fiber from C defined method");
+ }
+
+ f->cxt = (struct mrb_context*)mrb_malloc(mrb, sizeof(struct mrb_context));
+ *f->cxt = mrb_context_zero;
+ c = f->cxt;
+
+ /* initialize VM stack */
+ slen = FIBER_STACK_INIT_SIZE;
+ if (p->body.irep->nregs > slen) {
+ slen += p->body.irep->nregs;
+ }
+ c->stbase = (mrb_value *)mrb_malloc(mrb, slen*sizeof(mrb_value));
+ c->stend = c->stbase + slen;
+ c->stack = c->stbase;
+
+#ifdef MRB_NAN_BOXING
+ {
+ mrb_value *p = c->stbase;
+ mrb_value *pend = c->stend;
+
+ while (p < pend) {
+ SET_NIL_VALUE(*p);
+ p++;
+ }
+ }
+#else
+ memset(c->stbase, 0, slen * sizeof(mrb_value));
+#endif
+
+ /* copy receiver from a block */
+ c->stack[0] = mrb->c->stack[0];
+
+ /* initialize callinfo stack */
+ c->cibase = (mrb_callinfo *)mrb_calloc(mrb, FIBER_CI_INIT_SIZE, sizeof(mrb_callinfo));
+ c->ciend = c->cibase + FIBER_CI_INIT_SIZE;
+ c->ci = c->cibase;
+ c->ci->stackent = c->stack;
+
+ /* adjust return callinfo */
+ ci = c->ci;
+ ci->target_class = p->target_class;
+ ci->proc = p;
+ ci->pc = p->body.irep->iseq;
+ ci->nregs = p->body.irep->nregs;
+ ci[1] = ci[0];
+ c->ci++; /* push dummy callinfo */
+
+ c->fib = f;
+ c->status = MRB_FIBER_CREATED;
+
+ return self;
+}
+
+static struct mrb_context*
+fiber_check(mrb_state *mrb, mrb_value fib)
+{
+ struct RFiber *f = fiber_ptr(fib);
+
+ mrb_assert(f->tt == MRB_TT_FIBER);
+ if (!f->cxt) {
+ mrb_raise(mrb, E_FIBER_ERROR, "uninitialized Fiber");
+ }
+ return f->cxt;
+}
+
+static mrb_value
+fiber_result(mrb_state *mrb, const mrb_value *a, mrb_int len)
+{
+ if (len == 0) return mrb_nil_value();
+ if (len == 1) return a[0];
+ return mrb_ary_new_from_values(mrb, len, a);
+}
+
+/* mark return from context modifying method */
+#define MARK_CONTEXT_MODIFY(c) (c)->ci->target_class = NULL
+
+static mrb_value
+fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mrb_bool resume)
+{
+ struct mrb_context *c = fiber_check(mrb, self);
+ mrb_callinfo *ci;
+
+ for (ci = c->ci; ci >= c->cibase; ci--) {
+ if (ci->acc < 0) {
+ mrb_raise(mrb, E_FIBER_ERROR, "can't cross C function boundary");
+ }
+ }
+ if (resume && c->status == MRB_FIBER_TRANSFERRED) {
+ mrb_raise(mrb, E_FIBER_ERROR, "resuming transfered fiber");
+ }
+ if (c->status == MRB_FIBER_RUNNING || c->status == MRB_FIBER_RESUMING) {
+ mrb_raise(mrb, E_FIBER_ERROR, "double resume");
+ }
+ if (c->status == MRB_FIBER_TERMINATED) {
+ mrb_raise(mrb, E_FIBER_ERROR, "resuming dead fiber");
+ }
+ mrb->c->status = resume ? MRB_FIBER_RESUMING : MRB_FIBER_TRANSFERRED;
+ c->prev = resume ? mrb->c : (c->prev ? c->prev : mrb->root_c);
+ if (c->status == MRB_FIBER_CREATED) {
+ mrb_value *b = c->stack+1;
+ mrb_value *e = b + len;
+
+ while (b<e) {
+ *b++ = *a++;
+ }
+ c->cibase->argc = len;
+ if (c->prev->fib)
+ mrb_field_write_barrier(mrb, (struct RBasic*)c->fib, (struct RBasic*)c->prev->fib);
+ mrb_write_barrier(mrb, (struct RBasic*)c->fib);
+ c->status = MRB_FIBER_RUNNING;
+ mrb->c = c;
+
+ MARK_CONTEXT_MODIFY(c);
+ return c->ci->proc->env->stack[0];
+ }
+ MARK_CONTEXT_MODIFY(c);
+ if (c->prev->fib)
+ mrb_field_write_barrier(mrb, (struct RBasic*)c->fib, (struct RBasic*)c->prev->fib);
+ mrb_write_barrier(mrb, (struct RBasic*)c->fib);
+ c->status = MRB_FIBER_RUNNING;
+ mrb->c = c;
+ return fiber_result(mrb, a, len);
+}
+
+/*
+ * call-seq:
+ * fiber.resume(args, ...) -> obj
+ *
+ * Resumes the fiber from the point at which the last <code>Fiber.yield</code>
+ * was called, or starts running it if it is the first call to
+ * <code>resume</code>. Arguments passed to resume will be the value of
+ * the <code>Fiber.yield</code> expression or will be passed as block
+ * parameters to the fiber's block if this is the first <code>resume</code>.
+ *
+ * Alternatively, when resume is called it evaluates to the arguments passed
+ * to the next <code>Fiber.yield</code> statement inside the fiber's block
+ * or to the block value if it runs to completion without any
+ * <code>Fiber.yield</code>
+ */
+static mrb_value
+fiber_resume(mrb_state *mrb, mrb_value self)
+{
+ mrb_value *a;
+ mrb_int len;
+
+ mrb_get_args(mrb, "*", &a, &len);
+ return fiber_switch(mrb, self, len, a, TRUE);
+}
+
+/*
+ * call-seq:
+ * fiber.alive? -> true or false
+ *
+ * Returns true if the fiber can still be resumed. After finishing
+ * execution of the fiber block this method will always return false.
+ */
+static mrb_value
+fiber_alive_p(mrb_state *mrb, mrb_value self)
+{
+ struct mrb_context *c = fiber_check(mrb, self);
+ return mrb_bool_value(c->status != MRB_FIBER_TERMINATED);
+}
+
+static mrb_value
+fiber_eq(mrb_state *mrb, mrb_value self)
+{
+ mrb_value other;
+ mrb_get_args(mrb, "o", &other);
+
+ if (mrb_type(other) != MRB_TT_FIBER) {
+ return mrb_false_value();
+ }
+ return mrb_bool_value(fiber_ptr(self) == fiber_ptr(other));
+}
+
+/*
+ * call-seq:
+ * fiber.transfer(args, ...) -> obj
+ *
+ * Transfers control to reciever fiber of the method call.
+ * Unlike <code>resume</code> the reciever wouldn't be pushed to call
+ * stack of fibers. Instead it will switch to the call stack of
+ * transferring fiber.
+ * When resuming a fiber that was transferred to another fiber it would
+ * cause double resume error. Though when the fiber is re-transferred
+ * and <code>Fiber.yield</code> is called, the fiber would be resumable.
+ */
+static mrb_value
+fiber_transfer(mrb_state *mrb, mrb_value self)
+{
+ struct mrb_context *c = fiber_check(mrb, self);
+ mrb_value* a;
+ mrb_int len;
+
+ mrb_get_args(mrb, "*", &a, &len);
+
+ if (c == mrb->root_c) {
+ mrb->c->status = MRB_FIBER_TRANSFERRED;
+ mrb->c = c;
+ c->status = MRB_FIBER_RUNNING;
+ MARK_CONTEXT_MODIFY(c);
+ mrb_write_barrier(mrb, (struct RBasic*)c->fib);
+ return fiber_result(mrb, a, len);
+ }
+
+ if (c == mrb->c) {
+ return fiber_result(mrb, a, len);
+ }
+
+ return fiber_switch(mrb, self, len, a, FALSE);
+}
+
+MRB_API mrb_value
+mrb_fiber_yield(mrb_state *mrb, mrb_int len, const mrb_value *a)
+{
+ struct mrb_context *c = mrb->c;
+ mrb_callinfo *ci;
+
+ for (ci = c->ci; ci >= c->cibase; ci--) {
+ if (ci->acc < 0) {
+ mrb_raise(mrb, E_FIBER_ERROR, "can't cross C function boundary");
+ }
+ }
+ if (!c->prev) {
+ mrb_raise(mrb, E_FIBER_ERROR, "can't yield from root fiber");
+ }
+
+ c->prev->status = MRB_FIBER_RUNNING;
+ c->status = MRB_FIBER_SUSPENDED;
+ mrb->c = c->prev;
+ c->prev = NULL;
+ MARK_CONTEXT_MODIFY(mrb->c);
+ mrb_write_barrier(mrb, (struct RBasic*)c->fib);
+ return fiber_result(mrb, a, len);
+}
+
+/*
+ * call-seq:
+ * Fiber.yield(args, ...) -> obj
+ *
+ * Yields control back to the context that resumed the fiber, passing
+ * along any arguments that were passed to it. The fiber will resume
+ * processing at this point when <code>resume</code> is called next.
+ * Any arguments passed to the next <code>resume</code> will be the
+ * value that this <code>Fiber.yield</code> expression evaluates to.
+ */
+static mrb_value
+fiber_yield(mrb_state *mrb, mrb_value self)
+{
+ mrb_value *a;
+ mrb_int len;
+
+ mrb_get_args(mrb, "*", &a, &len);
+ return mrb_fiber_yield(mrb, len, a);
+}
+
+/*
+ * call-seq:
+ * Fiber.current() -> fiber
+ *
+ * Returns the current fiber. If you are not running in the context of
+ * a fiber this method will return the root fiber.
+ */
+static mrb_value
+fiber_current(mrb_state *mrb, mrb_value self)
+{
+ if (!mrb->c->fib) {
+ struct RFiber *f = (struct RFiber*)mrb_obj_alloc(mrb, MRB_TT_FIBER, mrb_class_ptr(self));
+
+ f->cxt = mrb->c;
+ mrb->c->fib = f;
+ }
+ return mrb_obj_value(mrb->c->fib);
+}
+
+void
+mrb_mruby_fiber_gem_init(mrb_state* mrb)
+{
+ struct RClass *c;
+
+ c = mrb_define_class(mrb, "Fiber", mrb->object_class);
+ MRB_SET_INSTANCE_TT(c, MRB_TT_FIBER);
+
+ mrb_define_method(mrb, c, "initialize", fiber_init, MRB_ARGS_NONE());
+ mrb_define_method(mrb, c, "resume", fiber_resume, MRB_ARGS_ANY());
+ mrb_define_method(mrb, c, "transfer", fiber_transfer, MRB_ARGS_ANY());
+ mrb_define_method(mrb, c, "alive?", fiber_alive_p, MRB_ARGS_NONE());
+ mrb_define_method(mrb, c, "==", fiber_eq, MRB_ARGS_REQ(1));
+
+ mrb_define_class_method(mrb, c, "yield", fiber_yield, MRB_ARGS_ANY());
+ mrb_define_class_method(mrb, c, "current", fiber_current, MRB_ARGS_NONE());
+
+ mrb_define_class(mrb, "FiberError", mrb->eStandardError_class);
+}
+
+void
+mrb_mruby_fiber_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-fiber/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,22 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include "mruby.h"
+void mrb_mruby_fiber_gem_init(mrb_state *mrb);
+void mrb_mruby_fiber_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_fiber_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_mruby_fiber_gem_init(mrb);
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_fiber_gem_final(mrb_state *mrb) {
+ mrb_mruby_fiber_gem_final(mrb);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-hash-ext/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,229 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_hash_ext[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0xa7,0xae,0x00,0x00,0x0b,0xee,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x0a,0xc6,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x35,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0x45,0x00,0x80,0x00,
+0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x48,0x61,
+0x73,0x68,0x00,0x00,0x00,0x01,0x31,0x00,0x01,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
+0x28,0x00,0x00,0x00,0x48,0x00,0x80,0x00,0x04,0x00,0x00,0x01,0x84,0x00,0x80,0x01,
+0x05,0x00,0x00,0x02,0x20,0x81,0x80,0x00,0x06,0x00,0x80,0x00,0x47,0x40,0x80,0x00,
+0xc0,0x00,0x00,0x01,0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,
+0x46,0x00,0x81,0x00,0x48,0x00,0x80,0x00,0x84,0x02,0x00,0x01,0x04,0x02,0x80,0x01,
+0x05,0x00,0x00,0x02,0x20,0x81,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,
+0x46,0x80,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,0x46,0xc0,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,0x46,0x00,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x0a,0x00,0x01,0x46,0x40,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x0c,0x00,0x01,
+0x46,0x80,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x0e,0x00,0x01,0x46,0xc0,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,0x46,0x00,0x83,0x00,0x04,0x06,0x80,0x00,
+0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x09,0x65,0x61,
+0x63,0x68,0x5f,0x70,0x61,0x69,0x72,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x0c,0x61,0x6c,0x69,0x61,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x02,
+0x5b,0x5d,0x00,0x00,0x06,0x6d,0x65,0x72,0x67,0x65,0x21,0x00,0x00,0x06,0x75,0x70,
+0x64,0x61,0x74,0x65,0x00,0x00,0x05,0x66,0x65,0x74,0x63,0x68,0x00,0x00,0x09,0x64,
+0x65,0x6c,0x65,0x74,0x65,0x5f,0x69,0x66,0x00,0x00,0x07,0x66,0x6c,0x61,0x74,0x74,
+0x65,0x6e,0x00,0x00,0x06,0x69,0x6e,0x76,0x65,0x72,0x74,0x00,0x00,0x07,0x6b,0x65,
+0x65,0x70,0x5f,0x69,0x66,0x00,0x00,0x03,0x6b,0x65,0x79,0x00,0x00,0x04,0x74,0x6f,
+0x5f,0x68,0x00,0x00,0x00,0x01,0x92,0x00,0x06,0x00,0x0a,0x00,0x03,0x00,0x00,0x00,
+0x3a,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x01,0x40,0x00,0x03,0x20,0x00,0x00,0x03,
+0x01,0x80,0x81,0x01,0x03,0x00,0xc0,0x03,0xb2,0x40,0x00,0x03,0x19,0x0f,0x40,0x03,
+0x01,0x40,0x00,0x03,0x83,0xff,0xbf,0x03,0xa0,0x80,0x00,0x03,0x01,0x80,0x01,0x02,
+0x04,0x02,0x80,0x03,0xa0,0xc0,0x00,0x03,0x99,0x05,0x40,0x03,0x91,0x02,0x00,0x03,
+0x20,0x80,0x01,0x03,0x01,0x80,0x81,0x02,0x01,0x40,0x00,0x03,0x83,0xff,0xbf,0x03,
+0xa0,0x80,0x00,0x03,0x20,0x00,0x01,0x03,0x40,0x01,0x80,0x03,0x21,0xc0,0x01,0x03,
+0x29,0x00,0x80,0x02,0x17,0x06,0x40,0x00,0x01,0x00,0x01,0x03,0x04,0x04,0x80,0x03,
+0xa0,0xc0,0x00,0x03,0x19,0x04,0x40,0x03,0x91,0x02,0x00,0x03,0x20,0x80,0x01,0x03,
+0x01,0x80,0x81,0x02,0x01,0x00,0x01,0x03,0x20,0x00,0x02,0x03,0x40,0x03,0x80,0x03,
+0x21,0xc0,0x01,0x03,0x29,0x00,0x80,0x02,0x01,0xc0,0x00,0x03,0x83,0x00,0xc0,0x03,
+0xa0,0x40,0x02,0x03,0x83,0xff,0xbf,0x03,0xb2,0x40,0x00,0x03,0x99,0x00,0x40,0x03,
+0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x03,0x91,0x05,0x80,0x03,0x3d,0x00,0x00,0x04,
+0x20,0x81,0x02,0x03,0x91,0x02,0x00,0x03,0x20,0x80,0x01,0x03,0x01,0x80,0x81,0x02,
+0x83,0xff,0x3f,0x03,0x01,0xc0,0x80,0x03,0x2f,0x41,0x83,0x03,0x83,0x00,0x40,0x04,
+0x40,0x05,0x80,0x04,0x21,0x01,0x03,0x03,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x01,
+0x00,0x00,0x20,0x6f,0x64,0x64,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,
+0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x66,0x6f,0x72,0x20,0x48,
+0x61,0x73,0x68,0x00,0x00,0x00,0x0e,0x00,0x06,0x6c,0x65,0x6e,0x67,0x74,0x68,0x00,
+0x00,0x02,0x3d,0x3d,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x0b,0x72,0x65,0x73,0x70,
+0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x68,0x61,0x73,
+0x68,0x00,0x00,0x04,0x48,0x61,0x73,0x68,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,
+0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x04,0x74,0x6f,0x5f,0x61,0x00,0x00,0x01,0x25,
+0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,
+0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x04,0x73,0x74,0x65,0x70,0x00,
+0x00,0x01,0x2d,0x00,0x00,0x00,0x00,0x3c,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x00,
+0x00,0x07,0x00,0x00,0x26,0x00,0x00,0x04,0x01,0x80,0x00,0x02,0x15,0x40,0x81,0x02,
+0x01,0x40,0x00,0x03,0x01,0x00,0x81,0x03,0x20,0x01,0x80,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,
+0x01,0xad,0x00,0x05,0x00,0x0b,0x00,0x00,0x00,0x00,0x00,0x3c,0x26,0x00,0x00,0x02,
+0x01,0x40,0x80,0x02,0x84,0x00,0x00,0x03,0xa0,0x00,0x80,0x02,0x99,0x00,0xc0,0x02,
+0x97,0x04,0x40,0x00,0x06,0x00,0x80,0x02,0x91,0x01,0x00,0x03,0x3d,0x00,0x80,0x03,
+0x01,0x40,0x00,0x04,0x20,0x00,0x01,0x04,0x3e,0x00,0x82,0x03,0xbd,0x00,0x00,0x04,
+0x3e,0x00,0x82,0x03,0x20,0x81,0x80,0x02,0x05,0x00,0x80,0x02,0x3a,0x40,0x81,0x01,
+0xba,0x40,0x01,0x02,0x01,0x40,0x80,0x02,0x20,0x40,0x81,0x02,0x83,0x00,0x40,0x03,
+0x01,0x40,0x81,0x03,0xa0,0x80,0x01,0x03,0x98,0x00,0x40,0x03,0x97,0x04,0x40,0x00,
+0x01,0x40,0x00,0x03,0x83,0xff,0xbf,0x03,0xa0,0xc0,0x01,0x03,0x01,0x80,0x81,0x01,
+0x01,0x40,0x00,0x03,0x03,0x00,0xc0,0x03,0xa0,0xc0,0x01,0x03,0x01,0x80,0x01,0x02,
+0x17,0x0a,0x40,0x00,0x03,0x00,0x40,0x03,0x01,0x40,0x81,0x03,0xa0,0x80,0x01,0x03,
+0x98,0x00,0x40,0x03,0x97,0x02,0x40,0x00,0x01,0x40,0x00,0x03,0x83,0xff,0xbf,0x03,
+0xa0,0xc0,0x01,0x03,0x01,0x80,0x81,0x01,0x17,0x05,0x40,0x00,0x06,0x00,0x00,0x03,
+0x91,0x01,0x80,0x03,0x3d,0x01,0x00,0x04,0x01,0x40,0x80,0x04,0x20,0x40,0x81,0x04,
+0x3e,0x40,0x02,0x04,0xbd,0x01,0x80,0x04,0x3e,0x40,0x02,0x04,0x20,0x81,0x00,0x03,
+0x17,0x00,0x40,0x00,0x01,0x00,0x01,0x03,0x15,0x40,0x81,0x03,0x01,0xc0,0x00,0x04,
+0x01,0x80,0x81,0x04,0x20,0x01,0x82,0x03,0x29,0x00,0x00,0x03,0x00,0x00,0x00,0x04,
+0x00,0x00,0x13,0x77,0x72,0x6f,0x6e,0x67,0x20,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,
+0x20,0x74,0x79,0x70,0x65,0x20,0x00,0x00,0x11,0x20,0x28,0x65,0x78,0x70,0x65,0x63,
+0x74,0x65,0x64,0x20,0x61,0x72,0x72,0x61,0x79,0x29,0x00,0x00,0x1c,0x69,0x6e,0x76,
+0x61,0x6c,0x69,0x64,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x65,
+0x6c,0x65,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x0a,0x20,0x66,0x6f,0x72,
+0x20,0x31,0x2e,0x2e,0x32,0x29,0x00,0x00,0x00,0x09,0x00,0x0b,0x72,0x65,0x73,0x70,
+0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x04,0x74,0x6f,0x5f,0x61,0x00,0x00,
+0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,
+0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,
+0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x03,0x3d,0x3d,0x3d,0x00,0x00,0x02,0x5b,0x5d,
+0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0x59,0x00,0x03,0x00,0x08,0x00,
+0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,
+0x01,0x40,0x00,0x02,0xad,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x15,0x40,0x01,0x02,
+0x15,0x40,0x80,0x02,0x01,0x40,0x00,0x03,0xa0,0x00,0x80,0x02,0x01,0xc0,0x00,0x03,
+0x20,0x81,0x00,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x02,0x5b,0x5d,0x00,0x00,0x01,0x2b,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,
+0x00,0x00,0xc4,0x00,0x03,0x00,0x07,0x00,0x02,0x00,0x00,0x00,0x14,0x00,0x00,0x00,
+0xa6,0x00,0x00,0x02,0x01,0x40,0x80,0x01,0x84,0x00,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x91,0x01,0x00,0x02,
+0x3d,0x00,0x80,0x02,0x20,0x81,0x80,0x01,0x19,0x02,0x40,0x01,0x01,0x40,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0x00,0x81,0x01,0x97,0x01,0x40,0x00,0x01,0x40,0x80,0x01,
+0x40,0x03,0x00,0x02,0x21,0x00,0x81,0x01,0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x01,0x00,0x00,0x20,0x63,0x61,0x6e,0x27,0x74,0x20,0x63,0x6f,0x6e,
+0x76,0x65,0x72,0x74,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x20,0x69,0x6e,
+0x74,0x6f,0x20,0x48,0x61,0x73,0x68,0x00,0x00,0x00,0x05,0x00,0x0b,0x72,0x65,0x73,
+0x70,0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x68,0x61,
+0x73,0x68,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,
+0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x08,0x65,0x61,0x63,0x68,0x5f,0x6b,0x65,
+0x79,0x00,0x00,0x00,0x00,0x93,0x00,0x03,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x17,
+0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x19,0x05,0xc0,0x01,0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,0x06,0x00,0x80,0x02,
+0x01,0x40,0x00,0x03,0xa0,0x80,0x80,0x02,0x15,0x40,0x00,0x03,0x01,0x40,0x80,0x03,
+0xa0,0x80,0x00,0x03,0xa0,0x41,0x80,0x01,0x97,0x01,0x40,0x00,0x15,0x40,0x80,0x01,
+0x01,0x40,0x00,0x02,0xa0,0x80,0x80,0x01,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,
+0x01,0xc0,0x00,0x03,0x20,0xc1,0x00,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x08,0x68,0x61,0x73,0x5f,0x6b,0x65,0x79,0x3f,0x00,0x00,
+0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x5b,0x5d,0x3d,
+0x00,0x00,0x00,0x00,0x49,0x00,0x03,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x09,0x00,
+0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0x01,0xc0,0x00,0x03,0x20,0x41,0x00,0x02,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x5b,0x5d,
+0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0xd9,0x00,0x04,0x00,0x08,0x00,
+0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0xa6,0x00,0x10,0x02,0x97,0x00,0x40,0x00,
+0x97,0x00,0x40,0x00,0x11,0x00,0x00,0x01,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,
+0xa0,0x40,0x00,0x02,0x19,0x02,0x40,0x02,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,
+0xa0,0x80,0x00,0x02,0x17,0x08,0x40,0x00,0x99,0x01,0xc0,0x01,0x01,0xc0,0x00,0x02,
+0x20,0xc0,0x00,0x02,0x17,0x06,0x40,0x00,0x01,0x80,0x00,0x02,0x11,0x00,0x80,0x02,
+0xa0,0x00,0x01,0x02,0x19,0x01,0x40,0x02,0x01,0x80,0x00,0x02,0x17,0x03,0x40,0x00,
+0x06,0x00,0x00,0x02,0x11,0x03,0x80,0x02,0x3d,0x00,0x00,0x03,0x01,0x40,0x80,0x03,
+0x3e,0xc0,0x01,0x03,0x20,0x41,0x01,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x02,
+0x00,0x00,0x0f,0x4b,0x65,0x79,0x20,0x6e,0x6f,0x74,0x20,0x66,0x6f,0x75,0x6e,0x64,
+0x3a,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x04,0x4e,0x4f,0x4e,0x45,0x00,
+0x00,0x04,0x6b,0x65,0x79,0x3f,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,
+0x00,0x0c,0x52,0x75,0x6e,0x74,0x69,0x6d,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,
+0x00,0x00,0x7e,0x00,0x02,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x99,0x00,0x40,0x01,
+0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x01,0x04,0x01,0x80,0x01,0xa0,0x40,0x00,0x01,
+0x29,0x00,0x00,0x01,0x06,0x00,0x00,0x01,0x40,0x01,0x80,0x01,0x21,0xc0,0x00,0x01,
+0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x09,0x64,0x65,0x6c,0x65,0x74,
+0x65,0x5f,0x69,0x66,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x5a,
+0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x26,0x00,0x00,0x04,
+0x15,0x40,0x00,0x02,0x01,0x40,0x80,0x02,0x01,0x80,0x00,0x03,0x20,0x01,0x00,0x02,
+0x19,0x02,0x40,0x02,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,
+0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x06,0x64,0x65,0x6c,
+0x65,0x74,0x65,0x00,0x00,0x00,0x00,0x4f,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,
+0x00,0x09,0x00,0x00,0x26,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,
+0x03,0x00,0xc0,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x04,0x74,0x6f,0x5f,0x61,0x00,0x00,0x07,0x66,0x6c,0x61,0x74,0x74,0x65,0x6e,
+0x00,0x00,0x00,0x00,0x4e,0x00,0x03,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x08,0x00,
+0x26,0x00,0x00,0x00,0x11,0x00,0x80,0x01,0x20,0x40,0x80,0x01,0x01,0xc0,0x00,0x01,
+0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0x80,0x80,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x48,0x61,0x73,0x68,0x00,0x00,
+0x03,0x6e,0x65,0x77,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x3c,
+0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x26,0x00,0x00,0x04,
+0x01,0x40,0x00,0x02,0x15,0x80,0x80,0x02,0x01,0x80,0x00,0x03,0x01,0x00,0x81,0x03,
+0x20,0x01,0x80,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0x80,0x00,0x03,0x00,0x06,0x00,0x01,
+0x00,0x00,0x00,0x0f,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,
+0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,
+0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x37,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x07,0x6b,0x65,0x65,0x70,0x5f,0x69,0x66,0x00,0x00,0x04,0x65,0x61,0x63,
+0x68,0x00,0x00,0x00,0x00,0x5e,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0d,
+0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,0x01,0x40,0x80,0x02,0x01,0x80,0x00,0x03,
+0x37,0x41,0x81,0x02,0xa0,0x00,0x00,0x02,0x19,0x01,0x40,0x02,0x05,0x00,0x00,0x02,
+0x97,0x01,0x40,0x00,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x06,0x64,0x65,0x6c,0x65,0x74,0x65,0x00,0x00,0x00,0x00,0x39,
+0x00,0x03,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x26,0x00,0x00,0x02,
+0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,0x05,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0x47,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,
+0x0a,0x00,0x00,0x00,0x26,0x00,0x00,0x04,0x01,0x80,0x00,0x02,0x15,0x40,0x80,0x02,
+0xb2,0x00,0x00,0x02,0x99,0x01,0x40,0x02,0x01,0x40,0x00,0x02,0x29,0x80,0x00,0x02,
+0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x02,0x3d,0x3d,0x00,0x00,0x00,0x00,0x26,0x00,0x02,0x00,
+0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x56,0x41,0x52,
+0x00,0x00,0x01,0x0a,0x00,0x00,0x00,0x0e,0x00,0x06,0x6f,0x62,0x6a,0x65,0x63,0x74,
+0x00,0x06,0x6c,0x65,0x6e,0x67,0x74,0x68,0x00,0x01,0x6f,0x00,0x01,0x68,0x00,0x01,
+0x6b,0x00,0x01,0x76,0x00,0x01,0x69,0x00,0x05,0x6f,0x74,0x68,0x65,0x72,0x00,0x05,
+0x62,0x6c,0x6f,0x63,0x6b,0x00,0x03,0x6b,0x65,0x79,0x00,0x04,0x6e,0x6f,0x6e,0x65,
+0x00,0x05,0x6c,0x65,0x76,0x65,0x6c,0x00,0x04,0x6b,0x65,0x79,0x73,0x00,0x03,0x76,
+0x61,0x6c,0x00,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x02,
+0x00,0x04,0x00,0x03,0x00,0x05,0x00,0x04,0x00,0x01,0x00,0x05,0x00,0x02,0xff,0xff,
+0x00,0x00,0x00,0x06,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x03,0x00,0x05,
+0x00,0x04,0x00,0x06,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x07,0x00,0x01,0x00,0x08,
+0x00,0x02,0x00,0x04,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x09,0x00,0x01,0x00,0x0a,0x00,0x02,0x00,0x08,0x00,0x03,0x00,0x08,
+0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x05,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x0b,
+0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x04,
+0x00,0x01,0x00,0x05,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x08,0x00,0x01,0x00,0x0c,
+0x00,0x02,0x00,0x04,0x00,0x01,0x00,0x05,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x0d,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x01,0x00,0x05,0x00,0x02,0xff,0xff,
+0x00,0x00,0xff,0xff,0x00,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_hash_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_hash_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_hash_ext_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_mruby_hash_ext_gem_init(mrb);
+ mrb_load_irep(mrb, gem_mrblib_irep_mruby_hash_ext);
+ if (mrb->exc) {
+ mrb_print_error(mrb);
+ exit(EXIT_FAILURE);
+ }
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_hash_ext_gem_final(mrb_state *mrb) {
+ mrb_mruby_hash_ext_gem_final(mrb);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-hash-ext/hash-ext.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,52 @@
+/*
+** hash.c - Hash class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/hash.h"
+
+/*
+ * call-seq:
+ * hsh.values_at(key, ...) -> array
+ *
+ * Return an array containing the values associated with the given keys.
+ * Also see <code>Hash.select</code>.
+ *
+ * h = { "cat" => "feline", "dog" => "canine", "cow" => "bovine" }
+ * h.values_at("cow", "cat") #=> ["bovine", "feline"]
+ */
+
+static mrb_value
+hash_values_at(mrb_state *mrb, mrb_value hash)
+{
+ mrb_value *argv, result;
+ mrb_int argc, i;
+ int ai;
+
+ mrb_get_args(mrb, "*", &argv, &argc);
+ result = mrb_ary_new_capa(mrb, argc);
+ ai = mrb_gc_arena_save(mrb);
+ for (i = 0; i < argc; i++) {
+ mrb_ary_push(mrb, result, mrb_hash_get(mrb, hash, argv[i]));
+ mrb_gc_arena_restore(mrb, ai);
+ }
+ return result;
+}
+
+void
+mrb_mruby_hash_ext_gem_init(mrb_state *mrb)
+{
+ struct RClass *h;
+
+ h = mrb->hash_class;
+ mrb_define_method(mrb, h, "values_at", hash_values_at, MRB_ARGS_ANY());
+}
+
+void
+mrb_mruby_hash_ext_gem_final(mrb_state *mrb)
+{
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-kernel-ext/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,22 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include "mruby.h"
+void mrb_mruby_kernel_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_kernel_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_kernel_ext_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_mruby_kernel_ext_gem_init(mrb);
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_kernel_ext_gem_final(mrb_state *mrb) {
+ mrb_mruby_kernel_ext_gem_final(mrb);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-kernel-ext/kernel.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,184 @@
+#include "mruby.h"
+#include "mruby/error.h"
+#include "mruby/array.h"
+#include "mruby/hash.h"
+
+/*
+ * call-seq:
+ * __method__ -> symbol
+ *
+ * Returns the name at the definition of the current method as a
+ * Symbol.
+ * If called outside of a method, it returns <code>nil</code>.
+ *
+ */
+static mrb_value
+mrb_f_method(mrb_state *mrb, mrb_value self)
+{
+ mrb_callinfo *ci = mrb->c->ci;
+ ci--;
+ if (ci->mid)
+ return mrb_symbol_value(ci->mid);
+ else
+ return mrb_nil_value();
+}
+
+/*
+ * call-seq:
+ * Integer(arg,base=0) -> integer
+ *
+ * Converts <i>arg</i> to a <code>Fixnum</code>.
+ * Numeric types are converted directly (with floating point numbers
+ * being truncated). <i>base</i> (0, or between 2 and 36) is a base for
+ * integer string representation. If <i>arg</i> is a <code>String</code>,
+ * when <i>base</i> is omitted or equals to zero, radix indicators
+ * (<code>0</code>, <code>0b</code>, and <code>0x</code>) are honored.
+ * In any case, strings should be strictly conformed to numeric
+ * representation. This behavior is different from that of
+ * <code>String#to_i</code>. Non string values will be converted using
+ * <code>to_int</code>, and <code>to_i</code>. Passing <code>nil</code>
+ * raises a TypeError.
+ *
+ * Integer(123.999) #=> 123
+ * Integer("0x1a") #=> 26
+ * Integer(Time.new) #=> 1204973019
+ * Integer("0930", 10) #=> 930
+ * Integer("111", 2) #=> 7
+ * Integer(nil) #=> TypeError
+ */
+static mrb_value
+mrb_f_integer(mrb_state *mrb, mrb_value self)
+{
+ mrb_value arg;
+ mrb_int base = 0;
+
+ mrb_get_args(mrb, "o|i", &arg, &base);
+ return mrb_convert_to_integer(mrb, arg, base);
+}
+
+/*
+ * call-seq:
+ * Float(arg) -> float
+ *
+ * Returns <i>arg</i> converted to a float. Numeric types are converted
+ * directly, the rest are converted using <i>arg</i>.to_f.
+ *
+ * Float(1) #=> 1.0
+ * Float(123.456) #=> 123.456
+ * Float("123.456") #=> 123.456
+ * Float(nil) #=> TypeError
+ */
+static mrb_value
+mrb_f_float(mrb_state *mrb, mrb_value self)
+{
+ mrb_value arg;
+
+ mrb_get_args(mrb, "o", &arg);
+ return mrb_Float(mrb, arg);
+}
+
+/*
+ * call-seq:
+ * String(arg) -> string
+ *
+ * Returns <i>arg</i> as an <code>String</code>.
+ *
+ * First tries to call its <code>to_str</code> method, then its to_s method.
+ *
+ * String(self) #=> "main"
+ * String(self.class) #=> "Object"
+ * String(123456) #=> "123456"
+ */
+static mrb_value
+mrb_f_string(mrb_state *mrb, mrb_value self)
+{
+ mrb_value arg, tmp;
+
+ mrb_get_args(mrb, "o", &arg);
+ tmp = mrb_check_convert_type(mrb, arg, MRB_TT_STRING, "String", "to_str");
+ if (mrb_nil_p(tmp)) {
+ tmp = mrb_check_convert_type(mrb, arg, MRB_TT_STRING, "String", "to_s");
+ }
+ return tmp;
+}
+
+/*
+ * call-seq:
+ * Array(arg) -> array
+ *
+ * Returns +arg+ as an Array.
+ *
+ * First tries to call Array#to_ary on +arg+, then Array#to_a.
+ *
+ * Array(1..5) #=> [1, 2, 3, 4, 5]
+ *
+ */
+static mrb_value
+mrb_f_array(mrb_state *mrb, mrb_value self)
+{
+ mrb_value arg, tmp;
+
+ mrb_get_args(mrb, "o", &arg);
+ tmp = mrb_check_convert_type(mrb, arg, MRB_TT_ARRAY, "Array", "to_ary");
+ if (mrb_nil_p(tmp)) {
+ tmp = mrb_check_convert_type(mrb, arg, MRB_TT_ARRAY, "Array", "to_a");
+ }
+ if (mrb_nil_p(tmp)) {
+ return mrb_ary_new_from_values(mrb, 1, &arg);
+ }
+
+ return tmp;
+}
+
+/*
+ * call-seq:
+ * Hash(arg) -> hash
+ *
+ * Converts <i>arg</i> to a <code>Hash</code> by calling
+ * <i>arg</i><code>.to_hash</code>. Returns an empty <code>Hash</code> when
+ * <i>arg</i> is <tt>nil</tt> or <tt>[]</tt>.
+ *
+ * Hash([]) #=> {}
+ * Hash(nil) #=> {}
+ * Hash(key: :value) #=> {:key => :value}
+ * Hash([1, 2, 3]) #=> TypeError
+ */
+static mrb_value
+mrb_f_hash(mrb_state *mrb, mrb_value self)
+{
+ mrb_value arg, tmp;
+
+ mrb_get_args(mrb, "o", &arg);
+ if (mrb_nil_p(arg)) {
+ return mrb_hash_new(mrb);
+ }
+ tmp = mrb_check_convert_type(mrb, arg, MRB_TT_HASH, "Hash", "to_hash");
+ if (mrb_nil_p(tmp)) {
+ if (mrb_array_p(arg) && RARRAY_LEN(arg) == 0) {
+ return mrb_hash_new(mrb);
+ }
+ mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S into Hash",
+ mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, arg)));
+ }
+ return tmp;
+}
+
+void
+mrb_mruby_kernel_ext_gem_init(mrb_state *mrb)
+{
+ struct RClass *krn = mrb->kernel_module;
+
+ mrb_define_module_function(mrb, krn, "fail", mrb_f_raise, MRB_ARGS_OPT(2));
+ mrb_define_method(mrb, krn, "__method__", mrb_f_method, MRB_ARGS_NONE());
+ mrb_define_module_function(mrb, krn, "Integer", mrb_f_integer, MRB_ARGS_ANY());
+ mrb_define_module_function(mrb, krn, "Float", mrb_f_float, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, krn, "String", mrb_f_string, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, krn, "Array", mrb_f_array, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, krn, "Hash", mrb_f_hash, MRB_ARGS_REQ(1));
+}
+
+void
+mrb_mruby_kernel_ext_gem_final(mrb_state *mrb)
+{
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-math/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,22 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include "mruby.h"
+void mrb_mruby_math_gem_init(mrb_state *mrb);
+void mrb_mruby_math_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_math_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_mruby_math_gem_init(mrb);
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_math_gem_final(mrb_state *mrb) {
+ mrb_mruby_math_gem_final(mrb);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-math/math.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,783 @@
+/*
+** math.c - Math module
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/array.h"
+
+#include <math.h>
+
+static void
+domain_error(mrb_state *mrb, const char *func)
+{
+ struct RClass *math = mrb_module_get(mrb, "Math");
+ struct RClass *domainerror = mrb_class_get_under(mrb, math, "DomainError");
+ mrb_value str = mrb_str_new_cstr(mrb, func);
+ mrb_raisef(mrb, domainerror, "Numerical argument is out of domain - %S", str);
+}
+
+/* math functions not provided by Microsoft Visual C++ 2012 or older */
+#if defined _MSC_VER && _MSC_VER < 1800
+
+#include <float.h>
+
+#define MATH_TOLERANCE 1E-12
+
+double
+asinh(double x)
+{
+ double xa, ya, y;
+
+ /* Basic formula loses precision for x < 0, but asinh is an odd function */
+ xa = fabs(x);
+ if (xa > 3.16227E+18) {
+ /* Prevent x*x from overflowing; basic formula reduces to log(2*x) */
+ ya = log(xa) + 0.69314718055994530942;
+ }
+ else {
+ /* Basic formula for asinh */
+ ya = log(xa + sqrt(xa*xa + 1.0));
+ }
+
+ y = _copysign(ya, x);
+ return y;
+}
+
+double
+acosh(double x)
+{
+ double y;
+
+ if (x > 3.16227E+18) {
+ /* Prevent x*x from overflowing; basic formula reduces to log(2*x) */
+ y = log(x) + 0.69314718055994530942;
+ }
+ else {
+ /* Basic formula for acosh */
+ y = log(x + sqrt(x*x - 1.0));
+ }
+
+ return y;
+}
+
+double
+atanh(double x)
+{
+ double y;
+
+ if (fabs(x) < 1E-2) {
+ /* The sums 1+x and 1-x lose precision for small x. Use the polynomial
+ instead. */
+ double x2 = x * x;
+ y = x*(1.0 + x2*(1.0/3.0 + x2*(1.0/5.0 + x2*(1.0/7.0))));
+ }
+ else {
+ /* Basic formula for atanh */
+ y = 0.5 * (log(1.0+x) - log(1.0-x));
+ }
+
+ return y;
+}
+
+double
+cbrt(double x)
+{
+ double xa, ya, y;
+
+ /* pow(x, y) is undefined for x < 0 and y not an integer, but cbrt is an
+ odd function */
+ xa = fabs(x);
+ ya = pow(xa, 1.0/3.0);
+ y = _copysign(ya, x);
+ return y;
+}
+
+/* Declaration of complementary Error function */
+double
+erfc(double x);
+
+/*
+** Implementations of error functions
+** credits to http://www.digitalmars.com/archives/cplusplus/3634.html
+*/
+
+/* Implementation of Error function */
+double
+erf(double x)
+{
+ static const double two_sqrtpi = 1.128379167095512574;
+ double sum = x;
+ double term = x;
+ double xsqr = x*x;
+ int j= 1;
+ if (fabs(x) > 2.2) {
+ return 1.0 - erfc(x);
+ }
+ do {
+ term *= xsqr/j;
+ sum -= term/(2*j+1);
+ ++j;
+ term *= xsqr/j;
+ sum += term/(2*j+1);
+ ++j;
+ } while (fabs(term/sum) > MATH_TOLERANCE);
+ return two_sqrtpi*sum;
+}
+
+/* Implementation of complementary Error function */
+double
+erfc(double x)
+{
+ static const double one_sqrtpi= 0.564189583547756287;
+ double a = 1;
+ double b = x;
+ double c = x;
+ double d = x*x+0.5;
+ double q1;
+ double q2 = b/d;
+ double n = 1.0;
+ double t;
+ if (fabs(x) < 2.2) {
+ return 1.0 - erf(x);
+ }
+ if (x < 0.0) { /*signbit(x)*/
+ return 2.0 - erfc(-x);
+ }
+ do {
+ t = a*n+b*x;
+ a = b;
+ b = t;
+ t = c*n+d*x;
+ c = d;
+ d = t;
+ n += 0.5;
+ q1 = q2;
+ q2 = b/d;
+ } while (fabs(q1-q2)/q2 > MATH_TOLERANCE);
+ return one_sqrtpi*exp(-x*x)*q2;
+}
+
+#endif
+
+#if (defined _MSC_VER && _MSC_VER < 1800) || defined __ANDROID__ || (defined __FreeBSD__ && __FreeBSD_version < 803000)
+
+double
+log2(double x)
+{
+ return log10(x)/log10(2.0);
+}
+
+#endif
+
+/*
+ TRIGONOMETRIC FUNCTIONS
+*/
+
+/*
+ * call-seq:
+ * Math.sin(x) -> float
+ *
+ * Computes the sine of <i>x</i> (expressed in radians). Returns
+ * -1..1.
+ */
+static mrb_value
+math_sin(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+
+ mrb_get_args(mrb, "f", &x);
+ x = sin(x);
+
+ return mrb_float_value(mrb, x);
+}
+
+/*
+ * call-seq:
+ * Math.cos(x) -> float
+ *
+ * Computes the cosine of <i>x</i> (expressed in radians). Returns
+ * -1..1.
+ */
+static mrb_value
+math_cos(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+
+ mrb_get_args(mrb, "f", &x);
+ x = cos(x);
+
+ return mrb_float_value(mrb, x);
+}
+
+/*
+ * call-seq:
+ * Math.tan(x) -> float
+ *
+ * Returns the tangent of <i>x</i> (expressed in radians).
+ */
+static mrb_value
+math_tan(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+
+ mrb_get_args(mrb, "f", &x);
+ x = tan(x);
+
+ return mrb_float_value(mrb, x);
+}
+
+/*
+ INVERSE TRIGONOMETRIC FUNCTIONS
+*/
+
+/*
+ * call-seq:
+ * Math.asin(x) -> float
+ *
+ * Computes the arc sine of <i>x</i>. Returns -{PI/2} .. {PI/2}.
+ */
+static mrb_value
+math_asin(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+
+ mrb_get_args(mrb, "f", &x);
+ if (x < -1.0 || x > 1.0) {
+ domain_error(mrb, "asin");
+ }
+ x = asin(x);
+
+ return mrb_float_value(mrb, x);
+}
+
+/*
+ * call-seq:
+ * Math.acos(x) -> float
+ *
+ * Computes the arc cosine of <i>x</i>. Returns 0..PI.
+ */
+static mrb_value
+math_acos(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+
+ mrb_get_args(mrb, "f", &x);
+ if (x < -1.0 || x > 1.0) {
+ domain_error(mrb, "acos");
+ }
+ x = acos(x);
+
+ return mrb_float_value(mrb, x);
+}
+
+/*
+ * call-seq:
+ * Math.atan(x) -> float
+ *
+ * Computes the arc tangent of <i>x</i>. Returns -{PI/2} .. {PI/2}.
+ */
+static mrb_value
+math_atan(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+
+ mrb_get_args(mrb, "f", &x);
+ x = atan(x);
+
+ return mrb_float_value(mrb, x);
+}
+
+/*
+ * call-seq:
+ * Math.atan2(y, x) -> float
+ *
+ * Computes the arc tangent given <i>y</i> and <i>x</i>. Returns
+ * -PI..PI.
+ *
+ * Math.atan2(-0.0, -1.0) #=> -3.141592653589793
+ * Math.atan2(-1.0, -1.0) #=> -2.356194490192345
+ * Math.atan2(-1.0, 0.0) #=> -1.5707963267948966
+ * Math.atan2(-1.0, 1.0) #=> -0.7853981633974483
+ * Math.atan2(-0.0, 1.0) #=> -0.0
+ * Math.atan2(0.0, 1.0) #=> 0.0
+ * Math.atan2(1.0, 1.0) #=> 0.7853981633974483
+ * Math.atan2(1.0, 0.0) #=> 1.5707963267948966
+ * Math.atan2(1.0, -1.0) #=> 2.356194490192345
+ * Math.atan2(0.0, -1.0) #=> 3.141592653589793
+ *
+ */
+static mrb_value
+math_atan2(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x, y;
+
+ mrb_get_args(mrb, "ff", &x, &y);
+ x = atan2(x, y);
+
+ return mrb_float_value(mrb, x);
+}
+
+
+
+/*
+ HYPERBOLIC TRIG FUNCTIONS
+*/
+/*
+ * call-seq:
+ * Math.sinh(x) -> float
+ *
+ * Computes the hyperbolic sine of <i>x</i> (expressed in
+ * radians).
+ */
+static mrb_value
+math_sinh(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+
+ mrb_get_args(mrb, "f", &x);
+ x = sinh(x);
+
+ return mrb_float_value(mrb, x);
+}
+
+/*
+ * call-seq:
+ * Math.cosh(x) -> float
+ *
+ * Computes the hyperbolic cosine of <i>x</i> (expressed in radians).
+ */
+static mrb_value
+math_cosh(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+
+ mrb_get_args(mrb, "f", &x);
+ x = cosh(x);
+
+ return mrb_float_value(mrb, x);
+}
+
+/*
+ * call-seq:
+ * Math.tanh() -> float
+ *
+ * Computes the hyperbolic tangent of <i>x</i> (expressed in
+ * radians).
+ */
+static mrb_value
+math_tanh(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+
+ mrb_get_args(mrb, "f", &x);
+ x = tanh(x);
+
+ return mrb_float_value(mrb, x);
+}
+
+
+/*
+ INVERSE HYPERBOLIC TRIG FUNCTIONS
+*/
+
+/*
+ * call-seq:
+ * Math.asinh(x) -> float
+ *
+ * Computes the inverse hyperbolic sine of <i>x</i>.
+ */
+static mrb_value
+math_asinh(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+
+ mrb_get_args(mrb, "f", &x);
+
+ x = asinh(x);
+
+ return mrb_float_value(mrb, x);
+}
+
+/*
+ * call-seq:
+ * Math.acosh(x) -> float
+ *
+ * Computes the inverse hyperbolic cosine of <i>x</i>.
+ */
+static mrb_value
+math_acosh(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+
+ mrb_get_args(mrb, "f", &x);
+ if (x < 1.0) {
+ domain_error(mrb, "acosh");
+ }
+ x = acosh(x);
+
+ return mrb_float_value(mrb, x);
+}
+
+/*
+ * call-seq:
+ * Math.atanh(x) -> float
+ *
+ * Computes the inverse hyperbolic tangent of <i>x</i>.
+ */
+static mrb_value
+math_atanh(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+
+ mrb_get_args(mrb, "f", &x);
+ if (x < -1.0 || x > 1.0) {
+ domain_error(mrb, "atanh");
+ }
+ x = atanh(x);
+
+ return mrb_float_value(mrb, x);
+}
+
+/*
+ EXPONENTIALS AND LOGARITHMS
+*/
+
+/*
+ * call-seq:
+ * Math.exp(x) -> float
+ *
+ * Returns e**x.
+ *
+ * Math.exp(0) #=> 1.0
+ * Math.exp(1) #=> 2.718281828459045
+ * Math.exp(1.5) #=> 4.4816890703380645
+ *
+ */
+static mrb_value
+math_exp(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+
+ mrb_get_args(mrb, "f", &x);
+ x = exp(x);
+
+ return mrb_float_value(mrb, x);
+}
+
+/*
+ * call-seq:
+ * Math.log(numeric) -> float
+ * Math.log(num,base) -> float
+ *
+ * Returns the natural logarithm of <i>numeric</i>.
+ * If additional second argument is given, it will be the base
+ * of logarithm.
+ *
+ * Math.log(1) #=> 0.0
+ * Math.log(Math::E) #=> 1.0
+ * Math.log(Math::E**3) #=> 3.0
+ * Math.log(12,3) #=> 2.2618595071429146
+ *
+ */
+static mrb_value
+math_log(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x, base;
+ int argc;
+
+ argc = mrb_get_args(mrb, "f|f", &x, &base);
+ if (x < 0.0) {
+ domain_error(mrb, "log");
+ }
+ x = log(x);
+ if (argc == 2) {
+ if (base < 0.0) {
+ domain_error(mrb, "log");
+ }
+ x /= log(base);
+ }
+ return mrb_float_value(mrb, x);
+}
+
+/*
+ * call-seq:
+ * Math.log2(numeric) -> float
+ *
+ * Returns the base 2 logarithm of <i>numeric</i>.
+ *
+ * Math.log2(1) #=> 0.0
+ * Math.log2(2) #=> 1.0
+ * Math.log2(32768) #=> 15.0
+ * Math.log2(65536) #=> 16.0
+ *
+ */
+static mrb_value
+math_log2(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+
+ mrb_get_args(mrb, "f", &x);
+ if (x < 0.0) {
+ domain_error(mrb, "log2");
+ }
+ x = log2(x);
+
+ return mrb_float_value(mrb, x);
+}
+
+/*
+ * call-seq:
+ * Math.log10(numeric) -> float
+ *
+ * Returns the base 10 logarithm of <i>numeric</i>.
+ *
+ * Math.log10(1) #=> 0.0
+ * Math.log10(10) #=> 1.0
+ * Math.log10(10**100) #=> 100.0
+ *
+ */
+static mrb_value
+math_log10(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+
+ mrb_get_args(mrb, "f", &x);
+ if (x < 0.0) {
+ domain_error(mrb, "log10");
+ }
+ x = log10(x);
+
+ return mrb_float_value(mrb, x);
+}
+
+/*
+ * call-seq:
+ * Math.sqrt(numeric) -> float
+ *
+ * Returns the square root of <i>numeric</i>.
+ *
+ */
+static mrb_value
+math_sqrt(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+
+ mrb_get_args(mrb, "f", &x);
+ if (x < 0.0) {
+ domain_error(mrb, "sqrt");
+ }
+ x = sqrt(x);
+
+ return mrb_float_value(mrb, x);
+}
+
+
+/*
+ * call-seq:
+ * Math.cbrt(numeric) -> float
+ *
+ * Returns the cube root of <i>numeric</i>.
+ *
+ * -9.upto(9) {|x|
+ * p [x, Math.cbrt(x), Math.cbrt(x)**3]
+ * }
+ * #=>
+ * [-9, -2.0800838230519, -9.0]
+ * [-8, -2.0, -8.0]
+ * [-7, -1.91293118277239, -7.0]
+ * [-6, -1.81712059283214, -6.0]
+ * [-5, -1.7099759466767, -5.0]
+ * [-4, -1.5874010519682, -4.0]
+ * [-3, -1.44224957030741, -3.0]
+ * [-2, -1.25992104989487, -2.0]
+ * [-1, -1.0, -1.0]
+ * [0, 0.0, 0.0]
+ * [1, 1.0, 1.0]
+ * [2, 1.25992104989487, 2.0]
+ * [3, 1.44224957030741, 3.0]
+ * [4, 1.5874010519682, 4.0]
+ * [5, 1.7099759466767, 5.0]
+ * [6, 1.81712059283214, 6.0]
+ * [7, 1.91293118277239, 7.0]
+ * [8, 2.0, 8.0]
+ * [9, 2.0800838230519, 9.0]
+ *
+ */
+static mrb_value
+math_cbrt(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+
+ mrb_get_args(mrb, "f", &x);
+ x = cbrt(x);
+
+ return mrb_float_value(mrb, x);
+}
+
+
+/*
+ * call-seq:
+ * Math.frexp(numeric) -> [ fraction, exponent ]
+ *
+ * Returns a two-element array containing the normalized fraction (a
+ * <code>Float</code>) and exponent (a <code>Fixnum</code>) of
+ * <i>numeric</i>.
+ *
+ * fraction, exponent = Math.frexp(1234) #=> [0.6025390625, 11]
+ * fraction * 2**exponent #=> 1234.0
+ */
+static mrb_value
+math_frexp(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+ int exp;
+
+ mrb_get_args(mrb, "f", &x);
+ x = frexp(x, &exp);
+
+ return mrb_assoc_new(mrb, mrb_float_value(mrb, x), mrb_fixnum_value(exp));
+}
+
+/*
+ * call-seq:
+ * Math.ldexp(flt, int) -> float
+ *
+ * Returns the value of <i>flt</i>*(2**<i>int</i>).
+ *
+ * fraction, exponent = Math.frexp(1234)
+ * Math.ldexp(fraction, exponent) #=> 1234.0
+ */
+static mrb_value
+math_ldexp(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+ mrb_int i;
+
+ mrb_get_args(mrb, "fi", &x, &i);
+ x = ldexp(x, i);
+
+ return mrb_float_value(mrb, x);
+}
+
+/*
+ * call-seq:
+ * Math.hypot(x, y) -> float
+ *
+ * Returns sqrt(x**2 + y**2), the hypotenuse of a right-angled triangle
+ * with sides <i>x</i> and <i>y</i>.
+ *
+ * Math.hypot(3, 4) #=> 5.0
+ */
+static mrb_value
+math_hypot(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x, y;
+
+ mrb_get_args(mrb, "ff", &x, &y);
+ x = hypot(x, y);
+
+ return mrb_float_value(mrb, x);
+}
+
+/*
+ * call-seq:
+ * Math.erf(x) -> float
+ *
+ * Calculates the error function of x.
+ */
+static mrb_value
+math_erf(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+
+ mrb_get_args(mrb, "f", &x);
+ x = erf(x);
+
+ return mrb_float_value(mrb, x);
+}
+
+
+/*
+ * call-seq:
+ * Math.erfc(x) -> float
+ *
+ * Calculates the complementary error function of x.
+ */
+static mrb_value
+math_erfc(mrb_state *mrb, mrb_value obj)
+{
+ mrb_float x;
+
+ mrb_get_args(mrb, "f", &x);
+ x = erfc(x);
+
+ return mrb_float_value(mrb, x);
+}
+
+/* ------------------------------------------------------------------------*/
+void
+mrb_mruby_math_gem_init(mrb_state* mrb)
+{
+ struct RClass *mrb_math;
+ mrb_math = mrb_define_module(mrb, "Math");
+
+ mrb_define_class_under(mrb, mrb_math, "DomainError", mrb->eStandardError_class);
+
+#ifdef M_PI
+ mrb_define_const(mrb, mrb_math, "PI", mrb_float_value(mrb, M_PI));
+#else
+ mrb_define_const(mrb, mrb_math, "PI", mrb_float_value(mrb, atan(1.0)*4.0));
+#endif
+
+#ifdef M_E
+ mrb_define_const(mrb, mrb_math, "E", mrb_float_value(mrb, M_E));
+#else
+ mrb_define_const(mrb, mrb_math, "E", mrb_float_value(mrb, exp(1.0)));
+#endif
+
+#ifdef MRB_USE_FLOAT
+ mrb_define_const(mrb, mrb_math, "TOLERANCE", mrb_float_value(mrb, 1e-5));
+#else
+ mrb_define_const(mrb, mrb_math, "TOLERANCE", mrb_float_value(mrb, 1e-12));
+#endif
+
+ mrb_define_module_function(mrb, mrb_math, "sin", math_sin, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, mrb_math, "cos", math_cos, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, mrb_math, "tan", math_tan, MRB_ARGS_REQ(1));
+
+ mrb_define_module_function(mrb, mrb_math, "asin", math_asin, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, mrb_math, "acos", math_acos, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, mrb_math, "atan", math_atan, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, mrb_math, "atan2", math_atan2, MRB_ARGS_REQ(2));
+
+ mrb_define_module_function(mrb, mrb_math, "sinh", math_sinh, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, mrb_math, "cosh", math_cosh, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, mrb_math, "tanh", math_tanh, MRB_ARGS_REQ(1));
+
+ mrb_define_module_function(mrb, mrb_math, "asinh", math_asinh, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, mrb_math, "acosh", math_acosh, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, mrb_math, "atanh", math_atanh, MRB_ARGS_REQ(1));
+
+ mrb_define_module_function(mrb, mrb_math, "exp", math_exp, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, mrb_math, "log", math_log, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
+ mrb_define_module_function(mrb, mrb_math, "log2", math_log2, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, mrb_math, "log10", math_log10, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, mrb_math, "sqrt", math_sqrt, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, mrb_math, "cbrt", math_cbrt, MRB_ARGS_REQ(1));
+
+ mrb_define_module_function(mrb, mrb_math, "frexp", math_frexp, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, mrb_math, "ldexp", math_ldexp, MRB_ARGS_REQ(2));
+
+ mrb_define_module_function(mrb, mrb_math, "hypot", math_hypot, MRB_ARGS_REQ(2));
+
+ mrb_define_module_function(mrb, mrb_math, "erf", math_erf, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, mrb_math, "erfc", math_erfc, MRB_ARGS_REQ(1));
+}
+
+void
+mrb_mruby_math_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-mbed/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,22 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include "mruby.h"
+void mrb_mruby_mbed_gem_init(mrb_state *mrb);
+void mrb_mruby_mbed_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_mbed_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_mruby_mbed_gem_init(mrb);
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_mbed_gem_final(mrb_state *mrb) {
+ mrb_mruby_mbed_gem_final(mrb);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-mbed/mbed.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,211 @@
+/*
+** mbed.c - mbed module
+**
+*/
+
+#include "mruby.h"
+#include "mruby/data.h"
+
+#include "mrbPinName.h"
+#include "mrbDigitalOut.h"
+#include "mrbTimer.h"
+#include "mrbMbedFunc.h"
+
+/**
+ * mbed
+ */
+static mrb_value
+mrb_mbed_sleep(mrb_state *mrb, mrb_value obj)
+{
+ mrb_int t;
+ mrb_get_args(mrb, "i", &t);
+ mbedSleep(t);
+
+ return obj;
+}
+
+static mrb_value
+mrb_mbed_sleep_ms(mrb_state *mrb, mrb_value obj)
+{
+ mrb_int t;
+ mrb_get_args(mrb, "i", &t);
+ mbedSleepMS(t);
+
+ return obj;
+}
+
+static mrb_value
+mrb_mbed_sleep_us(mrb_state *mrb, mrb_value obj)
+{
+ mrb_int t;
+ mrb_get_args(mrb, "i", &t);
+ mbedSleepUS(t);
+
+ return obj;
+}
+
+/**
+ * mbed::I2C
+ */
+
+
+/**
+ * mbed::DigitalOut
+ */
+static void mbed_do_free(mrb_state *mrb, void *ptr) {
+ delDigitalOut(ptr);
+}
+
+static struct mrb_data_type mbed_do_type = {
+ "DigitalOut", mbed_do_free
+};
+
+static mrb_value
+mrb_mbed_do_init(mrb_state *mrb, mrb_value self)
+{
+ mrb_int pin;
+ mrb_get_args(mrb, "i", &pin);
+
+ DATA_TYPE(self) = &mbed_do_type;
+ DATA_PTR(self) = newDigitalOut(pin);
+
+ return self;
+}
+
+static mrb_value
+mrb_mbed_do_write(mrb_state *mrb, mrb_value self)
+{
+ void *do_obj = DATA_PTR(self);
+
+ mrb_int val;
+ mrb_get_args(mrb, "i", &val);
+
+ writeDigitalOut(do_obj, val);
+
+ return self;
+}
+
+static mrb_value
+mrb_mbed_do_read(mrb_state *mrb, mrb_value self)
+{
+ void *do_obj = DATA_PTR(self);
+
+ return mrb_fixnum_value(readDigitalOut(do_obj));
+}
+
+/**
+ * mbed::Timer
+ */
+static void mbed_timer_free(mrb_state *mrb, void *ptr) {
+ delTimer(ptr);
+}
+
+static struct mrb_data_type mbed_timer_type = {
+ "Timer", mbed_timer_free
+};
+
+static mrb_value
+mrb_mbed_timer_init(mrb_state *mrb, mrb_value self)
+{
+ void *timer_obj;
+
+ DATA_TYPE(self) = &mbed_timer_type;
+ DATA_PTR(self) = newTimer();
+
+ return self;
+}
+
+static mrb_value
+mrb_mbed_timer_start(mrb_state *mrb, mrb_value self)
+{
+ void *timer_obj = DATA_PTR(self);
+
+ startTimer(timer_obj);
+
+ return self;
+}
+
+static mrb_value
+mrb_mbed_timer_stop(mrb_state *mrb, mrb_value self)
+{
+ void *timer_obj = DATA_PTR(self);
+
+ stopTimer(timer_obj);
+
+ return self;
+}
+
+static mrb_value
+mrb_mbed_timer_reset(mrb_state *mrb, mrb_value self)
+{
+ void *timer_obj = DATA_PTR(self);
+
+ resetTimer(timer_obj);
+
+ return self;
+}
+
+static mrb_value
+mrb_mbed_timer_read(mrb_state *mrb, mrb_value self)
+{
+ void *timer_obj = DATA_PTR(self);
+
+ return mrb_float_value(mrb, readTimer(timer_obj));
+}
+
+static mrb_value
+mrb_mbed_timer_read_ms(mrb_state *mrb, mrb_value self)
+{
+ void *timer_obj = DATA_PTR(self);
+
+ return mrb_fixnum_value(readMSTimer(timer_obj));
+}
+
+static mrb_value
+mrb_mbed_timer_read_us(mrb_state *mrb, mrb_value self)
+{
+ void *timer_obj = DATA_PTR(self);
+
+ return mrb_fixnum_value(readUSTimer(timer_obj));
+}
+
+/* ------------------------------------------------------------------------*/
+void
+mrb_mruby_mbed_gem_init(mrb_state* mrb)
+{
+ struct RClass *mrb_mbed;
+ struct RClass *mrb_mbed_do;
+ struct RClass *mrb_mbed_timer;
+
+ mrb_mbed = mrb_define_module(mrb, "Mbed");
+ mrb_define_const(mrb, mrb_mbed, "LED1", mrb_fixnum_value(LED1));
+ mrb_define_const(mrb, mrb_mbed, "LED2", mrb_fixnum_value(LED2));
+ mrb_define_const(mrb, mrb_mbed, "LED3", mrb_fixnum_value(LED3));
+ mrb_define_const(mrb, mrb_mbed, "LED4", mrb_fixnum_value(LED4));
+ mrb_define_const(mrb, mrb_mbed, "LED_RED", mrb_fixnum_value(LED_RED));
+ mrb_define_const(mrb, mrb_mbed, "LED_GREEN", mrb_fixnum_value(LED_GREEN));
+ mrb_define_const(mrb, mrb_mbed, "LED_BLUE", mrb_fixnum_value(LED_BLUE));
+ mrb_define_const(mrb, mrb_mbed, "LED_USER", mrb_fixnum_value(LED_USER));
+ mrb_define_module_function(mrb, mrb_mbed, "sleep", mrb_mbed_sleep, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, mrb_mbed, "sleep_ms", mrb_mbed_sleep, MRB_ARGS_REQ(1));
+ mrb_define_module_function(mrb, mrb_mbed, "sleep_us", mrb_mbed_sleep, MRB_ARGS_REQ(1));
+
+ mrb_mbed_do = mrb_define_class_under(mrb, mrb_mbed, "DigitalOut", mrb->object_class);
+ mrb_define_method(mrb, mrb_mbed_do, "initialize", mrb_mbed_do_init, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, mrb_mbed_do, "write", mrb_mbed_do_write, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, mrb_mbed_do, "read", mrb_mbed_do_read, MRB_ARGS_NONE());
+
+ mrb_mbed_timer = mrb_define_class_under(mrb, mrb_mbed, "Timer", mrb->object_class);
+ mrb_define_method(mrb, mrb_mbed_timer, "initialize", mrb_mbed_timer_init, MRB_ARGS_NONE());
+ mrb_define_method(mrb, mrb_mbed_timer, "start", mrb_mbed_timer_start, MRB_ARGS_NONE());
+ mrb_define_method(mrb, mrb_mbed_timer, "stop", mrb_mbed_timer_stop, MRB_ARGS_NONE());
+ mrb_define_method(mrb, mrb_mbed_timer, "reset", mrb_mbed_timer_reset, MRB_ARGS_NONE());
+ mrb_define_method(mrb, mrb_mbed_timer, "read", mrb_mbed_timer_read, MRB_ARGS_NONE());
+ mrb_define_method(mrb, mrb_mbed_timer, "read_ms", mrb_mbed_timer_read_ms, MRB_ARGS_NONE());
+ mrb_define_method(mrb, mrb_mbed_timer, "read_us", mrb_mbed_timer_read_us, MRB_ARGS_NONE());
+}
+
+void
+mrb_mruby_mbed_gem_final(mrb_state* mrb)
+{
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-mbed/mrbDigitalOut.cpp Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,30 @@
+#include "mbed.h"
+#include "mrbDigitalOut.h"
+
+void *
+newDigitalOut(int pin)
+{
+ PinName pinname = static_cast<PinName>(pin);
+ return static_cast<void*>(new DigitalOut(pinname));
+}
+
+void
+delDigitalOut(void *ptr)
+{
+ DigitalOut *obj = static_cast<DigitalOut*>(ptr);
+ delete obj;
+}
+
+void
+writeDigitalOut(void *ptr, int val)
+{
+ DigitalOut *obj = static_cast<DigitalOut*>(ptr);
+ obj->write(val);
+}
+
+int
+readDigitalOut(void *ptr)
+{
+ DigitalOut *obj = static_cast<DigitalOut*>(ptr);
+ return obj->read();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-mbed/mrbDigitalOut.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,12 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void *newDigitalOut(int pin);
+void delDigitalOut(void *object);
+void writeDigitalOut(void *object, int value);
+int readDigitalOut(void *object);
+
+#ifdef __cplusplus
+}
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-mbed/mrbMbedFunc.cpp Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,20 @@
+#include "mbed.h"
+#include "mrbMbedFunc.h"
+
+void
+mbedSleep(int t)
+{
+ wait((float)t);
+}
+
+void
+mbedSleepMS(int t)
+{
+ wait_ms(t);
+}
+
+void
+mbedSleepUS(int t)
+{
+ wait_us(t);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-mbed/mrbMbedFunc.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,11 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void mbedSleep(int t);
+void mbedSleepMS(int t);
+void mbedSleepUS(int t);
+
+#ifdef __cplusplus
+}
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mrbgems/mruby-mbed/mrbPinName.h Wed Mar 25 17:36:16 2015 +0000 @@ -0,0 +1,4 @@ + +#include "PinNames.h" + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-mbed/mrbTimer.cpp Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,59 @@
+#include "mbed.h"
+#include "mrbTimer.h"
+
+void *
+newTimer()
+{
+ return static_cast<void*>(new Timer());
+}
+
+void
+delTimer(void *ptr)
+{
+ Timer *obj = static_cast<Timer*>(ptr);
+ delete obj;
+}
+
+void
+startTimer(void *ptr)
+{
+ Timer *obj = static_cast<Timer*>(ptr);
+ obj->start();
+}
+
+void
+stopTimer(void *ptr)
+{
+ Timer *obj = static_cast<Timer*>(ptr);
+ obj->stop();
+}
+
+void
+resetTimer(void *ptr)
+{
+ Timer *obj = static_cast<Timer*>(ptr);
+ obj->reset();
+}
+
+float
+readTimer(void *ptr)
+{
+ Timer *obj = static_cast<Timer*>(ptr);
+ return obj->read();
+}
+
+int
+readMSTimer(void *ptr)
+{
+ Timer *obj = static_cast<Timer*>(ptr);
+ return obj->read_ms();
+}
+
+int
+readUSTimer(void *ptr)
+{
+ Timer *obj = static_cast<Timer*>(ptr);
+ return obj->read_us();
+}
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-mbed/mrbTimer.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,18 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void *newTimer();
+void delTimer(void *ptr);
+void startTimer(void *ptr);
+void stopTimer(void *ptr);
+void resetTimer(void *ptr);
+float readTimer(void *ptr);
+int readMSTimer(void *ptr);
+int readUSTimer(void *ptr);
+
+#ifdef __cplusplus
+}
+#endif
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-numeric-ext/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,53 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_numeric_ext[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0x63,0x2e,0x00,0x00,0x00,0xe9,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x00,0xb0,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x35,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04,
+0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x80,0x00,0x4a,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x08,0x49,0x6e,0x74,0x65,0x67,0x72,
+0x61,0x6c,0x00,0x00,0x00,0x00,0x34,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,
+0x05,0x00,0x00,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x04,0x00,0x80,0x00,0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x03,0x64,0x69,0x76,0x00,0x00,0x00,0x00,0x44,0x00,0x03,0x00,0x06,0x00,0x00,
+0x00,0x00,0x00,0x07,0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x83,0xff,0x3f,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x64,0x69,0x76,0x6d,0x6f,0x64,
+0x00,0x00,0x02,0x5b,0x5d,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x00,0x1b,0x00,0x00,
+0x00,0x01,0x00,0x05,0x6f,0x74,0x68,0x65,0x72,0x00,0x00,0x00,0x01,0xff,0xff,0x00,
+0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_numeric_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_numeric_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_numeric_ext_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_mruby_numeric_ext_gem_init(mrb);
+ mrb_load_irep(mrb, gem_mrblib_irep_mruby_numeric_ext);
+ if (mrb->exc) {
+ mrb_print_error(mrb);
+ exit(EXIT_FAILURE);
+ }
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_numeric_ext_gem_final(mrb_state *mrb) {
+ mrb_mruby_numeric_ext_gem_final(mrb);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-numeric-ext/numeric_ext.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,31 @@
+#include <limits.h>
+#include "mruby.h"
+
+static mrb_value
+mrb_int_chr(mrb_state *mrb, mrb_value x)
+{
+ mrb_int chr;
+ char c;
+
+ chr = mrb_fixnum(x);
+ if (chr >= (1 << CHAR_BIT)) {
+ mrb_raisef(mrb, E_RANGE_ERROR, "%S out of char range", x);
+ }
+ c = (char)chr;
+
+ return mrb_str_new(mrb, &c, 1);
+}
+
+void
+mrb_mruby_numeric_ext_gem_init(mrb_state* mrb)
+{
+ struct RClass *i = mrb_class_get(mrb, "Integer");
+
+ mrb_define_method(mrb, i, "chr", mrb_int_chr, MRB_ARGS_NONE());
+}
+
+void
+mrb_mruby_numeric_ext_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-object-ext/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,52 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_object_ext[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0x55,0xf0,0x00,0x00,0x00,0xd3,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x00,0xa5,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x37,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0x45,0x00,0x80,0x00,
+0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x4f,0x62,
+0x6a,0x65,0x63,0x74,0x00,0x00,0x00,0x00,0x34,0x00,0x01,0x00,0x03,0x00,0x01,0x00,
+0x00,0x00,0x05,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x04,0x00,0x80,0x00,0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x03,0x74,0x61,0x70,0x00,0x00,0x00,0x00,0x39,0x00,0x02,0x00,0x04,0x00,0x00,
+0x00,0x00,0x00,0x06,0x26,0x00,0x00,0x00,0x2b,0x00,0x00,0x01,0x06,0x00,0x80,0x01,
+0xa0,0x00,0x00,0x01,0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x4c,0x56,0x41,0x52,0x00,
+0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x45,0x4e,0x44,0x00,0x00,
+0x00,0x00,0x08,
+};
+void mrb_mruby_object_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_object_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_object_ext_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_mruby_object_ext_gem_init(mrb);
+ mrb_load_irep(mrb, gem_mrblib_irep_mruby_object_ext);
+ if (mrb->exc) {
+ mrb_print_error(mrb);
+ exit(EXIT_FAILURE);
+ }
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_object_ext_gem_final(mrb_state *mrb) {
+ mrb_mruby_object_ext_gem_final(mrb);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-object-ext/object.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,106 @@
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+
+/*
+ * call-seq:
+ * nil.to_a -> []
+ *
+ * Always returns an empty array.
+ */
+
+static mrb_value
+nil_to_a(mrb_state *mrb, mrb_value obj)
+{
+ return mrb_ary_new(mrb);
+}
+
+/*
+ * call-seq:
+ * nil.to_f -> 0.0
+ *
+ * Always returns zero.
+ */
+
+static mrb_value
+nil_to_f(mrb_state *mrb, mrb_value obj)
+{
+ return mrb_float_value(mrb, 0.0);
+}
+
+/*
+ * call-seq:
+ * nil.to_i -> 0
+ *
+ * Always returns zero.
+ */
+
+static mrb_value
+nil_to_i(mrb_state *mrb, mrb_value obj)
+{
+ return mrb_fixnum_value(0);
+}
+
+/*
+ * call-seq:
+ * obj.instance_exec(arg...) {|var...| block } -> obj
+ *
+ * Executes the given block within the context of the receiver
+ * (_obj_). In order to set the context, the variable +self+ is set
+ * to _obj_ while the code is executing, giving the code access to
+ * _obj_'s instance variables. Arguments are passed as block parameters.
+ *
+ * class KlassWithSecret
+ * def initialize
+ * @secret = 99
+ * end
+ * end
+ * k = KlassWithSecret.new
+ * k.instance_exec(5) {|x| @secret+x } #=> 104
+ */
+
+static mrb_value
+mrb_obj_instance_exec(mrb_state *mrb, mrb_value self)
+{
+ mrb_value *argv;
+ mrb_int argc;
+ mrb_value blk;
+ struct RClass *c;
+
+ mrb_get_args(mrb, "*&", &argv, &argc, &blk);
+
+ if (mrb_nil_p(blk)) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
+ }
+
+ switch (mrb_type(self)) {
+ case MRB_TT_SYMBOL:
+ case MRB_TT_FIXNUM:
+ case MRB_TT_FLOAT:
+ c = NULL;
+ break;
+ default:
+ c = mrb_class_ptr(mrb_singleton_class(mrb, self));
+ break;
+ }
+
+ return mrb_yield_with_class(mrb, blk, argc, argv, self, c);
+}
+
+void
+mrb_mruby_object_ext_gem_init(mrb_state* mrb)
+{
+ struct RClass * n = mrb->nil_class;
+
+ mrb_define_method(mrb, n, "to_a", nil_to_a, MRB_ARGS_NONE());
+ mrb_define_method(mrb, n, "to_f", nil_to_f, MRB_ARGS_NONE());
+ mrb_define_method(mrb, n, "to_i", nil_to_i, MRB_ARGS_NONE());
+
+ mrb_define_method(mrb, mrb->object_class, "instance_exec", mrb_obj_instance_exec, MRB_ARGS_ANY() | MRB_ARGS_BLOCK());
+}
+
+void
+mrb_mruby_object_ext_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-objectspace/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,22 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include "mruby.h"
+void mrb_mruby_objectspace_gem_init(mrb_state *mrb);
+void mrb_mruby_objectspace_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_objectspace_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_mruby_objectspace_gem_init(mrb);
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_objectspace_gem_final(mrb_state *mrb) {
+ mrb_mruby_objectspace_gem_final(mrb);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-objectspace/mruby_objectspace.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,186 @@
+#include "mruby.h"
+#include "mruby/gc.h"
+#include "mruby/hash.h"
+#include "mruby/class.h"
+
+struct os_count_struct {
+ mrb_int total;
+ mrb_int freed;
+ mrb_int counts[MRB_TT_MAXDEFINE+1];
+};
+
+static void
+os_count_object_type(mrb_state *mrb, struct RBasic *obj, void *data)
+{
+ struct os_count_struct *obj_count;
+ obj_count = (struct os_count_struct*)data;
+
+ obj_count->total++;
+
+ if (is_dead(mrb, obj)) {
+ obj_count->freed++;
+ }
+ else {
+ obj_count->counts[obj->tt]++;
+ }
+}
+
+/*
+ * call-seq:
+ * ObjectSpace.count_objects([result_hash]) -> hash
+ *
+ * Counts objects for each type.
+ *
+ * It returns a hash, such as:
+ * {
+ * :TOTAL=>10000,
+ * :FREE=>3011,
+ * :T_OBJECT=>6,
+ * :T_CLASS=>404,
+ * # ...
+ * }
+ *
+ * If the optional argument +result_hash+ is given,
+ * it is overwritten and returned. This is intended to avoid probe effect.
+ *
+ */
+
+static mrb_value
+os_count_objects(mrb_state *mrb, mrb_value self)
+{
+ struct os_count_struct obj_count = { 0 };
+ enum mrb_vtype i;
+ mrb_value hash;
+
+ if (mrb_get_args(mrb, "|H", &hash) == 0) {
+ hash = mrb_hash_new(mrb);
+ }
+
+ if (!mrb_test(mrb_hash_empty_p(mrb, hash))) {
+ mrb_hash_clear(mrb, hash);
+ }
+
+ mrb_objspace_each_objects(mrb, os_count_object_type, &obj_count);
+
+ mrb_hash_set(mrb, hash, mrb_symbol_value(mrb_intern_lit(mrb, "TOTAL")), mrb_fixnum_value(obj_count.total));
+ mrb_hash_set(mrb, hash, mrb_symbol_value(mrb_intern_lit(mrb, "FREE")), mrb_fixnum_value(obj_count.freed));
+
+ for (i = MRB_TT_FALSE; i < MRB_TT_MAXDEFINE; i++) {
+ mrb_value type;
+ switch (i) {
+#define COUNT_TYPE(t) case (MRB_T ## t): type = mrb_symbol_value(mrb_intern_lit(mrb, #t)); break;
+ COUNT_TYPE(T_FALSE);
+ COUNT_TYPE(T_FREE);
+ COUNT_TYPE(T_TRUE);
+ COUNT_TYPE(T_FIXNUM);
+ COUNT_TYPE(T_SYMBOL);
+ COUNT_TYPE(T_UNDEF);
+ COUNT_TYPE(T_FLOAT);
+ COUNT_TYPE(T_CPTR);
+ COUNT_TYPE(T_OBJECT);
+ COUNT_TYPE(T_CLASS);
+ COUNT_TYPE(T_MODULE);
+ COUNT_TYPE(T_ICLASS);
+ COUNT_TYPE(T_SCLASS);
+ COUNT_TYPE(T_PROC);
+ COUNT_TYPE(T_ARRAY);
+ COUNT_TYPE(T_HASH);
+ COUNT_TYPE(T_STRING);
+ COUNT_TYPE(T_RANGE);
+ COUNT_TYPE(T_EXCEPTION);
+ COUNT_TYPE(T_FILE);
+ COUNT_TYPE(T_ENV);
+ COUNT_TYPE(T_DATA);
+ COUNT_TYPE(T_FIBER);
+#undef COUNT_TYPE
+ default:
+ type = mrb_fixnum_value(i); break;
+ }
+ if (obj_count.counts[i])
+ mrb_hash_set(mrb, hash, type, mrb_fixnum_value(obj_count.counts[i]));
+ }
+
+ return hash;
+}
+
+struct os_each_object_data {
+ mrb_value block;
+ struct RClass *target_module;
+ mrb_int count;
+};
+
+static void
+os_each_object_cb(mrb_state *mrb, struct RBasic *obj, void *ud)
+{
+ struct os_each_object_data *d = (struct os_each_object_data*)ud;
+
+ /* filter dead objects */
+ if (is_dead(mrb, obj)) {
+ return;
+ }
+
+ /* filter internal objects */
+ switch (obj->tt) {
+ case MRB_TT_ENV:
+ case MRB_TT_ICLASS:
+ return;
+ default:
+ break;
+ }
+
+ /* filter half baked (or internal) objects */
+ if (!obj->c) return;
+
+ /* filter class kind if target module defined */
+ if (d->target_module && !mrb_obj_is_kind_of(mrb, mrb_obj_value(obj), d->target_module)) {
+ return;
+ }
+
+ mrb_yield(mrb, d->block, mrb_obj_value(obj));
+ ++d->count;
+}
+
+/*
+ * call-seq:
+ * ObjectSpace.each_object([module]) {|obj| ... } -> fixnum
+ *
+ * Calls the block once for each object in this Ruby process.
+ * Returns the number of objects found.
+ * If the optional argument +module+ is given,
+ * calls the block for only those classes or modules
+ * that match (or are a subclass of) +module+.
+ *
+ * If no block is given, ArgumentError is raised.
+ *
+ */
+
+static mrb_value
+os_each_object(mrb_state *mrb, mrb_value self)
+{
+ mrb_value cls = mrb_nil_value();
+ struct os_each_object_data d;
+ mrb_get_args(mrb, "&|C", &d.block, &cls);
+
+ if (mrb_nil_p(d.block)) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "Expected block in ObjectSpace.each_object.");
+ }
+
+ d.target_module = mrb_nil_p(cls) ? NULL : mrb_class_ptr(cls);
+ d.count = 0;
+ mrb_objspace_each_objects(mrb, os_each_object_cb, &d);
+ return mrb_fixnum_value(d.count);
+}
+
+void
+mrb_mruby_objectspace_gem_init(mrb_state *mrb)
+{
+ struct RClass *os = mrb_define_module(mrb, "ObjectSpace");
+ mrb_define_class_method(mrb, os, "count_objects", os_count_objects, MRB_ARGS_OPT(1));
+ mrb_define_class_method(mrb, os, "each_object", os_each_object, MRB_ARGS_OPT(1));
+}
+
+void
+mrb_mruby_objectspace_gem_final(mrb_state *mrb)
+{
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-print/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,117 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_print[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0x5b,0x68,0x00,0x00,0x04,0xe5,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x04,0x5e,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x33,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04,
+0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x80,0x00,0x4a,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,
+0x00,0x00,0x00,0x00,0xbf,0x00,0x01,0x00,0x04,0x00,0x06,0x00,0x00,0x00,0x1a,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,
+0x46,0x80,0x80,0x00,0x91,0x01,0x80,0x00,0x84,0x02,0x00,0x01,0xa0,0x00,0x81,0x00,
+0x99,0x02,0xc0,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,0x46,0x80,0x81,0x00,
+0x04,0x03,0x80,0x00,0x97,0x03,0x40,0x00,0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,
+0x46,0x80,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,0x46,0x40,0x81,0x00,
+0x84,0x02,0x80,0x00,0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
+0x00,0x05,0x70,0x72,0x69,0x6e,0x74,0x00,0x00,0x04,0x70,0x75,0x74,0x73,0x00,0x00,
+0x01,0x70,0x00,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x00,0x00,0x0b,0x72,0x65,
+0x73,0x70,0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x07,0x73,0x70,0x72,0x69,
+0x6e,0x74,0x66,0x00,0x00,0x06,0x70,0x72,0x69,0x6e,0x74,0x66,0x00,0x00,0x00,0x00,
+0x98,0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x15,0x00,0x26,0x00,0x08,0x00,
+0x83,0xff,0xbf,0x01,0x01,0x40,0x80,0x02,0x20,0x00,0x80,0x02,0x01,0x40,0x01,0x02,
+0x97,0x04,0x40,0x00,0x06,0x00,0x80,0x02,0x01,0x40,0x00,0x03,0x01,0xc0,0x80,0x03,
+0xa0,0x80,0x00,0x03,0x20,0xc0,0x00,0x03,0xa0,0x40,0x80,0x02,0x01,0xc0,0x80,0x02,
+0xad,0x00,0x81,0x02,0x01,0x40,0x81,0x01,0x01,0xc0,0x80,0x02,0x01,0x00,0x01,0x03,
+0xb3,0x40,0x81,0x02,0x98,0xf9,0xbf,0x02,0x05,0x00,0x80,0x02,0x29,0x00,0x80,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,
+0x0c,0x5f,0x5f,0x70,0x72,0x69,0x6e,0x74,0x73,0x74,0x72,0x5f,0x5f,0x00,0x00,0x02,
+0x5b,0x5d,0x00,0x00,0x04,0x74,0x6f,0x5f,0x73,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,
+0x3c,0x00,0x00,0x00,0x00,0xee,0x00,0x06,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x27,
+0x26,0x00,0x08,0x00,0x83,0xff,0xbf,0x01,0x01,0x40,0x00,0x03,0x20,0x00,0x00,0x03,
+0x01,0x80,0x01,0x02,0x17,0x0a,0x40,0x00,0x01,0x40,0x00,0x03,0x01,0xc0,0x80,0x03,
+0xa0,0x40,0x00,0x03,0x20,0x80,0x00,0x03,0x01,0x80,0x81,0x02,0x06,0x00,0x00,0x03,
+0x01,0x40,0x81,0x03,0xa0,0xc0,0x00,0x03,0x01,0x40,0x01,0x03,0x03,0xff,0xbf,0x03,
+0xa0,0x40,0x00,0x03,0x3d,0x00,0x80,0x03,0xa0,0x00,0x01,0x03,0x99,0x01,0x40,0x03,
+0x06,0x00,0x00,0x03,0x3d,0x00,0x80,0x03,0xa0,0xc0,0x00,0x03,0x01,0xc0,0x00,0x03,
+0xad,0x40,0x01,0x03,0x01,0x80,0x81,0x01,0x01,0xc0,0x00,0x03,0x01,0x00,0x81,0x03,
+0xb3,0x80,0x01,0x03,0x18,0xf4,0x3f,0x03,0x01,0x00,0x01,0x03,0x83,0xff,0xbf,0x03,
+0xb2,0xc0,0x01,0x03,0x99,0x01,0x40,0x03,0x06,0x00,0x00,0x03,0x3d,0x00,0x80,0x03,
+0xa0,0xc0,0x00,0x03,0x05,0x00,0x00,0x03,0x29,0x00,0x00,0x03,0x00,0x00,0x00,0x01,
+0x00,0x00,0x01,0x0a,0x00,0x00,0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,
+0x02,0x5b,0x5d,0x00,0x00,0x04,0x74,0x6f,0x5f,0x73,0x00,0x00,0x0c,0x5f,0x5f,0x70,
+0x72,0x69,0x6e,0x74,0x73,0x74,0x72,0x5f,0x5f,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,
+0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x00,0x00,0xb3,
+0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x1a,0x00,0x00,0x26,0x00,0x08,0x00,
+0x83,0xff,0xbf,0x01,0x01,0x40,0x80,0x02,0x20,0x00,0x80,0x02,0x01,0x40,0x01,0x02,
+0x17,0x06,0x40,0x00,0x06,0x00,0x80,0x02,0x01,0x40,0x00,0x03,0x01,0xc0,0x80,0x03,
+0xa0,0x80,0x00,0x03,0x20,0xc0,0x00,0x03,0xa0,0x40,0x80,0x02,0x06,0x00,0x80,0x02,
+0x3d,0x00,0x00,0x03,0xa0,0x40,0x80,0x02,0x01,0xc0,0x80,0x02,0xad,0x00,0x81,0x02,
+0x01,0x40,0x81,0x01,0x01,0xc0,0x80,0x02,0x01,0x00,0x01,0x03,0xb3,0x40,0x81,0x02,
+0x18,0xf8,0xbf,0x02,0x01,0x40,0x80,0x02,0x83,0xff,0x3f,0x03,0xa0,0x80,0x80,0x02,
+0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x0a,0x00,0x00,0x00,0x06,
+0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x0c,0x5f,0x5f,0x70,0x72,0x69,0x6e,0x74,
+0x73,0x74,0x72,0x5f,0x5f,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x07,0x69,0x6e,0x73,
+0x70,0x65,0x63,0x74,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x00,0x00,
+0x5b,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x26,0x00,0x08,0x00,
+0x06,0x00,0x80,0x01,0x06,0x00,0x00,0x02,0x37,0x40,0x81,0x02,0x01,0x40,0x00,0x03,
+0x38,0x80,0x81,0x02,0xa0,0x7f,0x00,0x02,0xa0,0x00,0x80,0x01,0x05,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0c,0x5f,0x5f,
+0x70,0x72,0x69,0x6e,0x74,0x73,0x74,0x72,0x5f,0x5f,0x00,0x00,0x07,0x73,0x70,0x72,
+0x69,0x6e,0x74,0x66,0x00,0x00,0x00,0x00,0x71,0x00,0x03,0x00,0x07,0x00,0x00,0x00,
+0x00,0x00,0x07,0x00,0x26,0x00,0x08,0x00,0x06,0x00,0x80,0x01,0x91,0x00,0x00,0x02,
+0x3d,0x00,0x80,0x02,0xa0,0x80,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x01,0x00,0x00,0x14,0x70,0x72,0x69,0x6e,0x74,0x66,0x20,0x6e,0x6f,
+0x74,0x20,0x61,0x76,0x61,0x69,0x6c,0x61,0x62,0x6c,0x65,0x00,0x00,0x00,0x03,0x00,
+0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x13,0x4e,0x6f,0x74,0x49,0x6d,0x70,0x6c,
+0x65,0x6d,0x65,0x6e,0x74,0x65,0x64,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,
+0x65,0x77,0x00,0x00,0x00,0x00,0x72,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,
+0x07,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x06,0x00,0x80,0x01,0x91,0x00,0x00,0x02,
+0x3d,0x00,0x80,0x02,0xa0,0x80,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x01,0x00,0x00,0x15,0x73,0x70,0x72,0x69,0x6e,0x74,0x66,0x20,0x6e,
+0x6f,0x74,0x20,0x61,0x76,0x61,0x69,0x6c,0x61,0x62,0x6c,0x65,0x00,0x00,0x00,0x03,
+0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x13,0x4e,0x6f,0x74,0x49,0x6d,0x70,
+0x6c,0x65,0x6d,0x65,0x6e,0x74,0x65,0x64,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,
+0x6e,0x65,0x77,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x04,
+0x00,0x04,0x61,0x72,0x67,0x73,0x00,0x01,0x69,0x00,0x03,0x6c,0x65,0x6e,0x00,0x01,
+0x73,0x00,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x02,0x00,
+0x04,0x00,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x02,0x00,
+0x04,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,0x00,
+0x03,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,
+0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x45,0x4e,0x44,
+0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_print_gem_init(mrb_state *mrb);
+void mrb_mruby_print_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_print_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_mruby_print_gem_init(mrb);
+ mrb_load_irep(mrb, gem_mrblib_irep_mruby_print);
+ if (mrb->exc) {
+ mrb_print_error(mrb);
+ exit(EXIT_FAILURE);
+ }
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_print_gem_final(mrb_state *mrb) {
+ mrb_mruby_print_gem_final(mrb);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-print/print.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,43 @@
+#include "mruby.h"
+#include "mruby/string.h"
+#include <stdio.h>
+
+static void
+printstr(mrb_state *mrb, mrb_value obj)
+{
+ char *s;
+ mrb_int len;
+
+ if (mrb_string_p(obj)) {
+ s = RSTRING_PTR(obj);
+ len = RSTRING_LEN(obj);
+ fwrite(s, len, 1, stdout);
+ }
+}
+
+/* 15.3.1.2.9 */
+/* 15.3.1.3.34 */
+mrb_value
+mrb_printstr(mrb_state *mrb, mrb_value self)
+{
+ mrb_value argv;
+
+ mrb_get_args(mrb, "o", &argv);
+ printstr(mrb, argv);
+
+ return argv;
+}
+
+void
+mrb_mruby_print_gem_init(mrb_state* mrb)
+{
+ struct RClass *krn;
+ krn = mrb->kernel_module;
+ mrb_define_method(mrb, krn, "__printstr__", mrb_printstr, MRB_ARGS_REQ(1));
+}
+
+void
+mrb_mruby_print_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-proc-ext/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,111 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_proc_ext[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0xfa,0x0c,0x00,0x00,0x04,0x8b,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x03,0xcf,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x35,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0x45,0x00,0x80,0x00,
+0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x50,0x72,
+0x6f,0x63,0x00,0x00,0x00,0x00,0x72,0x00,0x01,0x00,0x03,0x00,0x04,0x00,0x00,0x00,
+0x0e,0x00,0x00,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,
+0x46,0xc0,0x80,0x00,0x84,0x01,0x80,0x00,0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x03,0x3d,0x3d,0x3d,0x00,0x00,0x05,0x79,0x69,0x65,0x6c,
+0x64,0x00,0x00,0x07,0x74,0x6f,0x5f,0x70,0x72,0x6f,0x63,0x00,0x00,0x05,0x63,0x75,
+0x72,0x72,0x79,0x00,0x00,0x00,0x00,0x3d,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,
+0x00,0x07,0x00,0x00,0x26,0x00,0x08,0x00,0x06,0x00,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x00,0x00,0x3d,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,
+0x26,0x00,0x08,0x00,0x06,0x00,0x80,0x01,0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,
+0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x26,0x00,
+0x02,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x26,0x00,0x00,0x00,
+0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x01,0x80,0x00,0x07,0x00,0x0d,0x00,0x02,0x00,0x00,0x00,0x39,0x00,0x00,
+0x26,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x01,0x40,0x00,0x06,0x00,0x80,0x03,
+0x20,0x00,0x80,0x03,0x01,0xc0,0x81,0x00,0x06,0x00,0x80,0x03,0x40,0x01,0x00,0x04,
+0x21,0x40,0x80,0x03,0x01,0xc0,0x81,0x01,0x01,0x40,0x00,0x04,0xa0,0x80,0x80,0x03,
+0x01,0xc0,0x81,0x00,0x06,0x00,0x80,0x03,0x20,0xc0,0x80,0x03,0x19,0x11,0xc0,0x03,
+0x06,0x00,0x80,0x03,0x20,0x00,0x80,0x03,0x01,0xc0,0x01,0x02,0x83,0xff,0x3f,0x04,
+0xb6,0x00,0x81,0x03,0x99,0x01,0xc0,0x03,0x01,0x40,0x80,0x03,0x01,0x00,0x01,0x04,
+0xa0,0x40,0x81,0x03,0x98,0x04,0xc0,0x03,0x01,0x00,0x81,0x03,0x83,0xff,0x3f,0x04,
+0xb3,0x80,0x81,0x03,0x99,0x02,0xc0,0x03,0x01,0xc0,0x80,0x03,0x01,0x00,0x01,0x04,
+0xa0,0x80,0x80,0x03,0x01,0x40,0x00,0x04,0xb5,0xc0,0x81,0x03,0x19,0x07,0xc0,0x03,
+0x06,0x00,0x80,0x03,0x91,0x04,0x00,0x04,0x3d,0x00,0x80,0x04,0x01,0x40,0x00,0x05,
+0x3e,0x80,0x82,0x04,0xbd,0x00,0x00,0x05,0x3e,0x80,0x82,0x04,0x01,0xc0,0x00,0x05,
+0x01,0x00,0x81,0x05,0xa0,0x80,0x00,0x05,0x3e,0x80,0x82,0x04,0x3d,0x01,0x00,0x05,
+0x3e,0x80,0x82,0x04,0x20,0x01,0x82,0x03,0x06,0x00,0x80,0x02,0x06,0x00,0x80,0x03,
+0x40,0x03,0x00,0x04,0x21,0x80,0x82,0x03,0x01,0xc0,0x01,0x03,0x20,0xc0,0x82,0x03,
+0x29,0x00,0x80,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x1b,0x77,0x72,0x6f,0x6e,0x67,
+0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,
+0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,
+0x01,0x29,0x00,0x00,0x00,0x0c,0x00,0x05,0x61,0x72,0x69,0x74,0x79,0x00,0x00,0x06,
+0x6c,0x61,0x6d,0x62,0x64,0x61,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x07,0x6c,0x61,
+0x6d,0x62,0x64,0x61,0x3f,0x00,0x00,0x02,0x3e,0x3d,0x00,0x00,0x02,0x21,0x3d,0x00,
+0x00,0x01,0x3c,0x00,0x00,0x01,0x3e,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,
+0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,
+0x00,0x04,0x70,0x72,0x6f,0x63,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,
+0x00,0x53,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x0b,0x26,0x00,0x00,0x02,
+0x01,0x40,0x80,0x01,0x83,0xff,0x3f,0x02,0xb3,0x00,0x80,0x01,0x19,0x02,0xc0,0x01,
+0x01,0x40,0x80,0x01,0x20,0x40,0x80,0x01,0xaf,0x80,0x80,0x01,0x97,0x00,0x40,0x00,
+0x01,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x01,0x3c,0x00,0x00,0x02,0x2d,0x40,0x00,0x00,0x01,0x2d,0x00,0x00,0x00,0x00,
+0x41,0x00,0x03,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x26,0x00,0x10,0x00,
+0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,0x37,0xc0,0x80,0x00,0x06,0x00,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x04,0x70,0x72,0x6f,0x63,0x00,0x00,0x00,0x00,0x7b,0x00,
+0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x26,0x00,0x08,0x00,
+0x15,0x40,0x00,0x02,0x01,0x40,0x80,0x02,0xac,0x00,0x00,0x02,0x01,0x00,0x81,0x01,
+0x20,0x40,0x00,0x02,0x95,0x40,0x80,0x02,0xb6,0x80,0x00,0x02,0x19,0x03,0x40,0x02,
+0x95,0x40,0x01,0x02,0x37,0x40,0x81,0x02,0x01,0xc0,0x00,0x03,0x38,0x80,0x81,0x02,
+0xa0,0xff,0x00,0x02,0x97,0x01,0x40,0x00,0x95,0x80,0x01,0x02,0x01,0xc0,0x80,0x02,
+0xa0,0xc0,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x01,0x2b,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x3e,0x3d,0x00,
+0x00,0x02,0x5b,0x5d,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,
+0x09,0x00,0x04,0x61,0x72,0x67,0x73,0x00,0x05,0x61,0x72,0x69,0x74,0x79,0x00,0x03,
+0x61,0x62,0x73,0x00,0x0a,0x73,0x65,0x6c,0x66,0x5f,0x61,0x72,0x69,0x74,0x79,0x00,
+0x05,0x70,0x70,0x72,0x6f,0x63,0x00,0x0a,0x6d,0x61,0x6b,0x65,0x5f,0x63,0x75,0x72,
+0x72,0x79,0x00,0x01,0x61,0x00,0x0a,0x67,0x69,0x76,0x65,0x6e,0x5f,0x61,0x72,0x67,
+0x73,0x00,0x08,0x6e,0x65,0x77,0x5f,0x61,0x72,0x67,0x73,0x00,0x00,0x00,0x01,0xff,
+0xff,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,
+0x01,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x03,0x00,0x03,0x00,0x04,0x00,
+0x04,0x00,0x05,0x00,0x05,0x00,0x06,0x00,0x06,0x00,0x01,0xff,0xff,0x00,0x00,0x00,
+0x07,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x00,
+0x08,0x00,0x03,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_proc_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_proc_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_proc_ext_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_mruby_proc_ext_gem_init(mrb);
+ mrb_load_irep(mrb, gem_mrblib_irep_mruby_proc_ext);
+ if (mrb->exc) {
+ mrb_print_error(mrb);
+ exit(EXIT_FAILURE);
+ }
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_proc_ext_gem_final(mrb_state *mrb) {
+ mrb_mruby_proc_ext_gem_final(mrb);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-proc-ext/proc.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,168 @@
+#include "mruby.h"
+#include "mruby/proc.h"
+#include "mruby/opcode.h"
+#include "mruby/array.h"
+#include "mruby/string.h"
+#include "mruby/debug.h"
+
+static mrb_value
+mrb_proc_lambda(mrb_state *mrb, mrb_value self)
+{
+ struct RProc *p = mrb_proc_ptr(self);
+ return mrb_bool_value(MRB_PROC_STRICT_P(p));
+}
+
+static mrb_value
+mrb_proc_source_location(mrb_state *mrb, mrb_value self)
+{
+ struct RProc *p = mrb_proc_ptr(self);
+
+ if (MRB_PROC_CFUNC_P(p)) {
+ return mrb_nil_value();
+ }
+ else {
+ mrb_irep *irep = p->body.irep;
+ int32_t line;
+ const char *filename;
+
+ filename = mrb_debug_get_filename(irep, 0);
+ line = mrb_debug_get_line(irep, 0);
+
+ return (!filename && line == -1)? mrb_nil_value()
+ : mrb_assoc_new(mrb, mrb_str_new_cstr(mrb, filename), mrb_fixnum_value(line));
+ }
+}
+
+static mrb_value
+mrb_proc_inspect(mrb_state *mrb, mrb_value self)
+{
+ struct RProc *p = mrb_proc_ptr(self);
+ mrb_value str = mrb_str_new_lit(mrb, "#<Proc:");
+ mrb_str_concat(mrb, str, mrb_ptr_to_str(mrb, mrb_cptr(self)));
+
+ if (!MRB_PROC_CFUNC_P(p)) {
+ mrb_irep *irep = p->body.irep;
+ const char *filename;
+ int32_t line;
+ mrb_str_cat_lit(mrb, str, "@");
+
+ filename = mrb_debug_get_filename(irep, 0);
+ mrb_str_cat_cstr(mrb, str, filename ? filename : "-");
+ mrb_str_cat_lit(mrb, str, ":");
+
+ line = mrb_debug_get_line(irep, 0);
+ if (line != -1) {
+ mrb_str_append(mrb, str, mrb_fixnum_value(line));
+ }
+ else {
+ mrb_str_cat_lit(mrb, str, "-");
+ }
+ }
+
+ if (MRB_PROC_STRICT_P(p)) {
+ mrb_str_cat_lit(mrb, str, " (lambda)");
+ }
+
+ mrb_str_cat_lit(mrb, str, ">");
+ return str;
+}
+
+static mrb_value
+mrb_kernel_proc(mrb_state *mrb, mrb_value self)
+{
+ mrb_value blk;
+
+ mrb_get_args(mrb, "&", &blk);
+ if (mrb_nil_p(blk)) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block");
+ }
+
+ return blk;
+}
+
+/*
+ * call-seq:
+ * prc.parameters -> array
+ *
+ * Returns the parameter information of this proc.
+ *
+ * prc = lambda{|x, y=42, *other|}
+ * prc.parameters #=> [[:req, :x], [:opt, :y], [:rest, :other]]
+ */
+
+static mrb_value
+mrb_proc_parameters(mrb_state *mrb, mrb_value self)
+{
+ struct parameters_type {
+ int size;
+ const char *name;
+ } *p, parameters_list [] = {
+ {0, "req"},
+ {0, "opt"},
+ {0, "rest"},
+ {0, "req"},
+ {0, "block"},
+ {0, NULL}
+ };
+ const struct RProc *proc = mrb_proc_ptr(self);
+ const struct mrb_irep *irep = proc->body.irep;
+ mrb_aspec aspec;
+ mrb_value parameters;
+ int i, j;
+
+ if (MRB_PROC_CFUNC_P(proc)) {
+ // TODO cfunc aspec is not implemented yet
+ return mrb_ary_new(mrb);
+ }
+ if (!irep->lv) {
+ return mrb_ary_new(mrb);
+ }
+ if (GET_OPCODE(*irep->iseq) != OP_ENTER) {
+ return mrb_ary_new(mrb);
+ }
+
+ if (!MRB_PROC_STRICT_P(proc)) {
+ parameters_list[0].name = "opt";
+ parameters_list[3].name = "opt";
+ }
+
+ aspec = GETARG_Ax(*irep->iseq);
+ parameters_list[0].size = MRB_ASPEC_REQ(aspec);
+ parameters_list[1].size = MRB_ASPEC_OPT(aspec);
+ parameters_list[2].size = MRB_ASPEC_REST(aspec);
+ parameters_list[3].size = MRB_ASPEC_POST(aspec);
+ parameters_list[4].size = MRB_ASPEC_BLOCK(aspec);
+
+ parameters = mrb_ary_new_capa(mrb, irep->nlocals-1);
+ for (i = 0, p = parameters_list; p->name; p++) {
+ mrb_value sname = mrb_symbol_value(mrb_intern_cstr(mrb, p->name));
+ for (j = 0; j < p->size; i++, j++) {
+ mrb_assert(i < (irep->nlocals-1));
+ mrb_ary_push(mrb, parameters, mrb_assoc_new(mrb,
+ sname,
+ mrb_symbol_value(irep->lv[i].name)
+ ));
+ }
+ }
+ return parameters;
+}
+
+void
+mrb_mruby_proc_ext_gem_init(mrb_state* mrb)
+{
+ struct RClass *p = mrb->proc_class;
+ mrb_define_method(mrb, p, "lambda?", mrb_proc_lambda, MRB_ARGS_NONE());
+ mrb_define_method(mrb, p, "source_location", mrb_proc_source_location, MRB_ARGS_NONE());
+ mrb_define_method(mrb, p, "to_s", mrb_proc_inspect, MRB_ARGS_NONE());
+ mrb_define_method(mrb, p, "inspect", mrb_proc_inspect, MRB_ARGS_NONE());
+ mrb_define_method(mrb, p, "parameters", mrb_proc_parameters, MRB_ARGS_NONE());
+
+ mrb_define_class_method(mrb, mrb->kernel_module, "proc", mrb_kernel_proc, MRB_ARGS_NONE());
+ mrb_define_method(mrb, mrb->kernel_module, "proc", mrb_kernel_proc, MRB_ARGS_NONE());
+}
+
+void
+mrb_mruby_proc_ext_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-random/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,22 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include "mruby.h"
+void mrb_mruby_random_gem_init(mrb_state *mrb);
+void mrb_mruby_random_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_random_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_mruby_random_gem_init(mrb);
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_random_gem_final(mrb_state *mrb) {
+ mrb_mruby_random_gem_final(mrb);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-random/mt19937ar.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,198 @@
+/*
+** mt19937ar.c - MT Random functions
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mt19937ar.h"
+
+/* Period parameters */
+/* #define N 624 */
+#define M 397
+#define MATRIX_A 0x9908b0dfUL /* constant vector a */
+#define UPPER_MASK 0x80000000UL /* most significant w-r bits */
+#define LOWER_MASK 0x7fffffffUL /* least significant r bits */
+
+#if 0 /* dead_code */
+static unsigned long mt[N]; /* the array for the state vector */
+static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */
+#endif /* dead_code */
+
+void mrb_random_init_genrand(mt_state *t, unsigned long s)
+{
+ t->mt[0]= s & 0xffffffffUL;
+ for (t->mti=1; t->mti<N; t->mti++) {
+ t->mt[t->mti] =
+ (1812433253UL * (t->mt[t->mti-1] ^ (t->mt[t->mti-1] >> 30)) + t->mti);
+ t->mt[t->mti] &= 0xffffffffUL;
+ }
+}
+
+unsigned long mrb_random_genrand_int32(mt_state *t)
+{
+ unsigned long y;
+ static const unsigned long mag01[2]={0x0UL, MATRIX_A};
+ /* mag01[x] = x * MATRIX_A for x=0,1 */
+
+ if (t->mti >= N) { /* generate N words at one time */
+ int kk;
+
+ if (t->mti == N+1) /* if init_genrand() has not been called, */
+ mrb_random_init_genrand(t, 5489UL); /* a default initial seed is used */
+
+ for (kk=0;kk<N-M;kk++) {
+ y = (t->mt[kk]&UPPER_MASK)|(t->mt[kk+1]&LOWER_MASK);
+ t->mt[kk] = t->mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1UL];
+ }
+ for (;kk<N-1;kk++) {
+ y = (t->mt[kk]&UPPER_MASK)|(t->mt[kk+1]&LOWER_MASK);
+ t->mt[kk] = t->mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1UL];
+ }
+ y = (t->mt[N-1]&UPPER_MASK)|(t->mt[0]&LOWER_MASK);
+ t->mt[N-1] = t->mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL];
+
+ t->mti = 0;
+ }
+
+ y = t->mt[t->mti++];
+
+ /* Tempering */
+ y ^= (y >> 11);
+ y ^= (y << 7) & 0x9d2c5680UL;
+ y ^= (y << 15) & 0xefc60000UL;
+ y ^= (y >> 18);
+
+ t->gen.int_ = y;
+
+ return y;
+}
+
+double mrb_random_genrand_real1(mt_state *t)
+{
+ mrb_random_genrand_int32(t);
+ t->gen.double_ = t->gen.int_*(1.0/4294967295.0);
+ return t->gen.double_;
+ /* divided by 2^32-1 */
+}
+
+#if 0 /* dead_code */
+/* initializes mt[N] with a seed */
+void init_genrand(unsigned long s)
+{
+ mt[0]= s & 0xffffffffUL;
+ for (mti=1; mti<N; mti++) {
+ mt[mti] =
+ (1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti);
+ /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
+ /* In the previous versions, MSBs of the seed affect */
+ /* only MSBs of the array mt[]. */
+ /* 2002/01/09 modified by Makoto Matsumoto */
+ mt[mti] &= 0xffffffffUL;
+ /* for >32 bit machines */
+ }
+}
+
+/* initialize by an array with array-length */
+/* init_key is the array for initializing keys */
+/* key_length is its length */
+/* slight change for C++, 2004/2/26 */
+void init_by_array(unsigned long init_key[], int key_length)
+{
+ int i, j, k;
+ init_genrand(19650218UL);
+ i=1; j=0;
+ k = (N>key_length ? N : key_length);
+ for (; k; k--) {
+ mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525UL))
+ + init_key[j] + j; /* non linear */
+ mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */
+ i++; j++;
+ if (i>=N) { mt[0] = mt[N-1]; i=1; }
+ if (j>=key_length) j=0;
+ }
+ for (k=N-1; k; k--) {
+ mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941UL))
+ - i; /* non linear */
+ mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */
+ i++;
+ if (i>=N) { mt[0] = mt[N-1]; i=1; }
+ }
+
+ mt[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */
+}
+
+/* generates a random number on [0,0xffffffff]-interval */
+unsigned long genrand_int32(void)
+{
+ unsigned long y;
+ static const unsigned long mag01[2]={0x0UL, MATRIX_A};
+ /* mag01[x] = x * MATRIX_A for x=0,1 */
+
+ if (mti >= N) { /* generate N words at one time */
+ int kk;
+
+ if (mti == N+1) /* if init_genrand() has not been called, */
+ init_genrand(5489UL); /* a default initial seed is used */
+
+ for (kk=0;kk<N-M;kk++) {
+ y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
+ mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1UL];
+ }
+ for (;kk<N-1;kk++) {
+ y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
+ mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1UL];
+ }
+ y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK);
+ mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL];
+
+ mti = 0;
+ }
+
+ y = mt[mti++];
+
+ /* Tempering */
+ y ^= (y >> 11);
+ y ^= (y << 7) & 0x9d2c5680UL;
+ y ^= (y << 15) & 0xefc60000UL;
+ y ^= (y >> 18);
+
+ return y;
+}
+
+/* generates a random number on [0,0x7fffffff]-interval */
+long genrand_int31(void)
+{
+ return (long)(genrand_int32()>>1);
+}
+
+/* generates a random number on [0,1]-real-interval */
+double genrand_real1(void)
+{
+ return genrand_int32()*(1.0/4294967295.0);
+ /* divided by 2^32-1 */
+}
+
+/* generates a random number on [0,1)-real-interval */
+double genrand_real2(void)
+{
+ return genrand_int32()*(1.0/4294967296.0);
+ /* divided by 2^32 */
+}
+
+/* generates a random number on (0,1)-real-interval */
+double genrand_real3(void)
+{
+ return (((double)genrand_int32()) + 0.5)*(1.0/4294967296.0);
+ /* divided by 2^32 */
+}
+
+/* generates a random number on [0,1) with 53-bit resolution*/
+double genrand_res53(void)
+{
+ unsigned long a=genrand_int32()>>5, b=genrand_int32()>>6;
+ return(a*67108864.0+b)*(1.0/9007199254740992.0);
+}
+/* These real versions are due to Isaku Wada, 2002/01/09 added */
+#endif /* dead_code */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-random/mt19937ar.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,52 @@
+/*
+** mt19937ar.h - MT Random functions
+**
+** See Copyright Notice in mruby.h
+*/
+
+#define N 624
+
+typedef struct {
+ unsigned long mt[N];
+ int mti;
+ union {
+ unsigned long int_;
+ double double_;
+ } gen;
+
+ mrb_int seed;
+ mrb_bool has_seed : 1;
+} mt_state;
+
+void mrb_random_init_genrand(mt_state *, unsigned long);
+unsigned long mrb_random_genrand_int32(mt_state *);
+double mrb_random_genrand_real1(mt_state *t);
+
+/* initializes mt[N] with a seed */
+void init_genrand(unsigned long s);
+
+/* initialize by an array with array-length */
+/* init_key is the array for initializing keys */
+/* key_length is its length */
+/* slight change for C++, 2004/2/26 */
+void init_by_array(unsigned long init_key[], int key_length);
+
+/* generates a random number on [0,0xffffffff]-interval */
+unsigned long genrand_int32(void);
+
+/* generates a random number on [0,0x7fffffff]-interval */
+long genrand_int31(void);
+
+/* These real versions are due to Isaku Wada, 2002/01/09 added */
+/* generates a random number on [0,1]-real-interval */
+double genrand_real1(void);
+
+/* generates a random number on [0,1)-real-interval */
+double genrand_real2(void);
+
+/* generates a random number on (0,1)-real-interval */
+double genrand_real3(void);
+
+/* generates a random number on [0,1) with 53-bit resolution*/
+double genrand_res53(void);
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-random/random.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,346 @@
+/*
+** random.c - Random module
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/variable.h"
+#include "mruby/class.h"
+#include "mruby/data.h"
+#include "mruby/array.h"
+#include "mt19937ar.h"
+
+#include <time.h>
+
+static char const MT_STATE_KEY[] = "$mrb_i_mt_state";
+
+static const struct mrb_data_type mt_state_type = {
+ MT_STATE_KEY, mrb_free,
+};
+
+static mrb_value mrb_random_rand(mrb_state *mrb, mrb_value self);
+static mrb_value mrb_random_srand(mrb_state *mrb, mrb_value self);
+
+static void
+mt_srand(mt_state *t, unsigned long seed)
+{
+ mrb_random_init_genrand(t, seed);
+}
+
+static unsigned long
+mt_rand(mt_state *t)
+{
+ return mrb_random_genrand_int32(t);
+}
+
+static double
+mt_rand_real(mt_state *t)
+{
+ return mrb_random_genrand_real1(t);
+}
+
+static mrb_value
+mrb_random_mt_srand(mrb_state *mrb, mt_state *t, mrb_value seed)
+{
+ if (mrb_nil_p(seed)) {
+ seed = mrb_fixnum_value((mrb_int)(time(NULL) + mt_rand(t)));
+ if (mrb_fixnum(seed) < 0) {
+ seed = mrb_fixnum_value(0 - mrb_fixnum(seed));
+ }
+ }
+
+ mt_srand(t, (unsigned) mrb_fixnum(seed));
+
+ return seed;
+}
+
+static mrb_value
+mrb_random_mt_rand(mrb_state *mrb, mt_state *t, mrb_value max)
+{
+ mrb_value value;
+
+ if (mrb_fixnum(max) == 0) {
+ value = mrb_float_value(mrb, mt_rand_real(t));
+ }
+ else {
+ value = mrb_fixnum_value(mt_rand(t) % mrb_fixnum(max));
+ }
+
+ return value;
+}
+
+static mrb_value
+get_opt(mrb_state* mrb)
+{
+ mrb_value arg;
+
+ arg = mrb_nil_value();
+ mrb_get_args(mrb, "|o", &arg);
+
+ if (!mrb_nil_p(arg)) {
+ if (!mrb_fixnum_p(arg)) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument type");
+ }
+ arg = mrb_check_convert_type(mrb, arg, MRB_TT_FIXNUM, "Fixnum", "to_int");
+ if (mrb_fixnum(arg) < 0) {
+ arg = mrb_fixnum_value(0 - mrb_fixnum(arg));
+ }
+ }
+ return arg;
+}
+
+static mrb_value
+get_random(mrb_state *mrb) {
+ return mrb_const_get(mrb,
+ mrb_obj_value(mrb_class_get(mrb, "Random")),
+ mrb_intern_lit(mrb, "DEFAULT"));
+}
+
+static mt_state *
+get_random_state(mrb_state *mrb)
+{
+ mrb_value random_val = get_random(mrb);
+ return DATA_GET_PTR(mrb, random_val, &mt_state_type, mt_state);
+}
+
+static mrb_value
+mrb_random_g_rand(mrb_state *mrb, mrb_value self)
+{
+ mrb_value random = get_random(mrb);
+ return mrb_random_rand(mrb, random);
+}
+
+static mrb_value
+mrb_random_g_srand(mrb_state *mrb, mrb_value self)
+{
+ mrb_value random = get_random(mrb);
+ return mrb_random_srand(mrb, random);
+}
+
+static mrb_value
+mrb_random_init(mrb_state *mrb, mrb_value self)
+{
+ mrb_value seed;
+ mt_state *t;
+
+ /* avoid memory leaks */
+ t = (mt_state*)DATA_PTR(self);
+ if (t) {
+ mrb_free(mrb, t);
+ }
+ mrb_data_init(self, NULL, &mt_state_type);
+
+ t = (mt_state *)mrb_malloc(mrb, sizeof(mt_state));
+ t->mti = N + 1;
+
+ seed = get_opt(mrb);
+ seed = mrb_random_mt_srand(mrb, t, seed);
+ if (mrb_nil_p(seed)) {
+ t->has_seed = FALSE;
+ }
+ else {
+ mrb_assert(mrb_fixnum_p(seed));
+ t->has_seed = TRUE;
+ t->seed = mrb_fixnum(seed);
+ }
+
+ mrb_data_init(self, t, &mt_state_type);
+
+ return self;
+}
+
+static void
+mrb_random_rand_seed(mrb_state *mrb, mt_state *t)
+{
+ if (!t->has_seed) {
+ mrb_random_mt_srand(mrb, t, mrb_nil_value());
+ }
+}
+
+static mrb_value
+mrb_random_rand(mrb_state *mrb, mrb_value self)
+{
+ mrb_value max;
+ mt_state *t = DATA_GET_PTR(mrb, self, &mt_state_type, mt_state);
+
+ max = get_opt(mrb);
+ mrb_random_rand_seed(mrb, t);
+ return mrb_random_mt_rand(mrb, t, max);
+}
+
+static mrb_value
+mrb_random_srand(mrb_state *mrb, mrb_value self)
+{
+ mrb_value seed;
+ mrb_value old_seed;
+ mt_state *t = DATA_GET_PTR(mrb, self, &mt_state_type, mt_state);
+
+ seed = get_opt(mrb);
+ seed = mrb_random_mt_srand(mrb, t, seed);
+ old_seed = t->has_seed? mrb_fixnum_value(t->seed) : mrb_nil_value();
+ if (mrb_nil_p(seed)) {
+ t->has_seed = FALSE;
+ }
+ else {
+ mrb_assert(mrb_fixnum_p(seed));
+ t->has_seed = TRUE;
+ t->seed = mrb_fixnum(seed);
+ }
+
+ return old_seed;
+}
+
+/*
+ * call-seq:
+ * ary.shuffle! -> ary
+ *
+ * Shuffles elements in self in place.
+ */
+
+static mrb_value
+mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary)
+{
+ mrb_int i;
+ mt_state *random = NULL;
+
+ if (RARRAY_LEN(ary) > 1) {
+ mrb_get_args(mrb, "|d", &random, &mt_state_type);
+
+ if (random == NULL) {
+ random = get_random_state(mrb);
+ }
+ mrb_random_rand_seed(mrb, random);
+
+ mrb_ary_modify(mrb, mrb_ary_ptr(ary));
+
+ for (i = RARRAY_LEN(ary) - 1; i > 0; i--) {
+ mrb_int j;
+ mrb_value tmp;
+
+ j = mrb_fixnum(mrb_random_mt_rand(mrb, random, mrb_fixnum_value(RARRAY_LEN(ary))));
+
+ tmp = RARRAY_PTR(ary)[i];
+ mrb_ary_ptr(ary)->ptr[i] = RARRAY_PTR(ary)[j];
+ mrb_ary_ptr(ary)->ptr[j] = tmp;
+ }
+ }
+
+ return ary;
+}
+
+/*
+ * call-seq:
+ * ary.shuffle -> new_ary
+ *
+ * Returns a new array with elements of self shuffled.
+ */
+
+static mrb_value
+mrb_ary_shuffle(mrb_state *mrb, mrb_value ary)
+{
+ mrb_value new_ary = mrb_ary_new_from_values(mrb, RARRAY_LEN(ary), RARRAY_PTR(ary));
+ mrb_ary_shuffle_bang(mrb, new_ary);
+
+ return new_ary;
+}
+
+/*
+ * call-seq:
+ * ary.sample -> obj
+ * ary.sample(n) -> new_ary
+ *
+ * Choose a random element or +n+ random elements from the array.
+ *
+ * The elements are chosen by using random and unique indices into the array
+ * in order to ensure that an element doesn't repeat itself unless the array
+ * already contained duplicate elements.
+ *
+ * If the array is empty the first form returns +nil+ and the second form
+ * returns an empty array.
+ */
+
+static mrb_value
+mrb_ary_sample(mrb_state *mrb, mrb_value ary)
+{
+ mrb_int n = 0;
+ mrb_bool given;
+ mt_state *random = NULL;
+ mrb_int len = RARRAY_LEN(ary);
+
+ mrb_get_args(mrb, "|i?d", &n, &given, &random, &mt_state_type);
+ if (random == NULL) {
+ random = get_random_state(mrb);
+ }
+ mrb_random_rand_seed(mrb, random);
+ mt_rand(random);
+ if (!given) { /* pick one element */
+ switch (len) {
+ case 0:
+ return mrb_nil_value();
+ case 1:
+ return RARRAY_PTR(ary)[0];
+ default:
+ return RARRAY_PTR(ary)[mt_rand(random) % len];
+ }
+ }
+ else {
+ mrb_value result;
+ mrb_int i, j;
+
+ if (n < 0) mrb_raise(mrb, E_ARGUMENT_ERROR, "negative sample number");
+ if (n > len) n = len;
+ result = mrb_ary_new_capa(mrb, n);
+ for (i=0; i<n; i++) {
+ mrb_int r;
+
+ for (;;) {
+ retry:
+ r = mt_rand(random) % len;
+
+ for (j=0; j<i; j++) {
+ if (mrb_fixnum(RARRAY_PTR(result)[j]) == r) {
+ goto retry; /* retry if duplicate */
+ }
+ }
+ break;
+ }
+ mrb_ary_push(mrb, result, mrb_fixnum_value(r));
+ }
+ for (i=0; i<n; i++) {
+ mrb_ary_set(mrb, result, i, RARRAY_PTR(ary)[mrb_fixnum(RARRAY_PTR(result)[i])]);
+ }
+ return result;
+ }
+}
+
+
+void mrb_mruby_random_gem_init(mrb_state *mrb)
+{
+ struct RClass *random;
+ struct RClass *array = mrb->array_class;
+
+ mrb_define_method(mrb, mrb->kernel_module, "rand", mrb_random_g_rand, MRB_ARGS_OPT(1));
+ mrb_define_method(mrb, mrb->kernel_module, "srand", mrb_random_g_srand, MRB_ARGS_OPT(1));
+
+ random = mrb_define_class(mrb, "Random", mrb->object_class);
+ MRB_SET_INSTANCE_TT(random, MRB_TT_DATA);
+ mrb_define_class_method(mrb, random, "rand", mrb_random_g_rand, MRB_ARGS_OPT(1));
+ mrb_define_class_method(mrb, random, "srand", mrb_random_g_srand, MRB_ARGS_OPT(1));
+
+ mrb_define_method(mrb, random, "initialize", mrb_random_init, MRB_ARGS_OPT(1));
+ mrb_define_method(mrb, random, "rand", mrb_random_rand, MRB_ARGS_OPT(1));
+ mrb_define_method(mrb, random, "srand", mrb_random_srand, MRB_ARGS_OPT(1));
+
+ mrb_define_method(mrb, array, "shuffle", mrb_ary_shuffle, MRB_ARGS_OPT(1));
+ mrb_define_method(mrb, array, "shuffle!", mrb_ary_shuffle_bang, MRB_ARGS_OPT(1));
+ mrb_define_method(mrb, array, "sample", mrb_ary_sample, MRB_ARGS_OPT(2));
+
+ mrb_const_set(mrb, mrb_obj_value(random), mrb_intern_lit(mrb, "DEFAULT"),
+ mrb_obj_new(mrb, random, 0, NULL));
+}
+
+void mrb_mruby_random_gem_final(mrb_state *mrb)
+{
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mrbgems/mruby-random/random.h Wed Mar 25 17:36:16 2015 +0000 @@ -0,0 +1,13 @@ +/* +** random.h - Random module +** +** See Copyright Notice in mruby.h +*/ + +#ifndef RANDOM_H +#define RANDOM_H + +void mrb_mruby_random_gem_init(mrb_state *mrb); + +#endif +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-range-ext/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,22 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include "mruby.h"
+void mrb_mruby_range_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_range_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_range_ext_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_mruby_range_ext_gem_init(mrb);
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_range_ext_gem_final(mrb_state *mrb) {
+ mrb_mruby_range_ext_gem_final(mrb);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-range-ext/range.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,192 @@
+#include "mruby.h"
+#include "mruby/range.h"
+#include <math.h>
+
+static mrb_bool
+r_le(mrb_state *mrb, mrb_value a, mrb_value b)
+{
+ mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* compare result */
+ /* output :a < b => -1, a = b => 0, a > b => +1 */
+
+ if (mrb_fixnum_p(r)) {
+ mrb_int c = mrb_fixnum(r);
+ if (c == 0 || c == -1) return TRUE;
+ }
+
+ return FALSE;
+}
+
+static mrb_bool
+r_lt(mrb_state *mrb, mrb_value a, mrb_value b)
+{
+ mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b);
+ /* output :a < b => -1, a = b => 0, a > b => +1 */
+
+ return mrb_fixnum_p(r) && mrb_fixnum(r) == -1;
+}
+
+/*
+ * call-seq:
+ * rng.cover?(obj) -> true or false
+ *
+ * Returns <code>true</code> if +obj+ is between the begin and end of
+ * the range.
+ *
+ * This tests <code>begin <= obj <= end</code> when #exclude_end? is +false+
+ * and <code>begin <= obj < end</code> when #exclude_end? is +true+.
+ *
+ * ("a".."z").cover?("c") #=> true
+ * ("a".."z").cover?("5") #=> false
+ * ("a".."z").cover?("cc") #=> true
+ */
+static mrb_value
+mrb_range_cover(mrb_state *mrb, mrb_value range)
+{
+ mrb_value val;
+ struct RRange *r = mrb_range_ptr(range);
+ mrb_value beg, end;
+
+ mrb_get_args(mrb, "o", &val);
+
+ beg = r->edges->beg;
+ end = r->edges->end;
+
+ if (r_le(mrb, beg, val)) {
+ if (r->excl) {
+ if (r_lt(mrb, val, end))
+ return mrb_true_value();
+ }
+ else {
+ if (r_le(mrb, val, end))
+ return mrb_true_value();
+ }
+ }
+
+ return mrb_false_value();
+}
+
+/*
+ * call-seq:
+ * rng.first -> obj
+ * rng.first(n) -> an_array
+ *
+ * Returns the first object in the range, or an array of the first +n+
+ * elements.
+ *
+ * (10..20).first #=> 10
+ * (10..20).first(3) #=> [10, 11, 12]
+ */
+static mrb_value
+mrb_range_first(mrb_state *mrb, mrb_value range)
+{
+ mrb_int num;
+ mrb_value array;
+ struct RRange *r = mrb_range_ptr(range);
+
+ if (mrb_get_args(mrb, "|i", &num) == 0) {
+ return r->edges->beg;
+ }
+
+ array = mrb_funcall(mrb, range, "to_a", 0);
+ return mrb_funcall(mrb, array, "first", 1, mrb_fixnum_value(num));
+}
+
+/*
+ * call-seq:
+ * rng.last -> obj
+ * rng.last(n) -> an_array
+ *
+ * Returns the last object in the range,
+ * or an array of the last +n+ elements.
+ *
+ * Note that with no arguments +last+ will return the object that defines
+ * the end of the range even if #exclude_end? is +true+.
+ *
+ * (10..20).last #=> 20
+ * (10...20).last #=> 20
+ * (10..20).last(3) #=> [18, 19, 20]
+ * (10...20).last(3) #=> [17, 18, 19]
+ */
+static mrb_value
+mrb_range_last(mrb_state *mrb, mrb_value range)
+{
+ mrb_value num;
+ mrb_value array;
+ struct RRange *r = mrb_range_ptr(range);
+
+ if (mrb_get_args(mrb, "|o", &num) == 0) {
+ return r->edges->end;
+ }
+
+ array = mrb_funcall(mrb, range, "to_a", 0);
+ return mrb_funcall(mrb, array, "last", 1, mrb_to_int(mrb, num));
+}
+
+/*
+ * call-seq:
+ * rng.size -> num
+ *
+ * Returns the number of elements in the range. Both the begin and the end of
+ * the Range must be Numeric, otherwise nil is returned.
+ *
+ * (10..20).size #=> 11
+ * ('a'..'z').size #=> nil
+ */
+
+static mrb_value
+mrb_range_size(mrb_state *mrb, mrb_value range)
+{
+ struct RRange *r = mrb_range_ptr(range);
+ mrb_value beg, end;
+ double beg_f, end_f;
+ mrb_bool num_p = TRUE;
+
+ beg = r->edges->beg;
+ end = r->edges->end;
+ if (mrb_fixnum_p(beg)) {
+ beg_f = (double)mrb_fixnum(beg);
+ }
+ else if (mrb_float_p(beg)) {
+ beg_f = mrb_float(beg);
+ }
+ else {
+ num_p = FALSE;
+ }
+ if (mrb_fixnum_p(end)) {
+ end_f = (double)mrb_fixnum(end);
+ }
+ else if (mrb_float_p(end)) {
+ end_f = mrb_float(end);
+ }
+ else {
+ num_p = FALSE;
+ }
+ if (num_p) {
+ double f;
+
+ if (beg_f > end_f) return mrb_fixnum_value(0);
+ f = end_f - beg_f;
+ if (!r->excl) {
+ return mrb_fixnum_value((mrb_int)ceil(f + 1));
+ }
+ return mrb_fixnum_value((mrb_int)ceil(f));
+ }
+ return mrb_nil_value();
+}
+
+void
+mrb_mruby_range_ext_gem_init(mrb_state* mrb)
+{
+ struct RClass * s = mrb_class_get(mrb, "Range");
+
+ mrb_define_method(mrb, s, "cover?", mrb_range_cover, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, s, "first", mrb_range_first, MRB_ARGS_OPT(1));
+ mrb_define_method(mrb, s, "last", mrb_range_last, MRB_ARGS_OPT(1));
+ mrb_define_method(mrb, s, "size", mrb_range_size, MRB_ARGS_NONE());
+}
+
+void
+mrb_mruby_range_ext_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-sprintf/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,56 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_sprintf[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0xd0,0x99,0x00,0x00,0x01,0x1c,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x00,0xe4,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x37,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0x45,0x00,0x80,0x00,
+0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x53,0x74,
+0x72,0x69,0x6e,0x67,0x00,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x03,0x00,0x01,0x00,
+0x00,0x00,0x05,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x04,0x00,0x80,0x00,0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x01,0x25,0x00,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,
+0x00,0x11,0x00,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x01,0x91,0x00,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x99,0x03,0xc0,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x00,0x02,
+0xb7,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0xbf,0x80,0x01,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,
+0x20,0x81,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x05,0x69,0x73,0x5f,0x61,0x3f,0x00,0x00,0x05,0x41,0x72,0x72,0x61,0x79,0x00,
+0x00,0x07,0x73,0x70,0x72,0x69,0x6e,0x74,0x66,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,
+0x00,0x1a,0x00,0x00,0x00,0x01,0x00,0x04,0x61,0x72,0x67,0x73,0x00,0x00,0x00,0x01,
+0xff,0xff,0x00,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_sprintf_gem_init(mrb_state *mrb);
+void mrb_mruby_sprintf_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_sprintf_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_mruby_sprintf_gem_init(mrb);
+ mrb_load_irep(mrb, gem_mrblib_irep_mruby_sprintf);
+ if (mrb->exc) {
+ mrb_print_error(mrb);
+ exit(EXIT_FAILURE);
+ }
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_sprintf_gem_final(mrb_state *mrb) {
+ mrb_mruby_sprintf_gem_final(mrb);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-sprintf/kernel.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,31 @@
+/*
+** kernel.c - Kernel module suppliment
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+
+mrb_value mrb_f_sprintf(mrb_state *mrb, mrb_value obj); /* in sprintf.c */
+
+void
+mrb_mruby_sprintf_gem_init(mrb_state* mrb)
+{
+ struct RClass *krn;
+
+ if (mrb->kernel_module == NULL) {
+ mrb->kernel_module = mrb_define_module(mrb, "Kernel"); /* Might be PARANOID. */
+ }
+ krn = mrb->kernel_module;
+
+ mrb_define_method(mrb, krn, "sprintf", mrb_f_sprintf, MRB_ARGS_ANY());
+ mrb_define_method(mrb, krn, "format", mrb_f_sprintf, MRB_ARGS_ANY());
+}
+
+void
+mrb_mruby_sprintf_gem_final(mrb_state* mrb)
+{
+ /* nothing to do. */
+}
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-sprintf/sprintf.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,1105 @@
+/*
+** sprintf.c - Kernel.#sprintf
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+#include "mruby/string.h"
+#include "mruby/hash.h"
+#include "mruby/numeric.h"
+#include <math.h>
+#include <ctype.h>
+
+#define BIT_DIGITS(N) (((N)*146)/485 + 1) /* log2(10) =~ 146/485 */
+#define BITSPERDIG MRB_INT_BIT
+#define EXTENDSIGN(n, l) (((~0 << (n)) >> (((n)*(l)) % BITSPERDIG)) & ~(~0 << (n)))
+
+mrb_value mrb_str_format(mrb_state *, int, const mrb_value *, mrb_value);
+static void fmt_setup(char*,size_t,int,int,mrb_int,mrb_int);
+
+static char*
+remove_sign_bits(char *str, int base)
+{
+ char *t;
+
+ t = str;
+ if (base == 16) {
+ while (*t == 'f') {
+ t++;
+ }
+ }
+ else if (base == 8) {
+ *t |= EXTENDSIGN(3, strlen(t));
+ while (*t == '7') {
+ t++;
+ }
+ }
+ else if (base == 2) {
+ while (*t == '1') {
+ t++;
+ }
+ }
+
+ return t;
+}
+
+static char
+sign_bits(int base, const char *p)
+{
+ char c;
+
+ switch (base) {
+ case 16:
+ if (*p == 'X') c = 'F';
+ else c = 'f';
+ break;
+ case 8:
+ c = '7'; break;
+ case 2:
+ c = '1'; break;
+ default:
+ c = '.'; break;
+ }
+ return c;
+}
+
+static mrb_value
+mrb_fix2binstr(mrb_state *mrb, mrb_value x, int base)
+{
+ char buf[64], *b = buf + sizeof buf;
+ mrb_int num = mrb_fixnum(x);
+ unsigned long val = (unsigned long)num;
+ char d;
+
+ if (base != 2) {
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix %S", mrb_fixnum_value(base));
+ }
+
+ if (val >= (1 << 10))
+ val &= 0x3ff;
+
+ if (val == 0) {
+ return mrb_str_new_lit(mrb, "0");
+ }
+ *--b = '\0';
+ do {
+ *--b = mrb_digitmap[(int)(val % base)];
+ } while (val /= base);
+
+ if (num < 0) {
+ b = remove_sign_bits(b, base);
+ switch (base) {
+ case 16: d = 'f'; break;
+ case 8: d = '7'; break;
+ case 2: d = '1'; break;
+ default: d = 0; break;
+ }
+
+ if (d && *b != d) {
+ *--b = d;
+ }
+ }
+
+ return mrb_str_new_cstr(mrb, b);
+}
+
+#define FNONE 0
+#define FSHARP 1
+#define FMINUS 2
+#define FPLUS 4
+#define FZERO 8
+#define FSPACE 16
+#define FWIDTH 32
+#define FPREC 64
+#define FPREC0 128
+
+#define CHECK(l) do {\
+/* int cr = ENC_CODERANGE(result);*/\
+ while (blen + (l) >= bsiz) {\
+ bsiz*=2;\
+ }\
+ mrb_str_resize(mrb, result, bsiz);\
+/* ENC_CODERANGE_SET(result, cr);*/\
+ buf = RSTRING_PTR(result);\
+} while (0)
+
+#define PUSH(s, l) do { \
+ CHECK(l);\
+ memcpy(&buf[blen], s, l);\
+ blen += (l);\
+} while (0)
+
+#define FILL(c, l) do { \
+ CHECK(l);\
+ memset(&buf[blen], c, l);\
+ blen += (l);\
+} while (0)
+
+#define GETARG() (!mrb_undef_p(nextvalue) ? nextvalue : \
+ posarg == -1 ? \
+ (mrb_raisef(mrb, E_ARGUMENT_ERROR, "unnumbered(%S) mixed with numbered", mrb_fixnum_value(nextarg)), mrb_undef_value()) : \
+ posarg == -2 ? \
+ (mrb_raisef(mrb, E_ARGUMENT_ERROR, "unnumbered(%S) mixed with named", mrb_fixnum_value(nextarg)), mrb_undef_value()) : \
+ (posarg = nextarg++, GETNTHARG(posarg)))
+
+#define GETPOSARG(n) (posarg > 0 ? \
+ (mrb_raisef(mrb, E_ARGUMENT_ERROR, "numbered(%S) after unnumbered(%S)", mrb_fixnum_value(n), mrb_fixnum_value(posarg)), mrb_undef_value()) : \
+ posarg == -2 ? \
+ (mrb_raisef(mrb, E_ARGUMENT_ERROR, "numbered(%S) after named", mrb_fixnum_value(n)), mrb_undef_value()) : \
+ ((n < 1) ? \
+ (mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid index - %S$", mrb_fixnum_value(n)), mrb_undef_value()) : \
+ (posarg = -1, GETNTHARG(n))))
+
+#define GETNTHARG(nth) \
+ ((nth >= argc) ? (mrb_raise(mrb, E_ARGUMENT_ERROR, "too few arguments"), mrb_undef_value()) : argv[nth])
+
+#define GETNAMEARG(id, name, len) ( \
+ posarg > 0 ? \
+ (mrb_raisef(mrb, E_ARGUMENT_ERROR, "named%S after unnumbered(%S)", mrb_str_new(mrb, (name), (len)), mrb_fixnum_value(posarg)), mrb_undef_value()) : \
+ posarg == -1 ? \
+ (mrb_raisef(mrb, E_ARGUMENT_ERROR, "named%S after numbered", mrb_str_new(mrb, (name), (len))), mrb_undef_value()) : \
+ (posarg = -2, mrb_hash_fetch(mrb, get_hash(mrb, &hash, argc, argv), id, mrb_undef_value())))
+
+#define GETNUM(n, val) \
+ for (; p < end && ISDIGIT(*p); p++) {\
+ int next_n = 10 * n + (*p - '0'); \
+ if (next_n / 10 != n) {\
+ mrb_raise(mrb, E_ARGUMENT_ERROR, #val " too big"); \
+ } \
+ n = next_n; \
+ } \
+ if (p >= end) { \
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "malformed format string - %*[0-9]"); \
+ }
+
+#define GETASTER(num) do { \
+ mrb_value tmp_v; \
+ t = p++; \
+ n = 0; \
+ GETNUM(n, val); \
+ if (*p == '$') { \
+ tmp_v = GETPOSARG(n); \
+ } \
+ else { \
+ tmp_v = GETARG(); \
+ p = t; \
+ } \
+ num = mrb_fixnum(tmp_v); \
+} while (0)
+
+static mrb_value
+get_hash(mrb_state *mrb, mrb_value *hash, int argc, const mrb_value *argv)
+{
+ mrb_value tmp;
+
+ if (!mrb_undef_p(*hash)) return *hash;
+ if (argc != 2) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "one hash required");
+ }
+ tmp = mrb_check_convert_type(mrb, argv[1], MRB_TT_HASH, "Hash", "to_hash");
+ if (mrb_nil_p(tmp)) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "one hash required");
+ }
+ return (*hash = tmp);
+}
+
+/*
+ * call-seq:
+ * format(format_string [, arguments...] ) -> string
+ * sprintf(format_string [, arguments...] ) -> string
+ *
+ * Returns the string resulting from applying <i>format_string</i> to
+ * any additional arguments. Within the format string, any characters
+ * other than format sequences are copied to the result.
+ *
+ * The syntax of a format sequence is follows.
+ *
+ * %[flags][width][.precision]type
+ *
+ * A format
+ * sequence consists of a percent sign, followed by optional flags,
+ * width, and precision indicators, then terminated with a field type
+ * character. The field type controls how the corresponding
+ * <code>sprintf</code> argument is to be interpreted, while the flags
+ * modify that interpretation.
+ *
+ * The field type characters are:
+ *
+ * Field | Integer Format
+ * ------+--------------------------------------------------------------
+ * b | Convert argument as a binary number.
+ * | Negative numbers will be displayed as a two's complement
+ * | prefixed with `..1'.
+ * B | Equivalent to `b', but uses an uppercase 0B for prefix
+ * | in the alternative format by #.
+ * d | Convert argument as a decimal number.
+ * i | Identical to `d'.
+ * o | Convert argument as an octal number.
+ * | Negative numbers will be displayed as a two's complement
+ * | prefixed with `..7'.
+ * u | Identical to `d'.
+ * x | Convert argument as a hexadecimal number.
+ * | Negative numbers will be displayed as a two's complement
+ * | prefixed with `..f' (representing an infinite string of
+ * | leading 'ff's).
+ * X | Equivalent to `x', but uses uppercase letters.
+ *
+ * Field | Float Format
+ * ------+--------------------------------------------------------------
+ * e | Convert floating point argument into exponential notation
+ * | with one digit before the decimal point as [-]d.dddddde[+-]dd.
+ * | The precision specifies the number of digits after the decimal
+ * | point (defaulting to six).
+ * E | Equivalent to `e', but uses an uppercase E to indicate
+ * | the exponent.
+ * f | Convert floating point argument as [-]ddd.dddddd,
+ * | where the precision specifies the number of digits after
+ * | the decimal point.
+ * g | Convert a floating point number using exponential form
+ * | if the exponent is less than -4 or greater than or
+ * | equal to the precision, or in dd.dddd form otherwise.
+ * | The precision specifies the number of significant digits.
+ * G | Equivalent to `g', but use an uppercase `E' in exponent form.
+ * a | Convert floating point argument as [-]0xh.hhhhp[+-]dd,
+ * | which is consisted from optional sign, "0x", fraction part
+ * | as hexadecimal, "p", and exponential part as decimal.
+ * A | Equivalent to `a', but use uppercase `X' and `P'.
+ *
+ * Field | Other Format
+ * ------+--------------------------------------------------------------
+ * c | Argument is the numeric code for a single character or
+ * | a single character string itself.
+ * p | The valuing of argument.inspect.
+ * s | Argument is a string to be substituted. If the format
+ * | sequence contains a precision, at most that many characters
+ * | will be copied.
+ * % | A percent sign itself will be displayed. No argument taken.
+ *
+ * The flags modifies the behavior of the formats.
+ * The flag characters are:
+ *
+ * Flag | Applies to | Meaning
+ * ---------+---------------+-----------------------------------------
+ * space | bBdiouxX | Leave a space at the start of
+ * | aAeEfgG | non-negative numbers.
+ * | (numeric fmt) | For `o', `x', `X', `b' and `B', use
+ * | | a minus sign with absolute value for
+ * | | negative values.
+ * ---------+---------------+-----------------------------------------
+ * (digit)$ | all | Specifies the absolute argument number
+ * | | for this field. Absolute and relative
+ * | | argument numbers cannot be mixed in a
+ * | | sprintf string.
+ * ---------+---------------+-----------------------------------------
+ * # | bBoxX | Use an alternative format.
+ * | aAeEfgG | For the conversions `o', increase the precision
+ * | | until the first digit will be `0' if
+ * | | it is not formatted as complements.
+ * | | For the conversions `x', `X', `b' and `B'
+ * | | on non-zero, prefix the result with ``0x'',
+ * | | ``0X'', ``0b'' and ``0B'', respectively.
+ * | | For `a', `A', `e', `E', `f', `g', and 'G',
+ * | | force a decimal point to be added,
+ * | | even if no digits follow.
+ * | | For `g' and 'G', do not remove trailing zeros.
+ * ---------+---------------+-----------------------------------------
+ * + | bBdiouxX | Add a leading plus sign to non-negative
+ * | aAeEfgG | numbers.
+ * | (numeric fmt) | For `o', `x', `X', `b' and `B', use
+ * | | a minus sign with absolute value for
+ * | | negative values.
+ * ---------+---------------+-----------------------------------------
+ * - | all | Left-justify the result of this conversion.
+ * ---------+---------------+-----------------------------------------
+ * 0 (zero) | bBdiouxX | Pad with zeros, not spaces.
+ * | aAeEfgG | For `o', `x', `X', `b' and `B', radix-1
+ * | (numeric fmt) | is used for negative numbers formatted as
+ * | | complements.
+ * ---------+---------------+-----------------------------------------
+ * * | all | Use the next argument as the field width.
+ * | | If negative, left-justify the result. If the
+ * | | asterisk is followed by a number and a dollar
+ * | | sign, use the indicated argument as the width.
+ *
+ * Examples of flags:
+ *
+ * # `+' and space flag specifies the sign of non-negative numbers.
+ * sprintf("%d", 123) #=> "123"
+ * sprintf("%+d", 123) #=> "+123"
+ * sprintf("% d", 123) #=> " 123"
+ *
+ * # `#' flag for `o' increases number of digits to show `0'.
+ * # `+' and space flag changes format of negative numbers.
+ * sprintf("%o", 123) #=> "173"
+ * sprintf("%#o", 123) #=> "0173"
+ * sprintf("%+o", -123) #=> "-173"
+ * sprintf("%o", -123) #=> "..7605"
+ * sprintf("%#o", -123) #=> "..7605"
+ *
+ * # `#' flag for `x' add a prefix `0x' for non-zero numbers.
+ * # `+' and space flag disables complements for negative numbers.
+ * sprintf("%x", 123) #=> "7b"
+ * sprintf("%#x", 123) #=> "0x7b"
+ * sprintf("%+x", -123) #=> "-7b"
+ * sprintf("%x", -123) #=> "..f85"
+ * sprintf("%#x", -123) #=> "0x..f85"
+ * sprintf("%#x", 0) #=> "0"
+ *
+ * # `#' for `X' uses the prefix `0X'.
+ * sprintf("%X", 123) #=> "7B"
+ * sprintf("%#X", 123) #=> "0X7B"
+ *
+ * # `#' flag for `b' add a prefix `0b' for non-zero numbers.
+ * # `+' and space flag disables complements for negative numbers.
+ * sprintf("%b", 123) #=> "1111011"
+ * sprintf("%#b", 123) #=> "0b1111011"
+ * sprintf("%+b", -123) #=> "-1111011"
+ * sprintf("%b", -123) #=> "..10000101"
+ * sprintf("%#b", -123) #=> "0b..10000101"
+ * sprintf("%#b", 0) #=> "0"
+ *
+ * # `#' for `B' uses the prefix `0B'.
+ * sprintf("%B", 123) #=> "1111011"
+ * sprintf("%#B", 123) #=> "0B1111011"
+ *
+ * # `#' for `e' forces to show the decimal point.
+ * sprintf("%.0e", 1) #=> "1e+00"
+ * sprintf("%#.0e", 1) #=> "1.e+00"
+ *
+ * # `#' for `f' forces to show the decimal point.
+ * sprintf("%.0f", 1234) #=> "1234"
+ * sprintf("%#.0f", 1234) #=> "1234."
+ *
+ * # `#' for `g' forces to show the decimal point.
+ * # It also disables stripping lowest zeros.
+ * sprintf("%g", 123.4) #=> "123.4"
+ * sprintf("%#g", 123.4) #=> "123.400"
+ * sprintf("%g", 123456) #=> "123456"
+ * sprintf("%#g", 123456) #=> "123456."
+ *
+ * The field width is an optional integer, followed optionally by a
+ * period and a precision. The width specifies the minimum number of
+ * characters that will be written to the result for this field.
+ *
+ * Examples of width:
+ *
+ * # padding is done by spaces, width=20
+ * # 0 or radix-1. <------------------>
+ * sprintf("%20d", 123) #=> " 123"
+ * sprintf("%+20d", 123) #=> " +123"
+ * sprintf("%020d", 123) #=> "00000000000000000123"
+ * sprintf("%+020d", 123) #=> "+0000000000000000123"
+ * sprintf("% 020d", 123) #=> " 0000000000000000123"
+ * sprintf("%-20d", 123) #=> "123 "
+ * sprintf("%-+20d", 123) #=> "+123 "
+ * sprintf("%- 20d", 123) #=> " 123 "
+ * sprintf("%020x", -123) #=> "..ffffffffffffffff85"
+ *
+ * For
+ * numeric fields, the precision controls the number of decimal places
+ * displayed. For string fields, the precision determines the maximum
+ * number of characters to be copied from the string. (Thus, the format
+ * sequence <code>%10.10s</code> will always contribute exactly ten
+ * characters to the result.)
+ *
+ * Examples of precisions:
+ *
+ * # precision for `d', 'o', 'x' and 'b' is
+ * # minimum number of digits <------>
+ * sprintf("%20.8d", 123) #=> " 00000123"
+ * sprintf("%20.8o", 123) #=> " 00000173"
+ * sprintf("%20.8x", 123) #=> " 0000007b"
+ * sprintf("%20.8b", 123) #=> " 01111011"
+ * sprintf("%20.8d", -123) #=> " -00000123"
+ * sprintf("%20.8o", -123) #=> " ..777605"
+ * sprintf("%20.8x", -123) #=> " ..ffff85"
+ * sprintf("%20.8b", -11) #=> " ..110101"
+ *
+ * # "0x" and "0b" for `#x' and `#b' is not counted for
+ * # precision but "0" for `#o' is counted. <------>
+ * sprintf("%#20.8d", 123) #=> " 00000123"
+ * sprintf("%#20.8o", 123) #=> " 00000173"
+ * sprintf("%#20.8x", 123) #=> " 0x0000007b"
+ * sprintf("%#20.8b", 123) #=> " 0b01111011"
+ * sprintf("%#20.8d", -123) #=> " -00000123"
+ * sprintf("%#20.8o", -123) #=> " ..777605"
+ * sprintf("%#20.8x", -123) #=> " 0x..ffff85"
+ * sprintf("%#20.8b", -11) #=> " 0b..110101"
+ *
+ * # precision for `e' is number of
+ * # digits after the decimal point <------>
+ * sprintf("%20.8e", 1234.56789) #=> " 1.23456789e+03"
+ *
+ * # precision for `f' is number of
+ * # digits after the decimal point <------>
+ * sprintf("%20.8f", 1234.56789) #=> " 1234.56789000"
+ *
+ * # precision for `g' is number of
+ * # significant digits <------->
+ * sprintf("%20.8g", 1234.56789) #=> " 1234.5679"
+ *
+ * # <------->
+ * sprintf("%20.8g", 123456789) #=> " 1.2345679e+08"
+ *
+ * # precision for `s' is
+ * # maximum number of characters <------>
+ * sprintf("%20.8s", "string test") #=> " string t"
+ *
+ * Examples:
+ *
+ * sprintf("%d %04x", 123, 123) #=> "123 007b"
+ * sprintf("%08b '%4s'", 123, 123) #=> "01111011 ' 123'"
+ * sprintf("%1$*2$s %2$d %1$s", "hello", 8) #=> " hello 8 hello"
+ * sprintf("%1$*2$s %2$d", "hello", -8) #=> "hello -8"
+ * sprintf("%+g:% g:%-g", 1.23, 1.23, 1.23) #=> "+1.23: 1.23:1.23"
+ * sprintf("%u", -123) #=> "-123"
+ *
+ * For more complex formatting, Ruby supports a reference by name.
+ * %<name>s style uses format style, but %{name} style doesn't.
+ *
+ * Exapmles:
+ * sprintf("%<foo>d : %<bar>f", { :foo => 1, :bar => 2 })
+ * #=> 1 : 2.000000
+ * sprintf("%{foo}f", { :foo => 1 })
+ * # => "1f"
+ */
+
+mrb_value
+mrb_f_sprintf(mrb_state *mrb, mrb_value obj)
+{
+ mrb_int argc;
+ mrb_value *argv;
+
+ mrb_get_args(mrb, "*", &argv, &argc);
+
+ if (argc <= 0) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "too few arguments");
+ return mrb_nil_value();
+ }
+ else {
+ return mrb_str_format(mrb, argc - 1, argv + 1, argv[0]);
+ }
+}
+
+mrb_value
+mrb_str_format(mrb_state *mrb, int argc, const mrb_value *argv, mrb_value fmt)
+{
+ const char *p, *end;
+ char *buf;
+ mrb_int blen;
+ mrb_int bsiz;
+ mrb_value result;
+ mrb_int n;
+ mrb_int width;
+ mrb_int prec;
+ int flags = FNONE;
+ int nextarg = 1;
+ int posarg = 0;
+ mrb_value nextvalue;
+ mrb_value str;
+ mrb_value hash = mrb_undef_value();
+
+#define CHECK_FOR_WIDTH(f) \
+ if ((f) & FWIDTH) { \
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "width given twice"); \
+ } \
+ if ((f) & FPREC0) { \
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "width after precision"); \
+ }
+#define CHECK_FOR_FLAGS(f) \
+ if ((f) & FWIDTH) { \
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "flag after width"); \
+ } \
+ if ((f) & FPREC0) { \
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "flag after precision"); \
+ }
+
+ ++argc;
+ --argv;
+ fmt = mrb_str_to_str(mrb, fmt);
+ p = RSTRING_PTR(fmt);
+ end = p + RSTRING_LEN(fmt);
+ blen = 0;
+ bsiz = 120;
+ result = mrb_str_buf_new(mrb, bsiz);
+ buf = RSTRING_PTR(result);
+ memset(buf, 0, bsiz);
+
+ for (; p < end; p++) {
+ const char *t;
+ mrb_sym id = 0;
+
+ for (t = p; t < end && *t != '%'; t++) ;
+ PUSH(p, t - p);
+ if (t >= end)
+ goto sprint_exit; /* end of fmt string */
+
+ p = t + 1; /* skip `%' */
+
+ width = prec = -1;
+ nextvalue = mrb_undef_value();
+
+retry:
+ switch (*p) {
+ default:
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "malformed format string - \\%%S", mrb_str_new(mrb, p, 1));
+ break;
+
+ case ' ':
+ CHECK_FOR_FLAGS(flags);
+ flags |= FSPACE;
+ p++;
+ goto retry;
+
+ case '#':
+ CHECK_FOR_FLAGS(flags);
+ flags |= FSHARP;
+ p++;
+ goto retry;
+
+ case '+':
+ CHECK_FOR_FLAGS(flags);
+ flags |= FPLUS;
+ p++;
+ goto retry;
+
+ case '-':
+ CHECK_FOR_FLAGS(flags);
+ flags |= FMINUS;
+ p++;
+ goto retry;
+
+ case '0':
+ CHECK_FOR_FLAGS(flags);
+ flags |= FZERO;
+ p++;
+ goto retry;
+
+ case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ n = 0;
+ GETNUM(n, width);
+ if (*p == '$') {
+ if (!mrb_undef_p(nextvalue)) {
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "value given twice - %S$", mrb_fixnum_value(n));
+ }
+ nextvalue = GETPOSARG(n);
+ p++;
+ goto retry;
+ }
+ CHECK_FOR_WIDTH(flags);
+ width = n;
+ flags |= FWIDTH;
+ goto retry;
+
+ case '<':
+ case '{': {
+ const char *start = p;
+ char term = (*p == '<') ? '>' : '}';
+ mrb_value symname;
+
+ for (; p < end && *p != term; )
+ p++;
+ if (id) {
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "name%S after <%S>",
+ mrb_str_new(mrb, start, p - start + 1), mrb_sym2str(mrb, id));
+ }
+ symname = mrb_str_new(mrb, start + 1, p - start - 1);
+ id = mrb_intern_str(mrb, symname);
+ nextvalue = GETNAMEARG(mrb_symbol_value(id), start, (int)(p - start + 1));
+ if (mrb_undef_p(nextvalue)) {
+ mrb_raisef(mrb, E_KEY_ERROR, "key%S not found", mrb_str_new(mrb, start, p - start + 1));
+ }
+ if (term == '}') goto format_s;
+ p++;
+ goto retry;
+ }
+
+ case '*':
+ CHECK_FOR_WIDTH(flags);
+ flags |= FWIDTH;
+ GETASTER(width);
+ if (width < 0) {
+ flags |= FMINUS;
+ width = -width;
+ }
+ p++;
+ goto retry;
+
+ case '.':
+ if (flags & FPREC0) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "precision given twice");
+ }
+ flags |= FPREC|FPREC0;
+
+ prec = 0;
+ p++;
+ if (*p == '*') {
+ GETASTER(prec);
+ if (prec < 0) { /* ignore negative precision */
+ flags &= ~FPREC;
+ }
+ p++;
+ goto retry;
+ }
+
+ GETNUM(prec, precision);
+ goto retry;
+
+ case '\n':
+ case '\0':
+ p--;
+ /* fallthrough */
+ case '%':
+ if (flags != FNONE) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid format character - %");
+ }
+ PUSH("%", 1);
+ break;
+
+ case 'c': {
+ mrb_value val = GETARG();
+ mrb_value tmp;
+ char *c;
+
+ tmp = mrb_check_string_type(mrb, val);
+ if (!mrb_nil_p(tmp)) {
+ if (mrb_fixnum(mrb_funcall(mrb, tmp, "size", 0)) != 1 ) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "%c requires a character");
+ }
+ }
+ else if (mrb_fixnum_p(val)) {
+ tmp = mrb_funcall(mrb, val, "chr", 0);
+ }
+ else {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid character");
+ }
+ c = RSTRING_PTR(tmp);
+ n = RSTRING_LEN(tmp);
+ if (!(flags & FWIDTH)) {
+ CHECK(n);
+ memcpy(buf+blen, c, n);
+ blen += n;
+ }
+ else if ((flags & FMINUS)) {
+ CHECK(n);
+ memcpy(buf+blen, c, n);
+ blen += n;
+ FILL(' ', width-1);
+ }
+ else {
+ FILL(' ', width-1);
+ CHECK(n);
+ memcpy(buf+blen, c, n);
+ blen += n;
+ }
+ }
+ break;
+
+ case 's':
+ case 'p':
+ format_s:
+ {
+ mrb_value arg = GETARG();
+ mrb_int len;
+ mrb_int slen;
+
+ if (*p == 'p') arg = mrb_inspect(mrb, arg);
+ str = mrb_obj_as_string(mrb, arg);
+ len = RSTRING_LEN(str);
+ if (RSTRING(result)->flags & MRB_STR_EMBED) {
+ mrb_int tmp_n = len;
+ RSTRING(result)->flags &= ~MRB_STR_EMBED_LEN_MASK;
+ RSTRING(result)->flags |= tmp_n << MRB_STR_EMBED_LEN_SHIFT;
+ } else {
+ RSTRING(result)->as.heap.len = blen;
+ }
+ if (flags&(FPREC|FWIDTH)) {
+ slen = RSTRING_LEN(str);
+ if (slen < 0) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid mbstring sequence");
+ }
+ if ((flags&FPREC) && (prec < slen)) {
+ char *p = RSTRING_PTR(str) + prec;
+ slen = prec;
+ len = p - RSTRING_PTR(str);
+ }
+ /* need to adjust multi-byte string pos */
+ if ((flags&FWIDTH) && (width > slen)) {
+ width -= (int)slen;
+ if (!(flags&FMINUS)) {
+ CHECK(width);
+ while (width--) {
+ buf[blen++] = ' ';
+ }
+ }
+ CHECK(len);
+ memcpy(&buf[blen], RSTRING_PTR(str), len);
+ blen += len;
+ if (flags&FMINUS) {
+ CHECK(width);
+ while (width--) {
+ buf[blen++] = ' ';
+ }
+ }
+ break;
+ }
+ }
+ PUSH(RSTRING_PTR(str), len);
+ }
+ break;
+
+ case 'd':
+ case 'i':
+ case 'o':
+ case 'x':
+ case 'X':
+ case 'b':
+ case 'B':
+ case 'u': {
+ mrb_value val = GETARG();
+ char fbuf[32], nbuf[64], *s;
+ const char *prefix = NULL;
+ int sign = 0, dots = 0;
+ char sc = 0;
+ mrb_int v = 0, org_v = 0;
+ int base;
+ mrb_int len;
+
+ switch (*p) {
+ case 'd':
+ case 'i':
+ case 'u':
+ sign = 1; break;
+ case 'o':
+ case 'x':
+ case 'X':
+ case 'b':
+ case 'B':
+ if (flags&(FPLUS|FSPACE)) sign = 1;
+ break;
+ default:
+ break;
+ }
+ if (flags & FSHARP) {
+ switch (*p) {
+ case 'o': prefix = "0"; break;
+ case 'x': prefix = "0x"; break;
+ case 'X': prefix = "0X"; break;
+ case 'b': prefix = "0b"; break;
+ case 'B': prefix = "0B"; break;
+ default: break;
+ }
+ }
+
+ bin_retry:
+ switch (mrb_type(val)) {
+ case MRB_TT_FLOAT:
+ if (FIXABLE(mrb_float(val))) {
+ val = mrb_fixnum_value((mrb_int)mrb_float(val));
+ goto bin_retry;
+ }
+ val = mrb_flo_to_fixnum(mrb, val);
+ if (mrb_fixnum_p(val)) goto bin_retry;
+ break;
+ case MRB_TT_STRING:
+ val = mrb_str_to_inum(mrb, val, 0, TRUE);
+ goto bin_retry;
+ case MRB_TT_FIXNUM:
+ v = mrb_fixnum(val);
+ break;
+ default:
+ val = mrb_Integer(mrb, val);
+ goto bin_retry;
+ }
+
+ switch (*p) {
+ case 'o':
+ base = 8; break;
+ case 'x':
+ case 'X':
+ base = 16; break;
+ case 'b':
+ case 'B':
+ base = 2; break;
+ case 'u':
+ case 'd':
+ case 'i':
+ default:
+ base = 10; break;
+ }
+
+ if (base == 2) {
+ org_v = v;
+ if (v < 0 && !sign) {
+ val = mrb_fix2binstr(mrb, mrb_fixnum_value(v), base);
+ dots = 1;
+ }
+ else {
+ val = mrb_fixnum_to_str(mrb, mrb_fixnum_value(v), base);
+ }
+ v = mrb_fixnum(mrb_str_to_inum(mrb, val, 10, FALSE));
+ }
+ if (sign) {
+ char c = *p;
+ if (c == 'i') c = 'd'; /* %d and %i are identical */
+ if (base == 2) c = 'd';
+ if (v < 0) {
+ v = -v;
+ sc = '-';
+ width--;
+ }
+ else if (flags & FPLUS) {
+ sc = '+';
+ width--;
+ }
+ else if (flags & FSPACE) {
+ sc = ' ';
+ width--;
+ }
+ snprintf(fbuf, sizeof(fbuf), "%%l%c", c);
+ snprintf(nbuf, sizeof(nbuf), fbuf, v);
+ s = nbuf;
+ }
+ else {
+ char c = *p;
+ if (c == 'X') c = 'x';
+ if (base == 2) c = 'd';
+ s = nbuf;
+ if (v < 0) {
+ dots = 1;
+ }
+ snprintf(fbuf, sizeof(fbuf), "%%l%c", c);
+ snprintf(++s, sizeof(nbuf) - 1, fbuf, v);
+ if (v < 0) {
+ char d;
+
+ s = remove_sign_bits(s, base);
+ switch (base) {
+ case 16: d = 'f'; break;
+ case 8: d = '7'; break;
+ case 2: d = '1'; break;
+ default: d = 0; break;
+ }
+
+ if (d && *s != d) {
+ *--s = d;
+ }
+ }
+ }
+ {
+ size_t size;
+ size = strlen(s);
+ /* PARANOID: assert(size <= MRB_INT_MAX) */
+ len = (mrb_int)size;
+ }
+
+ if (dots) {
+ prec -= 2;
+ width -= 2;
+ }
+
+ if (*p == 'X') {
+ char *pp = s;
+ int c;
+ while ((c = (int)(unsigned char)*pp) != 0) {
+ *pp = toupper(c);
+ pp++;
+ }
+ }
+
+ if (prefix && !prefix[1]) { /* octal */
+ if (dots) {
+ prefix = NULL;
+ }
+ else if (len == 1 && *s == '0') {
+ len = 0;
+ if (flags & FPREC) prec--;
+ }
+ else if ((flags & FPREC) && (prec > len)) {
+ prefix = NULL;
+ }
+ }
+ else if (len == 1 && *s == '0') {
+ prefix = NULL;
+ }
+
+ if (prefix) {
+ size_t size;
+ size = strlen(prefix);
+ /* PARANOID: assert(size <= MRB_INT_MAX).
+ * this check is absolutely paranoid. */
+ width -= (mrb_int)size;
+ }
+
+ if ((flags & (FZERO|FMINUS|FPREC)) == FZERO) {
+ prec = width;
+ width = 0;
+ }
+ else {
+ if (prec < len) {
+ if (!prefix && prec == 0 && len == 1 && *s == '0') len = 0;
+ prec = len;
+ }
+ width -= prec;
+ }
+
+ if (!(flags&FMINUS)) {
+ CHECK(width);
+ while (width-- > 0) {
+ buf[blen++] = ' ';
+ }
+ }
+
+ if (sc) PUSH(&sc, 1);
+
+ if (prefix) {
+ int plen = (int)strlen(prefix);
+ PUSH(prefix, plen);
+ }
+ CHECK(prec - len);
+ if (dots) PUSH("..", 2);
+
+ if (v < 0 || (base == 2 && org_v < 0)) {
+ char c = sign_bits(base, p);
+ while (len < prec--) {
+ buf[blen++] = c;
+ }
+ }
+ else if ((flags & (FMINUS|FPREC)) != FMINUS) {
+ char c = '0';
+ while (len < prec--) {
+ buf[blen++] = c;
+ }
+ }
+
+ PUSH(s, len);
+ CHECK(width);
+ while (width-- > 0) {
+ buf[blen++] = ' ';
+ }
+ }
+ break;
+
+ case 'f':
+ case 'g':
+ case 'G':
+ case 'e':
+ case 'E':
+ case 'a':
+ case 'A': {
+ mrb_value val = GETARG();
+ double fval;
+ int i, need = 6;
+ char fbuf[32];
+
+ fval = mrb_float(mrb_Float(mrb, val));
+ if (!isfinite(fval)) {
+ const char *expr;
+ const int elen = 3;
+
+ if (isnan(fval)) {
+ expr = "NaN";
+ }
+ else {
+ expr = "Inf";
+ }
+ need = elen;
+ if ((!isnan(fval) && fval < 0.0) || (flags & FPLUS))
+ need++;
+ if ((flags & FWIDTH) && need < width)
+ need = width;
+
+ CHECK(need + 1);
+ snprintf(&buf[blen], need + 1, "%*s", need, "");
+ if (flags & FMINUS) {
+ if (!isnan(fval) && fval < 0.0)
+ buf[blen++] = '-';
+ else if (flags & FPLUS)
+ buf[blen++] = '+';
+ else if (flags & FSPACE)
+ blen++;
+ memcpy(&buf[blen], expr, elen);
+ }
+ else {
+ if (!isnan(fval) && fval < 0.0)
+ buf[blen + need - elen - 1] = '-';
+ else if (flags & FPLUS)
+ buf[blen + need - elen - 1] = '+';
+ else if ((flags & FSPACE) && need > width)
+ blen++;
+ memcpy(&buf[blen + need - elen], expr, elen);
+ }
+ blen += strlen(&buf[blen]);
+ break;
+ }
+
+ fmt_setup(fbuf, sizeof(fbuf), *p, flags, width, prec);
+ need = 0;
+ if (*p != 'e' && *p != 'E') {
+ i = INT_MIN;
+ frexp(fval, &i);
+ if (i > 0)
+ need = BIT_DIGITS(i);
+ }
+ need += (flags&FPREC) ? prec : 6;
+ if ((flags&FWIDTH) && need < width)
+ need = width;
+ need += 20;
+
+ CHECK(need);
+ n = snprintf(&buf[blen], need, fbuf, fval);
+ blen += n;
+ }
+ break;
+ }
+ flags = FNONE;
+ }
+
+ sprint_exit:
+#if 0
+ /* XXX - We cannot validate the number of arguments if (digit)$ style used.
+ */
+ if (posarg >= 0 && nextarg < argc) {
+ const char *mesg = "too many arguments for format string";
+ if (mrb_test(ruby_debug)) mrb_raise(mrb, E_ARGUMENT_ERROR, mesg);
+ if (mrb_test(ruby_verbose)) mrb_warn(mrb, "%S", mrb_str_new_cstr(mrb, mesg));
+ }
+#endif
+ mrb_str_resize(mrb, result, blen);
+
+ return result;
+}
+
+static void
+fmt_setup(char *buf, size_t size, int c, int flags, mrb_int width, mrb_int prec)
+{
+ char *end = buf + size;
+ int n;
+
+ *buf++ = '%';
+ if (flags & FSHARP) *buf++ = '#';
+ if (flags & FPLUS) *buf++ = '+';
+ if (flags & FMINUS) *buf++ = '-';
+ if (flags & FZERO) *buf++ = '0';
+ if (flags & FSPACE) *buf++ = ' ';
+
+ if (flags & FWIDTH) {
+ n = snprintf(buf, end - buf, "%d", (int)width);
+ buf += n;
+ }
+
+ if (flags & FPREC) {
+ n = snprintf(buf, end - buf, ".%d", (int)prec);
+ buf += n;
+ }
+
+ *buf++ = c;
+ *buf = '\0';
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-string-ext/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,273 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_string_ext[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0x77,0xa0,0x00,0x00,0x0e,0xa4,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x0d,0xa0,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x37,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0x45,0x00,0x80,0x00,
+0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x53,0x74,
+0x72,0x69,0x6e,0x67,0x00,0x00,0x00,0x01,0x11,0x00,0x01,0x00,0x03,0x00,0x0b,0x00,
+0x00,0x00,0x23,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,
+0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,0x46,0x00,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,0x46,0x40,0x81,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x0c,0x00,0x01,0x46,0x80,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0e,0x00,0x01,
+0x46,0xc0,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,0x46,0x00,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x12,0x00,0x01,0x46,0x40,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x14,0x00,0x01,0x46,0x80,0x82,0x00,0x04,0x05,0x80,0x00,0x29,0x00,0x80,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x05,0x63,0x6c,0x65,0x61,0x72,0x00,
+0x00,0x06,0x6c,0x73,0x74,0x72,0x69,0x70,0x00,0x00,0x06,0x72,0x73,0x74,0x72,0x69,
+0x70,0x00,0x00,0x05,0x73,0x74,0x72,0x69,0x70,0x00,0x00,0x07,0x6c,0x73,0x74,0x72,
+0x69,0x70,0x21,0x00,0x00,0x07,0x72,0x73,0x74,0x72,0x69,0x70,0x21,0x00,0x00,0x06,
+0x73,0x74,0x72,0x69,0x70,0x21,0x00,0x00,0x07,0x63,0x61,0x73,0x65,0x63,0x6d,0x70,
+0x00,0x00,0x09,0x70,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x00,0x00,0x0a,0x72,
+0x70,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x00,0x00,0x06,0x73,0x6c,0x69,0x63,
+0x65,0x21,0x00,0x00,0x00,0x00,0x3b,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00,
+0x05,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x3d,0x00,0x80,0x01,
+0xa0,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x01,0x00,0x07,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x00,0x00,
+0xcf,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x26,0x00,0x00,0x00,
+0x83,0xff,0x3f,0x01,0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,0xaf,0x40,0x00,0x02,
+0x01,0x00,0x81,0x01,0x97,0x01,0x40,0x00,0x01,0x80,0x00,0x02,0xad,0x80,0x00,0x02,
+0x01,0x00,0x01,0x01,0x3d,0x00,0x00,0x02,0x06,0x00,0x80,0x02,0x01,0x80,0x00,0x03,
+0xa0,0x00,0x81,0x02,0xa0,0xc0,0x00,0x02,0x99,0x01,0x40,0x02,0x01,0x80,0x00,0x02,
+0x01,0xc0,0x80,0x02,0xb4,0x40,0x01,0x02,0x98,0xf9,0x3f,0x02,0x01,0xc0,0x00,0x02,
+0x83,0xff,0xbf,0x02,0xb6,0x80,0x01,0x02,0x19,0x03,0x40,0x02,0x06,0x00,0x00,0x02,
+0x01,0x80,0x80,0x02,0x01,0xc0,0x00,0x03,0x41,0x40,0x81,0x02,0xa0,0x00,0x01,0x02,
+0x97,0x00,0x40,0x00,0xbd,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x02,
+0x00,0x00,0x06,0x20,0x0c,0x0a,0x0d,0x09,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
+0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2d,0x00,0x00,0x01,0x2b,0x00,0x00,
+0x08,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x3f,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,
+0x02,0x3c,0x3d,0x00,0x00,0x02,0x3e,0x3d,0x00,0x00,0x00,0x00,0xcc,0x00,0x04,0x00,
+0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x26,0x00,0x00,0x00,0x83,0xff,0x3f,0x01,
+0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,0xaf,0x40,0x00,0x02,0x01,0x00,0x81,0x01,
+0x97,0x01,0x40,0x00,0x01,0xc0,0x00,0x02,0xaf,0x40,0x00,0x02,0x01,0x00,0x81,0x01,
+0x3d,0x00,0x00,0x02,0x06,0x00,0x80,0x02,0x01,0xc0,0x00,0x03,0xa0,0xc0,0x80,0x02,
+0xa0,0x80,0x00,0x02,0x99,0x01,0x40,0x02,0x01,0x80,0x00,0x02,0x01,0xc0,0x80,0x02,
+0xb4,0x00,0x01,0x02,0x98,0xf9,0x3f,0x02,0x01,0xc0,0x00,0x02,0x83,0xff,0xbf,0x02,
+0xb6,0x40,0x01,0x02,0x19,0x03,0x40,0x02,0x06,0x00,0x00,0x02,0x01,0x80,0x80,0x02,
+0x01,0xc0,0x00,0x03,0x41,0x40,0x81,0x02,0xa0,0xc0,0x00,0x02,0x97,0x00,0x40,0x00,
+0xbd,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x20,
+0x0c,0x0a,0x0d,0x09,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x04,0x73,
+0x69,0x7a,0x65,0x00,0x00,0x01,0x2d,0x00,0x00,0x08,0x69,0x6e,0x63,0x6c,0x75,0x64,
+0x65,0x3f,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x02,0x3c,0x3d,0x00,0x00,0x02,0x3e,
+0x3d,0x00,0x00,0x00,0x01,0x11,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x2e,
+0x26,0x00,0x00,0x00,0x83,0xff,0x3f,0x01,0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,
+0xaf,0x40,0x00,0x02,0x01,0x00,0x81,0x01,0x97,0x01,0x40,0x00,0x01,0x80,0x00,0x02,
+0xad,0x80,0x00,0x02,0x01,0x00,0x01,0x01,0x3d,0x00,0x00,0x02,0x06,0x00,0x80,0x02,
+0x01,0x80,0x00,0x03,0xa0,0x00,0x81,0x02,0xa0,0xc0,0x00,0x02,0x99,0x01,0x40,0x02,
+0x01,0x80,0x00,0x02,0x01,0xc0,0x80,0x02,0xb4,0x40,0x01,0x02,0x98,0xf9,0x3f,0x02,
+0x97,0x01,0x40,0x00,0x01,0xc0,0x00,0x02,0xaf,0x40,0x00,0x02,0x01,0x00,0x81,0x01,
+0xbd,0x00,0x00,0x02,0x06,0x00,0x80,0x02,0x01,0xc0,0x00,0x03,0xa0,0x00,0x81,0x02,
+0xa0,0xc0,0x00,0x02,0x99,0x01,0x40,0x02,0x01,0x80,0x00,0x02,0x01,0xc0,0x80,0x02,
+0xb4,0x40,0x01,0x02,0x98,0xf9,0x3f,0x02,0x01,0xc0,0x00,0x02,0x83,0xff,0xbf,0x02,
+0xb6,0x80,0x01,0x02,0x19,0x03,0x40,0x02,0x06,0x00,0x00,0x02,0x01,0x80,0x80,0x02,
+0x01,0xc0,0x00,0x03,0x41,0x40,0x81,0x02,0xa0,0x00,0x01,0x02,0x97,0x00,0x40,0x00,
+0x3d,0x01,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x06,0x20,
+0x0c,0x0a,0x0d,0x09,0x0b,0x00,0x00,0x07,0x20,0x0c,0x0a,0x0d,0x09,0x0b,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2d,
+0x00,0x00,0x01,0x2b,0x00,0x00,0x08,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x3f,0x00,
+0x00,0x02,0x5b,0x5d,0x00,0x00,0x02,0x3c,0x3d,0x00,0x00,0x02,0x3e,0x3d,0x00,0x00,
+0x00,0x00,0x66,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,
+0x26,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x01,0xc0,0x00,0x01,
+0x06,0x00,0x00,0x02,0xb2,0x40,0x80,0x01,0x19,0x01,0xc0,0x01,0x05,0x00,0x80,0x01,
+0x97,0x01,0x40,0x00,0x06,0x00,0x80,0x01,0x01,0x80,0x00,0x02,0xa0,0x80,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x6c,0x73,
+0x74,0x72,0x69,0x70,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x07,0x72,0x65,0x70,0x6c,
+0x61,0x63,0x65,0x00,0x00,0x00,0x00,0x66,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,
+0x00,0x0d,0x00,0x00,0x26,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,
+0x01,0xc0,0x00,0x01,0x06,0x00,0x00,0x02,0xb2,0x40,0x80,0x01,0x19,0x01,0xc0,0x01,
+0x05,0x00,0x80,0x01,0x97,0x01,0x40,0x00,0x06,0x00,0x80,0x01,0x01,0x80,0x00,0x02,
+0xa0,0x80,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x06,0x72,0x73,0x74,0x72,0x69,0x70,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x07,
+0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x00,0x00,0x65,0x00,0x03,0x00,0x06,
+0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x00,0x26,0x00,0x00,0x00,0x06,0x00,0x80,0x01,
+0x20,0x00,0x80,0x01,0x01,0xc0,0x00,0x01,0x06,0x00,0x00,0x02,0xb2,0x40,0x80,0x01,
+0x19,0x01,0xc0,0x01,0x05,0x00,0x80,0x01,0x97,0x01,0x40,0x00,0x06,0x00,0x80,0x01,
+0x01,0x80,0x00,0x02,0xa0,0x80,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x05,0x73,0x74,0x72,0x69,0x70,0x00,0x00,0x02,0x3d,0x3d,
+0x00,0x00,0x07,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x00,0x01,0x02,0x00,
+0x03,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x26,0x00,0x00,0x02,
+0x9a,0x03,0x40,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x01,0x40,0x00,0x02,
+0x20,0x80,0x00,0x02,0x20,0x00,0x00,0x02,0xa0,0x40,0x80,0x01,0x97,0x08,0x40,0x00,
+0x1b,0x00,0x80,0x01,0x91,0x01,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0x00,0x01,0x02,
+0x98,0x00,0x40,0x02,0x17,0x05,0x40,0x00,0x06,0x00,0x80,0x01,0x11,0x03,0x00,0x02,
+0x3d,0x00,0x80,0x02,0x01,0x40,0x00,0x03,0x20,0xc0,0x01,0x03,0x3e,0x80,0x81,0x02,
+0xbd,0x00,0x00,0x03,0x3e,0x80,0x81,0x02,0x20,0x41,0x81,0x01,0x17,0x01,0x40,0x00,
+0x1d,0x00,0x80,0x01,0x1c,0x00,0x80,0x00,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x02,
+0x00,0x00,0x1a,0x6e,0x6f,0x20,0x69,0x6d,0x70,0x6c,0x69,0x63,0x69,0x74,0x20,0x63,
+0x6f,0x6e,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x00,0x00,0x0c,
+0x20,0x69,0x6e,0x74,0x6f,0x20,0x53,0x74,0x72,0x69,0x6e,0x67,0x00,0x00,0x00,0x08,
+0x00,0x08,0x64,0x6f,0x77,0x6e,0x63,0x61,0x73,0x65,0x00,0x00,0x03,0x3c,0x3d,0x3e,
+0x00,0x00,0x06,0x74,0x6f,0x5f,0x73,0x74,0x72,0x00,0x00,0x0d,0x4e,0x6f,0x4d,0x65,
+0x74,0x68,0x6f,0x64,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x3d,0x3d,0x3d,0x00,
+0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,
+0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x00,0x01,0x3f,
+0x00,0x05,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x26,0x00,0x00,0x02,
+0x01,0x40,0x80,0x02,0x91,0x00,0x00,0x03,0xa0,0x00,0x80,0x02,0x99,0x00,0xc0,0x02,
+0x97,0x04,0x40,0x00,0x06,0x00,0x80,0x02,0x91,0x01,0x00,0x03,0x3d,0x00,0x80,0x03,
+0x01,0x40,0x00,0x04,0x20,0x00,0x01,0x04,0x3e,0x00,0x82,0x03,0xbd,0x00,0x00,0x04,
+0x3e,0x00,0x82,0x03,0x20,0x81,0x80,0x02,0x06,0x00,0x80,0x02,0x01,0x40,0x00,0x03,
+0xa0,0x40,0x81,0x02,0x01,0x40,0x81,0x01,0x20,0x80,0x81,0x02,0x99,0x02,0xc0,0x02,
+0x06,0x00,0x80,0x02,0x3d,0x01,0x00,0x03,0x3d,0x01,0x80,0x03,0xb7,0x41,0x81,0x02,
+0x17,0x09,0x40,0x00,0x01,0xc0,0x80,0x02,0x01,0x40,0x00,0x03,0x20,0x00,0x02,0x03,
+0xac,0xc0,0x81,0x02,0x01,0x40,0x01,0x02,0x06,0x00,0x80,0x02,0x83,0xff,0x3f,0x03,
+0x01,0xc0,0x80,0x03,0x20,0x41,0x82,0x02,0x01,0x40,0x00,0x03,0x06,0x00,0x80,0x03,
+0x01,0x00,0x01,0x04,0x06,0x00,0x80,0x04,0x20,0x00,0x82,0x04,0x01,0x00,0x01,0x05,
+0xae,0x80,0x82,0x04,0x20,0x41,0x82,0x03,0xb7,0x41,0x81,0x02,0x29,0x00,0x80,0x02,
+0x00,0x00,0x00,0x03,0x00,0x00,0x0f,0x74,0x79,0x70,0x65,0x20,0x6d,0x69,0x73,0x6d,
+0x61,0x74,0x63,0x68,0x3a,0x20,0x00,0x00,0x06,0x20,0x67,0x69,0x76,0x65,0x6e,0x00,
+0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x05,0x69,0x73,0x5f,0x61,0x3f,0x00,0x00,0x06,
+0x53,0x74,0x72,0x69,0x6e,0x67,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,
+0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,
+0x73,0x73,0x00,0x00,0x05,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x04,0x6e,0x69,0x6c,
+0x3f,0x00,0x00,0x01,0x2b,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x05,0x73,
+0x6c,0x69,0x63,0x65,0x00,0x00,0x01,0x2d,0x00,0x00,0x00,0x01,0x40,0x00,0x05,0x00,
+0x0c,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x02,
+0x91,0x00,0x00,0x03,0xa0,0x00,0x80,0x02,0x99,0x00,0xc0,0x02,0x97,0x04,0x40,0x00,
+0x06,0x00,0x80,0x02,0x91,0x01,0x00,0x03,0x3d,0x00,0x80,0x03,0x01,0x40,0x00,0x04,
+0x20,0x00,0x01,0x04,0x3e,0x00,0x82,0x03,0xbd,0x00,0x00,0x04,0x3e,0x00,0x82,0x03,
+0x20,0x81,0x80,0x02,0x06,0x00,0x80,0x02,0x01,0x40,0x00,0x03,0xa0,0x40,0x81,0x02,
+0x01,0x40,0x81,0x01,0x20,0x80,0x81,0x02,0x99,0x02,0xc0,0x02,0x3d,0x01,0x80,0x02,
+0x3d,0x01,0x00,0x03,0x06,0x00,0x80,0x03,0xb7,0x41,0x81,0x02,0x17,0x09,0x40,0x00,
+0x01,0xc0,0x80,0x02,0x01,0x40,0x00,0x03,0x20,0x00,0x02,0x03,0xac,0xc0,0x81,0x02,
+0x01,0x40,0x01,0x02,0x06,0x00,0x80,0x02,0x83,0xff,0x3f,0x03,0x01,0xc0,0x80,0x03,
+0x20,0x41,0x82,0x02,0x01,0x40,0x00,0x03,0x06,0x00,0x80,0x03,0x01,0x00,0x01,0x04,
+0x06,0x00,0x80,0x04,0x20,0x00,0x82,0x04,0x01,0x00,0x01,0x05,0xae,0x80,0x82,0x04,
+0x20,0x41,0x82,0x03,0xb7,0x41,0x81,0x02,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x03,
+0x00,0x00,0x0f,0x74,0x79,0x70,0x65,0x20,0x6d,0x69,0x73,0x6d,0x61,0x74,0x63,0x68,
+0x3a,0x20,0x00,0x00,0x06,0x20,0x67,0x69,0x76,0x65,0x6e,0x00,0x00,0x00,0x00,0x00,
+0x00,0x0b,0x00,0x05,0x69,0x73,0x5f,0x61,0x3f,0x00,0x00,0x06,0x53,0x74,0x72,0x69,
+0x6e,0x67,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,
+0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,
+0x06,0x72,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,0x00,
+0x01,0x2b,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x05,0x73,0x6c,0x69,0x63,
+0x65,0x00,0x00,0x01,0x2d,0x00,0x00,0x00,0x04,0xd4,0x00,0x0b,0x00,0x10,0x00,0x00,
+0x00,0x00,0x01,0x08,0x26,0x00,0x10,0x02,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,
+0x05,0x00,0x00,0x01,0x01,0x40,0x80,0x05,0x05,0x00,0x00,0x06,0xb2,0x00,0x80,0x05,
+0x99,0x01,0xc0,0x05,0x01,0x80,0x80,0x05,0x05,0x00,0x00,0x06,0xb2,0x00,0x80,0x05,
+0x99,0x01,0xc0,0x05,0x06,0x00,0x80,0x05,0x3d,0x00,0x00,0x06,0xa0,0x40,0x80,0x05,
+0x01,0x40,0x80,0x05,0x05,0x00,0x00,0x06,0xa0,0x80,0x80,0x05,0x99,0x01,0xc0,0x05,
+0x01,0x80,0x80,0x05,0x05,0x00,0x00,0x06,0xa0,0x80,0x80,0x05,0x19,0x10,0xc0,0x05,
+0x01,0x40,0x00,0x02,0x01,0x40,0x80,0x05,0x83,0xff,0x3f,0x06,0xb3,0xc0,0x80,0x05,
+0x99,0x02,0xc0,0x05,0x01,0x00,0x81,0x05,0x06,0x00,0x00,0x06,0x20,0x00,0x01,0x06,
+0xac,0x40,0x81,0x05,0x01,0xc0,0x02,0x02,0x01,0x00,0x81,0x05,0x83,0xff,0x3f,0x06,
+0xb6,0x80,0x81,0x05,0x19,0x02,0xc0,0x05,0x01,0x00,0x81,0x05,0x06,0x00,0x00,0x06,
+0x20,0x00,0x01,0x06,0xb4,0xc0,0x81,0x05,0x99,0x01,0xc0,0x05,0x01,0x80,0x80,0x05,
+0x83,0xff,0x3f,0x06,0xb5,0x00,0x82,0x05,0x19,0x03,0xc0,0x05,0x06,0x00,0x80,0x05,
+0x01,0x00,0x01,0x06,0x01,0x80,0x80,0x06,0x20,0x41,0x82,0x05,0x01,0xc0,0x82,0x02,
+0x17,0x01,0x40,0x00,0x05,0x00,0x80,0x05,0x29,0x00,0x80,0x05,0x97,0x20,0x40,0x00,
+0x08,0x00,0x00,0x03,0x01,0x40,0x80,0x05,0x91,0x05,0x00,0x06,0xa0,0x80,0x82,0x05,
+0x19,0x0d,0xc0,0x05,0x01,0x40,0x80,0x05,0x20,0x00,0x83,0x05,0x01,0xc0,0x82,0x03,
+0x01,0x40,0x80,0x05,0x20,0x40,0x83,0x05,0x01,0xc0,0x02,0x04,0x01,0xc0,0x81,0x05,
+0x83,0xff,0x3f,0x06,0xb3,0xc0,0x80,0x05,0x99,0x02,0xc0,0x05,0x01,0xc0,0x81,0x05,
+0x06,0x00,0x00,0x06,0x20,0x00,0x01,0x06,0xac,0x40,0x81,0x05,0x01,0xc0,0x82,0x03,
+0x01,0x00,0x82,0x05,0x83,0xff,0x3f,0x06,0xb3,0xc0,0x80,0x05,0x99,0x02,0xc0,0x05,
+0x01,0x00,0x82,0x05,0x06,0x00,0x00,0x06,0x20,0x00,0x01,0x06,0xac,0x40,0x81,0x05,
+0x01,0xc0,0x02,0x04,0x07,0x00,0x00,0x03,0x17,0x0d,0x40,0x00,0x01,0x40,0x80,0x05,
+0x11,0x07,0x00,0x06,0xa0,0x80,0x82,0x05,0x19,0x01,0xc0,0x05,0x07,0x00,0x00,0x03,
+0x17,0x0a,0x40,0x00,0x01,0x40,0x00,0x02,0x01,0x40,0x80,0x05,0x83,0xff,0x3f,0x06,
+0xb3,0xc0,0x80,0x05,0x99,0x02,0xc0,0x05,0x01,0x00,0x81,0x05,0x06,0x00,0x00,0x06,
+0x20,0x00,0x01,0x06,0xac,0x40,0x81,0x05,0x01,0xc0,0x02,0x02,0x01,0x00,0x81,0x05,
+0x83,0xff,0x3f,0x06,0xb6,0x80,0x81,0x05,0x19,0x02,0xc0,0x05,0x01,0x40,0x80,0x05,
+0x06,0x00,0x00,0x06,0x20,0x00,0x01,0x06,0xb3,0xc0,0x80,0x05,0x99,0x00,0xc0,0x05,
+0x07,0x00,0x00,0x03,0x99,0x02,0x40,0x03,0x06,0x00,0x80,0x05,0x01,0x40,0x00,0x06,
+0xa0,0x40,0x82,0x05,0x01,0xc0,0x82,0x02,0x17,0x01,0x40,0x00,0x05,0x00,0x80,0x05,
+0x29,0x00,0x80,0x05,0x01,0x40,0x81,0x05,0x05,0x00,0x00,0x06,0xb2,0x00,0x80,0x05,
+0x98,0x01,0xc0,0x05,0x01,0x40,0x81,0x05,0xbd,0x00,0x00,0x06,0xb2,0x00,0x80,0x05,
+0x99,0x00,0xc0,0x05,0x17,0x43,0x40,0x00,0x01,0x40,0x80,0x05,0x05,0x00,0x00,0x06,
+0xa0,0x80,0x80,0x05,0x99,0x01,0xc0,0x05,0x01,0x80,0x80,0x05,0x05,0x00,0x00,0x06,
+0xa0,0x80,0x80,0x05,0x19,0x0d,0xc0,0x05,0x01,0x40,0x80,0x05,0x83,0xff,0x3f,0x06,
+0xb6,0x80,0x81,0x05,0x19,0x01,0xc0,0x05,0x01,0x40,0x80,0x05,0x17,0x02,0x40,0x00,
+0x06,0x00,0x80,0x05,0x20,0x00,0x81,0x05,0x01,0x40,0x00,0x06,0xac,0x40,0x81,0x05,
+0x01,0xc0,0x02,0x02,0x06,0x00,0x80,0x05,0x83,0xff,0x3f,0x06,0x01,0x00,0x81,0x06,
+0xc1,0x00,0x03,0x06,0xa0,0x40,0x82,0x05,0x06,0x00,0x00,0x06,0x01,0x00,0x81,0x06,
+0x01,0x80,0x00,0x07,0xac,0x40,0x81,0x06,0x03,0xff,0x3f,0x07,0x41,0x40,0x83,0x06,
+0xa0,0x40,0x02,0x06,0xac,0x40,0x81,0x05,0x01,0xc0,0x82,0x04,0x17,0x2e,0x40,0x00,
+0x01,0x40,0x80,0x05,0x91,0x05,0x00,0x06,0xa0,0x80,0x82,0x05,0x19,0x12,0xc0,0x05,
+0x01,0xc0,0x81,0x05,0x83,0xff,0x3f,0x06,0xb6,0x80,0x81,0x05,0x19,0x01,0xc0,0x05,
+0x01,0xc0,0x81,0x05,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x05,0x20,0x00,0x81,0x05,
+0x01,0xc0,0x01,0x06,0xac,0x40,0x81,0x05,0x01,0xc0,0x02,0x02,0x01,0x00,0x82,0x05,
+0x83,0xff,0x3f,0x06,0xb6,0x80,0x81,0x05,0x19,0x01,0xc0,0x05,0x01,0x00,0x82,0x05,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x05,0x20,0x00,0x81,0x05,0x01,0x00,0x02,0x06,
+0xac,0x40,0x81,0x05,0x01,0xc0,0x02,0x05,0x06,0x00,0x80,0x05,0x83,0xff,0x3f,0x06,
+0x01,0x00,0x81,0x06,0xc1,0x00,0x03,0x06,0xa0,0x40,0x82,0x05,0x06,0x00,0x00,0x06,
+0x01,0x80,0x82,0x06,0xad,0x40,0x81,0x06,0x03,0xff,0x3f,0x07,0x41,0x40,0x83,0x06,
+0xa0,0x40,0x02,0x06,0xac,0x40,0x81,0x05,0x01,0xc0,0x82,0x04,0x17,0x1a,0x40,0x00,
+0x01,0x40,0x80,0x05,0x11,0x07,0x00,0x06,0xa0,0x80,0x82,0x05,0x19,0x0c,0xc0,0x05,
+0x06,0x00,0x80,0x05,0x01,0x40,0x00,0x06,0xa0,0xc0,0x83,0x05,0x01,0xc0,0x02,0x02,
+0x05,0x00,0x00,0x06,0xb2,0x00,0x80,0x05,0x99,0x00,0xc0,0x05,0x97,0x07,0x40,0x00,
+0x06,0x00,0x80,0x05,0x83,0xff,0x3f,0x06,0x01,0x00,0x81,0x06,0xc1,0x00,0x03,0x06,
+0xa0,0x40,0x82,0x05,0x06,0x00,0x00,0x06,0x01,0x00,0x81,0x06,0x01,0x40,0x00,0x07,
+0x20,0x00,0x01,0x07,0xac,0x40,0x81,0x06,0x03,0xff,0x3f,0x07,0x41,0x40,0x83,0x06,
+0xa0,0x40,0x02,0x06,0xac,0x40,0x81,0x05,0x01,0xc0,0x82,0x04,0x17,0x0c,0x40,0x00,
+0x01,0x40,0x80,0x05,0x83,0xff,0x3f,0x06,0xb6,0x80,0x81,0x05,0x19,0x01,0xc0,0x05,
+0x01,0x40,0x80,0x05,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x05,0x20,0x00,0x81,0x05,
+0x01,0x40,0x00,0x06,0xac,0x40,0x81,0x05,0x01,0xc0,0x02,0x02,0x06,0x00,0x80,0x05,
+0x83,0xff,0x3f,0x06,0x01,0x00,0x81,0x06,0xc1,0x00,0x03,0x06,0xa0,0x40,0x82,0x05,
+0x06,0x00,0x00,0x06,0x01,0x00,0x81,0x06,0xad,0x40,0x81,0x06,0x03,0xff,0x3f,0x07,
+0x41,0x40,0x83,0x06,0xa0,0x40,0x02,0x06,0xac,0x40,0x81,0x05,0x01,0xc0,0x82,0x04,
+0x01,0x40,0x82,0x05,0x05,0x00,0x00,0x06,0xb2,0x00,0x80,0x05,0x99,0x00,0xc0,0x05,
+0x97,0x01,0x40,0x00,0x06,0x00,0x80,0x05,0x01,0x40,0x02,0x06,0xa0,0x00,0x84,0x05,
+0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x24,0x77,0x72,0x6f,0x6e,0x67,
+0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,
+0x65,0x6e,0x74,0x73,0x20,0x28,0x66,0x6f,0x72,0x20,0x31,0x2e,0x2e,0x32,0x29,0x00,
+0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x02,0x3d,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,
+0x73,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x01,0x3c,0x00,0x00,0x04,0x73,0x69,
+0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x3e,0x3d,0x00,0x00,0x02,0x3c,0x3d,
+0x00,0x00,0x01,0x3e,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x08,0x6b,0x69,0x6e,0x64,
+0x5f,0x6f,0x66,0x3f,0x00,0x00,0x05,0x52,0x61,0x6e,0x67,0x65,0x00,0x00,0x05,0x62,
+0x65,0x67,0x69,0x6e,0x00,0x00,0x03,0x65,0x6e,0x64,0x00,0x00,0x06,0x53,0x74,0x72,
+0x69,0x6e,0x67,0x00,0x00,0x05,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x07,0x72,0x65,
+0x70,0x6c,0x61,0x63,0x65,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x00,0xe6,0x00,0x00,
+0x00,0x0f,0x00,0x01,0x61,0x00,0x01,0x7a,0x00,0x01,0x73,0x00,0x03,0x73,0x74,0x72,
+0x00,0x03,0x73,0x65,0x70,0x00,0x01,0x6e,0x00,0x01,0x6d,0x00,0x04,0x61,0x72,0x67,
+0x31,0x00,0x04,0x61,0x72,0x67,0x32,0x00,0x03,0x69,0x64,0x78,0x00,0x09,0x76,0x61,
+0x6c,0x69,0x64,0x61,0x74,0x65,0x64,0x00,0x03,0x62,0x65,0x67,0x00,0x02,0x65,0x64,
+0x00,0x04,0x73,0x74,0x72,0x32,0x00,0x04,0x69,0x64,0x78,0x32,0xff,0xff,0x00,0x00,
+0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x03,0xff,0xff,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x03,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x01,0x00,0x03,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x02,0xff,0xff,0x00,0x00,
+0x00,0x02,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x03,0x00,0x01,
+0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x05,0x00,0x03,
+0x00,0x06,0x00,0x04,0x00,0x04,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x05,0x00,0x03,
+0x00,0x06,0x00,0x04,0x00,0x07,0x00,0x01,0x00,0x08,0x00,0x02,0xff,0xff,0x00,0x00,
+0x00,0x09,0x00,0x04,0x00,0x03,0x00,0x05,0x00,0x0a,0x00,0x06,0x00,0x0b,0x00,0x07,
+0x00,0x0c,0x00,0x08,0x00,0x0d,0x00,0x09,0x00,0x0e,0x00,0x0a,0x45,0x4e,0x44,0x00,
+0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_string_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_string_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_string_ext_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_mruby_string_ext_gem_init(mrb);
+ mrb_load_irep(mrb, gem_mrblib_irep_mruby_string_ext);
+ if (mrb->exc) {
+ mrb_print_error(mrb);
+ exit(EXIT_FAILURE);
+ }
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_string_ext_gem_final(mrb_state *mrb) {
+ mrb_mruby_string_ext_gem_final(mrb);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-string-ext/string.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,361 @@
+#include <ctype.h>
+#include <string.h>
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/string.h"
+
+static mrb_value
+mrb_str_getbyte(mrb_state *mrb, mrb_value str)
+{
+ mrb_int pos;
+ mrb_get_args(mrb, "i", &pos);
+
+ if (pos < 0)
+ pos += RSTRING_LEN(str);
+ if (pos < 0 || RSTRING_LEN(str) <= pos)
+ return mrb_nil_value();
+
+ return mrb_fixnum_value((unsigned char)RSTRING_PTR(str)[pos]);
+}
+
+/*
+ * call-seq:
+ * str.swapcase! -> str or nil
+ *
+ * Equivalent to <code>String#swapcase</code>, but modifies the receiver in
+ * place, returning <i>str</i>, or <code>nil</code> if no changes were made.
+ * Note: case conversion is effective only in ASCII region.
+ */
+static mrb_value
+mrb_str_swapcase_bang(mrb_state *mrb, mrb_value str)
+{
+ char *p, *pend;
+ int modify = 0;
+ struct RString *s = mrb_str_ptr(str);
+
+ mrb_str_modify(mrb, s);
+ p = RSTRING_PTR(str);
+ pend = p + RSTRING_LEN(str);
+ while (p < pend) {
+ if (ISUPPER(*p)) {
+ *p = TOLOWER(*p);
+ modify = 1;
+ }
+ else if (ISLOWER(*p)) {
+ *p = TOUPPER(*p);
+ modify = 1;
+ }
+ p++;
+ }
+
+ if (modify) return str;
+ return mrb_nil_value();
+}
+
+/*
+ * call-seq:
+ * str.swapcase -> new_str
+ *
+ * Returns a copy of <i>str</i> with uppercase alphabetic characters converted
+ * to lowercase and lowercase characters converted to uppercase.
+ * Note: case conversion is effective only in ASCII region.
+ *
+ * "Hello".swapcase #=> "hELLO"
+ * "cYbEr_PuNk11".swapcase #=> "CyBeR_pUnK11"
+ */
+static mrb_value
+mrb_str_swapcase(mrb_state *mrb, mrb_value self)
+{
+ mrb_value str;
+
+ str = mrb_str_dup(mrb, self);
+ mrb_str_swapcase_bang(mrb, str);
+ return str;
+}
+
+/*
+ * call-seq:
+ * str << integer -> str
+ * str.concat(integer) -> str
+ * str << obj -> str
+ * str.concat(obj) -> str
+ *
+ * Append---Concatenates the given object to <i>str</i>. If the object is a
+ * <code>Integer</code>, it is considered as a codepoint, and is converted
+ * to a character before concatenation.
+ *
+ * a = "hello "
+ * a << "world" #=> "hello world"
+ * a.concat(33) #=> "hello world!"
+ */
+static mrb_value
+mrb_str_concat2(mrb_state *mrb, mrb_value self)
+{
+ mrb_value str;
+ mrb_get_args(mrb, "S", &str);
+ mrb_str_concat(mrb, self, str);
+ return self;
+}
+
+/*
+ * call-seq:
+ * str.start_with?([prefixes]+) -> true or false
+ *
+ * Returns true if +str+ starts with one of the +prefixes+ given.
+ *
+ * "hello".start_with?("hell") #=> true
+ *
+ * # returns true if one of the prefixes matches.
+ * "hello".start_with?("heaven", "hell") #=> true
+ * "hello".start_with?("heaven", "paradise") #=> false
+ * "h".start_with?("heaven", "hell") #=> false
+ */
+static mrb_value
+mrb_str_start_with(mrb_state *mrb, mrb_value self)
+{
+ mrb_value *argv, sub;
+ mrb_int argc, i;
+ mrb_get_args(mrb, "*", &argv, &argc);
+
+ for (i = 0; i < argc; i++) {
+ size_t len_l, len_r;
+ int ai = mrb_gc_arena_save(mrb);
+ sub = mrb_string_type(mrb, argv[i]);
+ mrb_gc_arena_restore(mrb, ai);
+ len_l = RSTRING_LEN(self);
+ len_r = RSTRING_LEN(sub);
+ if (len_l >= len_r) {
+ if (memcmp(RSTRING_PTR(self), RSTRING_PTR(sub), len_r) == 0) {
+ return mrb_true_value();
+ }
+ }
+ }
+ return mrb_false_value();
+}
+
+/*
+ * call-seq:
+ * str.end_with?([suffixes]+) -> true or false
+ *
+ * Returns true if +str+ ends with one of the +suffixes+ given.
+ */
+static mrb_value
+mrb_str_end_with(mrb_state *mrb, mrb_value self)
+{
+ mrb_value *argv, sub;
+ mrb_int argc, i;
+ mrb_get_args(mrb, "*", &argv, &argc);
+
+ for (i = 0; i < argc; i++) {
+ size_t len_l, len_r;
+ int ai = mrb_gc_arena_save(mrb);
+ sub = mrb_string_type(mrb, argv[i]);
+ mrb_gc_arena_restore(mrb, ai);
+ len_l = RSTRING_LEN(self);
+ len_r = RSTRING_LEN(sub);
+ if (len_l >= len_r) {
+ if (memcmp(RSTRING_PTR(self) + (len_l - len_r),
+ RSTRING_PTR(sub),
+ len_r) == 0) {
+ return mrb_true_value();
+ }
+ }
+ }
+ return mrb_false_value();
+}
+
+static mrb_value
+mrb_str_hex(mrb_state *mrb, mrb_value self)
+{
+ return mrb_str_to_inum(mrb, self, 16, FALSE);
+}
+
+static mrb_value
+mrb_str_oct(mrb_state *mrb, mrb_value self)
+{
+ return mrb_str_to_inum(mrb, self, 8, FALSE);
+}
+
+/*
+ * call-seq:
+ * string.chr -> string
+ *
+ * Returns a one-character string at the beginning of the string.
+ *
+ * a = "abcde"
+ * a.chr #=> "a"
+ */
+static mrb_value
+mrb_str_chr(mrb_state *mrb, mrb_value self)
+{
+ return mrb_str_substr(mrb, self, 0, 1);
+}
+
+/*
+ * call-seq:
+ * string.lines -> array of string
+ *
+ * Returns strings per line;
+ *
+ * a = "abc\ndef"
+ * a.lines #=> ["abc\n", "def"]
+ */
+static mrb_value
+mrb_str_lines(mrb_state *mrb, mrb_value self)
+{
+ mrb_value result;
+ mrb_value blk;
+ int ai;
+ mrb_int len;
+ mrb_value arg;
+ char *p = RSTRING_PTR(self), *t;
+ char *e = p + RSTRING_LEN(self);
+
+ mrb_get_args(mrb, "&", &blk);
+
+ result = mrb_ary_new(mrb);
+
+ if (!mrb_nil_p(blk)) {
+ while (p < e) {
+ t = p;
+ while (p < e && *p != '\n') p++;
+ if (*p == '\n') p++;
+ len = (mrb_int) (p - t);
+ arg = mrb_str_new(mrb, t, len);
+ mrb_yield_argv(mrb, blk, 1, &arg);
+ }
+ return self;
+ }
+ while (p < e) {
+ ai = mrb_gc_arena_save(mrb);
+ t = p;
+ while (p < e && *p != '\n') p++;
+ if (*p == '\n') p++;
+ len = (mrb_int) (p - t);
+ mrb_ary_push(mrb, result, mrb_str_new(mrb, t, len));
+ mrb_gc_arena_restore(mrb, ai);
+ }
+ return result;
+}
+
+/*
+ * call-seq:
+ * string.succ -> string
+ *
+ * Returns next sequence of the string;
+ *
+ * a = "abc"
+ * a.succ #=> "abd"
+ */
+static mrb_value
+mrb_str_succ_bang(mrb_state *mrb, mrb_value self)
+{
+ mrb_value result;
+ unsigned char *p, *e, *b, *t;
+ char *prepend;
+ struct RString *s = mrb_str_ptr(self);
+ size_t l;
+
+ if (RSTRING_LEN(self) == 0)
+ return self;
+
+ mrb_str_modify(mrb, s);
+ l = RSTRING_LEN(self);
+ b = p = (unsigned char*) RSTRING_PTR(self);
+ t = e = p + l;
+ *(e--) = 0;
+
+ // find trailing ascii/number
+ while (e >= b) {
+ if (ISALNUM(*e))
+ break;
+ e--;
+ }
+ if (e < b) {
+ e = p + l - 1;
+ result = mrb_str_new_lit(mrb, "");
+ } else {
+ // find leading letter of the ascii/number
+ b = e;
+ while (b > p) {
+ if (!ISALNUM(*b) || (ISALNUM(*b) && *b != '9' && *b != 'z' && *b != 'Z'))
+ break;
+ b--;
+ }
+ if (!ISALNUM(*b))
+ b++;
+ result = mrb_str_new(mrb, (char*) p, b - p);
+ }
+
+ while (e >= b) {
+ if (!ISALNUM(*e)) {
+ if (*e == 0xff) {
+ mrb_str_cat_lit(mrb, result, "\x01");
+ (*e) = 0;
+ } else
+ (*e)++;
+ break;
+ }
+ prepend = NULL;
+ if (*e == '9') {
+ if (e == b) prepend = "1";
+ *e = '0';
+ } else if (*e == 'z') {
+ if (e == b) prepend = "a";
+ *e = 'a';
+ } else if (*e == 'Z') {
+ if (e == b) prepend = "A";
+ *e = 'A';
+ } else {
+ (*e)++;
+ break;
+ }
+ if (prepend) mrb_str_cat_cstr(mrb, result, prepend);
+ e--;
+ }
+ result = mrb_str_cat(mrb, result, (char*) b, t - b);
+ l = RSTRING_LEN(result);
+ mrb_str_resize(mrb, self, l);
+ memcpy(RSTRING_PTR(self), RSTRING_PTR(result), l);
+ return self;
+}
+
+static mrb_value
+mrb_str_succ(mrb_state *mrb, mrb_value self)
+{
+ mrb_value str;
+
+ str = mrb_str_dup(mrb, self);
+ mrb_str_succ_bang(mrb, str);
+ return str;
+}
+
+void
+mrb_mruby_string_ext_gem_init(mrb_state* mrb)
+{
+ struct RClass * s = mrb->string_class;
+
+ mrb_define_method(mrb, s, "dump", mrb_str_dump, MRB_ARGS_NONE());
+ mrb_define_method(mrb, s, "getbyte", mrb_str_getbyte, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, s, "swapcase!", mrb_str_swapcase_bang, MRB_ARGS_NONE());
+ mrb_define_method(mrb, s, "swapcase", mrb_str_swapcase, MRB_ARGS_NONE());
+ mrb_define_method(mrb, s, "concat", mrb_str_concat2, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, s, "<<", mrb_str_concat2, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, s, "start_with?", mrb_str_start_with, MRB_ARGS_REST());
+ mrb_define_method(mrb, s, "end_with?", mrb_str_end_with, MRB_ARGS_REST());
+ mrb_define_method(mrb, s, "hex", mrb_str_hex, MRB_ARGS_NONE());
+ mrb_define_method(mrb, s, "oct", mrb_str_oct, MRB_ARGS_NONE());
+ mrb_define_method(mrb, s, "chr", mrb_str_chr, MRB_ARGS_NONE());
+ mrb_define_method(mrb, s, "lines", mrb_str_lines, MRB_ARGS_NONE());
+ mrb_define_method(mrb, s, "succ", mrb_str_succ, MRB_ARGS_NONE());
+ mrb_define_method(mrb, s, "succ!", mrb_str_succ_bang, MRB_ARGS_NONE());
+ mrb_alias_method(mrb, s, mrb_intern_lit(mrb, "next"), mrb_intern_lit(mrb, "succ"));
+ mrb_alias_method(mrb, s, mrb_intern_lit(mrb, "next!"), mrb_intern_lit(mrb, "succ!"));
+}
+
+void
+mrb_mruby_string_ext_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-struct/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,89 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_struct[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0xc8,0x02,0x00,0x00,0x03,0x27,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x02,0xb9,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x69,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x0b,
+0x11,0x00,0x80,0x00,0x04,0x01,0x00,0x01,0xa0,0x40,0x80,0x00,0x99,0x02,0xc0,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x80,0x80,0x00,0x45,0x00,0x80,0x00,
+0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x06,0x4f,0x62,0x6a,0x65,0x63,0x74,0x00,0x00,0x0e,0x63,
+0x6f,0x6e,0x73,0x74,0x5f,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x3f,0x00,0x00,0x06,
+0x53,0x74,0x72,0x75,0x63,0x74,0x00,0x00,0x00,0x00,0x62,0x00,0x01,0x00,0x03,0x00,
+0x03,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,
+0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,0x04,0x01,0x80,0x00,
+0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x09,0x65,0x61,0x63,0x68,0x5f,0x70,0x61,0x69,0x72,0x00,0x00,
+0x06,0x73,0x65,0x6c,0x65,0x63,0x74,0x00,0x00,0x00,0x00,0x53,0x00,0x02,0x00,0x04,
+0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x01,
+0x20,0x00,0x00,0x01,0x20,0x40,0x00,0x01,0x40,0x01,0x80,0x01,0x21,0x80,0x00,0x01,
+0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x07,0x6d,0x65,0x6d,0x62,0x65,0x72,
+0x73,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x42,0x00,0x03,0x00,
+0x07,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x00,0x00,0x53,0x00,0x02,0x00,0x04,
+0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x01,
+0x20,0x00,0x00,0x01,0x20,0x40,0x00,0x01,0x40,0x01,0x80,0x01,0x21,0x80,0x00,0x01,
+0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x07,0x6d,0x65,0x6d,0x62,0x65,0x72,
+0x73,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x53,0x00,0x03,0x00,
+0x08,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,
+0x01,0x40,0x00,0x02,0x20,0x40,0x00,0x02,0x06,0x00,0x80,0x02,0x01,0x40,0x00,0x03,
+0xa0,0x80,0x80,0x02,0x20,0x01,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x06,0x74,0x6f,0x5f,
+0x73,0x79,0x6d,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x00,0x00,0x53,0x00,0x03,0x00,
+0x05,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0xa6,0x00,0x00,0x00,0x37,0xc0,0x00,0x01,
+0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x20,0x40,0x80,0x01,0x40,0x01,0x00,0x02,
+0x21,0x80,0x80,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x07,0x6d,0x65,0x6d,0x62,0x65,0x72,
+0x73,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x69,0x00,0x04,0x00,
+0x07,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x26,0x00,0x00,0x02,0x06,0x00,0x00,0x02,
+0x01,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,0x01,0x00,0x81,0x01,0x15,0x40,0x00,0x02,
+0x01,0xc0,0x80,0x02,0xa0,0x40,0x00,0x02,0x19,0x02,0x40,0x02,0x15,0x80,0x00,0x02,
+0x01,0xc0,0x80,0x02,0xa0,0x80,0x00,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x5b,0x5d,
+0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x4c,
+0x56,0x41,0x52,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x04,0x00,0x05,0x62,0x6c,0x6f,
+0x63,0x6b,0x00,0x05,0x66,0x69,0x65,0x6c,0x64,0x00,0x03,0x61,0x72,0x79,0x00,0x03,
+0x76,0x61,0x6c,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x00,0x00,
+0x00,0x00,0x01,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
+0x02,0x00,0x02,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,0x00,0x03,0x45,
+0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_struct_gem_init(mrb_state *mrb);
+void mrb_mruby_struct_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_struct_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_mruby_struct_gem_init(mrb);
+ mrb_load_irep(mrb, gem_mrblib_irep_mruby_struct);
+ if (mrb->exc) {
+ mrb_print_error(mrb);
+ exit(EXIT_FAILURE);
+ }
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_struct_gem_final(mrb_state *mrb) {
+ mrb_mruby_struct_gem_final(mrb);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-struct/struct.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,864 @@
+/*
+** struct.c - Struct class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <ctype.h>
+#include <string.h>
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/string.h"
+#include "mruby/class.h"
+#include "mruby/variable.h"
+#include "mruby/hash.h"
+#include "mruby/range.h"
+
+#define RSTRUCT_LEN(st) mrb_ary_ptr(st)->len
+#define RSTRUCT_PTR(st) mrb_ary_ptr(st)->ptr
+
+static struct RClass *
+struct_class(mrb_state *mrb)
+{
+ return mrb_class_get(mrb, "Struct");
+}
+
+static inline mrb_value
+struct_ivar_get(mrb_state *mrb, mrb_value c, mrb_sym id)
+{
+ struct RClass* kclass;
+ struct RClass* sclass = struct_class(mrb);
+ mrb_value ans;
+
+ for (;;) {
+ ans = mrb_iv_get(mrb, c, id);
+ if (!mrb_nil_p(ans)) return ans;
+ kclass = RCLASS_SUPER(c);
+ if (kclass == 0 || kclass == sclass)
+ return mrb_nil_value();
+ c = mrb_obj_value(kclass);
+ }
+}
+
+static mrb_value
+mrb_struct_s_members(mrb_state *mrb, mrb_value klass)
+{
+ mrb_value members = struct_ivar_get(mrb, klass, mrb_intern_lit(mrb, "__members__"));
+
+ if (mrb_nil_p(members)) {
+ mrb_raise(mrb, E_TYPE_ERROR, "uninitialized struct");
+ }
+ if (!mrb_array_p(members)) {
+ mrb_raise(mrb, E_TYPE_ERROR, "corrupted struct");
+ }
+ return members;
+}
+
+static mrb_value
+mrb_struct_members(mrb_state *mrb, mrb_value s)
+{
+ mrb_value members = mrb_struct_s_members(mrb, mrb_obj_value(mrb_obj_class(mrb, s)));
+ if (!strcmp(mrb_class_name(mrb, mrb_obj_class(mrb, s)), "Struct")) {
+ if (RSTRUCT_LEN(s) != RARRAY_LEN(members)) {
+ mrb_raisef(mrb, E_TYPE_ERROR,
+ "struct size differs (%S required %S given)",
+ mrb_fixnum_value(RARRAY_LEN(members)), mrb_fixnum_value(RSTRUCT_LEN(s)));
+ }
+ }
+ return members;
+}
+
+static mrb_value
+mrb_struct_s_members_m(mrb_state *mrb, mrb_value klass)
+{
+ mrb_value members, ary;
+
+ members = mrb_struct_s_members(mrb, klass);
+ ary = mrb_ary_new_capa(mrb, RARRAY_LEN(members));
+ mrb_ary_replace(mrb, ary, members);
+ return ary;
+}
+
+/* 15.2.18.4.6 */
+/*
+ * call-seq:
+ * struct.members -> array
+ *
+ * Returns an array of strings representing the names of the instance
+ * variables.
+ *
+ * Customer = Struct.new(:name, :address, :zip)
+ * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
+ * joe.members #=> [:name, :address, :zip]
+ */
+
+static mrb_value
+mrb_struct_members_m(mrb_state *mrb, mrb_value obj)
+{
+ return mrb_struct_s_members_m(mrb, mrb_obj_value(mrb_obj_class(mrb, obj)));
+}
+
+static mrb_value
+mrb_struct_getmember(mrb_state *mrb, mrb_value obj, mrb_sym id)
+{
+ mrb_value members, slot, *ptr;
+ const mrb_value *ptr_members;
+ mrb_int i, len;
+
+ ptr = RSTRUCT_PTR(obj);
+ members = mrb_struct_members(mrb, obj);
+ ptr_members = RARRAY_PTR(members);
+ slot = mrb_symbol_value(id);
+ len = RARRAY_LEN(members);
+ for (i=0; i<len; i++) {
+ if (mrb_obj_equal(mrb, ptr_members[i], slot)) {
+ return ptr[i];
+ }
+ }
+ mrb_raisef(mrb, E_INDEX_ERROR, "`%S' is not a struct member", mrb_sym2str(mrb, id));
+ return mrb_nil_value(); /* not reached */
+}
+
+static mrb_value
+mrb_struct_ref(mrb_state *mrb, mrb_value obj)
+{
+ return mrb_struct_getmember(mrb, obj, mrb->c->ci->mid);
+}
+
+static mrb_value mrb_struct_ref0(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[0];}
+static mrb_value mrb_struct_ref1(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[1];}
+static mrb_value mrb_struct_ref2(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[2];}
+static mrb_value mrb_struct_ref3(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[3];}
+static mrb_value mrb_struct_ref4(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[4];}
+static mrb_value mrb_struct_ref5(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[5];}
+static mrb_value mrb_struct_ref6(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[6];}
+static mrb_value mrb_struct_ref7(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[7];}
+static mrb_value mrb_struct_ref8(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[8];}
+static mrb_value mrb_struct_ref9(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[9];}
+
+#define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
+#define N_REF_FUNC numberof(ref_func)
+
+static const mrb_func_t ref_func[] = {
+ mrb_struct_ref0,
+ mrb_struct_ref1,
+ mrb_struct_ref2,
+ mrb_struct_ref3,
+ mrb_struct_ref4,
+ mrb_struct_ref5,
+ mrb_struct_ref6,
+ mrb_struct_ref7,
+ mrb_struct_ref8,
+ mrb_struct_ref9,
+};
+
+static mrb_sym
+mrb_id_attrset(mrb_state *mrb, mrb_sym id)
+{
+ const char *name;
+ char *buf;
+ mrb_int len;
+ mrb_sym mid;
+
+ name = mrb_sym2name_len(mrb, id, &len);
+ buf = (char *)mrb_malloc(mrb, (size_t)len+2);
+ memcpy(buf, name, (size_t)len);
+ buf[len] = '=';
+ buf[len+1] = '\0';
+
+ mid = mrb_intern(mrb, buf, len+1);
+ mrb_free(mrb, buf);
+ return mid;
+}
+
+static mrb_value
+mrb_struct_set(mrb_state *mrb, mrb_value obj, mrb_value val)
+{
+ const char *name;
+ mrb_int i, len, slen;
+ mrb_sym mid;
+ mrb_value members, slot, *ptr;
+ const mrb_value *ptr_members;
+
+ /* get base id */
+ name = mrb_sym2name_len(mrb, mrb->c->ci->mid, &slen);
+ mid = mrb_intern(mrb, name, slen-1); /* omit last "=" */
+
+ members = mrb_struct_members(mrb, obj);
+ ptr_members = RARRAY_PTR(members);
+ len = RARRAY_LEN(members);
+ ptr = RSTRUCT_PTR(obj);
+ for (i=0; i<len; i++) {
+ slot = ptr_members[i];
+ if (mrb_symbol(slot) == mid) {
+ return ptr[i] = val;
+ }
+ }
+ mrb_raisef(mrb, E_INDEX_ERROR, "`%S' is not a struct member", mrb_sym2str(mrb, mid));
+ return mrb_nil_value(); /* not reached */
+}
+
+static mrb_value
+mrb_struct_set_m(mrb_state *mrb, mrb_value obj)
+{
+ mrb_value val;
+
+ mrb_get_args(mrb, "o", &val);
+ return mrb_struct_set(mrb, obj, val);
+}
+
+static mrb_bool
+is_local_id(mrb_state *mrb, const char *name)
+{
+ if (!name) return FALSE;
+ return !ISUPPER(name[0]);
+}
+
+static mrb_bool
+is_const_id(mrb_state *mrb, const char *name)
+{
+ if (!name) return FALSE;
+ return ISUPPER(name[0]);
+}
+
+static void
+make_struct_define_accessors(mrb_state *mrb, mrb_value members, struct RClass *c)
+{
+ const mrb_value *ptr_members = RARRAY_PTR(members);
+ mrb_int i;
+ mrb_int len = RARRAY_LEN(members);
+ int ai = mrb_gc_arena_save(mrb);
+
+ for (i=0; i<len; i++) {
+ mrb_sym id = mrb_symbol(ptr_members[i]);
+ const char *name = mrb_sym2name_len(mrb, id, NULL);
+
+ if (is_local_id(mrb, name) || is_const_id(mrb, name)) {
+ if (i < N_REF_FUNC) {
+ mrb_define_method_id(mrb, c, id, ref_func[i], MRB_ARGS_NONE());
+ }
+ else {
+ mrb_define_method_id(mrb, c, id, mrb_struct_ref, MRB_ARGS_NONE());
+ }
+ mrb_define_method_id(mrb, c, mrb_id_attrset(mrb, id), mrb_struct_set_m, MRB_ARGS_REQ(1));
+ mrb_gc_arena_restore(mrb, ai);
+ }
+ }
+}
+
+static mrb_value
+make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass * klass)
+{
+ mrb_value nstr;
+ mrb_sym id;
+ struct RClass *c;
+
+ if (mrb_nil_p(name)) {
+ c = mrb_class_new(mrb, klass);
+ }
+ else {
+ /* old style: should we warn? */
+ name = mrb_str_to_str(mrb, name);
+ id = mrb_obj_to_sym(mrb, name);
+ if (!is_const_id(mrb, mrb_sym2name_len(mrb, id, NULL))) {
+ mrb_name_error(mrb, id, "identifier %S needs to be constant", name);
+ }
+ if (mrb_const_defined_at(mrb, mrb_obj_value(klass), id)) {
+ mrb_warn(mrb, "redefining constant Struct::%S", name);
+ /* ?rb_mod_remove_const(klass, mrb_sym2name(mrb, id)); */
+ }
+ c = mrb_define_class_under(mrb, klass, RSTRING_PTR(name), klass);
+ }
+ MRB_SET_INSTANCE_TT(c, MRB_TT_ARRAY);
+ nstr = mrb_obj_value(c);
+ mrb_iv_set(mrb, nstr, mrb_intern_lit(mrb, "__members__"), members);
+
+ mrb_define_class_method(mrb, c, "new", mrb_instance_new, MRB_ARGS_ANY());
+ mrb_define_class_method(mrb, c, "[]", mrb_instance_new, MRB_ARGS_ANY());
+ mrb_define_class_method(mrb, c, "members", mrb_struct_s_members_m, MRB_ARGS_NONE());
+ /* RSTRUCT(nstr)->basic.c->super = c->c; */
+ make_struct_define_accessors(mrb, members, c);
+ return nstr;
+}
+
+/* 15.2.18.3.1 */
+/*
+ * call-seq:
+ * Struct.new( [aString] [, aSym]+> ) -> StructClass
+ * StructClass.new(arg, ...) -> obj
+ * StructClass[arg, ...] -> obj
+ *
+ * Creates a new class, named by <i>aString</i>, containing accessor
+ * methods for the given symbols. If the name <i>aString</i> is
+ * omitted, an anonymous structure class will be created. Otherwise,
+ * the name of this struct will appear as a constant in class
+ * <code>Struct</code>, so it must be unique for all
+ * <code>Struct</code>s in the system and should start with a capital
+ * letter. Assigning a structure class to a constant effectively gives
+ * the class the name of the constant.
+ *
+ * <code>Struct::new</code> returns a new <code>Class</code> object,
+ * which can then be used to create specific instances of the new
+ * structure. The number of actual parameters must be
+ * less than or equal to the number of attributes defined for this
+ * class; unset parameters default to <code>nil</code>. Passing too many
+ * parameters will raise an <code>ArgumentError</code>.
+ *
+ * The remaining methods listed in this section (class and instance)
+ * are defined for this generated class.
+ *
+ * # Create a structure with a name in Struct
+ * Struct.new("Customer", :name, :address) #=> Struct::Customer
+ * Struct::Customer.new("Dave", "123 Main") #=> #<struct Struct::Customer name="Dave", address="123 Main">
+ *
+ * # Create a structure named by its constant
+ * Customer = Struct.new(:name, :address) #=> Customer
+ * Customer.new("Dave", "123 Main") #=> #<struct Customer name="Dave", address="123 Main">
+ */
+static mrb_value
+mrb_struct_s_def(mrb_state *mrb, mrb_value klass)
+{
+ mrb_value name, rest;
+ mrb_value *pargv;
+ mrb_int argcnt;
+ mrb_int i;
+ mrb_value b, st;
+ mrb_sym id;
+ mrb_value *argv;
+ mrb_int argc;
+
+ name = mrb_nil_value();
+ rest = mrb_nil_value();
+ mrb_get_args(mrb, "*&", &argv, &argc, &b);
+ if (argc == 0) { /* special case to avoid crash */
+ rest = mrb_ary_new(mrb);
+ }
+ else {
+ if (argc > 0) name = argv[0];
+ if (argc > 1) rest = argv[1];
+ if (mrb_array_p(rest)) {
+ if (!mrb_nil_p(name) && mrb_symbol_p(name)) {
+ /* 1stArgument:symbol -> name=nil rest=argv[0]-[n] */
+ mrb_ary_unshift(mrb, rest, name);
+ name = mrb_nil_value();
+ }
+ }
+ else {
+ pargv = &argv[1];
+ argcnt = argc-1;
+ if (!mrb_nil_p(name) && mrb_symbol_p(name)) {
+ /* 1stArgument:symbol -> name=nil rest=argv[0]-[n] */
+ name = mrb_nil_value();
+ pargv = &argv[0];
+ argcnt++;
+ }
+ rest = mrb_ary_new_from_values(mrb, argcnt, pargv);
+ }
+ for (i=0; i<RARRAY_LEN(rest); i++) {
+ id = mrb_obj_to_sym(mrb, RARRAY_PTR(rest)[i]);
+ mrb_ary_set(mrb, rest, i, mrb_symbol_value(id));
+ }
+ }
+ st = make_struct(mrb, name, rest, struct_class(mrb));
+ if (!mrb_nil_p(b)) {
+ mrb_yield_with_class(mrb, b, 1, &st, st, mrb_class_ptr(klass));
+ }
+
+ return st;
+}
+
+static mrb_int
+num_members(mrb_state *mrb, struct RClass *klass)
+{
+ mrb_value members;
+
+ members = struct_ivar_get(mrb, mrb_obj_value(klass), mrb_intern_lit(mrb, "__members__"));
+ if (!mrb_array_p(members)) {
+ mrb_raise(mrb, E_TYPE_ERROR, "broken members");
+ }
+ return RARRAY_LEN(members);
+}
+
+/* 15.2.18.4.8 */
+/*
+ */
+static mrb_value
+mrb_struct_initialize_withArg(mrb_state *mrb, mrb_int argc, mrb_value *argv, mrb_value self)
+{
+ struct RClass *klass = mrb_obj_class(mrb, self);
+ mrb_int i, n;
+
+ n = num_members(mrb, klass);
+ if (n < argc) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "struct size differs");
+ }
+
+ for (i = 0; i < argc; i++) {
+ mrb_ary_set(mrb, self, i, argv[i]);
+ }
+ for (i = argc; i < n; i++) {
+ mrb_ary_set(mrb, self, i, mrb_nil_value());
+ }
+ return self;
+}
+
+static mrb_value
+mrb_struct_initialize_m(mrb_state *mrb, /*int argc, mrb_value *argv,*/ mrb_value self)
+{
+ mrb_value *argv;
+ mrb_int argc;
+
+ mrb_get_args(mrb, "*", &argv, &argc);
+ return mrb_struct_initialize_withArg(mrb, argc, argv, self);
+}
+
+static mrb_value
+inspect_struct(mrb_state *mrb, mrb_value s, mrb_bool recur)
+{
+ const char *cn = mrb_class_name(mrb, mrb_obj_class(mrb, s));
+ mrb_value members, str = mrb_str_new_lit(mrb, "#<struct ");
+ mrb_value *ptr;
+ const mrb_value *ptr_members;
+ mrb_int i, len;
+
+ if (cn) {
+ mrb_str_append(mrb, str, mrb_str_new_cstr(mrb, cn));
+ }
+ if (recur) {
+ return mrb_str_cat_lit(mrb, str, ":...>");
+ }
+
+ members = mrb_struct_members(mrb, s);
+ ptr_members = RARRAY_PTR(members);
+ ptr = RSTRUCT_PTR(s);
+ len = RSTRUCT_LEN(s);
+ for (i=0; i<len; i++) {
+ mrb_value slot;
+ mrb_sym id;
+ const char *name;
+ mrb_int namelen;
+
+ if (i > 0) {
+ mrb_str_cat_lit(mrb, str, ", ");
+ }
+ else if (cn) {
+ mrb_str_cat_lit(mrb, str, " ");
+ }
+ slot = ptr_members[i];
+ id = mrb_symbol(slot);
+ name = mrb_sym2name_len(mrb, id, &namelen);
+ if (is_local_id(mrb, name) || is_const_id(mrb, name)) {
+ mrb_str_append(mrb, str, mrb_str_new(mrb, name, namelen));
+ }
+ else {
+ mrb_str_append(mrb, str, mrb_inspect(mrb, slot));
+ }
+ mrb_str_cat_lit(mrb, str, "=");
+ mrb_str_append(mrb, str, mrb_inspect(mrb, ptr[i]));
+ }
+ mrb_str_cat_lit(mrb, str, ">");
+
+ return str;
+}
+
+/*
+ * call-seq:
+ * struct.to_s -> string
+ * struct.inspect -> string
+ *
+ * Describe the contents of this struct in a string.
+ */
+static mrb_value
+mrb_struct_inspect(mrb_state *mrb, mrb_value s)
+{
+ return inspect_struct(mrb, s, FALSE);
+}
+
+/* 15.2.18.4.9 */
+/* :nodoc: */
+static mrb_value
+mrb_struct_init_copy(mrb_state *mrb, mrb_value copy)
+{
+ mrb_value s;
+ mrb_int i, len;
+
+ mrb_get_args(mrb, "o", &s);
+
+ if (mrb_obj_equal(mrb, copy, s)) return copy;
+ if (!mrb_obj_is_instance_of(mrb, s, mrb_obj_class(mrb, copy))) {
+ mrb_raise(mrb, E_TYPE_ERROR, "wrong argument class");
+ }
+ if (!mrb_array_p(s)) {
+ mrb_raise(mrb, E_TYPE_ERROR, "corrupted struct");
+ }
+ if (RSTRUCT_LEN(copy) != RSTRUCT_LEN(s)) {
+ mrb_raise(mrb, E_TYPE_ERROR, "struct size mismatch");
+ }
+ len = RSTRUCT_LEN(copy);
+ for (i = 0; i < len; i++) {
+ mrb_ary_set(mrb, copy, i, RSTRUCT_PTR(s)[i]);
+ }
+ return copy;
+}
+
+static mrb_value
+struct_aref_sym(mrb_state *mrb, mrb_value s, mrb_sym id)
+{
+ mrb_value *ptr, members;
+ const mrb_value *ptr_members;
+ mrb_int i, len;
+
+ ptr = RSTRUCT_PTR(s);
+ members = mrb_struct_members(mrb, s);
+ ptr_members = RARRAY_PTR(members);
+ len = RARRAY_LEN(members);
+ for (i=0; i<len; i++) {
+ if (mrb_symbol(ptr_members[i]) == id) {
+ return ptr[i];
+ }
+ }
+ mrb_raisef(mrb, E_INDEX_ERROR, "no member '%S' in struct", mrb_sym2str(mrb, id));
+ return mrb_nil_value(); /* not reached */
+}
+
+static mrb_value
+struct_aref_int(mrb_state *mrb, mrb_value s, mrb_int i)
+{
+ if (i < 0) i = RSTRUCT_LEN(s) + i;
+ if (i < 0)
+ mrb_raisef(mrb, E_INDEX_ERROR,
+ "offset %S too small for struct(size:%S)",
+ mrb_fixnum_value(i), mrb_fixnum_value(RSTRUCT_LEN(s)));
+ if (RSTRUCT_LEN(s) <= i)
+ mrb_raisef(mrb, E_INDEX_ERROR,
+ "offset %S too large for struct(size:%S)",
+ mrb_fixnum_value(i), mrb_fixnum_value(RSTRUCT_LEN(s)));
+ return RSTRUCT_PTR(s)[i];
+}
+
+/* 15.2.18.4.2 */
+/*
+ * call-seq:
+ * struct[symbol] -> anObject
+ * struct[fixnum] -> anObject
+ *
+ * Attribute Reference---Returns the value of the instance variable
+ * named by <i>symbol</i>, or indexed (0..length-1) by
+ * <i>fixnum</i>. Will raise <code>NameError</code> if the named
+ * variable does not exist, or <code>IndexError</code> if the index is
+ * out of range.
+ *
+ * Customer = Struct.new(:name, :address, :zip)
+ * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
+ *
+ * joe["name"] #=> "Joe Smith"
+ * joe[:name] #=> "Joe Smith"
+ * joe[0] #=> "Joe Smith"
+ */
+static mrb_value
+mrb_struct_aref(mrb_state *mrb, mrb_value s)
+{
+ mrb_value idx;
+
+ mrb_get_args(mrb, "o", &idx);
+ if (mrb_string_p(idx)) {
+ mrb_value sym = mrb_check_intern_str(mrb, idx);
+
+ if (mrb_nil_p(sym)) {
+ mrb_raisef(mrb, E_INDEX_ERROR, "no member '%S' in struct", idx);
+ }
+ idx = sym;
+ }
+ if (mrb_symbol_p(idx)) {
+ return struct_aref_sym(mrb, s, mrb_symbol(idx));
+ }
+ return struct_aref_int(mrb, s, mrb_int(mrb, idx));
+}
+
+static mrb_value
+mrb_struct_aset_sym(mrb_state *mrb, mrb_value s, mrb_sym id, mrb_value val)
+{
+ mrb_value members, *ptr;
+ const mrb_value *ptr_members;
+ mrb_int i, len;
+
+ members = mrb_struct_members(mrb, s);
+ len = RARRAY_LEN(members);
+ if (RSTRUCT_LEN(s) != len) {
+ mrb_raisef(mrb, E_TYPE_ERROR,
+ "struct size differs (%S required %S given)",
+ mrb_fixnum_value(len), mrb_fixnum_value(RSTRUCT_LEN(s)));
+ }
+ ptr = RSTRUCT_PTR(s);
+ ptr_members = RARRAY_PTR(members);
+ for (i=0; i<len; i++) {
+ if (mrb_symbol(ptr_members[i]) == id) {
+ ptr[i] = val;
+ return val;
+ }
+ }
+ mrb_raisef(mrb, E_INDEX_ERROR, "no member '%S' in struct", mrb_sym2str(mrb, id));
+ return val; /* not reach */
+}
+
+/* 15.2.18.4.3 */
+/*
+ * call-seq:
+ * struct[symbol] = obj -> obj
+ * struct[fixnum] = obj -> obj
+ *
+ * Attribute Assignment---Assigns to the instance variable named by
+ * <i>symbol</i> or <i>fixnum</i> the value <i>obj</i> and
+ * returns it. Will raise a <code>NameError</code> if the named
+ * variable does not exist, or an <code>IndexError</code> if the index
+ * is out of range.
+ *
+ * Customer = Struct.new(:name, :address, :zip)
+ * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
+ *
+ * joe["name"] = "Luke"
+ * joe[:zip] = "90210"
+ *
+ * joe.name #=> "Luke"
+ * joe.zip #=> "90210"
+ */
+
+static mrb_value
+mrb_struct_aset(mrb_state *mrb, mrb_value s)
+{
+ mrb_int i;
+ mrb_value idx;
+ mrb_value val;
+
+ mrb_get_args(mrb, "oo", &idx, &val);
+
+ if (mrb_string_p(idx)) {
+ mrb_value sym = mrb_check_intern_str(mrb, idx);
+
+ if (mrb_nil_p(sym)) {
+ mrb_raisef(mrb, E_INDEX_ERROR, "no member '%S' in struct", idx);
+ }
+ idx = sym;
+ }
+ if (mrb_symbol_p(idx)) {
+ return mrb_struct_aset_sym(mrb, s, mrb_symbol(idx), val);
+ }
+
+ i = mrb_int(mrb, idx);
+ if (i < 0) i = RSTRUCT_LEN(s) + i;
+ if (i < 0) {
+ mrb_raisef(mrb, E_INDEX_ERROR,
+ "offset %S too small for struct(size:%S)",
+ mrb_fixnum_value(i), mrb_fixnum_value(RSTRUCT_LEN(s)));
+ }
+ if (RSTRUCT_LEN(s) <= i) {
+ mrb_raisef(mrb, E_INDEX_ERROR,
+ "offset %S too large for struct(size:%S)",
+ mrb_fixnum_value(i), mrb_fixnum_value(RSTRUCT_LEN(s)));
+ }
+ return RSTRUCT_PTR(s)[i] = val;
+}
+
+/* 15.2.18.4.1 */
+/*
+ * call-seq:
+ * struct == other_struct -> true or false
+ *
+ * Equality---Returns <code>true</code> if <i>other_struct</i> is
+ * equal to this one: they must be of the same class as generated by
+ * <code>Struct::new</code>, and the values of all instance variables
+ * must be equal (according to <code>Object#==</code>).
+ *
+ * Customer = Struct.new(:name, :address, :zip)
+ * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
+ * joejr = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
+ * jane = Customer.new("Jane Doe", "456 Elm, Anytown NC", 12345)
+ * joe == joejr #=> true
+ * joe == jane #=> false
+ */
+
+static mrb_value
+mrb_struct_equal(mrb_state *mrb, mrb_value s)
+{
+ mrb_value s2;
+ mrb_value *ptr, *ptr2;
+ mrb_int i, len;
+ mrb_bool equal_p;
+
+ mrb_get_args(mrb, "o", &s2);
+ if (mrb_obj_equal(mrb, s, s2)) {
+ equal_p = 1;
+ }
+ else if (!strcmp(mrb_class_name(mrb, mrb_obj_class(mrb, s)), "Struct") ||
+ mrb_obj_class(mrb, s) != mrb_obj_class(mrb, s2)) {
+ equal_p = 0;
+ }
+ else if (RSTRUCT_LEN(s) != RSTRUCT_LEN(s2)) {
+ mrb_bug(mrb, "inconsistent struct"); /* should never happen */
+ equal_p = 0; /* This substuture is just to suppress warnings. never called. */
+ }
+ else {
+ ptr = RSTRUCT_PTR(s);
+ ptr2 = RSTRUCT_PTR(s2);
+ len = RSTRUCT_LEN(s);
+ equal_p = 1;
+ for (i=0; i<len; i++) {
+ if (!mrb_equal(mrb, ptr[i], ptr2[i])) {
+ equal_p = 0;
+ break;
+ }
+ }
+ }
+
+ return mrb_bool_value(equal_p);
+}
+
+/* 15.2.18.4.12(x) */
+/*
+ * code-seq:
+ * struct.eql?(other) -> true or false
+ *
+ * Two structures are equal if they are the same object, or if all their
+ * fields are equal (using <code>eql?</code>).
+ */
+static mrb_value
+mrb_struct_eql(mrb_state *mrb, mrb_value s)
+{
+ mrb_value s2;
+ mrb_value *ptr, *ptr2;
+ mrb_int i, len;
+ mrb_bool eql_p;
+
+ mrb_get_args(mrb, "o", &s2);
+ if (mrb_obj_equal(mrb, s, s2)) {
+ eql_p = 1;
+ }
+ else if (strcmp(mrb_class_name(mrb, mrb_obj_class(mrb, s2)), "Struct") ||
+ mrb_obj_class(mrb, s) != mrb_obj_class(mrb, s2)) {
+ eql_p = 0;
+ }
+ else if (RSTRUCT_LEN(s) != RSTRUCT_LEN(s2)) {
+ mrb_bug(mrb, "inconsistent struct"); /* should never happen */
+ eql_p = 0; /* This substuture is just to suppress warnings. never called. */
+ }
+ else {
+ ptr = RSTRUCT_PTR(s);
+ ptr2 = RSTRUCT_PTR(s2);
+ len = RSTRUCT_LEN(s);
+ eql_p = 1;
+ for (i=0; i<len; i++) {
+ if (!mrb_eql(mrb, ptr[i], ptr2[i])) {
+ eql_p = 0;
+ break;
+ }
+ }
+ }
+
+ return mrb_bool_value(eql_p);
+}
+
+/*
+ * call-seq:
+ * struct.length -> Fixnum
+ * struct.size -> Fixnum
+ *
+ * Returns number of struct members.
+ */
+static mrb_value
+mrb_struct_len(mrb_state *mrb, mrb_value self)
+{
+ return mrb_fixnum_value(RSTRUCT_LEN(self));
+}
+
+/*
+ * call-seq:
+ * struct.to_a -> array
+ * struct.values -> array
+ *
+ * Create an array from struct values.
+ */
+static mrb_value
+mrb_struct_to_a(mrb_state *mrb, mrb_value self)
+{
+ return mrb_ary_new_from_values(mrb, RSTRUCT_LEN(self), RSTRUCT_PTR(self));
+}
+
+/*
+ * call-seq:
+ * struct.to_h -> hash
+ *
+ * Create a hash from member names and struct values.
+ */
+static mrb_value
+mrb_struct_to_h(mrb_state *mrb, mrb_value self)
+{
+ mrb_value members, ret;
+ mrb_int i;
+
+ members = mrb_struct_s_members(mrb, mrb_obj_value(mrb_class(mrb, self)));
+ ret = mrb_hash_new_capa(mrb, RARRAY_LEN(members));
+
+ for (i = 0; i < RARRAY_LEN(members); ++i) {
+ mrb_hash_set(mrb, ret, RARRAY_PTR(members)[i], RSTRUCT_PTR(self)[i]);
+ }
+
+ return ret;
+}
+
+static mrb_value
+mrb_struct_values_at(mrb_state *mrb, mrb_value self)
+{
+ mrb_int argc;
+ mrb_value *argv;
+
+ mrb_get_args(mrb, "*", &argv, &argc);
+
+ return mrb_get_values_at(mrb, self, RSTRUCT_LEN(self), argc, argv, struct_aref_int);
+}
+
+/*
+ * A <code>Struct</code> is a convenient way to bundle a number of
+ * attributes together, using accessor methods, without having to write
+ * an explicit class.
+ *
+ * The <code>Struct</code> class is a generator of specific classes,
+ * each one of which is defined to hold a set of variables and their
+ * accessors. In these examples, we'll call the generated class
+ * ``<i>Customer</i>Class,'' and we'll show an example instance of that
+ * class as ``<i>Customer</i>Inst.''
+ *
+ * In the descriptions that follow, the parameter <i>symbol</i> refers
+ * to a symbol, which is either a quoted string or a
+ * <code>Symbol</code> (such as <code>:name</code>).
+ */
+void
+mrb_mruby_struct_gem_init(mrb_state* mrb)
+{
+ struct RClass *st;
+ st = mrb_define_class(mrb, "Struct", mrb->object_class);
+
+ mrb_define_class_method(mrb, st, "new", mrb_struct_s_def, MRB_ARGS_ANY()); /* 15.2.18.3.1 */
+
+ mrb_define_method(mrb, st, "==", mrb_struct_equal, MRB_ARGS_REQ(1)); /* 15.2.18.4.1 */
+ mrb_define_method(mrb, st, "[]", mrb_struct_aref, MRB_ARGS_REQ(1)); /* 15.2.18.4.2 */
+ mrb_define_method(mrb, st, "[]=", mrb_struct_aset, MRB_ARGS_REQ(2)); /* 15.2.18.4.3 */
+ mrb_define_method(mrb, st, "members", mrb_struct_members_m, MRB_ARGS_NONE()); /* 15.2.18.4.6 */
+ mrb_define_method(mrb, st, "initialize", mrb_struct_initialize_m,MRB_ARGS_ANY()); /* 15.2.18.4.8 */
+ mrb_define_method(mrb, st, "initialize_copy", mrb_struct_init_copy, MRB_ARGS_REQ(1)); /* 15.2.18.4.9 */
+ mrb_define_method(mrb, st, "inspect", mrb_struct_inspect, MRB_ARGS_NONE()); /* 15.2.18.4.10(x) */
+ mrb_define_alias(mrb, st, "to_s", "inspect"); /* 15.2.18.4.11(x) */
+ mrb_define_method(mrb, st, "eql?", mrb_struct_eql, MRB_ARGS_REQ(1)); /* 15.2.18.4.12(x) */
+
+ mrb_define_method(mrb, st, "size", mrb_struct_len, MRB_ARGS_NONE());
+ mrb_define_method(mrb, st, "length", mrb_struct_len, MRB_ARGS_NONE());
+ mrb_define_method(mrb, st, "to_a", mrb_struct_to_a, MRB_ARGS_NONE());
+ mrb_define_method(mrb, st, "values", mrb_struct_to_a, MRB_ARGS_NONE());
+ mrb_define_method(mrb, st, "to_h", mrb_struct_to_h, MRB_ARGS_NONE());
+ mrb_define_method(mrb, st, "values_at", mrb_struct_values_at, MRB_ARGS_NONE());
+}
+
+void
+mrb_mruby_struct_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-symbol-ext/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,101 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_symbol_ext[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0x2f,0x06,0x00,0x00,0x03,0xed,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x03,0x70,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x37,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0x45,0x00,0x80,0x00,
+0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x53,0x79,
+0x6d,0x62,0x6f,0x6c,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x04,0x00,0x06,0x00,
+0x00,0x00,0x1c,0x00,0x06,0x00,0x80,0x00,0x91,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0x04,0x01,0x00,0x01,0x84,0x01,0x80,0x01,0x05,0x00,0x00,0x02,
+0x20,0x01,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x40,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x80,0x81,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x04,0x00,0x01,0x46,0xc0,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,
+0x46,0x00,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,0x46,0x40,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,0x46,0x80,0x82,0x00,0x04,0x05,0x80,0x00,
+0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x07,0x69,0x6e,
+0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x0a,0x43,0x6f,0x6d,0x70,0x61,0x72,0x61,0x62,
+0x6c,0x65,0x00,0x00,0x06,0x69,0x6e,0x74,0x65,0x72,0x6e,0x00,0x00,0x06,0x74,0x6f,
+0x5f,0x73,0x79,0x6d,0x00,0x00,0x0c,0x61,0x6c,0x69,0x61,0x73,0x5f,0x6d,0x65,0x74,
+0x68,0x6f,0x64,0x00,0x00,0x07,0x74,0x6f,0x5f,0x70,0x72,0x6f,0x63,0x00,0x00,0x0a,
+0x63,0x61,0x70,0x69,0x74,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x08,0x64,0x6f,0x77,
+0x6e,0x63,0x61,0x73,0x65,0x00,0x00,0x06,0x75,0x70,0x63,0x61,0x73,0x65,0x00,0x00,
+0x07,0x63,0x61,0x73,0x65,0x63,0x6d,0x70,0x00,0x00,0x06,0x65,0x6d,0x70,0x74,0x79,
+0x3f,0x00,0x00,0x00,0x00,0x26,0x00,0x02,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x03,
+0x26,0x00,0x00,0x00,0xc0,0x01,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,
+0x00,0x09,0x00,0x00,0xa6,0x00,0x08,0x02,0x01,0x40,0x00,0x02,0x06,0x00,0x80,0x02,
+0xb7,0x40,0x81,0x02,0x01,0x80,0x00,0x03,0x38,0x80,0x81,0x02,0x01,0xc0,0x00,0x03,
+0xa1,0x3f,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x08,0x5f,0x5f,0x73,0x65,0x6e,0x64,0x5f,0x5f,0x00,0x00,0x00,0x00,0x58,0x00,
+0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x26,0x00,0x00,0x00,
+0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x40,0x00,0x01,0x98,0x00,0x40,0x01,
+0x06,0x00,0x00,0x01,0x20,0x80,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x04,0x74,0x6f,0x5f,0x73,0x00,0x00,0x0b,0x63,0x61,0x70,
+0x69,0x74,0x61,0x6c,0x69,0x7a,0x65,0x21,0x00,0x00,0x06,0x74,0x6f,0x5f,0x73,0x79,
+0x6d,0x00,0x00,0x00,0x00,0x56,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x08,
+0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x40,0x00,0x01,
+0x98,0x00,0x40,0x01,0x06,0x00,0x00,0x01,0x20,0x80,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x74,0x6f,0x5f,0x73,0x00,0x00,
+0x09,0x64,0x6f,0x77,0x6e,0x63,0x61,0x73,0x65,0x21,0x00,0x00,0x06,0x74,0x6f,0x5f,
+0x73,0x79,0x6d,0x00,0x00,0x00,0x00,0x54,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,
+0x00,0x08,0x00,0x00,0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,
+0x20,0x40,0x00,0x01,0x98,0x00,0x40,0x01,0x06,0x00,0x00,0x01,0x20,0x80,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x74,0x6f,
+0x5f,0x73,0x00,0x00,0x07,0x75,0x70,0x63,0x61,0x73,0x65,0x21,0x00,0x00,0x06,0x74,
+0x6f,0x5f,0x73,0x79,0x6d,0x00,0x00,0x00,0x00,0x95,0x00,0x05,0x00,0x08,0x00,0x00,
+0x00,0x00,0x00,0x14,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0x91,0x00,0x00,0x03,
+0xa0,0x00,0x80,0x02,0x99,0x00,0xc0,0x02,0x17,0x01,0x40,0x00,0x05,0x00,0x80,0x02,
+0x29,0x00,0x80,0x02,0x06,0x00,0x80,0x02,0x20,0x80,0x80,0x02,0x01,0x40,0x81,0x01,
+0x20,0xc0,0x80,0x02,0x01,0x40,0x80,0x02,0x20,0x80,0x80,0x02,0x01,0x40,0x01,0x02,
+0x20,0xc0,0x80,0x02,0x01,0xc0,0x80,0x02,0x01,0x00,0x01,0x03,0xa0,0x00,0x81,0x02,
+0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x08,0x6b,0x69,
+0x6e,0x64,0x5f,0x6f,0x66,0x3f,0x00,0x00,0x06,0x53,0x79,0x6d,0x62,0x6f,0x6c,0x00,
+0x00,0x04,0x74,0x6f,0x5f,0x73,0x00,0x00,0x07,0x75,0x70,0x63,0x61,0x73,0x65,0x21,
+0x00,0x00,0x03,0x3c,0x3d,0x3e,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x05,0x00,
+0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,
+0x20,0x00,0x00,0x01,0x83,0xff,0xbf,0x01,0xb2,0x40,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x6c,0x65,0x6e,0x67,0x74,0x68,
+0x00,0x00,0x02,0x3d,0x3d,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x00,0x5f,0x00,0x00,
+0x00,0x06,0x00,0x03,0x6f,0x62,0x6a,0x00,0x04,0x61,0x72,0x67,0x73,0x00,0x05,0x62,
+0x6c,0x6f,0x63,0x6b,0x00,0x05,0x6f,0x74,0x68,0x65,0x72,0x00,0x03,0x6c,0x68,0x73,
+0x00,0x03,0x72,0x68,0x73,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,
+0x02,0x00,0x02,0x00,0x03,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,
+0x00,0x00,0x03,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x03,0x00,0x05,0x00,
+0x04,0xff,0xff,0x00,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_symbol_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_symbol_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_symbol_ext_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_mruby_symbol_ext_gem_init(mrb);
+ mrb_load_irep(mrb, gem_mrblib_irep_mruby_symbol_ext);
+ if (mrb->exc) {
+ mrb_print_error(mrb);
+ exit(EXIT_FAILURE);
+ }
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_symbol_ext_gem_final(mrb_state *mrb) {
+ mrb_mruby_symbol_ext_gem_final(mrb);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-symbol-ext/symbol.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,65 @@
+#include "mruby.h"
+#include "mruby/khash.h"
+#include "mruby/array.h"
+
+typedef struct symbol_name {
+ size_t len;
+ const char *name;
+} symbol_name;
+
+/*
+ * call-seq:
+ * Symbol.all_symbols => array
+ *
+ * Returns an array of all the symbols currently in Ruby's symbol
+ * table.
+ *
+ * Symbol.all_symbols.size #=> 903
+ * Symbol.all_symbols[1,20] #=> [:floor, :ARGV, :Binding, :symlink,
+ * :chown, :EOFError, :$;, :String,
+ * :LOCK_SH, :"setuid?", :$<,
+ * :default_proc, :compact, :extend,
+ * :Tms, :getwd, :$=, :ThreadGroup,
+ * :wait2, :$>]
+ */
+static mrb_value
+mrb_sym_all_symbols(mrb_state *mrb, mrb_value self)
+{
+ mrb_sym i, lim;
+ mrb_value ary = mrb_ary_new_capa(mrb, mrb->symidx);
+
+ for (i=1, lim=mrb->symidx+1; i<lim; i++) {
+ mrb_ary_push(mrb, ary, mrb_symbol_value(i));
+ }
+
+ return ary;
+}
+
+/*
+ * call-seq:
+ * sym.length -> integer
+ *
+ * Same as <code>sym.to_s.length</code>.
+ */
+static mrb_value
+mrb_sym_length(mrb_state *mrb, mrb_value self)
+{
+ mrb_int len;
+ mrb_sym2name_len(mrb, mrb_symbol(self), &len);
+ return mrb_fixnum_value(len);
+}
+
+void
+mrb_mruby_symbol_ext_gem_init(mrb_state* mrb)
+{
+ struct RClass *s = mrb->symbol_class;
+ mrb_define_class_method(mrb, s, "all_symbols", mrb_sym_all_symbols, MRB_ARGS_NONE());
+ mrb_define_method(mrb, s, "length", mrb_sym_length, MRB_ARGS_NONE());
+ mrb_define_method(mrb, s, "size", mrb_sym_length, MRB_ARGS_NONE());
+}
+
+void
+mrb_mruby_symbol_ext_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-toplevel-ext/gem_init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,63 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ * This file was generated!
+ * All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_toplevel_ext[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0x72,0x41,0x00,0x00,0x01,0xa2,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x01,0x46,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x8b,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x12,
+0x06,0x00,0x80,0x00,0x47,0x40,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x06,0x00,0x80,0x00,0x47,0x40,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,
+0x06,0x00,0x80,0x00,0x47,0x40,0x80,0x00,0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,
+0x06,0x00,0x80,0x00,0x47,0x40,0x80,0x00,0xc0,0x06,0x00,0x01,0x46,0xc0,0x80,0x00,
+0x84,0x01,0x80,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x07,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x07,0x70,0x72,0x69,0x76,
+0x61,0x74,0x65,0x00,0x00,0x09,0x70,0x72,0x6f,0x74,0x65,0x63,0x74,0x65,0x64,0x00,
+0x00,0x06,0x70,0x75,0x62,0x6c,0x69,0x63,0x00,0x00,0x00,0x00,0x4c,0x00,0x03,0x00,
+0x06,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x26,0x00,0x08,0x00,0x06,0x00,0x80,0x01,
+0x20,0x00,0x80,0x01,0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,
+0xa0,0x7f,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x07,0x69,0x6e,0x63,0x6c,0x75,0x64,
+0x65,0x00,0x00,0x00,0x00,0x26,0x00,0x03,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x03,
+0x26,0x00,0x08,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x03,0x00,0x04,0x00,0x00,0x00,0x00,
+0x00,0x03,0x00,0x00,0x26,0x00,0x08,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x03,0x00,0x04,
+0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x26,0x00,0x08,0x00,0x05,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x56,0x41,0x52,
+0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x02,0x00,0x07,0x6d,0x6f,0x64,0x75,0x6c,0x65,
+0x73,0x00,0x07,0x6d,0x65,0x74,0x68,0x6f,0x64,0x73,0x00,0x00,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,
+0x00,0x08,
+};
+void mrb_mruby_toplevel_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_toplevel_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_toplevel_ext_gem_init(mrb_state *mrb) {
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_load_irep(mrb, gem_mrblib_irep_mruby_toplevel_ext);
+ if (mrb->exc) {
+ mrb_print_error(mrb);
+ exit(EXIT_FAILURE);
+ }
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_toplevel_ext_gem_final(mrb_state *mrb) {
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrblib/mrblib.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,1392 @@
+#include "mruby.h"
+#include "mruby/irep.h"
+
+extern const uint8_t mrblib_irep[];
+
+void
+mrb_init_mrblib(mrb_state *mrb)
+{
+ mrb_load_irep(mrb, mrblib_irep);
+}
+
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+mrblib_irep[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0xe5,0xf9,0x00,0x00,0x55,0xaa,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x4f,0x9d,0x30,0x30,
+0x30,0x30,0x00,0x00,0x03,0x3c,0x00,0x01,0x00,0x03,0x00,0x1e,0x00,0x00,0x00,0x74,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0x45,0x00,0x80,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0xc5,0x00,0x80,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x40,0x80,0x00,0x45,0x01,0x80,0x00,
+0x05,0x00,0x80,0x00,0x44,0x80,0x80,0x00,0xc5,0x01,0x80,0x00,0x05,0x00,0x80,0x00,
+0x44,0xc0,0x80,0x00,0x45,0x02,0x80,0x00,0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,
+0x43,0x00,0x81,0x00,0xc5,0x02,0x80,0x00,0x05,0x00,0x80,0x00,0x91,0x02,0x00,0x01,
+0x43,0x80,0x81,0x00,0x45,0x03,0x80,0x00,0x05,0x00,0x80,0x00,0x91,0x02,0x00,0x01,
+0x43,0xc0,0x81,0x00,0xc5,0x03,0x80,0x00,0x05,0x00,0x80,0x00,0x91,0x02,0x00,0x01,
+0x43,0x00,0x82,0x00,0x45,0x04,0x80,0x00,0x05,0x00,0x80,0x00,0x11,0x04,0x00,0x01,
+0x43,0x40,0x82,0x00,0xc5,0x04,0x80,0x00,0x05,0x00,0x80,0x00,0x91,0x02,0x00,0x01,
+0x43,0x80,0x82,0x00,0x45,0x05,0x80,0x00,0x05,0x00,0x80,0x00,0x91,0x02,0x00,0x01,
+0x43,0xc0,0x82,0x00,0xc5,0x05,0x80,0x00,0x05,0x00,0x80,0x00,0x91,0x02,0x00,0x01,
+0x43,0x00,0x83,0x00,0x45,0x06,0x80,0x00,0x05,0x00,0x80,0x00,0x11,0x06,0x00,0x01,
+0x43,0x40,0x83,0x00,0xc5,0x06,0x80,0x00,0x05,0x00,0x80,0x00,0x91,0x02,0x00,0x01,
+0x43,0x80,0x83,0x00,0x45,0x07,0x80,0x00,0x05,0x00,0x80,0x00,0x11,0x07,0x00,0x01,
+0x43,0xc0,0x83,0x00,0xc5,0x07,0x80,0x00,0x05,0x00,0x80,0x00,0x11,0x08,0x00,0x01,
+0x43,0x40,0x84,0x00,0x45,0x08,0x80,0x00,0x05,0x00,0x80,0x00,0x11,0x07,0x00,0x01,
+0x43,0x80,0x84,0x00,0xc5,0x08,0x80,0x00,0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,
+0x43,0xc0,0x84,0x00,0x45,0x09,0x80,0x00,0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,
+0x43,0xc0,0x84,0x00,0xc5,0x09,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x85,0x00,
+0x45,0x0a,0x80,0x00,0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x40,0x85,0x00,
+0xc5,0x0a,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x80,0x85,0x00,0x45,0x0b,0x80,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0xc0,0x85,0x00,0xc5,0x0b,0x80,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x86,0x00,0x45,0x0c,0x80,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x40,0x86,0x00,0xc5,0x0c,0x80,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x40,0x86,0x00,0x45,0x0d,0x80,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x80,0x86,0x00,0xc5,0x0d,0x80,0x00,
+0x05,0x00,0x80,0x00,0x44,0x80,0x80,0x00,0x45,0x0e,0x80,0x00,0x05,0x00,0x80,0x00,
+0x05,0x00,0x00,0x01,0x43,0x80,0x86,0x00,0xc5,0x0e,0x80,0x00,0x4a,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x05,0x41,0x72,0x72,0x61,0x79,0x00,
+0x00,0x06,0x4d,0x6f,0x64,0x75,0x6c,0x65,0x00,0x00,0x0a,0x43,0x6f,0x6d,0x70,0x61,
+0x72,0x61,0x62,0x6c,0x65,0x00,0x00,0x0a,0x45,0x6e,0x75,0x6d,0x65,0x72,0x61,0x62,
+0x6c,0x65,0x00,0x00,0x09,0x45,0x78,0x63,0x65,0x70,0x74,0x69,0x6f,0x6e,0x00,0x00,
+0x0d,0x53,0x74,0x61,0x6e,0x64,0x61,0x72,0x64,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,
+0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,
+0x0e,0x4c,0x6f,0x63,0x61,0x6c,0x4a,0x75,0x6d,0x70,0x45,0x72,0x72,0x6f,0x72,0x00,
+0x00,0x0a,0x52,0x61,0x6e,0x67,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x10,0x46,
+0x6c,0x6f,0x61,0x74,0x44,0x6f,0x6d,0x61,0x69,0x6e,0x45,0x72,0x72,0x6f,0x72,0x00,
+0x00,0x0b,0x52,0x65,0x67,0x65,0x78,0x70,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x09,
+0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x09,0x4e,0x61,0x6d,0x65,
+0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x0d,0x4e,0x6f,0x4d,0x65,0x74,0x68,0x6f,0x64,
+0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x0a,0x49,0x6e,0x64,0x65,0x78,0x45,0x72,0x72,
+0x6f,0x72,0x00,0x00,0x08,0x4b,0x65,0x79,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x0b,
+0x53,0x63,0x72,0x69,0x70,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x13,0x4e,0x6f,
+0x74,0x49,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x65,0x64,0x45,0x72,0x72,0x6f,
+0x72,0x00,0x00,0x0d,0x53,0x74,0x6f,0x70,0x49,0x74,0x65,0x72,0x61,0x74,0x69,0x6f,
+0x6e,0x00,0x00,0x04,0x48,0x61,0x73,0x68,0x00,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,
+0x6c,0x00,0x00,0x07,0x4e,0x75,0x6d,0x65,0x72,0x69,0x63,0x00,0x00,0x08,0x49,0x6e,
+0x74,0x65,0x67,0x72,0x61,0x6c,0x00,0x00,0x07,0x49,0x6e,0x74,0x65,0x67,0x65,0x72,
+0x00,0x00,0x05,0x46,0x6c,0x6f,0x61,0x74,0x00,0x00,0x05,0x52,0x61,0x6e,0x67,0x65,
+0x00,0x00,0x06,0x53,0x74,0x72,0x69,0x6e,0x67,0x00,0x00,0x00,0x01,0x52,0x00,0x01,
+0x00,0x04,0x00,0x0b,0x00,0x00,0x00,0x2d,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,
+0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,
+0x84,0x01,0x00,0x01,0x04,0x01,0x80,0x01,0x05,0x00,0x00,0x02,0x20,0x01,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,0x46,0x40,0x81,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x08,0x00,0x01,0x46,0x80,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,
+0x46,0xc0,0x81,0x00,0x48,0x00,0x80,0x00,0x04,0x04,0x00,0x01,0x84,0x03,0x80,0x01,
+0x05,0x00,0x00,0x02,0x20,0x01,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0c,0x00,0x01,
+0x46,0x40,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x0e,0x00,0x01,0x46,0x80,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,0x46,0xc0,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x12,0x00,0x01,0x46,0x00,0x83,0x00,0x48,0x00,0x80,0x00,0xc0,0x14,0x00,0x01,
+0x46,0x40,0x83,0x00,0x84,0x06,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x0e,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x0a,0x65,0x61,0x63,
+0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x08,0x63,0x6f,0x6c,0x6c,0x65,0x63,
+0x74,0x21,0x00,0x00,0x04,0x6d,0x61,0x70,0x21,0x00,0x00,0x0c,0x61,0x6c,0x69,0x61,
+0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,
+0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x08,0x5f,0x69,0x6e,0x73,0x70,0x65,0x63,0x74,
+0x00,0x00,0x07,0x69,0x6e,0x73,0x70,0x65,0x63,0x74,0x00,0x00,0x04,0x74,0x6f,0x5f,
+0x73,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x04,0x65,0x71,0x6c,0x3f,0x00,0x00,0x03,
+0x3c,0x3d,0x3e,0x00,0x00,0x06,0x64,0x65,0x6c,0x65,0x74,0x65,0x00,0x00,0x08,0x5f,
+0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x01,0x3e,0x00,0x05,0x00,0x09,
+0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x02,
+0x20,0x00,0x80,0x02,0x99,0x00,0xc0,0x02,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x02,
+0x04,0x01,0x00,0x03,0xa0,0x40,0x80,0x02,0x29,0x00,0x80,0x02,0x03,0xff,0xbf,0x02,
+0x06,0x00,0x00,0x03,0x20,0xc0,0x00,0x03,0xaf,0x00,0x01,0x03,0x01,0x40,0x01,0x01,
+0x01,0x80,0x81,0x01,0x97,0x0a,0x40,0x00,0x06,0x00,0x80,0x02,0x01,0x80,0x00,0x03,
+0xad,0x80,0x01,0x03,0x01,0x80,0x01,0x01,0xa0,0x40,0x81,0x02,0x01,0x40,0x01,0x02,
+0x99,0x00,0xc0,0x02,0x17,0x05,0x40,0x00,0x01,0x00,0x81,0x02,0x05,0x00,0x00,0x03,
+0xb2,0xc0,0x81,0x02,0x19,0x02,0xc0,0x02,0x01,0xc0,0x80,0x02,0x06,0x00,0x00,0x03,
+0x20,0xc0,0x00,0x03,0xb6,0x00,0x82,0x02,0x99,0x00,0xc0,0x02,0x97,0x08,0x40,0x00,
+0x01,0x40,0x80,0x02,0x01,0x00,0x01,0x03,0xa0,0x40,0x82,0x02,0x01,0x80,0x80,0x02,
+0x01,0xc0,0x00,0x03,0xb3,0x80,0x82,0x02,0x19,0x02,0xc0,0x02,0x01,0xc0,0x80,0x02,
+0x06,0x00,0x00,0x03,0x20,0xc0,0x00,0x03,0xb4,0xc0,0x82,0x02,0x19,0x02,0xc0,0x02,
+0x06,0x00,0x80,0x02,0x20,0xc0,0x80,0x02,0xaf,0x00,0x81,0x02,0x01,0x40,0x81,0x01,
+0x98,0xee,0xbf,0x02,0x06,0x00,0x80,0x02,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x0c,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x04,0x65,
+0x61,0x63,0x68,0x00,0x00,0x06,0x6c,0x65,0x6e,0x67,0x74,0x68,0x00,0x00,0x01,0x2d,
+0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,
+0x02,0x3e,0x3d,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x3c,0x00,0x00,
+0x02,0x3c,0x3d,0x00,0x00,0x00,0x00,0xb8,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,
+0x00,0x18,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,
+0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,
+0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x83,0xff,0x3f,0x01,0x17,0x03,0x40,0x00,
+0x01,0x40,0x80,0x01,0x01,0x80,0x00,0x02,0xa0,0xc0,0x80,0x01,0x01,0x80,0x80,0x01,
+0xad,0x00,0x81,0x01,0x01,0xc0,0x00,0x01,0x01,0x80,0x80,0x01,0x06,0x00,0x00,0x02,
+0x20,0x80,0x01,0x02,0xb3,0x40,0x81,0x01,0x98,0xfa,0xbf,0x01,0x06,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x0c,0x62,0x6c,
+0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,
+0x65,0x6e,0x75,0x6d,0x00,0x00,0x0a,0x65,0x61,0x63,0x68,0x5f,0x69,0x6e,0x64,0x65,
+0x78,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,
+0x00,0x00,0x06,0x6c,0x65,0x6e,0x67,0x74,0x68,0x00,0x00,0x00,0x00,0x83,0x00,0x02,
+0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x0e,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x01,
+0x20,0x00,0x00,0x01,0x99,0x00,0x40,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x01,
+0x04,0x01,0x80,0x01,0xa0,0x40,0x00,0x01,0x29,0x00,0x00,0x01,0x06,0x00,0x00,0x01,
+0x40,0x01,0x80,0x01,0x21,0xc0,0x00,0x01,0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x08,0x63,0x6f,0x6c,0x6c,0x65,0x63,0x74,0x21,0x00,0x00,0x0a,0x65,0x61,
+0x63,0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x00,0x00,0x58,0x00,0x03,0x00,
+0x08,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0x01,0xc0,0x00,0x03,0x20,0x81,0x00,0x02,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,
+0x01,0x92,0x00,0x05,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x38,0xa6,0x00,0x20,0x00,
+0x17,0x01,0x40,0x00,0x17,0x01,0x40,0x00,0x17,0x01,0x40,0x00,0x83,0xff,0xbf,0x00,
+0x05,0x00,0x00,0x01,0x01,0x40,0x80,0x02,0x91,0x00,0x00,0x03,0xa0,0x00,0x80,0x02,
+0x99,0x00,0xc0,0x02,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x02,0x91,0x01,0x00,0x03,
+0x3d,0x00,0x80,0x03,0x20,0x81,0x80,0x02,0x01,0x40,0x80,0x02,0x83,0xff,0x3f,0x03,
+0xb3,0x00,0x81,0x02,0x19,0x02,0xc0,0x02,0x06,0x00,0x80,0x02,0x91,0x02,0x00,0x03,
+0xbd,0x00,0x80,0x03,0x20,0x81,0x80,0x02,0x06,0x00,0x80,0x02,0x20,0x80,0x81,0x02,
+0x01,0x40,0x80,0x02,0x83,0xff,0x3f,0x03,0xb5,0xc0,0x81,0x02,0x99,0x0c,0xc0,0x02,
+0x05,0x00,0x80,0x02,0x06,0x00,0x00,0x03,0x01,0x40,0x80,0x03,0xaf,0x40,0x82,0x03,
+0x01,0x40,0x01,0x04,0x20,0x01,0x02,0x03,0x83,0xff,0x3f,0x02,0x97,0x06,0x40,0x00,
+0x19,0x02,0xc0,0x01,0x01,0xc0,0x80,0x02,0x01,0x00,0x01,0x03,0xa0,0x80,0x82,0x02,
+0x97,0x00,0x40,0x00,0x01,0x80,0x80,0x02,0x06,0x00,0x00,0x03,0x01,0x00,0x81,0x03,
+0x01,0x40,0x01,0x04,0x20,0x01,0x02,0x03,0x01,0x00,0x81,0x02,0xad,0xc0,0x82,0x02,
+0x01,0x40,0x01,0x02,0x01,0x00,0x81,0x02,0x01,0x40,0x00,0x03,0xb3,0x00,0x81,0x02,
+0x98,0xf7,0xbf,0x02,0x06,0x00,0x80,0x02,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x02,
+0x00,0x00,0x21,0x65,0x78,0x70,0x65,0x63,0x74,0x65,0x64,0x20,0x49,0x6e,0x74,0x65,
+0x67,0x65,0x72,0x20,0x66,0x6f,0x72,0x20,0x31,0x73,0x74,0x20,0x61,0x72,0x67,0x75,
+0x6d,0x65,0x6e,0x74,0x00,0x00,0x13,0x6e,0x65,0x67,0x61,0x74,0x69,0x76,0x65,0x20,
+0x61,0x72,0x72,0x61,0x79,0x20,0x73,0x69,0x7a,0x65,0x00,0x00,0x00,0x0c,0x00,0x08,
+0x6b,0x69,0x6e,0x64,0x5f,0x6f,0x66,0x3f,0x00,0x00,0x07,0x49,0x6e,0x74,0x65,0x67,
+0x65,0x72,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,
+0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x01,0x3c,0x00,0x00,0x0d,0x41,0x72,0x67,
+0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x65,
+0x61,0x72,0x00,0x00,0x01,0x3e,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x01,0x2d,
+0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0x91,
+0x00,0x02,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x26,0x00,0x00,0x00,
+0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x83,0xff,0xbf,0x01,0xb2,0x40,0x00,0x01,
+0x19,0x01,0x40,0x01,0x3d,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0xbd,0x00,0x00,0x01,
+0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x3d,0x01,0x00,0x02,
+0xa0,0x00,0x81,0x01,0xac,0x80,0x00,0x01,0xbd,0x01,0x80,0x01,0xac,0x80,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x01,
+0x5b,0x00,0x00,0x02,0x2c,0x20,0x00,0x00,0x01,0x5d,0x00,0x00,0x00,0x05,0x00,0x04,
+0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x01,0x2b,0x00,0x00,0x03,
+0x6d,0x61,0x70,0x00,0x00,0x04,0x6a,0x6f,0x69,0x6e,0x00,0x00,0x00,0x00,0x34,0x00,
+0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x26,0x00,0x00,0x02,
+0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x07,0x69,0x6e,0x73,0x70,0x65,0x63,0x74,0x00,0x00,0x00,
+0x00,0x86,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x10,0x26,0x00,0x00,0x00,
+0x9a,0x01,0x40,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x97,0x04,0x40,0x00,
+0x1b,0x00,0x00,0x01,0x91,0x00,0x80,0x01,0x01,0x80,0x00,0x02,0xa0,0x80,0x80,0x01,
+0x98,0x00,0xc0,0x01,0x17,0x01,0x40,0x00,0x3d,0x00,0x00,0x01,0x17,0x01,0x40,0x00,
+0x1d,0x00,0x00,0x01,0x1c,0x00,0x80,0x00,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x01,
+0x00,0x00,0x05,0x5b,0x2e,0x2e,0x2e,0x5d,0x00,0x00,0x00,0x03,0x00,0x08,0x5f,0x69,
+0x6e,0x73,0x70,0x65,0x63,0x74,0x00,0x00,0x10,0x53,0x79,0x73,0x74,0x65,0x6d,0x53,
+0x74,0x61,0x63,0x6b,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x3d,0x3d,0x3d,0x00,
+0x00,0x00,0x00,0xe3,0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,
+0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x02,0x01,0x40,0x00,0x03,0xa0,0x00,0x80,0x02,
+0x01,0x40,0x81,0x00,0x08,0x00,0x00,0x03,0xb2,0x40,0x80,0x02,0x19,0x01,0xc0,0x02,
+0x08,0x00,0x80,0x02,0x29,0x00,0x80,0x02,0x01,0x40,0x80,0x02,0x07,0x00,0x00,0x03,
+0xb2,0x40,0x80,0x02,0x19,0x01,0xc0,0x02,0x07,0x00,0x80,0x02,0x29,0x00,0x80,0x02,
+0x06,0x00,0x80,0x02,0x20,0x80,0x80,0x02,0x01,0x40,0x81,0x01,0x83,0xff,0x3f,0x02,
+0x97,0x06,0x40,0x00,0x06,0x00,0x80,0x02,0x01,0x00,0x01,0x03,0xa0,0xc0,0x80,0x02,
+0x01,0x40,0x00,0x03,0x01,0x00,0x81,0x03,0xa0,0xc0,0x00,0x03,0xa0,0x00,0x81,0x02,
+0x19,0x01,0xc0,0x02,0x08,0x00,0x80,0x02,0x29,0x80,0x80,0x02,0x01,0x00,0x81,0x02,
+0xad,0x40,0x81,0x02,0x01,0x40,0x01,0x02,0x01,0x00,0x81,0x02,0x01,0xc0,0x00,0x03,
+0xb3,0x80,0x81,0x02,0x98,0xf7,0xbf,0x02,0x07,0x00,0x80,0x02,0x29,0x00,0x80,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x08,0x5f,0x5f,0x61,0x72,0x79,0x5f,
+0x65,0x71,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,
+0x02,0x5b,0x5d,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,
+0x00,0x00,0x00,0x00,0xe9,0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x29,0x00,
+0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x02,0x01,0x40,0x00,0x03,0xa0,0x00,0x80,0x02,
+0x01,0x40,0x81,0x00,0x08,0x00,0x00,0x03,0xb2,0x40,0x80,0x02,0x19,0x01,0xc0,0x02,
+0x08,0x00,0x80,0x02,0x29,0x00,0x80,0x02,0x01,0x40,0x80,0x02,0x07,0x00,0x00,0x03,
+0xb2,0x40,0x80,0x02,0x19,0x01,0xc0,0x02,0x07,0x00,0x80,0x02,0x29,0x00,0x80,0x02,
+0x06,0x00,0x80,0x02,0x20,0x80,0x80,0x02,0x01,0x40,0x81,0x01,0x83,0xff,0x3f,0x02,
+0x17,0x07,0x40,0x00,0x06,0x00,0x80,0x02,0x01,0x00,0x01,0x03,0xa0,0xc0,0x80,0x02,
+0x01,0x40,0x00,0x03,0x01,0x00,0x81,0x03,0xa0,0xc0,0x00,0x03,0xa0,0x00,0x81,0x02,
+0x99,0x00,0xc0,0x02,0x17,0x01,0x40,0x00,0x08,0x00,0x80,0x02,0x29,0x80,0x80,0x02,
+0x01,0x00,0x81,0x02,0xad,0x40,0x81,0x02,0x01,0x40,0x01,0x02,0x01,0x00,0x81,0x02,
+0x01,0xc0,0x00,0x03,0xb3,0x80,0x81,0x02,0x18,0xf7,0xbf,0x02,0x07,0x00,0x80,0x02,
+0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x08,0x5f,0x5f,
+0x61,0x72,0x79,0x5f,0x65,0x71,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x04,0x73,0x69,
+0x7a,0x65,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x04,0x65,0x71,0x6c,0x3f,0x00,0x00,
+0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x00,0x01,0x7e,0x00,0x06,0x00,0x0a,0x00,
+0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x06,0x00,0x00,0x03,
+0x01,0x40,0x80,0x03,0xa0,0x00,0x00,0x03,0x01,0x80,0x81,0x00,0x83,0xff,0x3f,0x03,
+0x01,0x40,0x80,0x03,0xb2,0x40,0x00,0x03,0x19,0x01,0x40,0x03,0x83,0xff,0x3f,0x03,
+0x29,0x00,0x00,0x03,0x05,0x00,0x00,0x03,0x01,0x40,0x80,0x03,0xb2,0x40,0x00,0x03,
+0x19,0x01,0x40,0x03,0x05,0x00,0x00,0x03,0x29,0x00,0x00,0x03,0x06,0x00,0x00,0x03,
+0x20,0x80,0x00,0x03,0x01,0x80,0x81,0x01,0x01,0x40,0x00,0x03,0x20,0x80,0x00,0x03,
+0x01,0x80,0x01,0x02,0x01,0xc0,0x00,0x03,0x01,0x00,0x81,0x03,0xb5,0xc0,0x00,0x03,
+0x99,0x00,0x40,0x03,0x01,0x00,0x81,0x01,0x83,0xff,0xbf,0x02,0x17,0x0b,0x40,0x00,
+0x06,0x00,0x00,0x03,0x01,0x40,0x81,0x03,0xa0,0x00,0x01,0x03,0x01,0x40,0x80,0x03,
+0x01,0x40,0x01,0x04,0xa0,0x00,0x81,0x03,0xa0,0x40,0x01,0x03,0x01,0x80,0x01,0x02,
+0x05,0x00,0x80,0x03,0xb2,0x40,0x00,0x03,0x19,0x01,0x40,0x03,0x01,0x00,0x01,0x03,
+0x29,0x80,0x00,0x03,0x01,0x00,0x01,0x03,0x83,0xff,0xbf,0x03,0xa0,0x80,0x01,0x03,
+0x19,0x01,0x40,0x03,0x01,0x00,0x01,0x03,0x29,0x80,0x00,0x03,0x01,0x40,0x01,0x03,
+0xad,0xc0,0x01,0x03,0x01,0x80,0x81,0x02,0x01,0x40,0x01,0x03,0x01,0xc0,0x80,0x03,
+0xb3,0x00,0x02,0x03,0x18,0xf3,0x3f,0x03,0x06,0x00,0x00,0x03,0x20,0x80,0x00,0x03,
+0x01,0x40,0x80,0x03,0x20,0x80,0x80,0x03,0xae,0x40,0x02,0x03,0x01,0x80,0x81,0x01,
+0x83,0xff,0xbf,0x03,0xb2,0x40,0x00,0x03,0x19,0x01,0x40,0x03,0x83,0xff,0x3f,0x03,
+0x97,0x03,0x40,0x00,0x01,0xc0,0x00,0x03,0x83,0xff,0xbf,0x03,0xb5,0xc0,0x00,0x03,
+0x19,0x01,0x40,0x03,0x03,0x00,0x40,0x03,0x97,0x00,0x40,0x00,0x03,0xff,0x3f,0x03,
+0x29,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x09,0x5f,0x5f,
+0x61,0x72,0x79,0x5f,0x63,0x6d,0x70,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x04,0x73,
+0x69,0x7a,0x65,0x00,0x00,0x01,0x3e,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x3c,
+0x3d,0x3e,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,
+0x00,0x01,0x2d,0x00,0x00,0x00,0x00,0x92,0x00,0x05,0x00,0x08,0x00,0x00,0x00,0x00,
+0x00,0x16,0x00,0x00,0xa6,0x00,0x00,0x02,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x02,
+0x01,0xc0,0x00,0x03,0xa0,0x00,0x80,0x02,0x01,0x40,0x00,0x02,0x06,0x00,0x80,0x02,
+0x01,0x40,0x00,0x03,0xa0,0x40,0x80,0x02,0x01,0x40,0x81,0x01,0x98,0xfb,0xbf,0x02,
+0x01,0x00,0x81,0x02,0x05,0x00,0x00,0x03,0xb2,0x80,0x80,0x02,0x99,0x00,0xc0,0x02,
+0x01,0x80,0x80,0x02,0x99,0x01,0xc0,0x02,0x01,0x80,0x80,0x02,0x20,0xc0,0x80,0x02,
+0x97,0x00,0x40,0x00,0x01,0x00,0x81,0x02,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x09,0x64,0x65,0x6c,0x65,0x74,0x65,0x5f,0x61,0x74,0x00,
+0x00,0x05,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x04,0x63,
+0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x59,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,
+0x00,0x0b,0x00,0x00,0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,
+0x83,0x00,0xc0,0x01,0xb3,0x40,0x00,0x01,0x99,0x01,0x40,0x01,0x06,0x00,0x00,0x01,
+0x20,0x80,0x00,0x01,0x97,0x00,0x40,0x00,0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,
+0x01,0x3c,0x00,0x00,0x05,0x66,0x69,0x72,0x73,0x74,0x00,0x00,0x00,0x00,0x59,0x00,
+0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x00,0x80,0x00,
+0x91,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,
+0x46,0x80,0x80,0x00,0x04,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x07,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x0a,
+0x45,0x6e,0x75,0x6d,0x65,0x72,0x61,0x62,0x6c,0x65,0x00,0x00,0x05,0x73,0x6f,0x72,
+0x74,0x21,0x00,0x00,0x00,0x00,0x47,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00,
+0x07,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x06,0x00,0x80,0x01,
+0x01,0x40,0x00,0x02,0x21,0x40,0x80,0x01,0xa0,0x00,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x72,0x65,0x70,0x6c,0x61,0x63,
+0x65,0x00,0x00,0x04,0x73,0x6f,0x72,0x74,0x00,0x00,0x00,0x00,0x51,0x00,0x01,0x00,
+0x03,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,
+0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,
+0x84,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x0d,0x61,0x74,0x74,0x72,0x5f,0x61,0x63,0x63,0x65,0x73,0x73,0x6f,0x72,0x00,
+0x00,0x04,0x61,0x74,0x74,0x72,0x00,0x00,0x00,0x00,0x66,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x06,0x00,0x80,0x01,
+0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,
+0x06,0x00,0x80,0x01,0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,
+0xa0,0x7f,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x0b,0x61,0x74,0x74,0x72,0x5f,0x72,0x65,0x61,0x64,0x65,0x72,0x00,0x00,0x0b,
+0x61,0x74,0x74,0x72,0x5f,0x77,0x72,0x69,0x74,0x65,0x72,0x00,0x00,0x00,0x00,0x3c,
+0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x26,0x00,0x00,0x02,
+0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0b,0x61,0x74,0x74,0x72,0x5f,0x72,
+0x65,0x61,0x64,0x65,0x72,0x00,0x00,0x00,0x00,0x8c,0x00,0x01,0x00,0x03,0x00,0x06,
+0x00,0x00,0x00,0x14,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,
+0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,0x46,0x00,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,0x46,0x40,0x81,0x00,0x84,0x02,0x80,0x00,
+0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x01,0x3c,0x00,
+0x00,0x02,0x3c,0x3d,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x01,0x3e,0x00,0x00,0x02,
+0x3e,0x3d,0x00,0x00,0x08,0x62,0x65,0x74,0x77,0x65,0x65,0x6e,0x3f,0x00,0x00,0x00,
+0x00,0xd3,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x19,0x26,0x00,0x00,0x02,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,0x01,0x00,0x81,0x01,
+0x20,0x40,0x00,0x02,0x19,0x07,0x40,0x02,0x06,0x00,0x00,0x02,0x91,0x01,0x80,0x02,
+0x3d,0x00,0x00,0x03,0x06,0x00,0x80,0x03,0x20,0x00,0x81,0x03,0x3e,0xc0,0x01,0x03,
+0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,0x01,0x40,0x80,0x03,0x20,0x00,0x81,0x03,
+0x3e,0xc0,0x01,0x03,0x3d,0x01,0x80,0x03,0x3e,0xc0,0x01,0x03,0x20,0x81,0x00,0x02,
+0x01,0xc0,0x00,0x02,0x83,0xff,0xbf,0x02,0xb3,0x40,0x01,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x03,0x00,0x00,0x0e,0x63,0x6f,0x6d,0x70,0x61,0x72,0x69,0x73,0x6f,
+0x6e,0x20,0x6f,0x66,0x20,0x00,0x00,0x06,0x20,0x77,0x69,0x74,0x68,0x20,0x00,0x00,
+0x07,0x20,0x66,0x61,0x69,0x6c,0x65,0x64,0x00,0x00,0x00,0x06,0x00,0x03,0x3c,0x3d,
+0x3e,0x00,0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,
+0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,
+0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x01,0x3c,0x00,0x00,0x00,0x00,
+0xd4,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x19,0x00,0x26,0x00,0x00,0x02,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,0x01,0x00,0x81,0x01,
+0x20,0x40,0x00,0x02,0x19,0x07,0x40,0x02,0x06,0x00,0x00,0x02,0x91,0x01,0x80,0x02,
+0x3d,0x00,0x00,0x03,0x06,0x00,0x80,0x03,0x20,0x00,0x81,0x03,0x3e,0xc0,0x01,0x03,
+0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,0x01,0x40,0x80,0x03,0x20,0x00,0x81,0x03,
+0x3e,0xc0,0x01,0x03,0x3d,0x01,0x80,0x03,0x3e,0xc0,0x01,0x03,0x20,0x81,0x00,0x02,
+0x01,0xc0,0x00,0x02,0x83,0xff,0xbf,0x02,0xb4,0x40,0x01,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x03,0x00,0x00,0x0e,0x63,0x6f,0x6d,0x70,0x61,0x72,0x69,0x73,0x6f,
+0x6e,0x20,0x6f,0x66,0x20,0x00,0x00,0x06,0x20,0x77,0x69,0x74,0x68,0x20,0x00,0x00,
+0x07,0x20,0x66,0x61,0x69,0x6c,0x65,0x64,0x00,0x00,0x00,0x06,0x00,0x03,0x3c,0x3d,
+0x3e,0x00,0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,
+0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,
+0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x02,0x3c,0x3d,0x00,0x00,0x00,
+0x00,0x45,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x08,0x26,0x00,0x00,0x02,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,0x01,0x00,0x81,0x01,
+0x83,0xff,0xbf,0x02,0xb2,0x40,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x03,0x3c,0x3d,0x3e,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,
+0x00,0x00,0xd3,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x19,0x00,0x00,0x00,
+0x26,0x00,0x00,0x02,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,
+0x01,0x00,0x81,0x01,0x20,0x40,0x00,0x02,0x19,0x07,0x40,0x02,0x06,0x00,0x00,0x02,
+0x91,0x01,0x80,0x02,0x3d,0x00,0x00,0x03,0x06,0x00,0x80,0x03,0x20,0x00,0x81,0x03,
+0x3e,0xc0,0x01,0x03,0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,0x01,0x40,0x80,0x03,
+0x20,0x00,0x81,0x03,0x3e,0xc0,0x01,0x03,0x3d,0x01,0x80,0x03,0x3e,0xc0,0x01,0x03,
+0x20,0x81,0x00,0x02,0x01,0xc0,0x00,0x02,0x83,0xff,0xbf,0x02,0xb5,0x40,0x01,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x0e,0x63,0x6f,0x6d,0x70,0x61,
+0x72,0x69,0x73,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x00,0x00,0x06,0x20,0x77,0x69,0x74,
+0x68,0x20,0x00,0x00,0x07,0x20,0x66,0x61,0x69,0x6c,0x65,0x64,0x00,0x00,0x00,0x06,
+0x00,0x03,0x3c,0x3d,0x3e,0x00,0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,0x00,0x05,0x72,
+0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,
+0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x01,0x3e,
+0x00,0x00,0x00,0x00,0xd4,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x19,0x00,
+0x26,0x00,0x00,0x02,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,
+0x01,0x00,0x81,0x01,0x20,0x40,0x00,0x02,0x19,0x07,0x40,0x02,0x06,0x00,0x00,0x02,
+0x91,0x01,0x80,0x02,0x3d,0x00,0x00,0x03,0x06,0x00,0x80,0x03,0x20,0x00,0x81,0x03,
+0x3e,0xc0,0x01,0x03,0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,0x01,0x40,0x80,0x03,
+0x20,0x00,0x81,0x03,0x3e,0xc0,0x01,0x03,0x3d,0x01,0x80,0x03,0x3e,0xc0,0x01,0x03,
+0x20,0x81,0x00,0x02,0x01,0xc0,0x00,0x02,0x83,0xff,0xbf,0x02,0xb6,0x40,0x01,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x0e,0x63,0x6f,0x6d,0x70,0x61,
+0x72,0x69,0x73,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x00,0x00,0x06,0x20,0x77,0x69,0x74,
+0x68,0x20,0x00,0x00,0x07,0x20,0x66,0x61,0x69,0x6c,0x65,0x64,0x00,0x00,0x00,0x06,
+0x00,0x03,0x3c,0x3d,0x3e,0x00,0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,0x00,0x05,0x72,
+0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,
+0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x02,0x3e,
+0x3d,0x00,0x00,0x00,0x00,0x48,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x09,
+0x26,0x00,0x00,0x04,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xb6,0x00,0x00,0x02,
+0x99,0x01,0x40,0x02,0x06,0x00,0x00,0x02,0x01,0x80,0x80,0x02,0xb4,0x40,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x3e,0x3d,
+0x00,0x00,0x02,0x3c,0x3d,0x00,0x00,0x00,0x02,0x46,0x00,0x01,0x00,0x04,0x00,0x11,
+0x00,0x00,0x00,0x53,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,
+0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,0x46,0x00,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,0x46,0x40,0x81,0x00,0x48,0x00,0x80,0x00,
+0x04,0x03,0x00,0x01,0x84,0x01,0x80,0x01,0x05,0x00,0x00,0x02,0x20,0xc1,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x0c,0x00,0x01,0x46,0x00,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x0e,0x00,0x01,0x46,0x40,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,
+0x46,0x80,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x12,0x00,0x01,0x46,0xc0,0x82,0x00,
+0x48,0x00,0x80,0x00,0x04,0x06,0x00,0x01,0x84,0x05,0x80,0x01,0x05,0x00,0x00,0x02,
+0x20,0xc1,0x81,0x00,0x48,0x00,0x80,0x00,0x84,0x06,0x00,0x01,0x04,0x01,0x80,0x01,
+0x05,0x00,0x00,0x02,0x20,0xc1,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x14,0x00,0x01,
+0x46,0x80,0x83,0x00,0x48,0x00,0x80,0x00,0xc0,0x16,0x00,0x01,0x46,0xc0,0x83,0x00,
+0x48,0x00,0x80,0x00,0x04,0x08,0x00,0x01,0x04,0x05,0x80,0x01,0x05,0x00,0x00,0x02,
+0x20,0xc1,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x18,0x00,0x01,0x46,0x40,0x84,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x1a,0x00,0x01,0x46,0x80,0x84,0x00,0x48,0x00,0x80,0x00,
+0x84,0x09,0x00,0x01,0x04,0x04,0x80,0x01,0x05,0x00,0x00,0x02,0x20,0xc1,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x1c,0x00,0x01,0x46,0x00,0x85,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x1e,0x00,0x01,0x46,0x40,0x85,0x00,0x48,0x00,0x80,0x00,0x04,0x0b,0x00,0x01,
+0x84,0x02,0x80,0x01,0x05,0x00,0x00,0x02,0x20,0xc1,0x81,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x20,0x00,0x01,0x46,0xc0,0x85,0x00,0x84,0x0b,0x80,0x00,0x29,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x04,0x61,0x6c,0x6c,0x3f,0x00,0x00,
+0x04,0x61,0x6e,0x79,0x3f,0x00,0x00,0x07,0x63,0x6f,0x6c,0x6c,0x65,0x63,0x74,0x00,
+0x00,0x06,0x64,0x65,0x74,0x65,0x63,0x74,0x00,0x00,0x0f,0x65,0x61,0x63,0x68,0x5f,
+0x77,0x69,0x74,0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x07,0x65,0x6e,0x74,
+0x72,0x69,0x65,0x73,0x00,0x00,0x04,0x66,0x69,0x6e,0x64,0x00,0x00,0x0c,0x61,0x6c,
+0x69,0x61,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x08,0x66,0x69,0x6e,
+0x64,0x5f,0x61,0x6c,0x6c,0x00,0x00,0x04,0x67,0x72,0x65,0x70,0x00,0x00,0x08,0x69,
+0x6e,0x63,0x6c,0x75,0x64,0x65,0x3f,0x00,0x00,0x06,0x69,0x6e,0x6a,0x65,0x63,0x74,
+0x00,0x00,0x06,0x72,0x65,0x64,0x75,0x63,0x65,0x00,0x00,0x03,0x6d,0x61,0x70,0x00,
+0x00,0x03,0x6d,0x61,0x78,0x00,0x00,0x03,0x6d,0x69,0x6e,0x00,0x00,0x07,0x6d,0x65,
+0x6d,0x62,0x65,0x72,0x3f,0x00,0x00,0x09,0x70,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,
+0x6e,0x00,0x00,0x06,0x72,0x65,0x6a,0x65,0x63,0x74,0x00,0x00,0x06,0x73,0x65,0x6c,
+0x65,0x63,0x74,0x00,0x00,0x0c,0x5f,0x5f,0x73,0x6f,0x72,0x74,0x5f,0x73,0x75,0x62,
+0x5f,0x5f,0x00,0x00,0x04,0x73,0x6f,0x72,0x74,0x00,0x00,0x04,0x74,0x6f,0x5f,0x61,
+0x00,0x00,0x04,0x68,0x61,0x73,0x68,0x00,0x00,0x00,0x00,0x4d,0x00,0x02,0x00,0x04,
+0x00,0x02,0x00,0x00,0x00,0x0b,0x00,0x00,0xa6,0x00,0x00,0x00,0x19,0x02,0xc0,0x00,
+0x06,0x00,0x00,0x01,0x40,0x01,0x80,0x01,0x21,0x00,0x00,0x01,0x97,0x01,0x40,0x00,
+0x06,0x00,0x00,0x01,0x40,0x03,0x80,0x01,0x21,0x00,0x00,0x01,0x07,0x00,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
+0x0c,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x19,0x01,0xc0,0x01,
+0x05,0x00,0x80,0x01,0x17,0x01,0x40,0x00,0x08,0x00,0x80,0x01,0x29,0x80,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x00,0x00,0x49,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x00,
+0x09,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,
+0x19,0x01,0xc0,0x01,0x05,0x00,0x80,0x01,0x17,0x01,0x40,0x00,0x08,0x00,0x80,0x01,
+0x29,0x80,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0x4d,0x00,
+0x02,0x00,0x04,0x00,0x02,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,
+0x19,0x02,0xc0,0x00,0x06,0x00,0x00,0x01,0x40,0x01,0x80,0x01,0x21,0x00,0x00,0x01,
+0x97,0x01,0x40,0x00,0x06,0x00,0x00,0x01,0x40,0x03,0x80,0x01,0x21,0x00,0x00,0x01,
+0x08,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,
+0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,
+0x99,0x01,0xc0,0x01,0x07,0x00,0x80,0x01,0x29,0x80,0x80,0x01,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x49,0x00,0x03,0x00,0x05,0x00,
+0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x01,0x40,0x80,0x01,
+0x20,0x00,0x80,0x01,0x99,0x01,0xc0,0x01,0x07,0x00,0x80,0x01,0x29,0x80,0x80,0x01,
+0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,
+0x00,0x00,0x7c,0x00,0x03,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,
+0x29,0x00,0x80,0x01,0x37,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,
+0x21,0xc0,0x80,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x07,0x63,0x6f,0x6c,0x6c,0x65,
+0x63,0x74,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x4c,0x00,0x03,
+0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x09,0x26,0x00,0x08,0x00,0x15,0x80,0x80,0x01,
+0x15,0x40,0x00,0x02,0x37,0x40,0x81,0x02,0x01,0x40,0x00,0x03,0x38,0x80,0x81,0x02,
+0xa0,0x7f,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x04,0x63,0x61,0x6c,
+0x6c,0x00,0x00,0x00,0x00,0x45,0x00,0x04,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x09,
+0xa6,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x00,
+0x01,0x40,0x80,0x01,0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0x00,0x00,0x02,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0x64,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
+0x0e,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x80,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x99,0x02,0xc0,0x01,
+0x01,0x40,0x80,0x01,0x20,0x40,0x80,0x01,0x16,0xc0,0x80,0x01,0x29,0x40,0x80,0x01,
+0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x08,0x5f,0x5f,0x73,
+0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0x88,0x00,0x03,0x00,0x06,0x00,0x01,
+0x00,0x00,0x00,0x0f,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,
+0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,
+0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x83,0xff,0x3f,0x01,0x06,0x00,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x0f,0x65,0x61,0x63,0x68,0x5f,0x77,0x69,0x74,0x68,0x5f,0x69,0x6e,0x64,
+0x65,0x78,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x58,0x00,0x03,
+0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0a,0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,
+0x01,0x40,0x00,0x02,0x20,0x40,0x00,0x02,0x15,0x80,0x80,0x02,0x20,0x01,0x80,0x01,
+0x15,0x80,0x80,0x01,0xad,0x80,0x80,0x01,0x16,0x80,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x00,
+0x00,0x39,0x00,0x03,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x06,0x26,0x00,0x00,0x00,
+0x37,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0x44,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
+0x06,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,
+0x20,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x08,0x5f,0x5f,0x73,
+0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0x7d,0x00,0x03,0x00,0x06,0x00,0x01,
+0x00,0x00,0x00,0x0e,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,
+0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,
+0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x37,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x08,0x66,
+0x69,0x6e,0x64,0x5f,0x61,0x6c,0x6c,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x00,0x00,0x6b,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,
+0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,
+0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x99,0x02,0xc0,0x01,0x15,0x80,0x80,0x01,
+0x01,0x40,0x00,0x02,0x20,0x80,0x00,0x02,0xa0,0x40,0x80,0x01,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x08,
+0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0x39,0x00,0x04,0x00,
+0x06,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0xa6,0x00,0x00,0x02,0x37,0x00,0x81,0x01,
+0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0x00,0x00,0x02,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x00,0x00,0x91,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x16,0x00,0x00,0x00,
+0x26,0x00,0x08,0x00,0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,0x01,0x00,0x81,0x01,
+0x15,0x40,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0x40,0x00,0x02,0x19,0x06,0x40,0x02,
+0x15,0xc0,0x00,0x02,0x15,0x80,0x80,0x02,0x19,0x03,0xc0,0x02,0x15,0x80,0x80,0x02,
+0x37,0x80,0x01,0x03,0x01,0x40,0x80,0x03,0x38,0xc0,0x01,0x03,0xa0,0xff,0x80,0x02,
+0x97,0x00,0x40,0x00,0x01,0xc0,0x80,0x02,0xa0,0x80,0x00,0x02,0x97,0x00,0x40,0x00,
+0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x03,0x3d,0x3d,0x3d,
+0x00,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x00,0x00,0x39,0x00,0x03,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,
+0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,
+0x08,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x56,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x01,0x40,0x80,0x01,
+0x20,0x00,0x80,0x01,0x15,0x40,0x00,0x02,0xb2,0x40,0x80,0x01,0x99,0x01,0xc0,0x01,
+0x07,0x00,0x80,0x01,0x29,0x80,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x5f,0x5f,
+0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x00,0x01,0x18,
+0x00,0x06,0x00,0x0a,0x00,0x02,0x00,0x00,0x00,0x27,0x00,0x00,0xa6,0x00,0x08,0x00,
+0x01,0x40,0x00,0x03,0x20,0x00,0x00,0x03,0x83,0x00,0xc0,0x03,0xb5,0x40,0x00,0x03,
+0x19,0x02,0x40,0x03,0x06,0x00,0x00,0x03,0x91,0x01,0x80,0x03,0x3d,0x00,0x00,0x04,
+0x20,0x81,0x00,0x03,0x11,0x02,0x00,0x03,0x01,0x40,0x80,0x03,0x03,0xff,0x3f,0x04,
+0xa0,0x80,0x81,0x03,0xa0,0x40,0x01,0x03,0x19,0x04,0x40,0x03,0x01,0x40,0x00,0x03,
+0x03,0xff,0xbf,0x03,0xa0,0x80,0x01,0x03,0x01,0x80,0x81,0x01,0xc0,0x01,0x00,0x03,
+0x01,0x80,0x01,0x01,0x01,0x40,0x00,0x03,0x20,0xc0,0x01,0x03,0x01,0x40,0x00,0x03,
+0x20,0x00,0x02,0x03,0x99,0x01,0x40,0x03,0x07,0x00,0x00,0x02,0x05,0x00,0x80,0x02,
+0x97,0x02,0x40,0x00,0x08,0x00,0x00,0x02,0x01,0x40,0x00,0x03,0x83,0xff,0xbf,0x03,
+0xa0,0x80,0x01,0x03,0x01,0x80,0x81,0x02,0x06,0x00,0x00,0x03,0x40,0x03,0x80,0x03,
+0x21,0x40,0x02,0x03,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x12,0x74,
+0x6f,0x6f,0x20,0x6d,0x61,0x6e,0x79,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,
+0x73,0x00,0x00,0x00,0x0a,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x3e,0x00,
+0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,
+0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x06,0x53,0x79,0x6d,0x62,0x6f,0x6c,
+0x00,0x00,0x03,0x3d,0x3d,0x3d,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x70,0x6f,
+0x70,0x00,0x00,0x06,0x65,0x6d,0x70,0x74,0x79,0x3f,0x00,0x00,0x04,0x65,0x61,0x63,
+0x68,0x00,0x00,0x00,0x00,0x3d,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x06,
+0x26,0x00,0x00,0x04,0x01,0x40,0x00,0x02,0x15,0xc0,0x80,0x02,0x01,0x80,0x00,0x03,
+0x20,0x01,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x08,0x5f,0x5f,0x73,0x65,0x6e,0x64,0x5f,0x5f,0x00,0x00,0x00,0x00,0x70,0x00,
+0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x26,0x00,0x08,0x00,
+0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x01,0xc0,0x80,0x00,0x15,0x00,0x81,0x01,
+0x99,0x02,0xc0,0x01,0x08,0x00,0x80,0x01,0x16,0x00,0x81,0x01,0x01,0x40,0x80,0x01,
+0x16,0x40,0x81,0x01,0x97,0x02,0x40,0x00,0x15,0x80,0x80,0x01,0x15,0x40,0x01,0x02,
+0x01,0x40,0x80,0x02,0x20,0x41,0x80,0x01,0x16,0x40,0x81,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,
+0x75,0x65,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x3d,0x00,0x04,
+0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x07,0xa6,0x00,0x00,0x00,0x07,0x00,0x00,0x01,
+0x05,0x00,0x80,0x01,0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0x00,0x00,0x02,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0xc2,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,
+0x23,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,
+0x01,0xc0,0x80,0x00,0x15,0x80,0x80,0x01,0x19,0x02,0xc0,0x01,0x16,0xc0,0x80,0x00,
+0x08,0x00,0x80,0x01,0x16,0x80,0x80,0x01,0x17,0x0c,0x40,0x00,0x15,0x40,0x80,0x01,
+0x19,0x06,0xc0,0x01,0x15,0x40,0x80,0x01,0x01,0x40,0x00,0x02,0x15,0xc0,0x80,0x02,
+0x20,0x41,0x80,0x01,0x83,0xff,0x3f,0x02,0xb5,0x80,0x80,0x01,0x99,0x01,0xc0,0x01,
+0x01,0x40,0x80,0x01,0x16,0xc0,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,
+0x17,0x05,0x40,0x00,0x01,0x40,0x80,0x01,0x15,0xc0,0x00,0x02,0xa0,0xc0,0x80,0x01,
+0x83,0xff,0x3f,0x02,0xb5,0x80,0x80,0x01,0x99,0x01,0xc0,0x01,0x01,0x40,0x80,0x01,
+0x16,0xc0,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,
+0x75,0x65,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x3e,0x00,0x00,0x03,
+0x3c,0x3d,0x3e,0x00,0x00,0x00,0x00,0x3d,0x00,0x04,0x00,0x06,0x00,0x01,0x00,0x00,
+0x00,0x07,0x00,0x00,0xa6,0x00,0x00,0x00,0x07,0x00,0x00,0x01,0x05,0x00,0x80,0x01,
+0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0x00,0x00,0x02,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x00,0x00,0xc2,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,
+0x26,0x00,0x08,0x00,0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x01,0xc0,0x80,0x00,
+0x15,0x80,0x80,0x01,0x19,0x02,0xc0,0x01,0x16,0xc0,0x80,0x00,0x08,0x00,0x80,0x01,
+0x16,0x80,0x80,0x01,0x17,0x0c,0x40,0x00,0x15,0x40,0x80,0x01,0x19,0x06,0xc0,0x01,
+0x15,0x40,0x80,0x01,0x01,0x40,0x00,0x02,0x15,0xc0,0x80,0x02,0x20,0x41,0x80,0x01,
+0x83,0xff,0x3f,0x02,0xb3,0x80,0x80,0x01,0x99,0x01,0xc0,0x01,0x01,0x40,0x80,0x01,
+0x16,0xc0,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x17,0x05,0x40,0x00,
+0x01,0x40,0x80,0x01,0x15,0xc0,0x00,0x02,0xa0,0xc0,0x80,0x01,0x83,0xff,0x3f,0x02,
+0xb3,0x80,0x80,0x01,0x99,0x01,0xc0,0x01,0x01,0x40,0x80,0x01,0x16,0xc0,0x80,0x01,
+0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,
+0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x3c,0x00,0x00,0x03,0x3c,0x3d,0x3e,0x00,
+0x00,0x00,0x00,0x49,0x00,0x04,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x0a,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x37,0x00,0x01,0x01,0x37,0x00,0x81,0x01,0x06,0x00,0x00,0x02,
+0x40,0x01,0x80,0x02,0x21,0x00,0x00,0x02,0x01,0x80,0x00,0x02,0x01,0xc0,0x80,0x02,
+0x37,0x01,0x01,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x77,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,
+0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,
+0x99,0x02,0xc0,0x01,0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,0x20,0x80,0x00,0x02,
+0xa0,0x40,0x80,0x01,0x17,0x02,0x40,0x00,0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,
+0x20,0x80,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x04,0x70,0x75,0x73,
+0x68,0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,
+0x39,0x00,0x03,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0xa6,0x00,0x00,0x00,
+0x37,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0x6b,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
+0x0e,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x19,0x01,0xc0,0x01,
+0x05,0x00,0x80,0x01,0x17,0x02,0x40,0x00,0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,
+0x20,0x80,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x04,0x70,0x75,0x73,
+0x68,0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x01,
+0xa0,0x00,0x0c,0x00,0x14,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0xa6,0x00,0x00,0x0a,
+0x01,0x00,0x01,0x06,0x01,0x40,0x81,0x06,0xb2,0x00,0x00,0x06,0x99,0x06,0x40,0x06,
+0x01,0xc0,0x00,0x06,0x03,0x00,0xc0,0x06,0xb2,0x00,0x00,0x06,0x99,0x03,0x40,0x06,
+0x01,0x80,0x00,0x06,0x01,0x00,0x81,0x06,0xa0,0x40,0x00,0x06,0x01,0x40,0x80,0x06,
+0x01,0x00,0x01,0x07,0x01,0x00,0x83,0x07,0x20,0x81,0x80,0x06,0x05,0x00,0x00,0x06,
+0x29,0x00,0x00,0x06,0x01,0xc0,0x00,0x06,0x83,0xff,0xbf,0x06,0xb2,0x00,0x00,0x06,
+0x99,0x02,0x40,0x06,0x01,0x40,0x00,0x06,0x01,0x80,0x80,0x06,0x01,0x00,0x83,0x03,
+0x01,0x40,0x03,0x04,0x17,0x02,0x40,0x00,0x01,0x80,0x00,0x06,0x01,0x40,0x80,0x06,
+0x01,0x00,0x83,0x03,0x01,0x40,0x03,0x04,0x01,0xc0,0x01,0x06,0x01,0x00,0x81,0x06,
+0xa0,0x40,0x00,0x06,0x01,0x00,0x83,0x04,0x01,0x00,0x01,0x06,0x01,0x40,0x81,0x06,
+0x01,0x00,0x03,0x05,0x01,0x40,0x83,0x05,0x01,0x00,0x01,0x06,0xad,0xc0,0x00,0x06,
+0x01,0x40,0x81,0x06,0x40,0x01,0x00,0x07,0xa1,0x00,0x01,0x06,0x01,0x40,0x02,0x06,
+0x01,0x40,0x80,0x06,0x01,0x80,0x02,0x07,0x01,0x00,0x83,0x07,0x20,0x81,0x80,0x06,
+0x01,0xc0,0x00,0x06,0xad,0xc0,0x00,0x06,0x83,0x00,0xc0,0x06,0xa0,0x40,0x01,0x06,
+0x01,0x00,0x83,0x01,0x01,0x80,0x02,0x06,0x01,0x00,0x81,0x06,0xb5,0x80,0x01,0x06,
+0x99,0x04,0x40,0x06,0x06,0x00,0x00,0x06,0x01,0x40,0x80,0x06,0x01,0x80,0x00,0x07,
+0x01,0xc0,0x80,0x07,0x01,0x00,0x01,0x08,0x01,0x80,0x82,0x08,0xaf,0x00,0x82,0x08,
+0x01,0x80,0x01,0x09,0xa1,0xc2,0x01,0x06,0x01,0x80,0x02,0x06,0x01,0x40,0x81,0x06,
+0xb3,0x40,0x02,0x06,0x19,0x05,0x40,0x06,0x06,0x00,0x00,0x06,0x01,0x40,0x80,0x06,
+0x01,0x80,0x00,0x07,0x01,0xc0,0x80,0x07,0x01,0x80,0x02,0x08,0xad,0xc0,0x00,0x08,
+0x01,0x40,0x81,0x08,0x01,0x80,0x01,0x09,0xa1,0xc2,0x01,0x06,0x97,0x00,0x40,0x00,
+0x05,0x00,0x00,0x06,0x29,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,
+0x00,0x02,0x3d,0x3d,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,
+0x00,0x01,0x2b,0x00,0x00,0x04,0x75,0x70,0x74,0x6f,0x00,0x00,0x01,0x25,0x00,0x00,
+0x01,0x3e,0x00,0x00,0x0c,0x5f,0x5f,0x73,0x6f,0x72,0x74,0x5f,0x73,0x75,0x62,0x5f,
+0x5f,0x00,0x00,0x01,0x2d,0x00,0x00,0x01,0x3c,0x00,0x00,0x00,0x00,0xde,0x00,0x03,
+0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x28,0x26,0x00,0x00,0x02,0x15,0x80,0x81,0x01,
+0x99,0x03,0xc0,0x01,0x15,0x80,0x81,0x01,0x15,0xc0,0x01,0x02,0x01,0x40,0x80,0x02,
+0xa0,0x40,0x00,0x02,0x15,0x40,0x82,0x02,0x20,0x01,0x80,0x01,0x97,0x02,0x40,0x00,
+0x15,0xc0,0x81,0x01,0x01,0x40,0x00,0x02,0xa0,0x40,0x80,0x01,0x15,0x40,0x02,0x02,
+0xa0,0x80,0x80,0x01,0x83,0xff,0x3f,0x02,0xb5,0xc0,0x80,0x01,0x99,0x05,0xc0,0x01,
+0x15,0xc0,0x81,0x01,0x01,0x40,0x00,0x02,0xa0,0x40,0x80,0x01,0x15,0x00,0x02,0x02,
+0x15,0xc0,0x82,0x02,0x01,0xc0,0x00,0x03,0x20,0x01,0x01,0x02,0x15,0xc0,0x82,0x01,
+0xaf,0x40,0x81,0x01,0x16,0xc0,0x82,0x01,0x17,0x05,0x40,0x00,0x15,0xc0,0x81,0x01,
+0x01,0x40,0x00,0x02,0xa0,0x40,0x80,0x01,0x15,0x00,0x02,0x02,0x15,0x80,0x82,0x02,
+0x01,0xc0,0x00,0x03,0x20,0x01,0x01,0x02,0x15,0x80,0x82,0x01,0xad,0x80,0x81,0x01,
+0x16,0x80,0x82,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
+0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x3c,0x3d,
+0x3e,0x00,0x00,0x01,0x3e,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x01,0x2d,0x00,
+0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0xb1,0x00,0x03,0x00,0x0b,0x00,0x01,0x00,0x00,
+0x00,0x19,0x00,0x00,0xa6,0x00,0x00,0x00,0x37,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,0x01,0x80,0x80,0x01,0x20,0x40,0x80,0x01,
+0x03,0x00,0x40,0x02,0xb5,0x80,0x80,0x01,0x19,0x07,0xc0,0x01,0x06,0x00,0x80,0x01,
+0x01,0x80,0x00,0x02,0x42,0x00,0x80,0x02,0x13,0x02,0x80,0x02,0x01,0x80,0x00,0x03,
+0x20,0x40,0x00,0x03,0xa0,0x40,0x81,0x02,0x83,0xff,0x3f,0x03,0x83,0xff,0xbf,0x03,
+0x01,0x80,0x00,0x04,0x20,0x40,0x00,0x04,0xaf,0x80,0x01,0x04,0x01,0x40,0x80,0x04,
+0xa1,0xc2,0x80,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
+0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,
+0x3e,0x00,0x00,0x0c,0x5f,0x5f,0x73,0x6f,0x72,0x74,0x5f,0x73,0x75,0x62,0x5f,0x5f,
+0x00,0x00,0x05,0x41,0x72,0x72,0x61,0x79,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,
+0x01,0x2d,0x00,0x00,0x00,0x00,0x44,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
+0x06,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,
+0x20,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x08,0x5f,0x5f,0x73,
+0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0x39,0x00,0x03,0x00,0x05,0x00,0x01,
+0x00,0x00,0x00,0x06,0x26,0x00,0x00,0x00,0x03,0x1d,0x58,0x01,0x06,0x00,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x41,0x00,
+0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x26,0x00,0x00,0x02,
+0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,0xa0,0x40,0x80,0x01,
+0x16,0x80,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x04,0x68,0x61,0x73,0x68,0x00,0x00,0x01,0x5e,0x00,0x00,0x00,0x00,0x3e,0x00,
+0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x80,0x00,
+0x47,0x40,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,0x04,0x00,0x80,0x00,
+0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x65,0x78,
+0x63,0x65,0x70,0x74,0x69,0x6f,0x6e,0x00,0x00,0x00,0x00,0x40,0x00,0x03,0x00,0x06,
+0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0xa6,0x00,0x08,0x00,0x06,0x00,0x80,0x01,
+0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0x01,0x80,0x80,0x02,
+0xa1,0x3f,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x00,0x00,0x22,0x00,0x01,0x00,0x02,0x00,0x00,
+0x00,0x00,0x00,0x02,0x05,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x02,0x00,0x00,0x05,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x02,0x00,0x00,0x05,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x02,0x00,0x00,0x05,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x02,0x00,0x00,0x05,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x02,0x00,0x00,0x05,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,
+0x00,0x08,0x00,0x00,0x06,0x00,0x80,0x00,0x84,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x80,0x80,0x00,0x04,0x01,0x80,0x00,
+0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x0d,0x61,0x74,
+0x74,0x72,0x5f,0x61,0x63,0x63,0x65,0x73,0x73,0x6f,0x72,0x00,0x00,0x04,0x6e,0x61,
+0x6d,0x65,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,
+0x00,0x00,0x00,0x4e,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x00,
+0x26,0x00,0x20,0x00,0x17,0x01,0x40,0x00,0x17,0x01,0x40,0x00,0x17,0x01,0x40,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x0e,0x00,0x00,0x01,0x01,0x40,0x80,0x02,
+0x05,0x00,0x00,0x03,0xa4,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x05,0x40,0x6e,0x61,0x6d,0x65,0x00,0x00,0x00,0x00,0x5c,
+0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x06,0x00,0x80,0x00,
+0x84,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,
+0x46,0x80,0x80,0x00,0x04,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x0b,0x61,0x74,0x74,0x72,0x5f,0x72,0x65,0x61,0x64,0x65,
+0x72,0x00,0x00,0x04,0x61,0x72,0x67,0x73,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,
+0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0x00,0x5a,0x00,0x05,0x00,0x09,0x00,0x00,
+0x00,0x00,0x00,0x0e,0x26,0x00,0x30,0x00,0x97,0x01,0x40,0x00,0x97,0x01,0x40,0x00,
+0x97,0x01,0x40,0x00,0x97,0x01,0x40,0x00,0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,
+0x05,0x00,0x80,0x01,0x0e,0x00,0x80,0x01,0x01,0x40,0x00,0x03,0x01,0x80,0x80,0x03,
+0x05,0x00,0x00,0x04,0x24,0x01,0x80,0x02,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x05,0x40,0x61,0x72,0x67,0x73,0x00,0x00,0x00,0x00,0x22,
+0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x05,0x00,0x80,0x00,
+0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,
+0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x05,0x00,0x80,0x00,
+0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,
+0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x05,0x00,0x80,0x00,
+0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,
+0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x06,0x00,0x80,0x00,
+0x84,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x0d,0x61,0x74,0x74,0x72,0x5f,0x61,0x63,0x63,0x65,0x73,
+0x73,0x6f,0x72,0x00,0x00,0x06,0x72,0x65,0x73,0x75,0x6c,0x74,0x00,0x00,0x00,0x01,
+0xb2,0x00,0x01,0x00,0x04,0x00,0x0f,0x00,0x00,0x00,0x39,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,
+0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x08,0x00,0x01,0x46,0x00,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,
+0x46,0x40,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0c,0x00,0x01,0x46,0x80,0x81,0x00,
+0x48,0x00,0x80,0x00,0x84,0x03,0x00,0x01,0x04,0x03,0x80,0x01,0x05,0x00,0x00,0x02,
+0x20,0x01,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x0e,0x00,0x01,0x46,0x40,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,0x46,0x80,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x12,0x00,0x01,0x46,0xc0,0x82,0x00,0x48,0x00,0x80,0x00,0x04,0x06,0x00,0x01,
+0x84,0x05,0x80,0x01,0x05,0x00,0x00,0x02,0x20,0x01,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x14,0x00,0x01,0x46,0x40,0x83,0x00,0x48,0x00,0x80,0x00,0xc0,0x16,0x00,0x01,
+0x46,0x80,0x83,0x00,0x48,0x00,0x80,0x00,0xc0,0x18,0x00,0x01,0x46,0xc0,0x83,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x1a,0x00,0x01,0x46,0x00,0x84,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x1c,0x00,0x01,0x46,0x40,0x84,0x00,0x84,0x08,0x80,0x00,0x29,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x02,0x3d,0x3d,0x00,0x00,0x04,0x65,
+0x71,0x6c,0x3f,0x00,0x00,0x06,0x64,0x65,0x6c,0x65,0x74,0x65,0x00,0x00,0x04,0x65,
+0x61,0x63,0x68,0x00,0x00,0x08,0x65,0x61,0x63,0x68,0x5f,0x6b,0x65,0x79,0x00,0x00,
+0x0a,0x65,0x61,0x63,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x07,0x72,0x65,
+0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x0f,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,
+0x7a,0x65,0x5f,0x63,0x6f,0x70,0x79,0x00,0x00,0x0c,0x61,0x6c,0x69,0x61,0x73,0x5f,
+0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x05,0x6d,0x65,0x72,0x67,0x65,0x00,0x00,
+0x08,0x5f,0x69,0x6e,0x73,0x70,0x65,0x63,0x74,0x00,0x00,0x07,0x69,0x6e,0x73,0x70,
+0x65,0x63,0x74,0x00,0x00,0x04,0x74,0x6f,0x5f,0x73,0x00,0x00,0x07,0x72,0x65,0x6a,
+0x65,0x63,0x74,0x21,0x00,0x00,0x06,0x72,0x65,0x6a,0x65,0x63,0x74,0x00,0x00,0x07,
+0x73,0x65,0x6c,0x65,0x63,0x74,0x21,0x00,0x00,0x06,0x73,0x65,0x6c,0x65,0x63,0x74,
+0x00,0x00,0x08,0x5f,0x5f,0x75,0x70,0x64,0x61,0x74,0x65,0x00,0x00,0x00,0x00,0xe6,
+0x00,0x03,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x24,0x00,0x00,0x26,0x00,0x00,0x02,
+0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x19,0x01,0xc0,0x01,
+0x07,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x1a,0x02,0x40,0x00,0x01,0x40,0x80,0x01,
+0x20,0x40,0x80,0x01,0x01,0xc0,0x80,0x00,0x17,0x05,0x40,0x00,0x1b,0x00,0x80,0x01,
+0x11,0x01,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0xc0,0x00,0x02,0x98,0x00,0x40,0x02,
+0x97,0x01,0x40,0x00,0x08,0x00,0x80,0x01,0x29,0x80,0x80,0x01,0x17,0x01,0x40,0x00,
+0x1d,0x00,0x80,0x01,0x1c,0x00,0x80,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x81,0x01,
+0x01,0x40,0x00,0x02,0x20,0x00,0x01,0x02,0xa0,0x40,0x81,0x01,0x19,0x01,0xc0,0x01,
+0x08,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,
+0x21,0x80,0x81,0x01,0x07,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x07,0x00,0x06,0x65,0x71,0x75,0x61,0x6c,0x3f,0x00,0x00,0x07,0x74,
+0x6f,0x5f,0x68,0x61,0x73,0x68,0x00,0x00,0x0d,0x4e,0x6f,0x4d,0x65,0x74,0x68,0x6f,
+0x64,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x3d,0x3d,0x3d,0x00,0x00,0x04,0x73,
+0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,
+0x00,0x00,0x00,0x7f,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x15,0x00,0x00,
+0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,
+0x99,0x00,0x40,0x02,0x17,0x01,0x40,0x00,0x08,0x00,0x00,0x02,0x29,0x80,0x00,0x02,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,0x15,0x40,0x80,0x02,
+0x01,0x40,0x00,0x03,0xa0,0x40,0x80,0x02,0xb2,0x80,0x00,0x02,0x19,0x01,0x40,0x02,
+0x05,0x00,0x00,0x02,0x17,0x01,0x40,0x00,0x08,0x00,0x00,0x02,0x29,0x80,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x6b,0x65,
+0x79,0x3f,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x00,0x00,
+0xe6,0x00,0x03,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x24,0x00,0x26,0x00,0x00,0x02,
+0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x19,0x01,0xc0,0x01,
+0x07,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x1a,0x02,0x40,0x00,0x01,0x40,0x80,0x01,
+0x20,0x40,0x80,0x01,0x01,0xc0,0x80,0x00,0x17,0x05,0x40,0x00,0x1b,0x00,0x80,0x01,
+0x11,0x01,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0xc0,0x00,0x02,0x98,0x00,0x40,0x02,
+0x97,0x01,0x40,0x00,0x08,0x00,0x80,0x01,0x29,0x80,0x80,0x01,0x17,0x01,0x40,0x00,
+0x1d,0x00,0x80,0x01,0x1c,0x00,0x80,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x81,0x01,
+0x01,0x40,0x00,0x02,0x20,0x00,0x01,0x02,0xa0,0x40,0x81,0x01,0x19,0x01,0xc0,0x01,
+0x08,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,
+0x21,0x80,0x81,0x01,0x07,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x07,0x00,0x06,0x65,0x71,0x75,0x61,0x6c,0x3f,0x00,0x00,0x07,0x74,
+0x6f,0x5f,0x68,0x61,0x73,0x68,0x00,0x00,0x0d,0x4e,0x6f,0x4d,0x65,0x74,0x68,0x6f,
+0x64,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x3d,0x3d,0x3d,0x00,0x00,0x04,0x73,
+0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,
+0x00,0x00,0x00,0x81,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x15,0x00,0x00,
+0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,
+0x99,0x00,0x40,0x02,0x17,0x01,0x40,0x00,0x08,0x00,0x00,0x02,0x29,0x80,0x00,0x02,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,0x15,0x40,0x80,0x02,
+0x01,0x40,0x00,0x03,0xa0,0x40,0x80,0x02,0xa0,0x80,0x00,0x02,0x19,0x01,0x40,0x02,
+0x05,0x00,0x00,0x02,0x17,0x01,0x40,0x00,0x08,0x00,0x00,0x02,0x29,0x80,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x6b,0x65,
+0x79,0x3f,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x04,0x65,0x71,0x6c,0x3f,0x00,0x00,
+0x00,0x00,0x7b,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+0xa6,0x00,0x00,0x02,0x01,0x80,0x80,0x01,0x19,0x02,0xc0,0x01,0x06,0x00,0x80,0x01,
+0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x20,0x40,0x80,0x01,0x19,0x02,0xc0,0x01,
+0x01,0x80,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x80,0x80,0x01,0x97,0x01,0x40,0x00,
+0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0xc0,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x68,0x61,0x73,0x5f,0x6b,0x65,
+0x79,0x3f,0x00,0x00,0x01,0x21,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x08,
+0x5f,0x5f,0x64,0x65,0x6c,0x65,0x74,0x65,0x00,0x00,0x00,0x00,0xfd,0x00,0x06,0x00,
+0x0b,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x03,
+0x20,0x00,0x00,0x03,0x99,0x00,0x40,0x03,0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x03,
+0x04,0x01,0x80,0x03,0xa0,0x40,0x00,0x03,0x29,0x00,0x00,0x03,0x06,0x00,0x00,0x03,
+0x20,0xc0,0x00,0x03,0x01,0x80,0x01,0x01,0x06,0x00,0x00,0x03,0x20,0x00,0x01,0x03,
+0x01,0x80,0x81,0x01,0x06,0x00,0x00,0x03,0x20,0x40,0x01,0x03,0x01,0x80,0x01,0x02,
+0x83,0xff,0xbf,0x02,0x17,0x06,0x40,0x00,0x01,0x40,0x00,0x03,0x01,0x80,0x80,0x03,
+0x01,0x40,0x01,0x04,0xa0,0xc0,0x81,0x03,0x01,0xc0,0x00,0x04,0x01,0x40,0x81,0x04,
+0xa0,0xc0,0x01,0x04,0x37,0xc1,0x81,0x03,0xa0,0x80,0x01,0x03,0x01,0x40,0x01,0x03,
+0xad,0x00,0x02,0x03,0x01,0x80,0x81,0x02,0x01,0x40,0x01,0x03,0x01,0x00,0x81,0x03,
+0xb3,0x40,0x02,0x03,0x18,0xf8,0x3f,0x03,0x06,0x00,0x00,0x03,0x29,0x00,0x00,0x03,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x04,0x6b,0x65,0x79,0x73,0x00,0x00,
+0x06,0x76,0x61,0x6c,0x75,0x65,0x73,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,
+0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x01,0x2b,0x00,0x00,
+0x01,0x3c,0x00,0x00,0x00,0x00,0x88,0x00,0x02,0x00,0x05,0x00,0x01,0x00,0x00,0x00,
+0x0f,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,
+0x99,0x00,0x40,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x01,0x04,0x01,0x80,0x01,
+0xa0,0x40,0x00,0x01,0x29,0x00,0x00,0x01,0x06,0x00,0x00,0x01,0x20,0xc0,0x00,0x01,
+0x40,0x01,0x80,0x01,0x21,0x00,0x01,0x01,0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x08,0x65,0x61,0x63,0x68,0x5f,0x6b,0x65,0x79,0x00,0x00,0x04,0x6b,0x65,
+0x79,0x73,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x35,0x00,0x03,
+0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x05,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,
+0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x8a,0x00,
+0x02,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,
+0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x99,0x00,0x40,0x01,0x17,0x02,0x40,0x00,
+0x06,0x00,0x00,0x01,0x04,0x01,0x80,0x01,0xa0,0x40,0x00,0x01,0x29,0x00,0x00,0x01,
+0x06,0x00,0x00,0x01,0x20,0xc0,0x00,0x01,0x40,0x01,0x80,0x01,0x21,0x00,0x01,0x01,
+0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x0a,0x65,0x61,0x63,0x68,0x5f,
+0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x04,0x6b,0x65,0x79,0x73,0x00,0x00,0x04,0x65,
+0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x42,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,
+0x00,0x07,0x00,0x00,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,0x06,0x00,0x00,0x02,
+0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x02,0x5b,0x5d,0x00,0x00,0x00,0x00,0xcb,0x00,0x03,0x00,0x07,0x00,0x01,0x00,0x00,
+0x00,0x18,0x00,0x00,0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,
+0x01,0x40,0x80,0x01,0x20,0x40,0x80,0x01,0x01,0xc0,0x80,0x00,0x40,0x01,0x00,0x02,
+0x21,0x80,0x80,0x01,0x01,0x40,0x80,0x01,0x20,0xc0,0x80,0x01,0x19,0x03,0xc0,0x01,
+0x01,0x40,0x80,0x01,0x20,0xc0,0x80,0x01,0x06,0x00,0x00,0x02,0x01,0xc0,0x80,0x02,
+0xa0,0x00,0x01,0x02,0x97,0x02,0x40,0x00,0x01,0x40,0x80,0x01,0x20,0x40,0x81,0x01,
+0x06,0x00,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0x80,0x01,0x02,0x06,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x05,0x63,0x6c,
+0x65,0x61,0x72,0x00,0x00,0x07,0x74,0x6f,0x5f,0x68,0x61,0x73,0x68,0x00,0x00,0x08,
+0x65,0x61,0x63,0x68,0x5f,0x6b,0x65,0x79,0x00,0x00,0x0c,0x64,0x65,0x66,0x61,0x75,
+0x6c,0x74,0x5f,0x70,0x72,0x6f,0x63,0x00,0x00,0x0d,0x64,0x65,0x66,0x61,0x75,0x6c,
+0x74,0x5f,0x70,0x72,0x6f,0x63,0x3d,0x00,0x00,0x07,0x64,0x65,0x66,0x61,0x75,0x6c,
+0x74,0x00,0x00,0x08,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x3d,0x00,0x00,0x00,0x00,
+0x49,0x00,0x03,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x26,0x00,0x00,0x02,
+0x15,0x40,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x06,0x00,0x00,0x02,
+0x01,0x40,0x80,0x02,0x01,0xc0,0x00,0x03,0x20,0x41,0x00,0x02,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x5b,
+0x5d,0x3d,0x00,0x00,0x00,0x00,0xdc,0x00,0x04,0x00,0x08,0x00,0x03,0x00,0x00,0x00,
+0x1a,0x00,0x00,0x00,0xa6,0x00,0x00,0x02,0x3f,0x00,0x81,0x01,0x01,0x40,0x00,0x02,
+0x84,0x00,0x80,0x02,0xa0,0x00,0x00,0x02,0x99,0x00,0x40,0x02,0x17,0x02,0x40,0x00,
+0x06,0x00,0x00,0x02,0x91,0x01,0x80,0x02,0x3d,0x00,0x00,0x03,0x20,0x81,0x00,0x02,
+0x01,0x40,0x00,0x02,0x20,0x40,0x00,0x02,0x01,0x00,0x81,0x00,0x06,0x00,0x00,0x02,
+0x40,0x01,0x80,0x02,0x21,0x00,0x01,0x02,0x19,0x02,0x40,0x01,0x01,0x40,0x00,0x02,
+0x40,0x03,0x80,0x02,0x21,0x00,0x01,0x02,0x97,0x01,0x40,0x00,0x01,0x40,0x00,0x02,
+0x40,0x05,0x80,0x02,0x21,0x00,0x01,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x01,
+0x00,0x00,0x20,0x63,0x61,0x6e,0x27,0x74,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,
+0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x20,0x69,0x6e,0x74,0x6f,0x20,0x48,
+0x61,0x73,0x68,0x00,0x00,0x00,0x05,0x00,0x0b,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
+0x5f,0x74,0x6f,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x68,0x61,0x73,0x68,0x00,0x00,
+0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,
+0x6f,0x72,0x00,0x00,0x08,0x65,0x61,0x63,0x68,0x5f,0x6b,0x65,0x79,0x00,0x00,0x00,
+0x00,0x49,0x00,0x03,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x09,0x26,0x00,0x00,0x02,
+0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x15,0xc0,0x00,0x02,
+0x01,0x40,0x80,0x02,0x01,0xc0,0x00,0x03,0x20,0x41,0x00,0x02,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x5b,
+0x5d,0x3d,0x00,0x00,0x00,0x00,0x93,0x00,0x03,0x00,0x09,0x00,0x00,0x00,0x00,0x00,
+0x17,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x19,0x05,0xc0,0x01,0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,
+0x06,0x00,0x80,0x02,0x01,0x40,0x00,0x03,0xa0,0x80,0x80,0x02,0x15,0x40,0x00,0x03,
+0x01,0x40,0x80,0x03,0xa0,0x80,0x00,0x03,0xa0,0x41,0x80,0x01,0x97,0x01,0x40,0x00,
+0x15,0x40,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x80,0x80,0x01,0x15,0xc0,0x00,0x02,
+0x01,0x40,0x80,0x02,0x01,0xc0,0x00,0x03,0x20,0xc1,0x00,0x02,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x68,0x61,0x73,0x5f,0x6b,0x65,
+0x79,0x3f,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,
+0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0x49,0x00,0x03,0x00,0x08,0x00,0x00,0x00,
+0x00,0x00,0x09,0x00,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x15,0xc0,0x00,0x02,0x01,0x40,0x80,0x02,0x01,0xc0,0x00,0x03,
+0x20,0x41,0x00,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0x91,0x00,
+0x02,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x26,0x00,0x00,0x00,
+0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x83,0xff,0xbf,0x01,0xb2,0x40,0x00,0x01,
+0x19,0x01,0x40,0x01,0x3d,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0xbd,0x00,0x00,0x01,
+0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x3d,0x01,0x00,0x02,
+0xa0,0x00,0x81,0x01,0xac,0x80,0x00,0x01,0xbd,0x01,0x80,0x01,0xac,0x80,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x7b,0x7d,0x00,0x00,0x01,
+0x7b,0x00,0x00,0x02,0x2c,0x20,0x00,0x00,0x01,0x7d,0x00,0x00,0x00,0x05,0x00,0x04,
+0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x01,0x2b,0x00,0x00,0x03,
+0x6d,0x61,0x70,0x00,0x00,0x04,0x6a,0x6f,0x69,0x6e,0x00,0x00,0x00,0x00,0x52,0x00,
+0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x26,0x00,0x00,0x04,
+0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,0x3d,0x00,0x80,0x02,0xac,0x40,0x00,0x02,
+0x01,0x80,0x80,0x02,0x20,0x00,0x80,0x02,0xac,0x40,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x3d,0x3e,0x00,0x00,0x00,0x02,0x00,0x08,0x5f,
+0x69,0x6e,0x73,0x70,0x65,0x63,0x74,0x00,0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0x86,
+0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x26,0x00,0x00,0x00,
+0x9a,0x01,0x40,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x97,0x04,0x40,0x00,
+0x1b,0x00,0x00,0x01,0x91,0x00,0x80,0x01,0x01,0x80,0x00,0x02,0xa0,0x80,0x80,0x01,
+0x98,0x00,0xc0,0x01,0x17,0x01,0x40,0x00,0x3d,0x00,0x00,0x01,0x17,0x01,0x40,0x00,
+0x1d,0x00,0x00,0x01,0x1c,0x00,0x80,0x00,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x01,
+0x00,0x00,0x05,0x7b,0x2e,0x2e,0x2e,0x7d,0x00,0x00,0x00,0x03,0x00,0x08,0x5f,0x69,
+0x6e,0x73,0x70,0x65,0x63,0x74,0x00,0x00,0x10,0x53,0x79,0x73,0x74,0x65,0x6d,0x53,
+0x74,0x61,0x63,0x6b,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x3d,0x3d,0x3d,0x00,
+0x00,0x00,0x00,0xb4,0x00,0x03,0x00,0x06,0x00,0x02,0x00,0x00,0x00,0x19,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,
+0x29,0x00,0x80,0x01,0x37,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,
+0x21,0xc0,0x80,0x01,0x01,0x80,0x80,0x01,0x20,0x00,0x81,0x01,0x83,0xff,0x3f,0x02,
+0xb2,0x40,0x81,0x01,0x19,0x01,0xc0,0x01,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x01,0x80,0x80,0x01,0x40,0x03,0x00,0x02,0x21,0xc0,0x80,0x01,0x06,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0c,0x62,0x6c,
+0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,
+0x65,0x6e,0x75,0x6d,0x00,0x00,0x07,0x72,0x65,0x6a,0x65,0x63,0x74,0x21,0x00,0x00,
+0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x3d,
+0x3d,0x00,0x00,0x00,0x00,0x5c,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0d,
+0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,0x01,0x40,0x80,0x02,0x01,0x80,0x00,0x03,
+0x37,0x41,0x81,0x02,0xa0,0x00,0x00,0x02,0x19,0x02,0x40,0x02,0x15,0x80,0x00,0x02,
+0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x00,0x00,0x37,0x00,0x03,
+0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x05,0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x01,
+0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x06,0x64,0x65,0x6c,0x65,0x74,0x65,0x00,0x00,0x00,0x00,
+0x7b,0x00,0x03,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x0e,0x00,0xa6,0x00,0x00,0x00,
+0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,
+0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,
+0x3f,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,
+0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,
+0x65,0x6e,0x75,0x6d,0x00,0x00,0x06,0x72,0x65,0x6a,0x65,0x63,0x74,0x00,0x00,0x04,
+0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x63,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
+0x00,0x00,0x0f,0x00,0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,0x01,0x40,0x80,0x02,
+0x01,0x80,0x00,0x03,0x37,0x41,0x81,0x02,0xa0,0x00,0x00,0x02,0x19,0x01,0x40,0x02,
+0x05,0x00,0x00,0x02,0x97,0x02,0x40,0x00,0x01,0x80,0x00,0x02,0x15,0x80,0x80,0x02,
+0x01,0x40,0x00,0x03,0x01,0x00,0x81,0x03,0x20,0x41,0x80,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0xb4,0x00,0x03,0x00,0x06,0x00,0x02,0x00,
+0x00,0x00,0x19,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,
+0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,
+0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x37,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x01,0x80,0x80,0x01,0x20,0x00,0x81,0x01,
+0x83,0xff,0x3f,0x02,0xb2,0x40,0x81,0x01,0x19,0x01,0xc0,0x01,0x05,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x01,0x80,0x80,0x01,0x40,0x03,0x00,0x02,0x21,0xc0,0x80,0x01,
+0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x07,0x73,0x65,0x6c,0x65,0x63,
+0x74,0x21,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,
+0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x00,0x00,0x5c,0x00,0x04,0x00,0x07,0x00,0x00,
+0x00,0x00,0x00,0x0d,0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,0x01,0x40,0x80,0x02,
+0x01,0x80,0x00,0x03,0x37,0x41,0x81,0x02,0xa0,0x00,0x00,0x02,0x19,0x01,0x40,0x02,
+0x05,0x00,0x00,0x02,0x97,0x01,0x40,0x00,0x15,0x80,0x00,0x02,0x01,0x40,0x80,0x02,
+0xa0,0x40,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x00,
+0x00,0x37,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x05,0x26,0x00,0x00,0x02,
+0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x64,0x65,0x6c,0x65,0x74,0x65,
+0x00,0x00,0x00,0x00,0x7b,0x00,0x03,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x0e,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,
+0x29,0x00,0x80,0x01,0x3f,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,
+0x21,0xc0,0x80,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x06,0x73,0x65,0x6c,0x65,0x63,
+0x74,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x63,0x00,0x04,0x00,
+0x09,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,
+0x01,0x40,0x80,0x02,0x01,0x80,0x00,0x03,0x37,0x41,0x81,0x02,0xa0,0x00,0x00,0x02,
+0x19,0x03,0x40,0x02,0x01,0x80,0x00,0x02,0x15,0x80,0x80,0x02,0x01,0x40,0x00,0x03,
+0x01,0x00,0x81,0x03,0x20,0x41,0x80,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0x3d,0x00,0x03,0x00,
+0x05,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x08,0x65,0x61,0x63,0x68,0x5f,0x6b,
+0x65,0x79,0x00,0x00,0x00,0x00,0x49,0x00,0x03,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
+0x09,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0x01,0xc0,0x00,0x03,
+0x20,0x41,0x00,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0x41,0x00,
+0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x80,0x00,
+0x91,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x07,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x0a,
+0x45,0x6e,0x75,0x6d,0x65,0x72,0x61,0x62,0x6c,0x65,0x00,0x00,0x00,0x00,0x83,0x00,
+0x01,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,
+0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x08,0x00,0x01,0x46,0x00,0x81,0x00,0x04,0x02,0x80,0x00,0x29,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x01,0x60,0x00,0x00,0x04,0x6c,0x6f,
+0x6f,0x70,0x00,0x00,0x02,0x21,0x7e,0x00,0x00,0x08,0x5f,0x69,0x6e,0x73,0x70,0x65,
+0x63,0x74,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x00,0x00,
+0x77,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x26,0x00,0x00,0x02,
+0x06,0x00,0x80,0x01,0x91,0x00,0x00,0x02,0x3d,0x00,0x80,0x02,0xa0,0x80,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x1a,0x62,
+0x61,0x63,0x6b,0x71,0x75,0x6f,0x74,0x65,0x73,0x20,0x6e,0x6f,0x74,0x20,0x69,0x6d,
+0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x65,0x64,0x00,0x00,0x00,0x03,0x00,0x05,0x72,
+0x61,0x69,0x73,0x65,0x00,0x00,0x13,0x4e,0x6f,0x74,0x49,0x6d,0x70,0x6c,0x65,0x6d,
+0x65,0x6e,0x74,0x65,0x64,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,
+0x00,0x00,0x00,0x00,0xc7,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,
+0x26,0x00,0x00,0x00,0x9a,0x07,0x40,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,
+0x99,0x00,0x40,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x01,0x04,0x01,0x80,0x01,
+0xa0,0x40,0x00,0x01,0x29,0x80,0x00,0x01,0x17,0x01,0x40,0x00,0x2b,0x00,0x00,0x01,
+0x20,0xc0,0x00,0x01,0x07,0x00,0x00,0x01,0x18,0xfe,0x3f,0x01,0x05,0x00,0x00,0x01,
+0x97,0x04,0x40,0x00,0x1b,0x00,0x00,0x01,0x11,0x02,0x80,0x01,0x01,0x80,0x00,0x02,
+0xa0,0x40,0x81,0x01,0x98,0x00,0xc0,0x01,0x17,0x01,0x40,0x00,0x05,0x00,0x00,0x01,
+0x17,0x01,0x40,0x00,0x1d,0x00,0x00,0x01,0x1c,0x00,0x80,0x00,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x04,0x6c,0x6f,0x6f,0x70,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x0d,0x53,0x74,0x6f,0x70,0x49,0x74,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x00,0x00,
+0x03,0x3d,0x3d,0x3d,0x00,0x00,0x00,0x00,0x3b,0x00,0x03,0x00,0x06,0x00,0x00,0x00,
+0x00,0x00,0x06,0x00,0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x20,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x02,0x3d,0x7e,0x00,0x00,0x01,0x21,0x00,0x00,0x00,0x00,
+0x34,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x26,0x00,0x00,0x00,
+0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x07,0x69,0x6e,0x73,0x70,0x65,0x63,0x74,0x00,0x00,0x00,
+0x00,0x7a,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x07,0x26,0x00,0x08,0x00,
+0x06,0x00,0x80,0x01,0x91,0x00,0x00,0x02,0x3d,0x00,0x80,0x02,0xa0,0x80,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x1d,0x66,
+0x69,0x62,0x65,0x72,0x20,0x72,0x65,0x71,0x75,0x69,0x72,0x65,0x64,0x20,0x66,0x6f,
+0x72,0x20,0x65,0x6e,0x75,0x6d,0x65,0x72,0x61,0x74,0x6f,0x72,0x00,0x00,0x00,0x03,
+0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x13,0x4e,0x6f,0x74,0x49,0x6d,0x70,
+0x6c,0x65,0x6d,0x65,0x6e,0x74,0x65,0x64,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,
+0x6e,0x65,0x77,0x00,0x00,0x00,0x00,0x79,0x00,0x01,0x00,0x04,0x00,0x03,0x00,0x00,
+0x00,0x0e,0x00,0x00,0x06,0x00,0x80,0x00,0x91,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x02,0x00,0x01,0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,
+0x46,0x00,0x81,0x00,0x04,0x02,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x05,0x00,0x07,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x0a,
+0x43,0x6f,0x6d,0x70,0x61,0x72,0x61,0x62,0x6c,0x65,0x00,0x00,0x02,0x2b,0x40,0x00,
+0x00,0x02,0x2d,0x40,0x00,0x00,0x03,0x61,0x62,0x73,0x00,0x00,0x00,0x00,0x26,0x00,
+0x02,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x26,0x00,0x00,0x00,
+0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x32,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,
+0x26,0x00,0x00,0x00,0x83,0xff,0x3f,0x01,0x06,0x00,0x80,0x01,0xae,0x00,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x2d,0x00,
+0x00,0x00,0x00,0x4b,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,
+0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x83,0xff,0xbf,0x01,0xb3,0x00,0x00,0x01,
+0x99,0x01,0x40,0x01,0x06,0x00,0x00,0x01,0x20,0x40,0x00,0x01,0x97,0x00,0x40,0x00,
+0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x01,0x3c,0x00,0x00,0x02,0x2d,0x40,0x00,0x00,0x00,0x00,0xae,0x00,0x01,0x00,
+0x04,0x00,0x05,0x00,0x00,0x00,0x16,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,
+0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,
+0x48,0x00,0x80,0x00,0x04,0x01,0x00,0x01,0x84,0x00,0x80,0x01,0x05,0x00,0x00,0x02,
+0x20,0xc1,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,0x46,0x00,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,0x46,0x40,0x81,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x08,0x00,0x01,0x46,0x80,0x81,0x00,0x04,0x03,0x80,0x00,0x29,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x06,0x64,0x6f,0x77,0x6e,0x74,0x6f,
+0x00,0x00,0x04,0x6e,0x65,0x78,0x74,0x00,0x00,0x04,0x73,0x75,0x63,0x63,0x00,0x00,
+0x0c,0x61,0x6c,0x69,0x61,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x05,
+0x74,0x69,0x6d,0x65,0x73,0x00,0x00,0x04,0x75,0x70,0x74,0x6f,0x00,0x00,0x04,0x73,
+0x74,0x65,0x70,0x00,0x00,0x00,0x00,0xbb,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,
+0x00,0x1a,0x00,0x00,0xa6,0x00,0x00,0x02,0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,
+0x99,0x00,0x40,0x02,0x97,0x02,0x40,0x00,0x06,0x00,0x00,0x02,0x04,0x01,0x80,0x02,
+0x01,0x40,0x00,0x03,0x20,0x41,0x00,0x02,0x29,0x00,0x00,0x02,0x06,0x00,0x00,0x02,
+0x20,0xc0,0x00,0x02,0x01,0x00,0x81,0x01,0x17,0x03,0x40,0x00,0x01,0x80,0x00,0x02,
+0x01,0xc0,0x80,0x02,0xa0,0x00,0x01,0x02,0x01,0xc0,0x00,0x02,0xaf,0x40,0x01,0x02,
+0x01,0x00,0x81,0x01,0x01,0xc0,0x00,0x02,0x01,0x40,0x80,0x02,0xb6,0x80,0x01,0x02,
+0x18,0xfb,0x3f,0x02,0x06,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x07,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x06,0x64,
+0x6f,0x77,0x6e,0x74,0x6f,0x00,0x00,0x04,0x74,0x6f,0x5f,0x69,0x00,0x00,0x04,0x63,
+0x61,0x6c,0x6c,0x00,0x00,0x01,0x2d,0x00,0x00,0x02,0x3e,0x3d,0x00,0x00,0x00,0x00,
+0x2e,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x26,0x00,0x00,0x00,
+0x06,0x00,0x00,0x01,0xad,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0xa6,0x00,0x03,0x00,0x06,
+0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,
+0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,
+0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x83,0xff,0x3f,0x01,
+0x17,0x03,0x40,0x00,0x01,0x40,0x80,0x01,0x01,0x80,0x00,0x02,0xa0,0xc0,0x80,0x01,
+0x01,0x80,0x80,0x01,0xad,0x00,0x81,0x01,0x01,0xc0,0x00,0x01,0x01,0x80,0x80,0x01,
+0x06,0x00,0x00,0x02,0xb3,0x40,0x81,0x01,0x18,0xfb,0xbf,0x01,0x06,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0c,0x62,0x6c,
+0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,
+0x65,0x6e,0x75,0x6d,0x00,0x00,0x05,0x74,0x69,0x6d,0x65,0x73,0x00,0x00,0x04,0x63,
+0x61,0x6c,0x6c,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x00,0x00,0xb9,
+0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x1a,0x00,0x00,0xa6,0x00,0x00,0x02,
+0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,0x99,0x00,0x40,0x02,0x97,0x02,0x40,0x00,
+0x06,0x00,0x00,0x02,0x04,0x01,0x80,0x02,0x01,0x40,0x00,0x03,0x20,0x41,0x00,0x02,
+0x29,0x00,0x00,0x02,0x06,0x00,0x00,0x02,0x20,0xc0,0x00,0x02,0x01,0x00,0x81,0x01,
+0x17,0x03,0x40,0x00,0x01,0x80,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0x00,0x01,0x02,
+0x01,0xc0,0x00,0x02,0xad,0x40,0x01,0x02,0x01,0x00,0x81,0x01,0x01,0xc0,0x00,0x02,
+0x01,0x40,0x80,0x02,0xb4,0x80,0x01,0x02,0x18,0xfb,0x3f,0x02,0x06,0x00,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x0c,0x62,0x6c,
+0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,
+0x65,0x6e,0x75,0x6d,0x00,0x00,0x04,0x75,0x70,0x74,0x6f,0x00,0x00,0x04,0x74,0x6f,
+0x5f,0x69,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,
+0x3c,0x3d,0x00,0x00,0x00,0x00,0xf8,0x00,0x05,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,
+0x25,0x00,0x00,0x00,0xa6,0x00,0x10,0x02,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,
+0x03,0x00,0x40,0x01,0x06,0x00,0x80,0x02,0x20,0x00,0x80,0x02,0x99,0x00,0xc0,0x02,
+0x17,0x03,0x40,0x00,0x06,0x00,0x80,0x02,0x04,0x01,0x00,0x03,0x01,0x40,0x80,0x03,
+0x01,0x80,0x00,0x04,0xa0,0x41,0x80,0x02,0x29,0x00,0x80,0x02,0x01,0x40,0x80,0x02,
+0x11,0x02,0x00,0x03,0xa0,0xc0,0x80,0x02,0x99,0x01,0xc0,0x02,0x06,0x00,0x80,0x02,
+0x20,0x40,0x81,0x02,0x97,0x00,0x40,0x00,0x06,0x00,0x80,0x02,0x01,0x40,0x01,0x02,
+0x97,0x03,0x40,0x00,0x01,0xc0,0x80,0x02,0x01,0x00,0x01,0x03,0xa0,0x80,0x81,0x02,
+0x01,0x00,0x81,0x02,0x01,0x80,0x00,0x03,0xac,0xc0,0x81,0x02,0x01,0x40,0x01,0x02,
+0x01,0x00,0x81,0x02,0x01,0x40,0x00,0x03,0xb4,0x00,0x82,0x02,0x98,0xfa,0xbf,0x02,
+0x06,0x00,0x80,0x02,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x04,0x73,0x74,0x65,0x70,0x00,
+0x00,0x08,0x6b,0x69,0x6e,0x64,0x5f,0x6f,0x66,0x3f,0x00,0x00,0x05,0x46,0x6c,0x6f,
+0x61,0x74,0x00,0x00,0x04,0x74,0x6f,0x5f,0x66,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,
+0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x3c,0x3d,0x00,0x00,0x00,0x00,0xb0,0x00,0x01,
+0x00,0x04,0x00,0x02,0x00,0x00,0x00,0x14,0x06,0x00,0x80,0x00,0x91,0x00,0x00,0x01,
+0xa0,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x80,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,
+0x04,0x02,0x00,0x01,0x84,0x01,0x80,0x01,0x05,0x00,0x00,0x02,0x20,0x41,0x81,0x00,
+0x48,0x00,0x80,0x00,0x04,0x03,0x00,0x01,0x84,0x01,0x80,0x01,0x05,0x00,0x00,0x02,
+0x20,0x41,0x81,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
+0x00,0x07,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x08,0x49,0x6e,0x74,0x65,
+0x67,0x72,0x61,0x6c,0x00,0x00,0x04,0x63,0x65,0x69,0x6c,0x00,0x00,0x05,0x66,0x6c,
+0x6f,0x6f,0x72,0x00,0x00,0x05,0x72,0x6f,0x75,0x6e,0x64,0x00,0x00,0x0c,0x61,0x6c,
+0x69,0x61,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x08,0x74,0x72,0x75,
+0x6e,0x63,0x61,0x74,0x65,0x00,0x00,0x00,0x00,0x26,0x00,0x02,0x00,0x03,0x00,0x00,
+0x00,0x00,0x00,0x03,0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x02,0x00,0x03,
+0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,
+0x00,0x01,0x00,0x04,0x00,0x02,0x00,0x00,0x00,0x0b,0x00,0x00,0x06,0x00,0x80,0x00,
+0x91,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,
+0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0xc0,0x80,0x00,
+0x84,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x07,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x08,0x49,0x6e,0x74,0x65,
+0x67,0x72,0x61,0x6c,0x00,0x00,0x02,0x3e,0x3e,0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,
+0x00,0x00,0x4d,0x00,0x04,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x00,
+0x26,0x00,0x00,0x02,0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,0x01,0x00,0x81,0x01,
+0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0x40,0x00,0x02,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x74,0x6f,
+0x5f,0x69,0x00,0x00,0x05,0x74,0x69,0x6d,0x65,0x73,0x00,0x00,0x00,0x00,0x32,0x00,
+0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x15,0xc0,0x80,0x00,
+0x83,0x00,0x40,0x01,0xb1,0x00,0x80,0x00,0x16,0xc0,0x80,0x00,0x29,0x00,0x80,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x2f,0x00,0x00,0x00,0x00,0x55,
+0x00,0x04,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x0b,0x00,0x00,0x26,0x00,0x00,0x02,
+0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,0x01,0x00,0x81,0x01,0x01,0x40,0x00,0x02,
+0x20,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0x40,0x00,0x02,0x01,0xc0,0x00,0x02,
+0x20,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x04,0x74,0x6f,0x5f,0x69,0x00,0x00,0x05,0x74,0x69,0x6d,0x65,0x73,0x00,0x00,
+0x00,0x00,0x32,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,
+0x15,0xc0,0x80,0x00,0x83,0x00,0x40,0x01,0xb0,0x00,0x80,0x00,0x16,0xc0,0x80,0x00,
+0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x2a,0x00,
+0x00,0x00,0x00,0x48,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x84,0x00,0x80,0x00,0x29,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x04,0x68,0x61,0x73,0x68,0x00,0x00,0x00,0x02,0x2f,0x00,0x06,0x00,0x0a,0x00,0x00,
+0x00,0x00,0x00,0x5a,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x03,0x20,0x00,0x00,0x03,
+0x99,0x00,0x40,0x03,0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x03,0x04,0x01,0x80,0x03,
+0xa0,0x40,0x00,0x03,0x29,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x20,0xc0,0x00,0x03,
+0x01,0x80,0x01,0x01,0x06,0x00,0x00,0x03,0x20,0x00,0x01,0x03,0x01,0x80,0x81,0x01,
+0x01,0x80,0x00,0x03,0x11,0x03,0x80,0x03,0xa0,0x40,0x01,0x03,0x99,0x01,0x40,0x03,
+0x01,0xc0,0x00,0x03,0x11,0x03,0x80,0x03,0xa0,0x40,0x01,0x03,0x19,0x0b,0x40,0x03,
+0x01,0xc0,0x00,0x02,0x06,0x00,0x00,0x03,0x20,0xc0,0x01,0x03,0x99,0x00,0x40,0x03,
+0x97,0x01,0x40,0x00,0x01,0x00,0x01,0x03,0xad,0x00,0x02,0x03,0x01,0x80,0x01,0x02,
+0x01,0x80,0x80,0x02,0x17,0x03,0x40,0x00,0x01,0x40,0x00,0x03,0x01,0x40,0x81,0x03,
+0xa0,0x40,0x02,0x03,0x01,0x40,0x01,0x03,0xad,0x00,0x02,0x03,0x01,0x80,0x81,0x02,
+0x01,0x40,0x01,0x03,0x01,0x00,0x81,0x03,0xb3,0x80,0x02,0x03,0x18,0xfb,0x3f,0x03,
+0x06,0x00,0x00,0x03,0x29,0x00,0x00,0x03,0x01,0x80,0x00,0x03,0x04,0x06,0x80,0x03,
+0xa0,0xc0,0x02,0x03,0x99,0x00,0x40,0x03,0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x03,
+0x11,0x07,0x80,0x03,0x3d,0x00,0x00,0x04,0x20,0x41,0x03,0x03,0x01,0x80,0x00,0x03,
+0x01,0xc0,0x80,0x03,0xa0,0xc0,0x03,0x03,0x83,0xff,0xbf,0x03,0xb5,0x00,0x04,0x03,
+0x19,0x01,0x40,0x03,0x06,0x00,0x00,0x03,0x29,0x00,0x00,0x03,0x17,0x03,0x40,0x00,
+0x01,0x40,0x00,0x03,0x01,0x80,0x80,0x03,0xa0,0x40,0x02,0x03,0x01,0x80,0x00,0x03,
+0x20,0x00,0x03,0x03,0x01,0x80,0x01,0x01,0x01,0x80,0x00,0x03,0x01,0xc0,0x80,0x03,
+0xa0,0xc0,0x03,0x03,0x83,0xff,0xbf,0x03,0xb3,0x80,0x02,0x03,0x18,0xfa,0x3f,0x03,
+0x06,0x00,0x00,0x03,0x20,0xc0,0x01,0x03,0x20,0x40,0x04,0x03,0x99,0x02,0x40,0x03,
+0x01,0x80,0x00,0x03,0x01,0xc0,0x80,0x03,0xa0,0xc0,0x03,0x03,0x83,0xff,0xbf,0x03,
+0xb2,0x80,0x04,0x03,0x99,0x01,0x40,0x03,0x01,0x40,0x00,0x03,0x01,0x80,0x80,0x03,
+0xa0,0x40,0x02,0x03,0x06,0x00,0x00,0x03,0x29,0x00,0x00,0x03,0x00,0x00,0x00,0x01,
+0x00,0x00,0x0d,0x63,0x61,0x6e,0x27,0x74,0x20,0x69,0x74,0x65,0x72,0x61,0x74,0x65,
+0x00,0x00,0x00,0x13,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x04,0x65,
+0x61,0x63,0x68,0x00,0x00,0x05,0x66,0x69,0x72,0x73,0x74,0x00,0x00,0x04,0x6c,0x61,
+0x73,0x74,0x00,0x00,0x08,0x6b,0x69,0x6e,0x64,0x5f,0x6f,0x66,0x3f,0x00,0x00,0x06,
+0x46,0x69,0x78,0x6e,0x75,0x6d,0x00,0x00,0x0c,0x65,0x78,0x63,0x6c,0x75,0x64,0x65,
+0x5f,0x65,0x6e,0x64,0x3f,0x00,0x00,0x01,0x2b,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,
+0x00,0x00,0x01,0x3c,0x00,0x00,0x0b,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x5f,0x74,
+0x6f,0x3f,0x00,0x00,0x04,0x73,0x75,0x63,0x63,0x00,0x00,0x05,0x72,0x61,0x69,0x73,
+0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,
+0x3c,0x3d,0x3e,0x00,0x00,0x01,0x3e,0x00,0x00,0x01,0x21,0x00,0x00,0x02,0x3d,0x3d,
+0x00,0x00,0x00,0x00,0x87,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
+0x26,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x20,0x40,0x80,0x01,
+0x06,0x00,0x00,0x02,0x20,0xc0,0x00,0x02,0x20,0x40,0x00,0x02,0xa0,0x80,0x80,0x01,
+0x01,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,0x20,0x00,0x81,0x01,0x99,0x01,0xc0,0x01,
+0x01,0x80,0x80,0x01,0xad,0x40,0x81,0x01,0x01,0xc0,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x05,0x66,0x69,0x72,0x73,0x74,0x00,
+0x00,0x04,0x68,0x61,0x73,0x68,0x00,0x00,0x01,0x5e,0x00,0x00,0x04,0x6c,0x61,0x73,
+0x74,0x00,0x00,0x0c,0x65,0x78,0x63,0x6c,0x75,0x64,0x65,0x5f,0x65,0x6e,0x64,0x3f,
+0x00,0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0x41,0x00,0x01,0x00,0x04,0x00,0x00,0x00,
+0x00,0x00,0x04,0x00,0x06,0x00,0x80,0x00,0x91,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,
+0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x69,0x6e,
+0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x0a,0x45,0x6e,0x75,0x6d,0x65,0x72,0x61,0x62,
+0x6c,0x65,0x00,0x00,0x00,0x01,0x23,0x00,0x01,0x00,0x04,0x00,0x0b,0x00,0x00,0x00,
+0x26,0x00,0x00,0x00,0x06,0x00,0x80,0x00,0x91,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x02,0x00,0x01,0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,
+0x46,0x00,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,0x46,0x40,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,0x46,0x80,0x81,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x0a,0x00,0x01,0x46,0xc0,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0c,0x00,0x01,
+0x46,0x00,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x0e,0x00,0x01,0x46,0x40,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,0x46,0x80,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x12,0x00,0x01,0x46,0xc0,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x14,0x00,0x01,
+0x46,0x00,0x83,0x00,0x04,0x06,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x0d,0x00,0x07,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x0a,
+0x43,0x6f,0x6d,0x70,0x61,0x72,0x61,0x62,0x6c,0x65,0x00,0x00,0x09,0x65,0x61,0x63,
+0x68,0x5f,0x6c,0x69,0x6e,0x65,0x00,0x00,0x04,0x67,0x73,0x75,0x62,0x00,0x00,0x05,
+0x67,0x73,0x75,0x62,0x21,0x00,0x00,0x04,0x73,0x63,0x61,0x6e,0x00,0x00,0x03,0x73,
+0x75,0x62,0x00,0x00,0x04,0x73,0x75,0x62,0x21,0x00,0x00,0x09,0x65,0x61,0x63,0x68,
+0x5f,0x63,0x68,0x61,0x72,0x00,0x00,0x09,0x65,0x61,0x63,0x68,0x5f,0x62,0x79,0x74,
+0x65,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x02,0x3d,0x7e,0x00,0x00,0x05,0x6d,
+0x61,0x74,0x63,0x68,0x00,0x00,0x00,0x00,0xd5,0x00,0x04,0x00,0x0a,0x00,0x00,0x00,
+0x00,0x00,0x25,0x00,0xa6,0x00,0x00,0x00,0x83,0xff,0x3f,0x01,0x17,0x06,0x40,0x00,
+0x01,0x40,0x00,0x02,0x06,0x00,0x80,0x02,0x01,0x80,0x00,0x03,0x01,0xc0,0x80,0x03,
+0xad,0x80,0x80,0x03,0x01,0x80,0x00,0x04,0xae,0xc0,0x80,0x03,0x20,0x41,0x80,0x02,
+0xa0,0x00,0x00,0x02,0x01,0xc0,0x00,0x02,0xad,0x80,0x00,0x02,0x01,0x00,0x01,0x01,
+0x06,0x00,0x00,0x02,0x83,0x04,0xc0,0x02,0x01,0x80,0x00,0x03,0x20,0x01,0x01,0x02,
+0x01,0x00,0x81,0x01,0x18,0xf7,0x3f,0x02,0x06,0x00,0x00,0x02,0x20,0x40,0x01,0x02,
+0x01,0x80,0x80,0x02,0xb5,0x80,0x01,0x02,0x99,0x04,0x40,0x02,0x01,0x40,0x00,0x02,
+0x06,0x00,0x80,0x02,0x01,0x80,0x00,0x03,0x06,0x00,0x80,0x03,0x20,0x40,0x81,0x03,
+0x01,0x80,0x00,0x04,0xae,0xc0,0x80,0x03,0x20,0x41,0x80,0x02,0xa0,0x00,0x00,0x02,
+0x06,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
+0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x01,0x2b,0x00,
+0x00,0x01,0x2d,0x00,0x00,0x05,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x04,0x73,0x69,
+0x7a,0x65,0x00,0x00,0x01,0x3e,0x00,0x00,0x00,0x01,0x1d,0x00,0x03,0x00,0x08,0x00,
+0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0xa6,0x00,0x08,0x00,0x01,0x40,0x80,0x01,
+0x20,0x00,0x80,0x01,0x83,0x00,0x40,0x02,0xb2,0x40,0x80,0x01,0x99,0x05,0xc0,0x01,
+0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,0x83,0xff,0xbf,0x02,0xa0,0xc0,0x00,0x02,
+0x03,0xff,0xbf,0x02,0x20,0x81,0x80,0x01,0x01,0x40,0x00,0x02,0x03,0x00,0xc0,0x02,
+0xa0,0xc0,0x00,0x02,0xa0,0x00,0x81,0x01,0x17,0x0c,0x40,0x00,0x01,0x40,0x80,0x01,
+0x20,0x00,0x80,0x01,0x03,0x00,0x40,0x02,0xb2,0x40,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x01,0x80,0x80,0x01,0x99,0x06,0xc0,0x01,0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,
+0x83,0xff,0xbf,0x02,0xa0,0xc0,0x00,0x02,0x03,0xff,0xbf,0x02,0x20,0x81,0x80,0x01,
+0x01,0x80,0x00,0x02,0x01,0x40,0x80,0x02,0x83,0xff,0x3f,0x03,0xa0,0xc0,0x80,0x02,
+0xa0,0x40,0x01,0x02,0xa0,0x00,0x81,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,
+0x91,0x03,0x00,0x02,0x3d,0x00,0x80,0x02,0x20,0x81,0x81,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x01,0x00,0x00,0x19,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,
+0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,
+0x00,0x00,0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x3d,0x3d,0x00,
+0x00,0x05,0x73,0x70,0x6c,0x69,0x74,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x04,0x6a,
+0x6f,0x69,0x6e,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x05,0x72,0x61,0x69,
+0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,
+0x6f,0x72,0x00,0x00,0x00,0x00,0x78,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,
+0x12,0x00,0x00,0x00,0xa6,0x00,0x08,0x00,0x06,0x00,0x00,0x02,0x37,0x40,0x81,0x02,
+0x01,0x40,0x00,0x03,0x38,0x80,0x81,0x02,0x01,0x80,0x00,0x03,0xa1,0x3f,0x00,0x02,
+0x01,0x00,0x81,0x01,0x06,0x00,0x80,0x02,0xa0,0x40,0x00,0x02,0x99,0x02,0x40,0x02,
+0x06,0x00,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0x80,0x00,0x02,0x06,0x00,0x00,0x02,
+0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x04,0x67,0x73,0x75,0x62,0x00,0x00,0x02,0x21,0x3d,0x00,
+0x00,0x07,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x00,0x00,0xa6,0x00,0x03,
+0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0c,0xa6,0x00,0x00,0x02,0x11,0x00,0x80,0x01,
+0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,0x19,0x01,0xc0,0x01,0x05,0x00,0x80,0x01,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x11,0x02,0x00,0x02,0x3d,0x00,0x80,0x02,
+0x20,0xc1,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x18,0x73,
+0x63,0x61,0x6e,0x20,0x6e,0x6f,0x74,0x20,0x61,0x76,0x61,0x69,0x6c,0x61,0x62,0x6c,
+0x65,0x20,0x28,0x79,0x65,0x74,0x29,0x00,0x00,0x00,0x05,0x00,0x06,0x4f,0x62,0x6a,
+0x65,0x63,0x74,0x00,0x00,0x0e,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x64,0x65,0x66,0x69,
+0x6e,0x65,0x64,0x3f,0x00,0x00,0x06,0x52,0x65,0x67,0x65,0x78,0x70,0x00,0x00,0x05,
+0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x13,0x4e,0x6f,0x74,0x49,0x6d,0x70,0x6c,0x65,
+0x6d,0x65,0x6e,0x74,0x65,0x64,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x00,0x01,0x1d,
+0x00,0x03,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0xa6,0x00,0x08,0x00,
+0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x83,0x00,0x40,0x02,0xb2,0x40,0x80,0x01,
+0x99,0x05,0xc0,0x01,0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,0x83,0xff,0xbf,0x02,
+0xa0,0xc0,0x00,0x02,0x83,0x00,0xc0,0x02,0x20,0x81,0x80,0x01,0x01,0x40,0x00,0x02,
+0x03,0x00,0xc0,0x02,0xa0,0xc0,0x00,0x02,0xa0,0x00,0x81,0x01,0x17,0x0c,0x40,0x00,
+0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x03,0x00,0x40,0x02,0xb2,0x40,0x80,0x01,
+0x99,0x00,0xc0,0x01,0x01,0x80,0x80,0x01,0x99,0x06,0xc0,0x01,0x06,0x00,0x80,0x01,
+0x01,0x40,0x00,0x02,0x83,0xff,0xbf,0x02,0xa0,0xc0,0x00,0x02,0x83,0x00,0xc0,0x02,
+0x20,0x81,0x80,0x01,0x01,0x80,0x00,0x02,0x01,0x40,0x80,0x02,0x83,0xff,0x3f,0x03,
+0xa0,0xc0,0x80,0x02,0xa0,0x40,0x01,0x02,0xa0,0x00,0x81,0x01,0x17,0x02,0x40,0x00,
+0x06,0x00,0x80,0x01,0x91,0x03,0x00,0x02,0x3d,0x00,0x80,0x02,0x20,0x81,0x81,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x19,0x77,0x72,0x6f,0x6e,0x67,
+0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,
+0x65,0x6e,0x74,0x73,0x00,0x00,0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,
+0x02,0x3d,0x3d,0x00,0x00,0x05,0x73,0x70,0x6c,0x69,0x74,0x00,0x00,0x02,0x5b,0x5d,
+0x00,0x00,0x04,0x6a,0x6f,0x69,0x6e,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,
+0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x00,0x00,0x77,0x00,0x04,0x00,0x07,0x00,
+0x00,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0xa6,0x00,0x08,0x00,0x06,0x00,0x00,0x02,
+0x37,0x40,0x81,0x02,0x01,0x40,0x00,0x03,0x38,0x80,0x81,0x02,0x01,0x80,0x00,0x03,
+0xa1,0x3f,0x00,0x02,0x01,0x00,0x81,0x01,0x06,0x00,0x80,0x02,0xa0,0x40,0x00,0x02,
+0x99,0x02,0x40,0x02,0x06,0x00,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0x80,0x00,0x02,
+0x06,0x00,0x00,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x73,0x75,0x62,0x00,0x00,0x02,
+0x21,0x3d,0x00,0x00,0x07,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x00,0x00,
+0x7d,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0xa6,0x00,0x00,0x00,
+0x83,0xff,0x3f,0x01,0x17,0x04,0x40,0x00,0x01,0x40,0x80,0x01,0x06,0x00,0x00,0x02,
+0x01,0x80,0x80,0x02,0xa0,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x01,0x80,0x80,0x01,
+0xad,0x80,0x80,0x01,0x01,0xc0,0x00,0x01,0x01,0x80,0x80,0x01,0x06,0x00,0x00,0x02,
+0x20,0x00,0x01,0x02,0xb3,0xc0,0x80,0x01,0x98,0xf9,0xbf,0x01,0x06,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,
+0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x00,0x00,0x91,0x00,0x04,0x00,0x08,0x00,
+0x00,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x02,
+0x20,0x00,0x00,0x02,0x01,0x00,0x01,0x01,0x83,0xff,0xbf,0x01,0x17,0x04,0x40,0x00,
+0x01,0x40,0x00,0x02,0x01,0x80,0x80,0x02,0x01,0xc0,0x00,0x03,0xa0,0x80,0x80,0x02,
+0xa0,0x40,0x00,0x02,0x01,0xc0,0x00,0x02,0xad,0xc0,0x00,0x02,0x01,0x00,0x81,0x01,
+0x01,0xc0,0x00,0x02,0x01,0x80,0x80,0x02,0x20,0x40,0x81,0x02,0xb3,0x00,0x01,0x02,
+0x98,0xf9,0x3f,0x02,0x06,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x06,0x00,0x05,0x62,0x79,0x74,0x65,0x73,0x00,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,
+0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x00,0x00,0x8f,0x00,0x06,0x00,0x0a,0x00,
+0x00,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x26,0x00,0x00,0x04,0x06,0x00,0x00,0x03,
+0x83,0xff,0xbf,0x03,0x01,0x40,0x00,0x04,0x20,0x01,0x00,0x03,0x01,0x80,0x01,0x02,
+0x06,0x00,0x00,0x03,0x01,0x40,0x80,0x03,0xad,0x40,0x80,0x03,0x03,0xff,0x3f,0x04,
+0x41,0xc0,0x81,0x03,0xa0,0x00,0x00,0x03,0x01,0x80,0x81,0x02,0x06,0x00,0x00,0x03,
+0x01,0x00,0x81,0x03,0x01,0x80,0x00,0x04,0x01,0x40,0x81,0x04,0xb7,0xc1,0x81,0x03,
+0x3d,0x00,0x00,0x04,0xa0,0xc0,0x80,0x03,0xa0,0x80,0x00,0x03,0x29,0x00,0x00,0x03,
+0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x5b,0x5d,0x00,
+0x00,0x01,0x2b,0x00,0x00,0x07,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x04,
+0x6a,0x6f,0x69,0x6e,0x00,0x00,0x00,0x00,0x9c,0x00,0x03,0x00,0x07,0x00,0x00,0x00,
+0x00,0x00,0x0d,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x01,0x84,0x00,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x19,0x02,0xc0,0x01,0x06,0x00,0x80,0x01,0x91,0x01,0x00,0x02,
+0x3d,0x00,0x80,0x02,0x20,0x81,0x80,0x01,0x01,0x40,0x80,0x01,0x06,0x00,0x00,0x02,
+0xa0,0x00,0x81,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x1b,0x74,
+0x79,0x70,0x65,0x20,0x6d,0x69,0x73,0x6d,0x61,0x74,0x63,0x68,0x3a,0x20,0x53,0x74,
+0x72,0x69,0x6e,0x67,0x20,0x67,0x69,0x76,0x65,0x6e,0x00,0x00,0x00,0x05,0x00,0x0b,
+0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x06,0x74,0x6f,
+0x5f,0x73,0x74,0x72,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,
+0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x02,0x3d,0x7e,0x00,0x00,0x00,
+0x00,0x3a,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x06,0xa6,0x00,0x00,0x02,
+0x01,0x40,0x80,0x01,0x06,0x00,0x00,0x02,0x01,0x80,0x80,0x02,0xa1,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x05,0x6d,0x61,
+0x74,0x63,0x68,0x00,0x00,0x00,0x00,0x22,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x02,0x00,0x00,0x05,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,
+0x00,0x04,0x00,0x00,0x06,0x00,0x80,0x00,0x91,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,
+0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x69,0x6e,
+0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x0a,0x43,0x6f,0x6d,0x70,0x61,0x72,0x61,0x62,
+0x6c,0x65,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x05,0xef,0x00,0x00,0x00,0x3c,0x00,
+0x05,0x62,0x6c,0x6f,0x63,0x6b,0x00,0x03,0x69,0x64,0x78,0x00,0x06,0x6c,0x65,0x6e,
+0x67,0x74,0x68,0x00,0x03,0x65,0x6c,0x6d,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x03,
+0x6f,0x62,0x6a,0x00,0x01,0x78,0x00,0x05,0x6f,0x74,0x68,0x65,0x72,0x00,0x03,0x6c,
+0x65,0x6e,0x00,0x01,0x69,0x00,0x01,0x6e,0x00,0x03,0x6b,0x65,0x79,0x00,0x03,0x72,
+0x65,0x74,0x00,0x05,0x6e,0x61,0x6d,0x65,0x73,0x00,0x04,0x6e,0x61,0x6d,0x65,0x00,
+0x03,0x63,0x6d,0x70,0x00,0x03,0x6d,0x69,0x6e,0x00,0x03,0x6d,0x61,0x78,0x00,0x03,
+0x76,0x61,0x6c,0x00,0x03,0x61,0x72,0x79,0x00,0x06,0x69,0x66,0x6e,0x6f,0x6e,0x65,
+0x00,0x07,0x70,0x61,0x74,0x74,0x65,0x72,0x6e,0x00,0x02,0x73,0x76,0x00,0x04,0x61,
+0x72,0x67,0x73,0x00,0x03,0x73,0x79,0x6d,0x00,0x04,0x66,0x6c,0x61,0x67,0x00,0x06,
+0x72,0x65,0x73,0x75,0x6c,0x74,0x00,0x01,0x79,0x00,0x05,0x61,0x72,0x79,0x5f,0x54,
+0x00,0x05,0x61,0x72,0x79,0x5f,0x46,0x00,0x06,0x73,0x6f,0x72,0x74,0x65,0x64,0x00,
+0x04,0x77,0x6f,0x72,0x6b,0x00,0x07,0x73,0x72,0x63,0x5f,0x61,0x72,0x79,0x00,0x04,
+0x68,0x65,0x61,0x64,0x00,0x04,0x74,0x61,0x69,0x6c,0x00,0x03,0x73,0x72,0x63,0x00,
+0x03,0x64,0x73,0x74,0x00,0x01,0x6a,0x00,0x01,0x68,0x00,0x01,0x65,0x00,0x07,0x6d,
+0x65,0x73,0x73,0x61,0x67,0x65,0x00,0x04,0x68,0x61,0x73,0x68,0x00,0x01,0x6b,0x00,
+0x01,0x76,0x00,0x04,0x6b,0x65,0x79,0x73,0x00,0x04,0x76,0x61,0x6c,0x73,0x00,0x01,
+0x62,0x00,0x01,0x73,0x00,0x01,0x61,0x00,0x03,0x6e,0x75,0x6d,0x00,0x04,0x73,0x74,
+0x65,0x70,0x00,0x04,0x6c,0x61,0x73,0x74,0x00,0x03,0x6c,0x69,0x6d,0x00,0x06,0x6f,
+0x66,0x66,0x73,0x65,0x74,0x00,0x03,0x70,0x6f,0x73,0x00,0x03,0x73,0x74,0x72,0x00,
+0x03,0x72,0x65,0x67,0x00,0x05,0x62,0x79,0x74,0x65,0x73,0x00,0x05,0x76,0x61,0x6c,
+0x75,0x65,0x00,0x02,0x72,0x65,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,
+0x00,0x03,0x00,0x03,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x00,
+0x00,0x01,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x01,0x00,0x05,
+0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x04,0xff,0xff,0x00,0x00,0x00,0x06,
+0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x07,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x08,0x00,0x03,0x00,0x09,0x00,0x04,0x00,0x07,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x08,0x00,0x03,0x00,0x09,0x00,0x04,0x00,0x07,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x08,0x00,0x03,0x00,0x0a,0x00,0x04,0x00,0x09,0x00,0x05,0x00,0x0b,
+0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x09,0x00,0x03,0x00,0x0c,0x00,0x04,0xff,0xff,
+0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0e,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x07,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0f,
+0x00,0x03,0x00,0x07,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0f,0x00,0x03,0x00,0x07,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0f,0x00,0x03,0x00,0x07,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x0f,0x00,0x03,0x00,0x07,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0f,
+0x00,0x03,0x00,0x10,0x00,0x01,0x00,0x11,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x00,
+0x00,0x01,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x12,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x12,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x13,0x00,0x02,0x00,0x12,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x14,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x0c,
+0x00,0x03,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,
+0x00,0x02,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x13,
+0x00,0x02,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x13,
+0x00,0x02,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x15,0x00,0x01,0x00,0x00,
+0x00,0x02,0x00,0x13,0x00,0x03,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x16,
+0x00,0x03,0x00,0x05,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x12,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x17,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x18,0x00,0x03,0x00,0x19,
+0x00,0x04,0x00,0x1a,0x00,0x05,0x00,0x06,0x00,0x01,0x00,0x1b,0x00,0x02,0xff,0xff,
+0x00,0x00,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x19,
+0x00,0x02,0x00,0x1a,0x00,0x03,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,
+0x00,0x01,0x00,0x19,0x00,0x02,0x00,0x1a,0x00,0x03,0x00,0x12,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x1c,0x00,0x02,0x00,0x1d,0x00,0x03,0x00,0x12,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x13,0x00,0x02,0x00,0x12,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x1e,0x00,0x01,0x00,0x1f,0x00,0x02,0x00,0x20,
+0x00,0x03,0x00,0x21,0x00,0x04,0x00,0x22,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x23,
+0x00,0x07,0x00,0x24,0x00,0x08,0x00,0x0b,0x00,0x09,0x00,0x09,0x00,0x0a,0x00,0x25,
+0x00,0x0b,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x13,
+0x00,0x02,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x26,
+0x00,0x02,0x00,0x27,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x17,0x00,0x01,0x00,0x00,
+0x00,0x02,0x00,0x28,0x00,0x01,0x00,0x0e,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x28,
+0x00,0x01,0x00,0x0e,0x00,0x02,0x00,0x17,0x00,0x03,0xff,0xff,0x00,0x00,0x00,0x29,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x2a,0x00,0x01,0x00,0x2b,0x00,0x02,0xff,0xff,
+0x00,0x00,0x00,0x29,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x2a,0x00,0x01,0x00,0x2b,
+0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x0b,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,
+0x00,0x01,0x00,0x2c,0x00,0x02,0x00,0x2d,0x00,0x03,0x00,0x08,0x00,0x04,0x00,0x09,
+0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x2a,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,
+0x00,0x01,0x00,0x2a,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x29,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x2a,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x07,0x00,0x01,0x00,0x00,
+0x00,0x02,0x00,0x26,0x00,0x03,0x00,0x2a,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x2a,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x2a,0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,
+0x00,0x00,0x00,0x2a,0x00,0x01,0x00,0x2b,0x00,0x02,0xff,0xff,0x00,0x00,0xff,0xff,
+0x00,0x00,0x00,0x2e,0x00,0x01,0x00,0x2c,0x00,0x02,0x00,0x2a,0x00,0x01,0x00,0x2b,
+0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x2a,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x2e,
+0x00,0x01,0x00,0x26,0x00,0x02,0x00,0x2a,0x00,0x01,0x00,0x2b,0x00,0x02,0xff,0xff,
+0x00,0x00,0x00,0x2e,0x00,0x01,0x00,0x2c,0x00,0x02,0x00,0x2a,0x00,0x01,0x00,0x2b,
+0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x2a,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x2e,
+0x00,0x01,0x00,0x26,0x00,0x02,0x00,0x2a,0x00,0x01,0x00,0x2b,0x00,0x02,0xff,0xff,
+0x00,0x00,0x00,0x26,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x2a,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x2f,0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x1b,
+0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x30,0x00,0x01,0xff,0xff,
+0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x31,
+0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x09,0x00,0x03,0xff,0xff,0x00,0x00,0x00,0x00,
+0x00,0x01,0x00,0x09,0x00,0x02,0x00,0x31,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x09,
+0x00,0x03,0x00,0x31,0x00,0x01,0x00,0x32,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x09,
+0x00,0x04,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x07,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x0a,0x00,0x03,0x00,0x07,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0a,
+0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x02,0x00,0x33,0x00,0x03,0x00,0x34,
+0x00,0x04,0x00,0x09,0x00,0x05,0xff,0xff,0x00,0x00,0x00,0x26,0x00,0x02,0x00,0x00,
+0x00,0x01,0x00,0x35,0x00,0x02,0x00,0x36,0x00,0x03,0x00,0x17,0x00,0x01,0x00,0x00,
+0x00,0x02,0x00,0x17,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x03,0x00,0x38,
+0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x17,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x17,
+0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x36,
+0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x02,0x00,0x36,0x00,0x03,0x00,0x36,
+0x00,0x01,0x00,0x3a,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x2e,0x00,0x04,0x00,0x30,
+0x00,0x05,0x00,0x3b,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x3b,0x00,0x01,0x00,0x00,
+0x00,0x02,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/array.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,1113 @@
+/*
+** array.c - Array class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/string.h"
+#include "mruby/range.h"
+#include "value_array.h"
+
+#define ARY_DEFAULT_LEN 4
+#define ARY_SHRINK_RATIO 5 /* must be larger than 2 */
+#define ARY_C_MAX_SIZE (SIZE_MAX / sizeof(mrb_value))
+#define ARY_MAX_SIZE ((ARY_C_MAX_SIZE < (size_t)MRB_INT_MAX) ? (mrb_int)ARY_C_MAX_SIZE : MRB_INT_MAX-1)
+
+static inline mrb_value
+ary_elt(mrb_value ary, mrb_int offset)
+{
+ if (RARRAY_LEN(ary) == 0) return mrb_nil_value();
+ if (offset < 0 || RARRAY_LEN(ary) <= offset) {
+ return mrb_nil_value();
+ }
+ return RARRAY_PTR(ary)[offset];
+}
+
+static struct RArray*
+ary_new_capa(mrb_state *mrb, mrb_int capa)
+{
+ struct RArray *a;
+ mrb_int blen;
+
+ if (capa > ARY_MAX_SIZE) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big");
+ }
+ blen = capa * sizeof(mrb_value);
+ if (blen < capa) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big");
+ }
+
+ a = (struct RArray*)mrb_obj_alloc(mrb, MRB_TT_ARRAY, mrb->array_class);
+ a->ptr = (mrb_value *)mrb_malloc(mrb, blen);
+ a->aux.capa = capa;
+ a->len = 0;
+
+ return a;
+}
+
+MRB_API mrb_value
+mrb_ary_new_capa(mrb_state *mrb, mrb_int capa)
+{
+ struct RArray *a = ary_new_capa(mrb, capa);
+ return mrb_obj_value(a);
+}
+
+MRB_API mrb_value
+mrb_ary_new(mrb_state *mrb)
+{
+ return mrb_ary_new_capa(mrb, 0);
+}
+
+/*
+ * to copy array, use this instead of memcpy because of portability
+ * * gcc on ARM may fail optimization of memcpy
+ * http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka3934.html
+ * * gcc on MIPS also fail
+ * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39755
+ * * memcpy doesn't exist on freestanding environment
+ *
+ * If you optimize for binary size, use memcpy instead of this at your own risk
+ * of above portability issue.
+ *
+ * see also http://togetter.com/li/462898
+ *
+ */
+static inline void
+array_copy(mrb_value *dst, const mrb_value *src, mrb_int size)
+{
+ mrb_int i;
+
+ for (i = 0; i < size; i++) {
+ dst[i] = src[i];
+ }
+}
+
+MRB_API mrb_value
+mrb_ary_new_from_values(mrb_state *mrb, mrb_int size, const mrb_value *vals)
+{
+ mrb_value ary;
+ struct RArray *a;
+
+ ary = mrb_ary_new_capa(mrb, size);
+ a = mrb_ary_ptr(ary);
+ array_copy(a->ptr, vals, size);
+ a->len = size;
+
+ return ary;
+}
+
+MRB_API mrb_value
+mrb_assoc_new(mrb_state *mrb, mrb_value car, mrb_value cdr)
+{
+ struct RArray *a;
+
+ a = ary_new_capa(mrb, 2);
+ a->ptr[0] = car;
+ a->ptr[1] = cdr;
+ a->len = 2;
+ return mrb_obj_value(a);
+}
+
+static void
+ary_fill_with_nil(mrb_value *ptr, mrb_int size)
+{
+ mrb_value nil = mrb_nil_value();
+
+ while (size--) {
+ *ptr++ = nil;
+ }
+}
+
+static void
+ary_modify(mrb_state *mrb, struct RArray *a)
+{
+ if (ARY_SHARED_P(a)) {
+ mrb_shared_array *shared = a->aux.shared;
+
+ if (shared->refcnt == 1 && a->ptr == shared->ptr) {
+ a->ptr = shared->ptr;
+ a->aux.capa = a->len;
+ mrb_free(mrb, shared);
+ }
+ else {
+ mrb_value *ptr, *p;
+ mrb_int len;
+
+ p = a->ptr;
+ len = a->len * sizeof(mrb_value);
+ ptr = (mrb_value *)mrb_malloc(mrb, len);
+ if (p) {
+ array_copy(ptr, p, a->len);
+ }
+ a->ptr = ptr;
+ a->aux.capa = a->len;
+ mrb_ary_decref(mrb, shared);
+ }
+ ARY_UNSET_SHARED_FLAG(a);
+ }
+}
+
+MRB_API void
+mrb_ary_modify(mrb_state *mrb, struct RArray* a)
+{
+ mrb_write_barrier(mrb, (struct RBasic*)a);
+ ary_modify(mrb, a);
+}
+
+static void
+ary_make_shared(mrb_state *mrb, struct RArray *a)
+{
+ if (!ARY_SHARED_P(a)) {
+ mrb_shared_array *shared = (mrb_shared_array *)mrb_malloc(mrb, sizeof(mrb_shared_array));
+
+ shared->refcnt = 1;
+ if (a->aux.capa > a->len) {
+ a->ptr = shared->ptr = (mrb_value *)mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*a->len+1);
+ }
+ else {
+ shared->ptr = a->ptr;
+ }
+ shared->len = a->len;
+ a->aux.shared = shared;
+ ARY_SET_SHARED_FLAG(a);
+ }
+}
+
+static void
+ary_expand_capa(mrb_state *mrb, struct RArray *a, mrb_int len)
+{
+ mrb_int capa = a->aux.capa;
+
+ if (len > ARY_MAX_SIZE) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big");
+ }
+
+ if (capa == 0) {
+ capa = ARY_DEFAULT_LEN;
+ }
+ while (capa < len) {
+ capa *= 2;
+ }
+
+ if (capa > ARY_MAX_SIZE) capa = ARY_MAX_SIZE; /* len <= capa <= ARY_MAX_SIZE */
+
+ if (capa > a->aux.capa) {
+ mrb_value *expanded_ptr = (mrb_value *)mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*capa);
+
+ a->aux.capa = capa;
+ a->ptr = expanded_ptr;
+ }
+}
+
+static void
+ary_shrink_capa(mrb_state *mrb, struct RArray *a)
+{
+ mrb_int capa = a->aux.capa;
+
+ if (capa < ARY_DEFAULT_LEN * 2) return;
+ if (capa <= a->len * ARY_SHRINK_RATIO) return;
+
+ do {
+ capa /= 2;
+ if (capa < ARY_DEFAULT_LEN) {
+ capa = ARY_DEFAULT_LEN;
+ break;
+ }
+ } while (capa > a->len * ARY_SHRINK_RATIO);
+
+ if (capa > a->len && capa < a->aux.capa) {
+ a->aux.capa = capa;
+ a->ptr = (mrb_value *)mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*capa);
+ }
+}
+
+MRB_API mrb_value
+mrb_ary_resize(mrb_state *mrb, mrb_value ary, mrb_int new_len)
+{
+ mrb_int old_len;
+ struct RArray *a = mrb_ary_ptr(ary);
+
+ ary_modify(mrb, a);
+ old_len = RARRAY_LEN(ary);
+ if (old_len != new_len) {
+ a->len = new_len;
+ if (new_len < old_len) {
+ ary_shrink_capa(mrb, a);
+ }
+ else {
+ ary_expand_capa(mrb, a, new_len);
+ ary_fill_with_nil(a->ptr + old_len, new_len - old_len);
+ }
+ }
+
+ return ary;
+}
+
+static mrb_value
+mrb_ary_s_create(mrb_state *mrb, mrb_value self)
+{
+ mrb_value *vals;
+ mrb_int len;
+
+ mrb_get_args(mrb, "*", &vals, &len);
+
+ return mrb_ary_new_from_values(mrb, len, vals);
+}
+
+static void
+ary_concat(mrb_state *mrb, struct RArray *a, mrb_value *ptr, mrb_int blen)
+{
+ mrb_int len = a->len + blen;
+
+ ary_modify(mrb, a);
+ if (a->aux.capa < len) ary_expand_capa(mrb, a, len);
+ array_copy(a->ptr+a->len, ptr, blen);
+ mrb_write_barrier(mrb, (struct RBasic*)a);
+ a->len = len;
+}
+
+MRB_API void
+mrb_ary_concat(mrb_state *mrb, mrb_value self, mrb_value other)
+{
+ struct RArray *a2 = mrb_ary_ptr(other);
+
+ ary_concat(mrb, mrb_ary_ptr(self), a2->ptr, a2->len);
+}
+
+static mrb_value
+mrb_ary_concat_m(mrb_state *mrb, mrb_value self)
+{
+ mrb_value *ptr;
+ mrb_int blen;
+
+ mrb_get_args(mrb, "a", &ptr, &blen);
+ ary_concat(mrb, mrb_ary_ptr(self), ptr, blen);
+ return self;
+}
+
+static mrb_value
+mrb_ary_plus(mrb_state *mrb, mrb_value self)
+{
+ struct RArray *a1 = mrb_ary_ptr(self);
+ struct RArray *a2;
+ mrb_value ary;
+ mrb_value *ptr;
+ mrb_int blen;
+
+ mrb_get_args(mrb, "a", &ptr, &blen);
+ ary = mrb_ary_new_capa(mrb, a1->len + blen);
+ a2 = mrb_ary_ptr(ary);
+ array_copy(a2->ptr, a1->ptr, a1->len);
+ array_copy(a2->ptr + a1->len, ptr, blen);
+ a2->len = a1->len + blen;
+
+ return ary;
+}
+
+static void
+ary_replace(mrb_state *mrb, struct RArray *a, mrb_value *argv, mrb_int len)
+{
+ ary_modify(mrb, a);
+ if (a->aux.capa < len)
+ ary_expand_capa(mrb, a, len);
+ array_copy(a->ptr, argv, len);
+ mrb_write_barrier(mrb, (struct RBasic*)a);
+ a->len = len;
+}
+
+MRB_API void
+mrb_ary_replace(mrb_state *mrb, mrb_value self, mrb_value other)
+{
+ struct RArray *a2 = mrb_ary_ptr(other);
+
+ ary_replace(mrb, mrb_ary_ptr(self), a2->ptr, a2->len);
+}
+
+static mrb_value
+mrb_ary_replace_m(mrb_state *mrb, mrb_value self)
+{
+ mrb_value other;
+
+ mrb_get_args(mrb, "A", &other);
+ mrb_ary_replace(mrb, self, other);
+
+ return self;
+}
+
+static mrb_value
+mrb_ary_times(mrb_state *mrb, mrb_value self)
+{
+ struct RArray *a1 = mrb_ary_ptr(self);
+ struct RArray *a2;
+ mrb_value ary;
+ mrb_value *ptr;
+ mrb_int times;
+
+ mrb_get_args(mrb, "i", ×);
+ if (times < 0) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "negative argument");
+ }
+ if (times == 0) return mrb_ary_new(mrb);
+
+ ary = mrb_ary_new_capa(mrb, a1->len * times);
+ a2 = mrb_ary_ptr(ary);
+ ptr = a2->ptr;
+ while (times--) {
+ array_copy(ptr, a1->ptr, a1->len);
+ ptr += a1->len;
+ a2->len += a1->len;
+ }
+
+ return ary;
+}
+
+static mrb_value
+mrb_ary_reverse_bang(mrb_state *mrb, mrb_value self)
+{
+ struct RArray *a = mrb_ary_ptr(self);
+
+ if (a->len > 1) {
+ mrb_value *p1, *p2;
+
+ ary_modify(mrb, a);
+ p1 = a->ptr;
+ p2 = a->ptr + a->len - 1;
+
+ while (p1 < p2) {
+ mrb_value tmp = *p1;
+ *p1++ = *p2;
+ *p2-- = tmp;
+ }
+ }
+ return self;
+}
+
+static mrb_value
+mrb_ary_reverse(mrb_state *mrb, mrb_value self)
+{
+ struct RArray *a = mrb_ary_ptr(self), *b;
+ mrb_value ary;
+
+ ary = mrb_ary_new_capa(mrb, a->len);
+ b = mrb_ary_ptr(ary);
+ if (a->len > 0) {
+ mrb_value *p1, *p2, *e;
+
+ p1 = a->ptr;
+ e = p1 + a->len;
+ p2 = b->ptr + a->len - 1;
+ while (p1 < e) {
+ *p2-- = *p1++;
+ }
+ b->len = a->len;
+ }
+ return ary;
+}
+
+MRB_API void
+mrb_ary_push(mrb_state *mrb, mrb_value ary, mrb_value elem)
+{
+ struct RArray *a = mrb_ary_ptr(ary);
+
+ ary_modify(mrb, a);
+ if (a->len == a->aux.capa)
+ ary_expand_capa(mrb, a, a->len + 1);
+ a->ptr[a->len++] = elem;
+ mrb_field_write_barrier_value(mrb, (struct RBasic*)a, elem);
+}
+
+static mrb_value
+mrb_ary_push_m(mrb_state *mrb, mrb_value self)
+{
+ mrb_value *argv;
+ mrb_int len;
+
+ mrb_get_args(mrb, "*", &argv, &len);
+ while (len--) {
+ mrb_ary_push(mrb, self, *argv++);
+ }
+
+ return self;
+}
+
+MRB_API mrb_value
+mrb_ary_pop(mrb_state *mrb, mrb_value ary)
+{
+ struct RArray *a = mrb_ary_ptr(ary);
+
+ if (a->len == 0) return mrb_nil_value();
+ return a->ptr[--a->len];
+}
+
+#define ARY_SHIFT_SHARED_MIN 10
+
+MRB_API mrb_value
+mrb_ary_shift(mrb_state *mrb, mrb_value self)
+{
+ struct RArray *a = mrb_ary_ptr(self);
+ mrb_value val;
+
+ if (a->len == 0) return mrb_nil_value();
+ if (ARY_SHARED_P(a)) {
+ L_SHIFT:
+ val = a->ptr[0];
+ a->ptr++;
+ a->len--;
+ return val;
+ }
+ if (a->len > ARY_SHIFT_SHARED_MIN) {
+ ary_make_shared(mrb, a);
+ goto L_SHIFT;
+ }
+ else {
+ mrb_value *ptr = a->ptr;
+ mrb_int size = a->len;
+
+ val = *ptr;
+ while (--size) {
+ *ptr = *(ptr+1);
+ ++ptr;
+ }
+ --a->len;
+ }
+ return val;
+}
+
+/* self = [1,2,3]
+ item = 0
+ self.unshift item
+ p self #=> [0, 1, 2, 3] */
+MRB_API mrb_value
+mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item)
+{
+ struct RArray *a = mrb_ary_ptr(self);
+
+ if (ARY_SHARED_P(a)
+ && a->aux.shared->refcnt == 1 /* shared only referenced from this array */
+ && a->ptr - a->aux.shared->ptr >= 1) /* there's room for unshifted item */ {
+ a->ptr--;
+ a->ptr[0] = item;
+ }
+ else {
+ ary_modify(mrb, a);
+ if (a->aux.capa < a->len + 1)
+ ary_expand_capa(mrb, a, a->len + 1);
+ value_move(a->ptr + 1, a->ptr, a->len);
+ a->ptr[0] = item;
+ }
+ a->len++;
+ mrb_field_write_barrier_value(mrb, (struct RBasic*)a, item);
+
+ return self;
+}
+
+static mrb_value
+mrb_ary_unshift_m(mrb_state *mrb, mrb_value self)
+{
+ struct RArray *a = mrb_ary_ptr(self);
+ mrb_value *vals;
+ mrb_int len;
+
+ mrb_get_args(mrb, "*", &vals, &len);
+ if (ARY_SHARED_P(a)
+ && a->aux.shared->refcnt == 1 /* shared only referenced from this array */
+ && a->ptr - a->aux.shared->ptr >= len) /* there's room for unshifted item */ {
+ a->ptr -= len;
+ }
+ else {
+ ary_modify(mrb, a);
+ if (len == 0) return self;
+ if (a->aux.capa < a->len + len)
+ ary_expand_capa(mrb, a, a->len + len);
+ value_move(a->ptr + len, a->ptr, a->len);
+ }
+ array_copy(a->ptr, vals, len);
+ a->len += len;
+ while (len--) {
+ mrb_field_write_barrier_value(mrb, (struct RBasic*)a, vals[len]);
+ }
+
+ return self;
+}
+
+MRB_API mrb_value
+mrb_ary_ref(mrb_state *mrb, mrb_value ary, mrb_int n)
+{
+ struct RArray *a = mrb_ary_ptr(ary);
+
+ /* range check */
+ if (n < 0) n += a->len;
+ if (n < 0 || a->len <= n) return mrb_nil_value();
+
+ return a->ptr[n];
+}
+
+MRB_API void
+mrb_ary_set(mrb_state *mrb, mrb_value ary, mrb_int n, mrb_value val)
+{
+ struct RArray *a = mrb_ary_ptr(ary);
+
+ ary_modify(mrb, a);
+ /* range check */
+ if (n < 0) {
+ n += a->len;
+ if (n < 0) {
+ mrb_raisef(mrb, E_INDEX_ERROR, "index %S out of array", mrb_fixnum_value(n - a->len));
+ }
+ }
+ if (a->len <= n) {
+ if (a->aux.capa <= n)
+ ary_expand_capa(mrb, a, n + 1);
+ ary_fill_with_nil(a->ptr + a->len, n + 1 - a->len);
+ a->len = n + 1;
+ }
+
+ a->ptr[n] = val;
+ mrb_field_write_barrier_value(mrb, (struct RBasic*)a, val);
+}
+
+MRB_API mrb_value
+mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_value rpl)
+{
+ struct RArray *a = mrb_ary_ptr(ary);
+ mrb_int tail, size;
+ const mrb_value *argv;
+ mrb_int i, argc;
+
+ ary_modify(mrb, a);
+
+ /* len check */
+ if (len < 0) mrb_raisef(mrb, E_INDEX_ERROR, "negative length (%S)", mrb_fixnum_value(len));
+
+ /* range check */
+ if (head < 0) {
+ head += a->len;
+ if (head < 0) {
+ mrb_raise(mrb, E_INDEX_ERROR, "index is out of array");
+ }
+ }
+ if (a->len < len || a->len < head + len) {
+ len = a->len - head;
+ }
+ tail = head + len;
+
+ /* size check */
+ if (mrb_array_p(rpl)) {
+ argc = RARRAY_LEN(rpl);
+ argv = RARRAY_PTR(rpl);
+ }
+ else {
+ argc = 1;
+ argv = &rpl;
+ }
+ size = head + argc;
+
+ if (tail < a->len) size += a->len - tail;
+ if (size > a->aux.capa)
+ ary_expand_capa(mrb, a, size);
+
+ if (head > a->len) {
+ ary_fill_with_nil(a->ptr + a->len, head - a->len);
+ }
+ else if (head < a->len) {
+ value_move(a->ptr + head + argc, a->ptr + tail, a->len - tail);
+ }
+
+ for (i = 0; i < argc; i++) {
+ *(a->ptr + head + i) = *(argv + i);
+ mrb_field_write_barrier_value(mrb, (struct RBasic*)a, argv[i]);
+ }
+
+ a->len = size;
+
+ return ary;
+}
+
+void
+mrb_ary_decref(mrb_state *mrb, mrb_shared_array *shared)
+{
+ shared->refcnt--;
+ if (shared->refcnt == 0) {
+ mrb_free(mrb, shared->ptr);
+ mrb_free(mrb, shared);
+ }
+}
+
+static mrb_value
+ary_subseq(mrb_state *mrb, struct RArray *a, mrb_int beg, mrb_int len)
+{
+ struct RArray *b;
+
+ ary_make_shared(mrb, a);
+ b = (struct RArray*)mrb_obj_alloc(mrb, MRB_TT_ARRAY, mrb->array_class);
+ b->ptr = a->ptr + beg;
+ b->len = len;
+ b->aux.shared = a->aux.shared;
+ b->aux.shared->refcnt++;
+ ARY_SET_SHARED_FLAG(b);
+
+ return mrb_obj_value(b);
+}
+
+static mrb_int
+aget_index(mrb_state *mrb, mrb_value index)
+{
+ if (mrb_fixnum_p(index)) {
+ return mrb_fixnum(index);
+ }
+ else if (mrb_float_p(index)) {
+ return (mrb_int)mrb_float(index);
+ }
+ else {
+ mrb_int i, argc;
+ mrb_value *argv;
+
+ mrb_get_args(mrb, "i*", &i, &argv, &argc);
+ return i;
+ }
+}
+
+/*
+ * call-seq:
+ * ary[index] -> obj or nil
+ * ary[start, length] -> new_ary or nil
+ * ary[range] -> new_ary or nil
+ * ary.slice(index) -> obj or nil
+ * ary.slice(start, length) -> new_ary or nil
+ * ary.slice(range) -> new_ary or nil
+ *
+ * Element Reference --- Returns the element at +index+, or returns a
+ * subarray starting at the +start+ index and continuing for +length+
+ * elements, or returns a subarray specified by +range+ of indices.
+ *
+ * Negative indices count backward from the end of the array (-1 is the last
+ * element). For +start+ and +range+ cases the starting index is just before
+ * an element. Additionally, an empty array is returned when the starting
+ * index for an element range is at the end of the array.
+ *
+ * Returns +nil+ if the index (or starting index) are out of range.
+ *
+ * a = [ "a", "b", "c", "d", "e" ]
+ * a[1] => "b"
+ * a[1,2] => ["b", "c"]
+ * a[1..-2] => ["b", "c", "d"]
+ *
+ */
+
+static mrb_value
+mrb_ary_aget(mrb_state *mrb, mrb_value self)
+{
+ struct RArray *a = mrb_ary_ptr(self);
+ mrb_int i, len;
+ mrb_value index;
+
+ if (mrb_get_args(mrb, "o|i", &index, &len) == 1) {
+ switch (mrb_type(index)) {
+ /* a[n..m] */
+ case MRB_TT_RANGE:
+ if (mrb_range_beg_len(mrb, index, &i, &len, a->len)) {
+ return ary_subseq(mrb, a, i, len);
+ }
+ else {
+ return mrb_nil_value();
+ }
+ case MRB_TT_FIXNUM:
+ return mrb_ary_ref(mrb, self, mrb_fixnum(index));
+ default:
+ return mrb_ary_ref(mrb, self, aget_index(mrb, index));
+ }
+ }
+
+ i = aget_index(mrb, index);
+ if (i < 0) i += a->len;
+ if (i < 0 || a->len < i) return mrb_nil_value();
+ if (len < 0) return mrb_nil_value();
+ if (a->len == i) return mrb_ary_new(mrb);
+ if (len > a->len - i) len = a->len - i;
+
+ return ary_subseq(mrb, a, i, len);
+}
+
+/*
+ * call-seq:
+ * ary[index] = obj -> obj
+ * ary[start, length] = obj or other_ary or nil -> obj or other_ary or nil
+ * ary[range] = obj or other_ary or nil -> obj or other_ary or nil
+ *
+ * Element Assignment --- Sets the element at +index+, or replaces a subarray
+ * from the +start+ index for +length+ elements, or replaces a subarray
+ * specified by the +range+ of indices.
+ *
+ * If indices are greater than the current capacity of the array, the array
+ * grows automatically. Elements are inserted into the array at +start+ if
+ * +length+ is zero.
+ *
+ * Negative indices will count backward from the end of the array. For
+ * +start+ and +range+ cases the starting index is just before an element.
+ *
+ * An IndexError is raised if a negative index points past the beginning of
+ * the array.
+ *
+ * See also Array#push, and Array#unshift.
+ *
+ * a = Array.new
+ * a[4] = "4"; #=> [nil, nil, nil, nil, "4"]
+ * a[0, 3] = [ 'a', 'b', 'c' ] #=> ["a", "b", "c", nil, "4"]
+ * a[1..2] = [ 1, 2 ] #=> ["a", 1, 2, nil, "4"]
+ * a[0, 2] = "?" #=> ["?", 2, nil, "4"]
+ * a[0..2] = "A" #=> ["A", "4"]
+ * a[-1] = "Z" #=> ["A", "Z"]
+ * a[1..-1] = nil #=> ["A", nil]
+ * a[1..-1] = [] #=> ["A"]
+ * a[0, 0] = [ 1, 2 ] #=> [1, 2, "A"]
+ * a[3, 0] = "B" #=> [1, 2, "A", "B"]
+ */
+
+static mrb_value
+mrb_ary_aset(mrb_state *mrb, mrb_value self)
+{
+ mrb_value v1, v2, v3;
+ mrb_int i, len;
+
+ if (mrb_get_args(mrb, "oo|o", &v1, &v2, &v3) == 2) {
+ switch (mrb_type(v1)) {
+ /* a[n..m] = v */
+ case MRB_TT_RANGE:
+ if (mrb_range_beg_len(mrb, v1, &i, &len, RARRAY_LEN(self))) {
+ mrb_ary_splice(mrb, self, i, len, v2);
+ }
+ break;
+ /* a[n] = v */
+ case MRB_TT_FIXNUM:
+ mrb_ary_set(mrb, self, mrb_fixnum(v1), v2);
+ break;
+ default:
+ mrb_ary_set(mrb, self, aget_index(mrb, v1), v2);
+ break;
+ }
+ return v2;
+ }
+
+ /* a[n,m] = v */
+ mrb_ary_splice(mrb, self, aget_index(mrb, v1), aget_index(mrb, v2), v3);
+ return v3;
+}
+
+static mrb_value
+mrb_ary_delete_at(mrb_state *mrb, mrb_value self)
+{
+ struct RArray *a = mrb_ary_ptr(self);
+ mrb_int index;
+ mrb_value val;
+ mrb_value *ptr;
+ mrb_int len;
+
+ mrb_get_args(mrb, "i", &index);
+ if (index < 0) index += a->len;
+ if (index < 0 || a->len <= index) return mrb_nil_value();
+
+ ary_modify(mrb, a);
+ val = a->ptr[index];
+
+ ptr = a->ptr + index;
+ len = a->len - index;
+ while (--len) {
+ *ptr = *(ptr+1);
+ ++ptr;
+ }
+ --a->len;
+
+ ary_shrink_capa(mrb, a);
+
+ return val;
+}
+
+static mrb_value
+mrb_ary_first(mrb_state *mrb, mrb_value self)
+{
+ struct RArray *a = mrb_ary_ptr(self);
+ mrb_int size;
+
+ if (mrb_get_args(mrb, "|i", &size) == 0) {
+ return (a->len > 0)? a->ptr[0]: mrb_nil_value();
+ }
+ if (size < 0) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "negative array size");
+ }
+
+ if (size > a->len) size = a->len;
+ if (ARY_SHARED_P(a)) {
+ return ary_subseq(mrb, a, 0, size);
+ }
+ return mrb_ary_new_from_values(mrb, size, a->ptr);
+}
+
+static mrb_value
+mrb_ary_last(mrb_state *mrb, mrb_value self)
+{
+ struct RArray *a = mrb_ary_ptr(self);
+ mrb_int size;
+
+ if (mrb_get_args(mrb, "|i", &size) == 0)
+ return (a->len > 0)? a->ptr[a->len - 1]: mrb_nil_value();
+
+ if (size < 0) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "negative array size");
+ }
+ if (size > a->len) size = a->len;
+ if (ARY_SHARED_P(a) || size > ARY_DEFAULT_LEN) {
+ return ary_subseq(mrb, a, a->len - size, size);
+ }
+ return mrb_ary_new_from_values(mrb, size, a->ptr + a->len - size);
+}
+
+static mrb_value
+mrb_ary_index_m(mrb_state *mrb, mrb_value self)
+{
+ mrb_value obj;
+ mrb_int i;
+
+ mrb_get_args(mrb, "o", &obj);
+ for (i = 0; i < RARRAY_LEN(self); i++) {
+ if (mrb_equal(mrb, RARRAY_PTR(self)[i], obj)) {
+ return mrb_fixnum_value(i);
+ }
+ }
+ return mrb_nil_value();
+}
+
+static mrb_value
+mrb_ary_rindex_m(mrb_state *mrb, mrb_value self)
+{
+ mrb_value obj;
+ mrb_int i;
+
+ mrb_get_args(mrb, "o", &obj);
+ for (i = RARRAY_LEN(self) - 1; i >= 0; i--) {
+ if (mrb_equal(mrb, RARRAY_PTR(self)[i], obj)) {
+ return mrb_fixnum_value(i);
+ }
+ }
+ return mrb_nil_value();
+}
+
+MRB_API mrb_value
+mrb_ary_splat(mrb_state *mrb, mrb_value v)
+{
+ if (mrb_array_p(v)) {
+ return v;
+ }
+ if (mrb_respond_to(mrb, v, mrb_intern_lit(mrb, "to_a"))) {
+ return mrb_funcall(mrb, v, "to_a", 0);
+ }
+ else {
+ return mrb_ary_new_from_values(mrb, 1, &v);
+ }
+}
+
+static mrb_value
+mrb_ary_size(mrb_state *mrb, mrb_value self)
+{
+ struct RArray *a = mrb_ary_ptr(self);
+
+ return mrb_fixnum_value(a->len);
+}
+
+MRB_API mrb_value
+mrb_ary_clear(mrb_state *mrb, mrb_value self)
+{
+ struct RArray *a = mrb_ary_ptr(self);
+
+ if (ARY_SHARED_P(a)) {
+ mrb_ary_decref(mrb, a->aux.shared);
+ ARY_UNSET_SHARED_FLAG(a);
+ }
+ else {
+ mrb_free(mrb, a->ptr);
+ }
+ a->len = 0;
+ a->aux.capa = 0;
+ a->ptr = 0;
+
+ return self;
+}
+
+static mrb_value
+mrb_ary_empty_p(mrb_state *mrb, mrb_value self)
+{
+ struct RArray *a = mrb_ary_ptr(self);
+
+ return mrb_bool_value(a->len == 0);
+}
+
+MRB_API mrb_value
+mrb_check_array_type(mrb_state *mrb, mrb_value ary)
+{
+ return mrb_check_convert_type(mrb, ary, MRB_TT_ARRAY, "Array", "to_ary");
+}
+
+MRB_API mrb_value
+mrb_ary_entry(mrb_value ary, mrb_int offset)
+{
+ if (offset < 0) {
+ offset += RARRAY_LEN(ary);
+ }
+ return ary_elt(ary, offset);
+}
+
+static mrb_value
+join_ary(mrb_state *mrb, mrb_value ary, mrb_value sep, mrb_value list)
+{
+ mrb_int i;
+ mrb_value result, val, tmp;
+
+ /* check recursive */
+ for (i=0; i<RARRAY_LEN(list); i++) {
+ if (mrb_obj_equal(mrb, ary, RARRAY_PTR(list)[i])) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "recursive array join");
+ }
+ }
+
+ mrb_ary_push(mrb, list, ary);
+
+ result = mrb_str_buf_new(mrb, 64);
+
+ for (i=0; i<RARRAY_LEN(ary); i++) {
+ if (i > 0 && !mrb_nil_p(sep)) {
+ mrb_str_cat_str(mrb, result, sep);
+ }
+
+ val = RARRAY_PTR(ary)[i];
+ switch (mrb_type(val)) {
+ case MRB_TT_ARRAY:
+ ary_join:
+ val = join_ary(mrb, val, sep, list);
+ /* fall through */
+
+ case MRB_TT_STRING:
+ str_join:
+ mrb_str_cat_str(mrb, result, val);
+ break;
+
+ default:
+ tmp = mrb_check_string_type(mrb, val);
+ if (!mrb_nil_p(tmp)) {
+ val = tmp;
+ goto str_join;
+ }
+ tmp = mrb_check_convert_type(mrb, val, MRB_TT_ARRAY, "Array", "to_ary");
+ if (!mrb_nil_p(tmp)) {
+ val = tmp;
+ goto ary_join;
+ }
+ val = mrb_obj_as_string(mrb, val);
+ goto str_join;
+ }
+ }
+
+ mrb_ary_pop(mrb, list);
+
+ return result;
+}
+
+MRB_API mrb_value
+mrb_ary_join(mrb_state *mrb, mrb_value ary, mrb_value sep)
+{
+ sep = mrb_obj_as_string(mrb, sep);
+ return join_ary(mrb, ary, sep, mrb_ary_new(mrb));
+}
+
+/*
+ * call-seq:
+ * ary.join(sep="") -> str
+ *
+ * Returns a string created by converting each element of the array to
+ * a string, separated by <i>sep</i>.
+ *
+ * [ "a", "b", "c" ].join #=> "abc"
+ * [ "a", "b", "c" ].join("-") #=> "a-b-c"
+ */
+
+static mrb_value
+mrb_ary_join_m(mrb_state *mrb, mrb_value ary)
+{
+ mrb_value sep = mrb_nil_value();
+
+ mrb_get_args(mrb, "|S", &sep);
+ return mrb_ary_join(mrb, ary, sep);
+}
+
+static mrb_value
+mrb_ary_eq(mrb_state *mrb, mrb_value ary1)
+{
+ mrb_value ary2;
+
+ mrb_get_args(mrb, "o", &ary2);
+ if (mrb_obj_equal(mrb, ary1, ary2)) return mrb_true_value();
+ if (mrb_immediate_p(ary2)) return mrb_false_value();
+ if (!mrb_array_p(ary2)) {
+ return mrb_false_value();
+ }
+ if (RARRAY_LEN(ary1) != RARRAY_LEN(ary2)) return mrb_false_value();
+
+ return ary2;
+}
+
+static mrb_value
+mrb_ary_cmp(mrb_state *mrb, mrb_value ary1)
+{
+ mrb_value ary2;
+
+ mrb_get_args(mrb, "o", &ary2);
+ if (mrb_obj_equal(mrb, ary1, ary2)) return mrb_fixnum_value(0);
+ if (mrb_immediate_p(ary2)) return mrb_nil_value();
+ if (!mrb_array_p(ary2)) {
+ return mrb_nil_value();
+ }
+
+ return ary2;
+}
+
+void
+mrb_init_array(mrb_state *mrb)
+{
+ struct RClass *a;
+
+ a = mrb->array_class = mrb_define_class(mrb, "Array", mrb->object_class); /* 15.2.12 */
+ MRB_SET_INSTANCE_TT(a, MRB_TT_ARRAY);
+
+ mrb_define_class_method(mrb, a, "[]", mrb_ary_s_create, MRB_ARGS_ANY()); /* 15.2.12.4.1 */
+
+ mrb_define_method(mrb, a, "+", mrb_ary_plus, MRB_ARGS_REQ(1)); /* 15.2.12.5.1 */
+ mrb_define_method(mrb, a, "*", mrb_ary_times, MRB_ARGS_REQ(1)); /* 15.2.12.5.2 */
+ mrb_define_method(mrb, a, "<<", mrb_ary_push_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.3 */
+ mrb_define_method(mrb, a, "[]", mrb_ary_aget, MRB_ARGS_ANY()); /* 15.2.12.5.4 */
+ mrb_define_method(mrb, a, "[]=", mrb_ary_aset, MRB_ARGS_ANY()); /* 15.2.12.5.5 */
+ mrb_define_method(mrb, a, "clear", mrb_ary_clear, MRB_ARGS_NONE()); /* 15.2.12.5.6 */
+ mrb_define_method(mrb, a, "concat", mrb_ary_concat_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.8 */
+ mrb_define_method(mrb, a, "delete_at", mrb_ary_delete_at, MRB_ARGS_REQ(1)); /* 15.2.12.5.9 */
+ mrb_define_method(mrb, a, "empty?", mrb_ary_empty_p, MRB_ARGS_NONE()); /* 15.2.12.5.12 */
+ mrb_define_method(mrb, a, "first", mrb_ary_first, MRB_ARGS_OPT(1)); /* 15.2.12.5.13 */
+ mrb_define_method(mrb, a, "index", mrb_ary_index_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.14 */
+ mrb_define_method(mrb, a, "initialize_copy", mrb_ary_replace_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.16 */
+ mrb_define_method(mrb, a, "join", mrb_ary_join_m, MRB_ARGS_ANY()); /* 15.2.12.5.17 */
+ mrb_define_method(mrb, a, "last", mrb_ary_last, MRB_ARGS_ANY()); /* 15.2.12.5.18 */
+ mrb_define_method(mrb, a, "length", mrb_ary_size, MRB_ARGS_NONE()); /* 15.2.12.5.19 */
+ mrb_define_method(mrb, a, "pop", mrb_ary_pop, MRB_ARGS_NONE()); /* 15.2.12.5.21 */
+ mrb_define_method(mrb, a, "push", mrb_ary_push_m, MRB_ARGS_ANY()); /* 15.2.12.5.22 */
+ mrb_define_method(mrb, a, "replace", mrb_ary_replace_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.23 */
+ mrb_define_method(mrb, a, "reverse", mrb_ary_reverse, MRB_ARGS_NONE()); /* 15.2.12.5.24 */
+ mrb_define_method(mrb, a, "reverse!", mrb_ary_reverse_bang, MRB_ARGS_NONE()); /* 15.2.12.5.25 */
+ mrb_define_method(mrb, a, "rindex", mrb_ary_rindex_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.26 */
+ mrb_define_method(mrb, a, "shift", mrb_ary_shift, MRB_ARGS_NONE()); /* 15.2.12.5.27 */
+ mrb_define_method(mrb, a, "size", mrb_ary_size, MRB_ARGS_NONE()); /* 15.2.12.5.28 */
+ mrb_define_method(mrb, a, "slice", mrb_ary_aget, MRB_ARGS_ANY()); /* 15.2.12.5.29 */
+ mrb_define_method(mrb, a, "unshift", mrb_ary_unshift_m, MRB_ARGS_ANY()); /* 15.2.12.5.30 */
+
+ mrb_define_method(mrb, a, "__ary_eq", mrb_ary_eq, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, a, "__ary_cmp", mrb_ary_cmp, MRB_ARGS_REQ(1));
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/backtrace.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,202 @@
+/*
+** backtrace.c -
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <stdarg.h>
+#include "mruby.h"
+#include "mruby/variable.h"
+#include "mruby/proc.h"
+#include "mruby/array.h"
+#include "mruby/string.h"
+#include "mruby/class.h"
+#include "mruby/debug.h"
+#include "mruby/error.h"
+
+#ifdef ENABLE_STDIO
+
+typedef void (*output_stream_func)(mrb_state*, void*, int, const char*, ...);
+
+static void
+print_backtrace_i(mrb_state *mrb, void *stream, int level, const char *format, ...)
+{
+ va_list ap;
+
+ va_start(ap, format);
+ vfprintf((FILE*)stream, format, ap);
+ va_end(ap);
+}
+
+
+#define MIN_BUFSIZE 127
+
+static void
+get_backtrace_i(mrb_state *mrb, void *stream, int level, const char *format, ...)
+{
+ va_list ap;
+ mrb_value ary, str;
+ int ai;
+
+ if (level > 0) {
+ return;
+ }
+
+ ai = mrb_gc_arena_save(mrb);
+ ary = mrb_obj_value((struct RArray*)stream);
+
+ va_start(ap, format);
+ str = mrb_str_new(mrb, 0, vsnprintf(NULL, 0, format, ap) + 1);
+ va_end(ap);
+
+ va_start(ap, format);
+ vsnprintf(RSTRING_PTR(str), RSTRING_LEN(str), format, ap);
+ va_end(ap);
+
+ mrb_str_resize(mrb, str, RSTRING_LEN(str) - 1);
+ mrb_ary_push(mrb, ary, str);
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+static void
+output_backtrace(mrb_state *mrb, mrb_int ciidx, mrb_code *pc0, output_stream_func func, void *stream)
+{
+ mrb_callinfo *ci;
+ const char *filename, *method, *sep;
+ int i, lineno, tracehead = 1;
+
+ if (ciidx >= mrb->c->ciend - mrb->c->cibase)
+ ciidx = 10; /* ciidx is broken... */
+
+ for (i = ciidx; i >= 0; i--) {
+ ci = &mrb->c->cibase[i];
+ filename = NULL;
+
+ if (!ci->proc) continue;
+ if (MRB_PROC_CFUNC_P(ci->proc)) {
+ continue;
+ }
+ else {
+ mrb_irep *irep = ci->proc->body.irep;
+ mrb_code *pc;
+
+ if (mrb->c->cibase[i].err) {
+ pc = mrb->c->cibase[i].err;
+ }
+ else if (i+1 <= ciidx) {
+ pc = mrb->c->cibase[i+1].pc - 1;
+ }
+ else {
+ pc = pc0;
+ }
+ filename = mrb_debug_get_filename(irep, (uint32_t)(pc - irep->iseq));
+ lineno = mrb_debug_get_line(irep, (uint32_t)(pc - irep->iseq));
+ }
+ if (lineno == -1) continue;
+ if (ci->target_class == ci->proc->target_class)
+ sep = ".";
+ else
+ sep = "#";
+
+ if (!filename) {
+ filename = "(unknown)";
+ }
+
+ if (tracehead) {
+ func(mrb, stream, 1, "trace:\n");
+ tracehead = 0;
+ }
+ method = mrb_sym2name(mrb, ci->mid);
+ if (method) {
+ const char *cn = mrb_class_name(mrb, ci->proc->target_class);
+
+ if (cn) {
+ func(mrb, stream, 1, "\t[%d] ", i);
+ func(mrb, stream, 0, "%s:%d:in %s%s%s", filename, lineno, cn, sep, method);
+ func(mrb, stream, 1, "\n");
+ }
+ else {
+ func(mrb, stream, 1, "\t[%d] ", i);
+ func(mrb, stream, 0, "%s:%d:in %s", filename, lineno, method);
+ func(mrb, stream, 1, "\n");
+ }
+ }
+ else {
+ func(mrb, stream, 1, "\t[%d] ", i);
+ func(mrb, stream, 0, "%s:%d", filename, lineno);
+ func(mrb, stream, 1, "\n");
+ }
+ }
+}
+
+static void
+exc_output_backtrace(mrb_state *mrb, struct RObject *exc, output_stream_func func, void *stream)
+{
+ output_backtrace(mrb, mrb_fixnum(mrb_obj_iv_get(mrb, exc, mrb_intern_lit(mrb, "ciidx"))),
+ (mrb_code*)mrb_cptr(mrb_obj_iv_get(mrb, exc, mrb_intern_lit(mrb, "lastpc"))),
+ func, stream);
+}
+
+/* mrb_print_backtrace/mrb_get_backtrace:
+
+ function to retrieve backtrace information from the exception.
+ note that if you call method after the exception, call stack will be
+ overwritten. So invoke these functions just after detecting exceptions.
+*/
+
+MRB_API void
+mrb_print_backtrace(mrb_state *mrb)
+{
+ if (!mrb->exc || mrb_obj_is_kind_of(mrb, mrb_obj_value(mrb->exc), E_SYSSTACK_ERROR)) {
+ return;
+ }
+ exc_output_backtrace(mrb, mrb->exc, print_backtrace_i, (void*)stderr);
+}
+
+MRB_API mrb_value
+mrb_exc_backtrace(mrb_state *mrb, mrb_value self)
+{
+ mrb_value ary;
+
+ ary = mrb_ary_new(mrb);
+ exc_output_backtrace(mrb, mrb_obj_ptr(self), get_backtrace_i, (void*)mrb_ary_ptr(ary));
+
+ return ary;
+}
+
+MRB_API mrb_value
+mrb_get_backtrace(mrb_state *mrb)
+{
+ mrb_value ary;
+ mrb_callinfo *ci = mrb->c->ci;
+ mrb_code *pc = ci->pc;
+ mrb_int ciidx = (mrb_int)(ci - mrb->c->cibase - 1);
+
+ if (ciidx < 0) ciidx = 0;
+ ary = mrb_ary_new(mrb);
+ output_backtrace(mrb, ciidx, pc, get_backtrace_i, (void*)mrb_ary_ptr(ary));
+
+ return ary;
+}
+
+#else
+
+MRB_API void
+mrb_print_backtrace(mrb_state *mrb)
+{
+}
+
+MRB_API mrb_value
+mrb_exc_backtrace(mrb_state *mrb, mrb_value self)
+{
+ return mrb_ary_new(mrb);
+}
+
+MRB_API mrb_value
+mrb_get_backtrace(mrb_state *mrb)
+{
+ return mrb_ary_new(mrb);
+}
+
+#endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/class.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,2129 @@
+/*
+** class.c - Class class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <ctype.h>
+#include <stdarg.h>
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/numeric.h"
+#include "mruby/proc.h"
+#include "mruby/string.h"
+#include "mruby/variable.h"
+#include "mruby/error.h"
+#include "mruby/data.h"
+
+KHASH_DEFINE(mt, mrb_sym, struct RProc*, TRUE, kh_int_hash_func, kh_int_hash_equal)
+
+void
+mrb_gc_mark_mt(mrb_state *mrb, struct RClass *c)
+{
+ khiter_t k;
+ khash_t(mt) *h = c->mt;
+
+ if (!h) return;
+ for (k = kh_begin(h); k != kh_end(h); k++) {
+ if (kh_exist(h, k)) {
+ struct RProc *m = kh_value(h, k);
+ if (m) {
+ mrb_gc_mark(mrb, (struct RBasic*)m);
+ }
+ }
+ }
+}
+
+size_t
+mrb_gc_mark_mt_size(mrb_state *mrb, struct RClass *c)
+{
+ khash_t(mt) *h = c->mt;
+
+ if (!h) return 0;
+ return kh_size(h);
+}
+
+void
+mrb_gc_free_mt(mrb_state *mrb, struct RClass *c)
+{
+ kh_destroy(mt, mrb, c->mt);
+}
+
+static void
+name_class(mrb_state *mrb, struct RClass *c, mrb_sym name)
+{
+ mrb_obj_iv_set(mrb, (struct RObject*)c,
+ mrb_intern_lit(mrb, "__classid__"), mrb_symbol_value(name));
+}
+
+static void
+setup_class(mrb_state *mrb, struct RClass *outer, struct RClass *c, mrb_sym id)
+{
+ name_class(mrb, c, id);
+ mrb_obj_iv_set(mrb, (struct RObject*)outer, id, mrb_obj_value(c));
+ if (outer != mrb->object_class) {
+ mrb_obj_iv_set(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__"),
+ mrb_obj_value(outer));
+ }
+}
+
+#define make_metaclass(mrb, c) prepare_singleton_class((mrb), (struct RBasic*)(c))
+
+static void
+prepare_singleton_class(mrb_state *mrb, struct RBasic *o)
+{
+ struct RClass *sc, *c;
+
+ if (o->c->tt == MRB_TT_SCLASS) return;
+ sc = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_SCLASS, mrb->class_class);
+ sc->mt = 0;
+ sc->iv = 0;
+ if (o->tt == MRB_TT_CLASS) {
+ c = (struct RClass*)o;
+ if (!c->super) {
+ sc->super = mrb->class_class;
+ }
+ else {
+ sc->super = c->super->c;
+ }
+ }
+ else if (o->tt == MRB_TT_SCLASS) {
+ c = (struct RClass*)o;
+ while (c->super->tt == MRB_TT_ICLASS)
+ c = c->super;
+ make_metaclass(mrb, c->super);
+ sc->super = c->super->c;
+ }
+ else {
+ sc->super = o->c;
+ }
+ o->c = sc;
+ mrb_field_write_barrier(mrb, (struct RBasic*)o, (struct RBasic*)sc);
+ mrb_field_write_barrier(mrb, (struct RBasic*)sc, (struct RBasic*)o);
+ mrb_obj_iv_set(mrb, (struct RObject*)sc, mrb_intern_lit(mrb, "__attached__"), mrb_obj_value(o));
+}
+
+static struct RClass *
+class_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id)
+{
+ mrb_value c = mrb_const_get(mrb, mrb_obj_value(klass), id);
+
+ mrb_check_type(mrb, c, MRB_TT_CLASS);
+ return mrb_class_ptr(c);
+}
+
+static struct RClass *
+module_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id)
+{
+ mrb_value c = mrb_const_get(mrb, mrb_obj_value(klass), id);
+
+ mrb_check_type(mrb, c, MRB_TT_MODULE);
+ return mrb_class_ptr(c);
+}
+
+MRB_API struct RClass*
+mrb_class_outer_module(mrb_state *mrb, struct RClass *c)
+{
+ mrb_value outer;
+
+ outer = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__"));
+ if (mrb_nil_p(outer)) return NULL;
+ return mrb_class_ptr(outer);
+}
+
+static struct RClass*
+define_module(mrb_state *mrb, mrb_sym name, struct RClass *outer)
+{
+ struct RClass *m;
+
+ if (mrb_const_defined_at(mrb, mrb_obj_value(outer), name)) {
+ return module_from_sym(mrb, outer, name);
+ }
+ m = mrb_module_new(mrb);
+ setup_class(mrb, outer, m, name);
+
+ return m;
+}
+
+MRB_API struct RClass*
+mrb_define_module_id(mrb_state *mrb, mrb_sym name)
+{
+ return define_module(mrb, name, mrb->object_class);
+}
+
+MRB_API struct RClass*
+mrb_define_module(mrb_state *mrb, const char *name)
+{
+ return define_module(mrb, mrb_intern_cstr(mrb, name), mrb->object_class);
+}
+
+MRB_API struct RClass*
+mrb_vm_define_module(mrb_state *mrb, mrb_value outer, mrb_sym id)
+{
+ return define_module(mrb, id, mrb_class_ptr(outer));
+}
+
+MRB_API struct RClass*
+mrb_define_module_under(mrb_state *mrb, struct RClass *outer, const char *name)
+{
+ mrb_sym id = mrb_intern_cstr(mrb, name);
+ struct RClass * c = define_module(mrb, id, outer);
+
+ setup_class(mrb, outer, c, id);
+ return c;
+}
+
+static struct RClass*
+define_class(mrb_state *mrb, mrb_sym name, struct RClass *super, struct RClass *outer)
+{
+ struct RClass * c;
+
+ if (mrb_const_defined_at(mrb, mrb_obj_value(outer), name)) {
+ c = class_from_sym(mrb, outer, name);
+ if (super && mrb_class_real(c->super) != super) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for Class %S (%S not %S)",
+ mrb_sym2str(mrb, name),
+ mrb_obj_value(c->super), mrb_obj_value(super));
+ }
+ return c;
+ }
+
+ c = mrb_class_new(mrb, super);
+ setup_class(mrb, outer, c, name);
+
+ return c;
+}
+
+MRB_API struct RClass*
+mrb_define_class_id(mrb_state *mrb, mrb_sym name, struct RClass *super)
+{
+ if (!super) {
+ mrb_warn(mrb, "no super class for `%S', Object assumed", mrb_sym2str(mrb, name));
+ }
+ return define_class(mrb, name, super, mrb->object_class);
+}
+
+MRB_API struct RClass*
+mrb_define_class(mrb_state *mrb, const char *name, struct RClass *super)
+{
+ return mrb_define_class_id(mrb, mrb_intern_cstr(mrb, name), super);
+}
+
+static void
+mrb_class_inherited(mrb_state *mrb, struct RClass *super, struct RClass *klass)
+{
+ if (!super)
+ super = mrb->object_class;
+ mrb_funcall(mrb, mrb_obj_value(super), "inherited", 1, mrb_obj_value(klass));
+}
+
+MRB_API struct RClass*
+mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id)
+{
+ struct RClass *s;
+ struct RClass *c;
+
+ if (!mrb_nil_p(super)) {
+ if (mrb_type(super) != MRB_TT_CLASS) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%S given)", super);
+ }
+ s = mrb_class_ptr(super);
+ }
+ else {
+ s = 0;
+ }
+ switch (mrb_type(outer)) {
+ case MRB_TT_CLASS:
+ case MRB_TT_SCLASS:
+ case MRB_TT_MODULE:
+ break;
+ default:
+ mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a class/module", outer);
+ break;
+ }
+ c = define_class(mrb, id, s, mrb_class_ptr(outer));
+ mrb_class_inherited(mrb, mrb_class_real(c->super), c);
+
+ return c;
+}
+
+MRB_API mrb_bool
+mrb_class_defined(mrb_state *mrb, const char *name)
+{
+ mrb_value sym = mrb_check_intern_cstr(mrb, name);
+ if (mrb_nil_p(sym)) {
+ return FALSE;
+ }
+ return mrb_const_defined(mrb, mrb_obj_value(mrb->object_class), mrb_symbol(sym));
+}
+
+MRB_API struct RClass *
+mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name)
+{
+ return class_from_sym(mrb, outer, mrb_intern_cstr(mrb, name));
+}
+
+MRB_API struct RClass *
+mrb_class_get(mrb_state *mrb, const char *name)
+{
+ return mrb_class_get_under(mrb, mrb->object_class, name);
+}
+
+MRB_API struct RClass *
+mrb_module_get_under(mrb_state *mrb, struct RClass *outer, const char *name)
+{
+ return module_from_sym(mrb, outer, mrb_intern_cstr(mrb, name));
+}
+
+MRB_API struct RClass *
+mrb_module_get(mrb_state *mrb, const char *name)
+{
+ return mrb_module_get_under(mrb, mrb->object_class, name);
+}
+
+/*!
+ * Defines a class under the namespace of \a outer.
+ * \param outer a class which contains the new class.
+ * \param id name of the new class
+ * \param super a class from which the new class will derive.
+ * NULL means \c Object class.
+ * \return the created class
+ * \throw TypeError if the constant name \a name is already taken but
+ * the constant is not a \c Class.
+ * \throw NameError if the class is already defined but the class can not
+ * be reopened because its superclass is not \a super.
+ * \post top-level constant named \a name refers the returned class.
+ *
+ * \note if a class named \a name is already defined and its superclass is
+ * \a super, the function just returns the defined class.
+ */
+MRB_API struct RClass *
+mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super)
+{
+ mrb_sym id = mrb_intern_cstr(mrb, name);
+ struct RClass * c;
+
+#if 0
+ if (!super) {
+ mrb_warn(mrb, "no super class for `%S::%S', Object assumed",
+ mrb_obj_value(outer), mrb_sym2str(mrb, id));
+ }
+#endif
+ c = define_class(mrb, id, super, outer);
+ setup_class(mrb, outer, c, id);
+ return c;
+}
+
+MRB_API void
+mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p)
+{
+ khash_t(mt) *h = c->mt;
+ khiter_t k;
+
+ if (!h) h = c->mt = kh_init(mt, mrb);
+ k = kh_put(mt, mrb, h, mid);
+ kh_value(h, k) = p;
+ if (p) {
+ mrb_field_write_barrier(mrb, (struct RBasic *)c, (struct RBasic *)p);
+ }
+}
+
+MRB_API void
+mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, mrb_aspec aspec)
+{
+ struct RProc *p;
+ int ai = mrb_gc_arena_save(mrb);
+
+ p = mrb_proc_new_cfunc(mrb, func);
+ p->target_class = c;
+ mrb_define_method_raw(mrb, c, mid, p);
+ mrb_gc_arena_restore(mrb, ai);
+}
+
+MRB_API void
+mrb_define_method(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, mrb_aspec aspec)
+{
+ mrb_define_method_id(mrb, c, mrb_intern_cstr(mrb, name), func, aspec);
+}
+
+MRB_API void
+mrb_define_method_vm(mrb_state *mrb, struct RClass *c, mrb_sym name, mrb_value body)
+{
+ khash_t(mt) *h = c->mt;
+ khiter_t k;
+ struct RProc *p;
+
+ if (!h) h = c->mt = kh_init(mt, mrb);
+ k = kh_put(mt, mrb, h, name);
+ p = mrb_proc_ptr(body);
+ kh_value(h, k) = p;
+ if (p) {
+ mrb_field_write_barrier(mrb, (struct RBasic *)c, (struct RBasic *)p);
+ }
+}
+
+/* a function to raise NotImplementedError with current method name */
+MRB_API void
+mrb_notimplement(mrb_state *mrb)
+{
+ const char *str;
+ mrb_int len;
+ mrb_callinfo *ci = mrb->c->ci;
+
+ if (ci->mid) {
+ str = mrb_sym2name_len(mrb, ci->mid, &len);
+ mrb_raisef(mrb, E_NOTIMP_ERROR,
+ "%S() function is unimplemented on this machine",
+ mrb_str_new_static(mrb, str, (size_t)len));
+ }
+}
+
+/* a function to be replacement of unimplemented method */
+MRB_API mrb_value
+mrb_notimplement_m(mrb_state *mrb, mrb_value self)
+{
+ mrb_notimplement(mrb);
+ /* not reached */
+ return mrb_nil_value();
+}
+
+static mrb_value
+check_type(mrb_state *mrb, mrb_value val, enum mrb_vtype t, const char *c, const char *m)
+{
+ mrb_value tmp;
+
+ tmp = mrb_check_convert_type(mrb, val, t, c, m);
+ if (mrb_nil_p(tmp)) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "expected %S", mrb_str_new_cstr(mrb, c));
+ }
+ return tmp;
+}
+
+static mrb_value
+to_str(mrb_state *mrb, mrb_value val)
+{
+ return check_type(mrb, val, MRB_TT_STRING, "String", "to_str");
+}
+
+static mrb_value
+to_ary(mrb_state *mrb, mrb_value val)
+{
+ return check_type(mrb, val, MRB_TT_ARRAY, "Array", "to_ary");
+}
+
+static mrb_value
+to_hash(mrb_state *mrb, mrb_value val)
+{
+ return check_type(mrb, val, MRB_TT_HASH, "Hash", "to_hash");
+}
+
+static mrb_sym
+to_sym(mrb_state *mrb, mrb_value ss)
+{
+ if (mrb_type(ss) == MRB_TT_SYMBOL) {
+ return mrb_symbol(ss);
+ }
+ else if (mrb_string_p(ss)) {
+ return mrb_intern_str(mrb, to_str(mrb, ss));
+ }
+ else {
+ mrb_value obj = mrb_funcall(mrb, ss, "inspect", 0);
+ mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", obj);
+ }
+}
+
+/*
+ retrieve arguments from mrb_state.
+
+ mrb_get_args(mrb, format, ...)
+
+ returns number of arguments parsed.
+
+ format specifiers:
+
+ string mruby type C type note
+ ----------------------------------------------------------------------------------------------
+ o: Object [mrb_value]
+ C: class/module [mrb_value]
+ S: String [mrb_value]
+ A: Array [mrb_value]
+ H: Hash [mrb_value]
+ s: String [char*,mrb_int] Receive two arguments.
+ z: String [char*] NUL terminated string.
+ a: Array [mrb_value*,mrb_int] Receive two arguments.
+ f: Float [mrb_float]
+ i: Integer [mrb_int]
+ b: Boolean [mrb_bool]
+ n: Symbol [mrb_sym]
+ d: Data [void*,mrb_data_type const] 2nd argument will be used to check data type so it won't be modified
+ &: Block [mrb_value]
+ *: rest argument [mrb_value*,mrb_int] Receive the rest of the arguments as an array.
+ |: optional Next argument of '|' and later are optional.
+ ?: optional given [mrb_bool] true if preceding argument (optional) is given.
+ */
+MRB_API mrb_int
+mrb_get_args(mrb_state *mrb, const char *format, ...)
+{
+ char c;
+ int i = 0;
+ mrb_value *sp = mrb->c->stack + 1;
+ va_list ap;
+ int argc = mrb->c->ci->argc;
+ mrb_bool opt = FALSE;
+ mrb_bool given = TRUE;
+
+ va_start(ap, format);
+ if (argc < 0) {
+ struct RArray *a = mrb_ary_ptr(mrb->c->stack[1]);
+
+ argc = a->len;
+ sp = a->ptr;
+ }
+ while ((c = *format++)) {
+ switch (c) {
+ case '|': case '*': case '&': case '?':
+ break;
+ default:
+ if (argc <= i) {
+ if (opt) {
+ given = FALSE;
+ }
+ else {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
+ }
+ }
+ break;
+ }
+
+ switch (c) {
+ case 'o':
+ {
+ mrb_value *p;
+
+ p = va_arg(ap, mrb_value*);
+ if (i < argc) {
+ *p = *sp++;
+ i++;
+ }
+ }
+ break;
+ case 'C':
+ {
+ mrb_value *p;
+
+ p = va_arg(ap, mrb_value*);
+ if (i < argc) {
+ mrb_value ss;
+
+ ss = *sp++;
+ switch (mrb_type(ss)) {
+ case MRB_TT_CLASS:
+ case MRB_TT_MODULE:
+ case MRB_TT_SCLASS:
+ break;
+ default:
+ mrb_raisef(mrb, E_TYPE_ERROR, "%S is not class/module", ss);
+ break;
+ }
+ *p = ss;
+ i++;
+ }
+ }
+ break;
+ case 'S':
+ {
+ mrb_value *p;
+
+ p = va_arg(ap, mrb_value*);
+ if (i < argc) {
+ *p = to_str(mrb, *sp++);
+ i++;
+ }
+ }
+ break;
+ case 'A':
+ {
+ mrb_value *p;
+
+ p = va_arg(ap, mrb_value*);
+ if (i < argc) {
+ *p = to_ary(mrb, *sp++);
+ i++;
+ }
+ }
+ break;
+ case 'H':
+ {
+ mrb_value *p;
+
+ p = va_arg(ap, mrb_value*);
+ if (i < argc) {
+ *p = to_hash(mrb, *sp++);
+ i++;
+ }
+ }
+ break;
+ case 's':
+ {
+ mrb_value ss;
+ char **ps = 0;
+ mrb_int *pl = 0;
+
+ ps = va_arg(ap, char**);
+ pl = va_arg(ap, mrb_int*);
+ if (i < argc) {
+ ss = to_str(mrb, *sp++);
+ *ps = RSTRING_PTR(ss);
+ *pl = RSTRING_LEN(ss);
+ i++;
+ }
+ }
+ break;
+ case 'z':
+ {
+ mrb_value ss;
+ const char **ps;
+
+ ps = va_arg(ap, const char**);
+ if (i < argc) {
+ ss = to_str(mrb, *sp++);
+ *ps = mrb_string_value_cstr(mrb, &ss);
+ i++;
+ }
+ }
+ break;
+ case 'a':
+ {
+ mrb_value aa;
+ struct RArray *a;
+ mrb_value **pb;
+ mrb_int *pl;
+
+ pb = va_arg(ap, mrb_value**);
+ pl = va_arg(ap, mrb_int*);
+ if (i < argc) {
+ aa = to_ary(mrb, *sp++);
+ a = mrb_ary_ptr(aa);
+ *pb = a->ptr;
+ *pl = a->len;
+ i++;
+ }
+ }
+ break;
+ case 'f':
+ {
+ mrb_float *p;
+
+ p = va_arg(ap, mrb_float*);
+ if (i < argc) {
+ *p = mrb_to_flo(mrb, *sp);
+ sp++;
+ i++;
+ }
+ }
+ break;
+ case 'i':
+ {
+ mrb_int *p;
+
+ p = va_arg(ap, mrb_int*);
+ if (i < argc) {
+ switch (mrb_type(*sp)) {
+ case MRB_TT_FIXNUM:
+ *p = mrb_fixnum(*sp);
+ break;
+ case MRB_TT_FLOAT:
+ {
+ mrb_float f = mrb_float(*sp);
+
+ if (!FIXABLE(f)) {
+ mrb_raise(mrb, E_RANGE_ERROR, "float too big for int");
+ }
+ *p = (mrb_int)f;
+ }
+ break;
+ case MRB_TT_STRING:
+ mrb_raise(mrb, E_TYPE_ERROR, "no implicit conversion of String into Integer");
+ break;
+ default:
+ *p = mrb_fixnum(mrb_Integer(mrb, *sp));
+ break;
+ }
+ sp++;
+ i++;
+ }
+ }
+ break;
+ case 'b':
+ {
+ mrb_bool *boolp = va_arg(ap, mrb_bool*);
+
+ if (i < argc) {
+ mrb_value b = *sp++;
+ *boolp = mrb_test(b);
+ i++;
+ }
+ }
+ break;
+ case 'n':
+ {
+ mrb_sym *symp;
+
+ symp = va_arg(ap, mrb_sym*);
+ if (i < argc) {
+ mrb_value ss;
+
+ ss = *sp++;
+ *symp = to_sym(mrb, ss);
+ i++;
+ }
+ }
+ break;
+ case 'd':
+ {
+ void** datap;
+ struct mrb_data_type const* type;
+
+ datap = va_arg(ap, void**);
+ type = va_arg(ap, struct mrb_data_type const*);
+ if (i < argc) {
+ *datap = mrb_data_get_ptr(mrb, *sp++, type);
+ ++i;
+ }
+ }
+ break;
+
+ case '&':
+ {
+ mrb_value *p, *bp;
+
+ p = va_arg(ap, mrb_value*);
+ if (mrb->c->ci->argc < 0) {
+ bp = mrb->c->stack + 2;
+ }
+ else {
+ bp = mrb->c->stack + mrb->c->ci->argc + 1;
+ }
+ *p = *bp;
+ }
+ break;
+ case '|':
+ opt = TRUE;
+ break;
+ case '?':
+ {
+ mrb_bool *p;
+
+ p = va_arg(ap, mrb_bool*);
+ *p = given;
+ }
+ break;
+
+ case '*':
+ {
+ mrb_value **var;
+ mrb_int *pl;
+
+ var = va_arg(ap, mrb_value**);
+ pl = va_arg(ap, mrb_int*);
+ if (argc > i) {
+ *pl = argc-i;
+ if (*pl > 0) {
+ *var = sp;
+ }
+ i = argc;
+ sp += *pl;
+ }
+ else {
+ *pl = 0;
+ *var = NULL;
+ }
+ }
+ break;
+ default:
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid argument specifier %S", mrb_str_new(mrb, &c, 1));
+ break;
+ }
+ }
+ if (!c && argc > i) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
+ }
+ va_end(ap);
+ return i;
+}
+
+static struct RClass*
+boot_defclass(mrb_state *mrb, struct RClass *super)
+{
+ struct RClass *c;
+
+ c = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_CLASS, mrb->class_class);
+ if (super) {
+ c->super = super;
+ mrb_field_write_barrier(mrb, (struct RBasic*)c, (struct RBasic*)super);
+ }
+ else {
+ c->super = mrb->object_class;
+ }
+ c->mt = kh_init(mt, mrb);
+ return c;
+}
+
+MRB_API void
+mrb_include_module(mrb_state *mrb, struct RClass *c, struct RClass *m)
+{
+ struct RClass *ins_pos;
+
+ ins_pos = c;
+ while (m) {
+ struct RClass *p = c, *ic;
+ int superclass_seen = 0;
+
+ if (c->mt && c->mt == m->mt) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "cyclic include detected");
+ }
+ while (p) {
+ if (c != p && p->tt == MRB_TT_CLASS) {
+ superclass_seen = 1;
+ }
+ else if (p->mt == m->mt) {
+ if (p->tt == MRB_TT_ICLASS && !superclass_seen) {
+ ins_pos = p;
+ }
+ goto skip;
+ }
+ p = p->super;
+ }
+ ic = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_ICLASS, mrb->class_class);
+ if (m->tt == MRB_TT_ICLASS) {
+ ic->c = m->c;
+ }
+ else {
+ ic->c = m;
+ }
+ ic->mt = m->mt;
+ ic->iv = m->iv;
+ ic->super = ins_pos->super;
+ ins_pos->super = ic;
+ mrb_field_write_barrier(mrb, (struct RBasic*)ins_pos, (struct RBasic*)ic);
+ ins_pos = ic;
+ skip:
+ m = m->super;
+ }
+}
+
+static mrb_value
+mrb_mod_append_features(mrb_state *mrb, mrb_value mod)
+{
+ mrb_value klass;
+
+ mrb_check_type(mrb, mod, MRB_TT_MODULE);
+ mrb_get_args(mrb, "C", &klass);
+ mrb_include_module(mrb, mrb_class_ptr(klass), mrb_class_ptr(mod));
+ return mod;
+}
+
+static mrb_value
+mrb_mod_include(mrb_state *mrb, mrb_value klass)
+{
+ mrb_value *argv;
+ mrb_int argc, i;
+
+ mrb_get_args(mrb, "*", &argv, &argc);
+ for (i=0; i<argc; i++) {
+ mrb_check_type(mrb, argv[i], MRB_TT_MODULE);
+ }
+ while (argc--) {
+ mrb_funcall(mrb, argv[argc], "append_features", 1, klass);
+ mrb_funcall(mrb, argv[argc], "included", 1, klass);
+ }
+
+ return klass;
+}
+
+/* 15.2.2.4.28 */
+/*
+ * call-seq:
+ * mod.include?(module) -> true or false
+ *
+ * Returns <code>true</code> if <i>module</i> is included in
+ * <i>mod</i> or one of <i>mod</i>'s ancestors.
+ *
+ * module A
+ * end
+ * class B
+ * include A
+ * end
+ * class C < B
+ * end
+ * B.include?(A) #=> true
+ * C.include?(A) #=> true
+ * A.include?(A) #=> false
+ */
+static mrb_value
+mrb_mod_include_p(mrb_state *mrb, mrb_value mod)
+{
+ mrb_value mod2;
+ struct RClass *c = mrb_class_ptr(mod);
+
+ mrb_get_args(mrb, "C", &mod2);
+ mrb_check_type(mrb, mod2, MRB_TT_MODULE);
+
+ while (c) {
+ if (c->tt == MRB_TT_ICLASS) {
+ if (c->c == mrb_class_ptr(mod2)) return mrb_true_value();
+ }
+ c = c->super;
+ }
+ return mrb_false_value();
+}
+
+static mrb_value
+mrb_mod_ancestors(mrb_state *mrb, mrb_value self)
+{
+ mrb_value result;
+ struct RClass *c = mrb_class_ptr(self);
+
+ result = mrb_ary_new(mrb);
+ mrb_ary_push(mrb, result, mrb_obj_value(c));
+ c = c->super;
+ while (c) {
+ if (c->tt == MRB_TT_ICLASS) {
+ mrb_ary_push(mrb, result, mrb_obj_value(c->c));
+ }
+ else if (c->tt != MRB_TT_SCLASS) {
+ mrb_ary_push(mrb, result, mrb_obj_value(c));
+ }
+ c = c->super;
+ }
+
+ return result;
+}
+
+static mrb_value
+mrb_mod_extend_object(mrb_state *mrb, mrb_value mod)
+{
+ mrb_value obj;
+
+ mrb_check_type(mrb, mod, MRB_TT_MODULE);
+ mrb_get_args(mrb, "o", &obj);
+ mrb_include_module(mrb, mrb_class_ptr(mrb_singleton_class(mrb, obj)), mrb_class_ptr(mod));
+ return mod;
+}
+
+static mrb_value
+mrb_mod_included_modules(mrb_state *mrb, mrb_value self)
+{
+ mrb_value result;
+ struct RClass *c = mrb_class_ptr(self);
+
+ result = mrb_ary_new(mrb);
+ while (c) {
+ if (c->tt == MRB_TT_ICLASS) {
+ mrb_ary_push(mrb, result, mrb_obj_value(c->c));
+ }
+ c = c->super;
+ }
+
+ return result;
+}
+
+static mrb_value
+mrb_mod_initialize(mrb_state *mrb, mrb_value mod)
+{
+ mrb_value b;
+
+ mrb_get_args(mrb, "&", &b);
+ if (!mrb_nil_p(b)) {
+ mrb_yield_with_class(mrb, b, 1, &mod, mod, mrb_class_ptr(mod));
+ }
+ return mod;
+}
+
+mrb_value mrb_class_instance_method_list(mrb_state*, mrb_bool, struct RClass*, int);
+
+/* 15.2.2.4.33 */
+/*
+ * call-seq:
+ * mod.instance_methods(include_super=true) -> array
+ *
+ * Returns an array containing the names of the public and protected instance
+ * methods in the receiver. For a module, these are the public and protected methods;
+ * for a class, they are the instance (not singleton) methods. With no
+ * argument, or with an argument that is <code>false</code>, the
+ * instance methods in <i>mod</i> are returned, otherwise the methods
+ * in <i>mod</i> and <i>mod</i>'s superclasses are returned.
+ *
+ * module A
+ * def method1() end
+ * end
+ * class B
+ * def method2() end
+ * end
+ * class C < B
+ * def method3() end
+ * end
+ *
+ * A.instance_methods #=> [:method1]
+ * B.instance_methods(false) #=> [:method2]
+ * C.instance_methods(false) #=> [:method3]
+ * C.instance_methods(true).length #=> 43
+ */
+
+static mrb_value
+mrb_mod_instance_methods(mrb_state *mrb, mrb_value mod)
+{
+ struct RClass *c = mrb_class_ptr(mod);
+ mrb_bool recur = TRUE;
+ mrb_get_args(mrb, "|b", &recur);
+ return mrb_class_instance_method_list(mrb, recur, c, 0);
+}
+
+/* implementation of module_eval/class_eval */
+mrb_value mrb_mod_module_eval(mrb_state*, mrb_value);
+
+static mrb_value
+mrb_mod_dummy_visibility(mrb_state *mrb, mrb_value mod)
+{
+ return mod;
+}
+
+MRB_API mrb_value
+mrb_singleton_class(mrb_state *mrb, mrb_value v)
+{
+ struct RBasic *obj;
+
+ switch (mrb_type(v)) {
+ case MRB_TT_FALSE:
+ if (mrb_nil_p(v))
+ return mrb_obj_value(mrb->nil_class);
+ return mrb_obj_value(mrb->false_class);
+ case MRB_TT_TRUE:
+ return mrb_obj_value(mrb->true_class);
+ case MRB_TT_CPTR:
+ return mrb_obj_value(mrb->object_class);
+ case MRB_TT_SYMBOL:
+ case MRB_TT_FIXNUM:
+ case MRB_TT_FLOAT:
+ mrb_raise(mrb, E_TYPE_ERROR, "can't define singleton");
+ return mrb_nil_value(); /* not reached */
+ default:
+ break;
+ }
+ obj = mrb_basic_ptr(v);
+ prepare_singleton_class(mrb, obj);
+ if (mrb->c && mrb->c->ci && mrb->c->ci->target_class) {
+ mrb_obj_iv_set(mrb, (struct RObject*)obj->c, mrb_intern_lit(mrb, "__outer__"),
+ mrb_obj_value(mrb->c->ci->target_class));
+ }
+ return mrb_obj_value(obj->c);
+}
+
+MRB_API void
+mrb_define_singleton_method(mrb_state *mrb, struct RObject *o, const char *name, mrb_func_t func, mrb_aspec aspec)
+{
+ prepare_singleton_class(mrb, (struct RBasic*)o);
+ mrb_define_method_id(mrb, o->c, mrb_intern_cstr(mrb, name), func, aspec);
+}
+
+MRB_API void
+mrb_define_class_method(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, mrb_aspec aspec)
+{
+ mrb_define_singleton_method(mrb, (struct RObject*)c, name, func, aspec);
+}
+
+MRB_API void
+mrb_define_module_function(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, mrb_aspec aspec)
+{
+ mrb_define_class_method(mrb, c, name, func, aspec);
+ mrb_define_method(mrb, c, name, func, aspec);
+}
+
+MRB_API struct RProc*
+mrb_method_search_vm(mrb_state *mrb, struct RClass **cp, mrb_sym mid)
+{
+ khiter_t k;
+ struct RProc *m;
+ struct RClass *c = *cp;
+
+ while (c) {
+ khash_t(mt) *h = c->mt;
+
+ if (h) {
+ k = kh_get(mt, mrb, h, mid);
+ if (k != kh_end(h)) {
+ m = kh_value(h, k);
+ if (!m) break;
+ *cp = c;
+ return m;
+ }
+ }
+ c = c->super;
+ }
+ return NULL; /* no method */
+}
+
+MRB_API struct RProc*
+mrb_method_search(mrb_state *mrb, struct RClass* c, mrb_sym mid)
+{
+ struct RProc *m;
+
+ m = mrb_method_search_vm(mrb, &c, mid);
+ if (!m) {
+ mrb_value inspect = mrb_funcall(mrb, mrb_obj_value(c), "inspect", 0);
+ if (RSTRING_LEN(inspect) > 64) {
+ inspect = mrb_any_to_s(mrb, mrb_obj_value(c));
+ }
+ mrb_name_error(mrb, mid, "undefined method '%S' for class %S",
+ mrb_sym2str(mrb, mid), inspect);
+ }
+ return m;
+}
+
+static mrb_value
+attr_reader(mrb_state *mrb, mrb_value obj)
+{
+ mrb_value name = mrb_proc_cfunc_env_get(mrb, 0);
+ return mrb_iv_get(mrb, obj, to_sym(mrb, name));
+}
+
+static mrb_value
+mrb_mod_attr_reader(mrb_state *mrb, mrb_value mod)
+{
+ struct RClass *c = mrb_class_ptr(mod);
+ mrb_value *argv;
+ mrb_int argc, i;
+ int ai;
+
+ mrb_get_args(mrb, "*", &argv, &argc);
+ ai = mrb_gc_arena_save(mrb);
+ for (i=0; i<argc; i++) {
+ mrb_value name, str;
+ mrb_sym method, sym;
+
+ method = to_sym(mrb, argv[i]);
+ name = mrb_sym2str(mrb, method);
+ str = mrb_str_buf_new(mrb, RSTRING_LEN(name)+1);
+ mrb_str_cat_lit(mrb, str, "@");
+ mrb_str_cat_str(mrb, str, name);
+ sym = mrb_intern_str(mrb, str);
+ mrb_iv_check(mrb, sym);
+ name = mrb_symbol_value(sym);
+ mrb_define_method_raw(mrb, c, method,
+ mrb_proc_new_cfunc_with_env(mrb, attr_reader, 1, &name));
+ mrb_gc_arena_restore(mrb, ai);
+ }
+ return mrb_nil_value();
+}
+
+static mrb_value
+attr_writer(mrb_state *mrb, mrb_value obj)
+{
+ mrb_value name = mrb_proc_cfunc_env_get(mrb, 0);
+ mrb_value val;
+
+ mrb_get_args(mrb, "o", &val);
+ mrb_iv_set(mrb, obj, to_sym(mrb, name), val);
+ return val;
+}
+
+static mrb_value
+mrb_mod_attr_writer(mrb_state *mrb, mrb_value mod)
+{
+ struct RClass *c = mrb_class_ptr(mod);
+ mrb_value *argv;
+ mrb_int argc, i;
+ int ai;
+
+ mrb_get_args(mrb, "*", &argv, &argc);
+ ai = mrb_gc_arena_save(mrb);
+ for (i=0; i<argc; i++) {
+ mrb_value name, str, attr;
+ mrb_sym method, sym;
+
+ method = to_sym(mrb, argv[i]);
+
+ /* prepare iv name (@name) */
+ name = mrb_sym2str(mrb, method);
+ str = mrb_str_buf_new(mrb, RSTRING_LEN(name)+1);
+ mrb_str_cat_lit(mrb, str, "@");
+ mrb_str_cat_str(mrb, str, name);
+ sym = mrb_intern_str(mrb, str);
+ mrb_iv_check(mrb, sym);
+ attr = mrb_symbol_value(sym);
+
+ /* prepare method name (name=) */
+ str = mrb_str_buf_new(mrb, RSTRING_LEN(str));
+ mrb_str_cat_str(mrb, str, name);
+ mrb_str_cat_lit(mrb, str, "=");
+ method = mrb_intern_str(mrb, str);
+
+ mrb_define_method_raw(mrb, c, method,
+ mrb_proc_new_cfunc_with_env(mrb, attr_writer, 1, &attr));
+ mrb_gc_arena_restore(mrb, ai);
+ }
+ return mrb_nil_value();
+}
+
+static mrb_value
+mrb_instance_alloc(mrb_state *mrb, mrb_value cv)
+{
+ struct RClass *c = mrb_class_ptr(cv);
+ struct RObject *o;
+ enum mrb_vtype ttype = MRB_INSTANCE_TT(c);
+
+ if (c->tt == MRB_TT_SCLASS)
+ mrb_raise(mrb, E_TYPE_ERROR, "can't create instance of singleton class");
+
+ if (ttype == 0) ttype = MRB_TT_OBJECT;
+ o = (struct RObject*)mrb_obj_alloc(mrb, ttype, c);
+ return mrb_obj_value(o);
+}
+
+/*
+ * call-seq:
+ * class.new(args, ...) -> obj
+ *
+ * Calls <code>allocate</code> to create a new object of
+ * <i>class</i>'s class, then invokes that object's
+ * <code>initialize</code> method, passing it <i>args</i>.
+ * This is the method that ends up getting called whenever
+ * an object is constructed using .new.
+ *
+ */
+
+MRB_API mrb_value
+mrb_instance_new(mrb_state *mrb, mrb_value cv)
+{
+ mrb_value obj, blk;
+ mrb_value *argv;
+ mrb_int argc;
+
+ mrb_get_args(mrb, "*&", &argv, &argc, &blk);
+ obj = mrb_instance_alloc(mrb, cv);
+ mrb_funcall_with_block(mrb, obj, mrb_intern_lit(mrb, "initialize"), argc, argv, blk);
+
+ return obj;
+}
+
+MRB_API mrb_value
+mrb_obj_new(mrb_state *mrb, struct RClass *c, mrb_int argc, const mrb_value *argv)
+{
+ mrb_value obj;
+
+ obj = mrb_instance_alloc(mrb, mrb_obj_value(c));
+ mrb_funcall_argv(mrb, obj, mrb_intern_lit(mrb, "initialize"), argc, argv);
+
+ return obj;
+}
+
+static mrb_value
+mrb_class_initialize(mrb_state *mrb, mrb_value c)
+{
+ mrb_value a, b;
+
+ mrb_get_args(mrb, "|C&", &a, &b);
+ if (!mrb_nil_p(b)) {
+ mrb_yield_with_class(mrb, b, 1, &c, c, mrb_class_ptr(c));
+ }
+ return c;
+}
+
+static mrb_value
+mrb_class_new_class(mrb_state *mrb, mrb_value cv)
+{
+ mrb_int n;
+ mrb_value super, blk;
+ mrb_value new_class;
+
+ n = mrb_get_args(mrb, "|C&", &super, &blk);
+ if (n == 0) {
+ super = mrb_obj_value(mrb->object_class);
+ }
+ new_class = mrb_obj_value(mrb_class_new(mrb, mrb_class_ptr(super)));
+ mrb_funcall_with_block(mrb, new_class, mrb_intern_lit(mrb, "initialize"), n, &super, blk);
+ mrb_class_inherited(mrb, mrb_class_ptr(super), mrb_class_ptr(new_class));
+ return new_class;
+}
+
+static mrb_value
+mrb_class_superclass(mrb_state *mrb, mrb_value klass)
+{
+ struct RClass *c;
+
+ c = mrb_class_ptr(klass);
+ c = c->super;
+ while (c && c->tt == MRB_TT_ICLASS) {
+ c = c->super;
+ }
+ if (!c) return mrb_nil_value();
+ return mrb_obj_value(c);
+}
+
+static mrb_value
+mrb_bob_init(mrb_state *mrb, mrb_value cv)
+{
+ return mrb_nil_value();
+}
+
+static mrb_value
+mrb_bob_not(mrb_state *mrb, mrb_value cv)
+{
+ return mrb_bool_value(!mrb_test(cv));
+}
+
+/* 15.3.1.3.30 */
+/*
+ * call-seq:
+ * obj.method_missing(symbol [, *args] ) -> result
+ *
+ * Invoked by Ruby when <i>obj</i> is sent a message it cannot handle.
+ * <i>symbol</i> is the symbol for the method called, and <i>args</i>
+ * are any arguments that were passed to it. By default, the interpreter
+ * raises an error when this method is called. However, it is possible
+ * to override the method to provide more dynamic behavior.
+ * If it is decided that a particular method should not be handled, then
+ * <i>super</i> should be called, so that ancestors can pick up the
+ * missing method.
+ * The example below creates
+ * a class <code>Roman</code>, which responds to methods with names
+ * consisting of roman numerals, returning the corresponding integer
+ * values.
+ *
+ * class Roman
+ * def romanToInt(str)
+ * # ...
+ * end
+ * def method_missing(methId)
+ * str = methId.id2name
+ * romanToInt(str)
+ * end
+ * end
+ *
+ * r = Roman.new
+ * r.iv #=> 4
+ * r.xxiii #=> 23
+ * r.mm #=> 2000
+ */
+static mrb_value
+mrb_bob_missing(mrb_state *mrb, mrb_value mod)
+{
+ mrb_sym name;
+ mrb_value *a;
+ mrb_int alen;
+ mrb_sym inspect;
+ mrb_value repr;
+
+ mrb_get_args(mrb, "n*", &name, &a, &alen);
+
+ inspect = mrb_intern_lit(mrb, "inspect");
+ if (mrb->c->ci > mrb->c->cibase && mrb->c->ci[-1].mid == inspect) {
+ /* method missing in inspect; avoid recursion */
+ repr = mrb_any_to_s(mrb, mod);
+ }
+ else if (mrb_respond_to(mrb, mod, inspect) && mrb->c->ci - mrb->c->cibase < 64) {
+ repr = mrb_funcall_argv(mrb, mod, inspect, 0, 0);
+ if (RSTRING_LEN(repr) > 64) {
+ repr = mrb_any_to_s(mrb, mod);
+ }
+ }
+ else {
+ repr = mrb_any_to_s(mrb, mod);
+ }
+
+ mrb_no_method_error(mrb, name, alen, a, "undefined method '%S' for %S", mrb_sym2str(mrb, name), repr);
+ /* not reached */
+ return mrb_nil_value();
+}
+
+MRB_API mrb_bool
+mrb_obj_respond_to(mrb_state *mrb, struct RClass* c, mrb_sym mid)
+{
+ khiter_t k;
+
+ while (c) {
+ khash_t(mt) *h = c->mt;
+
+ if (h) {
+ k = kh_get(mt, mrb, h, mid);
+ if (k != kh_end(h)) {
+ if (kh_value(h, k)) {
+ return TRUE; /* method exists */
+ }
+ else {
+ return FALSE; /* undefined method */
+ }
+ }
+ }
+ c = c->super;
+ }
+ return FALSE; /* no method */
+}
+
+MRB_API mrb_bool
+mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid)
+{
+ return mrb_obj_respond_to(mrb, mrb_class(mrb, obj), mid);
+}
+
+MRB_API mrb_value
+mrb_class_path(mrb_state *mrb, struct RClass *c)
+{
+ mrb_value path;
+ const char *name;
+ mrb_sym classpath = mrb_intern_lit(mrb, "__classpath__");
+
+ path = mrb_obj_iv_get(mrb, (struct RObject*)c, classpath);
+ if (mrb_nil_p(path)) {
+ struct RClass *outer = mrb_class_outer_module(mrb, c);
+ mrb_sym sym = mrb_class_sym(mrb, c, outer);
+ mrb_int len;
+
+ if (sym == 0) {
+ return mrb_nil_value();
+ }
+ else if (outer && outer != mrb->object_class) {
+ mrb_value base = mrb_class_path(mrb, outer);
+ path = mrb_str_buf_new(mrb, 0);
+ if (mrb_nil_p(base)) {
+ mrb_str_cat_lit(mrb, path, "#<Class:");
+ mrb_str_concat(mrb, path, mrb_ptr_to_str(mrb, outer));
+ mrb_str_cat_lit(mrb, path, ">");
+ }
+ else {
+ mrb_str_concat(mrb, path, base);
+ }
+ mrb_str_cat_lit(mrb, path, "::");
+ name = mrb_sym2name_len(mrb, sym, &len);
+ mrb_str_cat(mrb, path, name, len);
+ }
+ else {
+ name = mrb_sym2name_len(mrb, sym, &len);
+ path = mrb_str_new(mrb, name, len);
+ }
+ mrb_obj_iv_set(mrb, (struct RObject*)c, classpath, path);
+ }
+ return path;
+}
+
+MRB_API struct RClass *
+mrb_class_real(struct RClass* cl)
+{
+ if (cl == 0)
+ return NULL;
+ while ((cl->tt == MRB_TT_SCLASS) || (cl->tt == MRB_TT_ICLASS)) {
+ cl = cl->super;
+ }
+ return cl;
+}
+
+MRB_API const char*
+mrb_class_name(mrb_state *mrb, struct RClass* c)
+{
+ mrb_value path = mrb_class_path(mrb, c);
+ if (mrb_nil_p(path)) {
+ path = mrb_str_new_lit(mrb, "#<Class:");
+ mrb_str_concat(mrb, path, mrb_ptr_to_str(mrb, c));
+ mrb_str_cat_lit(mrb, path, ">");
+ }
+ return RSTRING_PTR(path);
+}
+
+MRB_API const char*
+mrb_obj_classname(mrb_state *mrb, mrb_value obj)
+{
+ return mrb_class_name(mrb, mrb_obj_class(mrb, obj));
+}
+
+/*!
+ * Ensures a class can be derived from super.
+ *
+ * \param super a reference to an object.
+ * \exception TypeError if \a super is not a Class or \a super is a singleton class.
+ */
+static void
+mrb_check_inheritable(mrb_state *mrb, struct RClass *super)
+{
+ if (super->tt != MRB_TT_CLASS) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%S given)", mrb_obj_value(super));
+ }
+ if (super->tt == MRB_TT_SCLASS) {
+ mrb_raise(mrb, E_TYPE_ERROR, "can't make subclass of singleton class");
+ }
+ if (super == mrb->class_class) {
+ mrb_raise(mrb, E_TYPE_ERROR, "can't make subclass of Class");
+ }
+}
+
+/*!
+ * Creates a new class.
+ * \param super a class from which the new class derives.
+ * \exception TypeError \a super is not inheritable.
+ * \exception TypeError \a super is the Class class.
+ */
+MRB_API struct RClass*
+mrb_class_new(mrb_state *mrb, struct RClass *super)
+{
+ struct RClass *c;
+
+ if (super) {
+ mrb_check_inheritable(mrb, super);
+ }
+ c = boot_defclass(mrb, super);
+ if (super) {
+ MRB_SET_INSTANCE_TT(c, MRB_INSTANCE_TT(super));
+ }
+ make_metaclass(mrb, c);
+
+ return c;
+}
+
+/*!
+ * Creates a new module.
+ */
+MRB_API struct RClass*
+mrb_module_new(mrb_state *mrb)
+{
+ struct RClass *m = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_MODULE, mrb->module_class);
+ m->mt = kh_init(mt, mrb);
+
+ return m;
+}
+
+/*
+ * call-seq:
+ * obj.class => class
+ *
+ * Returns the class of <i>obj</i>, now preferred over
+ * <code>Object#type</code>, as an object's type in Ruby is only
+ * loosely tied to that object's class. This method must always be
+ * called with an explicit receiver, as <code>class</code> is also a
+ * reserved word in Ruby.
+ *
+ * 1.class #=> Fixnum
+ * self.class #=> Object
+ */
+
+MRB_API struct RClass*
+mrb_obj_class(mrb_state *mrb, mrb_value obj)
+{
+ return mrb_class_real(mrb_class(mrb, obj));
+}
+
+MRB_API void
+mrb_alias_method(mrb_state *mrb, struct RClass *c, mrb_sym a, mrb_sym b)
+{
+ struct RProc *m = mrb_method_search(mrb, c, b);
+
+ mrb_define_method_vm(mrb, c, a, mrb_obj_value(m));
+}
+
+/*!
+ * Defines an alias of a method.
+ * \param klass the class which the original method belongs to
+ * \param name1 a new name for the method
+ * \param name2 the original name of the method
+ */
+MRB_API void
+mrb_define_alias(mrb_state *mrb, struct RClass *klass, const char *name1, const char *name2)
+{
+ mrb_alias_method(mrb, klass, mrb_intern_cstr(mrb, name1), mrb_intern_cstr(mrb, name2));
+}
+
+/*
+ * call-seq:
+ * mod.to_s -> string
+ *
+ * Return a string representing this module or class. For basic
+ * classes and modules, this is the name. For singletons, we
+ * show information on the thing we're attached to as well.
+ */
+
+static mrb_value
+mrb_mod_to_s(mrb_state *mrb, mrb_value klass)
+{
+ mrb_value str;
+
+ if (mrb_type(klass) == MRB_TT_SCLASS) {
+ mrb_value v = mrb_iv_get(mrb, klass, mrb_intern_lit(mrb, "__attached__"));
+
+ str = mrb_str_new_lit(mrb, "#<Class:");
+
+ switch (mrb_type(v)) {
+ case MRB_TT_CLASS:
+ case MRB_TT_MODULE:
+ case MRB_TT_SCLASS:
+ mrb_str_append(mrb, str, mrb_inspect(mrb, v));
+ break;
+ default:
+ mrb_str_append(mrb, str, mrb_any_to_s(mrb, v));
+ break;
+ }
+ return mrb_str_cat_lit(mrb, str, ">");
+ }
+ else {
+ struct RClass *c;
+ mrb_value path;
+
+ str = mrb_str_buf_new(mrb, 32);
+ c = mrb_class_ptr(klass);
+ path = mrb_class_path(mrb, c);
+
+ if (mrb_nil_p(path)) {
+ switch (mrb_type(klass)) {
+ case MRB_TT_CLASS:
+ mrb_str_cat_lit(mrb, str, "#<Class:");
+ break;
+
+ case MRB_TT_MODULE:
+ mrb_str_cat_lit(mrb, str, "#<Module:");
+ break;
+
+ default:
+ /* Shouldn't be happened? */
+ mrb_str_cat_lit(mrb, str, "#<??????:");
+ break;
+ }
+ mrb_str_concat(mrb, str, mrb_ptr_to_str(mrb, c));
+ return mrb_str_cat_lit(mrb, str, ">");
+ }
+ else {
+ return path;
+ }
+ }
+}
+
+static mrb_value
+mrb_mod_alias(mrb_state *mrb, mrb_value mod)
+{
+ struct RClass *c = mrb_class_ptr(mod);
+ mrb_sym new_name, old_name;
+
+ mrb_get_args(mrb, "nn", &new_name, &old_name);
+ mrb_alias_method(mrb, c, new_name, old_name);
+ return mrb_nil_value();
+}
+
+static void
+undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a)
+{
+ mrb_value m;
+
+ if (!mrb_obj_respond_to(mrb, c, a)) {
+ mrb_name_error(mrb, a, "undefined method '%S' for class '%S'", mrb_sym2str(mrb, a), mrb_obj_value(c));
+ }
+ else {
+ SET_PROC_VALUE(m, 0);
+ mrb_define_method_vm(mrb, c, a, m);
+ }
+}
+
+MRB_API void
+mrb_undef_method(mrb_state *mrb, struct RClass *c, const char *name)
+{
+ undef_method(mrb, c, mrb_intern_cstr(mrb, name));
+}
+
+MRB_API void
+mrb_undef_class_method(mrb_state *mrb, struct RClass *c, const char *name)
+{
+ mrb_undef_method(mrb, mrb_class_ptr(mrb_singleton_class(mrb, mrb_obj_value(c))), name);
+}
+
+static mrb_value
+mrb_mod_undef(mrb_state *mrb, mrb_value mod)
+{
+ struct RClass *c = mrb_class_ptr(mod);
+ mrb_int argc;
+ mrb_value *argv;
+
+ mrb_get_args(mrb, "*", &argv, &argc);
+ while (argc--) {
+ undef_method(mrb, c, mrb_symbol(*argv));
+ argv++;
+ }
+ return mrb_nil_value();
+}
+
+static mrb_value
+mod_define_method(mrb_state *mrb, mrb_value self)
+{
+ struct RClass *c = mrb_class_ptr(self);
+ struct RProc *p;
+ mrb_sym mid;
+ mrb_value blk;
+
+ mrb_get_args(mrb, "n&", &mid, &blk);
+ if (mrb_nil_p(blk)) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
+ }
+ p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);
+ mrb_proc_copy(p, mrb_proc_ptr(blk));
+ p->flags |= MRB_PROC_STRICT;
+ mrb_define_method_raw(mrb, c, mid, p);
+ return mrb_symbol_value(mid);
+}
+
+static void
+check_cv_name_str(mrb_state *mrb, mrb_value str)
+{
+ const char *s = RSTRING_PTR(str);
+ mrb_int len = RSTRING_LEN(str);
+
+ if (len < 3 || !(s[0] == '@' && s[1] == '@')) {
+ mrb_name_error(mrb, mrb_intern_str(mrb, str), "`%S' is not allowed as a class variable name", str);
+ }
+}
+
+static void
+check_cv_name_sym(mrb_state *mrb, mrb_sym id)
+{
+ check_cv_name_str(mrb, mrb_sym2str(mrb, id));
+}
+
+/* 15.2.2.4.16 */
+/*
+ * call-seq:
+ * obj.class_variable_defined?(symbol) -> true or false
+ *
+ * Returns <code>true</code> if the given class variable is defined
+ * in <i>obj</i>.
+ *
+ * class Fred
+ * @@foo = 99
+ * end
+ * Fred.class_variable_defined?(:@@foo) #=> true
+ * Fred.class_variable_defined?(:@@bar) #=> false
+ */
+
+static mrb_value
+mrb_mod_cvar_defined(mrb_state *mrb, mrb_value mod)
+{
+ mrb_sym id;
+
+ mrb_get_args(mrb, "n", &id);
+ check_cv_name_sym(mrb, id);
+ return mrb_bool_value(mrb_cv_defined(mrb, mod, id));
+}
+
+/* 15.2.2.4.17 */
+/*
+ * call-seq:
+ * mod.class_variable_get(symbol) -> obj
+ *
+ * Returns the value of the given class variable (or throws a
+ * <code>NameError</code> exception). The <code>@@</code> part of the
+ * variable name should be included for regular class variables
+ *
+ * class Fred
+ * @@foo = 99
+ * end
+ * Fred.class_variable_get(:@@foo) #=> 99
+ */
+
+static mrb_value
+mrb_mod_cvar_get(mrb_state *mrb, mrb_value mod)
+{
+ mrb_sym id;
+
+ mrb_get_args(mrb, "n", &id);
+ check_cv_name_sym(mrb, id);
+ return mrb_cv_get(mrb, mod, id);
+}
+
+/* 15.2.2.4.18 */
+/*
+ * call-seq:
+ * obj.class_variable_set(symbol, obj) -> obj
+ *
+ * Sets the class variable names by <i>symbol</i> to
+ * <i>object</i>.
+ *
+ * class Fred
+ * @@foo = 99
+ * def foo
+ * @@foo
+ * end
+ * end
+ * Fred.class_variable_set(:@@foo, 101) #=> 101
+ * Fred.new.foo #=> 101
+ */
+
+static mrb_value
+mrb_mod_cvar_set(mrb_state *mrb, mrb_value mod)
+{
+ mrb_value value;
+ mrb_sym id;
+
+ mrb_get_args(mrb, "no", &id, &value);
+ check_cv_name_sym(mrb, id);
+ mrb_cv_set(mrb, mod, id, value);
+ return value;
+}
+
+/* 15.2.2.4.39 */
+/*
+ * call-seq:
+ * remove_class_variable(sym) -> obj
+ *
+ * Removes the definition of the <i>sym</i>, returning that
+ * constant's value.
+ *
+ * class Dummy
+ * @@var = 99
+ * puts @@var
+ * p class_variables
+ * remove_class_variable(:@@var)
+ * p class_variables
+ * end
+ *
+ * <em>produces:</em>
+ *
+ * 99
+ * [:@@var]
+ * []
+ */
+
+static mrb_value
+mrb_mod_remove_cvar(mrb_state *mrb, mrb_value mod)
+{
+ mrb_value val;
+ mrb_sym id;
+
+ mrb_get_args(mrb, "n", &id);
+ check_cv_name_sym(mrb, id);
+
+ val = mrb_iv_remove(mrb, mod, id);
+ if (!mrb_undef_p(val)) return val;
+
+ if (mrb_cv_defined(mrb, mod, id)) {
+ mrb_name_error(mrb, id, "cannot remove %S for %S",
+ mrb_sym2str(mrb, id), mod);
+ }
+
+ mrb_name_error(mrb, id, "class variable %S not defined for %S",
+ mrb_sym2str(mrb, id), mod);
+
+ /* not reached */
+ return mrb_nil_value();
+}
+
+/* 15.2.2.4.34 */
+/*
+ * call-seq:
+ * mod.method_defined?(symbol) -> true or false
+ *
+ * Returns +true+ if the named method is defined by
+ * _mod_ (or its included modules and, if _mod_ is a class,
+ * its ancestors). Public and protected methods are matched.
+ *
+ * module A
+ * def method1() end
+ * end
+ * class B
+ * def method2() end
+ * end
+ * class C < B
+ * include A
+ * def method3() end
+ * end
+ *
+ * A.method_defined? :method1 #=> true
+ * C.method_defined? "method1" #=> true
+ * C.method_defined? "method2" #=> true
+ * C.method_defined? "method3" #=> true
+ * C.method_defined? "method4" #=> false
+ */
+
+static mrb_value
+mrb_mod_method_defined(mrb_state *mrb, mrb_value mod)
+{
+ mrb_sym id;
+
+ mrb_get_args(mrb, "n", &id);
+ return mrb_bool_value(mrb_obj_respond_to(mrb, mrb_class_ptr(mod), id));
+}
+
+static void
+remove_method(mrb_state *mrb, mrb_value mod, mrb_sym mid)
+{
+ struct RClass *c = mrb_class_ptr(mod);
+ khash_t(mt) *h = c->mt;
+ khiter_t k;
+
+ if (h) {
+ k = kh_get(mt, mrb, h, mid);
+ if (k != kh_end(h)) {
+ kh_del(mt, mrb, h, k);
+ return;
+ }
+ }
+
+ mrb_name_error(mrb, mid, "method `%S' not defined in %S",
+ mrb_sym2str(mrb, mid), mod);
+}
+
+/* 15.2.2.4.41 */
+/*
+ * call-seq:
+ * remove_method(symbol) -> self
+ *
+ * Removes the method identified by _symbol_ from the current
+ * class. For an example, see <code>Module.undef_method</code>.
+ */
+
+static mrb_value
+mrb_mod_remove_method(mrb_state *mrb, mrb_value mod)
+{
+ mrb_int argc;
+ mrb_value *argv;
+
+ mrb_get_args(mrb, "*", &argv, &argc);
+ while (argc--) {
+ remove_method(mrb, mod, mrb_symbol(*argv));
+ argv++;
+ }
+ return mod;
+}
+
+
+
+static void
+check_const_name_str(mrb_state *mrb, mrb_value str)
+{
+ if (RSTRING_LEN(str) < 1 || !ISUPPER(*RSTRING_PTR(str))) {
+ mrb_name_error(mrb, mrb_intern_str(mrb, str), "wrong constant name %S", str);
+ }
+}
+
+static void
+check_const_name_sym(mrb_state *mrb, mrb_sym id)
+{
+ check_const_name_str(mrb, mrb_sym2str(mrb, id));
+}
+
+static mrb_value
+const_defined(mrb_state *mrb, mrb_value mod, mrb_sym id, mrb_bool inherit)
+{
+ if (inherit) {
+ return mrb_bool_value(mrb_const_defined(mrb, mod, id));
+ }
+ return mrb_bool_value(mrb_const_defined_at(mrb, mod, id));
+}
+
+static mrb_value
+mrb_mod_const_defined(mrb_state *mrb, mrb_value mod)
+{
+ mrb_sym id;
+ mrb_bool inherit = TRUE;
+
+ mrb_get_args(mrb, "n|b", &id, &inherit);
+ check_const_name_sym(mrb, id);
+ return const_defined(mrb, mod, id, inherit);
+}
+
+static mrb_value
+mrb_mod_const_get(mrb_state *mrb, mrb_value mod)
+{
+ mrb_sym id;
+
+ mrb_get_args(mrb, "n", &id);
+ check_const_name_sym(mrb, id);
+ return mrb_const_get(mrb, mod, id);
+}
+
+static mrb_value
+mrb_mod_const_set(mrb_state *mrb, mrb_value mod)
+{
+ mrb_sym id;
+ mrb_value value;
+
+ mrb_get_args(mrb, "no", &id, &value);
+ check_const_name_sym(mrb, id);
+ mrb_const_set(mrb, mod, id, value);
+ return value;
+}
+
+static mrb_value
+mrb_mod_remove_const(mrb_state *mrb, mrb_value mod)
+{
+ mrb_sym id;
+ mrb_value val;
+
+ mrb_get_args(mrb, "n", &id);
+ check_const_name_sym(mrb, id);
+ val = mrb_iv_remove(mrb, mod, id);
+ if (mrb_undef_p(val)) {
+ mrb_name_error(mrb, id, "constant %S not defined", mrb_sym2str(mrb, id));
+ }
+ return val;
+}
+
+static mrb_value
+mrb_mod_const_missing(mrb_state *mrb, mrb_value mod)
+{
+ mrb_sym sym;
+
+ mrb_get_args(mrb, "n", &sym);
+
+ if (mrb_class_real(mrb_class_ptr(mod)) != mrb->object_class) {
+ mrb_name_error(mrb, sym, "uninitialized constant %S::%S",
+ mod,
+ mrb_sym2str(mrb, sym));
+ }
+ else {
+ mrb_name_error(mrb, sym, "uninitialized constant %S",
+ mrb_sym2str(mrb, sym));
+ }
+ /* not reached */
+ return mrb_nil_value();
+}
+
+static mrb_value
+mrb_mod_s_constants(mrb_state *mrb, mrb_value mod)
+{
+ mrb_raise(mrb, E_NOTIMP_ERROR, "Module.constants not implemented");
+ return mrb_nil_value(); /* not reached */
+}
+
+static mrb_value
+mrb_mod_eqq(mrb_state *mrb, mrb_value mod)
+{
+ mrb_value obj;
+ mrb_bool eqq;
+
+ mrb_get_args(mrb, "o", &obj);
+ eqq = mrb_obj_is_kind_of(mrb, obj, mrb_class_ptr(mod));
+
+ return mrb_bool_value(eqq);
+}
+
+MRB_API mrb_value
+mrb_mod_module_function(mrb_state *mrb, mrb_value mod)
+{
+ mrb_value *argv;
+ mrb_int argc, i;
+ mrb_sym mid;
+ struct RProc *method_rproc;
+ struct RClass *rclass;
+ int ai;
+
+ mrb_check_type(mrb, mod, MRB_TT_MODULE);
+
+ mrb_get_args(mrb, "*", &argv, &argc);
+ if(argc == 0) {
+ /* set MODFUNC SCOPE if implemented */
+ return mod;
+ }
+
+ /* set PRIVATE method visibility if implemented */
+ /* mrb_mod_dummy_visibility(mrb, mod); */
+
+ for (i=0; i<argc; i++) {
+ mrb_check_type(mrb, argv[i], MRB_TT_SYMBOL);
+
+ mid = mrb_symbol(argv[i]);
+ rclass = mrb_class_ptr(mod);
+ method_rproc = mrb_method_search(mrb, rclass, mid);
+
+ prepare_singleton_class(mrb, (struct RBasic*)rclass);
+ ai = mrb_gc_arena_save(mrb);
+ mrb_define_method_raw(mrb, rclass->c, mid, method_rproc);
+ mrb_gc_arena_restore(mrb, ai);
+ }
+
+ return mod;
+}
+
+void
+mrb_init_class(mrb_state *mrb)
+{
+ struct RClass *bob; /* BasicObject */
+ struct RClass *obj; /* Object */
+ struct RClass *mod; /* Module */
+ struct RClass *cls; /* Class */
+
+ /* boot class hierarchy */
+ bob = boot_defclass(mrb, 0);
+ obj = boot_defclass(mrb, bob); mrb->object_class = obj;
+ mod = boot_defclass(mrb, obj); mrb->module_class = mod;/* obj -> mod */
+ cls = boot_defclass(mrb, mod); mrb->class_class = cls; /* obj -> cls */
+ /* fix-up loose ends */
+ bob->c = obj->c = mod->c = cls->c = cls;
+ make_metaclass(mrb, bob);
+ make_metaclass(mrb, obj);
+ make_metaclass(mrb, mod);
+ make_metaclass(mrb, cls);
+
+ /* name basic classes */
+ mrb_define_const(mrb, bob, "BasicObject", mrb_obj_value(bob));
+ mrb_define_const(mrb, obj, "BasicObject", mrb_obj_value(bob));
+ mrb_define_const(mrb, obj, "Object", mrb_obj_value(obj));
+ mrb_define_const(mrb, obj, "Module", mrb_obj_value(mod));
+ mrb_define_const(mrb, obj, "Class", mrb_obj_value(cls));
+
+ /* name each classes */
+ name_class(mrb, bob, mrb_intern_lit(mrb, "BasicObject"));
+ name_class(mrb, obj, mrb_intern_lit(mrb, "Object")); /* 15.2.1 */
+ name_class(mrb, mod, mrb_intern_lit(mrb, "Module")); /* 15.2.2 */
+ name_class(mrb, cls, mrb_intern_lit(mrb, "Class")); /* 15.2.3 */
+
+ mrb->proc_class = mrb_define_class(mrb, "Proc", mrb->object_class); /* 15.2.17 */
+ MRB_SET_INSTANCE_TT(mrb->proc_class, MRB_TT_PROC);
+
+ MRB_SET_INSTANCE_TT(cls, MRB_TT_CLASS);
+ mrb_define_method(mrb, bob, "initialize", mrb_bob_init, MRB_ARGS_NONE());
+ mrb_define_method(mrb, bob, "!", mrb_bob_not, MRB_ARGS_NONE());
+ mrb_define_method(mrb, bob, "method_missing", mrb_bob_missing, MRB_ARGS_ANY()); /* 15.3.1.3.30 */
+
+ mrb_define_class_method(mrb, cls, "new", mrb_class_new_class, MRB_ARGS_OPT(1));
+ mrb_define_method(mrb, cls, "superclass", mrb_class_superclass, MRB_ARGS_NONE()); /* 15.2.3.3.4 */
+ mrb_define_method(mrb, cls, "new", mrb_instance_new, MRB_ARGS_ANY()); /* 15.2.3.3.3 */
+ mrb_define_method(mrb, cls, "initialize", mrb_class_initialize, MRB_ARGS_OPT(1)); /* 15.2.3.3.1 */
+ mrb_define_method(mrb, cls, "inherited", mrb_bob_init, MRB_ARGS_REQ(1));
+
+ MRB_SET_INSTANCE_TT(mod, MRB_TT_MODULE);
+ mrb_define_method(mrb, mod, "class_variable_defined?", mrb_mod_cvar_defined, MRB_ARGS_REQ(1)); /* 15.2.2.4.16 */
+ mrb_define_method(mrb, mod, "class_variable_get", mrb_mod_cvar_get, MRB_ARGS_REQ(1)); /* 15.2.2.4.17 */
+ mrb_define_method(mrb, mod, "class_variable_set", mrb_mod_cvar_set, MRB_ARGS_REQ(2)); /* 15.2.2.4.18 */
+ mrb_define_method(mrb, mod, "extend_object", mrb_mod_extend_object, MRB_ARGS_REQ(1)); /* 15.2.2.4.25 */
+ mrb_define_method(mrb, mod, "extended", mrb_bob_init, MRB_ARGS_REQ(1)); /* 15.2.2.4.26 */
+ mrb_define_method(mrb, mod, "include", mrb_mod_include, MRB_ARGS_ANY()); /* 15.2.2.4.27 */
+ mrb_define_method(mrb, mod, "include?", mrb_mod_include_p, MRB_ARGS_REQ(1)); /* 15.2.2.4.28 */
+ mrb_define_method(mrb, mod, "append_features", mrb_mod_append_features, MRB_ARGS_REQ(1)); /* 15.2.2.4.10 */
+ mrb_define_method(mrb, mod, "class_eval", mrb_mod_module_eval, MRB_ARGS_ANY()); /* 15.2.2.4.15 */
+ mrb_define_method(mrb, mod, "included", mrb_bob_init, MRB_ARGS_REQ(1)); /* 15.2.2.4.29 */
+ mrb_define_method(mrb, mod, "included_modules", mrb_mod_included_modules, MRB_ARGS_NONE()); /* 15.2.2.4.30 */
+ mrb_define_method(mrb, mod, "initialize", mrb_mod_initialize, MRB_ARGS_NONE()); /* 15.2.2.4.31 */
+ mrb_define_method(mrb, mod, "instance_methods", mrb_mod_instance_methods, MRB_ARGS_ANY()); /* 15.2.2.4.33 */
+ mrb_define_method(mrb, mod, "method_defined?", mrb_mod_method_defined, MRB_ARGS_REQ(1)); /* 15.2.2.4.34 */
+ mrb_define_method(mrb, mod, "module_eval", mrb_mod_module_eval, MRB_ARGS_ANY()); /* 15.2.2.4.35 */
+ mrb_define_method(mrb, mod, "module_function", mrb_mod_module_function, MRB_ARGS_ANY());
+ mrb_define_method(mrb, mod, "private", mrb_mod_dummy_visibility, MRB_ARGS_ANY()); /* 15.2.2.4.36 */
+ mrb_define_method(mrb, mod, "protected", mrb_mod_dummy_visibility, MRB_ARGS_ANY()); /* 15.2.2.4.37 */
+ mrb_define_method(mrb, mod, "public", mrb_mod_dummy_visibility, MRB_ARGS_ANY()); /* 15.2.2.4.38 */
+ mrb_define_method(mrb, mod, "remove_class_variable", mrb_mod_remove_cvar, MRB_ARGS_REQ(1)); /* 15.2.2.4.39 */
+ mrb_define_method(mrb, mod, "remove_method", mrb_mod_remove_method, MRB_ARGS_ANY()); /* 15.2.2.4.41 */
+ mrb_define_method(mrb, mod, "attr_reader", mrb_mod_attr_reader, MRB_ARGS_ANY()); /* 15.2.2.4.13 */
+ mrb_define_method(mrb, mod, "attr_writer", mrb_mod_attr_writer, MRB_ARGS_ANY()); /* 15.2.2.4.14 */
+ mrb_define_method(mrb, mod, "to_s", mrb_mod_to_s, MRB_ARGS_NONE());
+ mrb_define_method(mrb, mod, "inspect", mrb_mod_to_s, MRB_ARGS_NONE());
+ mrb_define_method(mrb, mod, "alias_method", mrb_mod_alias, MRB_ARGS_ANY()); /* 15.2.2.4.8 */
+ mrb_define_method(mrb, mod, "ancestors", mrb_mod_ancestors, MRB_ARGS_NONE()); /* 15.2.2.4.9 */
+ mrb_define_method(mrb, mod, "undef_method", mrb_mod_undef, MRB_ARGS_ANY()); /* 15.2.2.4.41 */
+ mrb_define_method(mrb, mod, "const_defined?", mrb_mod_const_defined, MRB_ARGS_ARG(1,1)); /* 15.2.2.4.20 */
+ mrb_define_method(mrb, mod, "const_get", mrb_mod_const_get, MRB_ARGS_REQ(1)); /* 15.2.2.4.21 */
+ mrb_define_method(mrb, mod, "const_set", mrb_mod_const_set, MRB_ARGS_REQ(2)); /* 15.2.2.4.23 */
+ mrb_define_method(mrb, mod, "constants", mrb_mod_constants, MRB_ARGS_OPT(1)); /* 15.2.2.4.24 */
+ mrb_define_method(mrb, mod, "remove_const", mrb_mod_remove_const, MRB_ARGS_REQ(1)); /* 15.2.2.4.40 */
+ mrb_define_method(mrb, mod, "const_missing", mrb_mod_const_missing, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, mod, "define_method", mod_define_method, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, mod, "class_variables", mrb_mod_class_variables, MRB_ARGS_NONE()); /* 15.2.2.4.19 */
+ mrb_define_method(mrb, mod, "===", mrb_mod_eqq, MRB_ARGS_REQ(1));
+ mrb_define_class_method(mrb, mod, "constants", mrb_mod_s_constants, MRB_ARGS_ANY()); /* 15.2.2.3.1 */
+
+ mrb_undef_method(mrb, cls, "append_features");
+ mrb_undef_method(mrb, cls, "extend_object");
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/codegen.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,3146 @@
+/*
+** codegen.c - mruby code generator
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <ctype.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mruby.h"
+#include "mruby/compile.h"
+#include "mruby/proc.h"
+#include "mruby/numeric.h"
+#include "mruby/string.h"
+#include "mruby/debug.h"
+#include "node.h"
+#include "mruby/opcode.h"
+#include "mruby/re.h"
+#include "mrb_throw.h"
+
+typedef mrb_ast_node node;
+typedef struct mrb_parser_state parser_state;
+
+enum looptype {
+ LOOP_NORMAL,
+ LOOP_BLOCK,
+ LOOP_FOR,
+ LOOP_BEGIN,
+ LOOP_RESCUE,
+};
+
+struct loopinfo {
+ enum looptype type;
+ int pc1, pc2, pc3, acc;
+ int ensure_level;
+ struct loopinfo *prev;
+};
+
+typedef struct scope {
+ mrb_state *mrb;
+ mrb_pool *mpool;
+ struct mrb_jmpbuf jmp;
+
+ struct scope *prev;
+
+ node *lv;
+
+ int sp;
+ int pc;
+ int lastlabel;
+ int ainfo:15;
+ mrb_bool mscope:1;
+
+ struct loopinfo *loop;
+ int ensure_level;
+ char const *filename;
+ uint16_t lineno;
+
+ mrb_code *iseq;
+ uint16_t *lines;
+ int icapa;
+
+ mrb_irep *irep;
+ size_t pcapa;
+ size_t scapa;
+ size_t rcapa;
+
+ uint16_t nlocals;
+ uint16_t nregs;
+ int ai;
+
+ int debug_start_pos;
+ uint16_t filename_index;
+ parser_state* parser;
+} codegen_scope;
+
+static codegen_scope* scope_new(mrb_state *mrb, codegen_scope *prev, node *lv);
+static void scope_finish(codegen_scope *s);
+static struct loopinfo *loop_push(codegen_scope *s, enum looptype t);
+static void loop_break(codegen_scope *s, node *tree);
+static void loop_pop(codegen_scope *s, int val);
+
+static void gen_assignment(codegen_scope *s, node *tree, int sp, int val);
+static void gen_vmassignment(codegen_scope *s, node *tree, int rhs, int val);
+
+static void codegen(codegen_scope *s, node *tree, int val);
+static void raise_error(codegen_scope *s, const char *msg);
+
+static void
+codegen_error(codegen_scope *s, const char *message)
+{
+ if (!s) return;
+ while (s->prev) {
+ codegen_scope *tmp = s->prev;
+ mrb_pool_close(s->mpool);
+ s = tmp;
+ }
+#ifdef ENABLE_STDIO
+ if (s->filename && s->lineno) {
+ fprintf(stderr, "codegen error:%s:%d: %s\n", s->filename, s->lineno, message);
+ }
+ else {
+ fprintf(stderr, "codegen error: %s\n", message);
+ }
+#endif
+ MRB_THROW(&s->jmp);
+}
+
+static void*
+codegen_palloc(codegen_scope *s, size_t len)
+{
+ void *p = mrb_pool_alloc(s->mpool, len);
+
+ if (!p) codegen_error(s, "pool memory allocation");
+ return p;
+}
+
+static void*
+codegen_malloc(codegen_scope *s, size_t len)
+{
+ void *p = mrb_malloc_simple(s->mrb, len);
+
+ if (!p) codegen_error(s, "mrb_malloc");
+ return p;
+}
+
+static void*
+codegen_realloc(codegen_scope *s, void *p, size_t len)
+{
+ p = mrb_realloc_simple(s->mrb, p, len);
+
+ if (!p && len > 0) codegen_error(s, "mrb_realloc");
+ return p;
+}
+
+static int
+new_label(codegen_scope *s)
+{
+ s->lastlabel = s->pc;
+ return s->pc;
+}
+
+static inline int
+genop(codegen_scope *s, mrb_code i)
+{
+ if (s->pc == s->icapa) {
+ s->icapa *= 2;
+ s->iseq = (mrb_code *)codegen_realloc(s, s->iseq, sizeof(mrb_code)*s->icapa);
+ if (s->lines) {
+ s->lines = (uint16_t*)codegen_realloc(s, s->lines, sizeof(short)*s->icapa);
+ s->irep->lines = s->lines;
+ }
+ }
+ s->iseq[s->pc] = i;
+ if (s->lines) {
+ s->lines[s->pc] = s->lineno;
+ }
+ return s->pc++;
+}
+
+#define NOVAL 0
+#define VAL 1
+
+static mrb_bool
+no_optimize(codegen_scope *s)
+{
+ if (s && s->parser && s->parser->no_optimize)
+ return TRUE;
+ return FALSE;
+}
+
+static int
+genop_peep(codegen_scope *s, mrb_code i, int val)
+{
+ /* peephole optimization */
+ if (!no_optimize(s) && s->lastlabel != s->pc && s->pc > 0) {
+ mrb_code i0 = s->iseq[s->pc-1];
+ int c1 = GET_OPCODE(i);
+ int c0 = GET_OPCODE(i0);
+
+ switch (c1) {
+ case OP_MOVE:
+ if (GETARG_A(i) == GETARG_B(i)) {
+ /* skip useless OP_MOVE */
+ return 0;
+ }
+ if (val) break;
+ switch (c0) {
+ case OP_MOVE:
+ if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i) == GETARG_B(i0)) {
+ /* skip swapping OP_MOVE */
+ return 0;
+ }
+ if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {
+ s->pc--;
+ return genop_peep(s, MKOP_AB(OP_MOVE, GETARG_A(i), GETARG_B(i0)), val);
+ }
+ break;
+ case OP_LOADI:
+ if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {
+ s->iseq[s->pc-1] = MKOP_AsBx(OP_LOADI, GETARG_A(i), GETARG_sBx(i0));
+ return 0;
+ }
+ break;
+ case OP_ARRAY:
+ case OP_HASH:
+ case OP_RANGE:
+ case OP_AREF:
+ case OP_GETUPVAR:
+ if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {
+ s->iseq[s->pc-1] = MKOP_ABC(c0, GETARG_A(i), GETARG_B(i0), GETARG_C(i0));
+ return 0;
+ }
+ break;
+ case OP_LOADSYM:
+ case OP_GETGLOBAL:
+ case OP_GETIV:
+ case OP_GETCV:
+ case OP_GETCONST:
+ case OP_GETSPECIAL:
+ case OP_LOADL:
+ case OP_STRING:
+ if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {
+ s->iseq[s->pc-1] = MKOP_ABx(c0, GETARG_A(i), GETARG_Bx(i0));
+ return 0;
+ }
+ break;
+ case OP_SCLASS:
+ if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {
+ s->iseq[s->pc-1] = MKOP_AB(c0, GETARG_A(i), GETARG_B(i0));
+ return 0;
+ }
+ break;
+ case OP_LOADNIL:
+ case OP_LOADSELF:
+ case OP_LOADT:
+ case OP_LOADF:
+ case OP_OCLASS:
+ if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {
+ s->iseq[s->pc-1] = MKOP_A(c0, GETARG_A(i));
+ return 0;
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ case OP_SETIV:
+ case OP_SETCV:
+ case OP_SETCONST:
+ case OP_SETMCNST:
+ case OP_SETGLOBAL:
+ if (val) break;
+ if (c0 == OP_MOVE) {
+ if (GETARG_A(i) == GETARG_A(i0)) {
+ s->iseq[s->pc-1] = MKOP_ABx(c1, GETARG_B(i0), GETARG_Bx(i));
+ return 0;
+ }
+ }
+ break;
+ case OP_SETUPVAR:
+ if (val) break;
+ if (c0 == OP_MOVE) {
+ if (GETARG_A(i) == GETARG_A(i0)) {
+ s->iseq[s->pc-1] = MKOP_ABC(c1, GETARG_B(i0), GETARG_B(i), GETARG_C(i));
+ return 0;
+ }
+ }
+ break;
+ case OP_EPOP:
+ if (c0 == OP_EPOP) {
+ s->iseq[s->pc-1] = MKOP_A(OP_EPOP, GETARG_A(i0)+GETARG_A(i));
+ return 0;
+ }
+ break;
+ case OP_POPERR:
+ if (c0 == OP_POPERR) {
+ s->iseq[s->pc-1] = MKOP_A(OP_POPERR, GETARG_A(i0)+GETARG_A(i));
+ return 0;
+ }
+ break;
+ case OP_RETURN:
+ switch (c0) {
+ case OP_RETURN:
+ return 0;
+ case OP_MOVE:
+ if (GETARG_A(i0) >= s->nlocals) {
+ s->iseq[s->pc-1] = MKOP_AB(OP_RETURN, GETARG_B(i0), OP_R_NORMAL);
+ return 0;
+ }
+ break;
+ case OP_SETIV:
+ case OP_SETCV:
+ case OP_SETCONST:
+ case OP_SETMCNST:
+ case OP_SETUPVAR:
+ case OP_SETGLOBAL:
+ s->pc--;
+ genop_peep(s, i0, NOVAL);
+ i0 = s->iseq[s->pc-1];
+ return genop(s, MKOP_AB(OP_RETURN, GETARG_A(i0), OP_R_NORMAL));
+#if 0
+ case OP_SEND:
+ if (GETARG_B(i) == OP_R_NORMAL && GETARG_A(i) == GETARG_A(i0)) {
+ s->iseq[s->pc-1] = MKOP_ABC(OP_TAILCALL, GETARG_A(i0), GETARG_B(i0), GETARG_C(i0));
+ return;
+ }
+ break;
+#endif
+ default:
+ break;
+ }
+ break;
+ case OP_ADD:
+ case OP_SUB:
+ if (c0 == OP_LOADI) {
+ int c = GETARG_sBx(i0);
+
+ if (c1 == OP_SUB) c = -c;
+ if (c > 127 || c < -127) break;
+ if (0 <= c)
+ s->iseq[s->pc-1] = MKOP_ABC(OP_ADDI, GETARG_A(i), GETARG_B(i), c);
+ else
+ s->iseq[s->pc-1] = MKOP_ABC(OP_SUBI, GETARG_A(i), GETARG_B(i), -c);
+ return 0;
+ }
+ case OP_STRCAT:
+ if (c0 == OP_STRING) {
+ mrb_value v = s->irep->pool[GETARG_Bx(i0)];
+
+ if (mrb_string_p(v) && RSTRING_LEN(v) == 0) {
+ s->pc--;
+ return 0;
+ }
+ }
+ break;
+ case OP_JMPIF:
+ case OP_JMPNOT:
+ if (c0 == OP_MOVE && GETARG_A(i) == GETARG_A(i0)) {
+ s->iseq[s->pc-1] = MKOP_AsBx(c1, GETARG_B(i0), GETARG_sBx(i));
+ return s->pc-1;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ return genop(s, i);
+}
+
+static void
+scope_error(codegen_scope *s)
+{
+ exit(EXIT_FAILURE);
+}
+
+static inline void
+dispatch(codegen_scope *s, int pc)
+{
+ int diff = s->pc - pc;
+ mrb_code i = s->iseq[pc];
+ int c = GET_OPCODE(i);
+
+ s->lastlabel = s->pc;
+ switch (c) {
+ case OP_JMP:
+ case OP_JMPIF:
+ case OP_JMPNOT:
+ case OP_ONERR:
+ break;
+ default:
+#ifdef ENABLE_STDIO
+ fprintf(stderr, "bug: dispatch on non JMP op\n");
+#endif
+ scope_error(s);
+ break;
+ }
+ s->iseq[pc] = MKOP_AsBx(c, GETARG_A(i), diff);
+}
+
+static void
+dispatch_linked(codegen_scope *s, int pc)
+{
+ mrb_code i;
+ int pos;
+
+ if (!pc) return;
+ for (;;) {
+ i = s->iseq[pc];
+ pos = GETARG_sBx(i);
+ dispatch(s, pc);
+ if (!pos) break;
+ pc = pos;
+ }
+}
+
+#define nregs_update do {if (s->sp > s->nregs) s->nregs = s->sp;} while (0)
+static void
+push_(codegen_scope *s)
+{
+ if (s->sp > 511) {
+ codegen_error(s, "too complex expression");
+ }
+ s->sp++;
+ nregs_update;
+}
+
+#define push() push_(s)
+#define pop_(s) ((s)->sp--)
+#define pop() pop_(s)
+#define pop_n(n) (s->sp-=(n))
+#define cursp() (s->sp)
+
+static inline int
+new_lit(codegen_scope *s, mrb_value val)
+{
+ size_t i;
+ mrb_value *pv;
+
+ switch (mrb_type(val)) {
+ case MRB_TT_STRING:
+ for (i=0; i<s->irep->plen; i++) {
+ mrb_int len;
+ pv = &s->irep->pool[i];
+
+ if (mrb_type(*pv) != MRB_TT_STRING) continue;
+ if ((len = RSTRING_LEN(*pv)) != RSTRING_LEN(val)) continue;
+ if (memcmp(RSTRING_PTR(*pv), RSTRING_PTR(val), len) == 0)
+ return i;
+ }
+ break;
+ case MRB_TT_FLOAT:
+ for (i=0; i<s->irep->plen; i++) {
+ pv = &s->irep->pool[i];
+ if (mrb_type(*pv) != MRB_TT_FLOAT) continue;
+ if (mrb_float(*pv) == mrb_float(val)) return i;
+ }
+ break;
+ case MRB_TT_FIXNUM:
+ for (i=0; i<s->irep->plen; i++) {
+ pv = &s->irep->pool[i];
+ if (!mrb_fixnum_p(*pv)) continue;
+ if (mrb_fixnum(*pv) == mrb_fixnum(val)) return i;
+ }
+ break;
+ default:
+ /* should not happen */
+ return 0;
+ }
+
+ if (s->irep->plen == s->pcapa) {
+ s->pcapa *= 2;
+ s->irep->pool = (mrb_value *)codegen_realloc(s, s->irep->pool, sizeof(mrb_value)*s->pcapa);
+ }
+
+ pv = &s->irep->pool[s->irep->plen];
+ i = s->irep->plen++;
+
+ switch (mrb_type(val)) {
+ case MRB_TT_STRING:
+ *pv = mrb_str_pool(s->mrb, val);
+ break;
+
+ case MRB_TT_FLOAT:
+#ifdef MRB_WORD_BOXING
+ *pv = mrb_float_pool(s->mrb, mrb_float(val));
+ break;
+#endif
+ case MRB_TT_FIXNUM:
+ *pv = val;
+ break;
+
+ default:
+ /* should not happen */
+ break;
+ }
+ return i;
+}
+
+static inline int
+new_msym(codegen_scope *s, mrb_sym sym)
+{
+ size_t i, len;
+
+ mrb_assert(s->irep);
+
+ len = s->irep->slen;
+ if (len > 256) len = 256;
+ for (i=0; i<len; i++) {
+ if (s->irep->syms[i] == sym) return i;
+ if (s->irep->syms[i] == 0) break;
+ }
+ if (i == 256) {
+ codegen_error(s, "too many symbols (max 256)");
+ }
+ s->irep->syms[i] = sym;
+ if (i == s->irep->slen) s->irep->slen++;
+ return i;
+}
+
+static inline int
+new_sym(codegen_scope *s, mrb_sym sym)
+{
+ size_t i;
+
+ for (i=0; i<s->irep->slen; i++) {
+ if (s->irep->syms[i] == sym) return i;
+ }
+ if (s->irep->slen > 125 && s->irep->slen < 256) {
+ s->irep->syms = (mrb_sym *)codegen_realloc(s, s->irep->syms, sizeof(mrb_sym)*65536);
+ for (i = 0; i < 256 - s->irep->slen; i++) {
+ static const mrb_sym mrb_sym_zero = { 0 };
+ s->irep->syms[i + s->irep->slen] = mrb_sym_zero;
+ }
+ s->irep->slen = 256;
+ }
+ s->irep->syms[s->irep->slen] = sym;
+ return s->irep->slen++;
+}
+
+static int
+node_len(node *tree)
+{
+ int n = 0;
+
+ while (tree) {
+ n++;
+ tree = tree->cdr;
+ }
+ return n;
+}
+
+#define sym(x) ((mrb_sym)(intptr_t)(x))
+#define lv_name(lv) sym((lv)->car)
+static int
+lv_idx(codegen_scope *s, mrb_sym id)
+{
+ node *lv = s->lv;
+ int n = 1;
+
+ while (lv) {
+ if (lv_name(lv) == id) return n;
+ n++;
+ lv = lv->cdr;
+ }
+ return 0;
+}
+
+static void
+for_body(codegen_scope *s, node *tree)
+{
+ codegen_scope *prev = s;
+ int idx;
+ struct loopinfo *lp;
+ node *n2;
+ mrb_code c;
+
+ /* generate receiver */
+ codegen(s, tree->cdr->car, VAL);
+ /* generate loop-block */
+ s = scope_new(s->mrb, s, NULL);
+ if (s == NULL) {
+ raise_error(prev, "unexpected scope");
+ }
+
+ push(); /* push for a block parameter */
+
+ lp = loop_push(s, LOOP_FOR);
+ lp->pc1 = new_label(s);
+
+ /* generate loop variable */
+ n2 = tree->car;
+ genop(s, MKOP_Ax(OP_ENTER, 0x40000));
+ if (n2->car && !n2->car->cdr && !n2->cdr) {
+ gen_assignment(s, n2->car->car, 1, NOVAL);
+ }
+ else {
+ gen_vmassignment(s, n2, 1, VAL);
+ }
+ codegen(s, tree->cdr->cdr->car, VAL);
+ pop();
+ if (s->pc > 0) {
+ c = s->iseq[s->pc-1];
+ if (GET_OPCODE(c) != OP_RETURN || GETARG_B(c) != OP_R_NORMAL || s->pc == s->lastlabel)
+ genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL);
+ }
+ loop_pop(s, NOVAL);
+ scope_finish(s);
+ s = prev;
+ genop(s, MKOP_Abc(OP_LAMBDA, cursp(), s->irep->rlen-1, OP_L_BLOCK));
+ pop();
+ idx = new_msym(s, mrb_intern_lit(s->mrb, "each"));
+ genop(s, MKOP_ABC(OP_SENDB, cursp(), idx, 0));
+}
+
+static int
+lambda_body(codegen_scope *s, node *tree, int blk)
+{
+ mrb_code c;
+ codegen_scope *parent = s;
+ s = scope_new(s->mrb, s, tree->car);
+ if (s == NULL) {
+ raise_error(parent, "unexpected scope");
+ }
+
+ s->mscope = !blk;
+
+ if (blk) {
+ struct loopinfo *lp = loop_push(s, LOOP_BLOCK);
+ lp->pc1 = new_label(s);
+ }
+ tree = tree->cdr;
+ if (tree->car) {
+ mrb_aspec a;
+ int ma, oa, ra, pa, ka, kd, ba;
+ int pos, i;
+ node *n, *opt;
+
+ ma = node_len(tree->car->car);
+ n = tree->car->car;
+ while (n) {
+ n = n->cdr;
+ }
+ oa = node_len(tree->car->cdr->car);
+ ra = tree->car->cdr->cdr->car ? 1 : 0;
+ pa = node_len(tree->car->cdr->cdr->cdr->car);
+ ka = kd = 0;
+ ba = tree->car->cdr->cdr->cdr->cdr ? 1 : 0;
+
+ a = ((mrb_aspec)(ma & 0x1f) << 18)
+ | ((mrb_aspec)(oa & 0x1f) << 13)
+ | ((ra & 1) << 12)
+ | ((pa & 0x1f) << 7)
+ | ((ka & 0x1f) << 2)
+ | ((kd & 1)<< 1)
+ | (ba & 1);
+ s->ainfo = (((ma+oa) & 0x3f) << 6) /* (12bits = 6:1:5) */
+ | ((ra & 1) << 5)
+ | (pa & 0x1f);
+ genop(s, MKOP_Ax(OP_ENTER, a));
+ pos = new_label(s);
+ for (i=0; i<oa; i++) {
+ new_label(s);
+ genop(s, MKOP_sBx(OP_JMP, 0));
+ }
+ if (oa > 0) {
+ genop(s, MKOP_sBx(OP_JMP, 0));
+ }
+ opt = tree->car->cdr->car;
+ i = 0;
+ while (opt) {
+ int idx;
+
+ dispatch(s, pos+i);
+ codegen(s, opt->car->cdr, VAL);
+ idx = lv_idx(s, (mrb_sym)(intptr_t)opt->car->car);
+ pop();
+ genop_peep(s, MKOP_AB(OP_MOVE, idx, cursp()), NOVAL);
+ i++;
+ opt = opt->cdr;
+ }
+ if (oa > 0) {
+ dispatch(s, pos+i);
+ }
+ }
+ codegen(s, tree->cdr->car, VAL);
+ pop();
+ if (s->pc > 0) {
+ c = s->iseq[s->pc-1];
+ if (GET_OPCODE(c) != OP_RETURN || GETARG_B(c) != OP_R_NORMAL || s->pc == s->lastlabel) {
+ if (s->nregs == 0) {
+ genop(s, MKOP_A(OP_LOADNIL, 0));
+ genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
+ }
+ else {
+ genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL);
+ }
+ }
+ }
+ if (blk) {
+ loop_pop(s, NOVAL);
+ }
+ scope_finish(s);
+ return parent->irep->rlen - 1;
+}
+
+static int
+scope_body(codegen_scope *s, node *tree, int val)
+{
+ codegen_scope *scope = scope_new(s->mrb, s, tree->car);
+ if (scope == NULL) {
+ raise_error(s, "unexpected scope");
+ }
+
+ codegen(scope, tree->cdr, VAL);
+ if (!s->iseq) {
+ genop(scope, MKOP_A(OP_STOP, 0));
+ }
+ else if (!val) {
+ genop(scope, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
+ }
+ else {
+ if (scope->nregs == 0) {
+ genop(scope, MKOP_A(OP_LOADNIL, 0));
+ genop(scope, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
+ }
+ else {
+ genop_peep(scope, MKOP_AB(OP_RETURN, scope->sp-1, OP_R_NORMAL), NOVAL);
+ }
+ }
+ scope_finish(scope);
+ if (!s->irep) {
+ /* should not happen */
+ return 0;
+ }
+ return s->irep->rlen - 1;
+}
+
+static mrb_bool
+nosplat(node *t)
+{
+ while (t) {
+ if ((intptr_t)t->car->car == NODE_SPLAT) return FALSE;
+ t = t->cdr;
+ }
+ return TRUE;
+}
+
+static mrb_sym
+attrsym(codegen_scope *s, mrb_sym a)
+{
+ const char *name;
+ mrb_int len;
+ char *name2;
+
+ name = mrb_sym2name_len(s->mrb, a, &len);
+ name2 = (char *)codegen_palloc(s,
+ (size_t)len
+ + 1 /* '=' */
+ + 1 /* '\0' */
+ );
+ mrb_assert_int_fit(mrb_int, len, size_t, SIZE_MAX);
+ memcpy(name2, name, (size_t)len);
+ name2[len] = '=';
+ name2[len+1] = '\0';
+
+ return mrb_intern(s->mrb, name2, len+1);
+}
+
+static int
+gen_values(codegen_scope *s, node *t, int val)
+{
+ int n = 0;
+ int is_splat;
+
+ while (t) {
+ is_splat = (intptr_t)t->car->car == NODE_SPLAT; /* splat mode */
+ if (n >= 127 || is_splat) {
+ if (val) {
+ pop_n(n);
+ genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n));
+ push();
+ codegen(s, t->car, VAL);
+ pop(); pop();
+ if (is_splat) {
+ genop(s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1));
+ }
+ else {
+ genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
+ }
+ t = t->cdr;
+ while (t) {
+ push();
+ codegen(s, t->car, VAL);
+ pop(); pop();
+ if ((intptr_t)t->car->car == NODE_SPLAT) {
+ genop(s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1));
+ }
+ else {
+ genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
+ }
+ t = t->cdr;
+ }
+ }
+ else {
+ codegen(s, t->car->cdr, NOVAL);
+ t = t->cdr;
+ while (t) {
+ codegen(s, t->car, NOVAL);
+ t = t->cdr;
+ }
+ }
+ return -1;
+ }
+ /* normal (no splat) mode */
+ codegen(s, t->car, val);
+ n++;
+ t = t->cdr;
+ }
+ return n;
+}
+
+#define CALL_MAXARGS 127
+
+static void
+gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val)
+{
+ mrb_sym sym = name ? name : sym(tree->cdr->car);
+ int idx;
+ int n = 0, noop = 0, sendv = 0, blk = 0;
+
+ codegen(s, tree->car, VAL); /* receiver */
+ idx = new_msym(s, sym);
+ tree = tree->cdr->cdr->car;
+ if (tree) {
+ n = gen_values(s, tree->car, VAL);
+ if (n < 0) {
+ n = noop = sendv = 1;
+ push();
+ }
+ }
+ if (sp) {
+ if (sendv) {
+ pop();
+ genop(s, MKOP_AB(OP_ARYPUSH, cursp(), sp));
+ push();
+ }
+ else {
+ genop(s, MKOP_AB(OP_MOVE, cursp(), sp));
+ push();
+ n++;
+ }
+ }
+ if (tree && tree->cdr) {
+ noop = 1;
+ codegen(s, tree->cdr, VAL);
+ pop();
+ }
+ else {
+ blk = cursp();
+ }
+ push();pop();
+ pop_n(n+1);
+ {
+ mrb_int symlen;
+ const char *symname = mrb_sym2name_len(s->mrb, sym, &symlen);
+
+ if (!noop && symlen == 1 && symname[0] == '+') {
+ genop_peep(s, MKOP_ABC(OP_ADD, cursp(), idx, n), val);
+ }
+ else if (!noop && symlen == 1 && symname[0] == '-') {
+ genop_peep(s, MKOP_ABC(OP_SUB, cursp(), idx, n), val);
+ }
+ else if (!noop && symlen == 1 && symname[0] == '*') {
+ genop(s, MKOP_ABC(OP_MUL, cursp(), idx, n));
+ }
+ else if (!noop && symlen == 1 && symname[0] == '/') {
+ genop(s, MKOP_ABC(OP_DIV, cursp(), idx, n));
+ }
+ else if (!noop && symlen == 1 && symname[0] == '<') {
+ genop(s, MKOP_ABC(OP_LT, cursp(), idx, n));
+ }
+ else if (!noop && symlen == 2 && symname[0] == '<' && symname[1] == '=') {
+ genop(s, MKOP_ABC(OP_LE, cursp(), idx, n));
+ }
+ else if (!noop && symlen == 1 && symname[0] == '>') {
+ genop(s, MKOP_ABC(OP_GT, cursp(), idx, n));
+ }
+ else if (!noop && symlen == 2 && symname[0] == '>' && symname[1] == '=') {
+ genop(s, MKOP_ABC(OP_GE, cursp(), idx, n));
+ }
+ else if (!noop && symlen == 2 && symname[0] == '=' && symname[1] == '=') {
+ genop(s, MKOP_ABC(OP_EQ, cursp(), idx, n));
+ }
+ else {
+ if (sendv) n = CALL_MAXARGS;
+ if (blk > 0) { /* no block */
+ genop(s, MKOP_ABC(OP_SEND, cursp(), idx, n));
+ }
+ else {
+ genop(s, MKOP_ABC(OP_SENDB, cursp(), idx, n));
+ }
+ }
+ }
+ if (val) {
+ push();
+ }
+}
+
+static void
+gen_assignment(codegen_scope *s, node *tree, int sp, int val)
+{
+ int idx;
+ int type = (intptr_t)tree->car;
+
+ tree = tree->cdr;
+ switch ((intptr_t)type) {
+ case NODE_GVAR:
+ idx = new_sym(s, sym(tree));
+ genop_peep(s, MKOP_ABx(OP_SETGLOBAL, sp, idx), val);
+ break;
+ case NODE_LVAR:
+ idx = lv_idx(s, sym(tree));
+ if (idx > 0) {
+ if (idx != sp) {
+ genop_peep(s, MKOP_AB(OP_MOVE, idx, sp), val);
+ }
+ break;
+ }
+ else { /* upvar */
+ int lv = 0;
+ codegen_scope *up = s->prev;
+
+ while (up) {
+ idx = lv_idx(up, sym(tree));
+ if (idx > 0) {
+ genop_peep(s, MKOP_ABC(OP_SETUPVAR, sp, idx, lv), val);
+ break;
+ }
+ lv++;
+ up = up->prev;
+ }
+ }
+ break;
+ case NODE_IVAR:
+ idx = new_sym(s, sym(tree));
+ genop_peep(s, MKOP_ABx(OP_SETIV, sp, idx), val);
+ break;
+ case NODE_CVAR:
+ idx = new_sym(s, sym(tree));
+ genop_peep(s, MKOP_ABx(OP_SETCV, sp, idx), val);
+ break;
+ case NODE_CONST:
+ idx = new_sym(s, sym(tree));
+ genop_peep(s, MKOP_ABx(OP_SETCONST, sp, idx), val);
+ break;
+ case NODE_COLON2:
+ idx = new_sym(s, sym(tree->cdr));
+ genop_peep(s, MKOP_AB(OP_MOVE, cursp(), sp), NOVAL);
+ push();
+ codegen(s, tree->car, VAL);
+ pop_n(2);
+ genop_peep(s, MKOP_ABx(OP_SETMCNST, cursp(), idx), val);
+ break;
+
+ case NODE_CALL:
+ push();
+ gen_call(s, tree, attrsym(s, sym(tree->cdr->car)), sp, NOVAL);
+ pop();
+ if (val) {
+ genop_peep(s, MKOP_AB(OP_MOVE, cursp(), sp), val);
+ }
+ break;
+
+ default:
+#ifdef ENABLE_STDIO
+ printf("unknown lhs %d\n", type);
+#endif
+ break;
+ }
+ if (val) push();
+}
+
+static void
+gen_vmassignment(codegen_scope *s, node *tree, int rhs, int val)
+{
+ int n = 0, post = 0;
+ node *t, *p;
+
+ if (tree->car) { /* pre */
+ t = tree->car;
+ n = 0;
+ while (t) {
+ genop(s, MKOP_ABC(OP_AREF, cursp(), rhs, n));
+ gen_assignment(s, t->car, cursp(), NOVAL);
+ n++;
+ t = t->cdr;
+ }
+ }
+ t = tree->cdr;
+ if (t) {
+ if (t->cdr) { /* post count */
+ p = t->cdr->car;
+ while (p) {
+ post++;
+ p = p->cdr;
+ }
+ }
+ if (val) {
+ genop(s, MKOP_AB(OP_MOVE, cursp(), rhs));
+ push();
+ }
+ pop();
+ genop(s, MKOP_ABC(OP_APOST, cursp(), n, post));
+ n = 1;
+ if (t->car) { /* rest */
+ gen_assignment(s, t->car, cursp(), NOVAL);
+ }
+ if (t->cdr && t->cdr->car) {
+ t = t->cdr->car;
+ while (t) {
+ gen_assignment(s, t->car, cursp()+n, NOVAL);
+ t = t->cdr;
+ n++;
+ }
+ }
+ }
+ else {
+ pop();
+ }
+}
+
+static void
+gen_send_intern(codegen_scope *s)
+{
+ pop();
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "intern")), 0));
+ push();
+}
+static void
+gen_literal_array(codegen_scope *s, node *tree, mrb_bool sym, int val)
+{
+ if (val) {
+ int i = 0, j = 0;
+
+ while (tree) {
+ switch ((intptr_t)tree->car->car) {
+ case NODE_STR:
+ if ((tree->cdr == NULL) && ((intptr_t)tree->car->cdr->cdr == 0))
+ break;
+ /* fall through */
+ case NODE_BEGIN:
+ codegen(s, tree->car, VAL);
+ ++j;
+ break;
+
+ case NODE_LITERAL_DELIM:
+ if (j > 0) {
+ j = 0;
+ ++i;
+ if (sym)
+ gen_send_intern(s);
+ }
+ break;
+ }
+ if (j >= 2) {
+ pop(); pop();
+ genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);
+ push();
+ j = 1;
+ }
+ tree = tree->cdr;
+ }
+ if (j > 0) {
+ ++i;
+ if (sym)
+ gen_send_intern(s);
+ }
+ pop_n(i);
+ genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), i));
+ push();
+ }
+ else {
+ while (tree) {
+ switch ((intptr_t)tree->car->car) {
+ case NODE_BEGIN: case NODE_BLOCK:
+ codegen(s, tree->car, NOVAL);
+ }
+ tree = tree->cdr;
+ }
+ }
+}
+
+static void
+raise_error(codegen_scope *s, const char *msg)
+{
+ int idx = new_lit(s, mrb_str_new_cstr(s->mrb, msg));
+
+ genop(s, MKOP_ABx(OP_ERR, 1, idx));
+}
+
+static double
+readint_float(codegen_scope *s, const char *p, int base)
+{
+ const char *e = p + strlen(p);
+ double f = 0;
+ int n;
+
+ if (*p == '+') p++;
+ while (p < e) {
+ char c = *p;
+ c = tolower((unsigned char)c);
+ for (n=0; n<base; n++) {
+ if (mrb_digitmap[n] == c) {
+ f *= base;
+ f += n;
+ break;
+ }
+ }
+ if (n == base) {
+ codegen_error(s, "malformed readint input");
+ }
+ p++;
+ }
+ return f;
+}
+
+static mrb_int
+readint_mrb_int(codegen_scope *s, const char *p, int base, mrb_bool neg, mrb_bool *overflow)
+{
+ const char *e = p + strlen(p);
+ mrb_int result = 0;
+ int n;
+
+ mrb_assert(base >= 2 && base <= 36);
+ if (*p == '+') p++;
+ while (p < e) {
+ char c = *p;
+ c = tolower((unsigned char)c);
+ for (n=0; n<base; n++) {
+ if (mrb_digitmap[n] == c) {
+ break;
+ }
+ }
+ if (n == base) {
+ codegen_error(s, "malformed readint input");
+ }
+
+ if (neg) {
+ if ((MRB_INT_MIN + n)/base > result) {
+ *overflow = TRUE;
+ return 0;
+ }
+ result *= base;
+ result -= n;
+ }
+ else {
+ if ((MRB_INT_MAX - n)/base < result) {
+ *overflow = TRUE;
+ return 0;
+ }
+ result *= base;
+ result += n;
+ }
+ p++;
+ }
+ *overflow = FALSE;
+ return result;
+}
+
+static void
+codegen(codegen_scope *s, node *tree, int val)
+{
+ int nt;
+
+ if (!tree) return;
+
+ if (s->irep && s->filename_index != tree->filename_index) {
+ s->irep->filename = mrb_parser_get_filename(s->parser, s->filename_index);
+ mrb_debug_info_append_file(s->mrb, s->irep, s->debug_start_pos, s->pc);
+ s->debug_start_pos = s->pc;
+ s->filename_index = tree->filename_index;
+ s->filename = mrb_parser_get_filename(s->parser, tree->filename_index);
+ }
+
+ nt = (intptr_t)tree->car;
+ s->lineno = tree->lineno;
+ tree = tree->cdr;
+ switch (nt) {
+ case NODE_BEGIN:
+ if (val && !tree) {
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
+ push();
+ }
+ while (tree) {
+ codegen(s, tree->car, tree->cdr ? NOVAL : val);
+ tree = tree->cdr;
+ }
+ break;
+
+ case NODE_RESCUE:
+ {
+ int onerr, noexc, exend, pos1, pos2, tmp;
+ struct loopinfo *lp;
+
+ onerr = genop(s, MKOP_Bx(OP_ONERR, 0));
+ lp = loop_push(s, LOOP_BEGIN);
+ lp->pc1 = onerr;
+ if (tree->car) {
+ codegen(s, tree->car, val);
+ if (val) pop();
+ }
+ lp->type = LOOP_RESCUE;
+ noexc = genop(s, MKOP_Bx(OP_JMP, 0));
+ dispatch(s, onerr);
+ tree = tree->cdr;
+ exend = 0;
+ pos1 = 0;
+ if (tree->car) {
+ node *n2 = tree->car;
+ int exc = cursp();
+
+ genop(s, MKOP_A(OP_RESCUE, exc));
+ push();
+ while (n2) {
+ node *n3 = n2->car;
+ node *n4 = n3->car;
+
+ if (pos1) dispatch(s, pos1);
+ pos2 = 0;
+ do {
+ if (n4) {
+ codegen(s, n4->car, VAL);
+ }
+ else {
+ genop(s, MKOP_ABx(OP_GETCONST, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "StandardError"))));
+ push();
+ }
+ genop(s, MKOP_AB(OP_MOVE, cursp(), exc));
+ pop();
+ if (n4 && n4->car && (intptr_t)n4->car->car == NODE_SPLAT) {
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__case_eqq")), 1));
+ }
+ else {
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "===")), 1));
+ }
+ tmp = genop(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2));
+ pos2 = tmp;
+ if (n4) {
+ n4 = n4->cdr;
+ }
+ } while (n4);
+ pos1 = genop(s, MKOP_sBx(OP_JMP, 0));
+ dispatch_linked(s, pos2);
+
+ pop();
+ if (n3->cdr->car) {
+ gen_assignment(s, n3->cdr->car, exc, NOVAL);
+ }
+ if (n3->cdr->cdr->car) {
+ codegen(s, n3->cdr->cdr->car, val);
+ if (val) pop();
+ }
+ tmp = genop(s, MKOP_sBx(OP_JMP, exend));
+ exend = tmp;
+ n2 = n2->cdr;
+ push();
+ }
+ if (pos1) {
+ dispatch(s, pos1);
+ genop(s, MKOP_A(OP_RAISE, exc));
+ }
+ }
+ pop();
+ tree = tree->cdr;
+ dispatch(s, noexc);
+ genop(s, MKOP_A(OP_POPERR, 1));
+ if (tree->car) {
+ codegen(s, tree->car, val);
+ }
+ else if (val) {
+ push();
+ }
+ dispatch_linked(s, exend);
+ loop_pop(s, NOVAL);
+ }
+ break;
+
+ case NODE_ENSURE:
+ {
+ int idx;
+ int epush = s->pc;
+
+ genop(s, MKOP_Bx(OP_EPUSH, 0));
+ s->ensure_level++;
+ codegen(s, tree->car, val);
+ idx = scope_body(s, tree->cdr, NOVAL);
+ s->iseq[epush] = MKOP_Bx(OP_EPUSH, idx);
+ s->ensure_level--;
+ genop_peep(s, MKOP_A(OP_EPOP, 1), NOVAL);
+ }
+ break;
+
+ case NODE_LAMBDA:
+ {
+ int idx = lambda_body(s, tree, 1);
+
+ genop(s, MKOP_Abc(OP_LAMBDA, cursp(), idx, OP_L_LAMBDA));
+ push();
+ }
+ break;
+
+ case NODE_BLOCK:
+ {
+ int idx = lambda_body(s, tree, 1);
+
+ genop(s, MKOP_Abc(OP_LAMBDA, cursp(), idx, OP_L_BLOCK));
+ push();
+ }
+ break;
+
+ case NODE_IF:
+ {
+ int pos1, pos2;
+ node *e = tree->cdr->cdr->car;
+
+ codegen(s, tree->car, VAL);
+ pop();
+ pos1 = genop_peep(s, MKOP_AsBx(OP_JMPNOT, cursp(), 0), NOVAL);
+
+ codegen(s, tree->cdr->car, val);
+ if (val && !(tree->cdr->car)) {
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
+ push();
+ }
+ if (e) {
+ if (val) pop();
+ pos2 = genop(s, MKOP_sBx(OP_JMP, 0));
+ dispatch(s, pos1);
+ codegen(s, e, val);
+ dispatch(s, pos2);
+ }
+ else {
+ if (val) {
+ pop();
+ pos2 = genop(s, MKOP_sBx(OP_JMP, 0));
+ dispatch(s, pos1);
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
+ dispatch(s, pos2);
+ push();
+ }
+ else {
+ dispatch(s, pos1);
+ }
+ }
+ }
+ break;
+
+ case NODE_AND:
+ {
+ int pos;
+
+ codegen(s, tree->car, VAL);
+ pop();
+ pos = genop(s, MKOP_AsBx(OP_JMPNOT, cursp(), 0));
+ codegen(s, tree->cdr, val);
+ dispatch(s, pos);
+ }
+ break;
+
+ case NODE_OR:
+ {
+ int pos;
+
+ codegen(s, tree->car, VAL);
+ pop();
+ pos = genop(s, MKOP_AsBx(OP_JMPIF, cursp(), 0));
+ codegen(s, tree->cdr, val);
+ dispatch(s, pos);
+ }
+ break;
+
+ case NODE_WHILE:
+ {
+ struct loopinfo *lp = loop_push(s, LOOP_NORMAL);
+
+ lp->pc1 = genop(s, MKOP_sBx(OP_JMP, 0));
+ lp->pc2 = new_label(s);
+ codegen(s, tree->cdr, NOVAL);
+ dispatch(s, lp->pc1);
+ codegen(s, tree->car, VAL);
+ pop();
+ genop(s, MKOP_AsBx(OP_JMPIF, cursp(), lp->pc2 - s->pc));
+
+ loop_pop(s, val);
+ }
+ break;
+
+ case NODE_UNTIL:
+ {
+ struct loopinfo *lp = loop_push(s, LOOP_NORMAL);
+
+ lp->pc1 = genop(s, MKOP_sBx(OP_JMP, 0));
+ lp->pc2 = new_label(s);
+ codegen(s, tree->cdr, NOVAL);
+ dispatch(s, lp->pc1);
+ codegen(s, tree->car, VAL);
+ pop();
+ genop(s, MKOP_AsBx(OP_JMPNOT, cursp(), lp->pc2 - s->pc));
+
+ loop_pop(s, val);
+ }
+ break;
+
+ case NODE_FOR:
+ for_body(s, tree);
+ if (val) push();
+ break;
+
+ case NODE_CASE:
+ {
+ int head = 0;
+ int pos1, pos2, pos3, tmp;
+ node *n;
+
+ pos3 = 0;
+ if (tree->car) {
+ head = cursp();
+ codegen(s, tree->car, VAL);
+ }
+ tree = tree->cdr;
+ while (tree) {
+ n = tree->car->car;
+ pos1 = pos2 = 0;
+ while (n) {
+ codegen(s, n->car, VAL);
+ if (head) {
+ genop(s, MKOP_AB(OP_MOVE, cursp(), head));
+ pop();
+ if ((intptr_t)n->car->car == NODE_SPLAT) {
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__case_eqq")), 1));
+ }
+ else {
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "===")), 1));
+ }
+ }
+ else {
+ pop();
+ }
+ tmp = genop(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2));
+ pos2 = tmp;
+ n = n->cdr;
+ }
+ if (tree->car->car) {
+ pos1 = genop(s, MKOP_sBx(OP_JMP, 0));
+ dispatch_linked(s, pos2);
+ }
+ codegen(s, tree->car->cdr, val);
+ if (val) pop();
+ tmp = genop(s, MKOP_sBx(OP_JMP, pos3));
+ pos3 = tmp;
+ if (pos1) dispatch(s, pos1);
+ tree = tree->cdr;
+ }
+ if (val) {
+ int pos = cursp();
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
+ if (pos3) dispatch_linked(s, pos3);
+ pop();
+ genop(s, MKOP_AB(OP_MOVE, cursp(), pos));
+ push();
+ }
+ else if (pos3) {
+ dispatch_linked(s, pos3);
+ }
+ }
+ break;
+
+ case NODE_SCOPE:
+ scope_body(s, tree, NOVAL);
+ break;
+
+ case NODE_FCALL:
+ case NODE_CALL:
+ gen_call(s, tree, 0, 0, val);
+ break;
+
+ case NODE_DOT2:
+ codegen(s, tree->car, val);
+ codegen(s, tree->cdr, val);
+ if (val) {
+ pop(); pop();
+ genop(s, MKOP_ABC(OP_RANGE, cursp(), cursp(), FALSE));
+ push();
+ }
+ break;
+
+ case NODE_DOT3:
+ codegen(s, tree->car, val);
+ codegen(s, tree->cdr, val);
+ if (val) {
+ pop(); pop();
+ genop(s, MKOP_ABC(OP_RANGE, cursp(), cursp(), TRUE));
+ push();
+ }
+ break;
+
+ case NODE_COLON2:
+ {
+ int sym = new_sym(s, sym(tree->cdr));
+
+ codegen(s, tree->car, VAL);
+ pop();
+ genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
+ if (val) push();
+ }
+ break;
+
+ case NODE_COLON3:
+ {
+ int sym = new_sym(s, sym(tree));
+
+ genop(s, MKOP_A(OP_OCLASS, cursp()));
+ genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
+ if (val) push();
+ }
+ break;
+
+ case NODE_ARRAY:
+ {
+ int n;
+
+ n = gen_values(s, tree, val);
+ if (n >= 0) {
+ if (val) {
+ pop_n(n);
+ genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n));
+ push();
+ }
+ }
+ else if (val) {
+ push();
+ }
+ }
+ break;
+
+ case NODE_HASH:
+ {
+ int len = 0;
+ mrb_bool update = FALSE;
+
+ while (tree) {
+ codegen(s, tree->car->car, val);
+ codegen(s, tree->car->cdr, val);
+ len++;
+ tree = tree->cdr;
+ if (val && len == 126) {
+ pop_n(len*2);
+ genop(s, MKOP_ABC(OP_HASH, cursp(), cursp(), len));
+ if (update) {
+ pop();
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__update")), 1));
+ }
+ push();
+ update = TRUE;
+ len = 0;
+ }
+ }
+ if (val) {
+ pop_n(len*2);
+ genop(s, MKOP_ABC(OP_HASH, cursp(), cursp(), len));
+ if (update) {
+ pop();
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__update")), 1));
+ }
+ push();
+ }
+ }
+ break;
+
+ case NODE_SPLAT:
+ codegen(s, tree, VAL);
+ break;
+
+ case NODE_ASGN:
+ codegen(s, tree->cdr, VAL);
+ pop();
+ gen_assignment(s, tree->car, cursp(), val);
+ break;
+
+ case NODE_MASGN:
+ {
+ int len = 0, n = 0, post = 0;
+ node *t = tree->cdr, *p;
+ int rhs = cursp();
+
+ if ((intptr_t)t->car == NODE_ARRAY && nosplat(t->cdr)) {
+ /* fixed rhs */
+ t = t->cdr;
+ while (t) {
+ codegen(s, t->car, VAL);
+ len++;
+ t = t->cdr;
+ }
+ tree = tree->car;
+ if (tree->car) { /* pre */
+ t = tree->car;
+ n = 0;
+ while (t) {
+ gen_assignment(s, t->car, rhs+n, NOVAL);
+ n++;
+ t = t->cdr;
+ }
+ }
+ t = tree->cdr;
+ if (t) {
+ if (t->cdr) { /* post count */
+ p = t->cdr->car;
+ while (p) {
+ post++;
+ p = p->cdr;
+ }
+ }
+ if (t->car) { /* rest (len - pre - post) */
+ int rn = len - post - n;
+
+ genop(s, MKOP_ABC(OP_ARRAY, cursp(), rhs+n, rn));
+ gen_assignment(s, t->car, cursp(), NOVAL);
+ n += rn;
+ }
+ if (t->cdr && t->cdr->car) {
+ t = t->cdr->car;
+ while (n<len) {
+ gen_assignment(s, t->car, rhs+n, NOVAL);
+ t = t->cdr;
+ n++;
+ }
+ }
+ }
+ pop_n(len);
+ if (val) {
+ genop(s, MKOP_ABC(OP_ARRAY, rhs, rhs, len));
+ push();
+ }
+ }
+ else {
+ /* variable rhs */
+ codegen(s, t, VAL);
+ gen_vmassignment(s, tree->car, rhs, val);
+ }
+ }
+ break;
+
+ case NODE_OP_ASGN:
+ {
+ mrb_sym sym = sym(tree->cdr->car);
+ mrb_int len;
+ const char *name = mrb_sym2name_len(s->mrb, sym, &len);
+ int idx;
+
+ codegen(s, tree->car, VAL);
+ if (len == 2 &&
+ ((name[0] == '|' && name[1] == '|') ||
+ (name[0] == '&' && name[1] == '&'))) {
+ int pos;
+
+ pop();
+ pos = genop_peep(s, MKOP_AsBx(name[0] == '|' ? OP_JMPIF : OP_JMPNOT, cursp(), 0), NOVAL);
+ codegen(s, tree->cdr->cdr->car, VAL);
+ pop();
+ gen_assignment(s, tree->car, cursp(), val);
+ dispatch(s, pos);
+ break;
+ }
+ codegen(s, tree->cdr->cdr->car, VAL);
+ push(); pop();
+ pop(); pop();
+
+ idx = new_msym(s, sym);
+ if (len == 1 && name[0] == '+') {
+ genop_peep(s, MKOP_ABC(OP_ADD, cursp(), idx, 1), val);
+ }
+ else if (len == 1 && name[0] == '-') {
+ genop_peep(s, MKOP_ABC(OP_SUB, cursp(), idx, 1), val);
+ }
+ else if (len == 1 && name[0] == '*') {
+ genop(s, MKOP_ABC(OP_MUL, cursp(), idx, 1));
+ }
+ else if (len == 1 && name[0] == '/') {
+ genop(s, MKOP_ABC(OP_DIV, cursp(), idx, 1));
+ }
+ else if (len == 1 && name[0] == '<') {
+ genop(s, MKOP_ABC(OP_LT, cursp(), idx, 1));
+ }
+ else if (len == 2 && name[0] == '<' && name[1] == '=') {
+ genop(s, MKOP_ABC(OP_LE, cursp(), idx, 1));
+ }
+ else if (len == 1 && name[0] == '>') {
+ genop(s, MKOP_ABC(OP_GT, cursp(), idx, 1));
+ }
+ else if (len == 2 && name[0] == '>' && name[1] == '=') {
+ genop(s, MKOP_ABC(OP_GE, cursp(), idx, 1));
+ }
+ else {
+ genop(s, MKOP_ABC(OP_SEND, cursp(), idx, 1));
+ }
+ }
+ gen_assignment(s, tree->car, cursp(), val);
+ break;
+
+ case NODE_SUPER:
+ {
+ int n = 0, noop = 0, sendv = 0;
+
+ push(); /* room for receiver */
+ if (tree) {
+ node *args = tree->car;
+ if (args) {
+ n = gen_values(s, args, VAL);
+ if (n < 0) {
+ n = noop = sendv = 1;
+ push();
+ }
+ }
+ }
+ if (tree && tree->cdr) {
+ codegen(s, tree->cdr, VAL);
+ pop();
+ }
+ else {
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
+ push(); pop();
+ }
+ pop_n(n+1);
+ if (sendv) n = CALL_MAXARGS;
+ genop(s, MKOP_ABC(OP_SUPER, cursp(), 0, n));
+ if (val) push();
+ }
+ break;
+
+ case NODE_ZSUPER:
+ {
+ codegen_scope *s2 = s;
+ int lv = 0, ainfo = 0;
+
+ push(); /* room for receiver */
+ while (!s2->mscope) {
+ lv++;
+ s2 = s2->prev;
+ if (!s2) break;
+ }
+ if (s2) ainfo = s2->ainfo;
+ genop(s, MKOP_ABx(OP_ARGARY, cursp(), (ainfo<<4)|(lv & 0xf)));
+ push(); push(); pop(); /* ARGARY pushes two values */
+ if (tree && tree->cdr) {
+ codegen(s, tree->cdr, VAL);
+ pop();
+ }
+ pop(); pop();
+ genop(s, MKOP_ABC(OP_SUPER, cursp(), 0, CALL_MAXARGS));
+ if (val) push();
+ }
+ break;
+
+ case NODE_RETURN:
+ if (tree) {
+ codegen(s, tree, VAL);
+ pop();
+ }
+ else {
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
+ }
+ if (s->loop) {
+ genop(s, MKOP_AB(OP_RETURN, cursp(), OP_R_RETURN));
+ }
+ else {
+ genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL);
+ }
+ if (val) push();
+ break;
+
+ case NODE_YIELD:
+ {
+ codegen_scope *s2 = s;
+ int lv = 0, ainfo = 0;
+ int n = 0, sendv = 0;
+
+ while (!s2->mscope) {
+ lv++;
+ s2 = s2->prev;
+ if (!s2) break;
+ }
+ if (s2) ainfo = s2->ainfo;
+ genop(s, MKOP_ABx(OP_BLKPUSH, cursp(), (ainfo<<4)|(lv & 0xf)));
+ push();
+ if (tree) {
+ n = gen_values(s, tree, VAL);
+ if (n < 0) {
+ n = sendv = 1;
+ push();
+ }
+ }
+ pop_n(n+1);
+ if (sendv) n = CALL_MAXARGS;
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "call")), n));
+ if (val) push();
+ }
+ break;
+
+ case NODE_BREAK:
+ loop_break(s, tree);
+ if (val) push();
+ break;
+
+ case NODE_NEXT:
+ if (!s->loop) {
+ raise_error(s, "unexpected next");
+ }
+ else if (s->loop->type == LOOP_NORMAL) {
+ if (s->ensure_level > s->loop->ensure_level) {
+ genop_peep(s, MKOP_A(OP_EPOP, s->ensure_level - s->loop->ensure_level), NOVAL);
+ }
+ codegen(s, tree, NOVAL);
+ genop(s, MKOP_sBx(OP_JMP, s->loop->pc1 - s->pc));
+ }
+ else {
+ if (tree) {
+ codegen(s, tree, VAL);
+ pop();
+ }
+ else {
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
+ }
+ genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL);
+ }
+ if (val) push();
+ break;
+
+ case NODE_REDO:
+ if (!s->loop) {
+ raise_error(s, "unexpected redo");
+ }
+ else {
+ if (s->ensure_level > s->loop->ensure_level) {
+ genop_peep(s, MKOP_A(OP_EPOP, s->ensure_level - s->loop->ensure_level), NOVAL);
+ }
+ genop(s, MKOP_sBx(OP_JMP, s->loop->pc2 - s->pc));
+ }
+ break;
+
+ case NODE_RETRY:
+ {
+ const char *msg = "unexpected retry";
+
+ if (!s->loop) {
+ raise_error(s, msg);
+ }
+ else {
+ struct loopinfo *lp = s->loop;
+ int n = 0;
+
+ while (lp && lp->type != LOOP_RESCUE) {
+ if (lp->type == LOOP_BEGIN) {
+ n++;
+ }
+ lp = lp->prev;
+ }
+ if (!lp) {
+ raise_error(s, msg);
+ }
+ else {
+ if (n > 0) {
+ while (n--) {
+ genop_peep(s, MKOP_A(OP_POPERR, 1), NOVAL);
+ }
+ }
+ if (s->ensure_level > lp->ensure_level) {
+ genop_peep(s, MKOP_A(OP_EPOP, s->ensure_level - lp->ensure_level), NOVAL);
+ }
+ genop(s, MKOP_sBx(OP_JMP, lp->pc1 - s->pc));
+ }
+ }
+ }
+ break;
+
+ case NODE_LVAR:
+ if (val) {
+ int idx = lv_idx(s, sym(tree));
+
+ if (idx > 0) {
+ genop_peep(s, MKOP_AB(OP_MOVE, cursp(), idx), NOVAL);
+ }
+ else {
+ int lv = 0;
+ codegen_scope *up = s->prev;
+
+ while (up) {
+ idx = lv_idx(up, sym(tree));
+ if (idx > 0) {
+ genop(s, MKOP_ABC(OP_GETUPVAR, cursp(), idx, lv));
+ break;
+ }
+ lv++;
+ up = up->prev;
+ }
+ }
+ push();
+ }
+ break;
+
+ case NODE_GVAR:
+ {
+ int sym = new_sym(s, sym(tree));
+
+ genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym));
+ push();
+ }
+ break;
+
+ case NODE_IVAR:
+ {
+ int sym = new_sym(s, sym(tree));
+
+ genop(s, MKOP_ABx(OP_GETIV, cursp(), sym));
+ push();
+ }
+ break;
+
+ case NODE_CVAR:
+ {
+ int sym = new_sym(s, sym(tree));
+
+ genop(s, MKOP_ABx(OP_GETCV, cursp(), sym));
+ push();
+ }
+ break;
+
+ case NODE_CONST:
+ {
+ int sym = new_sym(s, sym(tree));
+
+ genop(s, MKOP_ABx(OP_GETCONST, cursp(), sym));
+ push();
+ }
+ break;
+
+ case NODE_DEFINED:
+ codegen(s, tree, VAL);
+ break;
+
+ case NODE_BACK_REF:
+ {
+ char buf[2] = { '$' };
+ mrb_value str;
+ int sym;
+
+ buf[1] = (char)(intptr_t)tree;
+ str = mrb_str_new(s->mrb, buf, 2);
+ sym = new_sym(s, mrb_intern_str(s->mrb, str));
+ genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym));
+ push();
+ }
+ break;
+
+ case NODE_NTH_REF:
+ {
+ int sym;
+ mrb_state *mrb = s->mrb;
+ mrb_value fix = mrb_fixnum_value((intptr_t)tree);
+ mrb_value str = mrb_str_buf_new(mrb, 4);
+
+ mrb_str_cat_lit(mrb, str, "$");
+ mrb_str_cat_str(mrb, str, mrb_fixnum_to_str(mrb, fix, 10));
+ sym = new_sym(s, mrb_intern_str(mrb, str));
+ genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym));
+ push();
+ }
+ break;
+
+ case NODE_ARG:
+ /* should not happen */
+ break;
+
+ case NODE_BLOCK_ARG:
+ codegen(s, tree, VAL);
+ break;
+
+ case NODE_INT:
+ if (val) {
+ char *p = (char*)tree->car;
+ int base = (intptr_t)tree->cdr->car;
+ mrb_int i;
+ mrb_code co;
+ mrb_bool overflow;
+
+ i = readint_mrb_int(s, p, base, FALSE, &overflow);
+ if (overflow) {
+ double f = readint_float(s, p, base);
+ int off = new_lit(s, mrb_float_value(s->mrb, f));
+
+ genop(s, MKOP_ABx(OP_LOADL, cursp(), off));
+ }
+ else {
+ if (i < MAXARG_sBx && i > -MAXARG_sBx) {
+ co = MKOP_AsBx(OP_LOADI, cursp(), i);
+ }
+ else {
+ int off = new_lit(s, mrb_fixnum_value(i));
+ co = MKOP_ABx(OP_LOADL, cursp(), off);
+ }
+ genop(s, co);
+ }
+ push();
+ }
+ break;
+
+ case NODE_FLOAT:
+ if (val) {
+ char *p = (char*)tree;
+ mrb_float f = str_to_mrb_float(p);
+ int off = new_lit(s, mrb_float_value(s->mrb, f));
+
+ genop(s, MKOP_ABx(OP_LOADL, cursp(), off));
+ push();
+ }
+ break;
+
+ case NODE_NEGATE:
+ {
+ nt = (intptr_t)tree->car;
+ tree = tree->cdr;
+ switch (nt) {
+ case NODE_FLOAT:
+ {
+ char *p = (char*)tree;
+ mrb_float f = str_to_mrb_float(p);
+ int off = new_lit(s, mrb_float_value(s->mrb, -f));
+
+ genop(s, MKOP_ABx(OP_LOADL, cursp(), off));
+ push();
+ }
+ break;
+
+ case NODE_INT:
+ {
+ char *p = (char*)tree->car;
+ int base = (intptr_t)tree->cdr->car;
+ mrb_int i;
+ mrb_code co;
+ mrb_bool overflow;
+
+ i = readint_mrb_int(s, p, base, TRUE, &overflow);
+ if (overflow) {
+ double f = readint_float(s, p, base);
+ int off = new_lit(s, mrb_float_value(s->mrb, -f));
+
+ genop(s, MKOP_ABx(OP_LOADL, cursp(), off));
+ }
+ else {
+ if (i < MAXARG_sBx && i > -MAXARG_sBx) {
+ co = MKOP_AsBx(OP_LOADI, cursp(), i);
+ }
+ else {
+ int off = new_lit(s, mrb_fixnum_value(i));
+ co = MKOP_ABx(OP_LOADL, cursp(), off);
+ }
+ genop(s, co);
+ }
+ push();
+ }
+ break;
+
+ default:
+ {
+ int sym = new_msym(s, mrb_intern_lit(s->mrb, "-"));
+
+ genop(s, MKOP_ABx(OP_LOADI, cursp(), 0));
+ push();
+ codegen(s, tree, VAL);
+ pop(); pop();
+ genop(s, MKOP_ABC(OP_SUB, cursp(), sym, 2));
+ }
+ break;
+ }
+ }
+ break;
+
+ case NODE_STR:
+ if (val) {
+ char *p = (char*)tree->car;
+ size_t len = (intptr_t)tree->cdr;
+ int ai = mrb_gc_arena_save(s->mrb);
+ int off = new_lit(s, mrb_str_new(s->mrb, p, len));
+
+ mrb_gc_arena_restore(s->mrb, ai);
+ genop(s, MKOP_ABx(OP_STRING, cursp(), off));
+ push();
+ }
+ break;
+
+ case NODE_HEREDOC:
+ tree = ((struct mrb_parser_heredoc_info *)tree)->doc;
+ /* fall through */
+ case NODE_DSTR:
+ if (val) {
+ node *n = tree;
+
+ codegen(s, n->car, VAL);
+ n = n->cdr;
+ while (n) {
+ codegen(s, n->car, VAL);
+ pop(); pop();
+ genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);
+ push();
+ n = n->cdr;
+ }
+ }
+ else {
+ node *n = tree;
+
+ while (n) {
+ if ((intptr_t)n->car->car != NODE_STR) {
+ codegen(s, n->car, NOVAL);
+ }
+ n = n->cdr;
+ }
+ }
+ break;
+
+ case NODE_WORDS:
+ gen_literal_array(s, tree, FALSE, val);
+ break;
+
+ case NODE_SYMBOLS:
+ gen_literal_array(s, tree, TRUE, val);
+ break;
+
+ case NODE_DXSTR:
+ {
+ node *n;
+ int ai = mrb_gc_arena_save(s->mrb);
+ int sym = new_sym(s, mrb_intern_lit(s->mrb, "Kernel"));
+
+ if (val == NOVAL) { push(); }
+ genop(s, MKOP_A(OP_OCLASS, cursp()));
+ genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
+ push();
+ codegen(s, tree->car, VAL);
+ n = tree->cdr;
+ while (n) {
+ if ((intptr_t)n->car->car == NODE_XSTR) {
+ n->car->car = (struct mrb_ast_node*)(intptr_t)NODE_STR;
+ mrb_assert(!n->cdr); /* must be the end */
+ }
+ codegen(s, n->car, VAL);
+ pop(); pop();
+ genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);
+ push();
+ n = n->cdr;
+ }
+ pop();
+ pop();
+ sym = new_sym(s, mrb_intern_lit(s->mrb, "`"));
+ genop(s, MKOP_ABC(OP_SEND, cursp(), sym, 1));
+ if (val == NOVAL) { pop(); }
+ else { push(); }
+ mrb_gc_arena_restore(s->mrb, ai);
+ }
+ break;
+
+ case NODE_XSTR:
+ {
+ char *p = (char*)tree->car;
+ size_t len = (intptr_t)tree->cdr;
+ int ai = mrb_gc_arena_save(s->mrb);
+ int sym = new_sym(s, mrb_intern_lit(s->mrb, "Kernel"));
+ int off = new_lit(s, mrb_str_new(s->mrb, p, len));
+
+ if (val == NOVAL) { push(); }
+ genop(s, MKOP_A(OP_OCLASS, cursp()));
+ genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
+ push();
+ genop(s, MKOP_ABx(OP_STRING, cursp(), off));
+ pop();
+ sym = new_sym(s, mrb_intern_lit(s->mrb, "`"));
+ genop(s, MKOP_ABC(OP_SEND, cursp(), sym, 1));
+ if (val == NOVAL) { pop(); }
+ else { push(); }
+ mrb_gc_arena_restore(s->mrb, ai);
+ }
+ break;
+
+ case NODE_REGX:
+ if (val) {
+ char *p1 = (char*)tree->car;
+ char *p2 = (char*)tree->cdr;
+ int ai = mrb_gc_arena_save(s->mrb);
+ int sym = new_sym(s, mrb_intern_lit(s->mrb, REGEXP_CLASS));
+ int off = new_lit(s, mrb_str_new_cstr(s->mrb, p1));
+ int argc = 1;
+
+ genop(s, MKOP_A(OP_OCLASS, cursp()));
+ genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
+ push();
+ genop(s, MKOP_ABx(OP_STRING, cursp(), off));
+ if (p2) {
+ push();
+ off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
+ genop(s, MKOP_ABx(OP_STRING, cursp(), off));
+ argc++;
+ pop();
+ }
+ pop();
+ sym = new_sym(s, mrb_intern_lit(s->mrb, "compile"));
+ genop(s, MKOP_ABC(OP_SEND, cursp(), sym, argc));
+ mrb_gc_arena_restore(s->mrb, ai);
+ push();
+ }
+ break;
+
+ case NODE_DREGX:
+ if (val) {
+ node *n = tree->car;
+ int ai = mrb_gc_arena_save(s->mrb);
+ int sym = new_sym(s, mrb_intern_lit(s->mrb, REGEXP_CLASS));
+ int argc = 1;
+ int off;
+ char *p;
+
+ genop(s, MKOP_A(OP_OCLASS, cursp()));
+ genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
+ push();
+ codegen(s, n->car, VAL);
+ n = n->cdr;
+ while (n) {
+ codegen(s, n->car, VAL);
+ pop(); pop();
+ genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);
+ push();
+ n = n->cdr;
+ }
+ n = tree->cdr->cdr;
+ if (n->car) {
+ p = (char*)n->car;
+ off = new_lit(s, mrb_str_new_cstr(s->mrb, p));
+ codegen(s, tree->car, VAL);
+ genop(s, MKOP_ABx(OP_STRING, cursp(), off));
+ pop();
+ genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);
+ }
+ if (n->cdr) {
+ char *p2 = (char*)n->cdr;
+
+ push();
+ off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
+ genop(s, MKOP_ABx(OP_STRING, cursp(), off));
+ argc++;
+ pop();
+ }
+ pop();
+ sym = new_sym(s, mrb_intern_lit(s->mrb, "compile"));
+ genop(s, MKOP_ABC(OP_SEND, cursp(), sym, argc));
+ mrb_gc_arena_restore(s->mrb, ai);
+ push();
+ }
+ else {
+ node *n = tree->car;
+
+ while (n) {
+ if ((intptr_t)n->car->car != NODE_STR) {
+ codegen(s, n->car, NOVAL);
+ }
+ n = n->cdr;
+ }
+ }
+ break;
+
+ case NODE_SYM:
+ if (val) {
+ int sym = new_sym(s, sym(tree));
+
+ genop(s, MKOP_ABx(OP_LOADSYM, cursp(), sym));
+ push();
+ }
+ break;
+
+ case NODE_DSYM:
+ codegen(s, tree, val);
+ if (val) {
+ gen_send_intern(s);
+ }
+ break;
+
+ case NODE_SELF:
+ if (val) {
+ genop(s, MKOP_A(OP_LOADSELF, cursp()));
+ push();
+ }
+ break;
+
+ case NODE_NIL:
+ if (val) {
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
+ push();
+ }
+ break;
+
+ case NODE_TRUE:
+ if (val) {
+ genop(s, MKOP_A(OP_LOADT, cursp()));
+ push();
+ }
+ break;
+
+ case NODE_FALSE:
+ if (val) {
+ genop(s, MKOP_A(OP_LOADF, cursp()));
+ push();
+ }
+ break;
+
+ case NODE_ALIAS:
+ {
+ int a = new_msym(s, sym(tree->car));
+ int b = new_msym(s, sym(tree->cdr));
+ int c = new_msym(s, mrb_intern_lit(s->mrb, "alias_method"));
+
+ genop(s, MKOP_A(OP_TCLASS, cursp()));
+ push();
+ genop(s, MKOP_ABx(OP_LOADSYM, cursp(), a));
+ push();
+ genop(s, MKOP_ABx(OP_LOADSYM, cursp(), b));
+ push();
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
+ pop_n(3);
+ genop(s, MKOP_ABC(OP_SEND, cursp(), c, 2));
+ if (val) {
+ push();
+ }
+ }
+ break;
+
+ case NODE_UNDEF:
+ {
+ int undef = new_msym(s, mrb_intern_lit(s->mrb, "undef_method"));
+ int num = 0;
+ node *t = tree;
+
+ genop(s, MKOP_A(OP_TCLASS, cursp()));
+ push();
+ while (t) {
+ int symbol = new_msym(s, sym(t->car));
+ genop(s, MKOP_ABx(OP_LOADSYM, cursp(), symbol));
+ push();
+ t = t->cdr;
+ num++;
+ }
+ pop_n(num + 1);
+ genop(s, MKOP_ABC(OP_SEND, cursp(), undef, num));
+ if (val) {
+ push();
+ }
+ }
+ break;
+
+ case NODE_CLASS:
+ {
+ int idx;
+
+ if (tree->car->car == (node*)0) {
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
+ push();
+ }
+ else if (tree->car->car == (node*)1) {
+ genop(s, MKOP_A(OP_OCLASS, cursp()));
+ push();
+ }
+ else {
+ codegen(s, tree->car->car, VAL);
+ }
+ if (tree->cdr->car) {
+ codegen(s, tree->cdr->car, VAL);
+ }
+ else {
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
+ push();
+ }
+ pop(); pop();
+ idx = new_msym(s, sym(tree->car->cdr));
+ genop(s, MKOP_AB(OP_CLASS, cursp(), idx));
+ idx = scope_body(s, tree->cdr->cdr->car, val);
+ genop(s, MKOP_ABx(OP_EXEC, cursp(), idx));
+ if (val) {
+ push();
+ }
+ }
+ break;
+
+ case NODE_MODULE:
+ {
+ int idx;
+
+ if (tree->car->car == (node*)0) {
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
+ push();
+ }
+ else if (tree->car->car == (node*)1) {
+ genop(s, MKOP_A(OP_OCLASS, cursp()));
+ push();
+ }
+ else {
+ codegen(s, tree->car->car, VAL);
+ }
+ pop();
+ idx = new_msym(s, sym(tree->car->cdr));
+ genop(s, MKOP_AB(OP_MODULE, cursp(), idx));
+ idx = scope_body(s, tree->cdr->car, val);
+ genop(s, MKOP_ABx(OP_EXEC, cursp(), idx));
+ if (val) {
+ push();
+ }
+ }
+ break;
+
+ case NODE_SCLASS:
+ {
+ int idx;
+
+ codegen(s, tree->car, VAL);
+ pop();
+ genop(s, MKOP_AB(OP_SCLASS, cursp(), cursp()));
+ idx = scope_body(s, tree->cdr->car, val);
+ genop(s, MKOP_ABx(OP_EXEC, cursp(), idx));
+ if (val) {
+ push();
+ }
+ }
+ break;
+
+ case NODE_DEF:
+ {
+ int sym = new_msym(s, sym(tree->car));
+ int idx = lambda_body(s, tree->cdr, 0);
+
+ genop(s, MKOP_A(OP_TCLASS, cursp()));
+ push();
+ genop(s, MKOP_Abc(OP_LAMBDA, cursp(), idx, OP_L_METHOD));
+ push(); pop();
+ pop();
+ genop(s, MKOP_AB(OP_METHOD, cursp(), sym));
+ if (val) {
+ genop(s, MKOP_ABx(OP_LOADSYM, cursp(), sym));
+ push();
+ }
+ }
+ break;
+
+ case NODE_SDEF:
+ {
+ node *recv = tree->car;
+ int sym = new_msym(s, sym(tree->cdr->car));
+ int idx = lambda_body(s, tree->cdr->cdr, 0);
+
+ codegen(s, recv, VAL);
+ pop();
+ genop(s, MKOP_AB(OP_SCLASS, cursp(), cursp()));
+ push();
+ genop(s, MKOP_Abc(OP_LAMBDA, cursp(), idx, OP_L_METHOD));
+ pop();
+ genop(s, MKOP_AB(OP_METHOD, cursp(), sym));
+ if (val) {
+ genop(s, MKOP_ABx(OP_LOADSYM, cursp(), sym));
+ push();
+ }
+ }
+ break;
+
+ case NODE_POSTEXE:
+ codegen(s, tree, NOVAL);
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void
+scope_add_irep(codegen_scope *s, mrb_irep *irep)
+{
+ if (s->irep == NULL) {
+ s->irep = irep;
+ return;
+ }
+ if (s->irep->rlen == s->rcapa) {
+ s->rcapa *= 2;
+ s->irep->reps = (mrb_irep**)codegen_realloc(s, s->irep->reps, sizeof(mrb_irep*)*s->rcapa);
+ }
+ s->irep->reps[s->irep->rlen] = irep;
+ s->irep->rlen++;
+}
+
+static codegen_scope*
+scope_new(mrb_state *mrb, codegen_scope *prev, node *lv)
+{
+ static const codegen_scope codegen_scope_zero = { 0 };
+ mrb_pool *pool = mrb_pool_open(mrb);
+ codegen_scope *p = (codegen_scope *)mrb_pool_alloc(pool, sizeof(codegen_scope));
+
+ if (!p) return NULL;
+ *p = codegen_scope_zero;
+ p->mrb = mrb;
+ p->mpool = pool;
+ if (!prev) return p;
+ p->prev = prev;
+ p->ainfo = -1;
+ p->mscope = 0;
+
+ p->irep = mrb_add_irep(mrb);
+ scope_add_irep(prev, p->irep);
+
+ p->rcapa = 8;
+ p->irep->reps = (mrb_irep**)mrb_malloc(mrb, sizeof(mrb_irep*)*p->rcapa);
+
+ p->icapa = 1024;
+ p->iseq = (mrb_code*)mrb_malloc(mrb, sizeof(mrb_code)*p->icapa);
+ p->irep->iseq = p->iseq;
+
+ p->pcapa = 32;
+ p->irep->pool = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value)*p->pcapa);
+ p->irep->plen = 0;
+
+ p->scapa = 256;
+ p->irep->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*p->scapa);
+ p->irep->slen = 0;
+
+ p->lv = lv;
+ p->sp += node_len(lv)+1; /* add self */
+ p->nlocals = p->sp;
+ if (lv) {
+ node *n = lv;
+ size_t i = 0;
+
+ p->irep->lv = (struct mrb_locals*)mrb_malloc(mrb, sizeof(struct mrb_locals) * (p->nlocals - 1));
+ for (i=0, n=lv; n; i++,n=n->cdr) {
+ p->irep->lv[i].name = lv_name(n);
+ if (lv_name(n)) {
+ p->irep->lv[i].r = lv_idx(p, lv_name(n));
+ }
+ else {
+ p->irep->lv[i].r = 0;
+ }
+ }
+ mrb_assert(i + 1 == p->nlocals);
+ }
+ p->ai = mrb_gc_arena_save(mrb);
+
+ p->filename = prev->filename;
+ if (p->filename) {
+ p->lines = (uint16_t*)mrb_malloc(mrb, sizeof(short)*p->icapa);
+ }
+ p->lineno = prev->lineno;
+
+ /* debug setting */
+ p->debug_start_pos = 0;
+ if (p->filename) {
+ mrb_debug_info_alloc(mrb, p->irep);
+ p->irep->filename = p->filename;
+ p->irep->lines = p->lines;
+ }
+ else {
+ p->irep->debug_info = NULL;
+ }
+ p->parser = prev->parser;
+ p->filename_index = prev->filename_index;
+
+ return p;
+}
+
+static void
+scope_finish(codegen_scope *s)
+{
+ mrb_state *mrb = s->mrb;
+ mrb_irep *irep = s->irep;
+ size_t fname_len;
+ char *fname;
+
+ irep->flags = 0;
+ if (s->iseq) {
+ irep->iseq = (mrb_code *)codegen_realloc(s, s->iseq, sizeof(mrb_code)*s->pc);
+ irep->ilen = s->pc;
+ if (s->lines) {
+ irep->lines = (uint16_t *)codegen_realloc(s, s->lines, sizeof(uint16_t)*s->pc);
+ }
+ else {
+ irep->lines = 0;
+ }
+ }
+ irep->pool = (mrb_value*)codegen_realloc(s, irep->pool, sizeof(mrb_value)*irep->plen);
+ irep->syms = (mrb_sym*)codegen_realloc(s, irep->syms, sizeof(mrb_sym)*irep->slen);
+ irep->reps = (mrb_irep**)codegen_realloc(s, irep->reps, sizeof(mrb_irep*)*irep->rlen);
+ if (s->filename) {
+ s->irep->filename = mrb_parser_get_filename(s->parser, s->filename_index);
+ mrb_debug_info_append_file(mrb, s->irep, s->debug_start_pos, s->pc);
+
+ fname_len = strlen(s->filename);
+ fname = (char*)codegen_malloc(s, fname_len + 1);
+ memcpy(fname, s->filename, fname_len);
+ fname[fname_len] = '\0';
+ irep->filename = fname;
+ }
+
+ irep->nlocals = s->nlocals;
+ irep->nregs = s->nregs;
+
+ mrb_gc_arena_restore(mrb, s->ai);
+ mrb_pool_close(s->mpool);
+}
+
+static struct loopinfo*
+loop_push(codegen_scope *s, enum looptype t)
+{
+ struct loopinfo *p = (struct loopinfo *)codegen_palloc(s, sizeof(struct loopinfo));
+
+ p->type = t;
+ p->pc1 = p->pc2 = p->pc3 = 0;
+ p->prev = s->loop;
+ p->ensure_level = s->ensure_level;
+ p->acc = cursp();
+ s->loop = p;
+
+ return p;
+}
+
+static void
+loop_break(codegen_scope *s, node *tree)
+{
+ if (!s->loop) {
+ codegen(s, tree, NOVAL);
+ raise_error(s, "unexpected break");
+ }
+ else {
+ struct loopinfo *loop;
+
+ if (tree) {
+ codegen(s, tree, VAL);
+ pop();
+ }
+
+ loop = s->loop;
+ while (loop->type == LOOP_BEGIN) {
+ genop_peep(s, MKOP_A(OP_POPERR, 1), NOVAL);
+ loop = loop->prev;
+ }
+ while (loop->type == LOOP_RESCUE) {
+ loop = loop->prev;
+ }
+ if (loop->type == LOOP_NORMAL) {
+ int tmp;
+
+ if (s->ensure_level > s->loop->ensure_level) {
+ genop_peep(s, MKOP_A(OP_EPOP, s->ensure_level - s->loop->ensure_level), NOVAL);
+ }
+ if (tree) {
+ genop_peep(s, MKOP_AB(OP_MOVE, loop->acc, cursp()), NOVAL);
+ }
+ tmp = genop(s, MKOP_sBx(OP_JMP, loop->pc3));
+ loop->pc3 = tmp;
+ }
+ else {
+ genop(s, MKOP_AB(OP_RETURN, cursp(), OP_R_BREAK));
+ }
+ }
+}
+
+static void
+loop_pop(codegen_scope *s, int val)
+{
+ if (val) {
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
+ }
+ dispatch_linked(s, s->loop->pc3);
+ s->loop = s->loop->prev;
+ if (val) push();
+}
+
+#ifdef ENABLE_STDIO
+static int
+print_r(mrb_state *mrb, mrb_irep *irep, size_t n, int pre)
+{
+ size_t i;
+
+ if (n == 0) return 0;
+
+ for (i=0; i+1<irep->nlocals; i++) {
+ if (irep->lv[i].r == n) {
+ mrb_sym sym = irep->lv[i].name;
+ if (pre) printf(" ");
+ printf("R%d:%s", (int)n, mrb_sym2name(mrb, sym));
+ return 1;
+ }
+ }
+ return 0;
+}
+
+#define RA 1
+#define RB 2
+#define RAB 3
+
+static void
+print_lv(mrb_state *mrb, mrb_irep *irep, mrb_code c, int r)
+{
+ int pre = 0;
+
+ if (!irep->lv
+ || ((!(r & RA) || GETARG_A(c) >= irep->nlocals)
+ && (!(r & RB) || GETARG_B(c) >= irep->nlocals))) {
+ printf("\n");
+ return;
+ }
+ printf("\t; ");
+ if (r & RA) {
+ pre = print_r(mrb, irep, GETARG_A(c), 0);
+ }
+ if (r & RB) {
+ print_r(mrb, irep, GETARG_B(c), pre);
+ }
+ printf("\n");
+}
+#endif
+
+static void
+codedump(mrb_state *mrb, mrb_irep *irep)
+{
+#ifdef ENABLE_STDIO
+ int i;
+ int ai;
+ mrb_code c;
+ const char *file = NULL, *next_file;
+ int32_t line;
+
+ if (!irep) return;
+ printf("irep %p nregs=%d nlocals=%d pools=%d syms=%d reps=%d\n", (void*)irep,
+ irep->nregs, irep->nlocals, (int)irep->plen, (int)irep->slen, (int)irep->rlen);
+
+ for (i = 0; i < (int)irep->ilen; i++) {
+ ai = mrb_gc_arena_save(mrb);
+
+ next_file = mrb_debug_get_filename(irep, i);
+ if (next_file && file != next_file) {
+ printf("file: %s\n", next_file);
+ file = next_file;
+ }
+ line = mrb_debug_get_line(irep, i);
+ if (line < 0) {
+ printf(" ");
+ }
+ else {
+ printf("%5d ", line);
+ }
+
+ printf("%03d ", i);
+ c = irep->iseq[i];
+ switch (GET_OPCODE(c)) {
+ case OP_NOP:
+ printf("OP_NOP\n");
+ break;
+ case OP_MOVE:
+ printf("OP_MOVE\tR%d\tR%d", GETARG_A(c), GETARG_B(c));
+ print_lv(mrb, irep, c, RAB);
+ break;
+ case OP_LOADL:
+ {
+ mrb_value v = irep->pool[GETARG_Bx(c)];
+ mrb_value s = mrb_inspect(mrb, v);
+ printf("OP_LOADL\tR%d\tL(%d)\t; %s", GETARG_A(c), GETARG_Bx(c), RSTRING_PTR(s));
+ }
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_LOADI:
+ printf("OP_LOADI\tR%d\t%d", GETARG_A(c), GETARG_sBx(c));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_LOADSYM:
+ printf("OP_LOADSYM\tR%d\t:%s", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_LOADNIL:
+ printf("OP_LOADNIL\tR%d\t", GETARG_A(c));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_LOADSELF:
+ printf("OP_LOADSELF\tR%d\t", GETARG_A(c));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_LOADT:
+ printf("OP_LOADT\tR%d\t", GETARG_A(c));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_LOADF:
+ printf("OP_LOADF\tR%d\t", GETARG_A(c));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_GETGLOBAL:
+ printf("OP_GETGLOBAL\tR%d\t:%s", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_SETGLOBAL:
+ printf("OP_SETGLOBAL\t:%s\tR%d",
+ mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]),
+ GETARG_A(c));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_GETCONST:
+ printf("OP_GETCONST\tR%d\t:%s", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_SETCONST:
+ printf("OP_SETCONST\t:%s\tR%d",
+ mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]),
+ GETARG_A(c));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_GETMCNST:
+ printf("OP_GETMCNST\tR%d\tR%d::%s", GETARG_A(c), GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]));
+ print_lv(mrb, irep, c, RAB);
+ break;
+ case OP_SETMCNST:
+ printf("OP_SETMCNST\tR%d::%s\tR%d", GETARG_A(c)+1,
+ mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]),
+ GETARG_A(c));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_GETIV:
+ printf("OP_GETIV\tR%d\t%s", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_SETIV:
+ printf("OP_SETIV\t%s\tR%d",
+ mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]),
+ GETARG_A(c));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_GETUPVAR:
+ printf("OP_GETUPVAR\tR%d\t%d\t%d",
+ GETARG_A(c), GETARG_B(c), GETARG_C(c));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_SETUPVAR:
+ printf("OP_SETUPVAR\tR%d\t%d\t%d",
+ GETARG_A(c), GETARG_B(c), GETARG_C(c));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_GETCV:
+ printf("OP_GETCV\tR%d\t%s", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_SETCV:
+ printf("OP_SETCV\t%s\tR%d",
+ mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]),
+ GETARG_A(c));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_JMP:
+ printf("OP_JMP\t\t%03d\n", i+GETARG_sBx(c));
+ break;
+ case OP_JMPIF:
+ printf("OP_JMPIF\tR%d\t%03d\n", GETARG_A(c), i+GETARG_sBx(c));
+ break;
+ case OP_JMPNOT:
+ printf("OP_JMPNOT\tR%d\t%03d\n", GETARG_A(c), i+GETARG_sBx(c));
+ break;
+ case OP_SEND:
+ printf("OP_SEND\tR%d\t:%s\t%d\n", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+ GETARG_C(c));
+ break;
+ case OP_SENDB:
+ printf("OP_SENDB\tR%d\t:%s\t%d\n", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+ GETARG_C(c));
+ break;
+ case OP_TAILCALL:
+ printf("OP_TAILCALL\tR%d\t:%s\t%d\n", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+ GETARG_C(c));
+ break;
+ case OP_SUPER:
+ printf("OP_SUPER\tR%d\t%d\n", GETARG_A(c),
+ GETARG_C(c));
+ break;
+ case OP_ARGARY:
+ printf("OP_ARGARY\tR%d\t%d:%d:%d:%d", GETARG_A(c),
+ (GETARG_Bx(c)>>10)&0x3f,
+ (GETARG_Bx(c)>>9)&0x1,
+ (GETARG_Bx(c)>>4)&0x1f,
+ (GETARG_Bx(c)>>0)&0xf);
+ print_lv(mrb, irep, c, RA);
+ break;
+
+ case OP_ENTER:
+ printf("OP_ENTER\t%d:%d:%d:%d:%d:%d:%d\n",
+ (GETARG_Ax(c)>>18)&0x1f,
+ (GETARG_Ax(c)>>13)&0x1f,
+ (GETARG_Ax(c)>>12)&0x1,
+ (GETARG_Ax(c)>>7)&0x1f,
+ (GETARG_Ax(c)>>2)&0x1f,
+ (GETARG_Ax(c)>>1)&0x1,
+ GETARG_Ax(c) & 0x1);
+ break;
+ case OP_RETURN:
+ printf("OP_RETURN\tR%d", GETARG_A(c));
+ switch (GETARG_B(c)) {
+ case OP_R_NORMAL:
+ case OP_R_RETURN:
+ printf("\treturn"); break;
+ case OP_R_BREAK:
+ printf("\tbreak"); break;
+ default:
+ printf("\tbroken"); break;
+ break;
+ }
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_BLKPUSH:
+ printf("OP_BLKPUSH\tR%d\t%d:%d:%d:%d", GETARG_A(c),
+ (GETARG_Bx(c)>>10)&0x3f,
+ (GETARG_Bx(c)>>9)&0x1,
+ (GETARG_Bx(c)>>4)&0x1f,
+ (GETARG_Bx(c)>>0)&0xf);
+ print_lv(mrb, irep, c, RA);
+ break;
+
+ case OP_LAMBDA:
+ printf("OP_LAMBDA\tR%d\tI(%+d)\t%d", GETARG_A(c), GETARG_b(c)+1, GETARG_c(c));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_RANGE:
+ printf("OP_RANGE\tR%d\tR%d\t%d", GETARG_A(c), GETARG_B(c), GETARG_C(c));
+ print_lv(mrb, irep, c, RAB);
+ break;
+ case OP_METHOD:
+ printf("OP_METHOD\tR%d\t:%s", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_B(c)]));
+ print_lv(mrb, irep, c, RA);
+ break;
+
+ case OP_ADD:
+ printf("OP_ADD\tR%d\t:%s\t%d\n", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+ GETARG_C(c));
+ break;
+ case OP_ADDI:
+ printf("OP_ADDI\tR%d\t:%s\t%d\n", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+ GETARG_C(c));
+ break;
+ case OP_SUB:
+ printf("OP_SUB\tR%d\t:%s\t%d\n", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+ GETARG_C(c));
+ break;
+ case OP_SUBI:
+ printf("OP_SUBI\tR%d\t:%s\t%d\n", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+ GETARG_C(c));
+ break;
+ case OP_MUL:
+ printf("OP_MUL\tR%d\t:%s\t%d\n", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+ GETARG_C(c));
+ break;
+ case OP_DIV:
+ printf("OP_DIV\tR%d\t:%s\t%d\n", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+ GETARG_C(c));
+ break;
+ case OP_LT:
+ printf("OP_LT\tR%d\t:%s\t%d\n", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+ GETARG_C(c));
+ break;
+ case OP_LE:
+ printf("OP_LE\tR%d\t:%s\t%d\n", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+ GETARG_C(c));
+ break;
+ case OP_GT:
+ printf("OP_GT\tR%d\t:%s\t%d\n", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+ GETARG_C(c));
+ break;
+ case OP_GE:
+ printf("OP_GE\tR%d\t:%s\t%d\n", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+ GETARG_C(c));
+ break;
+ case OP_EQ:
+ printf("OP_EQ\tR%d\t:%s\t%d\n", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+ GETARG_C(c));
+ break;
+
+ case OP_STOP:
+ printf("OP_STOP\n");
+ break;
+
+ case OP_ARRAY:
+ printf("OP_ARRAY\tR%d\tR%d\t%d", GETARG_A(c), GETARG_B(c), GETARG_C(c));
+ print_lv(mrb, irep, c, RAB);
+ break;
+ case OP_ARYCAT:
+ printf("OP_ARYCAT\tR%d\tR%d", GETARG_A(c), GETARG_B(c));
+ print_lv(mrb, irep, c, RAB);
+ break;
+ case OP_ARYPUSH:
+ printf("OP_ARYPUSH\tR%d\tR%d", GETARG_A(c), GETARG_B(c));
+ print_lv(mrb, irep, c, RAB);
+ break;
+ case OP_AREF:
+ printf("OP_AREF\tR%d\tR%d\t%d", GETARG_A(c), GETARG_B(c), GETARG_C(c));
+ print_lv(mrb, irep, c, RAB);
+ break;
+ case OP_APOST:
+ printf("OP_APOST\tR%d\t%d\t%d", GETARG_A(c), GETARG_B(c), GETARG_C(c));
+ print_lv(mrb, irep, c, RAB);
+ break;
+ case OP_STRING:
+ {
+ mrb_value v = irep->pool[GETARG_Bx(c)];
+ mrb_value s = mrb_str_dump(mrb, mrb_str_new(mrb, RSTRING_PTR(v), RSTRING_LEN(v)));
+ printf("OP_STRING\tR%d\tL(%d)\t; %s", GETARG_A(c), GETARG_Bx(c), RSTRING_PTR(s));
+ }
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_STRCAT:
+ printf("OP_STRCAT\tR%d\tR%d", GETARG_A(c), GETARG_B(c));
+ print_lv(mrb, irep, c, RAB);
+ break;
+ case OP_HASH:
+ printf("OP_HASH\tR%d\tR%d\t%d", GETARG_A(c), GETARG_B(c), GETARG_C(c));
+ print_lv(mrb, irep, c, RAB);
+ break;
+
+ case OP_OCLASS:
+ printf("OP_OCLASS\tR%d", GETARG_A(c));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_CLASS:
+ printf("OP_CLASS\tR%d\t:%s", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_B(c)]));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_MODULE:
+ printf("OP_MODULE\tR%d\t:%s", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_B(c)]));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_EXEC:
+ printf("OP_EXEC\tR%d\tI(%+d)", GETARG_A(c), GETARG_Bx(c)+1);
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_SCLASS:
+ printf("OP_SCLASS\tR%d\tR%d", GETARG_A(c), GETARG_B(c));
+ print_lv(mrb, irep, c, RAB);
+ break;
+ case OP_TCLASS:
+ printf("OP_TCLASS\tR%d", GETARG_A(c));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_ERR:
+ {
+ mrb_value v = irep->pool[GETARG_Bx(c)];
+ mrb_value s = mrb_str_dump(mrb, mrb_str_new(mrb, RSTRING_PTR(v), RSTRING_LEN(v)));
+ printf("OP_ERR\t%s\n", RSTRING_PTR(s));
+ }
+ break;
+ case OP_EPUSH:
+ printf("OP_EPUSH\t:I(%+d)\n", GETARG_Bx(c)+1);
+ break;
+ case OP_ONERR:
+ printf("OP_ONERR\t%03d\n", i+GETARG_sBx(c));
+ break;
+ case OP_RESCUE:
+ printf("OP_RESCUE\tR%d", GETARG_A(c));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_RAISE:
+ printf("OP_RAISE\tR%d", GETARG_A(c));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_POPERR:
+ printf("OP_POPERR\t%d", GETARG_A(c));
+ print_lv(mrb, irep, c, RA);
+ break;
+ case OP_EPOP:
+ printf("OP_EPOP\t%d\n", GETARG_A(c));
+ break;
+
+ default:
+ printf("OP_unknown %d\t%d\t%d\t%d\n", GET_OPCODE(c),
+ GETARG_A(c), GETARG_B(c), GETARG_C(c));
+ break;
+ }
+ mrb_gc_arena_restore(mrb, ai);
+ }
+ printf("\n");
+#endif
+}
+
+static void
+codedump_recur(mrb_state *mrb, mrb_irep *irep)
+{
+ size_t i;
+
+ codedump(mrb, irep);
+ for (i=0; i<irep->rlen; i++) {
+ codedump_recur(mrb, irep->reps[i]);
+ }
+}
+
+void
+mrb_codedump_all(mrb_state *mrb, struct RProc *proc)
+{
+ codedump_recur(mrb, proc->body.irep);
+}
+
+MRB_API struct RProc*
+mrb_generate_code(mrb_state *mrb, parser_state *p)
+{
+ codegen_scope *scope = scope_new(mrb, 0, 0);
+ struct RProc *proc;
+
+ if (!scope) {
+ return NULL;
+ }
+ scope->mrb = mrb;
+ scope->parser = p;
+ scope->filename = p->filename;
+ scope->filename_index = p->current_filename_index;
+
+ MRB_TRY(&scope->jmp) {
+ /* prepare irep */
+ codegen(scope, p->tree, NOVAL);
+ proc = mrb_proc_new(mrb, scope->irep);
+ mrb_irep_decref(mrb, scope->irep);
+ mrb_pool_close(scope->mpool);
+ return proc;
+ }
+ MRB_CATCH(&scope->jmp) {
+ if (scope->filename == scope->irep->filename) {
+ scope->irep->filename = NULL;
+ }
+ mrb_irep_decref(mrb, scope->irep);
+ mrb_pool_close(scope->mpool);
+ return NULL;
+ }
+ MRB_END_EXC(&scope->jmp);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/compar.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,14 @@
+/*
+** compar.c - Comparable module
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+
+void
+mrb_init_comparable(mrb_state *mrb)
+{
+ mrb_define_module(mrb, "Comparable"); /* 15.3.3 */
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/crc.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,40 @@
+/*
+** crc.c - calculate CRC
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <limits.h>
+#include <stdint.h>
+#include <stddef.h>
+
+/* Calculate CRC (CRC-16-CCITT)
+**
+** 0000_0000_0000_0000_0000_0000_0000_0000
+** ^|------- CRC -------|- work --|
+** carry
+*/
+#define CRC_16_CCITT 0x11021ul /* x^16+x^12+x^5+1 */
+#define CRC_XOR_PATTERN (CRC_16_CCITT << 8)
+#define CRC_CARRY_BIT (0x01000000)
+
+uint16_t
+calc_crc_16_ccitt(const uint8_t *src, size_t nbytes, uint16_t crc)
+{
+ size_t ibyte;
+ uint32_t ibit;
+ uint32_t crcwk = crc << 8;
+
+ for (ibyte = 0; ibyte < nbytes; ibyte++) {
+ crcwk |= *src++;
+ for (ibit = 0; ibit < CHAR_BIT; ibit++) {
+ crcwk <<= 1;
+ if (crcwk & CRC_CARRY_BIT) {
+ crcwk ^= CRC_XOR_PATTERN;
+ }
+ }
+ }
+ return (uint16_t)(crcwk >> 8);
+}
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/debug.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,216 @@
+#include <string.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include "mruby/debug.h"
+
+static mrb_irep_debug_info_file *
+get_file(mrb_irep_debug_info *info, uint32_t pc)
+{
+ mrb_irep_debug_info_file **ret;
+ int32_t count;
+
+ if (pc >= info->pc_count) { return NULL; }
+ /* get upper bound */
+ ret = info->files;
+ count = info->flen;
+ while (count > 0) {
+ int32_t step = count / 2;
+ mrb_irep_debug_info_file **it = ret + step;
+ if (!(pc < (*it)->start_pos)) {
+ ret = it + 1;
+ count -= step + 1;
+ } else { count = step; }
+ }
+
+ --ret;
+
+ /* check returning file exists inside debug info */
+ mrb_assert(info->files <= ret && ret < (info->files + info->flen));
+ /* check pc is within the range of returning file */
+ mrb_assert((*ret)->start_pos <= pc &&
+ pc < (((ret + 1 - info->files) < info->flen)
+ ? (*(ret+1))->start_pos : info->pc_count));
+
+ return *ret;
+}
+
+static mrb_debug_line_type
+select_line_type(const uint16_t *lines, size_t lines_len)
+{
+ size_t line_count = 0;
+ int prev_line = -1;
+ size_t i;
+ for (i = 0; i < lines_len; ++i) {
+ if (lines[i] != prev_line) {
+ ++line_count;
+ }
+ }
+ return (sizeof(uint16_t) * lines_len) <= (sizeof(mrb_irep_debug_info_line) * line_count)
+ ? mrb_debug_line_ary : mrb_debug_line_flat_map;
+}
+
+MRB_API char const*
+mrb_debug_get_filename(mrb_irep *irep, uint32_t pc)
+{
+ if (irep && pc < irep->ilen) {
+ mrb_irep_debug_info_file* f = NULL;
+ if (!irep->debug_info) { return irep->filename; }
+ else if ((f = get_file(irep->debug_info, pc))) {
+ return f->filename;
+ }
+ }
+ return NULL;
+}
+
+MRB_API int32_t
+mrb_debug_get_line(mrb_irep *irep, uint32_t pc)
+{
+ if (irep && pc < irep->ilen) {
+ mrb_irep_debug_info_file* f = NULL;
+ if (!irep->debug_info) {
+ return irep->lines? irep->lines[pc] : -1;
+ }
+ else if ((f = get_file(irep->debug_info, pc))) {
+ switch (f->line_type) {
+ case mrb_debug_line_ary:
+ mrb_assert(f->start_pos <= pc && pc < (f->start_pos + f->line_entry_count));
+ return f->lines.ary[pc - f->start_pos];
+
+ case mrb_debug_line_flat_map: {
+ /* get upper bound */
+ mrb_irep_debug_info_line *ret = f->lines.flat_map;
+ uint32_t count = f->line_entry_count;
+ while (count > 0) {
+ int32_t step = count / 2;
+ mrb_irep_debug_info_line *it = ret + step;
+ if (!(pc < it->start_pos)) {
+ ret = it + 1;
+ count -= step + 1;
+ } else { count = step; }
+ }
+
+ --ret;
+
+ /* check line entry pointer range */
+ mrb_assert(f->lines.flat_map <= ret && ret < (f->lines.flat_map + f->line_entry_count));
+ /* check pc range */
+ mrb_assert(ret->start_pos <= pc &&
+ pc < (((uint32_t)(ret + 1 - f->lines.flat_map) < f->line_entry_count)
+ ? (ret+1)->start_pos : irep->debug_info->pc_count));
+
+ return ret->line;
+ }
+ }
+ }
+ }
+ return -1;
+}
+
+MRB_API mrb_irep_debug_info *
+mrb_debug_info_alloc(mrb_state *mrb, mrb_irep *irep)
+{
+ static const mrb_irep_debug_info initial = { 0, 0, NULL };
+ mrb_irep_debug_info *ret;
+
+ mrb_assert(!irep->debug_info);
+ ret = (mrb_irep_debug_info *)mrb_malloc(mrb, sizeof(*ret));
+ *ret = initial;
+ irep->debug_info = ret;
+ return ret;
+}
+
+MRB_API mrb_irep_debug_info_file *
+mrb_debug_info_append_file(mrb_state *mrb, mrb_irep *irep,
+ uint32_t start_pos, uint32_t end_pos)
+{
+ mrb_irep_debug_info *info;
+ mrb_irep_debug_info_file *ret;
+ uint32_t file_pc_count;
+ size_t fn_len;
+ mrb_int len;
+ uint32_t i;
+
+ if (!irep->debug_info) { return NULL; }
+
+ mrb_assert(irep->filename);
+ mrb_assert(irep->lines);
+
+ info = irep->debug_info;
+
+ if (info->flen > 0 && strcmp(irep->filename, info->files[info->flen - 1]->filename) == 0) {
+ return NULL;
+ }
+
+ ret = (mrb_irep_debug_info_file *)mrb_malloc(mrb, sizeof(*ret));
+ info->files =
+ (mrb_irep_debug_info_file**)(
+ info->files
+ ? mrb_realloc(mrb, info->files, sizeof(mrb_irep_debug_info_file*) * (info->flen + 1))
+ : mrb_malloc(mrb, sizeof(mrb_irep_debug_info_file*)));
+ info->files[info->flen++] = ret;
+
+ file_pc_count = end_pos - start_pos;
+
+ ret->start_pos = start_pos;
+ info->pc_count = end_pos;
+
+ fn_len = strlen(irep->filename);
+ ret->filename_sym = mrb_intern(mrb, irep->filename, fn_len);
+ len = 0;
+ ret->filename = mrb_sym2name_len(mrb, ret->filename_sym, &len);
+
+ ret->line_type = select_line_type(irep->lines + start_pos, end_pos - start_pos);
+ ret->lines.ptr = NULL;
+
+ switch (ret->line_type) {
+ case mrb_debug_line_ary:
+ ret->line_entry_count = file_pc_count;
+ ret->lines.ary = (uint16_t*)mrb_malloc(mrb, sizeof(uint16_t) * file_pc_count);
+ for (i = 0; i < file_pc_count; ++i) {
+ ret->lines.ary[i] = irep->lines[start_pos + i];
+ }
+ break;
+
+ case mrb_debug_line_flat_map: {
+ uint16_t prev_line = 0;
+ mrb_irep_debug_info_line m;
+ ret->lines.flat_map = (mrb_irep_debug_info_line*)mrb_malloc(mrb, sizeof(mrb_irep_debug_info_line) * 1);
+ ret->line_entry_count = 0;
+ for (i = 0; i < file_pc_count; ++i) {
+ if (irep->lines[start_pos + i] == prev_line) { continue; }
+
+ ret->lines.flat_map = (mrb_irep_debug_info_line*)mrb_realloc(
+ mrb, ret->lines.flat_map,
+ sizeof(mrb_irep_debug_info_line) * (ret->line_entry_count + 1));
+ m.start_pos = start_pos + i;
+ m.line = irep->lines[start_pos + i];
+ ret->lines.flat_map[ret->line_entry_count] = m;
+
+ /* update */
+ ++ret->line_entry_count;
+ prev_line = irep->lines[start_pos + i];
+ }
+ } break;
+
+ default: mrb_assert(0); break;
+ }
+
+ return ret;
+}
+
+MRB_API void
+mrb_debug_info_free(mrb_state *mrb, mrb_irep_debug_info *d)
+{
+ uint32_t i;
+
+ if (!d) { return; }
+
+ for (i = 0; i < d->flen; ++i) {
+ mrb_assert(d->files[i]);
+ mrb_free(mrb, d->files[i]->lines.ptr);
+ mrb_free(mrb, d->files[i]);
+ }
+ mrb_free(mrb, d->files);
+ mrb_free(mrb, d);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/dump.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,1070 @@
+/*
+** dump.c - mruby binary dumper (mrbc binary format)
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <ctype.h>
+#include <string.h>
+#include <limits.h>
+#include "mruby/dump.h"
+#include "mruby/string.h"
+#include "mruby/irep.h"
+#include "mruby/numeric.h"
+#include "mruby/debug.h"
+
+#define FLAG_BYTEORDER_NATIVE 2
+#define FLAG_BYTEORDER_NONATIVE 0
+
+#ifdef ENABLE_STDIO
+
+static size_t get_irep_record_size_1(mrb_state *mrb, mrb_irep *irep);
+
+#if UINT32_MAX > SIZE_MAX
+# error This code cannot be built on your environment.
+#endif
+
+static size_t
+write_padding(uint8_t *buf)
+{
+ const size_t align = MRB_DUMP_ALIGNMENT;
+ size_t pad_len = -(intptr_t)buf & (align-1);
+ if (pad_len > 0) {
+ memset(buf, 0, pad_len);
+ }
+ return pad_len;
+}
+
+static size_t
+get_irep_header_size(mrb_state *mrb)
+{
+ size_t size = 0;
+
+ size += sizeof(uint32_t) * 1;
+ size += sizeof(uint16_t) * 3;
+
+ return size;
+}
+
+static ptrdiff_t
+write_irep_header(mrb_state *mrb, mrb_irep *irep, uint8_t *buf)
+{
+ uint8_t *cur = buf;
+
+ cur += uint32_to_bin(get_irep_record_size_1(mrb, irep), cur); /* record size */
+ cur += uint16_to_bin((uint16_t)irep->nlocals, cur); /* number of local variable */
+ cur += uint16_to_bin((uint16_t)irep->nregs, cur); /* number of register variable */
+ cur += uint16_to_bin((uint16_t)irep->rlen, cur); /* number of child irep */
+
+ return cur - buf;
+}
+
+
+static size_t
+get_iseq_block_size(mrb_state *mrb, mrb_irep *irep)
+{
+ size_t size = 0;
+
+ size += sizeof(uint32_t); /* ilen */
+ size += sizeof(uint32_t); /* max padding */
+ size += sizeof(uint32_t) * irep->ilen; /* iseq(n) */
+
+ return size;
+}
+
+static ptrdiff_t
+write_iseq_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf, uint8_t flags)
+{
+ uint8_t *cur = buf;
+ uint32_t iseq_no;
+
+ cur += uint32_to_bin(irep->ilen, cur); /* number of opcode */
+ cur += write_padding(cur);
+ if (flags & FLAG_BYTEORDER_NATIVE) {
+ memcpy(cur, irep->iseq, irep->ilen * sizeof(mrb_code));
+ cur += irep->ilen * sizeof(mrb_code);
+ }
+ else {
+ for (iseq_no = 0; iseq_no < irep->ilen; iseq_no++) {
+ cur += uint32_to_bin(irep->iseq[iseq_no], cur); /* opcode */
+ }
+ }
+
+ return cur - buf;
+}
+
+
+static size_t
+get_pool_block_size(mrb_state *mrb, mrb_irep *irep)
+{
+ size_t size = 0;
+ size_t pool_no;
+ mrb_value str;
+ char buf[32];
+
+ size += sizeof(uint32_t); /* plen */
+ size += irep->plen * (sizeof(uint8_t) + sizeof(uint16_t)); /* len(n) */
+
+ for (pool_no = 0; pool_no < irep->plen; pool_no++) {
+ int ai = mrb_gc_arena_save(mrb);
+
+ switch (mrb_type(irep->pool[pool_no])) {
+ case MRB_TT_FIXNUM:
+ str = mrb_fixnum_to_str(mrb, irep->pool[pool_no], 10);
+ {
+ mrb_int len = RSTRING_LEN(str);
+ mrb_assert_int_fit(mrb_int, len, size_t, SIZE_MAX);
+ size += (size_t)len;
+ }
+ break;
+
+ case MRB_TT_FLOAT:
+ {
+ int len;
+ len = mrb_float_to_str(buf, mrb_float(irep->pool[pool_no]));
+ mrb_assert_int_fit(mrb_int, len, size_t, SIZE_MAX);
+ size += (size_t)len;
+ }
+ break;
+
+ case MRB_TT_STRING:
+ {
+ mrb_int len = RSTRING_LEN(irep->pool[pool_no]);
+ mrb_assert_int_fit(mrb_int, len, size_t, SIZE_MAX);
+ size += (size_t)len;
+ }
+ break;
+
+ default:
+ break;
+ }
+ mrb_gc_arena_restore(mrb, ai);
+ }
+
+ return size;
+}
+
+static ptrdiff_t
+write_pool_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf)
+{
+ size_t pool_no;
+ uint8_t *cur = buf;
+ uint16_t len;
+ mrb_value str;
+ const char *char_ptr;
+ char char_buf[30];
+
+ cur += uint32_to_bin(irep->plen, cur); /* number of pool */
+
+ for (pool_no = 0; pool_no < irep->plen; pool_no++) {
+ int ai = mrb_gc_arena_save(mrb);
+
+ switch (mrb_type(irep->pool[pool_no])) {
+ case MRB_TT_FIXNUM:
+ cur += uint8_to_bin(IREP_TT_FIXNUM, cur); /* data type */
+ str = mrb_fixnum_to_str(mrb, irep->pool[pool_no], 10);
+ char_ptr = RSTRING_PTR(str);
+ {
+ mrb_int tlen;
+
+ tlen = RSTRING_LEN(str);
+ mrb_assert_int_fit(mrb_int, tlen, uint16_t, UINT16_MAX);
+ len = (uint16_t)tlen;
+ }
+ break;
+
+ case MRB_TT_FLOAT:
+ cur += uint8_to_bin(IREP_TT_FLOAT, cur); /* data type */
+ {
+ int tlen;
+ tlen = mrb_float_to_str(char_buf, mrb_float(irep->pool[pool_no]));
+ mrb_assert_int_fit(int, tlen, uint16_t, UINT16_MAX);
+ len = (uint16_t)tlen;
+ }
+ char_ptr = &char_buf[0];
+ break;
+
+ case MRB_TT_STRING:
+ cur += uint8_to_bin(IREP_TT_STRING, cur); /* data type */
+ char_ptr = RSTRING_PTR(irep->pool[pool_no]);
+ {
+ mrb_int tlen;
+
+ tlen = RSTRING_LEN(irep->pool[pool_no]);
+ mrb_assert_int_fit(mrb_int, tlen, uint16_t, UINT16_MAX);
+ len = (uint16_t)tlen;
+ }
+ break;
+
+ default:
+ continue;
+ }
+
+ cur += uint16_to_bin(len, cur); /* data length */
+ memcpy(cur, char_ptr, (size_t)len);
+ cur += len;
+
+ mrb_gc_arena_restore(mrb, ai);
+ }
+
+ return cur - buf;
+}
+
+
+static size_t
+get_syms_block_size(mrb_state *mrb, mrb_irep *irep)
+{
+ size_t size = 0;
+ uint32_t sym_no;
+ mrb_int len;
+
+ size += sizeof(uint32_t); /* slen */
+ for (sym_no = 0; sym_no < irep->slen; sym_no++) {
+ size += sizeof(uint16_t); /* snl(n) */
+ if (irep->syms[sym_no] != 0) {
+ mrb_sym2name_len(mrb, irep->syms[sym_no], &len);
+ size += len + 1; /* sn(n) + null char */
+ }
+ }
+
+ return size;
+}
+
+static ptrdiff_t
+write_syms_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf)
+{
+ uint32_t sym_no;
+ uint8_t *cur = buf;
+ const char *name;
+
+ cur += uint32_to_bin(irep->slen, cur); /* number of symbol */
+
+ for (sym_no = 0; sym_no < irep->slen; sym_no++) {
+ if (irep->syms[sym_no] != 0) {
+ mrb_int len;
+
+ name = mrb_sym2name_len(mrb, irep->syms[sym_no], &len);
+
+ mrb_assert_int_fit(mrb_int, len, uint16_t, UINT16_MAX);
+ cur += uint16_to_bin((uint16_t)len, cur); /* length of symbol name */
+ memcpy(cur, name, len); /* symbol name */
+ cur += (uint16_t)len;
+ *cur++ = '\0';
+ }
+ else {
+ cur += uint16_to_bin(MRB_DUMP_NULL_SYM_LEN, cur); /* length of symbol name */
+ }
+ }
+
+ return cur - buf;
+}
+
+static size_t
+get_irep_record_size_1(mrb_state *mrb, mrb_irep *irep)
+{
+ size_t size = 0;
+
+ size += get_irep_header_size(mrb);
+ size += get_iseq_block_size(mrb, irep);
+ size += get_pool_block_size(mrb, irep);
+ size += get_syms_block_size(mrb, irep);
+ return size;
+}
+
+static size_t
+get_irep_record_size(mrb_state *mrb, mrb_irep *irep)
+{
+ size_t size = 0;
+ size_t irep_no;
+
+ size = get_irep_record_size_1(mrb, irep);
+ for (irep_no = 0; irep_no < irep->rlen; irep_no++) {
+ size += get_irep_record_size(mrb, irep->reps[irep_no]);
+ }
+ return size;
+}
+
+static int
+write_irep_record(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, size_t *irep_record_size, uint8_t flags)
+{
+ uint32_t i;
+ uint8_t *src = bin;
+
+ if (irep == NULL) {
+ return MRB_DUMP_INVALID_IREP;
+ }
+
+ *irep_record_size = get_irep_record_size_1(mrb, irep);
+ if (*irep_record_size == 0) {
+ return MRB_DUMP_GENERAL_FAILURE;
+ }
+
+ bin += write_irep_header(mrb, irep, bin);
+ bin += write_iseq_block(mrb, irep, bin, flags);
+ bin += write_pool_block(mrb, irep, bin);
+ bin += write_syms_block(mrb, irep, bin);
+
+ for (i = 0; i < irep->rlen; i++) {
+ int result;
+ size_t rsize;
+
+ result = write_irep_record(mrb, irep->reps[i], bin, &rsize, flags);
+ if (result != MRB_DUMP_OK) {
+ return result;
+ }
+ bin += rsize;
+ }
+ *irep_record_size = bin - src;
+ return MRB_DUMP_OK;
+}
+
+static uint32_t
+write_footer(mrb_state *mrb, uint8_t *bin)
+{
+ struct rite_binary_footer footer;
+
+ memcpy(footer.section_identify, RITE_BINARY_EOF, sizeof(footer.section_identify));
+ uint32_to_bin(sizeof(struct rite_binary_footer), footer.section_size);
+ memcpy(bin, &footer, sizeof(struct rite_binary_footer));
+
+ return sizeof(struct rite_binary_footer);
+}
+
+
+static int
+write_section_irep_header(mrb_state *mrb, size_t section_size, uint8_t *bin)
+{
+ struct rite_section_irep_header *header = (struct rite_section_irep_header*)bin;
+
+ memcpy(header->section_identify, RITE_SECTION_IREP_IDENTIFIER, sizeof(header->section_identify));
+
+ mrb_assert_int_fit(size_t, section_size, uint32_t, UINT32_MAX);
+ uint32_to_bin((uint32_t)section_size, header->section_size);
+ memcpy(header->rite_version, RITE_VM_VER, sizeof(header->rite_version));
+
+ return MRB_DUMP_OK;
+}
+
+static int
+write_section_irep(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, size_t *len_p, uint8_t flags)
+{
+ int result;
+ size_t rsize = 0;
+ uint8_t *cur = bin;
+
+ if (mrb == NULL || bin == NULL) {
+ return MRB_DUMP_INVALID_ARGUMENT;
+ }
+
+ cur += sizeof(struct rite_section_irep_header);
+
+ result = write_irep_record(mrb, irep, cur, &rsize, flags);
+ if (result != MRB_DUMP_OK) {
+ return result;
+ }
+ *len_p = cur - bin + rsize;
+ write_section_irep_header(mrb, *len_p, bin);
+
+ return MRB_DUMP_OK;
+}
+
+static int
+write_section_lineno_header(mrb_state *mrb, size_t section_size, uint8_t *bin)
+{
+ struct rite_section_lineno_header *header = (struct rite_section_lineno_header*)bin;
+
+ memcpy(header->section_identify, RITE_SECTION_LINENO_IDENTIFIER, sizeof(header->section_identify));
+ uint32_to_bin((uint32_t)section_size, header->section_size);
+
+ return MRB_DUMP_OK;
+}
+
+static size_t
+get_lineno_record_size(mrb_state *mrb, mrb_irep *irep)
+{
+ size_t size = 0;
+
+ size += sizeof(uint32_t); /* record size */
+ size += sizeof(uint16_t); /* filename size */
+ if (irep->filename) {
+ size += strlen(irep->filename); /* filename */
+ }
+ size += sizeof(uint32_t); /* niseq */
+ if (irep->lines) {
+ size += sizeof(uint16_t) * irep->ilen; /* lineno */
+ }
+
+ return size;
+}
+
+static size_t
+write_lineno_record_1(mrb_state *mrb, mrb_irep *irep, uint8_t* bin)
+{
+ uint8_t *cur = bin;
+ size_t iseq_no;
+ size_t filename_len;
+ ptrdiff_t diff;
+
+ cur += sizeof(uint32_t); /* record size */
+
+ if (irep->filename) {
+ filename_len = strlen(irep->filename);
+ } else {
+ filename_len = 0;
+ }
+ mrb_assert_int_fit(size_t, filename_len, uint16_t, UINT16_MAX);
+ cur += uint16_to_bin((uint16_t)filename_len, cur); /* filename size */
+
+ if (filename_len) {
+ memcpy(cur, irep->filename, filename_len);
+ cur += filename_len; /* filename */
+ }
+
+ if (irep->lines) {
+ mrb_assert_int_fit(size_t, irep->ilen, uint32_t, UINT32_MAX);
+ cur += uint32_to_bin((uint32_t)(irep->ilen), cur); /* niseq */
+ for (iseq_no = 0; iseq_no < irep->ilen; iseq_no++) {
+ cur += uint16_to_bin(irep->lines[iseq_no], cur); /* opcode */
+ }
+ }
+ else {
+ cur += uint32_to_bin(0, cur); /* niseq */
+ }
+
+ diff = cur - bin;
+ mrb_assert_int_fit(ptrdiff_t, diff, uint32_t, UINT32_MAX);
+
+ uint32_to_bin((uint32_t)diff, bin); /* record size */
+
+ mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
+ return (size_t)diff;
+}
+
+static size_t
+write_lineno_record(mrb_state *mrb, mrb_irep *irep, uint8_t* bin)
+{
+ size_t i;
+ size_t rlen, size = 0;
+
+ rlen = write_lineno_record_1(mrb, irep, bin);
+ bin += rlen;
+ size += rlen;
+ for (i=0; i<irep->rlen; i++) {
+ rlen = write_lineno_record(mrb, irep, bin);
+ bin += rlen;
+ size += rlen;
+ }
+ return size;
+}
+
+static int
+write_section_lineno(mrb_state *mrb, mrb_irep *irep, uint8_t *bin)
+{
+ size_t section_size = 0;
+ size_t rlen = 0; /* size of irep record */
+ uint8_t *cur = bin;
+
+ if (mrb == NULL || bin == NULL) {
+ return MRB_DUMP_INVALID_ARGUMENT;
+ }
+
+ cur += sizeof(struct rite_section_lineno_header);
+ section_size += sizeof(struct rite_section_lineno_header);
+
+ rlen = write_lineno_record(mrb, irep, cur);
+ section_size += rlen;
+
+ write_section_lineno_header(mrb, section_size, bin);
+
+ return MRB_DUMP_OK;
+}
+
+static size_t
+get_debug_record_size(mrb_state *mrb, mrb_irep *irep)
+{
+ size_t ret = 0;
+ uint16_t f_idx;
+ size_t i;
+
+ ret += sizeof(uint32_t); /* record size */
+ ret += sizeof(uint16_t); /* file count */
+
+ for (f_idx = 0; f_idx < irep->debug_info->flen; ++f_idx) {
+ mrb_irep_debug_info_file const* file = irep->debug_info->files[f_idx];
+
+ ret += sizeof(uint32_t); /* position */
+ ret += sizeof(uint16_t); /* filename index */
+
+ /* lines */
+ ret += sizeof(uint32_t); /* entry count */
+ ret += sizeof(uint8_t); /* line type */
+ switch (file->line_type) {
+ case mrb_debug_line_ary:
+ ret += sizeof(uint16_t) * (size_t)(file->line_entry_count);
+ break;
+
+ case mrb_debug_line_flat_map:
+ ret += (sizeof(uint32_t) + sizeof(uint16_t)) * (size_t)(file->line_entry_count);
+ break;
+
+ default: mrb_assert(0); break;
+ }
+ }
+ for (i=0; i<irep->rlen; i++) {
+ ret += get_debug_record_size(mrb, irep->reps[i]);
+ }
+
+ return ret;
+}
+
+static int
+find_filename_index(const mrb_sym *ary, int ary_len, mrb_sym s)
+{
+ int i;
+
+ for (i = 0; i < ary_len; ++i) {
+ if (ary[i] == s) { return i; }
+ }
+ return -1;
+}
+
+static size_t
+get_filename_table_size(mrb_state *mrb, mrb_irep *irep, mrb_sym **fp, uint16_t *lp)
+{
+ mrb_sym *filenames = *fp;
+ size_t i, size = 0;
+ mrb_irep_debug_info *di = irep->debug_info;
+
+ mrb_assert(lp);
+ for (i = 0; i < di->flen; ++i) {
+ mrb_irep_debug_info_file *file;
+ mrb_int filename_len;
+
+ file = di->files[i];
+ if (find_filename_index(filenames, *lp, file->filename_sym) == -1) {
+ /* register filename */
+ *lp += 1;
+ *fp = filenames = (mrb_sym *)mrb_realloc(mrb, filenames, sizeof(mrb_sym) * (*lp));
+ filenames[*lp - 1] = file->filename_sym;
+
+ /* filename */
+ mrb_sym2name_len(mrb, file->filename_sym, &filename_len);
+ size += sizeof(uint16_t) + (size_t)filename_len;
+ }
+ }
+ for (i=0; i<irep->rlen; i++) {
+ size += get_filename_table_size(mrb, irep->reps[i], fp, lp);
+ }
+ return size;
+}
+
+static size_t
+write_debug_record_1(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, mrb_sym const* filenames, uint16_t filenames_len)
+{
+ uint8_t *cur;
+ uint16_t f_idx;
+ ptrdiff_t ret;
+
+ cur = bin + sizeof(uint32_t); /* skip record size */
+ cur += uint16_to_bin(irep->debug_info->flen, cur); /* file count */
+
+ for (f_idx = 0; f_idx < irep->debug_info->flen; ++f_idx) {
+ int filename_idx;
+ const mrb_irep_debug_info_file *file = irep->debug_info->files[f_idx];
+
+ /* position */
+ cur += uint32_to_bin(file->start_pos, cur);
+
+ /* filename index */
+ filename_idx = find_filename_index(filenames, filenames_len,
+ file->filename_sym);
+ mrb_assert_int_fit(int, filename_idx, uint16_t, UINT16_MAX);
+ cur += uint16_to_bin((uint16_t)filename_idx, cur);
+
+ /* lines */
+ cur += uint32_to_bin(file->line_entry_count, cur);
+ cur += uint8_to_bin(file->line_type, cur);
+ switch (file->line_type) {
+ case mrb_debug_line_ary: {
+ uint32_t l;
+ for (l = 0; l < file->line_entry_count; ++l) {
+ cur += uint16_to_bin(file->lines.ary[l], cur);
+ }
+ } break;
+
+ case mrb_debug_line_flat_map: {
+ uint32_t line;
+ for (line = 0; line < file->line_entry_count; ++line) {
+ cur += uint32_to_bin(file->lines.flat_map[line].start_pos, cur);
+ cur += uint16_to_bin(file->lines.flat_map[line].line, cur);
+ }
+ } break;
+
+ default: mrb_assert(0); break;
+ }
+ }
+
+ ret = cur - bin;
+ mrb_assert_int_fit(ptrdiff_t, ret, uint32_t, UINT32_MAX);
+ uint32_to_bin(ret, bin);
+
+ mrb_assert_int_fit(ptrdiff_t, ret, size_t, SIZE_MAX);
+ return (size_t)ret;
+}
+
+static size_t
+write_debug_record(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, mrb_sym const* filenames, uint16_t filenames_len)
+{
+ size_t size, len;
+ size_t irep_no;
+
+ size = len = write_debug_record_1(mrb, irep, bin, filenames, filenames_len);
+ bin += len;
+ for (irep_no = 0; irep_no < irep->rlen; irep_no++) {
+ len = write_debug_record(mrb, irep->reps[irep_no], bin, filenames, filenames_len);
+ bin += len;
+ size += len;
+ }
+
+ mrb_assert(size == get_debug_record_size(mrb, irep));
+ return size;
+}
+
+static int
+write_section_debug(mrb_state *mrb, mrb_irep *irep, uint8_t *cur, mrb_sym const *filenames, uint16_t filenames_len)
+{
+ size_t section_size = 0;
+ const uint8_t *bin = cur;
+ struct rite_section_debug_header *header;
+ size_t dlen;
+ uint16_t i;
+ char const *sym; mrb_int sym_len;
+
+ if (mrb == NULL || cur == NULL) {
+ return MRB_DUMP_INVALID_ARGUMENT;
+ }
+
+ header = (struct rite_section_debug_header *)bin;
+ cur += sizeof(struct rite_section_debug_header);
+ section_size += sizeof(struct rite_section_debug_header);
+
+ /* filename table */
+ cur += uint16_to_bin(filenames_len, cur);
+ section_size += sizeof(uint16_t);
+ for (i = 0; i < filenames_len; ++i) {
+ sym = mrb_sym2name_len(mrb, filenames[i], &sym_len);
+ mrb_assert(sym);
+ cur += uint16_to_bin(sym_len, cur);
+ memcpy(cur, sym, sym_len);
+ cur += sym_len;
+ section_size += sizeof(uint16_t) + sym_len;
+ }
+
+ /* debug records */
+ dlen = write_debug_record(mrb, irep, cur, filenames, filenames_len);
+ section_size += dlen;
+
+ memcpy(header->section_identify, RITE_SECTION_DEBUG_IDENTIFIER, sizeof(header->section_identify));
+ mrb_assert(section_size <= INT32_MAX);
+ uint32_to_bin(section_size, header->section_size);
+
+ return MRB_DUMP_OK;
+}
+
+static void
+create_lv_sym_table(mrb_state *mrb, const mrb_irep *irep, mrb_sym **syms, uint32_t *syms_len)
+{
+ size_t i;
+
+ if (*syms == NULL) {
+ *syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym) * 1);
+ }
+
+ for (i = 0; i + 1 < irep->nlocals; ++i) {
+ mrb_sym const name = irep->lv[i].name;
+ if (name == 0) continue;
+ if (find_filename_index(*syms, *syms_len, name) != -1) continue;
+
+ ++(*syms_len);
+ *syms = (mrb_sym*)mrb_realloc(mrb, *syms, sizeof(mrb_sym) * (*syms_len));
+ (*syms)[*syms_len - 1] = name;
+ }
+
+ for (i = 0; i < irep->rlen; ++i) {
+ create_lv_sym_table(mrb, irep->reps[i], syms, syms_len);
+ }
+}
+
+static int
+write_lv_sym_table(mrb_state *mrb, uint8_t **start, mrb_sym const *syms, uint32_t syms_len)
+{
+ uint8_t *cur = *start;
+ uint32_t i;
+ const char *str;
+ mrb_int str_len;
+
+ cur += uint32_to_bin(syms_len, cur);
+
+ for (i = 0; i < syms_len; ++i) {
+ str = mrb_sym2name_len(mrb, syms[i], &str_len);
+ cur += uint16_to_bin(str_len, cur);
+ memcpy(cur, str, str_len);
+ cur += str_len;
+ }
+
+ *start = cur;
+
+ return MRB_DUMP_OK;
+}
+
+static int
+write_lv_record(mrb_state *mrb, const mrb_irep *irep, uint8_t **start, mrb_sym const *syms, uint32_t syms_len)
+{
+ uint8_t *cur = *start;
+ size_t i;
+
+ for (i = 0; i + 1 < irep->nlocals; ++i) {
+ if (irep->lv[i].name == 0) {
+ cur += uint16_to_bin(RITE_LV_NULL_MARK, cur);
+ cur += uint16_to_bin(0, cur);
+ }
+ else {
+ int const sym_idx = find_filename_index(syms, syms_len, irep->lv[i].name);
+ mrb_assert(sym_idx != -1); /* local variable name must be in syms */
+
+ cur += uint16_to_bin(sym_idx, cur);
+ cur += uint16_to_bin(irep->lv[i].r, cur);
+ }
+ }
+
+ for (i = 0; i < irep->rlen; ++i) {
+ write_lv_record(mrb, irep->reps[i], &cur, syms, syms_len);
+ }
+
+ *start = cur;
+
+ return MRB_DUMP_OK;
+}
+
+static size_t
+get_lv_record_size(mrb_state *mrb, mrb_irep *irep)
+{
+ size_t ret = 0, i;
+
+ ret += (sizeof(uint16_t) + sizeof(uint16_t)) * (irep->nlocals - 1);
+
+ for (i = 0; i < irep->rlen; ++i) {
+ ret += get_lv_record_size(mrb, irep->reps[i]);
+ }
+
+ return ret;
+}
+
+static size_t
+get_lv_section_size(mrb_state *mrb, mrb_irep *irep, mrb_sym const *syms, uint32_t syms_len)
+{
+ size_t ret = 0, i;
+
+ ret += sizeof(uint32_t); /* syms_len */
+ ret += sizeof(uint16_t) * syms_len; /* symbol name lengths */
+ for (i = 0; i < syms_len; ++i) {
+ mrb_int str_len;
+ mrb_sym2name_len(mrb, syms[i], &str_len);
+ ret += str_len;
+ }
+
+ ret += get_lv_record_size(mrb, irep);
+
+ return ret;
+}
+
+static int
+write_section_lv(mrb_state *mrb, mrb_irep *irep, uint8_t *start, mrb_sym const *syms, uint32_t const syms_len)
+{
+ uint8_t *cur = start;
+ struct rite_section_lv_header *header;
+ ptrdiff_t diff;
+ int result = MRB_DUMP_OK;
+
+ if (mrb == NULL || cur == NULL) {
+ return MRB_DUMP_INVALID_ARGUMENT;
+ }
+
+ header = (struct rite_section_lv_header*)cur;
+ cur += sizeof(struct rite_section_lv_header);
+
+ result = write_lv_sym_table(mrb, &cur, syms, syms_len);
+ if (result != MRB_DUMP_OK) {
+ goto lv_section_exit;
+ }
+
+ result = write_lv_record(mrb, irep, &cur, syms, syms_len);
+ if (result != MRB_DUMP_OK) {
+ goto lv_section_exit;
+ }
+
+ memcpy(header->section_identify, RITE_SECTION_LV_IDENTIFIER, sizeof(header->section_identify));
+
+ diff = cur - start;
+ mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
+ uint32_to_bin(diff, header->section_size);
+
+lv_section_exit:
+ return result;
+}
+
+static int
+write_rite_binary_header(mrb_state *mrb, size_t binary_size, uint8_t *bin, uint8_t flags)
+{
+ struct rite_binary_header *header = (struct rite_binary_header *)bin;
+ uint16_t crc;
+ uint32_t offset;
+
+ if (flags & FLAG_BYTEORDER_NATIVE) {
+ uint32_t ident = 0;
+ size_t i;
+
+ for(i=0; i<sizeof(ident); i++) {
+ ident<<=8;
+ ident|=RITE_BINARY_IDENTIFIER[i];
+ }
+ memcpy(header->binary_identify, (char*)&ident, sizeof(uint32_t));
+ }
+ else {
+ memcpy(header->binary_identify, RITE_BINARY_IDENTIFIER, sizeof(header->binary_identify));
+ }
+ memcpy(header->binary_version, RITE_BINARY_FORMAT_VER, sizeof(header->binary_version));
+ memcpy(header->compiler_name, RITE_COMPILER_NAME, sizeof(header->compiler_name));
+ memcpy(header->compiler_version, RITE_COMPILER_VERSION, sizeof(header->compiler_version));
+ mrb_assert(binary_size <= UINT32_MAX);
+ uint32_to_bin((uint32_t)binary_size, header->binary_size);
+
+ offset = (&(header->binary_crc[0]) - bin) + sizeof(uint16_t);
+ crc = calc_crc_16_ccitt(bin + offset, binary_size - offset, 0);
+ uint16_to_bin(crc, header->binary_crc);
+
+ return MRB_DUMP_OK;
+}
+
+static mrb_bool
+is_debug_info_defined(mrb_irep *irep)
+{
+ size_t i;
+
+ if (!irep->debug_info) return FALSE;
+ for (i=0; i<irep->rlen; i++) {
+ if (!is_debug_info_defined(irep->reps[i])) return FALSE;
+ }
+ return TRUE;
+}
+
+static mrb_bool
+is_lv_defined(mrb_irep *irep)
+{
+ size_t i;
+
+ if (irep->lv) { return TRUE; }
+
+ for (i = 0; i < irep->rlen; ++i) {
+ if (is_lv_defined(irep->reps[i])) { return TRUE; }
+ }
+
+ return FALSE;
+}
+
+static int
+dump_irep(mrb_state *mrb, mrb_irep *irep, int debug_info, uint8_t **bin, size_t *bin_size, uint8_t flags)
+{
+ int result = MRB_DUMP_GENERAL_FAILURE;
+ size_t malloc_size;
+ size_t section_irep_size;
+ size_t section_lineno_size = 0, section_lv_size = 0;
+ uint8_t *cur = NULL;
+ mrb_bool const debug_info_defined = is_debug_info_defined(irep), lv_defined = is_lv_defined(irep);
+ mrb_sym *lv_syms = NULL; uint32_t lv_syms_len = 0;
+ mrb_sym *filenames = NULL; uint16_t filenames_len = 0;
+
+ if (mrb == NULL) {
+ *bin = NULL;
+ return MRB_DUMP_GENERAL_FAILURE;
+ }
+
+ section_irep_size = sizeof(struct rite_section_irep_header);
+ section_irep_size += get_irep_record_size(mrb, irep);
+
+ /* DEBUG section size */
+ if (debug_info) {
+ if (debug_info_defined) {
+ section_lineno_size += sizeof(struct rite_section_debug_header);
+ /* filename table */
+ filenames = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym) + 1);
+
+ /* filename table size */
+ section_lineno_size += sizeof(uint16_t);
+ section_lineno_size += get_filename_table_size(mrb, irep, &filenames, &filenames_len);
+
+ section_lineno_size += get_debug_record_size(mrb, irep);
+ }
+ else {
+ section_lineno_size += sizeof(struct rite_section_lineno_header);
+ section_lineno_size += get_lineno_record_size(mrb, irep);
+ }
+ }
+
+ if (lv_defined) {
+ section_lv_size += sizeof(struct rite_section_lv_header);
+ create_lv_sym_table(mrb, irep, &lv_syms, &lv_syms_len);
+ section_lv_size += get_lv_section_size(mrb, irep, lv_syms, lv_syms_len);
+ }
+
+ malloc_size = sizeof(struct rite_binary_header) +
+ section_irep_size + section_lineno_size + section_lv_size +
+ sizeof(struct rite_binary_footer);
+ cur = *bin = (uint8_t*)mrb_malloc(mrb, malloc_size);
+ cur += sizeof(struct rite_binary_header);
+
+ result = write_section_irep(mrb, irep, cur, §ion_irep_size, flags);
+ if (result != MRB_DUMP_OK) {
+ goto error_exit;
+ }
+ cur += section_irep_size;
+ *bin_size = sizeof(struct rite_binary_header) +
+ section_irep_size + section_lineno_size + section_lv_size +
+ sizeof(struct rite_binary_footer);
+
+ /* write DEBUG section */
+ if (debug_info) {
+ if (debug_info_defined) {
+ result = write_section_debug(mrb, irep, cur, filenames, filenames_len);
+ }
+ else {
+ result = write_section_lineno(mrb, irep, cur);
+ }
+ if (result != MRB_DUMP_OK) {
+ goto error_exit;
+ }
+ cur += section_lineno_size;
+ }
+
+ if (lv_defined) {
+ result = write_section_lv(mrb, irep, cur, lv_syms, lv_syms_len);
+ if (result != MRB_DUMP_OK) {
+ goto error_exit;
+ }
+ cur += section_lv_size;
+ }
+
+ write_footer(mrb, cur);
+ write_rite_binary_header(mrb, *bin_size, *bin, flags);
+
+error_exit:
+ if (result != MRB_DUMP_OK) {
+ mrb_free(mrb, *bin);
+ *bin = NULL;
+ }
+ if (lv_syms) {
+ mrb_free(mrb, lv_syms);
+ }
+ if (filenames) {
+ mrb_free(mrb, filenames);
+ }
+ return result;
+}
+
+int
+mrb_dump_irep(mrb_state *mrb, mrb_irep *irep, int debug_info, uint8_t **bin, size_t *bin_size)
+{
+ return dump_irep(mrb, irep, debug_info, bin, bin_size, FLAG_BYTEORDER_NONATIVE);
+}
+
+int
+mrb_dump_irep_binary(mrb_state *mrb, mrb_irep *irep, int debug_info, FILE* fp)
+{
+ uint8_t *bin = NULL;
+ size_t bin_size = 0;
+ int result;
+
+ if (fp == NULL) {
+ return MRB_DUMP_INVALID_ARGUMENT;
+ }
+
+ result = dump_irep(mrb, irep, debug_info, &bin, &bin_size, FLAG_BYTEORDER_NONATIVE);
+ if (result == MRB_DUMP_OK) {
+ if (fwrite(bin, sizeof(bin[0]), bin_size, fp) != bin_size) {
+ result = MRB_DUMP_WRITE_FAULT;
+ }
+ }
+
+ mrb_free(mrb, bin);
+ return result;
+}
+
+static mrb_bool
+is_valid_c_symbol_name(const char *name)
+{
+ const char *c = NULL;
+
+ if (name == NULL || name[0] == '\0') return FALSE;
+ if (!ISALPHA(name[0]) && name[0] != '_') return FALSE;
+
+ c = &name[1];
+ for (; *c != '\0'; ++c) {
+ if (!ISALNUM(*c) && *c != '_') return FALSE;
+ }
+
+ return TRUE;
+}
+
+int
+mrb_dump_irep_cfunc(mrb_state *mrb, mrb_irep *irep, int debug_info, FILE *fp, const char *initname)
+{
+ uint8_t *bin = NULL;
+ size_t bin_size = 0, bin_idx = 0;
+ int result;
+
+ if (fp == NULL || initname == NULL || !is_valid_c_symbol_name(initname)) {
+ return MRB_DUMP_INVALID_ARGUMENT;
+ }
+
+ result = dump_irep(mrb, irep, debug_info, &bin, &bin_size, FLAG_BYTEORDER_NATIVE);
+ if (result == MRB_DUMP_OK) {
+ if (fprintf(fp, "#include <stdint.h>\n") < 0) { /* for uint8_t under at least Darwin */
+ mrb_free(mrb, bin);
+ return MRB_DUMP_WRITE_FAULT;
+ }
+ if (fprintf(fp,
+ "const uint8_t\n"
+ "#if defined __GNUC__\n"
+ "__attribute__((aligned(%u)))\n"
+ "#elif defined _MSC_VER\n"
+ "__declspec(align(%u))\n"
+ "#endif\n"
+ "%s[] = {",
+ (uint16_t)MRB_DUMP_ALIGNMENT, (uint16_t)MRB_DUMP_ALIGNMENT, initname) < 0) {
+ mrb_free(mrb, bin);
+ return MRB_DUMP_WRITE_FAULT;
+ }
+ while (bin_idx < bin_size) {
+ if (bin_idx % 16 == 0) {
+ if (fputs("\n", fp) == EOF) {
+ mrb_free(mrb, bin);
+ return MRB_DUMP_WRITE_FAULT;
+ }
+ }
+ if (fprintf(fp, "0x%02x,", bin[bin_idx++]) < 0) {
+ mrb_free(mrb, bin);
+ return MRB_DUMP_WRITE_FAULT;
+ }
+ }
+ if (fputs("\n};\n", fp) == EOF) {
+ mrb_free(mrb, bin);
+ return MRB_DUMP_WRITE_FAULT;
+ }
+ }
+
+ mrb_free(mrb, bin);
+ return result;
+}
+
+#endif /* ENABLE_STDIO */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/enum.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,15 @@
+/*
+** enum.c - Enumerable module
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+
+void
+mrb_init_enumerable(mrb_state *mrb)
+{
+ mrb_define_module(mrb, "Enumerable"); /* 15.3.2 */
+}
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/error.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,462 @@
+/*
+** error.c - Exception class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/irep.h"
+#include "mruby/proc.h"
+#include "mruby/string.h"
+#include "mruby/variable.h"
+#include "mruby/debug.h"
+#include "mruby/error.h"
+#include "mruby/class.h"
+#include "mrb_throw.h"
+
+MRB_API mrb_value
+mrb_exc_new(mrb_state *mrb, struct RClass *c, const char *ptr, long len)
+{
+ mrb_value arg = mrb_str_new(mrb, ptr, len);
+ return mrb_obj_new(mrb, c, 1, &arg);
+}
+
+MRB_API mrb_value
+mrb_exc_new_str(mrb_state *mrb, struct RClass* c, mrb_value str)
+{
+ str = mrb_str_to_str(mrb, str);
+ return mrb_obj_new(mrb, c, 1, &str);
+}
+
+/*
+ * call-seq:
+ * Exception.new(msg = nil) -> exception
+ *
+ * Construct a new Exception object, optionally passing in
+ * a message.
+ */
+
+static mrb_value
+exc_initialize(mrb_state *mrb, mrb_value exc)
+{
+ mrb_value mesg;
+
+ if (mrb_get_args(mrb, "|o", &mesg) == 1) {
+ mrb_iv_set(mrb, exc, mrb_intern_lit(mrb, "mesg"), mesg);
+ }
+ return exc;
+}
+
+/*
+ * Document-method: exception
+ *
+ * call-seq:
+ * exc.exception(string) -> an_exception or exc
+ *
+ * With no argument, or if the argument is the same as the receiver,
+ * return the receiver. Otherwise, create a new
+ * exception object of the same class as the receiver, but with a
+ * message equal to <code>string.to_str</code>.
+ *
+ */
+
+static mrb_value
+exc_exception(mrb_state *mrb, mrb_value self)
+{
+ mrb_value exc;
+ mrb_value a;
+ int argc;
+
+ argc = mrb_get_args(mrb, "|o", &a);
+ if (argc == 0) return self;
+ if (mrb_obj_equal(mrb, self, a)) return self;
+ exc = mrb_obj_clone(mrb, self);
+ mrb_iv_set(mrb, exc, mrb_intern_lit(mrb, "mesg"), a);
+
+ return exc;
+}
+
+/*
+ * call-seq:
+ * exception.to_s -> string
+ *
+ * Returns exception's message (or the name of the exception if
+ * no message is set).
+ */
+
+static mrb_value
+exc_to_s(mrb_state *mrb, mrb_value exc)
+{
+ mrb_value mesg = mrb_attr_get(mrb, exc, mrb_intern_lit(mrb, "mesg"));
+ struct RObject *p;
+
+ if (!mrb_string_p(mesg)) {
+ return mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, exc));
+ }
+ p = mrb_obj_ptr(mesg);
+ if (!p->c) {
+ p->c = mrb->string_class;
+ }
+ return mesg;
+}
+
+/*
+ * call-seq:
+ * exception.message -> string
+ *
+ * Returns the result of invoking <code>exception.to_s</code>.
+ * Normally this returns the exception's message or name. By
+ * supplying a to_str method, exceptions are agreeing to
+ * be used where Strings are expected.
+ */
+
+static mrb_value
+exc_message(mrb_state *mrb, mrb_value exc)
+{
+ return mrb_funcall(mrb, exc, "to_s", 0);
+}
+
+/*
+ * call-seq:
+ * exception.inspect -> string
+ *
+ * Returns this exception's file name, line number,
+ * message and class name.
+ * If file name or line number is not set,
+ * returns message and class name.
+ */
+
+static mrb_value
+exc_inspect(mrb_state *mrb, mrb_value exc)
+{
+ mrb_value str, mesg, file, line;
+ mrb_bool append_mesg;
+
+ mesg = mrb_attr_get(mrb, exc, mrb_intern_lit(mrb, "mesg"));
+ file = mrb_attr_get(mrb, exc, mrb_intern_lit(mrb, "file"));
+ line = mrb_attr_get(mrb, exc, mrb_intern_lit(mrb, "line"));
+
+ append_mesg = !mrb_nil_p(mesg);
+ if (append_mesg) {
+ mesg = mrb_obj_as_string(mrb, mesg);
+ append_mesg = RSTRING_LEN(mesg) > 0;
+ }
+
+ if (!mrb_nil_p(file) && !mrb_nil_p(line)) {
+ str = mrb_str_dup(mrb, file);
+ mrb_str_cat_lit(mrb, str, ":");
+ mrb_str_append(mrb, str, line);
+ mrb_str_cat_lit(mrb, str, ": ");
+ if (append_mesg) {
+ mrb_str_append(mrb, str, mesg);
+ mrb_str_cat_lit(mrb, str, " (");
+ }
+ mrb_str_cat_cstr(mrb, str, mrb_obj_classname(mrb, exc));
+ if (append_mesg) {
+ mrb_str_cat_lit(mrb, str, ")");
+ }
+ }
+ else {
+ const char *cname = mrb_obj_classname(mrb, exc);
+ str = mrb_str_new_cstr(mrb, cname);
+ mrb_str_cat_lit(mrb, str, ": ");
+ if (append_mesg) {
+ mrb_str_append(mrb, str, mesg);
+ }
+ else {
+ mrb_str_cat_cstr(mrb, str, cname);
+ }
+ }
+ return str;
+}
+
+
+static void
+exc_debug_info(mrb_state *mrb, struct RObject *exc)
+{
+ mrb_callinfo *ci = mrb->c->ci;
+ mrb_code *pc = ci->pc;
+
+ mrb_obj_iv_set(mrb, exc, mrb_intern_lit(mrb, "ciidx"), mrb_fixnum_value((mrb_int)(ci - mrb->c->cibase)));
+ while (ci >= mrb->c->cibase) {
+ mrb_code *err = ci->err;
+
+ if (!err && pc) err = pc - 1;
+ if (err && ci->proc && !MRB_PROC_CFUNC_P(ci->proc)) {
+ mrb_irep *irep = ci->proc->body.irep;
+
+ int32_t const line = mrb_debug_get_line(irep, (uint32_t)(err - irep->iseq));
+ char const* file = mrb_debug_get_filename(irep, (uint32_t)(err - irep->iseq));
+ if (line != -1 && file) {
+ mrb_obj_iv_set(mrb, exc, mrb_intern_lit(mrb, "file"), mrb_str_new_cstr(mrb, file));
+ mrb_obj_iv_set(mrb, exc, mrb_intern_lit(mrb, "line"), mrb_fixnum_value(line));
+ return;
+ }
+ }
+ pc = ci->pc;
+ ci--;
+ }
+}
+
+MRB_API mrb_noreturn void
+mrb_exc_raise(mrb_state *mrb, mrb_value exc)
+{
+ mrb->exc = mrb_obj_ptr(exc);
+ if (!mrb->out_of_memory) {
+ exc_debug_info(mrb, mrb->exc);
+ }
+ if (!mrb->jmp) {
+ mrb_p(mrb, exc);
+ abort();
+ }
+ MRB_THROW(mrb->jmp);
+}
+
+MRB_API mrb_noreturn void
+mrb_raise(mrb_state *mrb, struct RClass *c, const char *msg)
+{
+ mrb_value mesg;
+ mesg = mrb_str_new_cstr(mrb, msg);
+ mrb_exc_raise(mrb, mrb_exc_new_str(mrb, c, mesg));
+}
+
+MRB_API mrb_value
+mrb_vformat(mrb_state *mrb, const char *format, va_list ap)
+{
+ const char *p = format;
+ const char *b = p;
+ ptrdiff_t size;
+ mrb_value ary = mrb_ary_new_capa(mrb, 4);
+
+ while (*p) {
+ const char c = *p++;
+
+ if (c == '%') {
+ if (*p == 'S') {
+ size = p - b - 1;
+ mrb_ary_push(mrb, ary, mrb_str_new(mrb, b, size));
+ mrb_ary_push(mrb, ary, va_arg(ap, mrb_value));
+ b = p + 1;
+ }
+ }
+ else if (c == '\\') {
+ if (*p) {
+ size = p - b - 1;
+ mrb_ary_push(mrb, ary, mrb_str_new(mrb, b, size));
+ mrb_ary_push(mrb, ary, mrb_str_new(mrb, p, 1));
+ b = ++p;
+ }
+ else {
+ break;
+ }
+ }
+ }
+ if (b == format) {
+ return mrb_str_new_cstr(mrb, format);
+ }
+ else {
+ size = p - b;
+ mrb_ary_push(mrb, ary, mrb_str_new(mrb, b, size));
+ return mrb_ary_join(mrb, ary, mrb_str_new(mrb, NULL, 0));
+ }
+}
+
+MRB_API mrb_value
+mrb_format(mrb_state *mrb, const char *format, ...)
+{
+ va_list ap;
+ mrb_value str;
+
+ va_start(ap, format);
+ str = mrb_vformat(mrb, format, ap);
+ va_end(ap);
+
+ return str;
+}
+
+MRB_API mrb_noreturn void
+mrb_raisef(mrb_state *mrb, struct RClass *c, const char *fmt, ...)
+{
+ va_list args;
+ mrb_value mesg;
+
+ va_start(args, fmt);
+ mesg = mrb_vformat(mrb, fmt, args);
+ va_end(args);
+ mrb_exc_raise(mrb, mrb_exc_new_str(mrb, c, mesg));
+}
+
+MRB_API mrb_noreturn void
+mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...)
+{
+ mrb_value exc;
+ mrb_value argv[2];
+ va_list args;
+
+ va_start(args, fmt);
+ argv[0] = mrb_vformat(mrb, fmt, args);
+ va_end(args);
+
+ argv[1] = mrb_symbol_value(id);
+ exc = mrb_obj_new(mrb, E_NAME_ERROR, 2, argv);
+ mrb_exc_raise(mrb, exc);
+}
+
+MRB_API void
+mrb_warn(mrb_state *mrb, const char *fmt, ...)
+{
+#ifdef ENABLE_STDIO
+ va_list ap;
+ mrb_value str;
+
+ va_start(ap, fmt);
+ str = mrb_vformat(mrb, fmt, ap);
+ fputs("warning: ", stderr);
+ fwrite(RSTRING_PTR(str), RSTRING_LEN(str), 1, stderr);
+ va_end(ap);
+#endif
+}
+
+MRB_API mrb_noreturn void
+mrb_bug(mrb_state *mrb, const char *fmt, ...)
+{
+#ifdef ENABLE_STDIO
+ va_list ap;
+ mrb_value str;
+
+ va_start(ap, fmt);
+ str = mrb_vformat(mrb, fmt, ap);
+ fputs("bug: ", stderr);
+ fwrite(RSTRING_PTR(str), RSTRING_LEN(str), 1, stderr);
+ va_end(ap);
+#endif
+ exit(EXIT_FAILURE);
+}
+
+static void
+set_backtrace(mrb_state *mrb, mrb_value info, mrb_value bt)
+{
+ mrb_funcall(mrb, info, "set_backtrace", 1, bt);
+}
+
+static mrb_value
+make_exception(mrb_state *mrb, int argc, const mrb_value *argv, mrb_bool isstr)
+{
+ mrb_value mesg;
+ int n;
+
+ mesg = mrb_nil_value();
+ switch (argc) {
+ case 0:
+ break;
+ case 1:
+ if (mrb_nil_p(argv[0]))
+ break;
+ if (isstr) {
+ mesg = mrb_check_string_type(mrb, argv[0]);
+ if (!mrb_nil_p(mesg)) {
+ mesg = mrb_exc_new_str(mrb, E_RUNTIME_ERROR, mesg);
+ break;
+ }
+ }
+ n = 0;
+ goto exception_call;
+
+ case 2:
+ case 3:
+ n = 1;
+exception_call:
+ {
+ mrb_sym exc = mrb_intern_lit(mrb, "exception");
+ if (mrb_respond_to(mrb, argv[0], exc)) {
+ mesg = mrb_funcall_argv(mrb, argv[0], exc, n, argv+1);
+ }
+ else {
+ /* undef */
+ mrb_raise(mrb, E_TYPE_ERROR, "exception class/object expected");
+ }
+ }
+
+ break;
+ default:
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (%S for 0..3)", mrb_fixnum_value(argc));
+ break;
+ }
+ if (argc > 0) {
+ if (!mrb_obj_is_kind_of(mrb, mesg, mrb->eException_class))
+ mrb_raise(mrb, E_TYPE_ERROR, "exception object expected");
+ if (argc > 2)
+ set_backtrace(mrb, mesg, argv[2]);
+ }
+
+ return mesg;
+}
+
+MRB_API mrb_value
+mrb_make_exception(mrb_state *mrb, int argc, const mrb_value *argv)
+{
+ return make_exception(mrb, argc, argv, TRUE);
+}
+
+MRB_API void
+mrb_sys_fail(mrb_state *mrb, const char *mesg)
+{
+ struct RClass *sce;
+ mrb_int no;
+
+ no = (mrb_int)errno;
+ if (mrb_class_defined(mrb, "SystemCallError")) {
+ sce = mrb_class_get(mrb, "SystemCallError");
+ if (mesg != NULL) {
+ mrb_funcall(mrb, mrb_obj_value(sce), "_sys_fail", 2, mrb_fixnum_value(no), mrb_str_new_cstr(mrb, mesg));
+ }
+ else {
+ mrb_funcall(mrb, mrb_obj_value(sce), "_sys_fail", 1, mrb_fixnum_value(no));
+ }
+ }
+ else {
+ mrb_raise(mrb, E_RUNTIME_ERROR, mesg);
+ }
+}
+
+MRB_API mrb_noreturn void
+mrb_no_method_error(mrb_state *mrb, mrb_sym id, mrb_int argc, const mrb_value *argv, char const* fmt, ...)
+{
+ mrb_value exc;
+ va_list ap;
+
+ va_start(ap, fmt);
+ exc = mrb_funcall(mrb, mrb_obj_value(E_NOMETHOD_ERROR), "new", 3,
+ mrb_vformat(mrb, fmt, ap), mrb_symbol_value(id),
+ mrb_ary_new_from_values(mrb, argc, argv));
+ va_end(ap);
+ mrb_exc_raise(mrb, exc);
+}
+
+void
+mrb_init_exception(mrb_state *mrb)
+{
+ struct RClass *exception, *runtime_error, *script_error;
+
+ mrb->eException_class = exception = mrb_define_class(mrb, "Exception", mrb->object_class); /* 15.2.22 */
+ MRB_SET_INSTANCE_TT(exception, MRB_TT_EXCEPTION);
+ mrb_define_class_method(mrb, exception, "exception", mrb_instance_new, MRB_ARGS_ANY());
+ mrb_define_method(mrb, exception, "exception", exc_exception, MRB_ARGS_ANY());
+ mrb_define_method(mrb, exception, "initialize", exc_initialize, MRB_ARGS_ANY());
+ mrb_define_method(mrb, exception, "to_s", exc_to_s, MRB_ARGS_NONE());
+ mrb_define_method(mrb, exception, "message", exc_message, MRB_ARGS_NONE());
+ mrb_define_method(mrb, exception, "inspect", exc_inspect, MRB_ARGS_NONE());
+ mrb_define_method(mrb, exception, "backtrace", mrb_exc_backtrace, MRB_ARGS_NONE());
+
+ mrb->eStandardError_class = mrb_define_class(mrb, "StandardError", mrb->eException_class); /* 15.2.23 */
+ runtime_error = mrb_define_class(mrb, "RuntimeError", mrb->eStandardError_class); /* 15.2.28 */
+ mrb->nomem_err = mrb_obj_ptr(mrb_exc_new_str(mrb, runtime_error, mrb_str_new_lit(mrb, "Out of memory")));
+ script_error = mrb_define_class(mrb, "ScriptError", mrb->eException_class); /* 15.2.37 */
+ mrb_define_class(mrb, "SyntaxError", script_error); /* 15.2.38 */
+ mrb_define_class(mrb, "SystemStackError", exception);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/error.h Wed Mar 25 17:36:16 2015 +0000 @@ -0,0 +1,4 @@ +/* this header file is to be removed soon. + added for compatibility purpose (1.0.0) */ +#include "mruby/error.h" +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/etc.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,223 @@
+/*
+** etc.c -
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/string.h"
+#include "mruby/data.h"
+#include "mruby/class.h"
+#include "mruby/re.h"
+#include "mruby/irep.h"
+
+MRB_API struct RData*
+mrb_data_object_alloc(mrb_state *mrb, struct RClass *klass, void *ptr, const mrb_data_type *type)
+{
+ struct RData *data;
+
+ data = (struct RData*)mrb_obj_alloc(mrb, MRB_TT_DATA, klass);
+ data->data = ptr;
+ data->type = type;
+
+ return data;
+}
+
+MRB_API void
+mrb_data_check_type(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
+{
+ if (mrb_immediate_p(obj) || (mrb_type(obj) != MRB_TT_DATA)) {
+ mrb_check_type(mrb, obj, MRB_TT_DATA);
+ }
+ if (DATA_TYPE(obj) != type) {
+ const mrb_data_type *t2 = DATA_TYPE(obj);
+
+ if (t2) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %S (expected %S)",
+ mrb_str_new_cstr(mrb, t2->struct_name), mrb_str_new_cstr(mrb, type->struct_name));
+ }
+ else {
+ struct RClass *c = mrb_class(mrb, obj);
+
+ mrb_raisef(mrb, E_TYPE_ERROR, "uninitialized %S (expected %S)",
+ mrb_obj_value(c), mrb_str_new_cstr(mrb, type->struct_name));
+ }
+ }
+}
+
+MRB_API void*
+mrb_data_check_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
+{
+ if (mrb_immediate_p(obj) || (mrb_type(obj) != MRB_TT_DATA)) {
+ return NULL;
+ }
+ if (DATA_TYPE(obj) != type) {
+ return NULL;
+ }
+ return DATA_PTR(obj);
+}
+
+MRB_API void*
+mrb_data_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
+{
+ mrb_data_check_type(mrb, obj, type);
+ return DATA_PTR(obj);
+}
+
+MRB_API mrb_sym
+mrb_obj_to_sym(mrb_state *mrb, mrb_value name)
+{
+ mrb_value tmp;
+ mrb_sym id;
+
+ switch (mrb_type(name)) {
+ default:
+ tmp = mrb_check_string_type(mrb, name);
+ if (mrb_nil_p(tmp)) {
+ tmp = mrb_inspect(mrb, name);
+ mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", tmp);
+ }
+ name = tmp;
+ /* fall through */
+ case MRB_TT_STRING:
+ name = mrb_str_intern(mrb, name);
+ /* fall through */
+ case MRB_TT_SYMBOL:
+ id = mrb_symbol(name);
+ }
+ return id;
+}
+
+MRB_API mrb_int
+mrb_float_id(mrb_float f)
+{
+ const char *p = (const char*)&f;
+ int len = sizeof(f);
+ mrb_int id = 0;
+
+ while (len--) {
+ id = id*65599 + *p;
+ p++;
+ }
+ id = id + (id>>5);
+
+ return id;
+}
+
+MRB_API mrb_int
+mrb_obj_id(mrb_value obj)
+{
+ mrb_int tt = mrb_type(obj);
+
+#define MakeID2(p,t) (mrb_int)(((intptr_t)(p))^(t))
+#define MakeID(p) MakeID2(p,tt)
+
+ switch (tt) {
+ case MRB_TT_FREE:
+ case MRB_TT_UNDEF:
+ return MakeID(0); /* not define */
+ case MRB_TT_FALSE:
+ if (mrb_nil_p(obj))
+ return MakeID(1);
+ return MakeID(0);
+ case MRB_TT_TRUE:
+ return MakeID(1);
+ case MRB_TT_SYMBOL:
+ return MakeID(mrb_symbol(obj));
+ case MRB_TT_FIXNUM:
+ return MakeID2(mrb_float_id((mrb_float)mrb_fixnum(obj)), MRB_TT_FLOAT);
+ case MRB_TT_FLOAT:
+ return MakeID(mrb_float_id(mrb_float(obj)));
+ case MRB_TT_STRING:
+ case MRB_TT_OBJECT:
+ case MRB_TT_CLASS:
+ case MRB_TT_MODULE:
+ case MRB_TT_ICLASS:
+ case MRB_TT_SCLASS:
+ case MRB_TT_PROC:
+ case MRB_TT_ARRAY:
+ case MRB_TT_HASH:
+ case MRB_TT_RANGE:
+ case MRB_TT_EXCEPTION:
+ case MRB_TT_FILE:
+ case MRB_TT_DATA:
+ default:
+ return MakeID(mrb_ptr(obj));
+ }
+}
+
+#ifdef MRB_WORD_BOXING
+MRB_API mrb_value
+mrb_word_boxing_float_value(mrb_state *mrb, mrb_float f)
+{
+ mrb_value v;
+
+ v.value.p = mrb_obj_alloc(mrb, MRB_TT_FLOAT, mrb->float_class);
+ v.value.fp->f = f;
+ return v;
+}
+
+MRB_API mrb_value
+mrb_word_boxing_float_pool(mrb_state *mrb, mrb_float f)
+{
+ struct RFloat *nf = (struct RFloat *)mrb_malloc(mrb, sizeof(struct RFloat));
+ nf->tt = MRB_TT_FLOAT;
+ nf->c = mrb->float_class;
+ nf->f = f;
+ return mrb_obj_value(nf);
+}
+
+MRB_API mrb_value
+mrb_word_boxing_cptr_value(mrb_state *mrb, void *p)
+{
+ mrb_value v;
+
+ v.value.p = mrb_obj_alloc(mrb, MRB_TT_CPTR, mrb->object_class);
+ v.value.vp->p = p;
+ return v;
+}
+#endif /* MRB_WORD_BOXING */
+
+MRB_API mrb_bool
+mrb_regexp_p(mrb_state *mrb, mrb_value v)
+{
+ return mrb_class_defined(mrb, REGEXP_CLASS) && mrb_obj_is_kind_of(mrb, v, mrb_class_get(mrb, REGEXP_CLASS));
+}
+
+#if defined _MSC_VER && _MSC_VER < 1900
+
+#ifndef va_copy
+static void
+mrb_msvc_va_copy(va_list *dest, va_list src)
+{
+ *dest = src;
+}
+#define va_copy(dest, src) mrb_msvc_va_copy(&(dest), src)
+#endif
+
+MRB_API int
+mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg)
+{
+ int cnt;
+ va_list argcp;
+ va_copy(argcp, arg);
+ if (n == 0 || (cnt = _vsnprintf_s(s, n, _TRUNCATE, format, argcp)) < 0) {
+ cnt = _vscprintf(format, arg);
+ }
+ va_end(argcp);
+ return cnt;
+}
+
+MRB_API int
+mrb_msvc_snprintf(char *s, size_t n, const char *format, ...)
+{
+ va_list arg;
+ int ret;
+ va_start(arg, format);
+ ret = mrb_msvc_vsnprintf(s, n, format, arg);
+ va_end(arg);
+ return ret;
+}
+
+#endif /* defined _MSC_VER && _MSC_VER < 1900 */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gc.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,1618 @@
+/*
+** gc.c - garbage collector for mruby
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <string.h>
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/data.h"
+#include "mruby/hash.h"
+#include "mruby/proc.h"
+#include "mruby/range.h"
+#include "mruby/string.h"
+#include "mruby/variable.h"
+#include "mruby/gc.h"
+#include "mruby/error.h"
+
+/*
+ = Tri-color Incremental Garbage Collection
+
+ mruby's GC is Tri-color Incremental GC with Mark & Sweep.
+ Algorithm details are omitted.
+ Instead, the implementation part is described below.
+
+ == Object's Color
+
+ Each object can be painted in three colors:
+
+ * White - Unmarked.
+ * Gray - Marked, But the child objects are unmarked.
+ * Black - Marked, the child objects are also marked.
+
+ == Two White Types
+
+ There're two white color types in a flip-flop fashion: White-A and White-B,
+ which respectively represent the Current White color (the newly allocated
+ objects in the current GC cycle) and the Sweep Target White color (the
+ dead objects to be swept).
+
+ A and B will be switched just at the beginning of the next GC cycle. At
+ that time, all the dead objects have been swept, while the newly created
+ objects in the current GC cycle which finally remains White are now
+ regarded as dead objects. Instead of traversing all the White-A objects and
+ painting them as White-B, just switch the meaning of White-A and White-B as
+ this will be much cheaper.
+
+ As a result, the objects we sweep in the current GC cycle are always
+ left from the previous GC cycle. This allows us to sweep objects
+ incrementally, without the disturbance of the newly created objects.
+
+ == Execution Timing
+
+ GC Execution Time and Each step interval are decided by live objects count.
+ List of Adjustment API:
+
+ * gc_interval_ratio_set
+ * gc_step_ratio_set
+
+ For details, see the comments for each function.
+
+ == Write Barrier
+
+ mruby implementer and C extension library writer must insert a write
+ barrier when updating a reference from a field of an object.
+ When updating a reference from a field of object A to object B,
+ two different types of write barrier are available:
+
+ * mrb_field_write_barrier - target B object for a mark.
+ * mrb_write_barrier - target A object for a mark.
+
+ == Generational Mode
+
+ mruby's GC offers an Generational Mode while re-using the tri-color GC
+ infrastructure. It will treat the Black objects as Old objects after each
+ sweep phase, instead of painting them White. The key ideas are still the same
+ as traditional generational GC:
+
+ * Minor GC - just traverse the Young objects (Gray objects) in the mark
+ phase, then only sweep the newly created objects, and leave
+ the Old objects live.
+
+ * Major GC - same as a full regular GC cycle.
+
+ The difference from "traditional" generational GC is, that the major GC
+ in mruby is triggered incrementally in a tri-color manner.
+
+
+ For details, see the comments for each function.
+
+*/
+
+struct free_obj {
+ MRB_OBJECT_HEADER;
+ struct RBasic *next;
+};
+
+typedef struct {
+ union {
+ struct free_obj free;
+ struct RBasic basic;
+ struct RObject object;
+ struct RClass klass;
+ struct RString string;
+ struct RArray array;
+ struct RHash hash;
+ struct RRange range;
+ struct RData data;
+ struct RProc proc;
+ struct RException exc;
+#ifdef MRB_WORD_BOXING
+ struct RFloat floatv;
+ struct RCptr cptr;
+#endif
+ } as;
+} RVALUE;
+
+#ifdef GC_PROFILE
+#include <stdio.h>
+#include <sys/time.h>
+
+static double program_invoke_time = 0;
+static double gc_time = 0;
+static double gc_total_time = 0;
+
+static double
+gettimeofday_time(void)
+{
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ return tv.tv_sec + tv.tv_usec * 1e-6;
+}
+
+#define GC_INVOKE_TIME_REPORT(with) do {\
+ fprintf(stderr, "%s\n", with);\
+ fprintf(stderr, "gc_invoke: %19.3f\n", gettimeofday_time() - program_invoke_time);\
+ fprintf(stderr, "is_generational: %d\n", is_generational(mrb));\
+ fprintf(stderr, "is_major_gc: %d\n", is_major_gc(mrb));\
+} while(0)
+
+#define GC_TIME_START do {\
+ gc_time = gettimeofday_time();\
+} while(0)
+
+#define GC_TIME_STOP_AND_REPORT do {\
+ gc_time = gettimeofday_time() - gc_time;\
+ gc_total_time += gc_time;\
+ fprintf(stderr, "gc_state: %d\n", mrb->gc_state);\
+ fprintf(stderr, "live: %zu\n", mrb->live);\
+ fprintf(stderr, "majorgc_old_threshold: %zu\n", mrb->majorgc_old_threshold);\
+ fprintf(stderr, "gc_threshold: %zu\n", mrb->gc_threshold);\
+ fprintf(stderr, "gc_time: %30.20f\n", gc_time);\
+ fprintf(stderr, "gc_total_time: %30.20f\n\n", gc_total_time);\
+} while(0)
+#else
+#define GC_INVOKE_TIME_REPORT(s)
+#define GC_TIME_START
+#define GC_TIME_STOP_AND_REPORT
+#endif
+
+#ifdef GC_DEBUG
+#define DEBUG(x) (x)
+#else
+#define DEBUG(x)
+#endif
+
+#define GC_STEP_SIZE 1024
+
+
+MRB_API void*
+mrb_realloc_simple(mrb_state *mrb, void *p, size_t len)
+{
+ void *p2;
+
+ p2 = (mrb->allocf)(mrb, p, len, mrb->allocf_ud);
+ if (!p2 && len > 0 && mrb->heaps) {
+ mrb_full_gc(mrb);
+ p2 = (mrb->allocf)(mrb, p, len, mrb->allocf_ud);
+ }
+
+ return p2;
+}
+
+
+MRB_API void*
+mrb_realloc(mrb_state *mrb, void *p, size_t len)
+{
+ void *p2;
+
+ p2 = mrb_realloc_simple(mrb, p, len);
+ if (!p2 && len) {
+ if (mrb->out_of_memory) {
+ /* mrb_panic(mrb); */
+ }
+ else {
+ mrb->out_of_memory = TRUE;
+ mrb_exc_raise(mrb, mrb_obj_value(mrb->nomem_err));
+ }
+ }
+ else {
+ mrb->out_of_memory = FALSE;
+ }
+
+ return p2;
+}
+
+MRB_API void*
+mrb_malloc(mrb_state *mrb, size_t len)
+{
+ return mrb_realloc(mrb, 0, len);
+}
+
+MRB_API void*
+mrb_malloc_simple(mrb_state *mrb, size_t len)
+{
+ return mrb_realloc_simple(mrb, 0, len);
+}
+
+MRB_API void*
+mrb_calloc(mrb_state *mrb, size_t nelem, size_t len)
+{
+ void *p;
+
+ if (nelem > 0 && len > 0 &&
+ nelem <= SIZE_MAX / len) {
+ size_t size;
+ size = nelem * len;
+ p = mrb_malloc(mrb, size);
+
+ memset(p, 0, size);
+ }
+ else {
+ p = NULL;
+ }
+
+ return p;
+}
+
+MRB_API void
+mrb_free(mrb_state *mrb, void *p)
+{
+ (mrb->allocf)(mrb, p, 0, mrb->allocf_ud);
+}
+
+#ifndef MRB_HEAP_PAGE_SIZE
+#define MRB_HEAP_PAGE_SIZE 1024
+#endif
+
+struct heap_page {
+ struct RBasic *freelist;
+ struct heap_page *prev;
+ struct heap_page *next;
+ struct heap_page *free_next;
+ struct heap_page *free_prev;
+ mrb_bool old:1;
+ RVALUE objects[MRB_HEAP_PAGE_SIZE];
+};
+
+static void
+link_heap_page(mrb_state *mrb, struct heap_page *page)
+{
+ page->next = mrb->heaps;
+ if (mrb->heaps)
+ mrb->heaps->prev = page;
+ mrb->heaps = page;
+}
+
+static void
+unlink_heap_page(mrb_state *mrb, struct heap_page *page)
+{
+ if (page->prev)
+ page->prev->next = page->next;
+ if (page->next)
+ page->next->prev = page->prev;
+ if (mrb->heaps == page)
+ mrb->heaps = page->next;
+ page->prev = NULL;
+ page->next = NULL;
+}
+
+static void
+link_free_heap_page(mrb_state *mrb, struct heap_page *page)
+{
+ page->free_next = mrb->free_heaps;
+ if (mrb->free_heaps) {
+ mrb->free_heaps->free_prev = page;
+ }
+ mrb->free_heaps = page;
+}
+
+static void
+unlink_free_heap_page(mrb_state *mrb, struct heap_page *page)
+{
+ if (page->free_prev)
+ page->free_prev->free_next = page->free_next;
+ if (page->free_next)
+ page->free_next->free_prev = page->free_prev;
+ if (mrb->free_heaps == page)
+ mrb->free_heaps = page->free_next;
+ page->free_prev = NULL;
+ page->free_next = NULL;
+}
+
+static void
+add_heap(mrb_state *mrb)
+{
+ struct heap_page *page = (struct heap_page *)mrb_calloc(mrb, 1, sizeof(struct heap_page));
+ RVALUE *p, *e;
+ struct RBasic *prev = NULL;
+
+ for (p = page->objects, e=p+MRB_HEAP_PAGE_SIZE; p<e; p++) {
+ p->as.free.tt = MRB_TT_FREE;
+ p->as.free.next = prev;
+ prev = &p->as.basic;
+ }
+ page->freelist = prev;
+
+ link_heap_page(mrb, page);
+ link_free_heap_page(mrb, page);
+}
+
+#define DEFAULT_GC_INTERVAL_RATIO 200
+#define DEFAULT_GC_STEP_RATIO 200
+#define DEFAULT_MAJOR_GC_INC_RATIO 200
+#define is_generational(mrb) ((mrb)->is_generational_gc_mode)
+#define is_major_gc(mrb) (is_generational(mrb) && (mrb)->gc_full)
+#define is_minor_gc(mrb) (is_generational(mrb) && !(mrb)->gc_full)
+
+void
+mrb_init_heap(mrb_state *mrb)
+{
+ mrb->heaps = NULL;
+ mrb->free_heaps = NULL;
+ add_heap(mrb);
+ mrb->gc_interval_ratio = DEFAULT_GC_INTERVAL_RATIO;
+ mrb->gc_step_ratio = DEFAULT_GC_STEP_RATIO;
+#ifndef MRB_GC_TURN_OFF_GENERATIONAL
+ mrb->is_generational_gc_mode = TRUE;
+ mrb->gc_full = TRUE;
+#endif
+
+#ifdef GC_PROFILE
+ program_invoke_time = gettimeofday_time();
+#endif
+}
+
+static void obj_free(mrb_state *mrb, struct RBasic *obj);
+
+void
+mrb_free_heap(mrb_state *mrb)
+{
+ struct heap_page *page = mrb->heaps;
+ struct heap_page *tmp;
+ RVALUE *p, *e;
+
+ while (page) {
+ tmp = page;
+ page = page->next;
+ for (p = tmp->objects, e=p+MRB_HEAP_PAGE_SIZE; p<e; p++) {
+ if (p->as.free.tt != MRB_TT_FREE)
+ obj_free(mrb, &p->as.basic);
+ }
+ mrb_free(mrb, tmp);
+ }
+}
+
+static void
+gc_protect(mrb_state *mrb, struct RBasic *p)
+{
+#ifdef MRB_GC_FIXED_ARENA
+ if (mrb->arena_idx >= MRB_GC_ARENA_SIZE) {
+ /* arena overflow error */
+ mrb->arena_idx = MRB_GC_ARENA_SIZE - 4; /* force room in arena */
+ mrb_raise(mrb, E_RUNTIME_ERROR, "arena overflow error");
+ }
+#else
+ if (mrb->arena_idx >= mrb->arena_capa) {
+ /* extend arena */
+ mrb->arena_capa = (int)(mrb->arena_capa * 1.5);
+ mrb->arena = (struct RBasic**)mrb_realloc(mrb, mrb->arena, sizeof(struct RBasic*)*mrb->arena_capa);
+ }
+#endif
+ mrb->arena[mrb->arena_idx++] = p;
+}
+
+MRB_API void
+mrb_gc_protect(mrb_state *mrb, mrb_value obj)
+{
+ if (mrb_immediate_p(obj)) return;
+ gc_protect(mrb, mrb_basic_ptr(obj));
+}
+
+MRB_API struct RBasic*
+mrb_obj_alloc(mrb_state *mrb, enum mrb_vtype ttype, struct RClass *cls)
+{
+ struct RBasic *p;
+ static const RVALUE RVALUE_zero = { { { MRB_TT_FALSE } } };
+
+#ifdef MRB_GC_STRESS
+ mrb_full_gc(mrb);
+#endif
+ if (mrb->gc_threshold < mrb->live) {
+ mrb_incremental_gc(mrb);
+ }
+ if (mrb->free_heaps == NULL) {
+ add_heap(mrb);
+ }
+
+ p = mrb->free_heaps->freelist;
+ mrb->free_heaps->freelist = ((struct free_obj*)p)->next;
+ if (mrb->free_heaps->freelist == NULL) {
+ unlink_free_heap_page(mrb, mrb->free_heaps);
+ }
+
+ mrb->live++;
+ gc_protect(mrb, p);
+ *(RVALUE *)p = RVALUE_zero;
+ p->tt = ttype;
+ p->c = cls;
+ paint_partial_white(mrb, p);
+ return p;
+}
+
+static inline void
+add_gray_list(mrb_state *mrb, struct RBasic *obj)
+{
+#ifdef MRB_GC_STRESS
+ if (obj->tt > MRB_TT_MAXDEFINE) {
+ abort();
+ }
+#endif
+ paint_gray(obj);
+ obj->gcnext = mrb->gray_list;
+ mrb->gray_list = obj;
+}
+
+static void
+mark_context_stack(mrb_state *mrb, struct mrb_context *c)
+{
+ size_t i;
+ size_t e;
+
+ e = c->stack - c->stbase;
+ if (c->ci) e += c->ci->nregs;
+ if (c->stbase + e > c->stend) e = c->stend - c->stbase;
+ for (i=0; i<e; i++) {
+ mrb_value v = c->stbase[i];
+
+ if (!mrb_immediate_p(v)) {
+ if (mrb_basic_ptr(v)->tt == MRB_TT_FREE) {
+ c->stbase[i] = mrb_nil_value();
+ }
+ else {
+ mrb_gc_mark(mrb, mrb_basic_ptr(v));
+ }
+ }
+ }
+}
+
+static void
+mark_context(mrb_state *mrb, struct mrb_context *c)
+{
+ int i, e = 0;
+ mrb_callinfo *ci;
+
+ /* mark stack */
+ mark_context_stack(mrb, c);
+
+ /* mark VM stack */
+ if (c->cibase) {
+ for (ci = c->cibase; ci <= c->ci; ci++) {
+ if (ci->eidx > e) {
+ e = ci->eidx;
+ }
+ mrb_gc_mark(mrb, (struct RBasic*)ci->env);
+ mrb_gc_mark(mrb, (struct RBasic*)ci->proc);
+ mrb_gc_mark(mrb, (struct RBasic*)ci->target_class);
+ }
+ }
+ /* mark ensure stack */
+ for (i=0; i<e; i++) {
+ mrb_gc_mark(mrb, (struct RBasic*)c->ensure[i]);
+ }
+ /* mark fibers */
+ if (c->prev && c->prev->fib) {
+ mrb_gc_mark(mrb, (struct RBasic*)c->prev->fib);
+ }
+}
+
+static void
+gc_mark_children(mrb_state *mrb, struct RBasic *obj)
+{
+ mrb_assert(is_gray(obj));
+ paint_black(obj);
+ mrb->gray_list = obj->gcnext;
+ mrb_gc_mark(mrb, (struct RBasic*)obj->c);
+ switch (obj->tt) {
+ case MRB_TT_ICLASS:
+ mrb_gc_mark(mrb, (struct RBasic*)((struct RClass*)obj)->super);
+ break;
+
+ case MRB_TT_CLASS:
+ case MRB_TT_MODULE:
+ case MRB_TT_SCLASS:
+ {
+ struct RClass *c = (struct RClass*)obj;
+
+ mrb_gc_mark_mt(mrb, c);
+ mrb_gc_mark(mrb, (struct RBasic*)c->super);
+ }
+ /* fall through */
+
+ case MRB_TT_OBJECT:
+ case MRB_TT_DATA:
+ case MRB_TT_EXCEPTION:
+ mrb_gc_mark_iv(mrb, (struct RObject*)obj);
+ break;
+
+ case MRB_TT_PROC:
+ {
+ struct RProc *p = (struct RProc*)obj;
+
+ mrb_gc_mark(mrb, (struct RBasic*)p->env);
+ mrb_gc_mark(mrb, (struct RBasic*)p->target_class);
+ }
+ break;
+
+ case MRB_TT_ENV:
+ {
+ struct REnv *e = (struct REnv*)obj;
+
+ if (!MRB_ENV_STACK_SHARED_P(e)) {
+ mrb_int i, len;
+
+ len = MRB_ENV_STACK_LEN(e);
+ for (i=0; i<len; i++) {
+ mrb_gc_mark_value(mrb, e->stack[i]);
+ }
+ }
+ }
+ break;
+
+ case MRB_TT_FIBER:
+ {
+ struct mrb_context *c = ((struct RFiber*)obj)->cxt;
+
+ if (c) mark_context(mrb, c);
+ }
+ break;
+
+ case MRB_TT_ARRAY:
+ {
+ struct RArray *a = (struct RArray*)obj;
+ size_t i, e;
+
+ for (i=0,e=a->len; i<e; i++) {
+ mrb_gc_mark_value(mrb, a->ptr[i]);
+ }
+ }
+ break;
+
+ case MRB_TT_HASH:
+ mrb_gc_mark_iv(mrb, (struct RObject*)obj);
+ mrb_gc_mark_hash(mrb, (struct RHash*)obj);
+ break;
+
+ case MRB_TT_STRING:
+ break;
+
+ case MRB_TT_RANGE:
+ {
+ struct RRange *r = (struct RRange*)obj;
+
+ if (r->edges) {
+ mrb_gc_mark_value(mrb, r->edges->beg);
+ mrb_gc_mark_value(mrb, r->edges->end);
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+MRB_API void
+mrb_gc_mark(mrb_state *mrb, struct RBasic *obj)
+{
+ if (obj == 0) return;
+ if (!is_white(obj)) return;
+ mrb_assert((obj)->tt != MRB_TT_FREE);
+ add_gray_list(mrb, obj);
+}
+
+static void
+obj_free(mrb_state *mrb, struct RBasic *obj)
+{
+ DEBUG(printf("obj_free(%p,tt=%d)\n",obj,obj->tt));
+ switch (obj->tt) {
+ /* immediate - no mark */
+ case MRB_TT_TRUE:
+ case MRB_TT_FIXNUM:
+ case MRB_TT_SYMBOL:
+ /* cannot happen */
+ return;
+
+ case MRB_TT_FLOAT:
+#ifdef MRB_WORD_BOXING
+ break;
+#else
+ return;
+#endif
+
+ case MRB_TT_OBJECT:
+ case MRB_TT_EXCEPTION:
+ mrb_gc_free_iv(mrb, (struct RObject*)obj);
+ break;
+
+ case MRB_TT_CLASS:
+ case MRB_TT_MODULE:
+ case MRB_TT_SCLASS:
+ mrb_gc_free_mt(mrb, (struct RClass*)obj);
+ mrb_gc_free_iv(mrb, (struct RObject*)obj);
+ break;
+
+ case MRB_TT_ENV:
+ {
+ struct REnv *e = (struct REnv*)obj;
+
+ if (!MRB_ENV_STACK_SHARED_P(e)) {
+ mrb_free(mrb, e->stack);
+ e->stack = NULL;
+ }
+ }
+ break;
+
+ case MRB_TT_FIBER:
+ {
+ struct mrb_context *c = ((struct RFiber*)obj)->cxt;
+
+ if (c != mrb->root_c)
+ mrb_free_context(mrb, c);
+ }
+ break;
+
+ case MRB_TT_ARRAY:
+ if (ARY_SHARED_P(obj))
+ mrb_ary_decref(mrb, ((struct RArray*)obj)->aux.shared);
+ else
+ mrb_free(mrb, ((struct RArray*)obj)->ptr);
+ break;
+
+ case MRB_TT_HASH:
+ mrb_gc_free_iv(mrb, (struct RObject*)obj);
+ mrb_gc_free_hash(mrb, (struct RHash*)obj);
+ break;
+
+ case MRB_TT_STRING:
+ mrb_gc_free_str(mrb, (struct RString*)obj);
+ break;
+
+ case MRB_TT_PROC:
+ {
+ struct RProc *p = (struct RProc*)obj;
+
+ if (!MRB_PROC_CFUNC_P(p) && p->body.irep) {
+ mrb_irep_decref(mrb, p->body.irep);
+ }
+ }
+ break;
+
+ case MRB_TT_RANGE:
+ mrb_free(mrb, ((struct RRange*)obj)->edges);
+ break;
+
+ case MRB_TT_DATA:
+ {
+ struct RData *d = (struct RData*)obj;
+ if (d->type && d->type->dfree) {
+ d->type->dfree(mrb, d->data);
+ }
+ mrb_gc_free_iv(mrb, (struct RObject*)obj);
+ }
+ break;
+
+ default:
+ break;
+ }
+ obj->tt = MRB_TT_FREE;
+}
+
+static void
+root_scan_phase(mrb_state *mrb)
+{
+ size_t i, e;
+
+ if (!is_minor_gc(mrb)) {
+ mrb->gray_list = NULL;
+ mrb->atomic_gray_list = NULL;
+ }
+
+ mrb_gc_mark_gv(mrb);
+ /* mark arena */
+ for (i=0,e=mrb->arena_idx; i<e; i++) {
+ mrb_gc_mark(mrb, mrb->arena[i]);
+ }
+ /* mark class hierarchy */
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->object_class);
+ /* mark top_self */
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->top_self);
+ /* mark exception */
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->exc);
+ /* mark pre-allocated exception */
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->nomem_err);
+
+ mark_context(mrb, mrb->root_c);
+ if (mrb->root_c->fib) {
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->root_c->fib);
+ }
+ if (mrb->root_c != mrb->c) {
+ mark_context(mrb, mrb->c);
+ }
+}
+
+static size_t
+gc_gray_mark(mrb_state *mrb, struct RBasic *obj)
+{
+ size_t children = 0;
+
+ gc_mark_children(mrb, obj);
+
+ switch (obj->tt) {
+ case MRB_TT_ICLASS:
+ children++;
+ break;
+
+ case MRB_TT_CLASS:
+ case MRB_TT_SCLASS:
+ case MRB_TT_MODULE:
+ {
+ struct RClass *c = (struct RClass*)obj;
+
+ children += mrb_gc_mark_iv_size(mrb, (struct RObject*)obj);
+ children += mrb_gc_mark_mt_size(mrb, c);
+ children++;
+ }
+ break;
+
+ case MRB_TT_OBJECT:
+ case MRB_TT_DATA:
+ case MRB_TT_EXCEPTION:
+ children += mrb_gc_mark_iv_size(mrb, (struct RObject*)obj);
+ break;
+
+ case MRB_TT_ENV:
+ children += (int)obj->flags;
+ break;
+
+ case MRB_TT_FIBER:
+ {
+ struct mrb_context *c = ((struct RFiber*)obj)->cxt;
+ size_t i;
+ mrb_callinfo *ci;
+
+ if (!c) break;
+ /* mark stack */
+ i = c->stack - c->stbase;
+ if (c->ci) i += c->ci->nregs;
+ if (c->stbase + i > c->stend) i = c->stend - c->stbase;
+ children += i;
+
+ /* mark ensure stack */
+ children += (c->ci) ? c->ci->eidx : 0;
+
+ /* mark closure */
+ if (c->cibase) {
+ for (i=0, ci = c->cibase; ci <= c->ci; i++, ci++)
+ ;
+ }
+ children += i;
+ }
+ break;
+
+ case MRB_TT_ARRAY:
+ {
+ struct RArray *a = (struct RArray*)obj;
+ children += a->len;
+ }
+ break;
+
+ case MRB_TT_HASH:
+ children += mrb_gc_mark_iv_size(mrb, (struct RObject*)obj);
+ children += mrb_gc_mark_hash_size(mrb, (struct RHash*)obj);
+ break;
+
+ case MRB_TT_PROC:
+ case MRB_TT_RANGE:
+ children+=2;
+ break;
+
+ default:
+ break;
+ }
+ return children;
+}
+
+
+static void
+gc_mark_gray_list(mrb_state *mrb) {
+ while (mrb->gray_list) {
+ if (is_gray(mrb->gray_list))
+ gc_mark_children(mrb, mrb->gray_list);
+ else
+ mrb->gray_list = mrb->gray_list->gcnext;
+ }
+}
+
+
+static size_t
+incremental_marking_phase(mrb_state *mrb, size_t limit)
+{
+ size_t tried_marks = 0;
+
+ while (mrb->gray_list && tried_marks < limit) {
+ tried_marks += gc_gray_mark(mrb, mrb->gray_list);
+ }
+
+ return tried_marks;
+}
+
+static void
+final_marking_phase(mrb_state *mrb)
+{
+ mark_context_stack(mrb, mrb->root_c);
+ gc_mark_gray_list(mrb);
+ mrb_assert(mrb->gray_list == NULL);
+ mrb->gray_list = mrb->atomic_gray_list;
+ mrb->atomic_gray_list = NULL;
+ gc_mark_gray_list(mrb);
+ mrb_assert(mrb->gray_list == NULL);
+}
+
+static void
+prepare_incremental_sweep(mrb_state *mrb)
+{
+ mrb->gc_state = GC_STATE_SWEEP;
+ mrb->sweeps = mrb->heaps;
+ mrb->gc_live_after_mark = mrb->live;
+}
+
+static size_t
+incremental_sweep_phase(mrb_state *mrb, size_t limit)
+{
+ struct heap_page *page = mrb->sweeps;
+ size_t tried_sweep = 0;
+
+ while (page && (tried_sweep < limit)) {
+ RVALUE *p = page->objects;
+ RVALUE *e = p + MRB_HEAP_PAGE_SIZE;
+ size_t freed = 0;
+ mrb_bool dead_slot = TRUE;
+ mrb_bool full = (page->freelist == NULL);
+
+ if (is_minor_gc(mrb) && page->old) {
+ /* skip a slot which doesn't contain any young object */
+ p = e;
+ dead_slot = FALSE;
+ }
+ while (p<e) {
+ if (is_dead(mrb, &p->as.basic)) {
+ if (p->as.basic.tt != MRB_TT_FREE) {
+ obj_free(mrb, &p->as.basic);
+ p->as.free.next = page->freelist;
+ page->freelist = (struct RBasic*)p;
+ freed++;
+ }
+ }
+ else {
+ if (!is_generational(mrb))
+ paint_partial_white(mrb, &p->as.basic); /* next gc target */
+ dead_slot = 0;
+ }
+ p++;
+ }
+
+ /* free dead slot */
+ if (dead_slot && freed < MRB_HEAP_PAGE_SIZE) {
+ struct heap_page *next = page->next;
+
+ unlink_heap_page(mrb, page);
+ unlink_free_heap_page(mrb, page);
+ mrb_free(mrb, page);
+ page = next;
+ }
+ else {
+ if (full && freed > 0) {
+ link_free_heap_page(mrb, page);
+ }
+ if (page->freelist == NULL && is_minor_gc(mrb))
+ page->old = TRUE;
+ else
+ page->old = FALSE;
+ page = page->next;
+ }
+ tried_sweep += MRB_HEAP_PAGE_SIZE;
+ mrb->live -= freed;
+ mrb->gc_live_after_mark -= freed;
+ }
+ mrb->sweeps = page;
+ return tried_sweep;
+}
+
+static size_t
+incremental_gc(mrb_state *mrb, size_t limit)
+{
+ switch (mrb->gc_state) {
+ case GC_STATE_ROOT:
+ root_scan_phase(mrb);
+ mrb->gc_state = GC_STATE_MARK;
+ flip_white_part(mrb);
+ return 0;
+ case GC_STATE_MARK:
+ if (mrb->gray_list) {
+ return incremental_marking_phase(mrb, limit);
+ }
+ else {
+ final_marking_phase(mrb);
+ prepare_incremental_sweep(mrb);
+ return 0;
+ }
+ case GC_STATE_SWEEP: {
+ size_t tried_sweep = 0;
+ tried_sweep = incremental_sweep_phase(mrb, limit);
+ if (tried_sweep == 0)
+ mrb->gc_state = GC_STATE_ROOT;
+ return tried_sweep;
+ }
+ default:
+ /* unknown state */
+ mrb_assert(0);
+ return 0;
+ }
+}
+
+static void
+incremental_gc_until(mrb_state *mrb, enum gc_state to_state)
+{
+ do {
+ incremental_gc(mrb, SIZE_MAX);
+ } while (mrb->gc_state != to_state);
+}
+
+static void
+incremental_gc_step(mrb_state *mrb)
+{
+ size_t limit = 0, result = 0;
+ limit = (GC_STEP_SIZE/100) * mrb->gc_step_ratio;
+ while (result < limit) {
+ result += incremental_gc(mrb, limit);
+ if (mrb->gc_state == GC_STATE_ROOT)
+ break;
+ }
+
+ mrb->gc_threshold = mrb->live + GC_STEP_SIZE;
+}
+
+static void
+clear_all_old(mrb_state *mrb)
+{
+ mrb_bool origin_mode = mrb->is_generational_gc_mode;
+
+ mrb_assert(is_generational(mrb));
+ if (is_major_gc(mrb)) {
+ /* finish the half baked GC */
+ incremental_gc_until(mrb, GC_STATE_ROOT);
+ }
+
+ /* Sweep the dead objects, then reset all the live objects
+ * (including all the old objects, of course) to white. */
+ mrb->is_generational_gc_mode = FALSE;
+ prepare_incremental_sweep(mrb);
+ incremental_gc_until(mrb, GC_STATE_ROOT);
+ mrb->is_generational_gc_mode = origin_mode;
+
+ /* The gray objects have already been painted as white */
+ mrb->atomic_gray_list = mrb->gray_list = NULL;
+}
+
+MRB_API void
+mrb_incremental_gc(mrb_state *mrb)
+{
+ if (mrb->gc_disabled) return;
+
+ GC_INVOKE_TIME_REPORT("mrb_incremental_gc()");
+ GC_TIME_START;
+
+ if (is_minor_gc(mrb)) {
+ incremental_gc_until(mrb, GC_STATE_ROOT);
+ }
+ else {
+ incremental_gc_step(mrb);
+ }
+
+ if (mrb->gc_state == GC_STATE_ROOT) {
+ mrb_assert(mrb->live >= mrb->gc_live_after_mark);
+ mrb->gc_threshold = (mrb->gc_live_after_mark/100) * mrb->gc_interval_ratio;
+ if (mrb->gc_threshold < GC_STEP_SIZE) {
+ mrb->gc_threshold = GC_STEP_SIZE;
+ }
+
+ if (is_major_gc(mrb)) {
+ mrb->majorgc_old_threshold = mrb->gc_live_after_mark/100 * DEFAULT_MAJOR_GC_INC_RATIO;
+ mrb->gc_full = FALSE;
+ }
+ else if (is_minor_gc(mrb)) {
+ if (mrb->live > mrb->majorgc_old_threshold) {
+ clear_all_old(mrb);
+ mrb->gc_full = TRUE;
+ }
+ }
+ }
+
+ GC_TIME_STOP_AND_REPORT;
+}
+
+/* Perform a full gc cycle */
+MRB_API void
+mrb_full_gc(mrb_state *mrb)
+{
+ if (mrb->gc_disabled) return;
+ GC_INVOKE_TIME_REPORT("mrb_full_gc()");
+ GC_TIME_START;
+
+ if (is_generational(mrb)) {
+ /* clear all the old objects back to young */
+ clear_all_old(mrb);
+ mrb->gc_full = TRUE;
+ }
+ else if (mrb->gc_state != GC_STATE_ROOT) {
+ /* finish half baked GC cycle */
+ incremental_gc_until(mrb, GC_STATE_ROOT);
+ }
+
+ incremental_gc_until(mrb, GC_STATE_ROOT);
+ mrb->gc_threshold = (mrb->gc_live_after_mark/100) * mrb->gc_interval_ratio;
+
+ if (is_generational(mrb)) {
+ mrb->majorgc_old_threshold = mrb->gc_live_after_mark/100 * DEFAULT_MAJOR_GC_INC_RATIO;
+ mrb->gc_full = FALSE;
+ }
+
+ GC_TIME_STOP_AND_REPORT;
+}
+
+MRB_API void
+mrb_garbage_collect(mrb_state *mrb)
+{
+ mrb_full_gc(mrb);
+}
+
+MRB_API int
+mrb_gc_arena_save(mrb_state *mrb)
+{
+ return mrb->arena_idx;
+}
+
+MRB_API void
+mrb_gc_arena_restore(mrb_state *mrb, int idx)
+{
+#ifndef MRB_GC_FIXED_ARENA
+ int capa = mrb->arena_capa;
+
+ if (idx < capa / 2) {
+ capa = (int)(capa * 0.66);
+ if (capa < MRB_GC_ARENA_SIZE) {
+ capa = MRB_GC_ARENA_SIZE;
+ }
+ if (capa != mrb->arena_capa) {
+ mrb->arena = (struct RBasic**)mrb_realloc(mrb, mrb->arena, sizeof(struct RBasic*)*capa);
+ mrb->arena_capa = capa;
+ }
+ }
+#endif
+ mrb->arena_idx = idx;
+}
+
+/*
+ * Field write barrier
+ * Paint obj(Black) -> value(White) to obj(Black) -> value(Gray).
+ */
+
+MRB_API void
+mrb_field_write_barrier(mrb_state *mrb, struct RBasic *obj, struct RBasic *value)
+{
+ if (!is_black(obj)) return;
+ if (!is_white(value)) return;
+
+ mrb_assert(!is_dead(mrb, value) && !is_dead(mrb, obj));
+ mrb_assert(is_generational(mrb) || mrb->gc_state != GC_STATE_ROOT);
+
+ if (is_generational(mrb) || mrb->gc_state == GC_STATE_MARK) {
+ add_gray_list(mrb, value);
+ }
+ else {
+ mrb_assert(mrb->gc_state == GC_STATE_SWEEP);
+ paint_partial_white(mrb, obj); /* for never write barriers */
+ }
+}
+
+/*
+ * Write barrier
+ * Paint obj(Black) to obj(Gray).
+ *
+ * The object that is painted gray will be traversed atomically in final
+ * mark phase. So you use this write barrier if it's frequency written spot.
+ * e.g. Set element on Array.
+ */
+
+MRB_API void
+mrb_write_barrier(mrb_state *mrb, struct RBasic *obj)
+{
+ if (!is_black(obj)) return;
+
+ mrb_assert(!is_dead(mrb, obj));
+ mrb_assert(is_generational(mrb) || mrb->gc_state != GC_STATE_ROOT);
+ paint_gray(obj);
+ obj->gcnext = mrb->atomic_gray_list;
+ mrb->atomic_gray_list = obj;
+}
+
+/*
+ * call-seq:
+ * GC.start -> nil
+ *
+ * Initiates full garbage collection.
+ *
+ */
+
+static mrb_value
+gc_start(mrb_state *mrb, mrb_value obj)
+{
+ mrb_full_gc(mrb);
+ return mrb_nil_value();
+}
+
+/*
+ * call-seq:
+ * GC.enable -> true or false
+ *
+ * Enables garbage collection, returning <code>true</code> if garbage
+ * collection was previously disabled.
+ *
+ * GC.disable #=> false
+ * GC.enable #=> true
+ * GC.enable #=> false
+ *
+ */
+
+static mrb_value
+gc_enable(mrb_state *mrb, mrb_value obj)
+{
+ mrb_bool old = mrb->gc_disabled;
+
+ mrb->gc_disabled = FALSE;
+
+ return mrb_bool_value(old);
+}
+
+/*
+ * call-seq:
+ * GC.disable -> true or false
+ *
+ * Disables garbage collection, returning <code>true</code> if garbage
+ * collection was already disabled.
+ *
+ * GC.disable #=> false
+ * GC.disable #=> true
+ *
+ */
+
+static mrb_value
+gc_disable(mrb_state *mrb, mrb_value obj)
+{
+ mrb_bool old = mrb->gc_disabled;
+
+ mrb->gc_disabled = TRUE;
+
+ return mrb_bool_value(old);
+}
+
+/*
+ * call-seq:
+ * GC.interval_ratio -> fixnum
+ *
+ * Returns ratio of GC interval. Default value is 200(%).
+ *
+ */
+
+static mrb_value
+gc_interval_ratio_get(mrb_state *mrb, mrb_value obj)
+{
+ return mrb_fixnum_value(mrb->gc_interval_ratio);
+}
+
+/*
+ * call-seq:
+ * GC.interval_ratio = fixnum -> nil
+ *
+ * Updates ratio of GC interval. Default value is 200(%).
+ * GC start as soon as after end all step of GC if you set 100(%).
+ *
+ */
+
+static mrb_value
+gc_interval_ratio_set(mrb_state *mrb, mrb_value obj)
+{
+ mrb_int ratio;
+
+ mrb_get_args(mrb, "i", &ratio);
+ mrb->gc_interval_ratio = ratio;
+ return mrb_nil_value();
+}
+
+/*
+ * call-seq:
+ * GC.step_ratio -> fixnum
+ *
+ * Returns step span ratio of Incremental GC. Default value is 200(%).
+ *
+ */
+
+static mrb_value
+gc_step_ratio_get(mrb_state *mrb, mrb_value obj)
+{
+ return mrb_fixnum_value(mrb->gc_step_ratio);
+}
+
+/*
+ * call-seq:
+ * GC.step_ratio = fixnum -> nil
+ *
+ * Updates step span ratio of Incremental GC. Default value is 200(%).
+ * 1 step of incrementalGC becomes long if a rate is big.
+ *
+ */
+
+static mrb_value
+gc_step_ratio_set(mrb_state *mrb, mrb_value obj)
+{
+ mrb_int ratio;
+
+ mrb_get_args(mrb, "i", &ratio);
+ mrb->gc_step_ratio = ratio;
+ return mrb_nil_value();
+}
+
+static void
+change_gen_gc_mode(mrb_state *mrb, mrb_bool enable)
+{
+ if (is_generational(mrb) && !enable) {
+ clear_all_old(mrb);
+ mrb_assert(mrb->gc_state == GC_STATE_ROOT);
+ mrb->gc_full = FALSE;
+ }
+ else if (!is_generational(mrb) && enable) {
+ incremental_gc_until(mrb, GC_STATE_ROOT);
+ mrb->majorgc_old_threshold = mrb->gc_live_after_mark/100 * DEFAULT_MAJOR_GC_INC_RATIO;
+ mrb->gc_full = FALSE;
+ }
+ mrb->is_generational_gc_mode = enable;
+}
+
+/*
+ * call-seq:
+ * GC.generational_mode -> true or false
+ *
+ * Returns generational or normal gc mode.
+ *
+ */
+
+static mrb_value
+gc_generational_mode_get(mrb_state *mrb, mrb_value self)
+{
+ return mrb_bool_value(mrb->is_generational_gc_mode);
+}
+
+/*
+ * call-seq:
+ * GC.generational_mode = true or false -> true or false
+ *
+ * Changes to generational or normal gc mode.
+ *
+ */
+
+static mrb_value
+gc_generational_mode_set(mrb_state *mrb, mrb_value self)
+{
+ mrb_bool enable;
+
+ mrb_get_args(mrb, "b", &enable);
+ if (mrb->is_generational_gc_mode != enable)
+ change_gen_gc_mode(mrb, enable);
+
+ return mrb_bool_value(enable);
+}
+
+void
+mrb_objspace_each_objects(mrb_state *mrb, mrb_each_object_callback *callback, void *data)
+{
+ struct heap_page* page = mrb->heaps;
+
+ while (page != NULL) {
+ RVALUE *p, *pend;
+
+ p = page->objects;
+ pend = p + MRB_HEAP_PAGE_SIZE;
+ for (;p < pend; p++) {
+ (*callback)(mrb, &p->as.basic, data);
+ }
+
+ page = page->next;
+ }
+}
+
+#ifdef GC_TEST
+#ifdef GC_DEBUG
+static mrb_value gc_test(mrb_state *, mrb_value);
+#endif
+#endif
+
+void
+mrb_init_gc(mrb_state *mrb)
+{
+ struct RClass *gc;
+
+ gc = mrb_define_module(mrb, "GC");
+
+ mrb_define_class_method(mrb, gc, "start", gc_start, MRB_ARGS_NONE());
+ mrb_define_class_method(mrb, gc, "enable", gc_enable, MRB_ARGS_NONE());
+ mrb_define_class_method(mrb, gc, "disable", gc_disable, MRB_ARGS_NONE());
+ mrb_define_class_method(mrb, gc, "interval_ratio", gc_interval_ratio_get, MRB_ARGS_NONE());
+ mrb_define_class_method(mrb, gc, "interval_ratio=", gc_interval_ratio_set, MRB_ARGS_REQ(1));
+ mrb_define_class_method(mrb, gc, "step_ratio", gc_step_ratio_get, MRB_ARGS_NONE());
+ mrb_define_class_method(mrb, gc, "step_ratio=", gc_step_ratio_set, MRB_ARGS_REQ(1));
+ mrb_define_class_method(mrb, gc, "generational_mode=", gc_generational_mode_set, MRB_ARGS_REQ(1));
+ mrb_define_class_method(mrb, gc, "generational_mode", gc_generational_mode_get, MRB_ARGS_NONE());
+#ifdef GC_TEST
+#ifdef GC_DEBUG
+ mrb_define_class_method(mrb, gc, "test", gc_test, MRB_ARGS_NONE());
+#endif
+#endif
+}
+
+#ifdef GC_TEST
+#ifdef GC_DEBUG
+void
+test_mrb_field_write_barrier(void)
+{
+ mrb_state *mrb = mrb_open();
+ struct RBasic *obj, *value;
+
+ puts("test_mrb_field_write_barrier");
+ mrb->is_generational_gc_mode = FALSE;
+ obj = mrb_basic_ptr(mrb_ary_new(mrb));
+ value = mrb_basic_ptr(mrb_str_new_lit(mrb, "value"));
+ paint_black(obj);
+ paint_partial_white(mrb, value);
+
+
+ puts(" in GC_STATE_MARK");
+ mrb->gc_state = GC_STATE_MARK;
+ mrb_field_write_barrier(mrb, obj, value);
+
+ mrb_assert(is_gray(value));
+
+
+ puts(" in GC_STATE_SWEEP");
+ paint_partial_white(mrb, value);
+ mrb->gc_state = GC_STATE_SWEEP;
+ mrb_field_write_barrier(mrb, obj, value);
+
+ mrb_assert(obj->color & mrb->current_white_part);
+ mrb_assert(value->color & mrb->current_white_part);
+
+
+ puts(" fail with black");
+ mrb->gc_state = GC_STATE_MARK;
+ paint_white(obj);
+ paint_partial_white(mrb, value);
+ mrb_field_write_barrier(mrb, obj, value);
+
+ mrb_assert(obj->color & mrb->current_white_part);
+
+
+ puts(" fail with gray");
+ mrb->gc_state = GC_STATE_MARK;
+ paint_black(obj);
+ paint_gray(value);
+ mrb_field_write_barrier(mrb, obj, value);
+
+ mrb_assert(is_gray(value));
+
+
+ {
+ puts("test_mrb_field_write_barrier_value");
+ obj = mrb_basic_ptr(mrb_ary_new(mrb));
+ mrb_value value = mrb_str_new_lit(mrb, "value");
+ paint_black(obj);
+ paint_partial_white(mrb, mrb_basic_ptr(value));
+
+ mrb->gc_state = GC_STATE_MARK;
+ mrb_field_write_barrier_value(mrb, obj, value);
+
+ mrb_assert(is_gray(mrb_basic_ptr(value)));
+ }
+
+ mrb_close(mrb);
+}
+
+void
+test_mrb_write_barrier(void)
+{
+ mrb_state *mrb = mrb_open();
+ struct RBasic *obj;
+
+ puts("test_mrb_write_barrier");
+ obj = mrb_basic_ptr(mrb_ary_new(mrb));
+ paint_black(obj);
+
+ puts(" in GC_STATE_MARK");
+ mrb->gc_state = GC_STATE_MARK;
+ mrb_write_barrier(mrb, obj);
+
+ mrb_assert(is_gray(obj));
+ mrb_assert(mrb->atomic_gray_list == obj);
+
+
+ puts(" fail with gray");
+ paint_gray(obj);
+ mrb_write_barrier(mrb, obj);
+
+ mrb_assert(is_gray(obj));
+
+ mrb_close(mrb);
+}
+
+void
+test_add_gray_list(void)
+{
+ mrb_state *mrb = mrb_open();
+ struct RBasic *obj1, *obj2;
+
+ puts("test_add_gray_list");
+ change_gen_gc_mode(mrb, FALSE);
+ mrb_assert(mrb->gray_list == NULL);
+ obj1 = mrb_basic_ptr(mrb_str_new_lit(mrb, "test"));
+ add_gray_list(mrb, obj1);
+ mrb_assert(mrb->gray_list == obj1);
+ mrb_assert(is_gray(obj1));
+
+ obj2 = mrb_basic_ptr(mrb_str_new_lit(mrb, "test"));
+ add_gray_list(mrb, obj2);
+ mrb_assert(mrb->gray_list == obj2);
+ mrb_assert(mrb->gray_list->gcnext == obj1);
+ mrb_assert(is_gray(obj2));
+
+ mrb_close(mrb);
+}
+
+void
+test_gc_gray_mark(void)
+{
+ mrb_state *mrb = mrb_open();
+ mrb_value obj_v, value_v;
+ struct RBasic *obj;
+ size_t gray_num = 0;
+
+ puts("test_gc_gray_mark");
+
+ puts(" in MRB_TT_CLASS");
+ obj = (struct RBasic*)mrb->object_class;
+ paint_gray(obj);
+ gray_num = gc_gray_mark(mrb, obj);
+ mrb_assert(is_black(obj));
+ mrb_assert(gray_num > 1);
+
+ puts(" in MRB_TT_ARRAY");
+ obj_v = mrb_ary_new(mrb);
+ value_v = mrb_str_new_lit(mrb, "test");
+ paint_gray(mrb_basic_ptr(obj_v));
+ paint_partial_white(mrb, mrb_basic_ptr(value_v));
+ mrb_ary_push(mrb, obj_v, value_v);
+ gray_num = gc_gray_mark(mrb, mrb_basic_ptr(obj_v));
+ mrb_assert(is_black(mrb_basic_ptr(obj_v)));
+ mrb_assert(is_gray(mrb_basic_ptr(value_v)));
+ mrb_assert(gray_num == 1);
+
+ mrb_close(mrb);
+}
+
+void
+test_incremental_gc(void)
+{
+ mrb_state *mrb = mrb_open();
+ size_t max = ~0, live = 0, total = 0, freed = 0;
+ RVALUE *free;
+ struct heap_page *page;
+
+ puts("test_incremental_gc");
+ change_gen_gc_mode(mrb, FALSE);
+
+ puts(" in mrb_full_gc");
+ mrb_full_gc(mrb);
+
+ mrb_assert(mrb->gc_state == GC_STATE_ROOT);
+ puts(" in GC_STATE_ROOT");
+ incremental_gc(mrb, max);
+ mrb_assert(mrb->gc_state == GC_STATE_MARK);
+ puts(" in GC_STATE_MARK");
+ incremental_gc_until(mrb, GC_STATE_SWEEP);
+ mrb_assert(mrb->gc_state == GC_STATE_SWEEP);
+
+ puts(" in GC_STATE_SWEEP");
+ page = mrb->heaps;
+ while (page) {
+ RVALUE *p = page->objects;
+ RVALUE *e = p + MRB_HEAP_PAGE_SIZE;
+ while (p<e) {
+ if (is_black(&p->as.basic)) {
+ live++;
+ }
+ if (is_gray(&p->as.basic) && !is_dead(mrb, &p->as.basic)) {
+ printf("%p\n", &p->as.basic);
+ }
+ p++;
+ }
+ page = page->next;
+ total += MRB_HEAP_PAGE_SIZE;
+ }
+
+ mrb_assert(mrb->gray_list == NULL);
+
+ incremental_gc(mrb, max);
+ mrb_assert(mrb->gc_state == GC_STATE_SWEEP);
+
+ incremental_gc(mrb, max);
+ mrb_assert(mrb->gc_state == GC_STATE_ROOT);
+
+ free = (RVALUE*)mrb->heaps->freelist;
+ while (free) {
+ freed++;
+ free = (RVALUE*)free->as.free.next;
+ }
+
+ mrb_assert(mrb->live == live);
+ mrb_assert(mrb->live == total-freed);
+
+ puts("test_incremental_gc(gen)");
+ incremental_gc_until(mrb, GC_STATE_SWEEP);
+ change_gen_gc_mode(mrb, TRUE);
+
+ mrb_assert(mrb->gc_full == FALSE);
+ mrb_assert(mrb->gc_state == GC_STATE_ROOT);
+
+ puts(" in minor");
+ mrb_assert(is_minor_gc(mrb));
+ mrb_assert(mrb->majorgc_old_threshold > 0);
+ mrb->majorgc_old_threshold = 0;
+ mrb_incremental_gc(mrb);
+ mrb_assert(mrb->gc_full == TRUE);
+ mrb_assert(mrb->gc_state == GC_STATE_ROOT);
+
+ puts(" in major");
+ mrb_assert(is_major_gc(mrb));
+ do {
+ mrb_incremental_gc(mrb);
+ } while (mrb->gc_state != GC_STATE_ROOT);
+ mrb_assert(mrb->gc_full == FALSE);
+
+ mrb_close(mrb);
+}
+
+void
+test_incremental_sweep_phase(void)
+{
+ mrb_state *mrb = mrb_open();
+
+ puts("test_incremental_sweep_phase");
+
+ add_heap(mrb);
+ mrb->sweeps = mrb->heaps;
+
+ mrb_assert(mrb->heaps->next->next == NULL);
+ mrb_assert(mrb->free_heaps->next->next == NULL);
+ incremental_sweep_phase(mrb, MRB_HEAP_PAGE_SIZE*3);
+
+ mrb_assert(mrb->heaps->next == NULL);
+ mrb_assert(mrb->heaps == mrb->free_heaps);
+
+ mrb_close(mrb);
+}
+
+static mrb_value
+gc_test(mrb_state *mrb, mrb_value self)
+{
+ test_mrb_field_write_barrier();
+ test_mrb_write_barrier();
+ test_add_gray_list();
+ test_gc_gray_mark();
+ test_incremental_gc();
+ test_incremental_sweep_phase();
+ return mrb_nil_value();
+}
+#endif /* GC_DEBUG */
+#endif /* GC_TEST */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hash.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,858 @@
+/*
+** hash.c - Hash class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/hash.h"
+#include "mruby/khash.h"
+#include "mruby/string.h"
+#include "mruby/variable.h"
+
+/* a function to get hash value of a float number */
+mrb_int mrb_float_id(mrb_float f);
+
+static inline khint_t
+mrb_hash_ht_hash_func(mrb_state *mrb, mrb_value key)
+{
+ enum mrb_vtype t = mrb_type(key);
+ mrb_value hv;
+ const char *p;
+ mrb_int i, len;
+ khint_t h;
+
+ switch (t) {
+ case MRB_TT_STRING:
+ p = RSTRING_PTR(key);
+ len = RSTRING_LEN(key);
+ h = 0;
+ for (i=0; i<len; i++) {
+ h = (h << 5) - h + *p++;
+ }
+ return h;
+
+ case MRB_TT_SYMBOL:
+ h = (khint_t)mrb_symbol(key);
+ return kh_int_hash_func(mrb, h);
+
+ case MRB_TT_FIXNUM:
+ h = (khint_t)mrb_float_id((mrb_float)mrb_fixnum(key));
+ return kh_int_hash_func(mrb, h);
+
+ case MRB_TT_FLOAT:
+ h = (khint_t)mrb_float_id(mrb_float(key));
+ return kh_int_hash_func(mrb, h);
+
+ default:
+ hv = mrb_funcall(mrb, key, "hash", 0);
+ h = (khint_t)t ^ mrb_fixnum(hv);
+ return kh_int_hash_func(mrb, h);
+ }
+}
+
+static inline khint_t
+mrb_hash_ht_hash_equal(mrb_state *mrb, mrb_value a, mrb_value b)
+{
+ enum mrb_vtype t = mrb_type(a);
+
+ switch (t) {
+ case MRB_TT_STRING:
+ return mrb_str_equal(mrb, a, b);
+
+ case MRB_TT_SYMBOL:
+ if (mrb_type(b) != MRB_TT_SYMBOL) return FALSE;
+ return mrb_symbol(a) == mrb_symbol(b);
+
+ case MRB_TT_FIXNUM:
+ switch (mrb_type(b)) {
+ case MRB_TT_FIXNUM:
+ return mrb_fixnum(a) == mrb_fixnum(b);
+ case MRB_TT_FLOAT:
+ return (mrb_float)mrb_fixnum(a) == mrb_float(b);
+ default:
+ return FALSE;
+ }
+
+ case MRB_TT_FLOAT:
+ switch (mrb_type(b)) {
+ case MRB_TT_FIXNUM:
+ return mrb_float(a) == (mrb_float)mrb_fixnum(b);
+ case MRB_TT_FLOAT:
+ return mrb_float(a) == mrb_float(b);
+ default:
+ return FALSE;
+ }
+
+ default:
+ return mrb_eql(mrb, a, b);
+ }
+}
+
+typedef struct {
+ mrb_value v;
+ mrb_int n;
+} mrb_hash_value;
+
+KHASH_DECLARE(ht, mrb_value, mrb_hash_value, TRUE)
+KHASH_DEFINE (ht, mrb_value, mrb_hash_value, TRUE, mrb_hash_ht_hash_func, mrb_hash_ht_hash_equal)
+
+static void mrb_hash_modify(mrb_state *mrb, mrb_value hash);
+
+static inline mrb_value
+mrb_hash_ht_key(mrb_state *mrb, mrb_value key)
+{
+ if (mrb_string_p(key))
+ return mrb_str_dup(mrb, key);
+ else
+ return key;
+}
+
+#define KEY(key) mrb_hash_ht_key(mrb, key)
+
+void
+mrb_gc_mark_hash(mrb_state *mrb, struct RHash *hash)
+{
+ khiter_t k;
+ khash_t(ht) *h = hash->ht;
+
+ if (!h) return;
+ for (k = kh_begin(h); k != kh_end(h); k++) {
+ if (kh_exist(h, k)) {
+ mrb_value key = kh_key(h, k);
+ mrb_value val = kh_value(h, k).v;
+
+ mrb_gc_mark_value(mrb, key);
+ mrb_gc_mark_value(mrb, val);
+ }
+ }
+}
+
+size_t
+mrb_gc_mark_hash_size(mrb_state *mrb, struct RHash *hash)
+{
+ if (!hash->ht) return 0;
+ return kh_size(hash->ht)*2;
+}
+
+void
+mrb_gc_free_hash(mrb_state *mrb, struct RHash *hash)
+{
+ if (hash->ht) kh_destroy(ht, mrb, hash->ht);
+}
+
+
+MRB_API mrb_value
+mrb_hash_new_capa(mrb_state *mrb, int capa)
+{
+ struct RHash *h;
+
+ h = (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class);
+ h->ht = kh_init(ht, mrb);
+ if (capa > 0) {
+ kh_resize(ht, mrb, h->ht, capa);
+ }
+ h->iv = 0;
+ return mrb_obj_value(h);
+}
+
+MRB_API mrb_value
+mrb_hash_new(mrb_state *mrb)
+{
+ return mrb_hash_new_capa(mrb, 0);
+}
+
+MRB_API mrb_value
+mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key)
+{
+ khash_t(ht) *h = RHASH_TBL(hash);
+ khiter_t k;
+
+ if (h) {
+ k = kh_get(ht, mrb, h, key);
+ if (k != kh_end(h))
+ return kh_value(h, k).v;
+ }
+
+ /* not found */
+ if (MRB_RHASH_PROCDEFAULT_P(hash)) {
+ return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, key);
+ }
+ return RHASH_IFNONE(hash);
+}
+
+MRB_API mrb_value
+mrb_hash_fetch(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value def)
+{
+ khash_t(ht) *h = RHASH_TBL(hash);
+ khiter_t k;
+
+ if (h) {
+ k = kh_get(ht, mrb, h, key);
+ if (k != kh_end(h))
+ return kh_value(h, k).v;
+ }
+
+ /* not found */
+ return def;
+}
+
+MRB_API void
+mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val)
+{
+ khash_t(ht) *h;
+ khiter_t k;
+ int r;
+
+ mrb_hash_modify(mrb, hash);
+ h = RHASH_TBL(hash);
+
+ if (!h) h = RHASH_TBL(hash) = kh_init(ht, mrb);
+ k = kh_put2(ht, mrb, h, key, &r);
+ kh_value(h, k).v = val;
+
+ if (r != 0) {
+ /* expand */
+ int ai = mrb_gc_arena_save(mrb);
+ key = kh_key(h, k) = KEY(key);
+ mrb_gc_arena_restore(mrb, ai);
+ kh_value(h, k).n = kh_size(h)-1;
+ }
+
+ mrb_field_write_barrier_value(mrb, (struct RBasic*)RHASH(hash), key);
+ mrb_field_write_barrier_value(mrb, (struct RBasic*)RHASH(hash), val);
+ return;
+}
+
+static mrb_value
+mrb_hash_dup(mrb_state *mrb, mrb_value hash)
+{
+ struct RHash* ret;
+ khash_t(ht) *h, *ret_h;
+ khiter_t k, ret_k;
+
+ h = RHASH_TBL(hash);
+ ret = (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class);
+ ret->ht = kh_init(ht, mrb);
+
+ if (kh_size(h) > 0) {
+ ret_h = ret->ht;
+
+ for (k = kh_begin(h); k != kh_end(h); k++) {
+ if (kh_exist(h, k)) {
+ int ai = mrb_gc_arena_save(mrb);
+ ret_k = kh_put(ht, mrb, ret_h, KEY(kh_key(h, k)));
+ mrb_gc_arena_restore(mrb, ai);
+ kh_val(ret_h, ret_k) = kh_val(h, k);
+ }
+ }
+ }
+
+ return mrb_obj_value(ret);
+}
+
+MRB_API mrb_value
+mrb_check_hash_type(mrb_state *mrb, mrb_value hash)
+{
+ return mrb_check_convert_type(mrb, hash, MRB_TT_HASH, "Hash", "to_hash");
+}
+
+MRB_API khash_t(ht)*
+mrb_hash_tbl(mrb_state *mrb, mrb_value hash)
+{
+ khash_t(ht) *h = RHASH_TBL(hash);
+
+ if (!h) {
+ return RHASH_TBL(hash) = kh_init(ht, mrb);
+ }
+ return h;
+}
+
+static void
+mrb_hash_modify(mrb_state *mrb, mrb_value hash)
+{
+ mrb_hash_tbl(mrb, hash);
+}
+
+/* 15.2.13.4.16 */
+/*
+ * call-seq:
+ * Hash.new -> new_hash
+ * Hash.new(obj) -> new_hash
+ * Hash.new {|hash, key| block } -> new_hash
+ *
+ * Returns a new, empty hash. If this hash is subsequently accessed by
+ * a key that doesn't correspond to a hash entry, the value returned
+ * depends on the style of <code>new</code> used to create the hash. In
+ * the first form, the access returns <code>nil</code>. If
+ * <i>obj</i> is specified, this single object will be used for
+ * all <em>default values</em>. If a block is specified, it will be
+ * called with the hash object and the key, and should return the
+ * default value. It is the block's responsibility to store the value
+ * in the hash if required.
+ *
+ * h = Hash.new("Go Fish")
+ * h["a"] = 100
+ * h["b"] = 200
+ * h["a"] #=> 100
+ * h["c"] #=> "Go Fish"
+ * # The following alters the single default object
+ * h["c"].upcase! #=> "GO FISH"
+ * h["d"] #=> "GO FISH"
+ * h.keys #=> ["a", "b"]
+ *
+ * # While this creates a new default object each time
+ * h = Hash.new { |hash, key| hash[key] = "Go Fish: #{key}" }
+ * h["c"] #=> "Go Fish: c"
+ * h["c"].upcase! #=> "GO FISH: C"
+ * h["d"] #=> "Go Fish: d"
+ * h.keys #=> ["c", "d"]
+ *
+ */
+
+static mrb_value
+mrb_hash_init(mrb_state *mrb, mrb_value hash)
+{
+ mrb_value block, ifnone;
+ mrb_bool ifnone_p;
+
+ ifnone = mrb_nil_value();
+ mrb_get_args(mrb, "&|o?", &block, &ifnone, &ifnone_p);
+ mrb_hash_modify(mrb, hash);
+ if (!mrb_nil_p(block)) {
+ if (ifnone_p) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
+ }
+ RHASH(hash)->flags |= MRB_HASH_PROC_DEFAULT;
+ ifnone = block;
+ }
+ mrb_iv_set(mrb, hash, mrb_intern_lit(mrb, "ifnone"), ifnone);
+ return hash;
+}
+
+/* 15.2.13.4.2 */
+/*
+ * call-seq:
+ * hsh[key] -> value
+ *
+ * Element Reference---Retrieves the <i>value</i> object corresponding
+ * to the <i>key</i> object. If not found, returns the default value (see
+ * <code>Hash::new</code> for details).
+ *
+ * h = { "a" => 100, "b" => 200 }
+ * h["a"] #=> 100
+ * h["c"] #=> nil
+ *
+ */
+static mrb_value
+mrb_hash_aget(mrb_state *mrb, mrb_value self)
+{
+ mrb_value key;
+
+ mrb_get_args(mrb, "o", &key);
+ return mrb_hash_get(mrb, self, key);
+}
+
+/* 15.2.13.4.5 */
+/*
+ * call-seq:
+ * hsh.default(key=nil) -> obj
+ *
+ * Returns the default value, the value that would be returned by
+ * <i>hsh</i>[<i>key</i>] if <i>key</i> did not exist in <i>hsh</i>.
+ * See also <code>Hash::new</code> and <code>Hash#default=</code>.
+ *
+ * h = Hash.new #=> {}
+ * h.default #=> nil
+ * h.default(2) #=> nil
+ *
+ * h = Hash.new("cat") #=> {}
+ * h.default #=> "cat"
+ * h.default(2) #=> "cat"
+ *
+ * h = Hash.new {|h,k| h[k] = k.to_i*10} #=> {}
+ * h.default #=> nil
+ * h.default(2) #=> 20
+ */
+
+static mrb_value
+mrb_hash_default(mrb_state *mrb, mrb_value hash)
+{
+ mrb_value key;
+ mrb_bool given;
+
+ mrb_get_args(mrb, "|o?", &key, &given);
+ if (MRB_RHASH_PROCDEFAULT_P(hash)) {
+ if (!given) return mrb_nil_value();
+ return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, key);
+ }
+ else {
+ return RHASH_IFNONE(hash);
+ }
+}
+
+/* 15.2.13.4.6 */
+/*
+ * call-seq:
+ * hsh.default = obj -> obj
+ *
+ * Sets the default value, the value returned for a key that does not
+ * exist in the hash. It is not possible to set the default to a
+ * <code>Proc</code> that will be executed on each key lookup.
+ *
+ * h = { "a" => 100, "b" => 200 }
+ * h.default = "Go fish"
+ * h["a"] #=> 100
+ * h["z"] #=> "Go fish"
+ * # This doesn't do what you might hope...
+ * h.default = proc do |hash, key|
+ * hash[key] = key + key
+ * end
+ * h[2] #=> #<Proc:0x401b3948@-:6>
+ * h["cat"] #=> #<Proc:0x401b3948@-:6>
+ */
+
+static mrb_value
+mrb_hash_set_default(mrb_state *mrb, mrb_value hash)
+{
+ mrb_value ifnone;
+
+ mrb_get_args(mrb, "o", &ifnone);
+ mrb_hash_modify(mrb, hash);
+ mrb_iv_set(mrb, hash, mrb_intern_lit(mrb, "ifnone"), ifnone);
+ RHASH(hash)->flags &= ~(MRB_HASH_PROC_DEFAULT);
+
+ return ifnone;
+}
+
+/* 15.2.13.4.7 */
+/*
+ * call-seq:
+ * hsh.default_proc -> anObject
+ *
+ * If <code>Hash::new</code> was invoked with a block, return that
+ * block, otherwise return <code>nil</code>.
+ *
+ * h = Hash.new {|h,k| h[k] = k*k } #=> {}
+ * p = h.default_proc #=> #<Proc:0x401b3d08@-:1>
+ * a = [] #=> []
+ * p.call(a, 2)
+ * a #=> [nil, nil, 4]
+ */
+
+
+static mrb_value
+mrb_hash_default_proc(mrb_state *mrb, mrb_value hash)
+{
+ if (MRB_RHASH_PROCDEFAULT_P(hash)) {
+ return RHASH_PROCDEFAULT(hash);
+ }
+ return mrb_nil_value();
+}
+
+/*
+ * call-seq:
+ * hsh.default_proc = proc_obj -> proc_obj
+ *
+ * Sets the default proc to be executed on each key lookup.
+ *
+ * h.default_proc = proc do |hash, key|
+ * hash[key] = key + key
+ * end
+ * h[2] #=> 4
+ * h["cat"] #=> "catcat"
+ */
+
+static mrb_value
+mrb_hash_set_default_proc(mrb_state *mrb, mrb_value hash)
+{
+ mrb_value ifnone;
+
+ mrb_get_args(mrb, "o", &ifnone);
+ mrb_hash_modify(mrb, hash);
+ mrb_iv_set(mrb, hash, mrb_intern_lit(mrb, "ifnone"), ifnone);
+ RHASH(hash)->flags |= MRB_HASH_PROC_DEFAULT;
+
+ return ifnone;
+}
+
+MRB_API mrb_value
+mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key)
+{
+ khash_t(ht) *h = RHASH_TBL(hash);
+ khiter_t k;
+ mrb_value delVal;
+ mrb_int n;
+
+ if (h) {
+ k = kh_get(ht, mrb, h, key);
+ if (k != kh_end(h)) {
+ delVal = kh_value(h, k).v;
+ n = kh_value(h, k).n;
+ kh_del(ht, mrb, h, k);
+ for (k = kh_begin(h); k != kh_end(h); k++) {
+ if (!kh_exist(h, k)) continue;
+ if (kh_value(h, k).n > n) kh_value(h, k).n--;
+ }
+ return delVal;
+ }
+ }
+
+ /* not found */
+ return mrb_nil_value();
+}
+
+/* 15.2.13.4.8 */
+/*
+ * call-seq:
+ * hsh.delete(key) -> value
+ * hsh.delete(key) {| key | block } -> value
+ *
+ * Deletes and returns a key-value pair from <i>hsh</i> whose key is
+ * equal to <i>key</i>. If the key is not found, returns the
+ * <em>default value</em>. If the optional code block is given and the
+ * key is not found, pass in the key and return the result of
+ * <i>block</i>.
+ *
+ * h = { "a" => 100, "b" => 200 }
+ * h.delete("a") #=> 100
+ * h.delete("z") #=> nil
+ * h.delete("z") { |el| "#{el} not found" } #=> "z not found"
+ *
+ */
+static mrb_value
+mrb_hash_delete(mrb_state *mrb, mrb_value self)
+{
+ mrb_value key;
+
+ mrb_get_args(mrb, "o", &key);
+ return mrb_hash_delete_key(mrb, self, key);
+}
+
+/* 15.2.13.4.24 */
+/*
+ * call-seq:
+ * hsh.shift -> anArray or obj
+ *
+ * Removes a key-value pair from <i>hsh</i> and returns it as the
+ * two-item array <code>[</code> <i>key, value</i> <code>]</code>, or
+ * the hash's default value if the hash is empty.
+ *
+ * h = { 1 => "a", 2 => "b", 3 => "c" }
+ * h.shift #=> [1, "a"]
+ * h #=> {2=>"b", 3=>"c"}
+ */
+
+static mrb_value
+mrb_hash_shift(mrb_state *mrb, mrb_value hash)
+{
+ khash_t(ht) *h = RHASH_TBL(hash);
+ khiter_t k;
+ mrb_value delKey, delVal;
+
+ mrb_hash_modify(mrb, hash);
+ if (h && kh_size(h) > 0) {
+ for (k = kh_begin(h); k != kh_end(h); k++) {
+ if (!kh_exist(h, k)) continue;
+
+ delKey = kh_key(h, k);
+ mrb_gc_protect(mrb, delKey);
+ delVal = mrb_hash_delete_key(mrb, hash, delKey);
+ mrb_gc_protect(mrb, delVal);
+
+ return mrb_assoc_new(mrb, delKey, delVal);
+ }
+ }
+
+ if (MRB_RHASH_PROCDEFAULT_P(hash)) {
+ return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, mrb_nil_value());
+ }
+ else {
+ return RHASH_IFNONE(hash);
+ }
+}
+
+/* 15.2.13.4.4 */
+/*
+ * call-seq:
+ * hsh.clear -> hsh
+ *
+ * Removes all key-value pairs from <i>hsh</i>.
+ *
+ * h = { "a" => 100, "b" => 200 } #=> {"a"=>100, "b"=>200}
+ * h.clear #=> {}
+ *
+ */
+
+MRB_API mrb_value
+mrb_hash_clear(mrb_state *mrb, mrb_value hash)
+{
+ khash_t(ht) *h = RHASH_TBL(hash);
+
+ if (h) kh_clear(ht, mrb, h);
+ return hash;
+}
+
+/* 15.2.13.4.3 */
+/* 15.2.13.4.26 */
+/*
+ * call-seq:
+ * hsh[key] = value -> value
+ * hsh.store(key, value) -> value
+ *
+ * Element Assignment---Associates the value given by
+ * <i>value</i> with the key given by <i>key</i>.
+ * <i>key</i> should not have its value changed while it is in
+ * use as a key (a <code>String</code> passed as a key will be
+ * duplicated and frozen).
+ *
+ * h = { "a" => 100, "b" => 200 }
+ * h["a"] = 9
+ * h["c"] = 4
+ * h #=> {"a"=>9, "b"=>200, "c"=>4}
+ *
+ */
+static mrb_value
+mrb_hash_aset(mrb_state *mrb, mrb_value self)
+{
+ mrb_value key, val;
+
+ mrb_get_args(mrb, "oo", &key, &val);
+ mrb_hash_set(mrb, self, key, val);
+ return val;
+}
+
+/* 15.2.13.4.20 */
+/* 15.2.13.4.25 */
+/*
+ * call-seq:
+ * hsh.length -> fixnum
+ * hsh.size -> fixnum
+ *
+ * Returns the number of key-value pairs in the hash.
+ *
+ * h = { "d" => 100, "a" => 200, "v" => 300, "e" => 400 }
+ * h.length #=> 4
+ * h.delete("a") #=> 200
+ * h.length #=> 3
+ */
+static mrb_value
+mrb_hash_size_m(mrb_state *mrb, mrb_value self)
+{
+ khash_t(ht) *h = RHASH_TBL(self);
+
+ if (!h) return mrb_fixnum_value(0);
+ return mrb_fixnum_value(kh_size(h));
+}
+
+/* 15.2.13.4.12 */
+/*
+ * call-seq:
+ * hsh.empty? -> true or false
+ *
+ * Returns <code>true</code> if <i>hsh</i> contains no key-value pairs.
+ *
+ * {}.empty? #=> true
+ *
+ */
+MRB_API mrb_value
+mrb_hash_empty_p(mrb_state *mrb, mrb_value self)
+{
+ khash_t(ht) *h = RHASH_TBL(self);
+
+ if (h) return mrb_bool_value(kh_size(h) == 0);
+ return mrb_true_value();
+}
+
+/* 15.2.13.4.29 (x)*/
+/*
+ * call-seq:
+ * hsh.to_hash => hsh
+ *
+ * Returns +self+.
+ */
+
+static mrb_value
+mrb_hash_to_hash(mrb_state *mrb, mrb_value hash)
+{
+ return hash;
+}
+
+/* 15.2.13.4.19 */
+/*
+ * call-seq:
+ * hsh.keys -> array
+ *
+ * Returns a new array populated with the keys from this hash. See also
+ * <code>Hash#values</code>.
+ *
+ * h = { "a" => 100, "b" => 200, "c" => 300, "d" => 400 }
+ * h.keys #=> ["a", "b", "c", "d"]
+ *
+ */
+
+MRB_API mrb_value
+mrb_hash_keys(mrb_state *mrb, mrb_value hash)
+{
+ khash_t(ht) *h = RHASH_TBL(hash);
+ khiter_t k;
+ mrb_value ary;
+ mrb_value *p;
+
+ if (!h || kh_size(h) == 0) return mrb_ary_new(mrb);
+ ary = mrb_ary_new_capa(mrb, kh_size(h));
+ mrb_ary_set(mrb, ary, kh_size(h)-1, mrb_nil_value());
+ p = mrb_ary_ptr(ary)->ptr;
+ for (k = kh_begin(h); k != kh_end(h); k++) {
+ if (kh_exist(h, k)) {
+ mrb_value kv = kh_key(h, k);
+ mrb_hash_value hv = kh_value(h, k);
+
+ p[hv.n] = kv;
+ }
+ }
+ return ary;
+}
+
+/* 15.2.13.4.28 */
+/*
+ * call-seq:
+ * hsh.values -> array
+ *
+ * Returns a new array populated with the values from <i>hsh</i>. See
+ * also <code>Hash#keys</code>.
+ *
+ * h = { "a" => 100, "b" => 200, "c" => 300 }
+ * h.values #=> [100, 200, 300]
+ *
+ */
+
+static mrb_value
+mrb_hash_values(mrb_state *mrb, mrb_value hash)
+{
+ khash_t(ht) *h = RHASH_TBL(hash);
+ khiter_t k;
+ mrb_value ary;
+
+ if (!h) return mrb_ary_new(mrb);
+ ary = mrb_ary_new_capa(mrb, kh_size(h));
+ for (k = kh_begin(h); k != kh_end(h); k++) {
+ if (kh_exist(h, k)) {
+ mrb_hash_value hv = kh_value(h, k);
+
+ mrb_ary_set(mrb, ary, hv.n, hv.v);
+ }
+ }
+ return ary;
+}
+
+/* 15.2.13.4.13 */
+/* 15.2.13.4.15 */
+/* 15.2.13.4.18 */
+/* 15.2.13.4.21 */
+/*
+ * call-seq:
+ * hsh.has_key?(key) -> true or false
+ * hsh.include?(key) -> true or false
+ * hsh.key?(key) -> true or false
+ * hsh.member?(key) -> true or false
+ *
+ * Returns <code>true</code> if the given key is present in <i>hsh</i>.
+ *
+ * h = { "a" => 100, "b" => 200 }
+ * h.has_key?("a") #=> true
+ * h.has_key?("z") #=> false
+ *
+ */
+
+static mrb_value
+mrb_hash_has_key(mrb_state *mrb, mrb_value hash)
+{
+ mrb_value key;
+ khash_t(ht) *h;
+ khiter_t k;
+
+ mrb_get_args(mrb, "o", &key);
+
+ h = RHASH_TBL(hash);
+ if (h) {
+ k = kh_get(ht, mrb, h, key);
+ return mrb_bool_value(k != kh_end(h));
+ }
+ return mrb_false_value();
+}
+
+/* 15.2.13.4.14 */
+/* 15.2.13.4.27 */
+/*
+ * call-seq:
+ * hsh.has_value?(value) -> true or false
+ * hsh.value?(value) -> true or false
+ *
+ * Returns <code>true</code> if the given value is present for some key
+ * in <i>hsh</i>.
+ *
+ * h = { "a" => 100, "b" => 200 }
+ * h.has_value?(100) #=> true
+ * h.has_value?(999) #=> false
+ */
+
+static mrb_value
+mrb_hash_has_value(mrb_state *mrb, mrb_value hash)
+{
+ mrb_value val;
+ khash_t(ht) *h;
+ khiter_t k;
+
+ mrb_get_args(mrb, "o", &val);
+ h = RHASH_TBL(hash);
+
+ if (h) {
+ for (k = kh_begin(h); k != kh_end(h); k++) {
+ if (!kh_exist(h, k)) continue;
+
+ if (mrb_equal(mrb, kh_value(h, k).v, val)) {
+ return mrb_true_value();
+ }
+ }
+ }
+ return mrb_false_value();
+}
+
+void
+mrb_init_hash(mrb_state *mrb)
+{
+ struct RClass *h;
+
+ h = mrb->hash_class = mrb_define_class(mrb, "Hash", mrb->object_class); /* 15.2.13 */
+ MRB_SET_INSTANCE_TT(h, MRB_TT_HASH);
+
+ mrb_define_method(mrb, h, "[]", mrb_hash_aget, MRB_ARGS_REQ(1)); /* 15.2.13.4.2 */
+ mrb_define_method(mrb, h, "[]=", mrb_hash_aset, MRB_ARGS_REQ(2)); /* 15.2.13.4.3 */
+ mrb_define_method(mrb, h, "clear", mrb_hash_clear, MRB_ARGS_NONE()); /* 15.2.13.4.4 */
+ mrb_define_method(mrb, h, "default", mrb_hash_default, MRB_ARGS_ANY()); /* 15.2.13.4.5 */
+ mrb_define_method(mrb, h, "default=", mrb_hash_set_default, MRB_ARGS_REQ(1)); /* 15.2.13.4.6 */
+ mrb_define_method(mrb, h, "default_proc", mrb_hash_default_proc,MRB_ARGS_NONE()); /* 15.2.13.4.7 */
+ mrb_define_method(mrb, h, "default_proc=", mrb_hash_set_default_proc,MRB_ARGS_REQ(1)); /* 15.2.13.4.7 */
+ mrb_define_method(mrb, h, "__delete", mrb_hash_delete, MRB_ARGS_REQ(1)); /* core of 15.2.13.4.8 */
+ mrb_define_method(mrb, h, "empty?", mrb_hash_empty_p, MRB_ARGS_NONE()); /* 15.2.13.4.12 */
+ mrb_define_method(mrb, h, "has_key?", mrb_hash_has_key, MRB_ARGS_REQ(1)); /* 15.2.13.4.13 */
+ mrb_define_method(mrb, h, "has_value?", mrb_hash_has_value, MRB_ARGS_REQ(1)); /* 15.2.13.4.14 */
+ mrb_define_method(mrb, h, "include?", mrb_hash_has_key, MRB_ARGS_REQ(1)); /* 15.2.13.4.15 */
+ mrb_define_method(mrb, h, "initialize", mrb_hash_init, MRB_ARGS_OPT(1)); /* 15.2.13.4.16 */
+ mrb_define_method(mrb, h, "key?", mrb_hash_has_key, MRB_ARGS_REQ(1)); /* 15.2.13.4.18 */
+ mrb_define_method(mrb, h, "keys", mrb_hash_keys, MRB_ARGS_NONE()); /* 15.2.13.4.19 */
+ mrb_define_method(mrb, h, "length", mrb_hash_size_m, MRB_ARGS_NONE()); /* 15.2.13.4.20 */
+ mrb_define_method(mrb, h, "member?", mrb_hash_has_key, MRB_ARGS_REQ(1)); /* 15.2.13.4.21 */
+ mrb_define_method(mrb, h, "shift", mrb_hash_shift, MRB_ARGS_NONE()); /* 15.2.13.4.24 */
+ mrb_define_method(mrb, h, "dup", mrb_hash_dup, MRB_ARGS_NONE());
+ mrb_define_method(mrb, h, "size", mrb_hash_size_m, MRB_ARGS_NONE()); /* 15.2.13.4.25 */
+ mrb_define_method(mrb, h, "store", mrb_hash_aset, MRB_ARGS_REQ(2)); /* 15.2.13.4.26 */
+ mrb_define_method(mrb, h, "value?", mrb_hash_has_value, MRB_ARGS_REQ(1)); /* 15.2.13.4.27 */
+ mrb_define_method(mrb, h, "values", mrb_hash_values, MRB_ARGS_NONE()); /* 15.2.13.4.28 */
+
+ mrb_define_method(mrb, h, "to_hash", mrb_hash_to_hash, MRB_ARGS_NONE()); /* 15.2.13.4.29 (x)*/
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/init.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,52 @@
+/*
+** init.c - initialize mruby core
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+
+void mrb_init_symtbl(mrb_state*);
+void mrb_init_class(mrb_state*);
+void mrb_init_object(mrb_state*);
+void mrb_init_kernel(mrb_state*);
+void mrb_init_comparable(mrb_state*);
+void mrb_init_enumerable(mrb_state*);
+void mrb_init_symbol(mrb_state*);
+void mrb_init_exception(mrb_state*);
+void mrb_init_proc(mrb_state*);
+void mrb_init_string(mrb_state*);
+void mrb_init_array(mrb_state*);
+void mrb_init_hash(mrb_state*);
+void mrb_init_numeric(mrb_state*);
+void mrb_init_range(mrb_state*);
+void mrb_init_gc(mrb_state*);
+void mrb_init_math(mrb_state*);
+void mrb_init_version(mrb_state*);
+void mrb_init_mrblib(mrb_state*);
+
+#define DONE mrb_gc_arena_restore(mrb, 0);
+void
+mrb_init_core(mrb_state *mrb)
+{
+ mrb_init_symtbl(mrb); DONE;
+
+ mrb_init_class(mrb); DONE;
+ mrb_init_object(mrb); DONE;
+ mrb_init_kernel(mrb); DONE;
+ mrb_init_comparable(mrb); DONE;
+ mrb_init_enumerable(mrb); DONE;
+
+ mrb_init_symbol(mrb); DONE;
+ mrb_init_exception(mrb); DONE;
+ mrb_init_proc(mrb); DONE;
+ mrb_init_string(mrb); DONE;
+ mrb_init_array(mrb); DONE;
+ mrb_init_hash(mrb); DONE;
+ mrb_init_numeric(mrb); DONE;
+ mrb_init_range(mrb); DONE;
+ mrb_init_gc(mrb); DONE;
+ mrb_init_version(mrb); DONE;
+ mrb_init_mrblib(mrb); DONE;
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/kernel.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,1119 @@
+/*
+** kernel.c - Kernel module
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/proc.h"
+#include "mruby/string.h"
+#include "mruby/variable.h"
+#include "mruby/error.h"
+
+typedef enum {
+ NOEX_PUBLIC = 0x00,
+ NOEX_NOSUPER = 0x01,
+ NOEX_PRIVATE = 0x02,
+ NOEX_PROTECTED = 0x04,
+ NOEX_MASK = 0x06,
+ NOEX_BASIC = 0x08,
+ NOEX_UNDEF = NOEX_NOSUPER,
+ NOEX_MODFUNC = 0x12,
+ NOEX_SUPER = 0x20,
+ NOEX_VCALL = 0x40,
+ NOEX_RESPONDS = 0x80
+} mrb_method_flag_t;
+
+static mrb_bool
+mrb_obj_basic_to_s_p(mrb_state *mrb, mrb_value obj)
+{
+ struct RProc *me = mrb_method_search(mrb, mrb_class(mrb, obj), mrb_intern_lit(mrb, "to_s"));
+ if (MRB_PROC_CFUNC_P(me) && (me->body.func == mrb_any_to_s))
+ return TRUE;
+ return FALSE;
+}
+
+/* 15.3.1.3.17 */
+/*
+ * call-seq:
+ * obj.inspect -> string
+ *
+ * Returns a string containing a human-readable representation of
+ * <i>obj</i>. If not overridden and no instance variables, uses the
+ * <code>to_s</code> method to generate the string.
+ * <i>obj</i>. If not overridden, uses the <code>to_s</code> method to
+ * generate the string.
+ *
+ * [ 1, 2, 3..4, 'five' ].inspect #=> "[1, 2, 3..4, \"five\"]"
+ * Time.new.inspect #=> "2008-03-08 19:43:39 +0900"
+ */
+MRB_API mrb_value
+mrb_obj_inspect(mrb_state *mrb, mrb_value obj)
+{
+ if ((mrb_type(obj) == MRB_TT_OBJECT) && mrb_obj_basic_to_s_p(mrb, obj)) {
+ return mrb_obj_iv_inspect(mrb, mrb_obj_ptr(obj));
+ }
+ return mrb_any_to_s(mrb, obj);
+}
+
+/* 15.3.1.3.1 */
+/* 15.3.1.3.10 */
+/* 15.3.1.3.11 */
+/*
+ * call-seq:
+ * obj == other -> true or false
+ * obj.equal?(other) -> true or false
+ * obj.eql?(other) -> true or false
+ *
+ * Equality---At the <code>Object</code> level, <code>==</code> returns
+ * <code>true</code> only if <i>obj</i> and <i>other</i> are the
+ * same object. Typically, this method is overridden in descendant
+ * classes to provide class-specific meaning.
+ *
+ * Unlike <code>==</code>, the <code>equal?</code> method should never be
+ * overridden by subclasses: it is used to determine object identity
+ * (that is, <code>a.equal?(b)</code> iff <code>a</code> is the same
+ * object as <code>b</code>).
+ *
+ * The <code>eql?</code> method returns <code>true</code> if
+ * <i>obj</i> and <i>anObject</i> have the same value. Used by
+ * <code>Hash</code> to test members for equality. For objects of
+ * class <code>Object</code>, <code>eql?</code> is synonymous with
+ * <code>==</code>. Subclasses normally continue this tradition, but
+ * there are exceptions. <code>Numeric</code> types, for example,
+ * perform type conversion across <code>==</code>, but not across
+ * <code>eql?</code>, so:
+ *
+ * 1 == 1.0 #=> true
+ * 1.eql? 1.0 #=> false
+ */
+static mrb_value
+mrb_obj_equal_m(mrb_state *mrb, mrb_value self)
+{
+ mrb_value arg;
+
+ mrb_get_args(mrb, "o", &arg);
+ return mrb_bool_value(mrb_obj_equal(mrb, self, arg));
+}
+
+static mrb_value
+mrb_obj_not_equal_m(mrb_state *mrb, mrb_value self)
+{
+ mrb_value arg;
+
+ mrb_get_args(mrb, "o", &arg);
+ return mrb_bool_value(!mrb_equal(mrb, self, arg));
+}
+
+/* 15.3.1.3.2 */
+/*
+ * call-seq:
+ * obj === other -> true or false
+ *
+ * Case Equality---For class <code>Object</code>, effectively the same
+ * as calling <code>#==</code>, but typically overridden by descendants
+ * to provide meaningful semantics in <code>case</code> statements.
+ */
+static mrb_value
+mrb_equal_m(mrb_state *mrb, mrb_value self)
+{
+ mrb_value arg;
+
+ mrb_get_args(mrb, "o", &arg);
+ return mrb_bool_value(mrb_equal(mrb, self, arg));
+}
+
+/* 15.3.1.3.3 */
+/* 15.3.1.3.33 */
+/*
+ * Document-method: __id__
+ * Document-method: object_id
+ *
+ * call-seq:
+ * obj.__id__ -> fixnum
+ * obj.object_id -> fixnum
+ *
+ * Returns an integer identifier for <i>obj</i>. The same number will
+ * be returned on all calls to <code>id</code> for a given object, and
+ * no two active objects will share an id.
+ * <code>Object#object_id</code> is a different concept from the
+ * <code>:name</code> notation, which returns the symbol id of
+ * <code>name</code>. Replaces the deprecated <code>Object#id</code>.
+ */
+static mrb_value
+mrb_obj_id_m(mrb_state *mrb, mrb_value self)
+{
+ return mrb_fixnum_value(mrb_obj_id(self));
+}
+
+/* 15.3.1.2.2 */
+/* 15.3.1.2.5 */
+/* 15.3.1.3.6 */
+/* 15.3.1.3.25 */
+/*
+ * call-seq:
+ * block_given? -> true or false
+ * iterator? -> true or false
+ *
+ * Returns <code>true</code> if <code>yield</code> would execute a
+ * block in the current context. The <code>iterator?</code> form
+ * is mildly deprecated.
+ *
+ * def try
+ * if block_given?
+ * yield
+ * else
+ * "no block"
+ * end
+ * end
+ * try #=> "no block"
+ * try { "hello" } #=> "hello"
+ * try do "hello" end #=> "hello"
+ */
+static mrb_value
+mrb_f_block_given_p_m(mrb_state *mrb, mrb_value self)
+{
+ mrb_callinfo *ci = mrb->c->ci;
+ mrb_value *bp;
+ mrb_bool given_p;
+
+ bp = ci->stackent + 1;
+ ci--;
+ if (ci <= mrb->c->cibase) {
+ given_p = FALSE;
+ }
+ else {
+ /* block_given? called within block; check upper scope */
+ if (ci->proc->env && ci->proc->env->stack) {
+ given_p = !(ci->proc->env->stack == mrb->c->stbase ||
+ mrb_nil_p(ci->proc->env->stack[1]));
+ }
+ else {
+ if (ci->argc > 0) {
+ bp += ci->argc;
+ }
+ given_p = !mrb_nil_p(*bp);
+ }
+ }
+
+ return mrb_bool_value(given_p);
+}
+
+/* 15.3.1.3.7 */
+/*
+ * call-seq:
+ * obj.class -> class
+ *
+ * Returns the class of <i>obj</i>. This method must always be
+ * called with an explicit receiver, as <code>class</code> is also a
+ * reserved word in Ruby.
+ *
+ * 1.class #=> Fixnum
+ * self.class #=> Object
+ */
+static mrb_value
+mrb_obj_class_m(mrb_state *mrb, mrb_value self)
+{
+ return mrb_obj_value(mrb_obj_class(mrb, self));
+}
+
+static struct RClass*
+mrb_singleton_class_clone(mrb_state *mrb, mrb_value obj)
+{
+ struct RClass *klass = mrb_basic_ptr(obj)->c;
+
+ if (klass->tt != MRB_TT_SCLASS)
+ return klass;
+ else {
+ /* copy singleton(unnamed) class */
+ struct RClass *clone = (struct RClass*)mrb_obj_alloc(mrb, klass->tt, mrb->class_class);
+
+ if ((mrb_type(obj) == MRB_TT_CLASS) ||
+ (mrb_type(obj) == MRB_TT_SCLASS)) { /* BUILTIN_TYPE(obj) == T_CLASS */
+ clone->c = clone;
+ }
+ else {
+ clone->c = mrb_singleton_class_clone(mrb, mrb_obj_value(klass));
+ }
+
+ clone->super = klass->super;
+ if (klass->iv) {
+ mrb_iv_copy(mrb, mrb_obj_value(clone), mrb_obj_value(klass));
+ mrb_obj_iv_set(mrb, (struct RObject*)clone, mrb_intern_lit(mrb, "__attached__"), obj);
+ }
+ if (klass->mt) {
+ clone->mt = kh_copy(mt, mrb, klass->mt);
+ }
+ else {
+ clone->mt = kh_init(mt, mrb);
+ }
+ clone->tt = MRB_TT_SCLASS;
+ return clone;
+ }
+}
+
+static void
+copy_class(mrb_state *mrb, mrb_value dst, mrb_value src)
+{
+ struct RClass *dc = mrb_class_ptr(dst);
+ struct RClass *sc = mrb_class_ptr(src);
+ dc->mt = kh_copy(mt, mrb, sc->mt);
+ dc->super = sc->super;
+}
+
+static void
+init_copy(mrb_state *mrb, mrb_value dest, mrb_value obj)
+{
+ switch (mrb_type(obj)) {
+ case MRB_TT_CLASS:
+ case MRB_TT_MODULE:
+ copy_class(mrb, dest, obj);
+ /* fall through */
+ case MRB_TT_OBJECT:
+ case MRB_TT_SCLASS:
+ case MRB_TT_HASH:
+ case MRB_TT_DATA:
+ case MRB_TT_EXCEPTION:
+ mrb_iv_copy(mrb, dest, obj);
+ break;
+
+ default:
+ break;
+ }
+ mrb_funcall(mrb, dest, "initialize_copy", 1, obj);
+}
+
+/* 15.3.1.3.8 */
+/*
+ * call-seq:
+ * obj.clone -> an_object
+ *
+ * Produces a shallow copy of <i>obj</i>---the instance variables of
+ * <i>obj</i> are copied, but not the objects they reference. Copies
+ * the frozen state of <i>obj</i>. See also the discussion
+ * under <code>Object#dup</code>.
+ *
+ * class Klass
+ * attr_accessor :str
+ * end
+ * s1 = Klass.new #=> #<Klass:0x401b3a38>
+ * s1.str = "Hello" #=> "Hello"
+ * s2 = s1.clone #=> #<Klass:0x401b3998 @str="Hello">
+ * s2.str[1,4] = "i" #=> "i"
+ * s1.inspect #=> "#<Klass:0x401b3a38 @str=\"Hi\">"
+ * s2.inspect #=> "#<Klass:0x401b3998 @str=\"Hi\">"
+ *
+ * This method may have class-specific behavior. If so, that
+ * behavior will be documented under the #+initialize_copy+ method of
+ * the class.
+ *
+ * Some Class(True False Nil Symbol Fixnum Float) Object cannot clone.
+ */
+MRB_API mrb_value
+mrb_obj_clone(mrb_state *mrb, mrb_value self)
+{
+ struct RObject *p;
+ mrb_value clone;
+
+ if (mrb_immediate_p(self)) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "can't clone %S", self);
+ }
+ p = (struct RObject*)mrb_obj_alloc(mrb, mrb_type(self), mrb_obj_class(mrb, self));
+ p->c = mrb_singleton_class_clone(mrb, self);
+ clone = mrb_obj_value(p);
+ init_copy(mrb, clone, self);
+
+ return clone;
+}
+
+/* 15.3.1.3.9 */
+/*
+ * call-seq:
+ * obj.dup -> an_object
+ *
+ * Produces a shallow copy of <i>obj</i>---the instance variables of
+ * <i>obj</i> are copied, but not the objects they reference.
+ * <code>dup</code> copies the frozen state of <i>obj</i>. See also
+ * the discussion under <code>Object#clone</code>. In general,
+ * <code>clone</code> and <code>dup</code> may have different semantics
+ * in descendant classes. While <code>clone</code> is used to duplicate
+ * an object, including its internal state, <code>dup</code> typically
+ * uses the class of the descendant object to create the new instance.
+ *
+ * This method may have class-specific behavior. If so, that
+ * behavior will be documented under the #+initialize_copy+ method of
+ * the class.
+ */
+
+MRB_API mrb_value
+mrb_obj_dup(mrb_state *mrb, mrb_value obj)
+{
+ struct RBasic *p;
+ mrb_value dup;
+
+ if (mrb_immediate_p(obj)) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "can't dup %S", obj);
+ }
+ p = mrb_obj_alloc(mrb, mrb_type(obj), mrb_obj_class(mrb, obj));
+ dup = mrb_obj_value(p);
+ init_copy(mrb, dup, obj);
+
+ return dup;
+}
+
+static mrb_value
+mrb_obj_extend(mrb_state *mrb, mrb_int argc, mrb_value *argv, mrb_value obj)
+{
+ mrb_int i;
+
+ if (argc == 0) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (at least 1)");
+ }
+ for (i = 0; i < argc; i++) {
+ mrb_check_type(mrb, argv[i], MRB_TT_MODULE);
+ }
+ while (argc--) {
+ mrb_funcall(mrb, argv[argc], "extend_object", 1, obj);
+ mrb_funcall(mrb, argv[argc], "extended", 1, obj);
+ }
+ return obj;
+}
+
+/* 15.3.1.3.13 */
+/*
+ * call-seq:
+ * obj.extend(module, ...) -> obj
+ *
+ * Adds to _obj_ the instance methods from each module given as a
+ * parameter.
+ *
+ * module Mod
+ * def hello
+ * "Hello from Mod.\n"
+ * end
+ * end
+ *
+ * class Klass
+ * def hello
+ * "Hello from Klass.\n"
+ * end
+ * end
+ *
+ * k = Klass.new
+ * k.hello #=> "Hello from Klass.\n"
+ * k.extend(Mod) #=> #<Klass:0x401b3bc8>
+ * k.hello #=> "Hello from Mod.\n"
+ */
+static mrb_value
+mrb_obj_extend_m(mrb_state *mrb, mrb_value self)
+{
+ mrb_value *argv;
+ mrb_int argc;
+
+ mrb_get_args(mrb, "*", &argv, &argc);
+ return mrb_obj_extend(mrb, argc, argv, self);
+}
+
+/* 15.3.1.3.15 */
+/*
+ * call-seq:
+ * obj.hash -> fixnum
+ *
+ * Generates a <code>Fixnum</code> hash value for this object. This
+ * function must have the property that <code>a.eql?(b)</code> implies
+ * <code>a.hash == b.hash</code>. The hash value is used by class
+ * <code>Hash</code>. Any hash value that exceeds the capacity of a
+ * <code>Fixnum</code> will be truncated before being used.
+ */
+MRB_API mrb_value
+mrb_obj_hash(mrb_state *mrb, mrb_value self)
+{
+ return mrb_fixnum_value(mrb_obj_id(self));
+}
+
+/* 15.3.1.3.16 */
+static mrb_value
+mrb_obj_init_copy(mrb_state *mrb, mrb_value self)
+{
+ mrb_value orig;
+
+ mrb_get_args(mrb, "o", &orig);
+ if (mrb_obj_equal(mrb, self, orig)) return self;
+ if ((mrb_type(self) != mrb_type(orig)) || (mrb_obj_class(mrb, self) != mrb_obj_class(mrb, orig))) {
+ mrb_raise(mrb, E_TYPE_ERROR, "initialize_copy should take same class object");
+ }
+ return self;
+}
+
+
+/* implementation of instance_eval */
+mrb_value mrb_obj_instance_eval(mrb_state*, mrb_value);
+
+MRB_API mrb_bool
+mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c)
+{
+ if (mrb_obj_class(mrb, obj) == c) return TRUE;
+ return FALSE;
+}
+
+/* 15.3.1.3.19 */
+/*
+ * call-seq:
+ * obj.instance_of?(class) -> true or false
+ *
+ * Returns <code>true</code> if <i>obj</i> is an instance of the given
+ * class. See also <code>Object#kind_of?</code>.
+ */
+static mrb_value
+obj_is_instance_of(mrb_state *mrb, mrb_value self)
+{
+ mrb_value arg;
+
+ mrb_get_args(mrb, "C", &arg);
+
+ return mrb_bool_value(mrb_obj_is_instance_of(mrb, self, mrb_class_ptr(arg)));
+}
+
+/* 15.3.1.3.20 */
+/*
+ * call-seq:
+ * obj.instance_variable_defined?(symbol) -> true or false
+ *
+ * Returns <code>true</code> if the given instance variable is
+ * defined in <i>obj</i>.
+ *
+ * class Fred
+ * def initialize(p1, p2)
+ * @a, @b = p1, p2
+ * end
+ * end
+ * fred = Fred.new('cat', 99)
+ * fred.instance_variable_defined?(:@a) #=> true
+ * fred.instance_variable_defined?("@b") #=> true
+ * fred.instance_variable_defined?("@c") #=> false
+ */
+static mrb_value
+mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self)
+{
+ mrb_sym sym;
+
+ mrb_get_args(mrb, "n", &sym);
+ mrb_iv_check(mrb, sym);
+ return mrb_bool_value(mrb_iv_defined(mrb, self, sym));
+}
+
+/* 15.3.1.3.21 */
+/*
+ * call-seq:
+ * obj.instance_variable_get(symbol) -> obj
+ *
+ * Returns the value of the given instance variable, or nil if the
+ * instance variable is not set. The <code>@</code> part of the
+ * variable name should be included for regular instance
+ * variables. Throws a <code>NameError</code> exception if the
+ * supplied symbol is not valid as an instance variable name.
+ *
+ * class Fred
+ * def initialize(p1, p2)
+ * @a, @b = p1, p2
+ * end
+ * end
+ * fred = Fred.new('cat', 99)
+ * fred.instance_variable_get(:@a) #=> "cat"
+ * fred.instance_variable_get("@b") #=> 99
+ */
+static mrb_value
+mrb_obj_ivar_get(mrb_state *mrb, mrb_value self)
+{
+ mrb_sym iv_name;
+
+ mrb_get_args(mrb, "n", &iv_name);
+ mrb_iv_check(mrb, iv_name);
+ return mrb_iv_get(mrb, self, iv_name);
+}
+
+/* 15.3.1.3.22 */
+/*
+ * call-seq:
+ * obj.instance_variable_set(symbol, obj) -> obj
+ *
+ * Sets the instance variable names by <i>symbol</i> to
+ * <i>object</i>, thereby frustrating the efforts of the class's
+ * author to attempt to provide proper encapsulation. The variable
+ * did not have to exist prior to this call.
+ *
+ * class Fred
+ * def initialize(p1, p2)
+ * @a, @b = p1, p2
+ * end
+ * end
+ * fred = Fred.new('cat', 99)
+ * fred.instance_variable_set(:@a, 'dog') #=> "dog"
+ * fred.instance_variable_set(:@c, 'cat') #=> "cat"
+ * fred.inspect #=> "#<Fred:0x401b3da8 @a=\"dog\", @b=99, @c=\"cat\">"
+ */
+static mrb_value
+mrb_obj_ivar_set(mrb_state *mrb, mrb_value self)
+{
+ mrb_sym iv_name;
+ mrb_value val;
+
+ mrb_get_args(mrb, "no", &iv_name, &val);
+ mrb_iv_check(mrb, iv_name);
+ mrb_iv_set(mrb, self, iv_name, val);
+ return val;
+}
+
+/* 15.3.1.3.24 */
+/* 15.3.1.3.26 */
+/*
+ * call-seq:
+ * obj.is_a?(class) -> true or false
+ * obj.kind_of?(class) -> true or false
+ *
+ * Returns <code>true</code> if <i>class</i> is the class of
+ * <i>obj</i>, or if <i>class</i> is one of the superclasses of
+ * <i>obj</i> or modules included in <i>obj</i>.
+ *
+ * module M; end
+ * class A
+ * include M
+ * end
+ * class B < A; end
+ * class C < B; end
+ * b = B.new
+ * b.instance_of? A #=> false
+ * b.instance_of? B #=> true
+ * b.instance_of? C #=> false
+ * b.instance_of? M #=> false
+ * b.kind_of? A #=> true
+ * b.kind_of? B #=> true
+ * b.kind_of? C #=> false
+ * b.kind_of? M #=> true
+ */
+static mrb_value
+mrb_obj_is_kind_of_m(mrb_state *mrb, mrb_value self)
+{
+ mrb_value arg;
+
+ mrb_get_args(mrb, "C", &arg);
+
+ return mrb_bool_value(mrb_obj_is_kind_of(mrb, self, mrb_class_ptr(arg)));
+}
+
+KHASH_DECLARE(st, mrb_sym, char, FALSE)
+KHASH_DEFINE(st, mrb_sym, char, FALSE, kh_int_hash_func, kh_int_hash_equal)
+
+static void
+method_entry_loop(mrb_state *mrb, struct RClass* klass, khash_t(st)* set)
+{
+ khint_t i;
+
+ khash_t(mt) *h = klass->mt;
+ if (!h) return;
+ for (i=0;i<kh_end(h);i++) {
+ if (kh_exist(h, i) && kh_value(h, i)) {
+ kh_put(st, mrb, set, kh_key(h, i));
+ }
+ }
+}
+
+mrb_value
+mrb_class_instance_method_list(mrb_state *mrb, mrb_bool recur, struct RClass* klass, int obj)
+{
+ khint_t i;
+ mrb_value ary;
+ struct RClass* oldklass;
+ khash_t(st)* set = kh_init(st, mrb);
+
+ oldklass = 0;
+ while (klass && (klass != oldklass)) {
+ method_entry_loop(mrb, klass, set);
+ if ((klass->tt == MRB_TT_ICLASS) ||
+ (klass->tt == MRB_TT_SCLASS)) {
+ }
+ else {
+ if (!recur) break;
+ }
+ oldklass = klass;
+ klass = klass->super;
+ }
+
+ ary = mrb_ary_new(mrb);
+ for (i=0;i<kh_end(set);i++) {
+ if (kh_exist(set, i)) {
+ mrb_ary_push(mrb, ary, mrb_symbol_value(kh_key(set, i)));
+ }
+ }
+ kh_destroy(st, mrb, set);
+
+ return ary;
+}
+
+static mrb_value
+mrb_obj_singleton_methods(mrb_state *mrb, mrb_bool recur, mrb_value obj)
+{
+ khint_t i;
+ mrb_value ary;
+ struct RClass* klass;
+ khash_t(st)* set = kh_init(st, mrb);
+
+ klass = mrb_class(mrb, obj);
+
+ if (klass && (klass->tt == MRB_TT_SCLASS)) {
+ method_entry_loop(mrb, klass, set);
+ klass = klass->super;
+ }
+ if (recur) {
+ while (klass && ((klass->tt == MRB_TT_SCLASS) || (klass->tt == MRB_TT_ICLASS))) {
+ method_entry_loop(mrb, klass, set);
+ klass = klass->super;
+ }
+ }
+
+ ary = mrb_ary_new(mrb);
+ for (i=0;i<kh_end(set);i++) {
+ if (kh_exist(set, i)) {
+ mrb_ary_push(mrb, ary, mrb_symbol_value(kh_key(set, i)));
+ }
+ }
+ kh_destroy(st, mrb, set);
+
+ return ary;
+}
+
+static mrb_value
+mrb_obj_methods(mrb_state *mrb, mrb_bool recur, mrb_value obj, mrb_method_flag_t flag)
+{
+ if (recur)
+ return mrb_class_instance_method_list(mrb, recur, mrb_class(mrb, obj), 0);
+ return mrb_obj_singleton_methods(mrb, recur, obj);
+}
+/* 15.3.1.3.31 */
+/*
+ * call-seq:
+ * obj.methods -> array
+ *
+ * Returns a list of the names of methods publicly accessible in
+ * <i>obj</i>. This will include all the methods accessible in
+ * <i>obj</i>'s ancestors.
+ *
+ * class Klass
+ * def kMethod()
+ * end
+ * end
+ * k = Klass.new
+ * k.methods[0..9] #=> [:kMethod, :respond_to?, :nil?, :is_a?,
+ * # :class, :instance_variable_set,
+ * # :methods, :extend, :__send__, :instance_eval]
+ * k.methods.length #=> 42
+ */
+static mrb_value
+mrb_obj_methods_m(mrb_state *mrb, mrb_value self)
+{
+ mrb_bool recur = TRUE;
+ mrb_get_args(mrb, "|b", &recur);
+ return mrb_obj_methods(mrb, recur, self, (mrb_method_flag_t)0); /* everything but private */
+}
+
+/* 15.3.1.3.32 */
+/*
+ * call_seq:
+ * nil.nil? -> true
+ * <anything_else>.nil? -> false
+ *
+ * Only the object <i>nil</i> responds <code>true</code> to <code>nil?</code>.
+ */
+static mrb_value
+mrb_false(mrb_state *mrb, mrb_value self)
+{
+ return mrb_false_value();
+}
+
+/* 15.3.1.3.36 */
+/*
+ * call-seq:
+ * obj.private_methods(all=true) -> array
+ *
+ * Returns the list of private methods accessible to <i>obj</i>. If
+ * the <i>all</i> parameter is set to <code>false</code>, only those methods
+ * in the receiver will be listed.
+ */
+static mrb_value
+mrb_obj_private_methods(mrb_state *mrb, mrb_value self)
+{
+ mrb_bool recur = TRUE;
+ mrb_get_args(mrb, "|b", &recur);
+ return mrb_obj_methods(mrb, recur, self, NOEX_PRIVATE); /* private attribute not define */
+}
+
+/* 15.3.1.3.37 */
+/*
+ * call-seq:
+ * obj.protected_methods(all=true) -> array
+ *
+ * Returns the list of protected methods accessible to <i>obj</i>. If
+ * the <i>all</i> parameter is set to <code>false</code>, only those methods
+ * in the receiver will be listed.
+ */
+static mrb_value
+mrb_obj_protected_methods(mrb_state *mrb, mrb_value self)
+{
+ mrb_bool recur = TRUE;
+ mrb_get_args(mrb, "|b", &recur);
+ return mrb_obj_methods(mrb, recur, self, NOEX_PROTECTED); /* protected attribute not define */
+}
+
+/* 15.3.1.3.38 */
+/*
+ * call-seq:
+ * obj.public_methods(all=true) -> array
+ *
+ * Returns the list of public methods accessible to <i>obj</i>. If
+ * the <i>all</i> parameter is set to <code>false</code>, only those methods
+ * in the receiver will be listed.
+ */
+static mrb_value
+mrb_obj_public_methods(mrb_state *mrb, mrb_value self)
+{
+ mrb_bool recur = TRUE;
+ mrb_get_args(mrb, "|b", &recur);
+ return mrb_obj_methods(mrb, recur, self, NOEX_PUBLIC); /* public attribute not define */
+}
+
+/* 15.3.1.2.12 */
+/* 15.3.1.3.40 */
+/*
+ * call-seq:
+ * raise
+ * raise(string)
+ * raise(exception [, string])
+ *
+ * With no arguments, raises a <code>RuntimeError</code>
+ * With a single +String+ argument, raises a
+ * +RuntimeError+ with the string as a message. Otherwise,
+ * the first parameter should be the name of an +Exception+
+ * class (or an object that returns an +Exception+ object when sent
+ * an +exception+ message). The optional second parameter sets the
+ * message associated with the exception, and the third parameter is an
+ * array of callback information. Exceptions are caught by the
+ * +rescue+ clause of <code>begin...end</code> blocks.
+ *
+ * raise "Failed to create socket"
+ * raise ArgumentError, "No parameters", caller
+ */
+MRB_API mrb_value
+mrb_f_raise(mrb_state *mrb, mrb_value self)
+{
+ mrb_value a[2], exc;
+ int argc;
+
+
+ argc = mrb_get_args(mrb, "|oo", &a[0], &a[1]);
+ switch (argc) {
+ case 0:
+ mrb_raise(mrb, E_RUNTIME_ERROR, "");
+ break;
+ case 1:
+ a[1] = mrb_check_string_type(mrb, a[0]);
+ if (!mrb_nil_p(a[1])) {
+ argc = 2;
+ a[0] = mrb_obj_value(E_RUNTIME_ERROR);
+ }
+ /* fall through */
+ default:
+ exc = mrb_make_exception(mrb, argc, a);
+ mrb_obj_iv_set(mrb, mrb_obj_ptr(exc), mrb_intern_lit(mrb, "lastpc"), mrb_cptr_value(mrb, mrb->c->ci->pc));
+ mrb_exc_raise(mrb, exc);
+ break;
+ }
+ return mrb_nil_value(); /* not reached */
+}
+
+/* 15.3.1.3.41 */
+/*
+ * call-seq:
+ * obj.remove_instance_variable(symbol) -> obj
+ *
+ * Removes the named instance variable from <i>obj</i>, returning that
+ * variable's value.
+ *
+ * class Dummy
+ * attr_reader :var
+ * def initialize
+ * @var = 99
+ * end
+ * def remove
+ * remove_instance_variable(:@var)
+ * end
+ * end
+ * d = Dummy.new
+ * d.var #=> 99
+ * d.remove #=> 99
+ * d.var #=> nil
+ */
+static mrb_value
+mrb_obj_remove_instance_variable(mrb_state *mrb, mrb_value self)
+{
+ mrb_sym sym;
+ mrb_value val;
+
+ mrb_get_args(mrb, "n", &sym);
+ mrb_iv_check(mrb, sym);
+ val = mrb_iv_remove(mrb, self, sym);
+ if (mrb_undef_p(val)) {
+ mrb_name_error(mrb, sym, "instance variable %S not defined", mrb_sym2str(mrb, sym));
+ }
+ return val;
+}
+
+static inline mrb_bool
+basic_obj_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym id, int pub)
+{
+ return mrb_respond_to(mrb, obj, id);
+}
+/* 15.3.1.3.43 */
+/*
+ * call-seq:
+ * obj.respond_to?(symbol, include_private=false) -> true or false
+ *
+ * Returns +true+ if _obj_ responds to the given
+ * method. Private methods are included in the search only if the
+ * optional second parameter evaluates to +true+.
+ *
+ * If the method is not implemented,
+ * as Process.fork on Windows, File.lchmod on GNU/Linux, etc.,
+ * false is returned.
+ *
+ * If the method is not defined, <code>respond_to_missing?</code>
+ * method is called and the result is returned.
+ */
+static mrb_value
+obj_respond_to(mrb_state *mrb, mrb_value self)
+{
+ mrb_value mid;
+ mrb_sym id, rtm_id;
+ mrb_bool priv = FALSE, respond_to_p = TRUE;
+
+ mrb_get_args(mrb, "o|b", &mid, &priv);
+
+ if (mrb_symbol_p(mid)) {
+ id = mrb_symbol(mid);
+ }
+ else {
+ mrb_value tmp;
+ if (!mrb_string_p(mid)) {
+ tmp = mrb_check_string_type(mrb, mid);
+ if (mrb_nil_p(tmp)) {
+ tmp = mrb_inspect(mrb, mid);
+ mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", tmp);
+ }
+ }
+ tmp = mrb_check_intern_str(mrb, mid);
+ if (mrb_nil_p(tmp)) {
+ respond_to_p = FALSE;
+ }
+ else {
+ id = mrb_symbol(tmp);
+ }
+ }
+
+ if (respond_to_p) {
+ respond_to_p = basic_obj_respond_to(mrb, self, id, !priv);
+ }
+
+ if (!respond_to_p) {
+ rtm_id = mrb_intern_lit(mrb, "respond_to_missing?");
+ if (basic_obj_respond_to(mrb, self, rtm_id, !priv)) {
+ mrb_value args[2];
+ args[0] = mid;
+ args[1] = mrb_bool_value(priv);
+ return mrb_funcall_argv(mrb, self, rtm_id, 2, args);
+ }
+ }
+ return mrb_bool_value(respond_to_p);
+}
+
+/* 15.3.1.3.45 */
+/*
+ * call-seq:
+ * obj.singleton_methods(all=true) -> array
+ *
+ * Returns an array of the names of singleton methods for <i>obj</i>.
+ * If the optional <i>all</i> parameter is true, the list will include
+ * methods in modules included in <i>obj</i>.
+ * Only public and protected singleton methods are returned.
+ *
+ * module Other
+ * def three() end
+ * end
+ *
+ * class Single
+ * def Single.four() end
+ * end
+ *
+ * a = Single.new
+ *
+ * def a.one()
+ * end
+ *
+ * class << a
+ * include Other
+ * def two()
+ * end
+ * end
+ *
+ * Single.singleton_methods #=> [:four]
+ * a.singleton_methods(false) #=> [:two, :one]
+ * a.singleton_methods #=> [:two, :one, :three]
+ */
+static mrb_value
+mrb_obj_singleton_methods_m(mrb_state *mrb, mrb_value self)
+{
+ mrb_bool recur = TRUE;
+ mrb_get_args(mrb, "|b", &recur);
+ return mrb_obj_singleton_methods(mrb, recur, self);
+}
+
+static mrb_value
+mod_define_singleton_method(mrb_state *mrb, mrb_value self)
+{
+ struct RProc *p;
+ mrb_sym mid;
+ mrb_value blk = mrb_nil_value();
+
+ mrb_get_args(mrb, "n&", &mid, &blk);
+ if (mrb_nil_p(blk)) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
+ }
+ p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);
+ mrb_proc_copy(p, mrb_proc_ptr(blk));
+ p->flags |= MRB_PROC_STRICT;
+ mrb_define_method_raw(mrb, mrb_class_ptr(mrb_singleton_class(mrb, self)), mid, p);
+ return mrb_symbol_value(mid);
+}
+
+static mrb_value
+mrb_obj_ceqq(mrb_state *mrb, mrb_value self)
+{
+ mrb_value v;
+ mrb_int i, len;
+ mrb_sym eqq = mrb_intern_lit(mrb, "===");
+ mrb_value ary = mrb_ary_splat(mrb, self);
+
+ mrb_get_args(mrb, "o", &v);
+ len = RARRAY_LEN(ary);
+ for (i=0; i<len; i++) {
+ mrb_value c = mrb_funcall_argv(mrb, mrb_ary_entry(ary, i), eqq, 1, &v);
+ if (mrb_test(c)) return mrb_true_value();
+ }
+ return mrb_false_value();
+}
+
+static mrb_value
+mrb_local_variables(mrb_state *mrb, mrb_value self)
+{
+ mrb_value ret;
+ struct RProc *proc;
+ struct mrb_irep *irep;
+ size_t i;
+
+ proc = mrb->c->ci[-1].proc;
+
+ if (MRB_PROC_CFUNC_P(proc)) {
+ return mrb_ary_new(mrb);
+ }
+
+ irep = proc->body.irep;
+ if (!irep->lv) {
+ return mrb_ary_new(mrb);
+ }
+ ret = mrb_ary_new_capa(mrb, irep->nlocals - 1);
+ for (i = 0; i + 1 < irep->nlocals; ++i) {
+ if (irep->lv[i].name) {
+ mrb_ary_push(mrb, ret, mrb_symbol_value(irep->lv[i].name));
+ }
+ }
+ if (proc->env) {
+ struct REnv *e = proc->env;
+
+ while (e) {
+ if (!MRB_PROC_CFUNC_P(mrb->c->cibase[e->cioff].proc)) {
+ irep = mrb->c->cibase[e->cioff].proc->body.irep;
+ if (irep->lv) {
+ for (i = 0; i + 1 < irep->nlocals; ++i) {
+ if (irep->lv[i].name) {
+ mrb_ary_push(mrb, ret, mrb_symbol_value(irep->lv[i].name));
+ }
+ }
+ }
+ }
+ e = (struct REnv*)e->c;
+ }
+ }
+
+ return ret;
+}
+
+void
+mrb_init_kernel(mrb_state *mrb)
+{
+ struct RClass *krn;
+
+ krn = mrb->kernel_module = mrb_define_module(mrb, "Kernel"); /* 15.3.1 */
+ mrb_define_class_method(mrb, krn, "block_given?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.2.2 */
+ mrb_define_class_method(mrb, krn, "global_variables", mrb_f_global_variables, MRB_ARGS_NONE()); /* 15.3.1.2.4 */
+ mrb_define_class_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.2.5 */
+ mrb_define_class_method(mrb, krn, "local_variables", mrb_local_variables, MRB_ARGS_NONE()); /* 15.3.1.2.7 */
+; /* 15.3.1.2.11 */
+ mrb_define_class_method(mrb, krn, "raise", mrb_f_raise, MRB_ARGS_OPT(2)); /* 15.3.1.2.12 */
+
+ mrb_define_method(mrb, krn, "singleton_class", mrb_singleton_class, MRB_ARGS_NONE());
+
+ mrb_define_method(mrb, krn, "==", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.1 */
+ mrb_define_method(mrb, krn, "!=", mrb_obj_not_equal_m, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, krn, "===", mrb_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.2 */
+ mrb_define_method(mrb, krn, "__id__", mrb_obj_id_m, MRB_ARGS_NONE()); /* 15.3.1.3.3 */
+ mrb_define_method(mrb, krn, "__send__", mrb_f_send, MRB_ARGS_ANY()); /* 15.3.1.3.4 */
+ mrb_define_method(mrb, krn, "block_given?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.3.6 */
+ mrb_define_method(mrb, krn, "class", mrb_obj_class_m, MRB_ARGS_NONE()); /* 15.3.1.3.7 */
+ mrb_define_method(mrb, krn, "clone", mrb_obj_clone, MRB_ARGS_NONE()); /* 15.3.1.3.8 */
+ mrb_define_method(mrb, krn, "dup", mrb_obj_dup, MRB_ARGS_NONE()); /* 15.3.1.3.9 */
+ mrb_define_method(mrb, krn, "eql?", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.10 */
+ mrb_define_method(mrb, krn, "equal?", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.11 */
+ mrb_define_method(mrb, krn, "extend", mrb_obj_extend_m, MRB_ARGS_ANY()); /* 15.3.1.3.13 */
+ mrb_define_method(mrb, krn, "global_variables", mrb_f_global_variables, MRB_ARGS_NONE()); /* 15.3.1.3.14 */
+ mrb_define_method(mrb, krn, "hash", mrb_obj_hash, MRB_ARGS_NONE()); /* 15.3.1.3.15 */
+ mrb_define_method(mrb, krn, "initialize_copy", mrb_obj_init_copy, MRB_ARGS_REQ(1)); /* 15.3.1.3.16 */
+ mrb_define_method(mrb, krn, "inspect", mrb_obj_inspect, MRB_ARGS_NONE()); /* 15.3.1.3.17 */
+ mrb_define_method(mrb, krn, "instance_eval", mrb_obj_instance_eval, MRB_ARGS_ANY()); /* 15.3.1.3.18 */
+ mrb_define_method(mrb, krn, "instance_of?", obj_is_instance_of, MRB_ARGS_REQ(1)); /* 15.3.1.3.19 */
+ mrb_define_method(mrb, krn, "instance_variable_defined?", mrb_obj_ivar_defined, MRB_ARGS_REQ(1)); /* 15.3.1.3.20 */
+ mrb_define_method(mrb, krn, "instance_variable_get", mrb_obj_ivar_get, MRB_ARGS_REQ(1)); /* 15.3.1.3.21 */
+ mrb_define_method(mrb, krn, "instance_variable_set", mrb_obj_ivar_set, MRB_ARGS_REQ(2)); /* 15.3.1.3.22 */
+ mrb_define_method(mrb, krn, "instance_variables", mrb_obj_instance_variables, MRB_ARGS_NONE()); /* 15.3.1.3.23 */
+ mrb_define_method(mrb, krn, "is_a?", mrb_obj_is_kind_of_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.24 */
+ mrb_define_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.3.25 */
+ mrb_define_method(mrb, krn, "kind_of?", mrb_obj_is_kind_of_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.26 */
+ mrb_define_method(mrb, krn, "local_variables", mrb_local_variables, MRB_ARGS_NONE()); /* 15.3.1.3.28 */
+ mrb_define_method(mrb, krn, "methods", mrb_obj_methods_m, MRB_ARGS_OPT(1)); /* 15.3.1.3.31 */
+ mrb_define_method(mrb, krn, "nil?", mrb_false, MRB_ARGS_NONE()); /* 15.3.1.3.32 */
+ mrb_define_method(mrb, krn, "object_id", mrb_obj_id_m, MRB_ARGS_NONE()); /* 15.3.1.3.33 */
+ mrb_define_method(mrb, krn, "private_methods", mrb_obj_private_methods, MRB_ARGS_OPT(1)); /* 15.3.1.3.36 */
+ mrb_define_method(mrb, krn, "protected_methods", mrb_obj_protected_methods, MRB_ARGS_OPT(1)); /* 15.3.1.3.37 */
+ mrb_define_method(mrb, krn, "public_methods", mrb_obj_public_methods, MRB_ARGS_OPT(1)); /* 15.3.1.3.38 */
+ mrb_define_method(mrb, krn, "raise", mrb_f_raise, MRB_ARGS_ANY()); /* 15.3.1.3.40 */
+ mrb_define_method(mrb, krn, "remove_instance_variable", mrb_obj_remove_instance_variable,MRB_ARGS_REQ(1)); /* 15.3.1.3.41 */
+ mrb_define_method(mrb, krn, "respond_to?", obj_respond_to, MRB_ARGS_ANY()); /* 15.3.1.3.43 */
+ mrb_define_method(mrb, krn, "send", mrb_f_send, MRB_ARGS_ANY()); /* 15.3.1.3.44 */
+ mrb_define_method(mrb, krn, "singleton_methods", mrb_obj_singleton_methods_m, MRB_ARGS_OPT(1)); /* 15.3.1.3.45 */
+ mrb_define_method(mrb, krn, "define_singleton_method", mod_define_singleton_method, MRB_ARGS_ANY());
+ mrb_define_method(mrb, krn, "to_s", mrb_any_to_s, MRB_ARGS_NONE()); /* 15.3.1.3.46 */
+ mrb_define_method(mrb, krn, "__case_eqq", mrb_obj_ceqq, MRB_ARGS_REQ(1)); /* internal */
+
+ mrb_include_module(mrb, mrb->object_class, mrb->kernel_module);
+ mrb_alias_method(mrb, mrb->module_class, mrb_intern_lit(mrb, "dup"), mrb_intern_lit(mrb, "clone"));
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lex.def Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,213 @@
+/* ANSI-C code produced by gperf version 3.0.3 */
+/* Command-line: gperf -L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k'1,3,$' src/keywords */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646. */
+#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+#line 1 "src/keywords"
+
+struct kwtable {const char *name; int id[2]; enum mrb_lex_state_enum state;};
+const struct kwtable *mrb_reserved_word(const char *, unsigned int);
+static const struct kwtable *reserved_word(const char *, unsigned int);
+#define mrb_reserved_word(str, len) reserved_word(str, len)
+#line 8 "src/keywords"
+struct kwtable;
+
+#define TOTAL_KEYWORDS 40
+#define MIN_WORD_LENGTH 2
+#define MAX_WORD_LENGTH 12
+#define MIN_HASH_VALUE 8
+#define MAX_HASH_VALUE 50
+/* maximum key range = 43, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+hash (register const char *str, register unsigned int len)
+{
+ static const unsigned char asso_values[] =
+ {
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 14, 51, 16, 8,
+ 11, 13, 51, 51, 51, 51, 10, 51, 13, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 11, 51, 13, 1, 26,
+ 4, 1, 8, 28, 51, 23, 51, 1, 1, 27,
+ 5, 19, 21, 51, 8, 3, 3, 11, 51, 21,
+ 24, 16, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51
+ };
+ register int hval = len;
+
+ switch (hval)
+ {
+ default:
+ hval += asso_values[(unsigned char)str[2]];
+ /*FALLTHROUGH*/
+ case 2:
+ case 1:
+ hval += asso_values[(unsigned char)str[0]];
+ break;
+ }
+ return hval + asso_values[(unsigned char)str[len - 1]];
+}
+
+#ifdef __GNUC__
+__inline
+#ifdef __GNUC_STDC_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+const struct kwtable *
+mrb_reserved_word (register const char *str, register unsigned int len)
+{
+ static const struct kwtable wordlist[] =
+ {
+ {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+#line 18 "src/keywords"
+ {"break", {keyword_break, keyword_break}, EXPR_MID},
+#line 23 "src/keywords"
+ {"else", {keyword_else, keyword_else}, EXPR_BEG},
+#line 33 "src/keywords"
+ {"nil", {keyword_nil, keyword_nil}, EXPR_END},
+#line 26 "src/keywords"
+ {"ensure", {keyword_ensure, keyword_ensure}, EXPR_BEG},
+#line 25 "src/keywords"
+ {"end", {keyword_end, keyword_end}, EXPR_END},
+#line 42 "src/keywords"
+ {"then", {keyword_then, keyword_then}, EXPR_BEG},
+#line 34 "src/keywords"
+ {"not", {keyword_not, keyword_not}, EXPR_ARG},
+#line 27 "src/keywords"
+ {"false", {keyword_false, keyword_false}, EXPR_END},
+#line 40 "src/keywords"
+ {"self", {keyword_self, keyword_self}, EXPR_END},
+#line 24 "src/keywords"
+ {"elsif", {keyword_elsif, keyword_elsif}, EXPR_VALUE},
+#line 37 "src/keywords"
+ {"rescue", {keyword_rescue, modifier_rescue}, EXPR_MID},
+#line 43 "src/keywords"
+ {"true", {keyword_true, keyword_true}, EXPR_END},
+#line 46 "src/keywords"
+ {"until", {keyword_until, modifier_until}, EXPR_VALUE},
+#line 45 "src/keywords"
+ {"unless", {keyword_unless, modifier_unless}, EXPR_VALUE},
+#line 39 "src/keywords"
+ {"return", {keyword_return, keyword_return}, EXPR_MID},
+#line 21 "src/keywords"
+ {"def", {keyword_def, keyword_def}, EXPR_FNAME},
+#line 16 "src/keywords"
+ {"and", {keyword_and, keyword_and}, EXPR_VALUE},
+#line 22 "src/keywords"
+ {"do", {keyword_do, keyword_do}, EXPR_BEG},
+#line 49 "src/keywords"
+ {"yield", {keyword_yield, keyword_yield}, EXPR_ARG},
+#line 28 "src/keywords"
+ {"for", {keyword_for, keyword_for}, EXPR_VALUE},
+#line 44 "src/keywords"
+ {"undef", {keyword_undef, keyword_undef}, EXPR_FNAME},
+#line 35 "src/keywords"
+ {"or", {keyword_or, keyword_or}, EXPR_VALUE},
+#line 30 "src/keywords"
+ {"in", {keyword_in, keyword_in}, EXPR_VALUE},
+#line 47 "src/keywords"
+ {"when", {keyword_when, keyword_when}, EXPR_VALUE},
+#line 38 "src/keywords"
+ {"retry", {keyword_retry, keyword_retry}, EXPR_END},
+#line 29 "src/keywords"
+ {"if", {keyword_if, modifier_if}, EXPR_VALUE},
+#line 19 "src/keywords"
+ {"case", {keyword_case, keyword_case}, EXPR_VALUE},
+#line 36 "src/keywords"
+ {"redo", {keyword_redo, keyword_redo}, EXPR_END},
+#line 32 "src/keywords"
+ {"next", {keyword_next, keyword_next}, EXPR_MID},
+#line 41 "src/keywords"
+ {"super", {keyword_super, keyword_super}, EXPR_ARG},
+#line 31 "src/keywords"
+ {"module", {keyword_module, keyword_module}, EXPR_VALUE},
+#line 17 "src/keywords"
+ {"begin", {keyword_begin, keyword_begin}, EXPR_BEG},
+#line 12 "src/keywords"
+ {"__LINE__", {keyword__LINE__, keyword__LINE__}, EXPR_END},
+#line 11 "src/keywords"
+ {"__FILE__", {keyword__FILE__, keyword__FILE__}, EXPR_END},
+#line 10 "src/keywords"
+ {"__ENCODING__", {keyword__ENCODING__, keyword__ENCODING__}, EXPR_END},
+#line 14 "src/keywords"
+ {"END", {keyword_END, keyword_END}, EXPR_END},
+#line 15 "src/keywords"
+ {"alias", {keyword_alias, keyword_alias}, EXPR_FNAME},
+#line 13 "src/keywords"
+ {"BEGIN", {keyword_BEGIN, keyword_BEGIN}, EXPR_END},
+ {""},
+#line 20 "src/keywords"
+ {"class", {keyword_class, keyword_class}, EXPR_CLASS},
+ {""}, {""},
+#line 48 "src/keywords"
+ {"while", {keyword_while, modifier_while}, EXPR_VALUE}
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ register int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= 0)
+ {
+ register const char *s = wordlist[key].name;
+
+ if (*str == *s && !strcmp (str + 1, s + 1))
+ return &wordlist[key];
+ }
+ }
+ return 0;
+}
+#line 50 "src/keywords"
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/load.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,715 @@
+/*
+** load.c - mruby binary loader
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mruby/dump.h"
+#include "mruby/irep.h"
+#include "mruby/proc.h"
+#include "mruby/string.h"
+#include "mruby/debug.h"
+#include "mruby/error.h"
+
+#define FLAG_BYTEORDER_NATIVE 2
+#define FLAG_BYTEORDER_NONATIVE 0
+#define FLAG_SRC_MALLOC 1
+#define FLAG_SRC_STATIC 0
+
+#if !defined(_WIN32) && SIZE_MAX < UINT32_MAX
+# define SIZE_ERROR_MUL(x, y) ((x) > SIZE_MAX / (y))
+# define SIZE_ERROR(x) ((x) > SIZE_MAX)
+#else
+# define SIZE_ERROR_MUL(x, y) (0)
+# define SIZE_ERROR(x) (0)
+#endif
+
+#if UINT32_MAX > SIZE_MAX
+# error This code cannot be built on your environment.
+#endif
+
+static size_t
+skip_padding(const uint8_t *buf)
+{
+ const size_t align = MRB_DUMP_ALIGNMENT;
+ return -(intptr_t)buf & (align-1);
+}
+
+static size_t
+offset_crc_body(void)
+{
+ struct rite_binary_header header;
+ return ((uint8_t *)header.binary_crc - (uint8_t *)&header) + sizeof(header.binary_crc);
+}
+
+static mrb_irep*
+read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flags)
+{
+ size_t i;
+ const uint8_t *src = bin;
+ ptrdiff_t diff;
+ uint16_t tt, pool_data_len, snl;
+ size_t plen;
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_irep *irep = mrb_add_irep(mrb);
+
+ /* skip record size */
+ src += sizeof(uint32_t);
+
+ /* number of local variable */
+ irep->nlocals = bin_to_uint16(src);
+ src += sizeof(uint16_t);
+
+ /* number of register variable */
+ irep->nregs = bin_to_uint16(src);
+ src += sizeof(uint16_t);
+
+ /* number of child irep */
+ irep->rlen = (size_t)bin_to_uint16(src);
+ src += sizeof(uint16_t);
+
+ /* Binary Data Section */
+ /* ISEQ BLOCK */
+ irep->ilen = (size_t)bin_to_uint32(src);
+ src += sizeof(uint32_t);
+ src += skip_padding(src);
+
+ if (irep->ilen > 0) {
+ if (SIZE_ERROR_MUL(sizeof(mrb_code), irep->ilen)) {
+ return NULL;
+ }
+ if ((flags & FLAG_SRC_MALLOC) == 0 &&
+ (flags & FLAG_BYTEORDER_NATIVE)) {
+ irep->iseq = (mrb_code*)src;
+ src += sizeof(uint32_t) * irep->ilen;
+ irep->flags |= MRB_ISEQ_NO_FREE;
+ }
+ else {
+ irep->iseq = (mrb_code *)mrb_malloc(mrb, sizeof(mrb_code) * irep->ilen);
+ if (flags & FLAG_BYTEORDER_NATIVE) {
+ memcpy(irep->iseq, src, sizeof(uint32_t) * irep->ilen);
+ src += sizeof(uint32_t) * irep->ilen;
+ }
+ else {
+ for (i = 0; i < irep->ilen; i++) {
+ irep->iseq[i] = (mrb_code)bin_to_uint32(src); /* iseq */
+ src += sizeof(uint32_t);
+ }
+ }
+ }
+ }
+
+ /* POOL BLOCK */
+ plen = (size_t)bin_to_uint32(src); /* number of pool */
+ src += sizeof(uint32_t);
+ if (plen > 0) {
+ if (SIZE_ERROR_MUL(sizeof(mrb_value), plen)) {
+ return NULL;
+ }
+ irep->pool = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value) * plen);
+
+ for (i = 0; i < plen; i++) {
+ mrb_value s;
+
+ tt = *src++; /* pool TT */
+ pool_data_len = bin_to_uint16(src); /* pool data length */
+ src += sizeof(uint16_t);
+ if (flags & FLAG_SRC_MALLOC) {
+ s = mrb_str_new(mrb, (char *)src, pool_data_len);
+ }
+ else {
+ s = mrb_str_new_static(mrb, (char *)src, pool_data_len);
+ }
+ src += pool_data_len;
+ switch (tt) { /* pool data */
+ case IREP_TT_FIXNUM:
+ irep->pool[i] = mrb_str_to_inum(mrb, s, 10, FALSE);
+ break;
+
+ case IREP_TT_FLOAT:
+ irep->pool[i] = mrb_float_pool(mrb, mrb_str_to_dbl(mrb, s, FALSE));
+ break;
+
+ case IREP_TT_STRING:
+ irep->pool[i] = mrb_str_pool(mrb, s);
+ break;
+
+ default:
+ /* should not happen */
+ irep->pool[i] = mrb_nil_value();
+ break;
+ }
+ irep->plen++;
+ mrb_gc_arena_restore(mrb, ai);
+ }
+ }
+
+ /* SYMS BLOCK */
+ irep->slen = (size_t)bin_to_uint32(src); /* syms length */
+ src += sizeof(uint32_t);
+ if (irep->slen > 0) {
+ if (SIZE_ERROR_MUL(sizeof(mrb_sym), irep->slen)) {
+ return NULL;
+ }
+ irep->syms = (mrb_sym *)mrb_malloc(mrb, sizeof(mrb_sym) * irep->slen);
+
+ for (i = 0; i < irep->slen; i++) {
+ snl = bin_to_uint16(src); /* symbol name length */
+ src += sizeof(uint16_t);
+
+ if (snl == MRB_DUMP_NULL_SYM_LEN) {
+ irep->syms[i] = 0;
+ continue;
+ }
+
+ if (flags & FLAG_SRC_MALLOC) {
+ irep->syms[i] = mrb_intern(mrb, (char *)src, snl);
+ }
+ else {
+ irep->syms[i] = mrb_intern_static(mrb, (char *)src, snl);
+ }
+ src += snl + 1;
+
+ mrb_gc_arena_restore(mrb, ai);
+ }
+ }
+
+ irep->reps = (mrb_irep**)mrb_malloc(mrb, sizeof(mrb_irep*)*irep->rlen);
+
+ diff = src - bin;
+ mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
+ *len = (size_t)diff;
+
+ return irep;
+}
+
+static mrb_irep*
+read_irep_record(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flags)
+{
+ mrb_irep *irep = read_irep_record_1(mrb, bin, len, flags);
+ size_t i;
+
+ if (irep == NULL) {
+ return NULL;
+ }
+
+ bin += *len;
+ for (i=0; i<irep->rlen; i++) {
+ size_t rlen;
+
+ irep->reps[i] = read_irep_record(mrb, bin, &rlen, flags);
+ if (irep->reps[i] == NULL) {
+ return NULL;
+ }
+ bin += rlen;
+ *len += rlen;
+ }
+ return irep;
+}
+
+static mrb_irep*
+read_section_irep(mrb_state *mrb, const uint8_t *bin, uint8_t flags)
+{
+ size_t len;
+
+ bin += sizeof(struct rite_section_irep_header);
+ return read_irep_record(mrb, bin, &len, flags);
+}
+
+static int
+read_lineno_record_1(mrb_state *mrb, const uint8_t *bin, mrb_irep *irep, size_t *len)
+{
+ size_t i, fname_len, niseq;
+ char *fname;
+ uint16_t *lines;
+
+ *len = 0;
+ bin += sizeof(uint32_t); /* record size */
+ *len += sizeof(uint32_t);
+ fname_len = bin_to_uint16(bin);
+ bin += sizeof(uint16_t);
+ *len += sizeof(uint16_t);
+ if (SIZE_ERROR(fname_len + 1)) {
+ return MRB_DUMP_GENERAL_FAILURE;
+ }
+ fname = (char *)mrb_malloc(mrb, fname_len + 1);
+ memcpy(fname, bin, fname_len);
+ fname[fname_len] = '\0';
+ bin += fname_len;
+ *len += fname_len;
+
+ niseq = (size_t)bin_to_uint32(bin);
+ bin += sizeof(uint32_t); /* niseq */
+ *len += sizeof(uint32_t);
+
+ if (SIZE_ERROR_MUL(niseq, sizeof(uint16_t))) {
+ return MRB_DUMP_GENERAL_FAILURE;
+ }
+ lines = (uint16_t *)mrb_malloc(mrb, niseq * sizeof(uint16_t));
+ for (i = 0; i < niseq; i++) {
+ lines[i] = bin_to_uint16(bin);
+ bin += sizeof(uint16_t); /* niseq */
+ *len += sizeof(uint16_t);
+ }
+
+ irep->filename = fname;
+ irep->lines = lines;
+ return MRB_DUMP_OK;
+}
+
+static int
+read_lineno_record(mrb_state *mrb, const uint8_t *bin, mrb_irep *irep, size_t *lenp)
+{
+ int result = read_lineno_record_1(mrb, bin, irep, lenp);
+ size_t i;
+
+ if (result != MRB_DUMP_OK) return result;
+ for (i = 0; i < irep->rlen; i++) {
+ size_t len;
+
+ result = read_lineno_record(mrb, bin, irep->reps[i], &len);
+ if (result != MRB_DUMP_OK) break;
+ bin += len;
+ *lenp += len;
+ }
+ return result;
+}
+
+static int
+read_section_lineno(mrb_state *mrb, const uint8_t *bin, mrb_irep *irep)
+{
+ size_t len;
+
+ len = 0;
+ bin += sizeof(struct rite_section_lineno_header);
+
+ /* Read Binary Data Section */
+ return read_lineno_record(mrb, bin, irep, &len);
+}
+
+static int
+read_debug_record(mrb_state *mrb, const uint8_t *start, mrb_irep* irep, size_t *record_len, const mrb_sym *filenames, size_t filenames_len)
+{
+ const uint8_t *bin = start;
+ ptrdiff_t diff;
+ size_t record_size, i;
+ uint16_t f_idx;
+
+ if (irep->debug_info) { return MRB_DUMP_INVALID_IREP; }
+
+ irep->debug_info = (mrb_irep_debug_info*)mrb_malloc(mrb, sizeof(mrb_irep_debug_info));
+ irep->debug_info->pc_count = irep->ilen;
+
+ record_size = (size_t)bin_to_uint32(bin);
+ bin += sizeof(uint32_t);
+
+ irep->debug_info->flen = bin_to_uint16(bin);
+ irep->debug_info->files = (mrb_irep_debug_info_file**)mrb_malloc(mrb, sizeof(mrb_irep_debug_info*) * irep->debug_info->flen);
+ bin += sizeof(uint16_t);
+
+ for (f_idx = 0; f_idx < irep->debug_info->flen; ++f_idx) {
+ mrb_irep_debug_info_file *file;
+ uint16_t filename_idx;
+ mrb_int len;
+
+ file = (mrb_irep_debug_info_file *)mrb_malloc(mrb, sizeof(*file));
+ irep->debug_info->files[f_idx] = file;
+
+ file->start_pos = bin_to_uint32(bin);
+ bin += sizeof(uint32_t);
+
+ /* filename */
+ filename_idx = bin_to_uint16(bin);
+ bin += sizeof(uint16_t);
+ mrb_assert(filename_idx < filenames_len);
+ file->filename_sym = filenames[filename_idx];
+ len = 0;
+ file->filename = mrb_sym2name_len(mrb, file->filename_sym, &len);
+
+ file->line_entry_count = bin_to_uint32(bin);
+ bin += sizeof(uint32_t);
+ file->line_type = (mrb_debug_line_type)bin_to_uint8(bin);
+ bin += sizeof(uint8_t);
+ switch (file->line_type) {
+ case mrb_debug_line_ary: {
+ uint32_t l;
+
+ file->lines.ary = (uint16_t *)mrb_malloc(mrb, sizeof(uint16_t) * (size_t)(file->line_entry_count));
+ for (l = 0; l < file->line_entry_count; ++l) {
+ file->lines.ary[l] = bin_to_uint16(bin);
+ bin += sizeof(uint16_t);
+ }
+ } break;
+
+ case mrb_debug_line_flat_map: {
+ uint32_t l;
+
+ file->lines.flat_map = (mrb_irep_debug_info_line*)mrb_malloc(
+ mrb, sizeof(mrb_irep_debug_info_line) * (size_t)(file->line_entry_count));
+ for (l = 0; l < file->line_entry_count; ++l) {
+ file->lines.flat_map[l].start_pos = bin_to_uint32(bin);
+ bin += sizeof(uint32_t);
+ file->lines.flat_map[l].line = bin_to_uint16(bin);
+ bin += sizeof(uint16_t);
+ }
+ } break;
+
+ default: return MRB_DUMP_GENERAL_FAILURE;
+ }
+ }
+
+ diff = bin - start;
+ mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
+
+ if (record_size != (size_t)diff) {
+ return MRB_DUMP_GENERAL_FAILURE;
+ }
+
+ for (i = 0; i < irep->rlen; i++) {
+ size_t len;
+ int ret;
+
+ ret = read_debug_record(mrb, bin, irep->reps[i], &len, filenames, filenames_len);
+ if (ret != MRB_DUMP_OK) return ret;
+ bin += len;
+ }
+
+ diff = bin - start;
+ mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
+ *record_len = (size_t)diff;
+
+ return MRB_DUMP_OK;
+}
+
+static int
+read_section_debug(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, uint8_t flags)
+{
+ const uint8_t *bin;
+ ptrdiff_t diff;
+ struct rite_section_debug_header *header;
+ uint16_t i;
+ size_t len = 0;
+ int result;
+ uint16_t filenames_len;
+ mrb_sym *filenames;
+
+ bin = start;
+ header = (struct rite_section_debug_header *)bin;
+ bin += sizeof(struct rite_section_debug_header);
+
+ filenames_len = bin_to_uint16(bin);
+ bin += sizeof(uint16_t);
+ filenames = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym) * (size_t)filenames_len);
+ for (i = 0; i < filenames_len; ++i) {
+ uint16_t f_len = bin_to_uint16(bin);
+ bin += sizeof(uint16_t);
+ if (flags & FLAG_SRC_MALLOC) {
+ filenames[i] = mrb_intern(mrb, (const char *)bin, (size_t)f_len);
+ }
+ else {
+ filenames[i] = mrb_intern_static(mrb, (const char *)bin, (size_t)f_len);
+ }
+ bin += f_len;
+ }
+
+ result = read_debug_record(mrb, bin, irep, &len, filenames, filenames_len);
+ if (result != MRB_DUMP_OK) goto debug_exit;
+
+ bin += len;
+ diff = bin - start;
+ mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
+ if ((uint32_t)diff != bin_to_uint32(header->section_size)) {
+ result = MRB_DUMP_GENERAL_FAILURE;
+ }
+
+debug_exit:
+ mrb_free(mrb, filenames);
+ return result;
+}
+
+static int
+read_lv_record(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, size_t *record_len, mrb_sym const *syms, uint32_t syms_len)
+{
+ const uint8_t *bin = start;
+ size_t i;
+ ptrdiff_t diff;
+
+ irep->lv = (struct mrb_locals*)mrb_malloc(mrb, sizeof(struct mrb_locals) * (irep->nlocals - 1));
+
+ for (i = 0; i + 1< irep->nlocals; ++i) {
+ uint16_t const sym_idx = bin_to_uint16(bin);
+ bin += sizeof(uint16_t);
+ if (sym_idx == RITE_LV_NULL_MARK) {
+ irep->lv[i].name = 0;
+ irep->lv[i].r = 0;
+ }
+ else {
+ if (sym_idx >= syms_len) {
+ return MRB_DUMP_GENERAL_FAILURE;
+ }
+ irep->lv[i].name = syms[sym_idx];
+
+ irep->lv[i].r = bin_to_uint16(bin);
+ }
+ bin += sizeof(uint16_t);
+ }
+
+ for (i = 0; i < irep->rlen; ++i) {
+ size_t len;
+ int ret;
+
+ ret = read_lv_record(mrb, bin, irep->reps[i], &len, syms, syms_len);
+ if (ret != MRB_DUMP_OK) return ret;
+ bin += len;
+ }
+
+ diff = bin - start;
+ mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
+ *record_len = (size_t)diff;
+
+ return MRB_DUMP_OK;
+}
+
+static int
+read_section_lv(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, uint8_t flags)
+{
+ const uint8_t *bin;
+ ptrdiff_t diff;
+ struct rite_section_lv_header const *header;
+ uint32_t i;
+ size_t len = 0;
+ int result;
+ uint32_t syms_len;
+ mrb_sym *syms;
+ mrb_sym (*intern_func)(mrb_state*, const char*, size_t) =
+ (flags & FLAG_SRC_MALLOC)? mrb_intern : mrb_intern_static;
+
+ bin = start;
+ header = (struct rite_section_lv_header const*)bin;
+ bin += sizeof(struct rite_section_lv_header);
+
+ syms_len = bin_to_uint32(bin);
+ bin += sizeof(uint32_t);
+ syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym) * (size_t)syms_len);
+ for (i = 0; i < syms_len; ++i) {
+ uint16_t const str_len = bin_to_uint16(bin);
+ bin += sizeof(uint16_t);
+
+ syms[i] = intern_func(mrb, (const char*)bin, str_len);
+ bin += str_len;
+ }
+
+ result = read_lv_record(mrb, bin, irep, &len, syms, syms_len);
+ if (result != MRB_DUMP_OK) goto lv_exit;
+
+ bin += len;
+ diff = bin - start;
+ mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
+ if ((uint32_t)diff != bin_to_uint32(header->section_size)) {
+ result = MRB_DUMP_GENERAL_FAILURE;
+ }
+
+lv_exit:
+ mrb_free(mrb, syms);
+ return result;
+}
+
+static int
+read_binary_header(const uint8_t *bin, size_t *bin_size, uint16_t *crc, uint8_t *flags)
+{
+ const struct rite_binary_header *header = (const struct rite_binary_header *)bin;
+ uint32_t ident = 0;
+ size_t i;
+
+ /* create native byteorder version of RITE_BINARY_IDENTIFIER */
+ for(i=0; i<sizeof(ident); i++) {
+ ident<<=8;
+ ident|=RITE_BINARY_IDENTIFIER[i];
+ }
+ if (memcmp(header->binary_identify, &ident, sizeof(header->binary_identify)) == 0) {
+ *flags |= FLAG_BYTEORDER_NATIVE;
+ }
+ else if (memcmp(header->binary_identify, RITE_BINARY_IDENTIFIER, sizeof(header->binary_identify)) != 0) {
+ return MRB_DUMP_INVALID_FILE_HEADER;
+ }
+
+ if (memcmp(header->binary_version, RITE_BINARY_FORMAT_VER, sizeof(header->binary_version)) != 0) {
+ return MRB_DUMP_INVALID_FILE_HEADER;
+ }
+
+ if (crc) {
+ *crc = bin_to_uint16(header->binary_crc);
+ }
+ *bin_size = (size_t)bin_to_uint32(header->binary_size);
+
+ return MRB_DUMP_OK;
+}
+
+MRB_API mrb_irep*
+read_irep(mrb_state *mrb, const uint8_t *bin, uint8_t flags)
+{
+ int result;
+ mrb_irep *irep = NULL;
+ const struct rite_section_header *section_header;
+ uint16_t crc;
+ size_t bin_size = 0;
+ size_t n;
+
+ if ((mrb == NULL) || (bin == NULL)) {
+ return NULL;
+ }
+
+ result = read_binary_header(bin, &bin_size, &crc, &flags);
+ if (result != MRB_DUMP_OK) {
+ return NULL;
+ }
+
+ n = offset_crc_body();
+ if (crc != calc_crc_16_ccitt(bin + n, bin_size - n, 0)) {
+ return NULL;
+ }
+
+ bin += sizeof(struct rite_binary_header);
+ do {
+ section_header = (const struct rite_section_header *)bin;
+ if (memcmp(section_header->section_identify, RITE_SECTION_IREP_IDENTIFIER, sizeof(section_header->section_identify)) == 0) {
+ irep = read_section_irep(mrb, bin, flags);
+ if (!irep) return NULL;
+ }
+ else if (memcmp(section_header->section_identify, RITE_SECTION_LINENO_IDENTIFIER, sizeof(section_header->section_identify)) == 0) {
+ if (!irep) return NULL; /* corrupted data */
+ result = read_section_lineno(mrb, bin, irep);
+ if (result < MRB_DUMP_OK) {
+ return NULL;
+ }
+ }
+ else if (memcmp(section_header->section_identify, RITE_SECTION_DEBUG_IDENTIFIER, sizeof(section_header->section_identify)) == 0) {
+ if (!irep) return NULL; /* corrupted data */
+ result = read_section_debug(mrb, bin, irep, flags);
+ if (result < MRB_DUMP_OK) {
+ return NULL;
+ }
+ }
+ else if (memcmp(section_header->section_identify, RITE_SECTION_LV_IDENTIFIER, sizeof(section_header->section_identify)) == 0) {
+ if (!irep) return NULL;
+ result = read_section_lv(mrb, bin, irep, flags);
+ if (result < MRB_DUMP_OK) {
+ return NULL;
+ }
+ }
+ bin += bin_to_uint32(section_header->section_size);
+ } while (memcmp(section_header->section_identify, RITE_BINARY_EOF, sizeof(section_header->section_identify)) != 0);
+
+ return irep;
+}
+
+MRB_API mrb_irep*
+mrb_read_irep(mrb_state *mrb, const uint8_t *bin)
+{
+#ifdef MRB_USE_ETEXT_EDATA
+ uint8_t flags = mrb_ro_data_p((char*)bin) ? FLAG_SRC_STATIC : FLAG_SRC_MALLOC;
+#else
+ uint8_t flags = FLAG_SRC_STATIC;
+#endif
+
+ return read_irep(mrb, bin, flags);
+}
+
+static void
+irep_error(mrb_state *mrb)
+{
+ mrb->exc = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, E_SCRIPT_ERROR, "irep load error"));
+}
+
+MRB_API mrb_value
+mrb_load_irep_cxt(mrb_state *mrb, const uint8_t *bin, mrbc_context *c)
+{
+ mrb_irep *irep = mrb_read_irep(mrb, bin);
+ struct RProc *proc;
+
+ if (!irep) {
+ irep_error(mrb);
+ return mrb_nil_value();
+ }
+ proc = mrb_proc_new(mrb, irep);
+ mrb_irep_decref(mrb, irep);
+ if (c && c->no_exec) return mrb_obj_value(proc);
+ return mrb_toplevel_run(mrb, proc);
+}
+
+MRB_API mrb_value
+mrb_load_irep(mrb_state *mrb, const uint8_t *bin)
+{
+ return mrb_load_irep_cxt(mrb, bin, NULL);
+}
+
+#ifdef ENABLE_STDIO
+
+MRB_API mrb_irep*
+mrb_read_irep_file(mrb_state *mrb, FILE* fp)
+{
+ mrb_irep *irep = NULL;
+ uint8_t *buf;
+ const size_t header_size = sizeof(struct rite_binary_header);
+ size_t buf_size = 0;
+ uint8_t flags;
+ int result;
+
+ if ((mrb == NULL) || (fp == NULL)) {
+ return NULL;
+ }
+
+ /* You don't need use SIZE_ERROR as buf_size is enough small. */
+ buf = (uint8_t*)mrb_malloc(mrb, header_size);
+ if (fread(buf, header_size, 1, fp) == 0) {
+ mrb_free(mrb, buf);
+ return NULL;
+ }
+ result = read_binary_header(buf, &buf_size, NULL, &flags);
+ if (result != MRB_DUMP_OK) {
+ mrb_free(mrb, buf);
+ return NULL;
+ }
+
+ buf = (uint8_t*)mrb_realloc(mrb, buf, buf_size);
+ if (fread(buf+header_size, buf_size-header_size, 1, fp) == 0) {
+ mrb_free(mrb, buf);
+ return NULL;
+ }
+ irep = read_irep(mrb, buf, FLAG_SRC_MALLOC);
+ mrb_free(mrb, buf);
+
+ return irep;
+}
+
+void mrb_codedump_all(mrb_state*, struct RProc*);
+
+MRB_API mrb_value
+mrb_load_irep_file_cxt(mrb_state *mrb, FILE* fp, mrbc_context *c)
+{
+ mrb_irep *irep = mrb_read_irep_file(mrb, fp);
+ mrb_value val;
+ struct RProc *proc;
+
+ if (!irep) {
+ irep_error(mrb);
+ return mrb_nil_value();
+ }
+ proc = mrb_proc_new(mrb, irep);
+ mrb_irep_decref(mrb, irep);
+ if (c && c->dump_result) mrb_codedump_all(mrb, proc);
+ if (c && c->no_exec) return mrb_obj_value(proc);
+ val = mrb_toplevel_run(mrb, proc);
+ return val;
+}
+
+MRB_API mrb_value
+mrb_load_irep_file(mrb_state *mrb, FILE* fp)
+{
+ return mrb_load_irep_file_cxt(mrb, fp, NULL);
+}
+#endif /* ENABLE_STDIO */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mrb_throw.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,42 @@
+/*
+** mrb_throw.h - mruby exception throwing handler
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRB_THROW_H
+#define MRB_THROW_H
+
+#ifdef MRB_ENABLE_CXX_EXCEPTION
+
+#define MRB_TRY(buf) do { try {
+#define MRB_CATCH(buf) } catch(mrb_jmpbuf_impl e) { if (e != (buf)->impl) { throw e; }
+#define MRB_END_EXC(buf) } } while(0)
+
+#define MRB_THROW(buf) throw((buf)->impl)
+typedef mrb_int mrb_jmpbuf_impl;
+
+#else
+
+#include <setjmp.h>
+
+#define MRB_TRY(buf) do { if (setjmp((buf)->impl) == 0) {
+#define MRB_CATCH(buf) } else {
+#define MRB_END_EXC(buf) } } while(0)
+
+#define MRB_THROW(buf) longjmp((buf)->impl, 1);
+#define mrb_jmpbuf_impl jmp_buf
+
+#endif
+
+struct mrb_jmpbuf {
+ mrb_jmpbuf_impl impl;
+
+#ifdef MRB_ENABLE_CXX_EXCEPTION
+ static mrb_int jmpbuf_id;
+ mrb_jmpbuf() : impl(jmpbuf_id++) {}
+#endif
+};
+
+#endif /* MRB_THROW_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/node.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,118 @@
+/*
+** node.h - nodes of abstract syntax tree
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef NODE_H
+#define NODE_H
+
+enum node_type {
+ NODE_METHOD,
+ NODE_FBODY,
+ NODE_CFUNC,
+ NODE_SCOPE,
+ NODE_BLOCK,
+ NODE_IF,
+ NODE_CASE,
+ NODE_WHEN,
+ NODE_OPT_N,
+ NODE_WHILE,
+ NODE_UNTIL,
+ NODE_ITER,
+ NODE_FOR,
+ NODE_BREAK,
+ NODE_NEXT,
+ NODE_REDO,
+ NODE_RETRY,
+ NODE_BEGIN,
+ NODE_RESCUE,
+ NODE_ENSURE,
+ NODE_AND,
+ NODE_OR,
+ NODE_NOT,
+ NODE_MASGN,
+ NODE_ASGN,
+ NODE_CDECL,
+ NODE_CVASGN,
+ NODE_CVDECL,
+ NODE_OP_ASGN,
+ NODE_CALL,
+ NODE_FCALL,
+ NODE_VCALL,
+ NODE_SUPER,
+ NODE_ZSUPER,
+ NODE_ARRAY,
+ NODE_ZARRAY,
+ NODE_HASH,
+ NODE_RETURN,
+ NODE_YIELD,
+ NODE_LVAR,
+ NODE_DVAR,
+ NODE_GVAR,
+ NODE_IVAR,
+ NODE_CONST,
+ NODE_CVAR,
+ NODE_NTH_REF,
+ NODE_BACK_REF,
+ NODE_MATCH,
+ NODE_MATCH2,
+ NODE_MATCH3,
+ NODE_INT,
+ NODE_FLOAT,
+ NODE_NEGATE,
+ NODE_LAMBDA,
+ NODE_SYM,
+ NODE_STR,
+ NODE_DSTR,
+ NODE_XSTR,
+ NODE_DXSTR,
+ NODE_REGX,
+ NODE_DREGX,
+ NODE_DREGX_ONCE,
+ NODE_LIST,
+ NODE_ARG,
+ NODE_ARGSCAT,
+ NODE_ARGSPUSH,
+ NODE_SPLAT,
+ NODE_TO_ARY,
+ NODE_SVALUE,
+ NODE_BLOCK_ARG,
+ NODE_DEF,
+ NODE_SDEF,
+ NODE_ALIAS,
+ NODE_UNDEF,
+ NODE_CLASS,
+ NODE_MODULE,
+ NODE_SCLASS,
+ NODE_COLON2,
+ NODE_COLON3,
+ NODE_CREF,
+ NODE_DOT2,
+ NODE_DOT3,
+ NODE_FLIP2,
+ NODE_FLIP3,
+ NODE_ATTRSET,
+ NODE_SELF,
+ NODE_NIL,
+ NODE_TRUE,
+ NODE_FALSE,
+ NODE_DEFINED,
+ NODE_NEWLINE,
+ NODE_POSTEXE,
+ NODE_ALLOCA,
+ NODE_DMETHOD,
+ NODE_BMETHOD,
+ NODE_MEMO,
+ NODE_IFUNC,
+ NODE_DSYM,
+ NODE_ATTRASGN,
+ NODE_HEREDOC,
+ NODE_LITERAL_DELIM,
+ NODE_WORDS,
+ NODE_SYMBOLS,
+ NODE_LAST
+};
+
+#endif /* NODE_H */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/numeric.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,1348 @@
+/*
+** numeric.c - Numeric, Integer, Float, Fixnum class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+#include <stdlib.h>
+
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/numeric.h"
+#include "mruby/string.h"
+
+#ifdef MRB_USE_FLOAT
+#define floor(f) floorf(f)
+#define ceil(f) ceilf(f)
+#define fmod(x,y) fmodf(x,y)
+#define FLO_MAX_DIGITS 7
+#define FLO_MAX_SIGN_LENGTH 3
+#define FLO_EPSILON FLT_EPSILON
+#else
+#define FLO_MAX_DIGITS 14
+#define FLO_MAX_SIGN_LENGTH 10
+#define FLO_EPSILON DBL_EPSILON
+#endif
+
+MRB_API mrb_float
+mrb_to_flo(mrb_state *mrb, mrb_value val)
+{
+ switch (mrb_type(val)) {
+ case MRB_TT_FIXNUM:
+ return (mrb_float)mrb_fixnum(val);
+ case MRB_TT_FLOAT:
+ break;
+ default:
+ mrb_raise(mrb, E_TYPE_ERROR, "non float value");
+ }
+ return mrb_float(val);
+}
+
+/*
+ * call-seq:
+ *
+ * num ** other -> num
+ *
+ * Raises <code>num</code> the <code>other</code> power.
+ *
+ * 2.0**3 #=> 8.0
+ */
+static mrb_value
+num_pow(mrb_state *mrb, mrb_value x)
+{
+ mrb_value y;
+ mrb_float d, yv;
+
+ mrb_get_args(mrb, "o", &y);
+ yv = mrb_to_flo(mrb, y);
+ d = pow(mrb_to_flo(mrb, x), yv);
+ if (mrb_fixnum_p(x) && mrb_fixnum_p(y) && FIXABLE(d) && yv > 0)
+ return mrb_fixnum_value((mrb_int)d);
+ return mrb_float_value(mrb, d);
+}
+
+/* 15.2.8.3.4 */
+/* 15.2.9.3.4 */
+/*
+ * call-seq:
+ * num / other -> num
+ *
+ * Performs division: the class of the resulting object depends on
+ * the class of <code>num</code> and on the magnitude of the
+ * result.
+ */
+
+mrb_value
+mrb_num_div(mrb_state *mrb, mrb_value x, mrb_value y)
+{
+ return mrb_float_value(mrb, mrb_to_flo(mrb, x) / mrb_to_flo(mrb, y));
+}
+
+/* 15.2.9.3.19(x) */
+/*
+ * call-seq:
+ * num.quo(numeric) -> real
+ *
+ * Returns most exact division.
+ */
+
+static mrb_value
+num_div(mrb_state *mrb, mrb_value x)
+{
+ mrb_float y;
+
+ mrb_get_args(mrb, "f", &y);
+ return mrb_float_value(mrb, mrb_to_flo(mrb, x) / y);
+}
+
+/********************************************************************
+ *
+ * Document-class: Float
+ *
+ * <code>Float</code> objects represent inexact real numbers using
+ * the native architecture's double-precision floating point
+ * representation.
+ */
+
+static mrb_value
+mrb_flo_to_str(mrb_state *mrb, mrb_float flo)
+{
+ double n = (double)flo;
+ int max_digits = FLO_MAX_DIGITS;
+
+ if (isnan(n)) {
+ return mrb_str_new_lit(mrb, "NaN");
+ }
+ else if (isinf(n)) {
+ if (n < 0) {
+ return mrb_str_new_lit(mrb, "-inf");
+ }
+ else {
+ return mrb_str_new_lit(mrb, "inf");
+ }
+ }
+ else {
+ int digit;
+ int m = 0;
+ int exp;
+ mrb_bool e = FALSE;
+ char s[48];
+ char *c = &s[0];
+ int length = 0;
+
+ if (signbit(n)) {
+ n = -n;
+ *(c++) = '-';
+ }
+
+ if (n != 0.0) {
+ if (n > 1.0) {
+ exp = (int)floor(log10(n));
+ }
+ else {
+ exp = (int)-ceil(-log10(n));
+ }
+ }
+ else {
+ exp = 0;
+ }
+
+ /* preserve significands */
+ if (exp < 0) {
+ int i, beg = -1, end = 0;
+ double f = n;
+ double fd = 0;
+ for (i = 0; i < FLO_MAX_DIGITS; ++i) {
+ f = (f - fd) * 10.0;
+ fd = floor(f + FLO_EPSILON);
+ if (fd != 0) {
+ if (beg < 0) beg = i;
+ end = i + 1;
+ }
+ }
+ if (beg >= 0) length = end - beg;
+ if (length > FLO_MAX_SIGN_LENGTH) length = FLO_MAX_SIGN_LENGTH;
+ }
+
+ if (abs(exp) + length >= FLO_MAX_DIGITS) {
+ /* exponent representation */
+ e = TRUE;
+ n = n / pow(10.0, exp);
+ if (isinf(n)) {
+ if (s < c) { /* s[0] == '-' */
+ return mrb_str_new_lit(mrb, "-0.0");
+ }
+ else {
+ return mrb_str_new_lit(mrb, "0.0");
+ }
+ }
+ }
+ else {
+ /* un-exponent (normal) representation */
+ if (exp > 0) {
+ m = exp;
+ }
+ }
+
+ /* puts digits */
+ while (max_digits >= 0) {
+ double weight = (m < 0) ? 0.0 : pow(10.0, m);
+ double fdigit = (m < 0) ? n * 10.0 : n / weight;
+
+ if (fdigit < 0) fdigit = n = 0;
+ if (m < -1 && fdigit < FLO_EPSILON) {
+ if (e || exp > 0 || m <= -abs(exp)) {
+ break;
+ }
+ }
+ digit = (int)floor(fdigit + FLO_EPSILON);
+ if (m == 0 && digit > 9) {
+ n /= 10.0;
+ exp++;
+ continue;
+ }
+ *(c++) = '0' + digit;
+ n = (m < 0) ? n * 10.0 - digit : n - (digit * weight);
+ max_digits--;
+ if (m-- == 0) {
+ *(c++) = '.';
+ }
+ }
+ if (c[-1] == '0') {
+ while (&s[0] < c && c[-1] == '0') {
+ c--;
+ }
+ c++;
+ }
+
+ if (e) {
+ *(c++) = 'e';
+ if (exp > 0) {
+ *(c++) = '+';
+ }
+ else {
+ *(c++) = '-';
+ exp = -exp;
+ }
+
+ if (exp >= 100) {
+ *(c++) = '0' + exp / 100;
+ exp -= exp / 100 * 100;
+ }
+
+ *(c++) = '0' + exp / 10;
+ *(c++) = '0' + exp % 10;
+ }
+
+ *c = '\0';
+
+ return mrb_str_new(mrb, &s[0], c - &s[0]);
+ }
+}
+
+/* 15.2.9.3.16(x) */
+/*
+ * call-seq:
+ * flt.to_s -> string
+ *
+ * Returns a string containing a representation of self. As well as a
+ * fixed or exponential form of the number, the call may return
+ * ``<code>NaN</code>'', ``<code>Infinity</code>'', and
+ * ``<code>-Infinity</code>''.
+ */
+
+static mrb_value
+flo_to_s(mrb_state *mrb, mrb_value flt)
+{
+ return mrb_flo_to_str(mrb, mrb_float(flt));
+}
+
+/* 15.2.9.3.2 */
+/*
+ * call-seq:
+ * float - other -> float
+ *
+ * Returns a new float which is the difference of <code>float</code>
+ * and <code>other</code>.
+ */
+
+static mrb_value
+flo_minus(mrb_state *mrb, mrb_value x)
+{
+ mrb_value y;
+
+ mrb_get_args(mrb, "o", &y);
+ return mrb_float_value(mrb, mrb_float(x) - mrb_to_flo(mrb, y));
+}
+
+/* 15.2.9.3.3 */
+/*
+ * call-seq:
+ * float * other -> float
+ *
+ * Returns a new float which is the product of <code>float</code>
+ * and <code>other</code>.
+ */
+
+static mrb_value
+flo_mul(mrb_state *mrb, mrb_value x)
+{
+ mrb_value y;
+
+ mrb_get_args(mrb, "o", &y);
+ return mrb_float_value(mrb, mrb_float(x) * mrb_to_flo(mrb, y));
+}
+
+static void
+flodivmod(mrb_state *mrb, mrb_float x, mrb_float y, mrb_float *divp, mrb_float *modp)
+{
+ mrb_float div;
+ mrb_float mod;
+
+ if (y == 0.0) {
+ div = INFINITY;
+ mod = NAN;
+ }
+ else {
+ mod = fmod(x, y);
+ if (isinf(x) && isfinite(y))
+ div = x;
+ else
+ div = (x - mod) / y;
+ if (y*mod < 0) {
+ mod += y;
+ div -= 1.0;
+ }
+ }
+
+ if (modp) *modp = mod;
+ if (divp) *divp = div;
+}
+
+/* 15.2.9.3.5 */
+/*
+ * call-seq:
+ * flt % other -> float
+ * flt.modulo(other) -> float
+ *
+ * Return the modulo after division of <code>flt</code> by <code>other</code>.
+ *
+ * 6543.21.modulo(137) #=> 104.21
+ * 6543.21.modulo(137.24) #=> 92.9299999999996
+ */
+
+static mrb_value
+flo_mod(mrb_state *mrb, mrb_value x)
+{
+ mrb_value y;
+ mrb_float mod;
+
+ mrb_get_args(mrb, "o", &y);
+
+ flodivmod(mrb, mrb_float(x), mrb_to_flo(mrb, y), 0, &mod);
+ return mrb_float_value(mrb, mod);
+}
+
+/* 15.2.8.3.16 */
+/*
+ * call-seq:
+ * num.eql?(numeric) -> true or false
+ *
+ * Returns <code>true</code> if <i>num</i> and <i>numeric</i> are the
+ * same type and have equal values.
+ *
+ * 1 == 1.0 #=> true
+ * 1.eql?(1.0) #=> false
+ * (1.0).eql?(1.0) #=> true
+ */
+static mrb_value
+fix_eql(mrb_state *mrb, mrb_value x)
+{
+ mrb_value y;
+
+ mrb_get_args(mrb, "o", &y);
+ if (!mrb_fixnum_p(y)) return mrb_false_value();
+ return mrb_bool_value(mrb_fixnum(x) == mrb_fixnum(y));
+}
+
+static mrb_value
+flo_eql(mrb_state *mrb, mrb_value x)
+{
+ mrb_value y;
+
+ mrb_get_args(mrb, "o", &y);
+ if (!mrb_float_p(y)) return mrb_false_value();
+ return mrb_bool_value(mrb_float(x) == (mrb_float)mrb_fixnum(y));
+}
+
+/* 15.2.9.3.7 */
+/*
+ * call-seq:
+ * flt == obj -> true or false
+ *
+ * Returns <code>true</code> only if <i>obj</i> has the same value
+ * as <i>flt</i>. Contrast this with <code>Float#eql?</code>, which
+ * requires <i>obj</i> to be a <code>Float</code>.
+ *
+ * 1.0 == 1 #=> true
+ *
+ */
+
+static mrb_value
+flo_eq(mrb_state *mrb, mrb_value x)
+{
+ mrb_value y;
+ mrb_get_args(mrb, "o", &y);
+
+ switch (mrb_type(y)) {
+ case MRB_TT_FIXNUM:
+ return mrb_bool_value(mrb_float(x) == (mrb_float)mrb_fixnum(y));
+ case MRB_TT_FLOAT:
+ return mrb_bool_value(mrb_float(x) == mrb_float(y));
+ default:
+ return mrb_false_value();
+ }
+}
+
+/* 15.2.8.3.18 */
+/*
+ * call-seq:
+ * flt.hash -> integer
+ *
+ * Returns a hash code for this float.
+ */
+static mrb_value
+flo_hash(mrb_state *mrb, mrb_value num)
+{
+ mrb_float d;
+ char *c;
+ size_t i;
+ int hash;
+
+ d = (mrb_float)mrb_fixnum(num);
+ /* normalize -0.0 to 0.0 */
+ if (d == 0) d = 0.0;
+ c = (char*)&d;
+ for (hash=0, i=0; i<sizeof(mrb_float);i++) {
+ hash = (hash * 971) ^ (unsigned char)c[i];
+ }
+ if (hash < 0) hash = -hash;
+ return mrb_fixnum_value(hash);
+}
+
+/* 15.2.9.3.13 */
+/*
+ * call-seq:
+ * flt.to_f -> self
+ *
+ * As <code>flt</code> is already a float, returns +self+.
+ */
+
+static mrb_value
+flo_to_f(mrb_state *mrb, mrb_value num)
+{
+ return num;
+}
+
+/* 15.2.9.3.11 */
+/*
+ * call-seq:
+ * flt.infinite? -> nil, -1, +1
+ *
+ * Returns <code>nil</code>, -1, or +1 depending on whether <i>flt</i>
+ * is finite, -infinity, or +infinity.
+ *
+ * (0.0).infinite? #=> nil
+ * (-1.0/0.0).infinite? #=> -1
+ * (+1.0/0.0).infinite? #=> 1
+ */
+
+static mrb_value
+flo_infinite_p(mrb_state *mrb, mrb_value num)
+{
+ mrb_float value = mrb_float(num);
+
+ if (isinf(value)) {
+ return mrb_fixnum_value(value < 0 ? -1 : 1);
+ }
+ return mrb_nil_value();
+}
+
+/* 15.2.9.3.9 */
+/*
+ * call-seq:
+ * flt.finite? -> true or false
+ *
+ * Returns <code>true</code> if <i>flt</i> is a valid IEEE floating
+ * point number (it is not infinite, and <code>nan?</code> is
+ * <code>false</code>).
+ *
+ */
+
+static mrb_value
+flo_finite_p(mrb_state *mrb, mrb_value num)
+{
+ return mrb_bool_value(isfinite(mrb_float(num)));
+}
+
+/* 15.2.9.3.10 */
+/*
+ * call-seq:
+ * flt.floor -> integer
+ *
+ * Returns the largest integer less than or equal to <i>flt</i>.
+ *
+ * 1.2.floor #=> 1
+ * 2.0.floor #=> 2
+ * (-1.2).floor #=> -2
+ * (-2.0).floor #=> -2
+ */
+
+static mrb_value
+flo_floor(mrb_state *mrb, mrb_value num)
+{
+ mrb_float f = floor(mrb_float(num));
+
+ if (!FIXABLE(f)) {
+ return mrb_float_value(mrb, f);
+ }
+ return mrb_fixnum_value((mrb_int)f);
+}
+
+/* 15.2.9.3.8 */
+/*
+ * call-seq:
+ * flt.ceil -> integer
+ *
+ * Returns the smallest <code>Integer</code> greater than or equal to
+ * <i>flt</i>.
+ *
+ * 1.2.ceil #=> 2
+ * 2.0.ceil #=> 2
+ * (-1.2).ceil #=> -1
+ * (-2.0).ceil #=> -2
+ */
+
+static mrb_value
+flo_ceil(mrb_state *mrb, mrb_value num)
+{
+ mrb_float f = ceil(mrb_float(num));
+
+ if (!FIXABLE(f)) {
+ return mrb_float_value(mrb, f);
+ }
+ return mrb_fixnum_value((mrb_int)f);
+}
+
+/* 15.2.9.3.12 */
+/*
+ * call-seq:
+ * flt.round([ndigits]) -> integer or float
+ *
+ * Rounds <i>flt</i> to a given precision in decimal digits (default 0 digits).
+ * Precision may be negative. Returns a floating point number when ndigits
+ * is more than zero.
+ *
+ * 1.4.round #=> 1
+ * 1.5.round #=> 2
+ * 1.6.round #=> 2
+ * (-1.5).round #=> -2
+ *
+ * 1.234567.round(2) #=> 1.23
+ * 1.234567.round(3) #=> 1.235
+ * 1.234567.round(4) #=> 1.2346
+ * 1.234567.round(5) #=> 1.23457
+ *
+ * 34567.89.round(-5) #=> 0
+ * 34567.89.round(-4) #=> 30000
+ * 34567.89.round(-3) #=> 35000
+ * 34567.89.round(-2) #=> 34600
+ * 34567.89.round(-1) #=> 34570
+ * 34567.89.round(0) #=> 34568
+ * 34567.89.round(1) #=> 34567.9
+ * 34567.89.round(2) #=> 34567.89
+ * 34567.89.round(3) #=> 34567.89
+ *
+ */
+
+static mrb_value
+flo_round(mrb_state *mrb, mrb_value num)
+{
+ double number, f;
+ mrb_int ndigits = 0;
+ int i;
+
+ mrb_get_args(mrb, "|i", &ndigits);
+ number = mrb_float(num);
+
+ if (isinf(number)) {
+ if (0 < ndigits) return num;
+ else mrb_raise(mrb, E_FLOATDOMAIN_ERROR, number < 0 ? "-Infinity" : "Infinity");
+ }
+ if (isnan(number)) {
+ if (0 < ndigits) return num;
+ else mrb_raise(mrb, E_FLOATDOMAIN_ERROR, "NaN");
+ }
+
+ f = 1.0;
+ i = abs(ndigits);
+ while (--i >= 0)
+ f = f*10.0;
+
+ if (isinf(f)) {
+ if (ndigits < 0) number = 0;
+ }
+ else {
+ double d;
+
+ if (ndigits < 0) number /= f;
+ else number *= f;
+
+ /* home-made inline implementation of round(3) */
+ if (number > 0.0) {
+ d = floor(number);
+ number = d + (number - d >= 0.5);
+ }
+ else if (number < 0.0) {
+ d = ceil(number);
+ number = d - (d - number >= 0.5);
+ }
+
+ if (ndigits < 0) number *= f;
+ else number /= f;
+ }
+
+ if (ndigits > 0) {
+ if (!isfinite(number)) return num;
+ return mrb_float_value(mrb, number);
+ }
+ return mrb_fixnum_value((mrb_int)number);
+}
+
+/* 15.2.9.3.14 */
+/* 15.2.9.3.15 */
+/*
+ * call-seq:
+ * flt.to_i -> integer
+ * flt.to_int -> integer
+ * flt.truncate -> integer
+ *
+ * Returns <i>flt</i> truncated to an <code>Integer</code>.
+ */
+
+static mrb_value
+flo_truncate(mrb_state *mrb, mrb_value num)
+{
+ mrb_float f = mrb_float(num);
+
+ if (f > 0.0) f = floor(f);
+ if (f < 0.0) f = ceil(f);
+
+ if (!FIXABLE(f)) {
+ return mrb_float_value(mrb, f);
+ }
+ return mrb_fixnum_value((mrb_int)f);
+}
+
+static mrb_value
+flo_nan_p(mrb_state *mrb, mrb_value num)
+{
+ return mrb_bool_value(isnan(mrb_float(num)));
+}
+
+/*
+ * Document-class: Integer
+ *
+ * <code>Integer</code> is the basis for the two concrete classes that
+ * hold whole numbers, <code>Bignum</code> and <code>Fixnum</code>.
+ *
+ */
+
+
+/*
+ * call-seq:
+ * int.to_i -> integer
+ * int.to_int -> integer
+ *
+ * As <i>int</i> is already an <code>Integer</code>, all these
+ * methods simply return the receiver.
+ */
+
+static mrb_value
+int_to_i(mrb_state *mrb, mrb_value num)
+{
+ return num;
+}
+
+/*tests if N*N would overflow*/
+#define SQRT_INT_MAX ((mrb_int)1<<((MRB_INT_BIT-1-MRB_FIXNUM_SHIFT)/2))
+#define FIT_SQRT_INT(n) (((n)<SQRT_INT_MAX)&&((n)>=-SQRT_INT_MAX))
+
+mrb_value
+mrb_fixnum_mul(mrb_state *mrb, mrb_value x, mrb_value y)
+{
+ mrb_int a;
+
+ a = mrb_fixnum(x);
+ if (mrb_fixnum_p(y)) {
+ mrb_float c;
+ mrb_int b;
+
+ if (a == 0) return x;
+ b = mrb_fixnum(y);
+ if (FIT_SQRT_INT(a) && FIT_SQRT_INT(b))
+ return mrb_fixnum_value(a*b);
+ c = a * b;
+ if ((a != 0 && c/a != b) || !FIXABLE(c)) {
+ return mrb_float_value(mrb, (mrb_float)a*(mrb_float)b);
+ }
+ return mrb_fixnum_value((mrb_int)c);
+ }
+ return mrb_float_value(mrb, (mrb_float)a * mrb_to_flo(mrb, y));
+}
+
+/* 15.2.8.3.3 */
+/*
+ * call-seq:
+ * fix * numeric -> numeric_result
+ *
+ * Performs multiplication: the class of the resulting object depends on
+ * the class of <code>numeric</code> and on the magnitude of the
+ * result.
+ */
+
+static mrb_value
+fix_mul(mrb_state *mrb, mrb_value x)
+{
+ mrb_value y;
+
+ mrb_get_args(mrb, "o", &y);
+ return mrb_fixnum_mul(mrb, x, y);
+}
+
+static void
+fixdivmod(mrb_state *mrb, mrb_int x, mrb_int y, mrb_int *divp, mrb_int *modp)
+{
+ mrb_int div, mod;
+
+ /* TODO: add mrb_assert(y != 0) to make sure */
+
+ if (y < 0) {
+ if (x < 0)
+ div = -x / -y;
+ else
+ div = - (x / -y);
+ }
+ else {
+ if (x < 0)
+ div = - (-x / y);
+ else
+ div = x / y;
+ }
+ mod = x - div*y;
+ if ((mod < 0 && y > 0) || (mod > 0 && y < 0)) {
+ mod += y;
+ div -= 1;
+ }
+ if (divp) *divp = div;
+ if (modp) *modp = mod;
+}
+
+/* 15.2.8.3.5 */
+/*
+ * call-seq:
+ * fix % other -> real
+ * fix.modulo(other) -> real
+ *
+ * Returns <code>fix</code> modulo <code>other</code>.
+ * See <code>numeric.divmod</code> for more information.
+ */
+
+static mrb_value
+fix_mod(mrb_state *mrb, mrb_value x)
+{
+ mrb_value y;
+ mrb_int a;
+
+ mrb_get_args(mrb, "o", &y);
+ a = mrb_fixnum(x);
+ if (mrb_fixnum_p(y)) {
+ mrb_int b, mod;
+
+ if ((b=mrb_fixnum(y)) == 0) {
+ return mrb_float_value(mrb, NAN);
+ }
+ fixdivmod(mrb, a, b, 0, &mod);
+ return mrb_fixnum_value(mod);
+ }
+ else {
+ mrb_float mod;
+
+ flodivmod(mrb, (mrb_float)a, mrb_to_flo(mrb, y), 0, &mod);
+ return mrb_float_value(mrb, mod);
+ }
+}
+
+/*
+ * call-seq:
+ * fix.divmod(numeric) -> array
+ *
+ * See <code>Numeric#divmod</code>.
+ */
+static mrb_value
+fix_divmod(mrb_state *mrb, mrb_value x)
+{
+ mrb_value y;
+
+ mrb_get_args(mrb, "o", &y);
+
+ if (mrb_fixnum_p(y)) {
+ mrb_int div, mod;
+
+ if (mrb_fixnum(y) == 0) {
+ return mrb_assoc_new(mrb, mrb_float_value(mrb, INFINITY),
+ mrb_float_value(mrb, NAN));
+ }
+ fixdivmod(mrb, mrb_fixnum(x), mrb_fixnum(y), &div, &mod);
+ return mrb_assoc_new(mrb, mrb_fixnum_value(div), mrb_fixnum_value(mod));
+ }
+ else {
+ mrb_float div, mod;
+ mrb_value a, b;
+
+ flodivmod(mrb, (mrb_float)mrb_fixnum(x), mrb_to_flo(mrb, y), &div, &mod);
+ a = mrb_float_value(mrb, (mrb_int)div);
+ b = mrb_float_value(mrb, mod);
+ return mrb_assoc_new(mrb, a, b);
+ }
+}
+
+static mrb_value
+flo_divmod(mrb_state *mrb, mrb_value x)
+{
+ mrb_value y;
+ mrb_float div, mod;
+ mrb_value a, b;
+
+ mrb_get_args(mrb, "o", &y);
+
+ flodivmod(mrb, mrb_float(x), mrb_to_flo(mrb, y), &div, &mod);
+ a = mrb_float_value(mrb, (mrb_int)div);
+ b = mrb_float_value(mrb, mod);
+ return mrb_assoc_new(mrb, a, b);
+}
+
+/* 15.2.8.3.7 */
+/*
+ * call-seq:
+ * fix == other -> true or false
+ *
+ * Return <code>true</code> if <code>fix</code> equals <code>other</code>
+ * numerically.
+ *
+ * 1 == 2 #=> false
+ * 1 == 1.0 #=> true
+ */
+
+static mrb_value
+fix_equal(mrb_state *mrb, mrb_value x)
+{
+ mrb_value y;
+
+ mrb_get_args(mrb, "o", &y);
+ switch (mrb_type(y)) {
+ case MRB_TT_FIXNUM:
+ return mrb_bool_value(mrb_fixnum(x) == mrb_fixnum(y));
+ case MRB_TT_FLOAT:
+ return mrb_bool_value((mrb_float)mrb_fixnum(x) == mrb_float(y));
+ default:
+ return mrb_false_value();
+ }
+}
+
+/* 15.2.8.3.8 */
+/*
+ * call-seq:
+ * ~fix -> integer
+ *
+ * One's complement: returns a number where each bit is flipped.
+ * ex.0---00001 (1)-> 1---11110 (-2)
+ * ex.0---00010 (2)-> 1---11101 (-3)
+ * ex.0---00100 (4)-> 1---11011 (-5)
+ */
+
+static mrb_value
+fix_rev(mrb_state *mrb, mrb_value num)
+{
+ mrb_int val = mrb_fixnum(num);
+
+ return mrb_fixnum_value(~val);
+}
+
+static mrb_value
+bit_coerce(mrb_state *mrb, mrb_value x)
+{
+ while (!mrb_fixnum_p(x)) {
+ if (mrb_float_p(x)) {
+ mrb_raise(mrb, E_TYPE_ERROR, "can't convert Float into Integer");
+ }
+ x = mrb_to_int(mrb, x);
+ }
+ return x;
+}
+
+/* 15.2.8.3.9 */
+/*
+ * call-seq:
+ * fix & integer -> integer_result
+ *
+ * Bitwise AND.
+ */
+
+static mrb_value
+fix_and(mrb_state *mrb, mrb_value x)
+{
+ mrb_value y;
+
+ mrb_get_args(mrb, "o", &y);
+
+ y = bit_coerce(mrb, y);
+ return mrb_fixnum_value(mrb_fixnum(x) & mrb_fixnum(y));
+}
+
+/* 15.2.8.3.10 */
+/*
+ * call-seq:
+ * fix | integer -> integer_result
+ *
+ * Bitwise OR.
+ */
+
+static mrb_value
+fix_or(mrb_state *mrb, mrb_value x)
+{
+ mrb_value y;
+
+ mrb_get_args(mrb, "o", &y);
+
+ y = bit_coerce(mrb, y);
+ return mrb_fixnum_value(mrb_fixnum(x) | mrb_fixnum(y));
+}
+
+/* 15.2.8.3.11 */
+/*
+ * call-seq:
+ * fix ^ integer -> integer_result
+ *
+ * Bitwise EXCLUSIVE OR.
+ */
+
+static mrb_value
+fix_xor(mrb_state *mrb, mrb_value x)
+{
+ mrb_value y;
+
+ mrb_get_args(mrb, "o", &y);
+
+ y = bit_coerce(mrb, y);
+ return mrb_fixnum_value(mrb_fixnum(x) ^ mrb_fixnum(y));
+}
+
+#define NUMERIC_SHIFT_WIDTH_MAX (MRB_INT_BIT-1)
+
+static mrb_value
+lshift(mrb_state *mrb, mrb_int val, mrb_int width)
+{
+ mrb_assert(width >= 0);
+ if (width > NUMERIC_SHIFT_WIDTH_MAX) {
+ mrb_raisef(mrb, E_RANGE_ERROR, "width(%S) > (%S:MRB_INT_BIT-1)",
+ mrb_fixnum_value(width),
+ mrb_fixnum_value(NUMERIC_SHIFT_WIDTH_MAX));
+ }
+ return mrb_fixnum_value(val << width);
+}
+
+static mrb_value
+rshift(mrb_int val, mrb_int width)
+{
+ mrb_assert(width >= 0);
+ if (width >= NUMERIC_SHIFT_WIDTH_MAX) {
+ if (val < 0) {
+ return mrb_fixnum_value(-1);
+ }
+ return mrb_fixnum_value(0);
+ }
+ return mrb_fixnum_value(val >> width);
+}
+
+static inline void
+fix_shift_get_width(mrb_state *mrb, mrb_int *width)
+{
+ mrb_value y;
+
+ mrb_get_args(mrb, "o", &y);
+ *width = mrb_fixnum(bit_coerce(mrb, y));
+}
+
+/* 15.2.8.3.12 */
+/*
+ * call-seq:
+ * fix << count -> integer
+ *
+ * Shifts _fix_ left _count_ positions (right if _count_ is negative).
+ */
+
+static mrb_value
+fix_lshift(mrb_state *mrb, mrb_value x)
+{
+ mrb_int width, val;
+
+ fix_shift_get_width(mrb, &width);
+
+ if (width == 0) {
+ return x;
+ }
+ val = mrb_fixnum(x);
+ if (width < 0) {
+ return rshift(val, -width);
+ }
+ return lshift(mrb, val, width);
+}
+
+/* 15.2.8.3.13 */
+/*
+ * call-seq:
+ * fix >> count -> integer
+ *
+ * Shifts _fix_ right _count_ positions (left if _count_ is negative).
+ */
+
+static mrb_value
+fix_rshift(mrb_state *mrb, mrb_value x)
+{
+ mrb_int width, val;
+
+ fix_shift_get_width(mrb, &width);
+
+ if (width == 0) {
+ return x;
+ }
+ val = mrb_fixnum(x);
+ if (width < 0) {
+ return lshift(mrb, val, -width);
+ }
+ return rshift(val, width);
+}
+
+/* 15.2.8.3.23 */
+/*
+ * call-seq:
+ * fix.to_f -> float
+ *
+ * Converts <i>fix</i> to a <code>Float</code>.
+ *
+ */
+
+static mrb_value
+fix_to_f(mrb_state *mrb, mrb_value num)
+{
+ return mrb_float_value(mrb, (mrb_float)mrb_fixnum(num));
+}
+
+/*
+ * Document-class: FloatDomainError
+ *
+ * Raised when attempting to convert special float values
+ * (in particular infinite or NaN)
+ * to numerical classes which don't support them.
+ *
+ * Float::INFINITY.to_r
+ *
+ * <em>raises the exception:</em>
+ *
+ * FloatDomainError: Infinity
+ */
+/* ------------------------------------------------------------------------*/
+MRB_API mrb_value
+mrb_flo_to_fixnum(mrb_state *mrb, mrb_value x)
+{
+ mrb_int z;
+
+ if (!mrb_float_p(x)) {
+ mrb_raise(mrb, E_TYPE_ERROR, "non float value");
+ z = 0; /* not reached. just suppress warnings. */
+ }
+ else {
+ mrb_float d = mrb_float(x);
+
+ if (isinf(d)) {
+ mrb_raise(mrb, E_FLOATDOMAIN_ERROR, d < 0 ? "-Infinity" : "Infinity");
+ }
+ if (isnan(d)) {
+ mrb_raise(mrb, E_FLOATDOMAIN_ERROR, "NaN");
+ }
+ z = (mrb_int)d;
+ }
+ return mrb_fixnum_value(z);
+}
+
+mrb_value
+mrb_fixnum_plus(mrb_state *mrb, mrb_value x, mrb_value y)
+{
+ mrb_int a;
+
+ a = mrb_fixnum(x);
+ if (mrb_fixnum_p(y)) {
+ mrb_int b, c;
+
+ if (a == 0) return y;
+ b = mrb_fixnum(y);
+ if (mrb_int_add_overflow(a, b, &c)) {
+ return mrb_float_value(mrb, (mrb_float)a + (mrb_float)b);
+ }
+ return mrb_fixnum_value(c);
+ }
+ return mrb_float_value(mrb, (mrb_float)a + mrb_to_flo(mrb, y));
+}
+
+/* 15.2.8.3.1 */
+/*
+ * call-seq:
+ * fix + numeric -> numeric_result
+ *
+ * Performs addition: the class of the resulting object depends on
+ * the class of <code>numeric</code> and on the magnitude of the
+ * result.
+ */
+static mrb_value
+fix_plus(mrb_state *mrb, mrb_value self)
+{
+ mrb_value other;
+
+ mrb_get_args(mrb, "o", &other);
+ return mrb_fixnum_plus(mrb, self, other);
+}
+
+mrb_value
+mrb_fixnum_minus(mrb_state *mrb, mrb_value x, mrb_value y)
+{
+ mrb_int a;
+
+ a = mrb_fixnum(x);
+ if (mrb_fixnum_p(y)) {
+ mrb_int b, c;
+
+ b = mrb_fixnum(y);
+ if (mrb_int_sub_overflow(a, b, &c)) {
+ return mrb_float_value(mrb, (mrb_float)a - (mrb_float)b);
+ }
+ return mrb_fixnum_value(c);
+ }
+ return mrb_float_value(mrb, (mrb_float)a - mrb_to_flo(mrb, y));
+}
+
+/* 15.2.8.3.2 */
+/* 15.2.8.3.16 */
+/*
+ * call-seq:
+ * fix - numeric -> numeric_result
+ *
+ * Performs subtraction: the class of the resulting object depends on
+ * the class of <code>numeric</code> and on the magnitude of the
+ * result.
+ */
+static mrb_value
+fix_minus(mrb_state *mrb, mrb_value self)
+{
+ mrb_value other;
+
+ mrb_get_args(mrb, "o", &other);
+ return mrb_fixnum_minus(mrb, self, other);
+}
+
+
+MRB_API mrb_value
+mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, int base)
+{
+ char buf[MRB_INT_BIT+1];
+ char *b = buf + sizeof buf;
+ mrb_int val = mrb_fixnum(x);
+
+ if (base < 2 || 36 < base) {
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix %S", mrb_fixnum_value(base));
+ }
+
+ if (val == 0) {
+ *--b = '0';
+ }
+ else if (val < 0) {
+ do {
+ *--b = mrb_digitmap[-(val % base)];
+ } while (val /= base);
+ *--b = '-';
+ }
+ else {
+ do {
+ *--b = mrb_digitmap[(int)(val % base)];
+ } while (val /= base);
+ }
+
+ return mrb_str_new(mrb, b, buf + sizeof(buf) - b);
+}
+
+/* 15.2.8.3.25 */
+/*
+ * call-seq:
+ * fix.to_s(base=10) -> string
+ *
+ * Returns a string containing the representation of <i>fix</i> radix
+ * <i>base</i> (between 2 and 36).
+ *
+ * 12345.to_s #=> "12345"
+ * 12345.to_s(2) #=> "11000000111001"
+ * 12345.to_s(8) #=> "30071"
+ * 12345.to_s(10) #=> "12345"
+ * 12345.to_s(16) #=> "3039"
+ * 12345.to_s(36) #=> "9ix"
+ *
+ */
+static mrb_value
+fix_to_s(mrb_state *mrb, mrb_value self)
+{
+ mrb_int base = 10;
+
+ mrb_get_args(mrb, "|i", &base);
+ return mrb_fixnum_to_str(mrb, self, base);
+}
+
+/* 15.2.9.3.6 */
+/*
+ * call-seq:
+ * self.f <=> other.f => -1, 0, +1
+ * < => -1
+ * = => 0
+ * > => +1
+ * Comparison---Returns -1, 0, or +1 depending on whether <i>fix</i> is
+ * less than, equal to, or greater than <i>numeric</i>. This is the
+ * basis for the tests in <code>Comparable</code>.
+ */
+static mrb_value
+num_cmp(mrb_state *mrb, mrb_value self)
+{
+ mrb_value other;
+ mrb_float x, y;
+
+ mrb_get_args(mrb, "o", &other);
+
+ x = mrb_to_flo(mrb, self);
+ switch (mrb_type(other)) {
+ case MRB_TT_FIXNUM:
+ y = (mrb_float)mrb_fixnum(other);
+ break;
+ case MRB_TT_FLOAT:
+ y = mrb_float(other);
+ break;
+ default:
+ return mrb_nil_value();
+ }
+ if (x > y)
+ return mrb_fixnum_value(1);
+ else {
+ if (x < y)
+ return mrb_fixnum_value(-1);
+ return mrb_fixnum_value(0);
+ }
+}
+
+/* 15.2.9.3.1 */
+/*
+ * call-seq:
+ * float + other -> float
+ *
+ * Returns a new float which is the sum of <code>float</code>
+ * and <code>other</code>.
+ */
+static mrb_value
+flo_plus(mrb_state *mrb, mrb_value x)
+{
+ mrb_value y;
+
+ mrb_get_args(mrb, "o", &y);
+ return mrb_float_value(mrb, mrb_float(x) + mrb_to_flo(mrb, y));
+}
+
+/* ------------------------------------------------------------------------*/
+void
+mrb_init_numeric(mrb_state *mrb)
+{
+ struct RClass *numeric, *integer, *fixnum, *fl;
+
+ /* Numeric Class */
+ numeric = mrb_define_class(mrb, "Numeric", mrb->object_class); /* 15.2.7 */
+
+ mrb_define_method(mrb, numeric, "**", num_pow, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, numeric, "/", num_div, MRB_ARGS_REQ(1)); /* 15.2.8.3.4 */
+ mrb_define_method(mrb, numeric, "quo", num_div, MRB_ARGS_REQ(1)); /* 15.2.7.4.5 (x) */
+ mrb_define_method(mrb, numeric, "<=>", num_cmp, MRB_ARGS_REQ(1)); /* 15.2.9.3.6 */
+
+ /* Integer Class */
+ integer = mrb_define_class(mrb, "Integer", numeric); /* 15.2.8 */
+ mrb_undef_class_method(mrb, integer, "new");
+ mrb_define_method(mrb, integer, "to_i", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.24 */
+ mrb_define_method(mrb, integer, "to_int", int_to_i, MRB_ARGS_NONE());
+
+ /* Fixnum Class */
+ fixnum = mrb->fixnum_class = mrb_define_class(mrb, "Fixnum", integer);
+ mrb_define_method(mrb, fixnum, "+", fix_plus, MRB_ARGS_REQ(1)); /* 15.2.8.3.1 */
+ mrb_define_method(mrb, fixnum, "-", fix_minus, MRB_ARGS_REQ(1)); /* 15.2.8.3.2 */
+ mrb_define_method(mrb, fixnum, "*", fix_mul, MRB_ARGS_REQ(1)); /* 15.2.8.3.3 */
+ mrb_define_method(mrb, fixnum, "%", fix_mod, MRB_ARGS_REQ(1)); /* 15.2.8.3.5 */
+ mrb_define_method(mrb, fixnum, "==", fix_equal, MRB_ARGS_REQ(1)); /* 15.2.8.3.7 */
+ mrb_define_method(mrb, fixnum, "~", fix_rev, MRB_ARGS_NONE()); /* 15.2.8.3.8 */
+ mrb_define_method(mrb, fixnum, "&", fix_and, MRB_ARGS_REQ(1)); /* 15.2.8.3.9 */
+ mrb_define_method(mrb, fixnum, "|", fix_or, MRB_ARGS_REQ(1)); /* 15.2.8.3.10 */
+ mrb_define_method(mrb, fixnum, "^", fix_xor, MRB_ARGS_REQ(1)); /* 15.2.8.3.11 */
+ mrb_define_method(mrb, fixnum, "<<", fix_lshift, MRB_ARGS_REQ(1)); /* 15.2.8.3.12 */
+ mrb_define_method(mrb, fixnum, ">>", fix_rshift, MRB_ARGS_REQ(1)); /* 15.2.8.3.13 */
+ mrb_define_method(mrb, fixnum, "eql?", fix_eql, MRB_ARGS_REQ(1)); /* 15.2.8.3.16 */
+ mrb_define_method(mrb, fixnum, "hash", flo_hash, MRB_ARGS_NONE()); /* 15.2.8.3.18 */
+ mrb_define_method(mrb, fixnum, "to_f", fix_to_f, MRB_ARGS_NONE()); /* 15.2.8.3.23 */
+ mrb_define_method(mrb, fixnum, "to_s", fix_to_s, MRB_ARGS_NONE()); /* 15.2.8.3.25 */
+ mrb_define_method(mrb, fixnum, "inspect", fix_to_s, MRB_ARGS_NONE());
+ mrb_define_method(mrb, fixnum, "divmod", fix_divmod, MRB_ARGS_REQ(1)); /* 15.2.8.3.30 (x) */
+
+ /* Float Class */
+ fl = mrb->float_class = mrb_define_class(mrb, "Float", numeric); /* 15.2.9 */
+ mrb_undef_class_method(mrb, fl, "new");
+ mrb_define_method(mrb, fl, "+", flo_plus, MRB_ARGS_REQ(1)); /* 15.2.9.3.1 */
+ mrb_define_method(mrb, fl, "-", flo_minus, MRB_ARGS_REQ(1)); /* 15.2.9.3.2 */
+ mrb_define_method(mrb, fl, "*", flo_mul, MRB_ARGS_REQ(1)); /* 15.2.9.3.3 */
+ mrb_define_method(mrb, fl, "%", flo_mod, MRB_ARGS_REQ(1)); /* 15.2.9.3.5 */
+ mrb_define_method(mrb, fl, "==", flo_eq, MRB_ARGS_REQ(1)); /* 15.2.9.3.7 */
+ mrb_define_method(mrb, fl, "ceil", flo_ceil, MRB_ARGS_NONE()); /* 15.2.9.3.8 */
+ mrb_define_method(mrb, fl, "finite?", flo_finite_p, MRB_ARGS_NONE()); /* 15.2.9.3.9 */
+ mrb_define_method(mrb, fl, "floor", flo_floor, MRB_ARGS_NONE()); /* 15.2.9.3.10 */
+ mrb_define_method(mrb, fl, "infinite?", flo_infinite_p, MRB_ARGS_NONE()); /* 15.2.9.3.11 */
+ mrb_define_method(mrb, fl, "round", flo_round, MRB_ARGS_OPT(1)); /* 15.2.9.3.12 */
+ mrb_define_method(mrb, fl, "to_f", flo_to_f, MRB_ARGS_NONE()); /* 15.2.9.3.13 */
+ mrb_define_method(mrb, fl, "to_i", flo_truncate, MRB_ARGS_NONE()); /* 15.2.9.3.14 */
+ mrb_define_method(mrb, fl, "to_int", flo_truncate, MRB_ARGS_NONE());
+ mrb_define_method(mrb, fl, "truncate", flo_truncate, MRB_ARGS_NONE()); /* 15.2.9.3.15 */
+ mrb_define_method(mrb, fl, "divmod", flo_divmod, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, fl, "eql?", flo_eql, MRB_ARGS_REQ(1)); /* 15.2.8.3.16 */
+
+ mrb_define_method(mrb, fl, "to_s", flo_to_s, MRB_ARGS_NONE()); /* 15.2.9.3.16(x) */
+ mrb_define_method(mrb, fl, "inspect", flo_to_s, MRB_ARGS_NONE());
+ mrb_define_method(mrb, fl, "nan?", flo_nan_p, MRB_ARGS_NONE());
+
+#ifdef INFINITY
+ mrb_define_const(mrb, fl, "INFINITY", mrb_float_value(mrb, INFINITY));
+#endif
+#ifdef NAN
+ mrb_define_const(mrb, fl, "NAN", mrb_float_value(mrb, NAN));
+#endif
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/object.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,601 @@
+/*
+** object.c - Object, NilClass, TrueClass, FalseClass class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/class.h"
+#include "mruby/numeric.h"
+#include "mruby/string.h"
+
+MRB_API mrb_bool
+mrb_obj_eq(mrb_state *mrb, mrb_value v1, mrb_value v2)
+{
+ if (mrb_type(v1) != mrb_type(v2)) return FALSE;
+ switch (mrb_type(v1)) {
+ case MRB_TT_TRUE:
+ return TRUE;
+
+ case MRB_TT_FALSE:
+ case MRB_TT_FIXNUM:
+ return (mrb_fixnum(v1) == mrb_fixnum(v2));
+ case MRB_TT_SYMBOL:
+ return (mrb_symbol(v1) == mrb_symbol(v2));
+
+ case MRB_TT_FLOAT:
+ return (mrb_float(v1) == mrb_float(v2));
+
+ default:
+ return (mrb_ptr(v1) == mrb_ptr(v2));
+ }
+}
+
+MRB_API mrb_bool
+mrb_obj_equal(mrb_state *mrb, mrb_value v1, mrb_value v2)
+{
+ /* temporary definition */
+ return mrb_obj_eq(mrb, v1, v2);
+}
+
+MRB_API mrb_bool
+mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2)
+{
+ mrb_value result;
+
+ if (mrb_obj_eq(mrb, obj1, obj2)) return TRUE;
+ result = mrb_funcall(mrb, obj1, "==", 1, obj2);
+ if (mrb_test(result)) return TRUE;
+ return FALSE;
+}
+
+/*
+ * Document-class: NilClass
+ *
+ * The class of the singleton object <code>nil</code>.
+ */
+
+/* 15.2.4.3.4 */
+/*
+ * call_seq:
+ * nil.nil? -> true
+ *
+ * Only the object <i>nil</i> responds <code>true</code> to <code>nil?</code>.
+ */
+
+static mrb_value
+mrb_true(mrb_state *mrb, mrb_value obj)
+{
+ return mrb_true_value();
+}
+
+/* 15.2.4.3.5 */
+/*
+ * call-seq:
+ * nil.to_s -> ""
+ *
+ * Always returns the empty string.
+ */
+
+static mrb_value
+nil_to_s(mrb_state *mrb, mrb_value obj)
+{
+ return mrb_str_new(mrb, 0, 0);
+}
+
+static mrb_value
+nil_inspect(mrb_state *mrb, mrb_value obj)
+{
+ return mrb_str_new_lit(mrb, "nil");
+}
+
+/***********************************************************************
+ * Document-class: TrueClass
+ *
+ * The global value <code>true</code> is the only instance of class
+ * <code>TrueClass</code> and represents a logically true value in
+ * boolean expressions. The class provides operators allowing
+ * <code>true</code> to be used in logical expressions.
+ */
+
+/* 15.2.5.3.1 */
+/*
+ * call-seq:
+ * true & obj -> true or false
+ *
+ * And---Returns <code>false</code> if <i>obj</i> is
+ * <code>nil</code> or <code>false</code>, <code>true</code> otherwise.
+ */
+
+static mrb_value
+true_and(mrb_state *mrb, mrb_value obj)
+{
+ mrb_bool obj2;
+
+ mrb_get_args(mrb, "b", &obj2);
+
+ return mrb_bool_value(obj2);
+}
+
+/* 15.2.5.3.2 */
+/*
+ * call-seq:
+ * true ^ obj -> !obj
+ *
+ * Exclusive Or---Returns <code>true</code> if <i>obj</i> is
+ * <code>nil</code> or <code>false</code>, <code>false</code>
+ * otherwise.
+ */
+
+static mrb_value
+true_xor(mrb_state *mrb, mrb_value obj)
+{
+ mrb_bool obj2;
+
+ mrb_get_args(mrb, "b", &obj2);
+ return mrb_bool_value(!obj2);
+}
+
+/* 15.2.5.3.3 */
+/*
+ * call-seq:
+ * true.to_s -> "true"
+ *
+ * The string representation of <code>true</code> is "true".
+ */
+
+static mrb_value
+true_to_s(mrb_state *mrb, mrb_value obj)
+{
+ return mrb_str_new_lit(mrb, "true");
+}
+
+/* 15.2.5.3.4 */
+/*
+ * call-seq:
+ * true | obj -> true
+ *
+ * Or---Returns <code>true</code>. As <i>anObject</i> is an argument to
+ * a method call, it is always evaluated; there is no short-circuit
+ * evaluation in this case.
+ *
+ * true | puts("or")
+ * true || puts("logical or")
+ *
+ * <em>produces:</em>
+ *
+ * or
+ */
+
+static mrb_value
+true_or(mrb_state *mrb, mrb_value obj)
+{
+ return mrb_true_value();
+}
+
+/*
+ * Document-class: FalseClass
+ *
+ * The global value <code>false</code> is the only instance of class
+ * <code>FalseClass</code> and represents a logically false value in
+ * boolean expressions. The class provides operators allowing
+ * <code>false</code> to participate correctly in logical expressions.
+ *
+ */
+
+/* 15.2.4.3.1 */
+/* 15.2.6.3.1 */
+/*
+ * call-seq:
+ * false & obj -> false
+ * nil & obj -> false
+ *
+ * And---Returns <code>false</code>. <i>obj</i> is always
+ * evaluated as it is the argument to a method call---there is no
+ * short-circuit evaluation in this case.
+ */
+
+static mrb_value
+false_and(mrb_state *mrb, mrb_value obj)
+{
+ return mrb_false_value();
+}
+
+/* 15.2.4.3.2 */
+/* 15.2.6.3.2 */
+/*
+ * call-seq:
+ * false ^ obj -> true or false
+ * nil ^ obj -> true or false
+ *
+ * Exclusive Or---If <i>obj</i> is <code>nil</code> or
+ * <code>false</code>, returns <code>false</code>; otherwise, returns
+ * <code>true</code>.
+ *
+ */
+
+static mrb_value
+false_xor(mrb_state *mrb, mrb_value obj)
+{
+ mrb_bool obj2;
+
+ mrb_get_args(mrb, "b", &obj2);
+ return mrb_bool_value(obj2);
+}
+
+/* 15.2.4.3.3 */
+/* 15.2.6.3.4 */
+/*
+ * call-seq:
+ * false | obj -> true or false
+ * nil | obj -> true or false
+ *
+ * Or---Returns <code>false</code> if <i>obj</i> is
+ * <code>nil</code> or <code>false</code>; <code>true</code> otherwise.
+ */
+
+static mrb_value
+false_or(mrb_state *mrb, mrb_value obj)
+{
+ mrb_bool obj2;
+
+ mrb_get_args(mrb, "b", &obj2);
+ return mrb_bool_value(obj2);
+}
+
+/* 15.2.6.3.3 */
+/*
+ * call-seq:
+ * false.to_s -> "false"
+ *
+ * 'nuf said...
+ */
+
+static mrb_value
+false_to_s(mrb_state *mrb, mrb_value obj)
+{
+ return mrb_str_new_lit(mrb, "false");
+}
+
+void
+mrb_init_object(mrb_state *mrb)
+{
+ struct RClass *n;
+ struct RClass *t;
+ struct RClass *f;
+
+ n = mrb->nil_class = mrb_define_class(mrb, "NilClass", mrb->object_class);
+ mrb_undef_class_method(mrb, n, "new");
+ mrb_define_method(mrb, n, "&", false_and, MRB_ARGS_REQ(1)); /* 15.2.4.3.1 */
+ mrb_define_method(mrb, n, "^", false_xor, MRB_ARGS_REQ(1)); /* 15.2.4.3.2 */
+ mrb_define_method(mrb, n, "|", false_or, MRB_ARGS_REQ(1)); /* 15.2.4.3.3 */
+ mrb_define_method(mrb, n, "nil?", mrb_true, MRB_ARGS_NONE()); /* 15.2.4.3.4 */
+ mrb_define_method(mrb, n, "to_s", nil_to_s, MRB_ARGS_NONE()); /* 15.2.4.3.5 */
+ mrb_define_method(mrb, n, "inspect", nil_inspect, MRB_ARGS_NONE());
+
+ t = mrb->true_class = mrb_define_class(mrb, "TrueClass", mrb->object_class);
+ mrb_undef_class_method(mrb, t, "new");
+ mrb_define_method(mrb, t, "&", true_and, MRB_ARGS_REQ(1)); /* 15.2.5.3.1 */
+ mrb_define_method(mrb, t, "^", true_xor, MRB_ARGS_REQ(1)); /* 15.2.5.3.2 */
+ mrb_define_method(mrb, t, "to_s", true_to_s, MRB_ARGS_NONE()); /* 15.2.5.3.3 */
+ mrb_define_method(mrb, t, "|", true_or, MRB_ARGS_REQ(1)); /* 15.2.5.3.4 */
+ mrb_define_method(mrb, t, "inspect", true_to_s, MRB_ARGS_NONE());
+
+ f = mrb->false_class = mrb_define_class(mrb, "FalseClass", mrb->object_class);
+ mrb_undef_class_method(mrb, f, "new");
+ mrb_define_method(mrb, f, "&", false_and, MRB_ARGS_REQ(1)); /* 15.2.6.3.1 */
+ mrb_define_method(mrb, f, "^", false_xor, MRB_ARGS_REQ(1)); /* 15.2.6.3.2 */
+ mrb_define_method(mrb, f, "to_s", false_to_s, MRB_ARGS_NONE()); /* 15.2.6.3.3 */
+ mrb_define_method(mrb, f, "|", false_or, MRB_ARGS_REQ(1)); /* 15.2.6.3.4 */
+ mrb_define_method(mrb, f, "inspect", false_to_s, MRB_ARGS_NONE());
+}
+
+static mrb_value
+inspect_type(mrb_state *mrb, mrb_value val)
+{
+ if (mrb_type(val) == MRB_TT_FALSE || mrb_type(val) == MRB_TT_TRUE) {
+ return mrb_inspect(mrb, val);
+ }
+ else {
+ return mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, val));
+ }
+}
+
+static mrb_value
+convert_type(mrb_state *mrb, mrb_value val, const char *tname, const char *method, mrb_bool raise)
+{
+ mrb_sym m = 0;
+
+ m = mrb_intern_cstr(mrb, method);
+ if (!mrb_respond_to(mrb, val, m)) {
+ if (raise) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S into %S", inspect_type(mrb, val), mrb_str_new_cstr(mrb, tname));
+ }
+ return mrb_nil_value();
+ }
+ return mrb_funcall_argv(mrb, val, m, 0, 0);
+}
+
+MRB_API mrb_value
+mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method)
+{
+ mrb_value v;
+
+ if (mrb_fixnum_p(val)) return val;
+ v = convert_type(mrb, val, "Integer", method, FALSE);
+ if (mrb_nil_p(v) || !mrb_fixnum_p(v)) {
+ return mrb_nil_value();
+ }
+ return v;
+}
+
+MRB_API mrb_value
+mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method)
+{
+ mrb_value v;
+
+ if (mrb_type(val) == type) return val;
+ v = convert_type(mrb, val, tname, method, TRUE);
+ if (mrb_type(v) != type) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "%S cannot be converted to %S by #%S", val,
+ mrb_str_new_cstr(mrb, tname), mrb_str_new_cstr(mrb, method));
+ }
+ return v;
+}
+
+MRB_API mrb_value
+mrb_check_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method)
+{
+ mrb_value v;
+
+ if (mrb_type(val) == type && type != MRB_TT_DATA) return val;
+ v = convert_type(mrb, val, tname, method, FALSE);
+ if (mrb_nil_p(v) || mrb_type(v) != type) return mrb_nil_value();
+ return v;
+}
+
+static const struct types {
+ unsigned char type;
+ const char *name;
+} builtin_types[] = {
+/* {MRB_TT_NIL, "nil"}, */
+ {MRB_TT_FALSE, "false"},
+ {MRB_TT_TRUE, "true"},
+ {MRB_TT_FIXNUM, "Fixnum"},
+ {MRB_TT_SYMBOL, "Symbol"}, /* :symbol */
+ {MRB_TT_MODULE, "Module"},
+ {MRB_TT_OBJECT, "Object"},
+ {MRB_TT_CLASS, "Class"},
+ {MRB_TT_ICLASS, "iClass"}, /* internal use: mixed-in module holder */
+ {MRB_TT_SCLASS, "SClass"},
+ {MRB_TT_PROC, "Proc"},
+ {MRB_TT_FLOAT, "Float"},
+ {MRB_TT_ARRAY, "Array"},
+ {MRB_TT_HASH, "Hash"},
+ {MRB_TT_STRING, "String"},
+ {MRB_TT_RANGE, "Range"},
+/* {MRB_TT_BIGNUM, "Bignum"}, */
+ {MRB_TT_FILE, "File"},
+ {MRB_TT_DATA, "Data"}, /* internal use: wrapped C pointers */
+/* {MRB_TT_VARMAP, "Varmap"}, */ /* internal use: dynamic variables */
+/* {MRB_TT_NODE, "Node"}, */ /* internal use: syntax tree node */
+/* {MRB_TT_UNDEF, "undef"}, */ /* internal use: #undef; should not happen */
+ {-1, 0}
+};
+
+MRB_API void
+mrb_check_type(mrb_state *mrb, mrb_value x, enum mrb_vtype t)
+{
+ const struct types *type = builtin_types;
+ enum mrb_vtype xt;
+
+ xt = mrb_type(x);
+ if ((xt != t) || (xt == MRB_TT_DATA)) {
+ while (type->type < MRB_TT_MAXDEFINE) {
+ if (type->type == t) {
+ const char *etype;
+
+ if (mrb_nil_p(x)) {
+ etype = "nil";
+ }
+ else if (mrb_fixnum_p(x)) {
+ etype = "Fixnum";
+ }
+ else if (mrb_type(x) == MRB_TT_SYMBOL) {
+ etype = "Symbol";
+ }
+ else if (mrb_immediate_p(x)) {
+ etype = RSTRING_PTR(mrb_obj_as_string(mrb, x));
+ }
+ else {
+ etype = mrb_obj_classname(mrb, x);
+ }
+ mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %S (expected %S)",
+ mrb_str_new_cstr(mrb, etype), mrb_str_new_cstr(mrb, type->name));
+ }
+ type++;
+ }
+ mrb_raisef(mrb, E_TYPE_ERROR, "unknown type %S (%S given)",
+ mrb_fixnum_value(t), mrb_fixnum_value(mrb_type(x)));
+ }
+}
+
+/* 15.3.1.3.46 */
+/*
+ * call-seq:
+ * obj.to_s => string
+ *
+ * Returns a string representing <i>obj</i>. The default
+ * <code>to_s</code> prints the object's class and an encoding of the
+ * object id. As a special case, the top-level object that is the
+ * initial execution context of Ruby programs returns ``main.''
+ */
+
+MRB_API mrb_value
+mrb_any_to_s(mrb_state *mrb, mrb_value obj)
+{
+ mrb_value str = mrb_str_buf_new(mrb, 20);
+ const char *cname = mrb_obj_classname(mrb, obj);
+
+ mrb_str_cat_lit(mrb, str, "#<");
+ mrb_str_cat_cstr(mrb, str, cname);
+ mrb_str_cat_lit(mrb, str, ":");
+ mrb_str_concat(mrb, str, mrb_ptr_to_str(mrb, mrb_cptr(obj)));
+ mrb_str_cat_lit(mrb, str, ">");
+
+ return str;
+}
+
+/*
+ * call-seq:
+ * obj.is_a?(class) => true or false
+ * obj.kind_of?(class) => true or false
+ *
+ * Returns <code>true</code> if <i>class</i> is the class of
+ * <i>obj</i>, or if <i>class</i> is one of the superclasses of
+ * <i>obj</i> or modules included in <i>obj</i>.
+ *
+ * module M; end
+ * class A
+ * include M
+ * end
+ * class B < A; end
+ * class C < B; end
+ * b = B.new
+ * b.instance_of? A #=> false
+ * b.instance_of? B #=> true
+ * b.instance_of? C #=> false
+ * b.instance_of? M #=> false
+ * b.kind_of? A #=> true
+ * b.kind_of? B #=> true
+ * b.kind_of? C #=> false
+ * b.kind_of? M #=> true
+ */
+
+MRB_API mrb_bool
+mrb_obj_is_kind_of(mrb_state *mrb, mrb_value obj, struct RClass *c)
+{
+ struct RClass *cl = mrb_class(mrb, obj);
+
+ switch (c->tt) {
+ case MRB_TT_MODULE:
+ case MRB_TT_CLASS:
+ case MRB_TT_ICLASS:
+ break;
+
+ default:
+ mrb_raise(mrb, E_TYPE_ERROR, "class or module required");
+ }
+
+ while (cl) {
+ if (cl == c || cl->mt == c->mt)
+ return TRUE;
+ cl = cl->super;
+ }
+ return FALSE;
+}
+
+static mrb_value
+mrb_to_integer(mrb_state *mrb, mrb_value val, const char *method)
+{
+ mrb_value v;
+
+ if (mrb_fixnum_p(val)) return val;
+ v = convert_type(mrb, val, "Integer", method, TRUE);
+ if (!mrb_obj_is_kind_of(mrb, v, mrb->fixnum_class)) {
+ mrb_value type = inspect_type(mrb, val);
+ mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S to Integer (%S#%S gives %S)",
+ type, type, mrb_str_new_cstr(mrb, method), inspect_type(mrb, v));
+ }
+ return v;
+}
+
+MRB_API mrb_value
+mrb_to_int(mrb_state *mrb, mrb_value val)
+{
+ return mrb_to_integer(mrb, val, "to_int");
+}
+
+MRB_API mrb_value
+mrb_convert_to_integer(mrb_state *mrb, mrb_value val, int base)
+{
+ mrb_value tmp;
+
+ if (mrb_nil_p(val)) {
+ if (base != 0) goto arg_error;
+ mrb_raise(mrb, E_TYPE_ERROR, "can't convert nil into Integer");
+ }
+ switch (mrb_type(val)) {
+ case MRB_TT_FLOAT:
+ if (base != 0) goto arg_error;
+ if (FIXABLE(mrb_float(val))) {
+ break;
+ }
+ return mrb_flo_to_fixnum(mrb, val);
+
+ case MRB_TT_FIXNUM:
+ if (base != 0) goto arg_error;
+ return val;
+
+ case MRB_TT_STRING:
+ string_conv:
+ return mrb_str_to_inum(mrb, val, base, TRUE);
+
+ default:
+ break;
+ }
+ if (base != 0) {
+ tmp = mrb_check_string_type(mrb, val);
+ if (!mrb_nil_p(tmp)) {
+ goto string_conv;
+ }
+arg_error:
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "base specified for non string value");
+ }
+ tmp = convert_type(mrb, val, "Integer", "to_int", FALSE);
+ if (mrb_nil_p(tmp)) {
+ return mrb_to_integer(mrb, val, "to_i");
+ }
+ return tmp;
+}
+
+MRB_API mrb_value
+mrb_Integer(mrb_state *mrb, mrb_value val)
+{
+ return mrb_convert_to_integer(mrb, val, 0);
+}
+
+MRB_API mrb_value
+mrb_Float(mrb_state *mrb, mrb_value val)
+{
+ if (mrb_nil_p(val)) {
+ mrb_raise(mrb, E_TYPE_ERROR, "can't convert nil into Float");
+ }
+ switch (mrb_type(val)) {
+ case MRB_TT_FIXNUM:
+ return mrb_float_value(mrb, (mrb_float)mrb_fixnum(val));
+
+ case MRB_TT_FLOAT:
+ return val;
+
+ case MRB_TT_STRING:
+ return mrb_float_value(mrb, mrb_str_to_dbl(mrb, val, TRUE));
+
+ default:
+ return mrb_convert_type(mrb, val, MRB_TT_FLOAT, "Float", "to_f");
+ }
+}
+
+MRB_API mrb_value
+mrb_inspect(mrb_state *mrb, mrb_value obj)
+{
+ return mrb_obj_as_string(mrb, mrb_funcall(mrb, obj, "inspect", 0));
+}
+
+MRB_API mrb_bool
+mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2)
+{
+ if (mrb_obj_eq(mrb, obj1, obj2)) return TRUE;
+ return mrb_test(mrb_funcall(mrb, obj1, "eql?", 1, obj2));
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/opcode.h Wed Mar 25 17:36:16 2015 +0000 @@ -0,0 +1,3 @@ +/* this header file is to be removed soon. */ +#include "mruby/opcode.h" +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/parse.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,12601 @@
+/* A Bison parser, made by GNU Bison 2.4.2. */
+
+/* Skeleton implementation for Bison's Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2006, 2009-2010 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+ simplifying the original so-called "semantic" parser. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output. */
+#define YYBISON 1
+
+/* Bison version. */
+#define YYBISON_VERSION "2.4.2"
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 1
+
+/* Push parsers. */
+#define YYPUSH 0
+
+/* Pull parsers. */
+#define YYPULL 1
+
+/* Using locations. */
+#define YYLSP_NEEDED 0
+
+
+
+/* Copy the first part of user declarations. */
+
+/* Line 189 of yacc.c */
+#line 7 "src/parse.y"
+
+#undef PARSER_DEBUG
+
+#define YYDEBUG 1
+#define YYERROR_VERBOSE 1
+/*
+ * Force yacc to use our memory management. This is a little evil because
+ * the macros assume that "parser_state *p" is in scope
+ */
+#define YYMALLOC(n) mrb_malloc(p->mrb, (n))
+#define YYFREE(o) mrb_free(p->mrb, (o))
+#define YYSTACK_USE_ALLOCA 0
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mruby.h"
+#include "mruby/compile.h"
+#include "mruby/proc.h"
+#include "mruby/error.h"
+#include "node.h"
+#include "mrb_throw.h"
+
+#define YYLEX_PARAM p
+
+typedef mrb_ast_node node;
+typedef struct mrb_parser_state parser_state;
+typedef struct mrb_parser_heredoc_info parser_heredoc_info;
+
+static int yyparse(parser_state *p);
+static int yylex(void *lval, parser_state *p);
+static void yyerror(parser_state *p, const char *s);
+static void yywarn(parser_state *p, const char *s);
+static void yywarning(parser_state *p, const char *s);
+static void backref_error(parser_state *p, node *n);
+static void tokadd(parser_state *p, int32_t c);
+
+#define identchar(c) (ISALNUM(c) || (c) == '_' || !ISASCII(c))
+
+typedef unsigned int stack_type;
+
+#define BITSTACK_PUSH(stack, n) ((stack) = ((stack)<<1)|((n)&1))
+#define BITSTACK_POP(stack) ((stack) = (stack) >> 1)
+#define BITSTACK_LEXPOP(stack) ((stack) = ((stack) >> 1) | ((stack) & 1))
+#define BITSTACK_SET_P(stack) ((stack)&1)
+
+#define COND_PUSH(n) BITSTACK_PUSH(p->cond_stack, (n))
+#define COND_POP() BITSTACK_POP(p->cond_stack)
+#define COND_LEXPOP() BITSTACK_LEXPOP(p->cond_stack)
+#define COND_P() BITSTACK_SET_P(p->cond_stack)
+
+#define CMDARG_PUSH(n) BITSTACK_PUSH(p->cmdarg_stack, (n))
+#define CMDARG_POP() BITSTACK_POP(p->cmdarg_stack)
+#define CMDARG_LEXPOP() BITSTACK_LEXPOP(p->cmdarg_stack)
+#define CMDARG_P() BITSTACK_SET_P(p->cmdarg_stack)
+
+#define SET_LINENO(c,n) ((c)->lineno = (n))
+#define NODE_LINENO(c,n) do {\
+ if (n) {\
+ (c)->filename_index = (n)->filename_index;\
+ (c)->lineno = (n)->lineno;\
+ }\
+} while (0)
+
+#define sym(x) ((mrb_sym)(intptr_t)(x))
+#define nsym(x) ((node*)(intptr_t)(x))
+
+static inline mrb_sym
+intern_cstr_gen(parser_state *p, const char *s)
+{
+ return mrb_intern_cstr(p->mrb, s);
+}
+#define intern_cstr(s) intern_cstr_gen(p,(s))
+
+static inline mrb_sym
+intern_gen(parser_state *p, const char *s, size_t len)
+{
+ return mrb_intern(p->mrb, s, len);
+}
+#define intern(s,len) intern_gen(p,(s),(len))
+
+static inline mrb_sym
+intern_gen_c(parser_state *p, const char c)
+{
+ return mrb_intern(p->mrb, &c, 1);
+}
+#define intern_c(c) intern_gen_c(p,(c))
+
+static void
+cons_free_gen(parser_state *p, node *cons)
+{
+ cons->cdr = p->cells;
+ p->cells = cons;
+}
+#define cons_free(c) cons_free_gen(p, (c))
+
+static void*
+parser_palloc(parser_state *p, size_t size)
+{
+ void *m = mrb_pool_alloc(p->pool, size);
+
+ if (!m) {
+ MRB_THROW(p->jmp);
+ }
+ return m;
+}
+
+static node*
+cons_gen(parser_state *p, node *car, node *cdr)
+{
+ node *c;
+
+ if (p->cells) {
+ c = p->cells;
+ p->cells = p->cells->cdr;
+ }
+ else {
+ c = (node *)parser_palloc(p, sizeof(mrb_ast_node));
+ }
+
+ c->car = car;
+ c->cdr = cdr;
+ c->lineno = p->lineno;
+ c->filename_index = p->current_filename_index;
+ return c;
+}
+#define cons(a,b) cons_gen(p,(a),(b))
+
+static node*
+list1_gen(parser_state *p, node *a)
+{
+ return cons(a, 0);
+}
+#define list1(a) list1_gen(p, (a))
+
+static node*
+list2_gen(parser_state *p, node *a, node *b)
+{
+ return cons(a, cons(b,0));
+}
+#define list2(a,b) list2_gen(p, (a),(b))
+
+static node*
+list3_gen(parser_state *p, node *a, node *b, node *c)
+{
+ return cons(a, cons(b, cons(c,0)));
+}
+#define list3(a,b,c) list3_gen(p, (a),(b),(c))
+
+static node*
+list4_gen(parser_state *p, node *a, node *b, node *c, node *d)
+{
+ return cons(a, cons(b, cons(c, cons(d, 0))));
+}
+#define list4(a,b,c,d) list4_gen(p, (a),(b),(c),(d))
+
+static node*
+list5_gen(parser_state *p, node *a, node *b, node *c, node *d, node *e)
+{
+ return cons(a, cons(b, cons(c, cons(d, cons(e, 0)))));
+}
+#define list5(a,b,c,d,e) list5_gen(p, (a),(b),(c),(d),(e))
+
+static node*
+list6_gen(parser_state *p, node *a, node *b, node *c, node *d, node *e, node *f)
+{
+ return cons(a, cons(b, cons(c, cons(d, cons(e, cons(f, 0))))));
+}
+#define list6(a,b,c,d,e,f) list6_gen(p, (a),(b),(c),(d),(e),(f))
+
+static node*
+append_gen(parser_state *p, node *a, node *b)
+{
+ node *c = a;
+
+ if (!a) return b;
+ while (c->cdr) {
+ c = c->cdr;
+ }
+ if (b) {
+ c->cdr = b;
+ }
+ return a;
+}
+#define append(a,b) append_gen(p,(a),(b))
+#define push(a,b) append_gen(p,(a),list1(b))
+
+static char*
+parser_strndup(parser_state *p, const char *s, size_t len)
+{
+ char *b = (char *)parser_palloc(p, len+1);
+
+ memcpy(b, s, len);
+ b[len] = '\0';
+ return b;
+}
+#define strndup(s,len) parser_strndup(p, s, len)
+
+static char*
+parser_strdup(parser_state *p, const char *s)
+{
+ return parser_strndup(p, s, strlen(s));
+}
+#undef strdup
+#define strdup(s) parser_strdup(p, s)
+
+/* xxx ----------------------------- */
+
+static node*
+local_switch(parser_state *p)
+{
+ node *prev = p->locals;
+
+ p->locals = cons(0, 0);
+ return prev;
+}
+
+static void
+local_resume(parser_state *p, node *prev)
+{
+ p->locals = prev;
+}
+
+static void
+local_nest(parser_state *p)
+{
+ p->locals = cons(0, p->locals);
+}
+
+static void
+local_unnest(parser_state *p)
+{
+ p->locals = p->locals->cdr;
+}
+
+static mrb_bool
+local_var_p(parser_state *p, mrb_sym sym)
+{
+ node *l = p->locals;
+
+ while (l) {
+ node *n = l->car;
+ while (n) {
+ if (sym(n->car) == sym) return TRUE;
+ n = n->cdr;
+ }
+ l = l->cdr;
+ }
+ return FALSE;
+}
+
+static void
+local_add_f(parser_state *p, mrb_sym sym)
+{
+ p->locals->car = push(p->locals->car, nsym(sym));
+}
+
+static void
+local_add(parser_state *p, mrb_sym sym)
+{
+ if (!local_var_p(p, sym)) {
+ local_add_f(p, sym);
+ }
+}
+
+/* (:scope (vars..) (prog...)) */
+static node*
+new_scope(parser_state *p, node *body)
+{
+ return cons((node*)NODE_SCOPE, cons(p->locals->car, body));
+}
+
+/* (:begin prog...) */
+static node*
+new_begin(parser_state *p, node *body)
+{
+ if (body) {
+ return list2((node*)NODE_BEGIN, body);
+ }
+ return cons((node*)NODE_BEGIN, 0);
+}
+
+#define newline_node(n) (n)
+
+/* (:rescue body rescue else) */
+static node*
+new_rescue(parser_state *p, node *body, node *resq, node *els)
+{
+ return list4((node*)NODE_RESCUE, body, resq, els);
+}
+
+/* (:ensure body ensure) */
+static node*
+new_ensure(parser_state *p, node *a, node *b)
+{
+ return cons((node*)NODE_ENSURE, cons(a, cons(0, b)));
+}
+
+/* (:nil) */
+static node*
+new_nil(parser_state *p)
+{
+ return list1((node*)NODE_NIL);
+}
+
+/* (:true) */
+static node*
+new_true(parser_state *p)
+{
+ return list1((node*)NODE_TRUE);
+}
+
+/* (:false) */
+static node*
+new_false(parser_state *p)
+{
+ return list1((node*)NODE_FALSE);
+}
+
+/* (:alias new old) */
+static node*
+new_alias(parser_state *p, mrb_sym a, mrb_sym b)
+{
+ return cons((node*)NODE_ALIAS, cons(nsym(a), nsym(b)));
+}
+
+/* (:if cond then else) */
+static node*
+new_if(parser_state *p, node *a, node *b, node *c)
+{
+ return list4((node*)NODE_IF, a, b, c);
+}
+
+/* (:unless cond then else) */
+static node*
+new_unless(parser_state *p, node *a, node *b, node *c)
+{
+ return list4((node*)NODE_IF, a, c, b);
+}
+
+/* (:while cond body) */
+static node*
+new_while(parser_state *p, node *a, node *b)
+{
+ return cons((node*)NODE_WHILE, cons(a, b));
+}
+
+/* (:until cond body) */
+static node*
+new_until(parser_state *p, node *a, node *b)
+{
+ return cons((node*)NODE_UNTIL, cons(a, b));
+}
+
+/* (:for var obj body) */
+static node*
+new_for(parser_state *p, node *v, node *o, node *b)
+{
+ return list4((node*)NODE_FOR, v, o, b);
+}
+
+/* (:case a ((when ...) body) ((when...) body)) */
+static node*
+new_case(parser_state *p, node *a, node *b)
+{
+ node *n = list2((node*)NODE_CASE, a);
+ node *n2 = n;
+
+ while (n2->cdr) {
+ n2 = n2->cdr;
+ }
+ n2->cdr = b;
+ return n;
+}
+
+/* (:postexe a) */
+static node*
+new_postexe(parser_state *p, node *a)
+{
+ return cons((node*)NODE_POSTEXE, a);
+}
+
+/* (:self) */
+static node*
+new_self(parser_state *p)
+{
+ return list1((node*)NODE_SELF);
+}
+
+/* (:call a b c) */
+static node*
+new_call(parser_state *p, node *a, mrb_sym b, node *c)
+{
+ node *n = list4((node*)NODE_CALL, a, nsym(b), c);
+ NODE_LINENO(n, a);
+ return n;
+}
+
+/* (:fcall self mid args) */
+static node*
+new_fcall(parser_state *p, mrb_sym b, node *c)
+{
+ node *n = new_self(p);
+ NODE_LINENO(n, c);
+ n = list4((node*)NODE_FCALL, n, nsym(b), c);
+ NODE_LINENO(n, c);
+ return n;
+}
+
+/* (:super . c) */
+static node*
+new_super(parser_state *p, node *c)
+{
+ return cons((node*)NODE_SUPER, c);
+}
+
+/* (:zsuper) */
+static node*
+new_zsuper(parser_state *p)
+{
+ return list1((node*)NODE_ZSUPER);
+}
+
+/* (:yield . c) */
+static node*
+new_yield(parser_state *p, node *c)
+{
+ if (c) {
+ if (c->cdr) {
+ yyerror(p, "both block arg and actual block given");
+ }
+ return cons((node*)NODE_YIELD, c->car);
+ }
+ return cons((node*)NODE_YIELD, 0);
+}
+
+/* (:return . c) */
+static node*
+new_return(parser_state *p, node *c)
+{
+ return cons((node*)NODE_RETURN, c);
+}
+
+/* (:break . c) */
+static node*
+new_break(parser_state *p, node *c)
+{
+ return cons((node*)NODE_BREAK, c);
+}
+
+/* (:next . c) */
+static node*
+new_next(parser_state *p, node *c)
+{
+ return cons((node*)NODE_NEXT, c);
+}
+
+/* (:redo) */
+static node*
+new_redo(parser_state *p)
+{
+ return list1((node*)NODE_REDO);
+}
+
+/* (:retry) */
+static node*
+new_retry(parser_state *p)
+{
+ return list1((node*)NODE_RETRY);
+}
+
+/* (:dot2 a b) */
+static node*
+new_dot2(parser_state *p, node *a, node *b)
+{
+ return cons((node*)NODE_DOT2, cons(a, b));
+}
+
+/* (:dot3 a b) */
+static node*
+new_dot3(parser_state *p, node *a, node *b)
+{
+ return cons((node*)NODE_DOT3, cons(a, b));
+}
+
+/* (:colon2 b c) */
+static node*
+new_colon2(parser_state *p, node *b, mrb_sym c)
+{
+ return cons((node*)NODE_COLON2, cons(b, nsym(c)));
+}
+
+/* (:colon3 . c) */
+static node*
+new_colon3(parser_state *p, mrb_sym c)
+{
+ return cons((node*)NODE_COLON3, nsym(c));
+}
+
+/* (:and a b) */
+static node*
+new_and(parser_state *p, node *a, node *b)
+{
+ return cons((node*)NODE_AND, cons(a, b));
+}
+
+/* (:or a b) */
+static node*
+new_or(parser_state *p, node *a, node *b)
+{
+ return cons((node*)NODE_OR, cons(a, b));
+}
+
+/* (:array a...) */
+static node*
+new_array(parser_state *p, node *a)
+{
+ return cons((node*)NODE_ARRAY, a);
+}
+
+/* (:splat . a) */
+static node*
+new_splat(parser_state *p, node *a)
+{
+ return cons((node*)NODE_SPLAT, a);
+}
+
+/* (:hash (k . v) (k . v)...) */
+static node*
+new_hash(parser_state *p, node *a)
+{
+ return cons((node*)NODE_HASH, a);
+}
+
+/* (:sym . a) */
+static node*
+new_sym(parser_state *p, mrb_sym sym)
+{
+ return cons((node*)NODE_SYM, nsym(sym));
+}
+
+static mrb_sym
+new_strsym(parser_state *p, node* str)
+{
+ const char *s = (const char*)str->cdr->car;
+ size_t len = (size_t)str->cdr->cdr;
+
+ return mrb_intern(p->mrb, s, len);
+}
+
+/* (:lvar . a) */
+static node*
+new_lvar(parser_state *p, mrb_sym sym)
+{
+ return cons((node*)NODE_LVAR, nsym(sym));
+}
+
+/* (:gvar . a) */
+static node*
+new_gvar(parser_state *p, mrb_sym sym)
+{
+ return cons((node*)NODE_GVAR, nsym(sym));
+}
+
+/* (:ivar . a) */
+static node*
+new_ivar(parser_state *p, mrb_sym sym)
+{
+ return cons((node*)NODE_IVAR, nsym(sym));
+}
+
+/* (:cvar . a) */
+static node*
+new_cvar(parser_state *p, mrb_sym sym)
+{
+ return cons((node*)NODE_CVAR, nsym(sym));
+}
+
+/* (:const . a) */
+static node*
+new_const(parser_state *p, mrb_sym sym)
+{
+ return cons((node*)NODE_CONST, nsym(sym));
+}
+
+/* (:undef a...) */
+static node*
+new_undef(parser_state *p, mrb_sym sym)
+{
+ return list2((node*)NODE_UNDEF, nsym(sym));
+}
+
+/* (:class class super body) */
+static node*
+new_class(parser_state *p, node *c, node *s, node *b)
+{
+ return list4((node*)NODE_CLASS, c, s, cons(p->locals->car, b));
+}
+
+/* (:sclass obj body) */
+static node*
+new_sclass(parser_state *p, node *o, node *b)
+{
+ return list3((node*)NODE_SCLASS, o, cons(p->locals->car, b));
+}
+
+/* (:module module body) */
+static node*
+new_module(parser_state *p, node *m, node *b)
+{
+ return list3((node*)NODE_MODULE, m, cons(p->locals->car, b));
+}
+
+/* (:def m lv (arg . body)) */
+static node*
+new_def(parser_state *p, mrb_sym m, node *a, node *b)
+{
+ return list5((node*)NODE_DEF, nsym(m), p->locals->car, a, b);
+}
+
+/* (:sdef obj m lv (arg . body)) */
+static node*
+new_sdef(parser_state *p, node *o, mrb_sym m, node *a, node *b)
+{
+ return list6((node*)NODE_SDEF, o, nsym(m), p->locals->car, a, b);
+}
+
+/* (:arg . sym) */
+static node*
+new_arg(parser_state *p, mrb_sym sym)
+{
+ return cons((node*)NODE_ARG, nsym(sym));
+}
+
+/* (m o r m2 b) */
+/* m: (a b c) */
+/* o: ((a . e1) (b . e2)) */
+/* r: a */
+/* m2: (a b c) */
+/* b: a */
+static node*
+new_args(parser_state *p, node *m, node *opt, mrb_sym rest, node *m2, mrb_sym blk)
+{
+ node *n;
+
+ n = cons(m2, nsym(blk));
+ n = cons(nsym(rest), n);
+ n = cons(opt, n);
+ return cons(m, n);
+}
+
+/* (:block_arg . a) */
+static node*
+new_block_arg(parser_state *p, node *a)
+{
+ return cons((node*)NODE_BLOCK_ARG, a);
+}
+
+/* (:block arg body) */
+static node*
+new_block(parser_state *p, node *a, node *b)
+{
+ return list4((node*)NODE_BLOCK, p->locals->car, a, b);
+}
+
+/* (:lambda arg body) */
+static node*
+new_lambda(parser_state *p, node *a, node *b)
+{
+ return list4((node*)NODE_LAMBDA, p->locals->car, a, b);
+}
+
+/* (:asgn lhs rhs) */
+static node*
+new_asgn(parser_state *p, node *a, node *b)
+{
+ return cons((node*)NODE_ASGN, cons(a, b));
+}
+
+/* (:masgn mlhs=(pre rest post) mrhs) */
+static node*
+new_masgn(parser_state *p, node *a, node *b)
+{
+ return cons((node*)NODE_MASGN, cons(a, b));
+}
+
+/* (:asgn lhs rhs) */
+static node*
+new_op_asgn(parser_state *p, node *a, mrb_sym op, node *b)
+{
+ return list4((node*)NODE_OP_ASGN, a, nsym(op), b);
+}
+
+/* (:int . i) */
+static node*
+new_int(parser_state *p, const char *s, int base)
+{
+ return list3((node*)NODE_INT, (node*)strdup(s), (node*)(intptr_t)base);
+}
+
+/* (:float . i) */
+static node*
+new_float(parser_state *p, const char *s)
+{
+ return cons((node*)NODE_FLOAT, (node*)strdup(s));
+}
+
+/* (:str . (s . len)) */
+static node*
+new_str(parser_state *p, const char *s, int len)
+{
+ return cons((node*)NODE_STR, cons((node*)strndup(s, len), (node*)(intptr_t)len));
+}
+
+/* (:dstr . a) */
+static node*
+new_dstr(parser_state *p, node *a)
+{
+ return cons((node*)NODE_DSTR, a);
+}
+
+/* (:str . (s . len)) */
+static node*
+new_xstr(parser_state *p, const char *s, int len)
+{
+ return cons((node*)NODE_XSTR, cons((node*)strndup(s, len), (node*)(intptr_t)len));
+}
+
+/* (:xstr . a) */
+static node*
+new_dxstr(parser_state *p, node *a)
+{
+ return cons((node*)NODE_DXSTR, a);
+}
+
+/* (:dsym . a) */
+static node*
+new_dsym(parser_state *p, node *a)
+{
+ return cons((node*)NODE_DSYM, new_dstr(p, a));
+}
+
+/* (:str . (a . a)) */
+static node*
+new_regx(parser_state *p, const char *p1, const char* p2)
+{
+ return cons((node*)NODE_REGX, cons((node*)p1, (node*)p2));
+}
+
+/* (:dregx . a) */
+static node*
+new_dregx(parser_state *p, node *a, node *b)
+{
+ return cons((node*)NODE_DREGX, cons(a, b));
+}
+
+/* (:backref . n) */
+static node*
+new_back_ref(parser_state *p, int n)
+{
+ return cons((node*)NODE_BACK_REF, (node*)(intptr_t)n);
+}
+
+/* (:nthref . n) */
+static node*
+new_nth_ref(parser_state *p, int n)
+{
+ return cons((node*)NODE_NTH_REF, (node*)(intptr_t)n);
+}
+
+/* (:heredoc . a) */
+static node*
+new_heredoc(parser_state *p)
+{
+ parser_heredoc_info *inf = (parser_heredoc_info *)parser_palloc(p, sizeof(parser_heredoc_info));
+ return cons((node*)NODE_HEREDOC, (node*)inf);
+}
+
+static void
+new_bv(parser_state *p, mrb_sym id)
+{
+}
+
+static node*
+new_literal_delim(parser_state *p)
+{
+ return cons((node*)NODE_LITERAL_DELIM, 0);
+}
+
+/* (:words . a) */
+static node*
+new_words(parser_state *p, node *a)
+{
+ return cons((node*)NODE_WORDS, a);
+}
+
+/* (:symbols . a) */
+static node*
+new_symbols(parser_state *p, node *a)
+{
+ return cons((node*)NODE_SYMBOLS, a);
+}
+
+/* xxx ----------------------------- */
+
+/* (:call a op) */
+static node*
+call_uni_op(parser_state *p, node *recv, const char *m)
+{
+ return new_call(p, recv, intern_cstr(m), 0);
+}
+
+/* (:call a op b) */
+static node*
+call_bin_op(parser_state *p, node *recv, const char *m, node *arg1)
+{
+ return new_call(p, recv, intern_cstr(m), list1(list1(arg1)));
+}
+
+static void
+args_with_block(parser_state *p, node *a, node *b)
+{
+ if (b) {
+ if (a->cdr) {
+ yyerror(p, "both block arg and actual block given");
+ }
+ a->cdr = b;
+ }
+}
+
+static void
+call_with_block(parser_state *p, node *a, node *b)
+{
+ node *n;
+
+ if (a->car == (node*)NODE_SUPER ||
+ a->car == (node*)NODE_ZSUPER) {
+ if (!a->cdr) a->cdr = cons(0, b);
+ else {
+ args_with_block(p, a->cdr, b);
+ }
+ }
+ else {
+ n = a->cdr->cdr->cdr;
+ if (!n->car) n->car = cons(0, b);
+ else {
+ args_with_block(p, n->car, b);
+ }
+ }
+}
+
+static node*
+negate_lit(parser_state *p, node *n)
+{
+ return cons((node*)NODE_NEGATE, n);
+}
+
+static node*
+cond(node *n)
+{
+ return n;
+}
+
+static node*
+ret_args(parser_state *p, node *n)
+{
+ if (n->cdr) {
+ yyerror(p, "block argument should not be given");
+ return NULL;
+ }
+ if (!n->car->cdr) return n->car->car;
+ return new_array(p, n->car);
+}
+
+static void
+assignable(parser_state *p, node *lhs)
+{
+ if ((int)(intptr_t)lhs->car == NODE_LVAR) {
+ local_add(p, sym(lhs->cdr));
+ }
+}
+
+static node*
+var_reference(parser_state *p, node *lhs)
+{
+ node *n;
+
+ if ((int)(intptr_t)lhs->car == NODE_LVAR) {
+ if (!local_var_p(p, sym(lhs->cdr))) {
+ n = new_fcall(p, sym(lhs->cdr), 0);
+ cons_free(lhs);
+ return n;
+ }
+ }
+
+ return lhs;
+}
+
+typedef enum mrb_string_type string_type;
+
+static node*
+new_strterm(parser_state *p, string_type type, int term, int paren)
+{
+ return cons((node*)(intptr_t)type, cons((node*)0, cons((node*)(intptr_t)paren, (node*)(intptr_t)term)));
+}
+
+static void
+end_strterm(parser_state *p)
+{
+ cons_free(p->lex_strterm->cdr->cdr);
+ cons_free(p->lex_strterm->cdr);
+ cons_free(p->lex_strterm);
+ p->lex_strterm = NULL;
+}
+
+static parser_heredoc_info *
+parsing_heredoc_inf(parser_state *p)
+{
+ node *nd = p->parsing_heredoc;
+ if (nd == NULL)
+ return NULL;
+ /* mrb_assert(nd->car->car == NODE_HEREDOC); */
+ return (parser_heredoc_info*)nd->car->cdr;
+}
+
+static void
+heredoc_treat_nextline(parser_state *p)
+{
+ if (p->heredocs_from_nextline == NULL)
+ return;
+ if (p->parsing_heredoc == NULL) {
+ node *n;
+ p->parsing_heredoc = p->heredocs_from_nextline;
+ p->lex_strterm_before_heredoc = p->lex_strterm;
+ p->lex_strterm = new_strterm(p, parsing_heredoc_inf(p)->type, 0, 0);
+ n = p->all_heredocs;
+ if (n) {
+ while (n->cdr)
+ n = n->cdr;
+ n->cdr = p->parsing_heredoc;
+ }
+ else {
+ p->all_heredocs = p->parsing_heredoc;
+ }
+ }
+ else {
+ node *n, *m;
+ m = p->heredocs_from_nextline;
+ while (m->cdr)
+ m = m->cdr;
+ n = p->all_heredocs;
+ mrb_assert(n != NULL);
+ if (n == p->parsing_heredoc) {
+ m->cdr = n;
+ p->all_heredocs = p->heredocs_from_nextline;
+ p->parsing_heredoc = p->heredocs_from_nextline;
+ }
+ else {
+ while (n->cdr != p->parsing_heredoc) {
+ n = n->cdr;
+ mrb_assert(n != NULL);
+ }
+ m->cdr = n->cdr;
+ n->cdr = p->heredocs_from_nextline;
+ p->parsing_heredoc = p->heredocs_from_nextline;
+ }
+ }
+ p->heredocs_from_nextline = NULL;
+}
+
+static void
+heredoc_end(parser_state *p)
+{
+ p->parsing_heredoc = p->parsing_heredoc->cdr;
+ if (p->parsing_heredoc == NULL) {
+ p->lstate = EXPR_BEG;
+ p->cmd_start = TRUE;
+ end_strterm(p);
+ p->lex_strterm = p->lex_strterm_before_heredoc;
+ p->lex_strterm_before_heredoc = NULL;
+ p->heredoc_end_now = TRUE;
+ }
+ else {
+ /* next heredoc */
+ p->lex_strterm->car = (node*)(intptr_t)parsing_heredoc_inf(p)->type;
+ }
+}
+#define is_strterm_type(p,str_func) ((int)(intptr_t)((p)->lex_strterm->car) & (str_func))
+
+/* xxx ----------------------------- */
+
+
+
+/* Line 189 of yacc.c */
+#line 1067 "C:/Users/matsuzaki.takuya/work/daily/20150106/mruby-1.1.0/build/ARMCA9/src/y.tab.c"
+
+/* Enabling traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages. */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+/* Enabling the token table. */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
+#endif
+
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ keyword_class = 258,
+ keyword_module = 259,
+ keyword_def = 260,
+ keyword_begin = 261,
+ keyword_if = 262,
+ keyword_unless = 263,
+ keyword_while = 264,
+ keyword_until = 265,
+ keyword_for = 266,
+ keyword_undef = 267,
+ keyword_rescue = 268,
+ keyword_ensure = 269,
+ keyword_end = 270,
+ keyword_then = 271,
+ keyword_elsif = 272,
+ keyword_else = 273,
+ keyword_case = 274,
+ keyword_when = 275,
+ keyword_break = 276,
+ keyword_next = 277,
+ keyword_redo = 278,
+ keyword_retry = 279,
+ keyword_in = 280,
+ keyword_do = 281,
+ keyword_do_cond = 282,
+ keyword_do_block = 283,
+ keyword_do_LAMBDA = 284,
+ keyword_return = 285,
+ keyword_yield = 286,
+ keyword_super = 287,
+ keyword_self = 288,
+ keyword_nil = 289,
+ keyword_true = 290,
+ keyword_false = 291,
+ keyword_and = 292,
+ keyword_or = 293,
+ keyword_not = 294,
+ modifier_if = 295,
+ modifier_unless = 296,
+ modifier_while = 297,
+ modifier_until = 298,
+ modifier_rescue = 299,
+ keyword_alias = 300,
+ keyword_BEGIN = 301,
+ keyword_END = 302,
+ keyword__LINE__ = 303,
+ keyword__FILE__ = 304,
+ keyword__ENCODING__ = 305,
+ tIDENTIFIER = 306,
+ tFID = 307,
+ tGVAR = 308,
+ tIVAR = 309,
+ tCONSTANT = 310,
+ tCVAR = 311,
+ tLABEL = 312,
+ tINTEGER = 313,
+ tFLOAT = 314,
+ tCHAR = 315,
+ tXSTRING = 316,
+ tREGEXP = 317,
+ tSTRING = 318,
+ tSTRING_PART = 319,
+ tSTRING_MID = 320,
+ tNTH_REF = 321,
+ tBACK_REF = 322,
+ tREGEXP_END = 323,
+ tUPLUS = 324,
+ tUMINUS = 325,
+ tPOW = 326,
+ tCMP = 327,
+ tEQ = 328,
+ tEQQ = 329,
+ tNEQ = 330,
+ tGEQ = 331,
+ tLEQ = 332,
+ tANDOP = 333,
+ tOROP = 334,
+ tMATCH = 335,
+ tNMATCH = 336,
+ tDOT2 = 337,
+ tDOT3 = 338,
+ tAREF = 339,
+ tASET = 340,
+ tLSHFT = 341,
+ tRSHFT = 342,
+ tCOLON2 = 343,
+ tCOLON3 = 344,
+ tOP_ASGN = 345,
+ tASSOC = 346,
+ tLPAREN = 347,
+ tLPAREN_ARG = 348,
+ tRPAREN = 349,
+ tLBRACK = 350,
+ tLBRACE = 351,
+ tLBRACE_ARG = 352,
+ tSTAR = 353,
+ tAMPER = 354,
+ tLAMBDA = 355,
+ tSYMBEG = 356,
+ tREGEXP_BEG = 357,
+ tWORDS_BEG = 358,
+ tSYMBOLS_BEG = 359,
+ tSTRING_BEG = 360,
+ tXSTRING_BEG = 361,
+ tSTRING_DVAR = 362,
+ tLAMBEG = 363,
+ tHEREDOC_BEG = 364,
+ tHEREDOC_END = 365,
+ tLITERAL_DELIM = 366,
+ tHD_LITERAL_DELIM = 367,
+ tHD_STRING_PART = 368,
+ tHD_STRING_MID = 369,
+ tLOWEST = 370,
+ tUMINUS_NUM = 371,
+ idNULL = 372,
+ idRespond_to = 373,
+ idIFUNC = 374,
+ idCFUNC = 375,
+ id_core_set_method_alias = 376,
+ id_core_set_variable_alias = 377,
+ id_core_undef_method = 378,
+ id_core_define_method = 379,
+ id_core_define_singleton_method = 380,
+ id_core_set_postexe = 381,
+ tLAST_TOKEN = 382
+ };
+#endif
+
+
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+{
+
+/* Line 214 of yacc.c */
+#line 1005 "src/parse.y"
+
+ node *nd;
+ mrb_sym id;
+ int num;
+ stack_type stack;
+ const struct vtable *vars;
+
+
+
+/* Line 214 of yacc.c */
+#line 1240 "C:/Users/matsuzaki.takuya/work/daily/20150106/mruby-1.1.0/build/ARMCA9/src/y.tab.c"
+} YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+/* Copy the second part of user declarations. */
+
+
+/* Line 264 of yacc.c */
+#line 1252 "C:/Users/matsuzaki.takuya/work/daily/20150106/mruby-1.1.0/build/ARMCA9/src/y.tab.c"
+
+#ifdef short
+# undef short
+#endif
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
+#endif
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
+#endif
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short int yytype_uint16;
+#endif
+
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short int yytype_int16;
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+# define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+# define YYSIZE_T size_t
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# else
+# define YYSIZE_T unsigned int
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+# if ENABLE_NLS
+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_(msgid) dgettext ("bison-runtime", msgid)
+# endif
+# endif
+# ifndef YY_
+# define YY_(msgid) msgid
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E. */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(e) ((void) (e))
+#else
+# define YYUSE(e) /* empty */
+#endif
+
+/* Identity function, used to suppress warnings about constant conditions. */
+#ifndef lint
+# define YYID(n) (n)
+#else
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int yyi)
+#else
+static int
+YYID (yyi)
+ int yyi;
+#endif
+{
+ return yyi;
+}
+#endif
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# ifdef YYSTACK_USE_ALLOCA
+# if YYSTACK_USE_ALLOCA
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# elif defined __BUILTIN_VA_ARG_INCR
+# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+# elif defined _AIX
+# define YYSTACK_ALLOC __alloca
+# elif defined _MSC_VER
+# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+# define alloca _alloca
+# else
+# define YYSTACK_ALLOC alloca
+# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef _STDLIB_H
+# define _STDLIB_H 1
+# endif
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's `empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
+# ifndef YYSTACK_ALLOC_MAXIMUM
+ /* The OS might guarantee only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
+ to allow for a few compiler-allocated temporary stack slots. */
+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+# endif
+# else
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# ifndef YYSTACK_ALLOC_MAXIMUM
+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+# endif
+# if (defined __cplusplus && ! defined _STDLIB_H \
+ && ! ((defined YYMALLOC || defined malloc) \
+ && (defined YYFREE || defined free)))
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef _STDLIB_H
+# define _STDLIB_H 1
+# endif
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# ifndef YYFREE
+# define YYFREE free
+# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# endif
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
+
+
+#if (! defined yyoverflow \
+ && (! defined __cplusplus \
+ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ yytype_int16 yyss_alloc;
+ YYSTYPE yyvs_alloc;
+};
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+/* Copy COUNT objects from FROM to TO. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if defined __GNUC__ && 1 < __GNUC__
+# define YYCOPY(To, From, Count) \
+ __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+# else
+# define YYCOPY(To, From, Count) \
+ do \
+ { \
+ YYSIZE_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (To)[yyi] = (From)[yyi]; \
+ } \
+ while (YYID (0))
+# endif
+# endif
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
+ do \
+ { \
+ YYSIZE_T yynewbytes; \
+ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
+ Stack = &yyptr->Stack_alloc; \
+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / sizeof (*yyptr); \
+ } \
+ while (YYID (0))
+
+#endif
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 3
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 10941
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 154
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 160
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 555
+/* YYNRULES -- Number of states. */
+#define YYNSTATES 970
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
+#define YYUNDEFTOK 2
+#define YYMAXUTOK 382
+
+#define YYTRANSLATE(YYX) \
+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
+static const yytype_uint8 yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 153, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 130, 2, 2, 2, 128, 123, 2,
+ 149, 150, 126, 124, 147, 125, 146, 127, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 118, 152,
+ 120, 116, 119, 117, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 145, 2, 151, 122, 2, 148, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 143, 121, 144, 131, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
+ 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
+ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
+ 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
+ 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,
+ 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
+ 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
+ 115, 129, 132, 133, 134, 135, 136, 137, 138, 139,
+ 140, 141, 142
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+ YYRHS. */
+static const yytype_uint16 yyprhs[] =
+{
+ 0, 0, 3, 4, 7, 10, 12, 14, 18, 21,
+ 23, 24, 30, 35, 38, 40, 42, 46, 49, 50,
+ 55, 58, 62, 66, 70, 74, 78, 83, 85, 89,
+ 93, 100, 106, 112, 118, 124, 128, 132, 136, 140,
+ 142, 146, 150, 152, 156, 160, 164, 167, 169, 171,
+ 173, 175, 177, 182, 183, 189, 192, 196, 201, 207,
+ 212, 218, 221, 224, 227, 230, 233, 235, 239, 241,
+ 245, 247, 250, 254, 260, 263, 268, 271, 276, 278,
+ 282, 284, 288, 291, 295, 297, 300, 302, 307, 311,
+ 315, 319, 323, 326, 328, 330, 335, 339, 343, 347,
+ 351, 354, 356, 358, 360, 363, 365, 369, 371, 373,
+ 375, 377, 379, 381, 383, 385, 386, 391, 393, 395,
+ 397, 399, 401, 403, 405, 407, 409, 411, 413, 415,
+ 417, 419, 421, 423, 425, 427, 429, 431, 433, 435,
+ 437, 439, 441, 443, 445, 447, 449, 451, 453, 455,
+ 457, 459, 461, 463, 465, 467, 469, 471, 473, 475,
+ 477, 479, 481, 483, 485, 487, 489, 491, 493, 495,
+ 497, 499, 501, 503, 505, 507, 509, 511, 513, 515,
+ 517, 519, 521, 523, 525, 527, 529, 533, 539, 543,
+ 549, 556, 562, 568, 574, 580, 585, 589, 593, 597,
+ 601, 605, 609, 613, 617, 621, 626, 631, 634, 637,
+ 641, 645, 649, 653, 657, 661, 665, 669, 673, 677,
+ 681, 685, 689, 692, 695, 699, 703, 707, 711, 718,
+ 720, 722, 724, 727, 732, 735, 739, 741, 743, 745,
+ 747, 750, 755, 758, 760, 763, 766, 771, 773, 774,
+ 777, 780, 783, 785, 787, 790, 794, 799, 804, 810,
+ 814, 819, 822, 824, 826, 828, 830, 832, 834, 836,
+ 838, 839, 844, 845, 846, 852, 853, 857, 861, 865,
+ 868, 872, 876, 878, 883, 887, 889, 894, 898, 901,
+ 903, 906, 907, 912, 919, 926, 927, 928, 936, 937,
+ 938, 946, 952, 957, 958, 959, 969, 970, 977, 978,
+ 979, 988, 989, 995, 996, 997, 1005, 1006, 1007, 1017,
+ 1019, 1021, 1023, 1025, 1027, 1029, 1031, 1034, 1036, 1038,
+ 1040, 1046, 1048, 1051, 1053, 1055, 1057, 1061, 1063, 1067,
+ 1069, 1074, 1081, 1085, 1091, 1094, 1099, 1101, 1105, 1112,
+ 1121, 1126, 1133, 1138, 1141, 1148, 1151, 1156, 1163, 1166,
+ 1171, 1174, 1179, 1181, 1183, 1185, 1189, 1191, 1196, 1198,
+ 1203, 1205, 1209, 1211, 1213, 1218, 1220, 1224, 1228, 1229,
+ 1235, 1238, 1243, 1249, 1255, 1258, 1263, 1268, 1272, 1276,
+ 1280, 1283, 1285, 1290, 1291, 1297, 1298, 1304, 1310, 1312,
+ 1314, 1321, 1323, 1325, 1327, 1329, 1332, 1334, 1337, 1339,
+ 1341, 1343, 1345, 1347, 1349, 1351, 1354, 1358, 1360, 1363,
+ 1365, 1366, 1371, 1373, 1376, 1379, 1383, 1386, 1390, 1392,
+ 1393, 1395, 1397, 1400, 1402, 1405, 1407, 1410, 1412, 1413,
+ 1418, 1421, 1425, 1427, 1432, 1435, 1437, 1439, 1441, 1443,
+ 1445, 1448, 1451, 1455, 1457, 1459, 1462, 1465, 1467, 1469,
+ 1471, 1473, 1475, 1477, 1479, 1481, 1483, 1485, 1487, 1489,
+ 1491, 1493, 1495, 1497, 1498, 1503, 1506, 1510, 1513, 1520,
+ 1529, 1534, 1541, 1546, 1553, 1556, 1561, 1568, 1571, 1576,
+ 1579, 1584, 1586, 1587, 1589, 1591, 1593, 1595, 1597, 1599,
+ 1601, 1605, 1607, 1611, 1614, 1617, 1620, 1622, 1626, 1628,
+ 1632, 1634, 1636, 1639, 1641, 1643, 1645, 1648, 1651, 1653,
+ 1655, 1656, 1661, 1663, 1666, 1668, 1672, 1676, 1679, 1681,
+ 1683, 1685, 1687, 1689, 1691, 1693, 1695, 1697, 1699, 1701,
+ 1703, 1704, 1706, 1707, 1709, 1712, 1715, 1716, 1718, 1720,
+ 1722, 1724, 1725, 1729, 1731, 1734
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yytype_int16 yyrhs[] =
+{
+ 155, 0, -1, -1, 156, 157, -1, 158, 304, -1,
+ 313, -1, 159, -1, 158, 312, 159, -1, 1, 159,
+ -1, 164, -1, -1, 46, 160, 143, 157, 144, -1,
+ 162, 249, 227, 252, -1, 163, 304, -1, 313, -1,
+ 164, -1, 163, 312, 164, -1, 1, 164, -1, -1,
+ 45, 185, 165, 185, -1, 12, 186, -1, 164, 40,
+ 168, -1, 164, 41, 168, -1, 164, 42, 168, -1,
+ 164, 43, 168, -1, 164, 44, 164, -1, 47, 143,
+ 162, 144, -1, 166, -1, 174, 116, 169, -1, 274,
+ 90, 169, -1, 223, 145, 195, 307, 90, 169, -1,
+ 223, 146, 51, 90, 169, -1, 223, 146, 55, 90,
+ 169, -1, 223, 88, 55, 90, 169, -1, 223, 88,
+ 51, 90, 169, -1, 276, 90, 169, -1, 181, 116,
+ 202, -1, 174, 116, 191, -1, 174, 116, 202, -1,
+ 167, -1, 181, 116, 169, -1, 181, 116, 166, -1,
+ 169, -1, 167, 37, 167, -1, 167, 38, 167, -1,
+ 39, 305, 167, -1, 130, 169, -1, 190, -1, 167,
+ -1, 173, -1, 170, -1, 242, -1, 242, 303, 301,
+ 197, -1, -1, 97, 172, 233, 162, 144, -1, 300,
+ 197, -1, 300, 197, 171, -1, 223, 146, 301, 197,
+ -1, 223, 146, 301, 197, 171, -1, 223, 88, 301,
+ 197, -1, 223, 88, 301, 197, 171, -1, 32, 197,
+ -1, 31, 197, -1, 30, 196, -1, 21, 196, -1,
+ 22, 196, -1, 176, -1, 92, 175, 306, -1, 176,
+ -1, 92, 175, 306, -1, 178, -1, 178, 177, -1,
+ 178, 98, 180, -1, 178, 98, 180, 147, 179, -1,
+ 178, 98, -1, 178, 98, 147, 179, -1, 98, 180,
+ -1, 98, 180, 147, 179, -1, 98, -1, 98, 147,
+ 179, -1, 180, -1, 92, 175, 306, -1, 177, 147,
+ -1, 178, 177, 147, -1, 177, -1, 178, 177, -1,
+ 273, -1, 223, 145, 195, 307, -1, 223, 146, 51,
+ -1, 223, 88, 51, -1, 223, 146, 55, -1, 223,
+ 88, 55, -1, 89, 55, -1, 276, -1, 273, -1,
+ 223, 145, 195, 307, -1, 223, 146, 51, -1, 223,
+ 88, 51, -1, 223, 146, 55, -1, 223, 88, 55,
+ -1, 89, 55, -1, 276, -1, 51, -1, 55, -1,
+ 89, 182, -1, 182, -1, 223, 88, 182, -1, 51,
+ -1, 55, -1, 52, -1, 188, -1, 189, -1, 184,
+ -1, 269, -1, 185, -1, -1, 186, 147, 187, 185,
+ -1, 121, -1, 122, -1, 123, -1, 72, -1, 73,
+ -1, 74, -1, 80, -1, 81, -1, 119, -1, 76,
+ -1, 120, -1, 77, -1, 75, -1, 86, -1, 87,
+ -1, 124, -1, 125, -1, 126, -1, 98, -1, 127,
+ -1, 128, -1, 71, -1, 130, -1, 131, -1, 69,
+ -1, 70, -1, 84, -1, 85, -1, 148, -1, 48,
+ -1, 49, -1, 50, -1, 46, -1, 47, -1, 45,
+ -1, 37, -1, 6, -1, 21, -1, 19, -1, 3,
+ -1, 5, -1, 26, -1, 18, -1, 17, -1, 15,
+ -1, 14, -1, 36, -1, 11, -1, 25, -1, 4,
+ -1, 22, -1, 34, -1, 39, -1, 38, -1, 23,
+ -1, 13, -1, 24, -1, 30, -1, 33, -1, 32,
+ -1, 16, -1, 35, -1, 12, -1, 20, -1, 31,
+ -1, 7, -1, 8, -1, 9, -1, 10, -1, 181,
+ 116, 190, -1, 181, 116, 190, 44, 190, -1, 274,
+ 90, 190, -1, 274, 90, 190, 44, 190, -1, 223,
+ 145, 195, 307, 90, 190, -1, 223, 146, 51, 90,
+ 190, -1, 223, 146, 55, 90, 190, -1, 223, 88,
+ 51, 90, 190, -1, 223, 88, 55, 90, 190, -1,
+ 89, 55, 90, 190, -1, 276, 90, 190, -1, 190,
+ 82, 190, -1, 190, 83, 190, -1, 190, 124, 190,
+ -1, 190, 125, 190, -1, 190, 126, 190, -1, 190,
+ 127, 190, -1, 190, 128, 190, -1, 190, 71, 190,
+ -1, 129, 58, 71, 190, -1, 129, 59, 71, 190,
+ -1, 69, 190, -1, 70, 190, -1, 190, 121, 190,
+ -1, 190, 122, 190, -1, 190, 123, 190, -1, 190,
+ 72, 190, -1, 190, 119, 190, -1, 190, 76, 190,
+ -1, 190, 120, 190, -1, 190, 77, 190, -1, 190,
+ 73, 190, -1, 190, 74, 190, -1, 190, 75, 190,
+ -1, 190, 80, 190, -1, 190, 81, 190, -1, 130,
+ 190, -1, 131, 190, -1, 190, 86, 190, -1, 190,
+ 87, 190, -1, 190, 78, 190, -1, 190, 79, 190,
+ -1, 190, 117, 190, 305, 118, 190, -1, 203, -1,
+ 190, -1, 313, -1, 201, 308, -1, 201, 147, 298,
+ 308, -1, 298, 308, -1, 149, 195, 306, -1, 313,
+ -1, 193, -1, 313, -1, 196, -1, 201, 147, -1,
+ 201, 147, 298, 147, -1, 298, 147, -1, 173, -1,
+ 201, 200, -1, 298, 200, -1, 201, 147, 298, 200,
+ -1, 199, -1, -1, 198, 196, -1, 99, 191, -1,
+ 147, 199, -1, 313, -1, 191, -1, 98, 191, -1,
+ 201, 147, 191, -1, 201, 147, 98, 191, -1, 201,
+ 147, 262, 191, -1, 201, 147, 262, 98, 191, -1,
+ 201, 147, 191, -1, 201, 147, 98, 191, -1, 98,
+ 191, -1, 253, -1, 254, -1, 258, -1, 259, -1,
+ 260, -1, 275, -1, 276, -1, 52, -1, -1, 6,
+ 204, 161, 15, -1, -1, -1, 93, 205, 167, 206,
+ 306, -1, -1, 93, 207, 306, -1, 92, 162, 150,
+ -1, 223, 88, 55, -1, 89, 55, -1, 95, 192,
+ 151, -1, 96, 297, 144, -1, 30, -1, 31, 149,
+ 196, 306, -1, 31, 149, 306, -1, 31, -1, 39,
+ 149, 167, 306, -1, 39, 149, 306, -1, 300, 244,
+ -1, 243, -1, 243, 244, -1, -1, 100, 208, 238,
+ 239, -1, 7, 168, 224, 162, 226, 15, -1, 8,
+ 168, 224, 162, 227, 15, -1, -1, -1, 9, 209,
+ 168, 225, 210, 162, 15, -1, -1, -1, 10, 211,
+ 168, 225, 212, 162, 15, -1, 19, 168, 304, 247,
+ 15, -1, 19, 304, 247, 15, -1, -1, -1, 11,
+ 228, 25, 213, 168, 225, 214, 162, 15, -1, -1,
+ 3, 183, 277, 215, 161, 15, -1, -1, -1, 3,
+ 86, 167, 216, 309, 217, 161, 15, -1, -1, 4,
+ 183, 218, 161, 15, -1, -1, -1, 5, 184, 219,
+ 220, 279, 161, 15, -1, -1, -1, 5, 295, 303,
+ 221, 184, 222, 279, 161, 15, -1, 21, -1, 22,
+ -1, 23, -1, 24, -1, 203, -1, 309, -1, 16,
+ -1, 309, 16, -1, 309, -1, 27, -1, 227, -1,
+ 17, 168, 224, 162, 226, -1, 313, -1, 18, 162,
+ -1, 181, -1, 174, -1, 282, -1, 92, 231, 306,
+ -1, 229, -1, 230, 147, 229, -1, 230, -1, 230,
+ 147, 98, 282, -1, 230, 147, 98, 282, 147, 230,
+ -1, 230, 147, 98, -1, 230, 147, 98, 147, 230,
+ -1, 98, 282, -1, 98, 282, 147, 230, -1, 98,
+ -1, 98, 147, 230, -1, 284, 147, 288, 147, 291,
+ 294, -1, 284, 147, 288, 147, 291, 147, 284, 294,
+ -1, 284, 147, 288, 294, -1, 284, 147, 288, 147,
+ 284, 294, -1, 284, 147, 291, 294, -1, 284, 147,
+ -1, 284, 147, 291, 147, 284, 294, -1, 284, 294,
+ -1, 288, 147, 291, 294, -1, 288, 147, 291, 147,
+ 284, 294, -1, 288, 294, -1, 288, 147, 284, 294,
+ -1, 291, 294, -1, 291, 147, 284, 294, -1, 293,
+ -1, 313, -1, 234, -1, 121, 235, 121, -1, 79,
+ -1, 121, 232, 235, 121, -1, 305, -1, 305, 152,
+ 236, 305, -1, 237, -1, 236, 147, 237, -1, 51,
+ -1, 281, -1, 149, 280, 235, 150, -1, 280, -1,
+ 108, 162, 144, -1, 29, 162, 15, -1, -1, 28,
+ 241, 233, 162, 15, -1, 173, 240, -1, 242, 303,
+ 301, 194, -1, 242, 303, 301, 194, 244, -1, 242,
+ 303, 301, 197, 240, -1, 300, 193, -1, 223, 146,
+ 301, 194, -1, 223, 88, 301, 193, -1, 223, 88,
+ 302, -1, 223, 146, 193, -1, 223, 88, 193, -1,
+ 32, 193, -1, 32, -1, 223, 145, 195, 307, -1,
+ -1, 143, 245, 233, 162, 144, -1, -1, 26, 246,
+ 233, 162, 15, -1, 20, 201, 224, 162, 248, -1,
+ 227, -1, 247, -1, 13, 250, 251, 224, 162, 249,
+ -1, 313, -1, 191, -1, 202, -1, 313, -1, 91,
+ 181, -1, 313, -1, 14, 162, -1, 313, -1, 272,
+ -1, 268, -1, 267, -1, 271, -1, 60, -1, 63,
+ -1, 105, 63, -1, 105, 255, 63, -1, 256, -1,
+ 255, 256, -1, 65, -1, -1, 64, 257, 162, 144,
+ -1, 111, -1, 112, 262, -1, 106, 61, -1, 106,
+ 255, 61, -1, 102, 62, -1, 102, 255, 62, -1,
+ 109, -1, -1, 262, -1, 263, -1, 262, 263, -1,
+ 110, -1, 264, 110, -1, 265, -1, 264, 265, -1,
+ 114, -1, -1, 113, 266, 162, 144, -1, 103, 63,
+ -1, 103, 255, 63, -1, 269, -1, 101, 105, 256,
+ 63, -1, 101, 270, -1, 184, -1, 54, -1, 53,
+ -1, 56, -1, 63, -1, 105, 63, -1, 104, 63,
+ -1, 104, 255, 63, -1, 58, -1, 59, -1, 129,
+ 58, -1, 129, 59, -1, 51, -1, 54, -1, 53,
+ -1, 56, -1, 55, -1, 273, -1, 273, -1, 34,
+ -1, 33, -1, 35, -1, 36, -1, 49, -1, 48,
+ -1, 66, -1, 67, -1, 309, -1, -1, 120, 278,
+ 168, 309, -1, 1, 309, -1, 149, 280, 306, -1,
+ 280, 309, -1, 284, 147, 289, 147, 291, 294, -1,
+ 284, 147, 289, 147, 291, 147, 284, 294, -1, 284,
+ 147, 289, 294, -1, 284, 147, 289, 147, 284, 294,
+ -1, 284, 147, 291, 294, -1, 284, 147, 291, 147,
+ 284, 294, -1, 284, 294, -1, 289, 147, 291, 294,
+ -1, 289, 147, 291, 147, 284, 294, -1, 289, 294,
+ -1, 289, 147, 284, 294, -1, 291, 294, -1, 291,
+ 147, 284, 294, -1, 293, -1, -1, 55, -1, 54,
+ -1, 53, -1, 56, -1, 281, -1, 51, -1, 282,
+ -1, 92, 231, 306, -1, 283, -1, 284, 147, 283,
+ -1, 51, 116, -1, 285, 191, -1, 285, 223, -1,
+ 287, -1, 288, 147, 287, -1, 286, -1, 289, 147,
+ 286, -1, 126, -1, 98, -1, 290, 51, -1, 290,
+ -1, 123, -1, 99, -1, 292, 51, -1, 147, 293,
+ -1, 313, -1, 275, -1, -1, 149, 296, 167, 306,
+ -1, 313, -1, 298, 308, -1, 299, -1, 298, 147,
+ 299, -1, 191, 91, 191, -1, 57, 191, -1, 51,
+ -1, 55, -1, 52, -1, 51, -1, 55, -1, 52,
+ -1, 188, -1, 51, -1, 52, -1, 188, -1, 146,
+ -1, 88, -1, -1, 312, -1, -1, 310, -1, 305,
+ 150, -1, 305, 151, -1, -1, 310, -1, 147, -1,
+ 152, -1, 310, -1, -1, 153, 311, 261, -1, 309,
+ -1, 312, 152, -1, -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+static const yytype_uint16 yyrline[] =
+{
+ 0, 1166, 1166, 1166, 1177, 1183, 1187, 1192, 1196, 1202,
+ 1204, 1203, 1215, 1242, 1248, 1252, 1257, 1261, 1267, 1267,
+ 1271, 1275, 1279, 1283, 1287, 1291, 1295, 1300, 1301, 1305,
+ 1309, 1313, 1317, 1321, 1326, 1330, 1335, 1339, 1343, 1347,
+ 1350, 1354, 1361, 1362, 1366, 1370, 1374, 1378, 1381, 1388,
+ 1389, 1392, 1393, 1397, 1396, 1409, 1413, 1418, 1422, 1427,
+ 1431, 1436, 1440, 1444, 1448, 1452, 1458, 1462, 1468, 1469,
+ 1475, 1479, 1483, 1487, 1491, 1495, 1499, 1503, 1507, 1511,
+ 1517, 1518, 1524, 1528, 1534, 1538, 1544, 1548, 1552, 1556,
+ 1560, 1564, 1570, 1576, 1583, 1587, 1591, 1595, 1599, 1603,
+ 1609, 1615, 1622, 1626, 1629, 1633, 1637, 1643, 1644, 1645,
+ 1646, 1651, 1658, 1659, 1662, 1666, 1666, 1672, 1673, 1674,
+ 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684,
+ 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694,
+ 1695, 1696, 1697, 1698, 1699, 1700, 1703, 1703, 1703, 1704,
+ 1704, 1705, 1705, 1705, 1706, 1706, 1706, 1706, 1707, 1707,
+ 1707, 1708, 1708, 1708, 1709, 1709, 1709, 1709, 1710, 1710,
+ 1710, 1710, 1711, 1711, 1711, 1711, 1712, 1712, 1712, 1712,
+ 1713, 1713, 1713, 1713, 1714, 1714, 1717, 1721, 1725, 1729,
+ 1733, 1737, 1741, 1745, 1749, 1754, 1759, 1764, 1768, 1772,
+ 1776, 1780, 1784, 1788, 1792, 1796, 1800, 1804, 1808, 1812,
+ 1816, 1820, 1824, 1828, 1832, 1836, 1840, 1844, 1848, 1852,
+ 1856, 1860, 1864, 1868, 1872, 1876, 1880, 1884, 1888, 1892,
+ 1898, 1905, 1906, 1911, 1915, 1922, 1928, 1929, 1932, 1933,
+ 1934, 1939, 1944, 1951, 1956, 1961, 1966, 1971, 1978, 1978,
+ 1989, 1995, 1999, 2005, 2010, 2015, 2019, 2023, 2027, 2033,
+ 2037, 2041, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054,
+ 2059, 2058, 2070, 2074, 2069, 2079, 2079, 2083, 2087, 2091,
+ 2095, 2100, 2105, 2109, 2113, 2117, 2121, 2125, 2129, 2133,
+ 2134, 2140, 2139, 2152, 2160, 2168, 2168, 2168, 2175, 2175,
+ 2175, 2182, 2188, 2193, 2195, 2192, 2204, 2202, 2218, 2223,
+ 2216, 2238, 2236, 2251, 2255, 2250, 2270, 2276, 2269, 2291,
+ 2295, 2299, 2303, 2309, 2316, 2317, 2318, 2321, 2322, 2325,
+ 2326, 2334, 2335, 2341, 2345, 2348, 2352, 2358, 2362, 2368,
+ 2372, 2376, 2380, 2384, 2388, 2392, 2396, 2400, 2406, 2410,
+ 2414, 2418, 2422, 2426, 2430, 2434, 2438, 2442, 2446, 2450,
+ 2454, 2458, 2462, 2468, 2469, 2476, 2480, 2484, 2491, 2495,
+ 2501, 2502, 2505, 2510, 2513, 2517, 2523, 2527, 2534, 2533,
+ 2546, 2556, 2560, 2565, 2572, 2576, 2580, 2584, 2588, 2592,
+ 2596, 2600, 2604, 2611, 2610, 2623, 2622, 2636, 2644, 2653,
+ 2656, 2663, 2666, 2670, 2671, 2674, 2678, 2681, 2685, 2688,
+ 2689, 2690, 2691, 2694, 2695, 2696, 2700, 2706, 2707, 2713,
+ 2718, 2717, 2728, 2732, 2738, 2742, 2748, 2752, 2758, 2761,
+ 2762, 2765, 2766, 2769, 2775, 2781, 2782, 2785, 2792, 2791,
+ 2805, 2809, 2816, 2820, 2827, 2834, 2835, 2836, 2837, 2838,
+ 2842, 2848, 2852, 2858, 2859, 2860, 2864, 2870, 2874, 2878,
+ 2882, 2886, 2892, 2898, 2902, 2906, 2910, 2914, 2918, 2925,
+ 2934, 2935, 2938, 2943, 2942, 2951, 2958, 2964, 2970, 2974,
+ 2978, 2982, 2986, 2990, 2994, 2998, 3002, 3006, 3010, 3014,
+ 3018, 3022, 3027, 3033, 3038, 3043, 3048, 3055, 3059, 3066,
+ 3070, 3076, 3080, 3086, 3093, 3099, 3105, 3109, 3115, 3119,
+ 3125, 3126, 3129, 3134, 3141, 3142, 3145, 3152, 3156, 3163,
+ 3168, 3168, 3193, 3194, 3200, 3205, 3211, 3215, 3221, 3222,
+ 3223, 3226, 3227, 3228, 3229, 3232, 3233, 3234, 3237, 3238,
+ 3241, 3242, 3245, 3246, 3249, 3252, 3255, 3256, 3257, 3260,
+ 3261, 3265, 3264, 3271, 3272, 3276
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "$end", "error", "$undefined", "keyword_class", "keyword_module",
+ "keyword_def", "keyword_begin", "keyword_if", "keyword_unless",
+ "keyword_while", "keyword_until", "keyword_for", "keyword_undef",
+ "keyword_rescue", "keyword_ensure", "keyword_end", "keyword_then",
+ "keyword_elsif", "keyword_else", "keyword_case", "keyword_when",
+ "keyword_break", "keyword_next", "keyword_redo", "keyword_retry",
+ "keyword_in", "keyword_do", "keyword_do_cond", "keyword_do_block",
+ "keyword_do_LAMBDA", "keyword_return", "keyword_yield", "keyword_super",
+ "keyword_self", "keyword_nil", "keyword_true", "keyword_false",
+ "keyword_and", "keyword_or", "keyword_not", "modifier_if",
+ "modifier_unless", "modifier_while", "modifier_until", "modifier_rescue",
+ "keyword_alias", "keyword_BEGIN", "keyword_END", "keyword__LINE__",
+ "keyword__FILE__", "keyword__ENCODING__", "tIDENTIFIER", "tFID", "tGVAR",
+ "tIVAR", "tCONSTANT", "tCVAR", "tLABEL", "tINTEGER", "tFLOAT", "tCHAR",
+ "tXSTRING", "tREGEXP", "tSTRING", "tSTRING_PART", "tSTRING_MID",
+ "tNTH_REF", "tBACK_REF", "tREGEXP_END", "tUPLUS", "tUMINUS", "tPOW",
+ "tCMP", "tEQ", "tEQQ", "tNEQ", "tGEQ", "tLEQ", "tANDOP", "tOROP",
+ "tMATCH", "tNMATCH", "tDOT2", "tDOT3", "tAREF", "tASET", "tLSHFT",
+ "tRSHFT", "tCOLON2", "tCOLON3", "tOP_ASGN", "tASSOC", "tLPAREN",
+ "tLPAREN_ARG", "tRPAREN", "tLBRACK", "tLBRACE", "tLBRACE_ARG", "tSTAR",
+ "tAMPER", "tLAMBDA", "tSYMBEG", "tREGEXP_BEG", "tWORDS_BEG",
+ "tSYMBOLS_BEG", "tSTRING_BEG", "tXSTRING_BEG", "tSTRING_DVAR", "tLAMBEG",
+ "tHEREDOC_BEG", "tHEREDOC_END", "tLITERAL_DELIM", "tHD_LITERAL_DELIM",
+ "tHD_STRING_PART", "tHD_STRING_MID", "tLOWEST", "'='", "'?'", "':'",
+ "'>'", "'<'", "'|'", "'^'", "'&'", "'+'", "'-'", "'*'", "'/'", "'%'",
+ "tUMINUS_NUM", "'!'", "'~'", "idNULL", "idRespond_to", "idIFUNC",
+ "idCFUNC", "id_core_set_method_alias", "id_core_set_variable_alias",
+ "id_core_undef_method", "id_core_define_method",
+ "id_core_define_singleton_method", "id_core_set_postexe", "tLAST_TOKEN",
+ "'{'", "'}'", "'['", "'.'", "','", "'`'", "'('", "')'", "']'", "';'",
+ "'\\n'", "$accept", "program", "$@1", "top_compstmt", "top_stmts",
+ "top_stmt", "@2", "bodystmt", "compstmt", "stmts", "stmt", "$@3",
+ "command_asgn", "expr", "expr_value", "command_call", "block_command",
+ "cmd_brace_block", "$@4", "command", "mlhs", "mlhs_inner", "mlhs_basic",
+ "mlhs_item", "mlhs_list", "mlhs_post", "mlhs_node", "lhs", "cname",
+ "cpath", "fname", "fsym", "undef_list", "$@5", "op", "reswords", "arg",
+ "arg_value", "aref_args", "paren_args", "opt_paren_args",
+ "opt_call_args", "call_args", "command_args", "@6", "block_arg",
+ "opt_block_arg", "args", "mrhs", "primary", "@7", "@8", "$@9", "$@10",
+ "@11", "$@12", "$@13", "$@14", "$@15", "$@16", "$@17", "@18", "@19",
+ "@20", "@21", "@22", "@23", "@24", "@25", "primary_value", "then", "do",
+ "if_tail", "opt_else", "for_var", "f_marg", "f_marg_list", "f_margs",
+ "block_param", "opt_block_param", "block_param_def", "opt_bv_decl",
+ "bv_decls", "bvar", "f_larglist", "lambda_body", "do_block", "$@26",
+ "block_call", "method_call", "brace_block", "@27", "@28", "case_body",
+ "cases", "opt_rescue", "exc_list", "exc_var", "opt_ensure", "literal",
+ "string", "string_rep", "string_interp", "@29", "xstring", "regexp",
+ "heredoc", "opt_heredoc_bodies", "heredoc_bodies", "heredoc_body",
+ "heredoc_string_rep", "heredoc_string_interp", "@30", "words", "symbol",
+ "basic_symbol", "sym", "symbols", "numeric", "variable", "var_lhs",
+ "var_ref", "backref", "superclass", "$@31", "f_arglist", "f_args",
+ "f_bad_arg", "f_norm_arg", "f_arg_item", "f_arg", "f_opt_asgn", "f_opt",
+ "f_block_opt", "f_block_optarg", "f_optarg", "restarg_mark",
+ "f_rest_arg", "blkarg_mark", "f_block_arg", "opt_f_block_arg",
+ "singleton", "$@32", "assoc_list", "assocs", "assoc", "operation",
+ "operation2", "operation3", "dot_or_colon", "opt_terms", "opt_nl",
+ "rparen", "rbracket", "trailer", "term", "nl", "$@33", "terms", "none", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+ token YYLEX-NUM. */
+static const yytype_uint16 yytoknum[] =
+{
+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
+ 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
+ 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
+ 295, 296, 297, 298, 299, 300, 301, 302, 303, 304,
+ 305, 306, 307, 308, 309, 310, 311, 312, 313, 314,
+ 315, 316, 317, 318, 319, 320, 321, 322, 323, 324,
+ 325, 326, 327, 328, 329, 330, 331, 332, 333, 334,
+ 335, 336, 337, 338, 339, 340, 341, 342, 343, 344,
+ 345, 346, 347, 348, 349, 350, 351, 352, 353, 354,
+ 355, 356, 357, 358, 359, 360, 361, 362, 363, 364,
+ 365, 366, 367, 368, 369, 370, 61, 63, 58, 62,
+ 60, 124, 94, 38, 43, 45, 42, 47, 37, 371,
+ 33, 126, 372, 373, 374, 375, 376, 377, 378, 379,
+ 380, 381, 382, 123, 125, 91, 46, 44, 96, 40,
+ 41, 93, 59, 10
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const yytype_uint16 yyr1[] =
+{
+ 0, 154, 156, 155, 157, 158, 158, 158, 158, 159,
+ 160, 159, 161, 162, 163, 163, 163, 163, 165, 164,
+ 164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+ 164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+ 166, 166, 167, 167, 167, 167, 167, 167, 168, 169,
+ 169, 170, 170, 172, 171, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 174, 174, 175, 175,
+ 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
+ 177, 177, 178, 178, 179, 179, 180, 180, 180, 180,
+ 180, 180, 180, 180, 181, 181, 181, 181, 181, 181,
+ 181, 181, 182, 182, 183, 183, 183, 184, 184, 184,
+ 184, 184, 185, 185, 186, 187, 186, 188, 188, 188,
+ 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+ 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+ 188, 188, 188, 188, 188, 188, 189, 189, 189, 189,
+ 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+ 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+ 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+ 189, 189, 189, 189, 189, 189, 190, 190, 190, 190,
+ 190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+ 190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+ 190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+ 190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+ 191, 192, 192, 192, 192, 193, 194, 194, 195, 195,
+ 195, 195, 195, 196, 196, 196, 196, 196, 198, 197,
+ 199, 200, 200, 201, 201, 201, 201, 201, 201, 202,
+ 202, 202, 203, 203, 203, 203, 203, 203, 203, 203,
+ 204, 203, 205, 206, 203, 207, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 208, 203, 203, 203, 209, 210, 203, 211, 212,
+ 203, 203, 203, 213, 214, 203, 215, 203, 216, 217,
+ 203, 218, 203, 219, 220, 203, 221, 222, 203, 203,
+ 203, 203, 203, 223, 224, 224, 224, 225, 225, 226,
+ 226, 227, 227, 228, 228, 229, 229, 230, 230, 231,
+ 231, 231, 231, 231, 231, 231, 231, 231, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 232, 232, 233, 233, 234, 234, 234, 235, 235,
+ 236, 236, 237, 237, 238, 238, 239, 239, 241, 240,
+ 242, 242, 242, 242, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 245, 244, 246, 244, 247, 248, 248,
+ 249, 249, 250, 250, 250, 251, 251, 252, 252, 253,
+ 253, 253, 253, 254, 254, 254, 254, 255, 255, 256,
+ 257, 256, 256, 256, 258, 258, 259, 259, 260, 261,
+ 261, 262, 262, 263, 263, 264, 264, 265, 266, 265,
+ 267, 267, 268, 268, 269, 270, 270, 270, 270, 270,
+ 270, 271, 271, 272, 272, 272, 272, 273, 273, 273,
+ 273, 273, 274, 275, 275, 275, 275, 275, 275, 275,
+ 276, 276, 277, 278, 277, 277, 279, 279, 280, 280,
+ 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
+ 280, 280, 280, 281, 281, 281, 281, 282, 282, 283,
+ 283, 284, 284, 285, 286, 287, 288, 288, 289, 289,
+ 290, 290, 291, 291, 292, 292, 293, 294, 294, 295,
+ 296, 295, 297, 297, 298, 298, 299, 299, 300, 300,
+ 300, 301, 301, 301, 301, 302, 302, 302, 303, 303,
+ 304, 304, 305, 305, 306, 307, 308, 308, 308, 309,
+ 309, 311, 310, 312, 312, 313
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const yytype_uint8 yyr2[] =
+{
+ 0, 2, 0, 2, 2, 1, 1, 3, 2, 1,
+ 0, 5, 4, 2, 1, 1, 3, 2, 0, 4,
+ 2, 3, 3, 3, 3, 3, 4, 1, 3, 3,
+ 6, 5, 5, 5, 5, 3, 3, 3, 3, 1,
+ 3, 3, 1, 3, 3, 3, 2, 1, 1, 1,
+ 1, 1, 4, 0, 5, 2, 3, 4, 5, 4,
+ 5, 2, 2, 2, 2, 2, 1, 3, 1, 3,
+ 1, 2, 3, 5, 2, 4, 2, 4, 1, 3,
+ 1, 3, 2, 3, 1, 2, 1, 4, 3, 3,
+ 3, 3, 2, 1, 1, 4, 3, 3, 3, 3,
+ 2, 1, 1, 1, 2, 1, 3, 1, 1, 1,
+ 1, 1, 1, 1, 1, 0, 4, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 3, 5, 3, 5,
+ 6, 5, 5, 5, 5, 4, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 4, 4, 2, 2, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 2, 2, 3, 3, 3, 3, 6, 1,
+ 1, 1, 2, 4, 2, 3, 1, 1, 1, 1,
+ 2, 4, 2, 1, 2, 2, 4, 1, 0, 2,
+ 2, 2, 1, 1, 2, 3, 4, 4, 5, 3,
+ 4, 2, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 4, 0, 0, 5, 0, 3, 3, 3, 2,
+ 3, 3, 1, 4, 3, 1, 4, 3, 2, 1,
+ 2, 0, 4, 6, 6, 0, 0, 7, 0, 0,
+ 7, 5, 4, 0, 0, 9, 0, 6, 0, 0,
+ 8, 0, 5, 0, 0, 7, 0, 0, 9, 1,
+ 1, 1, 1, 1, 1, 1, 2, 1, 1, 1,
+ 5, 1, 2, 1, 1, 1, 3, 1, 3, 1,
+ 4, 6, 3, 5, 2, 4, 1, 3, 6, 8,
+ 4, 6, 4, 2, 6, 2, 4, 6, 2, 4,
+ 2, 4, 1, 1, 1, 3, 1, 4, 1, 4,
+ 1, 3, 1, 1, 4, 1, 3, 3, 0, 5,
+ 2, 4, 5, 5, 2, 4, 4, 3, 3, 3,
+ 2, 1, 4, 0, 5, 0, 5, 5, 1, 1,
+ 6, 1, 1, 1, 1, 2, 1, 2, 1, 1,
+ 1, 1, 1, 1, 1, 2, 3, 1, 2, 1,
+ 0, 4, 1, 2, 2, 3, 2, 3, 1, 0,
+ 1, 1, 2, 1, 2, 1, 2, 1, 0, 4,
+ 2, 3, 1, 4, 2, 1, 1, 1, 1, 1,
+ 2, 2, 3, 1, 1, 2, 2, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 0, 4, 2, 3, 2, 6, 8,
+ 4, 6, 4, 6, 2, 4, 6, 2, 4, 2,
+ 4, 1, 0, 1, 1, 1, 1, 1, 1, 1,
+ 3, 1, 3, 2, 2, 2, 1, 3, 1, 3,
+ 1, 1, 2, 1, 1, 1, 2, 2, 1, 1,
+ 0, 4, 1, 2, 1, 3, 3, 2, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 1, 0, 1, 2, 2, 0, 1, 1, 1,
+ 1, 0, 3, 1, 2, 0
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+ STATE-NUM when YYTABLE doesn't specify something else to do. Zero
+ means the default is an error. */
+static const yytype_uint16 yydefact[] =
+{
+ 2, 0, 0, 1, 0, 0, 0, 0, 270, 0,
+ 0, 295, 298, 0, 0, 540, 319, 320, 321, 322,
+ 282, 248, 248, 465, 464, 466, 467, 542, 0, 10,
+ 0, 469, 468, 457, 530, 459, 458, 461, 460, 453,
+ 454, 413, 414, 470, 471, 0, 0, 0, 0, 272,
+ 555, 555, 78, 291, 0, 0, 0, 0, 0, 0,
+ 428, 0, 0, 0, 3, 540, 6, 9, 27, 39,
+ 42, 50, 49, 0, 66, 0, 70, 80, 0, 47,
+ 229, 0, 51, 289, 262, 263, 264, 265, 266, 411,
+ 410, 442, 412, 409, 463, 0, 267, 268, 248, 5,
+ 8, 319, 320, 282, 285, 391, 0, 102, 103, 0,
+ 0, 0, 0, 105, 0, 323, 0, 463, 268, 0,
+ 311, 156, 166, 157, 153, 182, 183, 184, 185, 164,
+ 179, 172, 162, 161, 177, 160, 159, 155, 180, 154,
+ 167, 171, 173, 165, 158, 174, 181, 176, 175, 168,
+ 178, 163, 152, 170, 169, 151, 149, 150, 146, 147,
+ 148, 107, 109, 108, 141, 142, 138, 120, 121, 122,
+ 129, 126, 128, 123, 124, 143, 144, 130, 131, 135,
+ 125, 127, 117, 118, 119, 132, 133, 134, 136, 137,
+ 139, 140, 145, 520, 313, 110, 111, 519, 0, 0,
+ 0, 48, 0, 0, 0, 463, 0, 268, 0, 0,
+ 0, 0, 334, 333, 0, 0, 463, 268, 175, 168,
+ 178, 163, 146, 147, 107, 108, 0, 112, 114, 20,
+ 113, 549, 551, 540, 0, 553, 550, 541, 0, 0,
+ 0, 0, 243, 230, 253, 64, 247, 555, 555, 524,
+ 65, 63, 542, 62, 0, 555, 390, 61, 542, 0,
+ 543, 18, 0, 0, 207, 0, 208, 279, 0, 0,
+ 0, 540, 15, 542, 68, 14, 0, 542, 0, 546,
+ 546, 231, 0, 0, 546, 522, 0, 0, 76, 0,
+ 86, 93, 492, 447, 446, 448, 449, 0, 445, 444,
+ 426, 420, 419, 422, 0, 0, 417, 440, 0, 451,
+ 0, 415, 0, 424, 0, 455, 456, 46, 222, 223,
+ 4, 541, 0, 0, 0, 0, 0, 0, 0, 378,
+ 380, 0, 82, 0, 74, 71, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 555, 0, 539, 538, 0, 395,
+ 393, 290, 0, 0, 384, 55, 288, 308, 102, 103,
+ 104, 455, 456, 0, 473, 306, 472, 0, 555, 0,
+ 0, 0, 314, 316, 0, 555, 279, 325, 0, 324,
+ 0, 0, 555, 0, 0, 0, 0, 0, 0, 279,
+ 0, 555, 0, 303, 0, 115, 429, 0, 0, 0,
+ 554, 527, 254, 250, 0, 0, 244, 252, 0, 245,
+ 542, 0, 284, 249, 542, 239, 555, 555, 238, 542,
+ 287, 45, 0, 0, 0, 0, 0, 0, 17, 542,
+ 277, 13, 541, 67, 273, 276, 280, 548, 232, 547,
+ 548, 234, 281, 523, 92, 84, 0, 79, 0, 0,
+ 555, 0, 498, 495, 494, 493, 496, 0, 511, 515,
+ 514, 510, 492, 0, 375, 497, 499, 501, 555, 0,
+ 508, 555, 513, 555, 0, 491, 450, 0, 0, 433,
+ 438, 437, 423, 431, 0, 435, 427, 418, 441, 452,
+ 416, 425, 0, 0, 7, 21, 22, 23, 24, 25,
+ 43, 44, 555, 0, 28, 37, 0, 38, 542, 0,
+ 72, 83, 41, 40, 0, 186, 253, 36, 204, 212,
+ 217, 218, 219, 214, 216, 226, 227, 220, 221, 197,
+ 198, 224, 225, 542, 213, 215, 209, 210, 211, 199,
+ 200, 201, 202, 203, 531, 536, 532, 537, 389, 248,
+ 387, 542, 531, 533, 532, 534, 388, 248, 531, 532,
+ 248, 555, 555, 29, 188, 35, 196, 53, 56, 0,
+ 475, 0, 0, 102, 103, 106, 0, 542, 555, 0,
+ 542, 492, 0, 271, 555, 555, 401, 555, 326, 186,
+ 535, 532, 542, 531, 532, 555, 328, 296, 327, 299,
+ 535, 278, 542, 531, 532, 0, 0, 552, 430, 0,
+ 0, 302, 526, 0, 255, 251, 0, 555, 525, 283,
+ 544, 235, 240, 242, 286, 19, 0, 26, 195, 69,
+ 16, 542, 546, 85, 77, 89, 91, 542, 531, 532,
+ 503, 498, 0, 346, 337, 339, 542, 335, 542, 0,
+ 0, 292, 0, 484, 518, 504, 0, 487, 512, 0,
+ 489, 516, 443, 0, 0, 432, 434, 436, 205, 206,
+ 366, 542, 0, 364, 363, 261, 0, 81, 75, 0,
+ 0, 0, 0, 0, 0, 386, 59, 0, 392, 0,
+ 0, 237, 385, 57, 236, 381, 52, 0, 0, 0,
+ 555, 309, 0, 0, 392, 312, 521, 492, 0, 0,
+ 317, 402, 403, 555, 404, 0, 555, 331, 0, 0,
+ 329, 0, 0, 392, 0, 0, 0, 0, 0, 392,
+ 0, 116, 301, 0, 0, 256, 0, 257, 246, 555,
+ 11, 274, 233, 87, 542, 0, 344, 0, 500, 0,
+ 368, 0, 0, 502, 555, 555, 517, 555, 509, 555,
+ 555, 421, 0, 542, 0, 555, 0, 506, 555, 555,
+ 362, 0, 0, 259, 73, 187, 0, 34, 193, 33,
+ 194, 60, 545, 0, 31, 191, 32, 192, 58, 382,
+ 383, 0, 0, 189, 0, 0, 474, 307, 542, 0,
+ 477, 492, 0, 0, 406, 332, 0, 12, 408, 0,
+ 293, 0, 294, 0, 0, 304, 255, 555, 258, 241,
+ 336, 347, 0, 342, 338, 374, 0, 377, 376, 0,
+ 480, 0, 482, 0, 488, 0, 485, 490, 439, 0,
+ 365, 353, 355, 0, 505, 0, 358, 0, 360, 379,
+ 260, 228, 30, 190, 396, 394, 0, 0, 476, 315,
+ 0, 0, 405, 0, 94, 101, 0, 407, 0, 297,
+ 300, 0, 398, 399, 397, 0, 345, 0, 340, 372,
+ 542, 370, 373, 555, 555, 555, 555, 367, 555, 555,
+ 279, 0, 555, 507, 555, 555, 54, 310, 0, 100,
+ 0, 555, 0, 555, 555, 0, 343, 0, 0, 369,
+ 481, 0, 478, 483, 486, 0, 350, 0, 352, 535,
+ 278, 359, 0, 356, 361, 318, 535, 99, 542, 531,
+ 532, 400, 330, 305, 341, 371, 555, 555, 555, 555,
+ 555, 392, 479, 351, 0, 348, 354, 357, 555, 349
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yytype_int16 yydefgoto[] =
+{
+ -1, 1, 2, 64, 65, 66, 262, 394, 395, 271,
+ 272, 442, 68, 69, 202, 70, 71, 588, 720, 72,
+ 73, 273, 74, 75, 76, 467, 77, 203, 113, 114,
+ 227, 228, 229, 626, 195, 196, 79, 244, 278, 568,
+ 712, 434, 435, 253, 254, 246, 426, 436, 527, 80,
+ 199, 276, 651, 277, 292, 209, 747, 210, 748, 625,
+ 891, 592, 589, 815, 390, 392, 601, 602, 821, 265,
+ 398, 617, 739, 740, 215, 664, 665, 666, 783, 692,
+ 693, 769, 900, 901, 483, 671, 330, 522, 82, 83,
+ 376, 582, 581, 419, 894, 605, 733, 823, 827, 84,
+ 85, 305, 306, 498, 86, 87, 88, 627, 636, 503,
+ 504, 505, 684, 89, 90, 91, 299, 92, 93, 205,
+ 206, 96, 207, 385, 591, 728, 729, 485, 486, 487,
+ 488, 489, 490, 787, 788, 491, 492, 493, 494, 776,
+ 673, 198, 391, 283, 437, 249, 119, 596, 570, 368,
+ 234, 431, 432, 708, 458, 399, 260, 416, 237, 275
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+#define YYPACT_NINF -763
+static const yytype_int16 yypact[] =
+{
+ -763, 120, 2670, -763, 7298, 9106, 9433, 5605, -763, 8767,
+ 8767, -763, -763, 9215, 6691, 5113, 7976, 7976, -763, -763,
+ 7976, 3331, 2908, -763, -763, -763, -763, 26, 6691, -763,
+ 9, -763, -763, 5736, 3049, -763, -763, 5865, -763, -763,
+ -763, -763, -763, -763, -763, 8880, 8880, 90, 4462, -22,
+ 8089, 8315, 6967, -763, 6399, 584, 717, 907, 943, 659,
+ -763, 272, 8993, 8880, -763, 197, -763, 1023, -763, 519,
+ -763, -763, 119, 45, -763, 11, 9324, -763, 115, 3169,
+ 173, 228, 28, 81, -763, -763, -763, -763, -763, -763,
+ -763, -763, -763, -763, 398, 87, -763, 439, 44, -763,
+ -763, -763, -763, -763, 21, 85, 100, 350, 394, 8767,
+ 278, 4597, 540, -763, 58, -763, 271, -763, -763, 44,
+ -763, -763, -763, -763, -763, -763, -763, -763, -763, -763,
+ -763, -763, -763, -763, -763, -763, -763, -763, -763, -763,
+ -763, -763, -763, -763, -763, -763, -763, -763, 38, 49,
+ 54, 61, -763, -763, -763, -763, -763, -763, 97, 198,
+ -763, 218, -763, 232, -763, -763, -763, -763, -763, -763,
+ -763, -763, -763, -763, -763, -763, -763, -763, -763, -763,
+ -763, -763, -763, -763, -763, -763, -763, -763, -763, -763,
+ -763, -763, -763, -763, -763, -763, -763, -763, 28, 3668,
+ 99, 519, 74, 138, 320, 24, 203, 40, 74, 8767,
+ 8767, 262, -763, -763, 331, 317, 52, 68, -763, -763,
+ -763, -763, -763, -763, -763, -763, 6545, -763, -763, 225,
+ -763, -763, -763, 197, 325, -763, -763, 229, 8880, 8880,
+ 8880, 8880, -763, 3169, 292, -763, -763, 243, 250, -763,
+ -763, -763, 5000, -763, 7976, 7976, -763, -763, 5228, 8767,
+ -763, -763, 256, 4732, -763, 361, 330, 445, 7524, 4462,
+ 280, 197, 1023, 268, 326, -763, 8767, 268, 304, 174,
+ 179, -763, 292, 319, 179, -763, 415, 9542, 334, 363,
+ 366, 379, 748, -763, -763, -763, -763, 971, -763, -763,
+ -763, -763, -763, -763, 370, 625, -763, -763, 975, -763,
+ 982, -763, 1039, -763, 733, 419, 421, -763, -763, -763,
+ -763, 5341, 8767, 8767, 8767, 8767, 7524, 8767, 8767, -763,
+ -763, 8428, -763, 4462, 7076, 338, 8428, 8880, 8880, 8880,
+ 8880, 8880, 8880, 8880, 8880, 8880, 8880, 8880, 8880, 8880,
+ 8880, 8880, 8880, 8880, 8880, 8880, 8880, 8880, 8880, 8880,
+ 8880, 8880, 8880, 2210, 7976, 9821, -763, -763, 10793, -763,
+ -763, -763, 8993, 8993, -763, 400, -763, 519, -763, 387,
+ -763, -763, -763, 197, -763, -763, -763, 9902, 7976, 9983,
+ 3668, 8767, -763, -763, 486, 490, 65, -763, 3807, 497,
+ 8880, 10064, 7976, 10145, 8880, 8880, 4079, 60, 60, 104,
+ 10226, 7976, 10307, -763, 452, -763, 370, 325, 8541, 503,
+ -763, -763, -763, -763, 8880, 7185, -763, -763, 8202, -763,
+ 268, 371, -763, -763, 268, -763, 376, 389, -763, 129,
+ -763, -763, 6691, 4194, 382, 10064, 10145, 8880, 1023, 268,
+ -763, -763, 5455, 391, 519, -763, -763, 7411, -763, -763,
+ 8315, -763, -763, -763, 387, 11, 9542, -763, 9542, 10388,
+ 7976, 10469, 425, -763, -763, -763, -763, 797, -763, -763,
+ -763, -763, 757, 80, -763, -763, -763, -763, 397, 8880,
+ -763, 401, 514, 429, 518, -763, -763, 525, 4732, -763,
+ -763, -763, 370, -763, 480, -763, -763, -763, -763, -763,
+ -763, -763, 8880, 8880, -763, -763, -763, -763, -763, -763,
+ -763, -763, 29, 8880, -763, 434, 448, -763, 268, 9542,
+ 453, -763, -763, -763, 509, 2107, -763, -763, 330, 1778,
+ 1778, 1778, 1778, 1278, 1278, 6710, 1338, 1778, 1778, 9758,
+ 9758, 583, 583, 2455, 1278, 1278, 735, 735, 813, 64,
+ 64, 330, 330, 330, 3423, 6123, 3515, 6252, -763, 85,
+ -763, 268, 524, -763, 537, -763, -763, 3190, -763, -763,
+ 1238, 29, 29, -763, 2887, -763, 3169, -763, -763, 197,
+ -763, 8767, 3668, 496, 37, -763, 85, 268, 85, 632,
+ 129, 997, 6837, -763, 8654, 618, -763, 674, -763, 3028,
+ 5994, 2767, 268, 279, 294, 618, -763, -763, -763, -763,
+ 140, 147, 268, 132, 151, 8767, 6691, -763, 370, 643,
+ 67, -763, -763, 8880, 292, -763, 7637, 250, -763, -763,
+ -763, -763, 7185, 8202, -763, -763, 516, -763, 3169, -6,
+ 1023, 268, 179, 338, -763, 496, 37, 268, 238, 309,
+ -763, -763, 797, 556, -763, 517, 268, -763, 268, 4885,
+ 4732, -763, 757, -763, -763, -763, 757, -763, -763, 877,
+ -763, -763, -763, 534, 4732, -763, -763, -763, 330, 330,
+ -763, 837, 4885, -763, -763, 522, 7750, -763, -763, 9542,
+ 8993, 8880, 562, 8993, 8993, -763, 400, 531, 547, 8993,
+ 8993, -763, -763, 400, -763, 81, 119, 4885, 4732, 8880,
+ 29, -763, 197, 673, -763, -763, -763, 757, 3668, 197,
+ -763, 434, -763, 609, -763, 4347, 688, -763, 8767, 702,
+ -763, 8880, 8880, 353, 8880, 8880, 704, 4885, 4885, 155,
+ 60, -763, -763, 7863, 3943, -763, 8880, -763, -763, 574,
+ -763, -763, -763, 315, 268, 896, 575, 1139, -763, 576,
+ 573, 712, 586, -763, 585, 592, -763, 593, -763, 595,
+ 593, -763, 601, 268, 629, 599, 9651, -763, 605, 606,
+ -763, 739, 8880, 612, -763, 3169, 8880, -763, 3169, -763,
+ 3169, -763, -763, 8993, -763, 3169, -763, 3169, -763, -763,
+ -763, 741, 616, 3169, 4732, 3668, -763, -763, 268, 747,
+ -763, 997, 9760, 74, -763, -763, 4885, -763, -763, 74,
+ -763, 8880, -763, 749, 751, -763, -763, 93, -763, 8202,
+ -763, 620, 896, 621, -763, -763, 1073, -763, -763, 757,
+ -763, 877, -763, 877, -763, 877, -763, -763, -763, 655,
+ -763, 757, -763, 724, 414, 757, -763, 877, -763, -763,
+ 637, 3169, -763, 3169, -763, -763, 641, 773, -763, -763,
+ 3668, 737, -763, 422, 366, 379, 3668, -763, 3807, -763,
+ -763, 4885, -763, -763, -763, 896, 620, 896, 642, -763,
+ 213, -763, -763, 593, 653, 593, 593, -763, 658, 662,
+ -763, 10550, 593, -763, 667, 593, -763, -763, 775, 387,
+ 10631, 7976, 10712, 490, 674, 800, 620, 896, 1073, -763,
+ -763, 877, -763, -763, -763, 757, -763, 877, -763, 668,
+ 670, -763, 877, -763, -763, -763, 128, 37, 268, 84,
+ 103, -763, -763, -763, 620, -763, 593, 593, 669, 593,
+ 593, 118, -763, -763, 877, -763, -763, -763, 593, -763
+};
+
+/* YYPGOTO[NTERM-NUM]. */
+static const yytype_int16 yypgoto[] =
+{
+ -763, -763, -763, 380, -763, 42, -763, -363, -19, -763,
+ 35, -763, -293, 734, 13, -48, -763, -570, -763, -13,
+ 817, -170, 7, -55, -270, -414, -11, 1771, -59, 828,
+ -1, -20, -763, -763, -241, -763, 1317, 894, -763, -7,
+ 257, -338, 55, -3, -763, -395, -243, 101, -291, 5,
+ -763, -763, -763, -763, -763, -763, -763, -763, -763, -763,
+ -763, -763, -763, -763, -763, -763, -763, -763, -763, 295,
+ -199, -370, -86, -553, -763, -699, -689, 177, -763, -480,
+ -763, -594, -763, -87, -763, -763, 126, -763, -763, -763,
+ -82, -763, -763, -401, -763, -69, -763, -763, -763, -763,
+ -763, 656, 903, -763, -763, -763, -763, -763, -198, -364,
+ -763, 364, -763, -763, -763, 8, -763, -763, -763, 1109,
+ 1870, 850, 1678, -763, -763, 56, -280, -760, -397, -593,
+ 305, -644, -616, -762, 48, 193, -763, -587, -763, -279,
+ 388, -763, -763, -763, 15, -386, 816, -307, -763, 672,
+ 2, -25, -233, -534, -260, 19, 144, -763, 4, -2
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule which
+ number is the opposite. If zero, do what YYDEFACT says.
+ If YYTABLE_NINF, syntax error. */
+#define YYTABLE_NINF -556
+static const yytype_int16 yytable[] =
+{
+ 99, 371, 259, 242, 242, 429, 194, 242, 261, 406,
+ 115, 115, 484, 495, 317, 256, 629, 466, 115, 257,
+ 461, 335, 230, 208, 463, 440, 571, 599, 233, 270,
+ 635, 248, 248, 635, 235, 248, 230, 67, 619, 67,
+ 453, 288, 638, 532, 455, 537, 100, 786, 281, 285,
+ 597, 380, 736, 298, 654, 274, 569, 115, 577, 383,
+ 778, 580, 746, 724, 612, 280, 284, 320, 844, 321,
+ 369, 245, 250, 622, 638, 251, 841, -94, 743, 773,
+ 667, 115, 598, 397, 235, 775, 902, 616, 749, 779,
+ 397, 374, 270, -101, 569, 375, 577, 784, 256, 449,
+ -96, 717, 718, 913, 789, 598, 502, 369, 690, 669,
+ -67, 735, 374, 418, -462, 698, 366, 247, 247, -98,
+ 3, 247, 567, 763, 575, -278, -465, 575, -275, -100,
+ 405, -275, 657, 386, -95, 337, 801, -464, 685, 598,
+ -94, -81, -466, 808, -97, 267, 567, 329, 575, -467,
+ 691, 279, 263, 896, 396, 447, -101, -96, 332, 236,
+ 567, 331, 575, 528, 598, -97, 327, 328, 902, 567,
+ 252, 575, -99, 913, 367, 258, -98, 372, 384, 232,
+ -95, -100, -278, -278, -465, -469, -532, 370, 670, 859,
+ 360, 361, 362, 255, 429, -464, 844, 639, 466, -86,
+ -466, 641, 668, 495, 567, 575, 644, -467, 926, 236,
+ 231, 232, 231, 232, 753, -93, 649, 786, 628, 231,
+ 232, 786, 407, 408, 370, 298, 231, 232, 567, 723,
+ 575, 336, 465, 778, 255, 417, -96, -96, 954, 242,
+ 814, 242, 242, -469, 444, 427, 427, 635, 635, 258,
+ 270, -92, 235, 438, 400, -98, -98, 638, 236, 466,
+ 773, -323, 904, -88, 685, 667, 766, 248, 773, 248,
+ -95, -95, 685, 451, 909, 452, 274, -531, 914, -88,
+ -97, -97, 232, 524, 892, 794, -468, -89, 533, -531,
+ 235, 786, 115, 404, -91, 697, -532, 81, -90, 81,
+ 116, 116, -87, 448, 204, 204, -457, 430, 214, 433,
+ 204, 204, 204, 732, 270, 204, 363, 409, -323, -323,
+ -461, 457, 495, 530, 583, 585, 460, 232, 595, 378,
+ 315, 316, 232, 379, -90, 515, 516, 517, 518, 115,
+ 274, -392, 413, 81, -468, 418, 236, 289, 958, 231,
+ 232, 242, 236, 247, -88, 247, 67, 204, 576, 387,
+ 928, 519, 438, 514, -457, 819, 232, 726, 667, 744,
+ 667, 289, 415, 364, 365, 242, -528, 236, -461, 607,
+ 835, 420, 576, 424, 745, -88, 438, 615, -88, 242,
+ 425, -88, 762, 606, 758, -96, 576, 428, 242, 443,
+ 438, 337, 590, -392, 204, 576, 81, 532, 401, 438,
+ -98, 653, 790, 465, 961, 236, 388, 389, 761, 410,
+ -529, 232, 645, 459, 459, -90, 618, 618, 459, 466,
+ 450, 754, 526, 768, 427, 427, 893, 526, -457, 576,
+ 637, 99, -66, 831, 635, 667, 898, 818, 495, 445,
+ 230, 469, 877, 638, -463, 456, -90, 242, -392, -90,
+ -392, -392, -90, 462, 576, 402, 403, -268, 438, -95,
+ 464, 115, 652, 115, 465, -279, 411, 412, 67, 683,
+ 499, 468, -461, 500, 501, 531, 674, 650, -462, 674,
+ 512, 674, 513, -528, 81, -457, -457, 587, 667, -528,
+ 667, 603, 911, 604, 204, 204, 402, 446, 470, 471,
+ 920, -463, -463, 608, -94, 496, 758, 918, 631, 630,
+ 694, 640, -535, 642, -268, -268, 647, 236, 702, 373,
+ 667, 840, -279, -279, 115, 447, 643, -529, -81, -461,
+ -461, 660, 495, -529, 672, -86, 707, 204, 676, 204,
+ 204, 236, 236, 204, 204, -101, 327, 328, 81, 388,
+ 389, -100, 705, 81, 81, 678, 706, 921, 922, 681,
+ 711, 204, 707, 711, 713, 714, 679, 716, 714, 694,
+ 694, -253, 289, 948, -535, 878, -93, 707, 682, 705,
+ 686, 711, -92, 500, 501, 696, 714, 707, 381, 382,
+ 699, 730, 734, 737, 722, 737, 751, 661, 721, 473,
+ 474, 475, 476, 737, 709, 598, 81, 204, 204, 204,
+ 204, 81, 204, 204, 886, 700, 204, 710, 81, 289,
+ 888, 204, 707, 809, 230, 427, 735, 803, 750, -535,
+ -96, -535, -535, 770, 465, -531, 300, 725, 301, 302,
+ 771, 772, 533, -98, 337, 797, 799, 759, 752, 204,
+ 760, 804, 806, -95, 767, 782, 770, 204, 204, -254,
+ 567, -88, 661, 791, 473, 474, 475, 476, 781, 567,
+ 796, 575, 802, 204, -90, 81, 204, 506, 817, 301,
+ 302, 738, 735, 81, -87, 303, 304, 204, 811, 812,
+ 822, 81, 826, 765, 115, 526, 204, 358, 359, 360,
+ 361, 362, 308, 310, 312, 314, 825, 830, 694, 832,
+ 313, 839, 842, 301, 302, 846, 845, 847, 833, 834,
+ 848, 824, 849, 236, 828, 837, 303, 304, 81, 851,
+ 853, 816, 855, 201, 201, 858, 861, 81, 820, 201,
+ 860, 829, 865, 867, 869, 872, 874, 427, 770, -255,
+ 875, 289, 879, 289, 889, 204, 890, 895, 897, 618,
+ 303, 304, 674, 674, 236, 674, 907, 674, 674, 910,
+ 307, 301, 302, 674, -256, 916, 674, 674, 917, 927,
+ 945, 115, 919, 81, 511, 876, 459, 301, 302, 472,
+ 931, 473, 474, 475, 476, 935, 337, 887, 472, 937,
+ 473, 474, 475, 476, 942, 953, 964, -531, 98, -532,
+ 98, 350, 351, 646, 289, 98, 98, 115, 303, 304,
+ 212, 98, 98, 98, 120, 737, 98, 715, 952, 764,
+ 477, 955, 810, 377, 303, 304, 478, 479, 661, 477,
+ 473, 474, 475, 476, 951, 478, 479, 197, 357, 358,
+ 359, 360, 361, 362, 98, 774, 236, 923, 687, 924,
+ 393, 480, 925, 236, 481, 929, 0, 880, 98, 677,
+ 480, 680, 0, 481, 337, 0, 204, 81, 472, 662,
+ 473, 474, 475, 476, 236, 663, 0, 482, 0, 350,
+ 351, 674, 674, 674, 674, 0, 674, 674, 242, 908,
+ 674, 0, 674, 674, 0, 576, 0, 0, 0, 438,
+ 204, 606, 737, 707, 0, 98, 0, 98, 661, 477,
+ 473, 474, 475, 476, 0, 478, 479, 358, 359, 360,
+ 361, 362, 0, 201, 201, 282, 0, 661, 0, 473,
+ 474, 475, 476, 0, 674, 674, 674, 674, 674, 0,
+ 480, 0, 0, 481, 81, 81, 674, 236, 0, 477,
+ 309, 301, 302, 236, 0, 0, 479, 0, 0, 81,
+ 0, 777, 0, 0, 780, 0, 0, 81, 662, 0,
+ 232, 0, 439, 441, 289, 204, 785, 0, 204, 204,
+ 480, 0, 0, 0, 204, 204, 311, 301, 302, 0,
+ 454, 0, 81, 81, 0, 98, 0, 0, 303, 304,
+ 0, 0, 0, 81, 0, 98, 98, 0, 0, 0,
+ 81, 0, 0, 204, 496, 301, 302, 0, 508, 301,
+ 302, 0, 81, 81, 0, 509, 301, 302, 472, 81,
+ 473, 474, 475, 476, 303, 304, 201, 201, 201, 201,
+ 0, 520, 521, 322, 323, 324, 325, 326, 98, 0,
+ 98, 98, 0, 0, 98, 98, 0, 0, 0, 98,
+ 0, 864, 303, 304, 98, 98, 303, 304, 0, 477,
+ 0, 0, 98, 303, 304, 478, 479, 0, 204, 0,
+ 0, 0, 510, 301, 302, 0, 0, 0, 0, 81,
+ 81, 94, 0, 94, 117, 117, 117, 883, 0, 0,
+ 480, 81, 216, 481, 899, 600, 473, 474, 475, 476,
+ 0, 0, 421, 422, 423, 0, 0, 98, 98, 98,
+ 98, 98, 98, 98, 98, 0, 727, 98, 0, 98,
+ 303, 304, 98, 0, 903, 0, 905, 94, 0, 0,
+ 906, 290, 850, 852, 0, 854, 0, 856, 857, 0,
+ 912, 0, 915, 862, 0, 81, 866, 868, 0, 0,
+ 98, 81, 0, 81, 0, 290, 81, 0, 98, 98,
+ 661, 0, 473, 474, 475, 476, 0, 0, 0, 0,
+ 497, 0, 0, 0, 98, 0, 98, 98, 507, 0,
+ 0, 507, 0, 507, 98, 507, 204, 507, 98, 0,
+ 94, 0, 98, 0, 0, 525, 0, 98, 0, 0,
+ 536, 662, 0, 0, 0, 0, 956, 843, -555, 0,
+ 957, 0, 959, 0, 0, 0, 0, 960, 0, 0,
+ 0, -555, -555, -555, -555, -555, -555, 0, -555, 98,
+ 0, 0, 0, 0, -555, -555, 0, 0, 98, 968,
+ 0, 0, 0, 0, 0, -555, -555, 0, -555, -555,
+ -555, -555, -555, 0, 0, 0, 98, 0, 0, 0,
+ 0, 930, 932, 933, 934, 0, 936, 938, 0, 0,
+ 941, 0, 943, 944, 0, 0, 0, 0, 94, 0,
+ 0, 0, 536, 0, 98, 0, 0, 0, 632, 634,
+ 0, 0, 282, 0, 0, 201, -555, 0, 0, 0,
+ 0, 0, 0, 243, 243, 0, 0, 243, 0, 0,
+ 0, 0, 0, 0, 962, 963, 965, 966, 967, 337,
+ 0, 634, 0, 0, 282, 0, 969, 0, 0, 201,
+ 0, 0, 264, 266, 350, 351, 0, 243, 243, 0,
+ 0, 0, 94, 0, 0, 0, 0, 94, 94, 318,
+ 319, -555, -555, 675, -555, 0, 0, 255, -555, 0,
+ -555, -555, 0, 0, 0, 0, 290, 0, 0, 355,
+ 356, 357, 358, 359, 360, 361, 362, 98, 98, 337,
+ 338, 339, 340, 341, 342, 343, 344, 695, 346, 347,
+ 0, 0, 0, 0, 350, 351, 0, 0, 0, 0,
+ 94, 0, 0, 0, 0, 94, 0, 0, 0, 0,
+ 0, 98, 94, 290, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 353, 354, 355,
+ 356, 357, 358, 359, 360, 361, 362, 0, 0, 0,
+ 0, 0, 201, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 98, 98, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 731, 94,
+ 98, 0, 0, 0, 0, 0, 0, 94, 98, 0,
+ 0, 0, 0, 0, 0, 94, 98, 0, 0, 98,
+ 98, 0, 0, 0, 0, 98, 98, 755, 0, 0,
+ 757, 0, 0, 98, 98, 0, 634, 282, 0, 0,
+ 0, 0, 0, 0, 98, 0, 0, 0, 0, 0,
+ 0, 98, 94, 0, 98, 243, 243, 243, 318, 0,
+ 0, 94, 0, 98, 98, 0, 0, 0, 0, 243,
+ 98, 243, 243, 0, 0, 290, 0, 290, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 793, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 94, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 98,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 98, 98, 0, 0, 0, 0, 0, 0, 290, 0,
+ 0, 0, 98, 0, 0, 0, 0, 836, 243, 0,
+ 838, 0, 0, 535, 538, 539, 540, 541, 542, 543,
+ 544, 545, 546, 547, 548, 549, 550, 551, 552, 553,
+ 554, 555, 556, 557, 558, 559, 560, 561, 562, 563,
+ 97, 243, 97, 118, 118, 0, 870, 0, 0, 584,
+ 586, 217, 0, 0, 0, 0, 98, 0, 0, 0,
+ 0, 94, 98, 0, 98, 243, 0, 98, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 609, 0, 243,
+ 0, 584, 586, 0, 0, 0, 97, 0, 243, 0,
+ 291, 0, 0, 282, 0, 243, 0, 98, 0, 0,
+ 0, 243, 243, 0, 0, 243, 0, 0, 0, 0,
+ 0, 0, 0, 0, 291, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 648, 0, 0, 0, 0, 0,
+ 0, 0, 0, 78, 243, 78, 0, 243, 94, 94,
+ 0, 0, 0, 0, 213, 0, 0, 243, 0, 97,
+ 0, 0, 0, 94, 0, 0, 0, 0, 0, 0,
+ 0, 94, 0, 0, 0, 0, 243, 0, 290, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 78,
+ 0, 0, 0, 0, 0, 0, 94, 94, 0, 688,
+ 689, 0, 0, 0, 0, 0, 0, 94, 0, 0,
+ 243, 0, 0, 0, 94, 0, 0, 0, 0, 337,
+ -556, -556, -556, -556, 342, 343, 94, 94, -556, -556,
+ 0, 0, 0, 94, 350, 351, 0, 0, 0, 0,
+ 0, 0, 95, 0, 95, 0, 0, 97, 0, 0,
+ 0, 0, 78, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 117, 0, 353, 354, 355,
+ 356, 357, 358, 359, 360, 361, 362, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 95, 0,
+ 0, 243, 0, 94, 94, 0, 0, 0, 0, 0,
+ 0, 884, 0, 0, 0, 94, 0, 0, 0, 0,
+ 0, 97, 0, 0, 0, 0, 97, 97, 0, 0,
+ 243, 0, 0, 243, 0, 0, 0, 0, 0, 243,
+ 243, 0, 0, 0, 0, 291, 0, 0, 0, 0,
+ 78, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 95, 0, 0, 0, 0, 0, 0, 0, 94,
+ 0, 0, 0, 0, 0, 94, 0, 94, 0, 97,
+ 94, 0, 0, 0, 97, 0, 0, 0, 0, 0,
+ 0, 97, 291, 243, 0, 0, 0, 609, 795, 0,
+ 798, 800, 0, 0, 0, 0, 805, 807, 0, 0,
+ 0, 0, 0, 0, 78, 0, 813, 0, 0, 78,
+ 78, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 798, 800,
+ 0, 805, 807, 0, 0, 0, 0, 0, 97, 95,
+ 243, 0, 0, 243, 0, 0, 97, 0, 0, 0,
+ 0, 0, 0, 0, 97, 0, 0, 0, 0, 0,
+ 0, 0, 78, 0, 0, 0, 0, 78, 0, 0,
+ 0, 0, 0, 0, 78, 0, 0, 534, 0, 243,
+ 0, 0, 0, 871, 0, 0, 0, 0, 0, 0,
+ 873, 97, 0, 0, 0, 0, 0, 0, 0, 0,
+ 97, 0, 0, 95, 0, 0, 0, 0, 95, 95,
+ 0, 0, 0, 0, 291, 0, 291, 0, 873, 0,
+ 0, 701, 0, 0, 0, 0, 243, 0, 0, 0,
+ 0, 78, 0, 0, 0, 0, 0, 0, 0, 78,
+ 0, 0, 0, 0, 0, 0, 97, 78, 337, 338,
+ 339, 340, 341, 342, 343, 344, 345, 346, 347, 348,
+ 349, 95, 0, 350, 351, 0, 95, 0, 0, 0,
+ 0, 0, 0, 95, 0, 0, 0, 291, 0, 0,
+ 0, 0, 0, 0, 78, 0, 0, 0, 0, 0,
+ 0, 0, 0, 78, 352, 0, 353, 354, 355, 356,
+ 357, 358, 359, 360, 361, 362, 0, 0, 243, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -230, 0, 0, 0, 0, 0,
+ 95, 564, 565, 0, 0, 566, 0, 0, 95, 78,
+ 97, 0, 0, 0, 0, 0, 95, 0, 0, 164,
+ 165, 166, 167, 168, 169, 170, 171, 172, 0, 0,
+ 173, 174, 0, 0, 175, 176, 177, 178, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 179, 0,
+ 0, 0, 0, 95, 0, 0, 0, 0, 0, 0,
+ 0, 0, 95, 0, 0, 0, 0, 0, 0, 180,
+ 181, 182, 183, 184, 185, 186, 187, 188, 189, 0,
+ 190, 191, 0, 0, 0, 0, 0, 97, 97, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 192, 255,
+ 0, 0, 97, 78, 0, 0, 0, 0, 95, 0,
+ 97, 0, 0, 0, 0, 0, 0, 291, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 97, 97, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 97, 0, 0, 0,
+ 0, 0, 0, 97, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 97, 97, 0, 0, 0,
+ 0, 0, 97, 0, 0, 0, 0, 0, 0, 0,
+ 78, 78, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 78, 0, 0, 0, 0,
+ 0, 0, 95, 78, 118, 0, 0, 0, 0, 0,
+ 0, 534, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 78, 78,
+ 0, 0, 97, 97, 0, 0, 0, 0, 0, 78,
+ 885, 0, 0, 0, 97, 0, 78, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 78, 78,
+ 0, 0, 0, 0, 0, 78, 337, 338, 339, 340,
+ 341, 342, 343, 344, 345, 346, 347, 348, 349, 95,
+ 95, 350, 351, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 95, 0, 0, 0, 97, 0,
+ 0, 0, 95, 0, 97, 0, 97, 0, 0, 97,
+ 0, 0, 352, 0, 353, 354, 355, 356, 357, 358,
+ 359, 360, 361, 362, 0, 78, 78, 95, 95, 0,
+ 0, 0, 0, 882, 0, 0, 0, 78, 95, 0,
+ 0, 0, 0, 0, 0, 95, 0, 0, 232, 0,
+ 0, 0, 0, 0, 0, 0, 0, 95, 95, 0,
+ 0, 0, 0, 0, 95, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 78, 0, 0, 0, 0, 0, 78, 0, 78,
+ 0, 0, 78, 0, 0, 0, 0, 0, 0, 0,
+ -555, 4, 0, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 0, 95, 95, 0, 0, 0, 15,
+ 0, 16, 17, 18, 19, 0, 95, 0, 0, 0,
+ 20, 21, 22, 23, 24, 25, 26, 0, 0, 27,
+ 0, 0, 0, 0, 0, 28, 29, 30, 31, 32,
+ 0, 33, 34, 35, 36, 37, 38, 0, 39, 40,
+ 41, 0, 0, 42, 0, 0, 43, 44, 0, 45,
+ 46, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 95, 0, 0, 0, 0, 0, 95, 0, 95, 47,
+ 0, 95, 48, 49, 0, 50, 51, -278, 52, 0,
+ 53, 54, 55, 56, 57, 58, 59, 0, 0, 60,
+ -278, -278, -278, -278, -278, -278, 0, -278, 0, 0,
+ 0, 0, 0, 0, -278, -278, -278, 0, 0, 61,
+ 62, 63, 0, 0, -278, -278, 0, -278, -278, -278,
+ -278, -278, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -555, -555, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, -278, -278,
+ -278, -278, -278, -278, -278, -278, -278, -278, -278, -278,
+ -278, 0, 0, -278, -278, -278, 0, 742, -278, 0,
+ 0, 0, 0, 0, -278, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, -278, 0, 0, 0, 0,
+ 0, 0, 0, -99, -278, -278, -278, -278, -278, -278,
+ -278, -278, -278, -278, -278, -278, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, -391, 0,
+ 0, -278, -278, -278, -278, 0, 0, -278, -278, -278,
+ -278, -391, -391, -391, -391, -391, -391, 0, -391, 0,
+ 0, 719, 0, 0, -391, -391, -391, 0, 0, 0,
+ 0, 0, 0, 0, 0, -391, -391, 0, -391, -391,
+ -391, -391, -391, 0, 0, 0, 0, 0, 337, 338,
+ 339, 340, 341, 342, 343, 344, 345, 346, 347, 348,
+ 349, 0, 0, 350, 351, 0, 0, 0, 0, -391,
+ -391, -391, -391, -391, -391, -391, -391, -391, -391, -391,
+ -391, -391, 0, 0, -391, -391, -391, 0, 0, -391,
+ 0, 0, 0, 0, 352, -391, 353, 354, 355, 356,
+ 357, 358, 359, 360, 361, 362, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, -391, 0, -391, -391, -391,
+ -391, -391, -391, -391, -391, -391, -391, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, -269,
+ 0, -391, -391, -391, -391, -391, 0, 255, -391, -391,
+ -391, -391, -269, -269, -269, -269, -269, -269, 0, -269,
+ 0, 0, 701, 0, 0, 0, -269, -269, -269, 0,
+ 0, 0, 0, 0, 0, 0, -269, -269, 0, -269,
+ -269, -269, -269, -269, 0, 0, 0, 0, 0, 337,
+ 338, 339, 340, 341, 342, 343, 344, 345, 346, 347,
+ 348, 349, 0, 0, 350, 351, 0, 0, 0, 0,
+ -269, -269, -269, -269, -269, -269, -269, -269, -269, -269,
+ -269, -269, -269, 0, 0, -269, -269, -269, 0, 0,
+ -269, 0, 0, 0, 0, 352, -269, 353, 354, 355,
+ 356, 357, 358, 359, 360, 361, 362, -269, 0, 0,
+ 0, 0, 0, 0, 0, 0, -269, -269, -269, -269,
+ -269, -269, -269, -269, -269, -269, -269, -269, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ -555, 0, 0, -269, -269, -269, -269, 0, 0, -269,
+ -269, -269, -269, -555, -555, -555, -555, -555, -555, 0,
+ -555, 0, 0, 0, 0, 0, -555, -555, -555, 0,
+ 0, 0, 0, 0, 0, 0, 0, -555, -555, 0,
+ -555, -555, -555, -555, -555, 0, 0, 0, 0, 0,
+ 337, 338, 339, 340, 341, 342, 343, 344, 345, 346,
+ 347, 348, 349, 0, 0, 350, 351, 0, 0, 0,
+ 0, -555, -555, -555, -555, -555, -555, -555, -555, -555,
+ -555, -555, -555, -555, 0, 0, -555, -555, -555, 0,
+ 0, -555, 0, 0, 0, 0, 352, -555, 353, 354,
+ 355, 356, 357, 358, 359, 360, 361, 362, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, -555, 0, -555,
+ -555, -555, -555, -555, -555, -555, -555, -555, -555, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -285, 0, -555, -555, -555, -555, -555, 0, 255,
+ -555, -555, -555, -555, -285, -285, -285, -285, -285, -285,
+ 0, -285, 0, 0, 0, 0, 0, 0, -285, -285,
+ 0, 0, 0, 0, 0, 0, 0, 0, -285, -285,
+ 0, -285, -285, -285, -285, -285, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -285, -285, -285, -285, -285, -285, -285, -285,
+ -285, -285, -285, -285, -285, 0, 0, -285, -285, -285,
+ 0, 0, -285, -535, 0, 0, 0, 0, -285, 0,
+ 0, 0, 0, 0, 0, 0, -535, -535, -535, 0,
+ -535, -535, 0, -535, 0, 0, 0, 0, -285, -535,
+ -285, -285, -285, -285, -285, -285, -285, -285, -285, -285,
+ -535, -535, 0, -535, -535, -535, -535, -535, 0, 0,
+ 0, 0, 0, 0, 0, -285, -285, -285, -285, 0,
+ 252, -285, -285, -285, -285, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -535, -535, -535, -535, -535, -535,
+ -535, -535, -535, -535, -535, -535, -535, 0, 0, -535,
+ -535, -535, 0, 703, 0, -278, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, -278, -278,
+ -278, 0, -278, -278, 0, -278, 0, 0, 0, -97,
+ -535, 0, -535, -535, -535, -535, -535, -535, -535, -535,
+ -535, -535, -278, -278, 0, -278, -278, -278, -278, -278,
+ 0, 0, 0, 0, 0, 0, -535, -535, -535, -535,
+ -89, 0, 0, -535, 0, -535, -535, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -278, -278, -278, -278,
+ -278, -278, -278, -278, -278, -278, -278, -278, -278, 0,
+ 0, -278, -278, -278, 0, 704, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -99, -278, 0, -278, -278, -278, -278, -278, -278,
+ -278, -278, -278, -278, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, -278,
+ -278, -278, -91, 0, 0, -278, 0, -278, -278, 268,
+ 0, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 14, -555, -555, -555, 0, 0, -555, 15, 0, 16,
+ 17, 18, 19, 0, 0, 0, 0, 0, 20, 21,
+ 22, 23, 24, 25, 26, 0, 0, 27, 0, 0,
+ 0, 0, 0, 28, 0, 30, 31, 32, 0, 33,
+ 34, 35, 36, 37, 38, 0, 39, 40, 41, 0,
+ 0, 42, 0, 0, 43, 44, 0, 45, 46, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 47, 0, 0,
+ 48, 49, 0, 50, 51, 0, 52, 0, 53, 54,
+ 55, 56, 57, 58, 59, 0, 0, 60, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 61, 62, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 268, 0,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ -555, -555, -555, 0, -555, -555, 15, 0, 16, 17,
+ 18, 19, 0, 0, 0, 0, 0, 20, 21, 22,
+ 23, 24, 25, 26, 0, 0, 27, 0, 0, 0,
+ 0, 0, 28, 0, 30, 31, 32, 0, 33, 34,
+ 35, 36, 37, 38, 0, 39, 40, 41, 0, 0,
+ 42, 0, 0, 43, 44, 0, 45, 46, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 47, 0, 0, 48,
+ 49, 0, 50, 51, 0, 52, 0, 53, 54, 55,
+ 56, 57, 58, 59, 0, 0, 60, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 61, 62, 63, 0,
+ 0, 0, 0, 0, 268, 0, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 0, 0, -555, -555,
+ -555, -555, 15, -555, 16, 17, 18, 19, 0, 0,
+ 0, 0, 0, 20, 21, 22, 23, 24, 25, 26,
+ 0, 0, 27, 0, 0, 0, 0, 0, 28, 0,
+ 30, 31, 32, 0, 33, 34, 35, 36, 37, 38,
+ 0, 39, 40, 41, 0, 0, 42, 0, 0, 43,
+ 44, 0, 45, 46, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 47, 0, 0, 48, 49, 0, 50, 51,
+ 0, 52, 0, 53, 54, 55, 56, 57, 58, 59,
+ 0, 0, 60, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 61, 62, 63, 0, 0, 0, 0, 0,
+ 268, 0, 5, 6, 7, 8, 9, 10, 11, 12,
+ 13, 14, 0, 0, -555, -555, -555, -555, 15, 0,
+ 16, 17, 18, 19, 0, 0, 0, 0, 0, 20,
+ 21, 22, 23, 24, 25, 26, 0, 0, 27, 0,
+ 0, 0, 0, 0, 28, 0, 30, 31, 32, 0,
+ 33, 34, 35, 36, 37, 38, 0, 39, 40, 41,
+ 0, 0, 42, 0, 0, 43, 44, 0, 45, 46,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 47, 0,
+ 0, 48, 49, 0, 50, 51, 0, 52, 0, 53,
+ 54, 55, 56, 57, 58, 59, 0, 0, 60, 0,
+ 0, 0, 0, 0, 0, 4, 0, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 0, 61, 62,
+ 63, 0, 0, 15, 0, 16, 17, 18, 19, 0,
+ 0, 0, 0, 0, 20, 21, 22, 23, 24, 25,
+ 26, -555, -555, 27, 0, 0, 0, 0, 0, 28,
+ 29, 30, 31, 32, 0, 33, 34, 35, 36, 37,
+ 38, 0, 39, 40, 41, 0, 0, 42, 0, 0,
+ 43, 44, 0, 45, 46, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 47, 0, 0, 48, 49, 0, 50,
+ 51, 0, 52, 0, 53, 54, 55, 56, 57, 58,
+ 59, 0, 0, 60, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 61, 62, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, -555, 0,
+ 0, 0, 0, 0, 0, 0, -555, -555, 268, 0,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 0, -555, -555, 0, 0, 0, 15, 0, 16, 17,
+ 18, 19, 0, 0, 0, 0, 0, 20, 21, 22,
+ 23, 24, 25, 26, 0, 0, 27, 0, 0, 0,
+ 0, 0, 28, 0, 30, 31, 32, 0, 33, 34,
+ 35, 36, 37, 38, 0, 39, 40, 41, 0, 0,
+ 42, 0, 0, 43, 44, 0, 45, 46, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 47, 0, 0, 48,
+ 49, 0, 50, 51, 0, 52, 0, 53, 54, 55,
+ 56, 57, 58, 59, 0, 0, 60, 0, 0, 0,
+ 0, 0, 0, 268, 0, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 14, 0, 61, 62, 63, 0,
+ 0, 15, 0, 16, 17, 18, 19, 0, 0, 0,
+ 0, 0, 20, 21, 22, 23, 24, 25, 26, -555,
+ -555, 27, 0, 0, 0, 0, 0, 28, 0, 30,
+ 31, 32, 0, 33, 34, 35, 36, 37, 38, 0,
+ 39, 40, 41, 0, 0, 42, 0, 0, 43, 44,
+ 0, 45, 46, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 47, 0, 0, 269, 49, 0, 50, 51, 0,
+ 52, 0, 53, 54, 55, 56, 57, 58, 59, 0,
+ 0, 60, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 61, 62, 63, 0, 0, 0, 0, 268, 0,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 0, 0, -555, 0, -555, -555, 15, 0, 16, 17,
+ 18, 19, 0, 0, 0, 0, 0, 20, 21, 22,
+ 23, 24, 25, 26, 0, 0, 27, 0, 0, 0,
+ 0, 0, 28, 0, 30, 31, 32, 0, 33, 34,
+ 35, 36, 37, 38, 0, 39, 40, 41, 0, 0,
+ 42, 0, 0, 43, 44, 0, 45, 46, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 47, 0, 0, 48,
+ 49, 0, 50, 51, 0, 52, 0, 53, 54, 55,
+ 56, 57, 58, 59, 0, 0, 60, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 61, 62, 63, 0,
+ 0, 0, 0, 268, 0, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 14, 0, 0, -555, 0, -555,
+ -555, 15, 0, 16, 17, 18, 19, 0, 0, 0,
+ 0, 0, 20, 21, 22, 23, 24, 25, 26, 0,
+ 0, 27, 0, 0, 0, 0, 0, 28, 0, 30,
+ 31, 32, 0, 33, 34, 35, 36, 37, 38, 0,
+ 39, 40, 41, 0, 0, 42, 0, 0, 43, 44,
+ 0, 45, 46, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 47, 0, 0, 48, 49, 0, 50, 51, 0,
+ 52, 0, 53, 54, 55, 56, 57, 58, 59, 0,
+ 0, 60, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 61, 62, 63, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -555, 0, 0, 0,
+ 0, 0, 0, 0, -555, -555, 268, 0, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 0, 0,
+ -555, 0, 0, 0, 15, 0, 16, 17, 18, 19,
+ 0, 0, 0, 0, 0, 20, 21, 22, 23, 24,
+ 25, 26, 0, 0, 27, 0, 0, 0, 0, 0,
+ 28, 0, 30, 31, 32, 0, 33, 34, 35, 36,
+ 37, 38, 0, 39, 40, 41, 0, 0, 42, 0,
+ 0, 43, 44, 0, 45, 46, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 47, 0, 0, 48, 49, 0,
+ 50, 51, 0, 52, 0, 53, 54, 55, 56, 57,
+ 58, 59, 0, 0, 60, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 0, 0, 61, 62, 63, 0, 0, 15,
+ 0, 16, 17, 18, 19, 0, 0, 0, 0, 0,
+ 20, 21, 22, 23, 24, 25, 26, -555, -555, 106,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 32,
+ 0, 33, 34, 35, 36, 37, 38, 238, 39, 40,
+ 41, 0, 0, 42, 0, 0, 43, 44, 0, 45,
+ 46, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 200,
+ 0, 0, 111, 49, 0, 50, 51, 0, 239, 240,
+ 53, 54, 55, 56, 57, 58, 59, 0, 0, 60,
+ 0, 0, 0, 0, 0, 0, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 0, 0, 0, 0, 61,
+ 241, 63, 15, 0, 16, 17, 18, 19, 0, 0,
+ 0, 0, 0, 20, 21, 22, 23, 24, 25, 26,
+ 0, 0, 27, 232, 0, 0, 0, 0, 0, 0,
+ 0, 31, 32, 0, 33, 34, 35, 36, 37, 38,
+ 0, 39, 40, 41, 0, 0, 42, 0, 0, 43,
+ 44, 0, 45, 46, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 200, 0, 0, 111, 49, 0, 50, 51,
+ 0, 0, 0, 53, 54, 55, 56, 57, 58, 59,
+ 0, 0, 60, 0, 0, 0, 0, 0, 0, 0,
+ 0, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 0, 0, 61, 62, 63, 0, 0, 15, 0, 16,
+ 17, 18, 19, 0, 0, 0, 0, 0, 20, 21,
+ 22, 23, 24, 25, 26, 231, 232, 27, 0, 0,
+ 0, 0, 0, 0, 0, 0, 31, 32, 0, 33,
+ 34, 35, 36, 37, 38, 0, 39, 40, 41, 0,
+ 0, 42, 0, 0, 43, 44, 0, 45, 46, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 200, 0, 0,
+ 111, 49, 0, 50, 51, 0, 0, 0, 53, 54,
+ 55, 56, 57, 58, 59, 0, 0, 60, 0, 0,
+ 0, 0, 0, 0, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 0, 0, 0, 61, 62, 63,
+ 15, 0, 16, 17, 18, 19, 0, 0, 0, 0,
+ 0, 20, 21, 22, 23, 24, 25, 26, 0, 0,
+ 27, 232, 0, 0, 0, 0, 28, 29, 30, 31,
+ 32, 0, 33, 34, 35, 36, 37, 38, 0, 39,
+ 40, 41, 0, 0, 42, 0, 0, 43, 44, 0,
+ 45, 46, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 47, 0, 0, 48, 49, 0, 50, 51, 0, 52,
+ 0, 53, 54, 55, 56, 57, 58, 59, 0, 0,
+ 60, 0, 0, 0, 0, 0, 0, 0, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 0, 0,
+ 61, 62, 63, 0, 15, 0, 16, 17, 18, 19,
+ 0, 0, 0, 0, 0, 20, 21, 22, 23, 24,
+ 25, 26, 0, 420, 27, 0, 0, 0, 0, 0,
+ 28, 0, 30, 31, 32, 0, 33, 34, 35, 36,
+ 37, 38, 0, 39, 40, 41, 0, 0, 42, 0,
+ 0, 43, 44, 0, 45, 46, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 47, 0, 0, 48, 49, 0,
+ 50, 51, 0, 52, 0, 53, 54, 55, 56, 57,
+ 58, 59, 0, 0, 60, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 61, 62, 63, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 420, 121, 122,
+ 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
+ 133, 134, 135, 136, 137, 138, 139, 140, 141, 142,
+ 143, 144, 0, 0, 0, 145, 146, 147, 148, 149,
+ 150, 151, 152, 153, 154, 0, 0, 0, 0, 0,
+ 155, 156, 157, 158, 159, 160, 161, 162, 35, 36,
+ 163, 38, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 164, 165, 166, 167, 168, 169,
+ 170, 171, 172, 0, 0, 173, 174, 0, 0, 175,
+ 176, 177, 178, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 179, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 180, 181, 182, 183, 184, 185,
+ 186, 187, 188, 189, 0, 190, 191, 0, 0, -528,
+ -528, -528, -528, -528, -528, -528, -528, -528, 0, 0,
+ 0, 0, 0, 192, 193, -528, 0, -528, -528, -528,
+ -528, 0, -528, 0, 0, 0, -528, -528, -528, -528,
+ -528, -528, -528, 0, 0, -528, 0, 0, 0, 0,
+ 0, 0, 0, 0, -528, -528, 0, -528, -528, -528,
+ -528, -528, -528, -528, -528, -528, -528, 0, 0, -528,
+ 0, 0, -528, -528, 0, -528, -528, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, -528, 0, 0, -528, -528,
+ 0, -528, -528, 0, -528, -528, -528, -528, -528, -528,
+ -528, -528, -528, 0, 0, -528, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, -528, -528, -528, -529, -529,
+ -529, -529, -529, -529, -529, -529, -529, 0, 0, -528,
+ 0, 0, 0, 0, -529, -528, -529, -529, -529, -529,
+ 0, -529, 0, 0, 0, -529, -529, -529, -529, -529,
+ -529, -529, 0, 0, -529, 0, 0, 0, 0, 0,
+ 0, 0, 0, -529, -529, 0, -529, -529, -529, -529,
+ -529, -529, -529, -529, -529, -529, 0, 0, -529, 0,
+ 0, -529, -529, 0, -529, -529, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -529, 0, 0, -529, -529, 0,
+ -529, -529, 0, -529, -529, -529, -529, -529, -529, -529,
+ -529, -529, 0, 0, -529, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -529, -529, -529, -531, -531, -531,
+ -531, -531, -531, -531, -531, -531, 0, 0, -529, 0,
+ 0, 0, 0, -531, -529, -531, -531, -531, -531, 0,
+ 0, 0, 0, 0, -531, -531, -531, -531, -531, -531,
+ -531, 0, 0, -531, 0, 0, 0, 0, 0, 0,
+ 0, 0, -531, -531, 0, -531, -531, -531, -531, -531,
+ -531, -531, -531, -531, -531, 0, 0, -531, 0, 0,
+ -531, -531, 0, -531, -531, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -531, 741, 0, -531, -531, 0, -531,
+ -531, 0, -531, -531, -531, -531, -531, -531, -531, -531,
+ -531, 0, 0, -531, 0, 0, 0, 0, 0, 0,
+ -97, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -531, -531, -531, -533, -533, -533, -533,
+ -533, -533, -533, -533, -533, 0, 0, 0, 0, 0,
+ 0, 0, -533, -531, -533, -533, -533, -533, 0, 0,
+ 0, 0, 0, -533, -533, -533, -533, -533, -533, -533,
+ 0, 0, -533, 0, 0, 0, 0, 0, 0, 0,
+ 0, -533, -533, 0, -533, -533, -533, -533, -533, -533,
+ -533, -533, -533, -533, 0, 0, -533, 0, 0, -533,
+ -533, 0, -533, -533, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -533, 0, 0, -533, -533, 0, -533, -533,
+ 0, -533, -533, -533, -533, -533, -533, -533, -533, -533,
+ 0, 0, -533, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -533, -533, -533, -534, -534, -534, -534, -534,
+ -534, -534, -534, -534, 0, 0, 0, 0, 0, 0,
+ 0, -534, -533, -534, -534, -534, -534, 0, 0, 0,
+ 0, 0, -534, -534, -534, -534, -534, -534, -534, 0,
+ 0, -534, 0, 0, 0, 0, 0, 0, 0, 0,
+ -534, -534, 0, -534, -534, -534, -534, -534, -534, -534,
+ -534, -534, -534, 0, 0, -534, 0, 0, -534, -534,
+ 0, -534, -534, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -534, 0, 0, -534, -534, 0, -534, -534, 0,
+ -534, -534, -534, -534, -534, -534, -534, -534, -534, 0,
+ 0, -534, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -534, -534, -534, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -534, 121, 122, 123, 124, 125, 126, 127, 128,
+ 129, 130, 131, 132, 133, 134, 135, 136, 137, 138,
+ 139, 140, 141, 142, 143, 144, 0, 0, 0, 145,
+ 146, 147, 218, 219, 220, 221, 152, 153, 154, 0,
+ 0, 0, 0, 0, 155, 156, 157, 222, 223, 160,
+ 224, 162, 293, 294, 225, 295, 0, 0, 0, 0,
+ 0, 0, 296, 0, 0, 0, 0, 0, 164, 165,
+ 166, 167, 168, 169, 170, 171, 172, 0, 0, 173,
+ 174, 0, 0, 175, 176, 177, 178, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 179, 0, 0,
+ 0, 0, 0, 0, 297, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 180, 181,
+ 182, 183, 184, 185, 186, 187, 188, 189, 0, 190,
+ 191, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 192, 121, 122,
+ 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
+ 133, 134, 135, 136, 137, 138, 139, 140, 141, 142,
+ 143, 144, 0, 0, 0, 145, 146, 147, 218, 219,
+ 220, 221, 152, 153, 154, 0, 0, 0, 0, 0,
+ 155, 156, 157, 222, 223, 160, 224, 162, 293, 294,
+ 225, 295, 0, 0, 0, 0, 0, 0, 296, 0,
+ 0, 0, 0, 0, 164, 165, 166, 167, 168, 169,
+ 170, 171, 172, 0, 0, 173, 174, 0, 0, 175,
+ 176, 177, 178, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 179, 0, 0, 0, 0, 0, 0,
+ 414, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 180, 181, 182, 183, 184, 185,
+ 186, 187, 188, 189, 0, 190, 191, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 192, 121, 122, 123, 124, 125, 126,
+ 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,
+ 137, 138, 139, 140, 141, 142, 143, 144, 0, 0,
+ 0, 145, 146, 147, 218, 219, 220, 221, 152, 153,
+ 154, 0, 0, 0, 0, 0, 155, 156, 157, 222,
+ 223, 160, 224, 162, 0, 0, 225, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 164, 165, 166, 167, 168, 169, 170, 171, 172, 0,
+ 0, 173, 174, 0, 0, 175, 176, 177, 178, 0,
+ 0, 337, 338, 339, 340, 341, 342, 343, 0, 179,
+ 346, 347, 226, 0, 0, 0, 350, 351, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
+ 0, 190, 191, 0, 0, 0, 0, 0, 0, 353,
+ 354, 355, 356, 357, 358, 359, 360, 361, 362, 192,
+ 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
+ 131, 132, 133, 134, 135, 136, 137, 138, 139, 140,
+ 141, 142, 143, 144, 0, 0, 0, 145, 146, 147,
+ 218, 219, 220, 221, 152, 153, 154, 0, 0, 0,
+ 0, 0, 155, 156, 157, 222, 223, 160, 224, 162,
+ 0, 0, 225, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 164, 165, 166, 167,
+ 168, 169, 170, 171, 172, 0, 0, 173, 174, 0,
+ 0, 175, 176, 177, 178, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 179, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 180, 181, 182, 183,
+ 184, 185, 186, 187, 188, 189, 0, 190, 191, 0,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 0,
+ 0, 0, 0, 0, 0, 192, 15, 0, 101, 102,
+ 18, 19, 0, 0, 0, 0, 0, 103, 104, 105,
+ 23, 24, 25, 26, 0, 0, 106, 0, 0, 0,
+ 0, 0, 0, 0, 0, 31, 32, 0, 33, 34,
+ 35, 36, 37, 38, 0, 39, 40, 41, 0, 0,
+ 42, 0, 0, 43, 44, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 286, 0, 0, 111,
+ 49, 0, 50, 51, 0, 0, 0, 53, 54, 55,
+ 56, 57, 58, 59, 0, 0, 60, 0, 0, 5,
+ 6, 7, 8, 9, 10, 11, 12, 13, 0, 0,
+ 0, 0, 0, 0, 0, 15, 112, 101, 102, 18,
+ 19, 0, 0, 0, 0, 0, 103, 104, 105, 23,
+ 24, 25, 26, 0, 287, 106, 0, 0, 0, 0,
+ 0, 0, 0, 0, 31, 32, 0, 33, 34, 35,
+ 36, 37, 38, 0, 39, 40, 41, 0, 0, 42,
+ 0, 0, 43, 44, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 286, 0, 0, 111, 49,
+ 0, 50, 51, 0, 0, 0, 53, 54, 55, 56,
+ 57, 58, 59, 0, 0, 60, 0, 0, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 0, 0, 0,
+ 0, 0, 0, 0, 15, 112, 101, 102, 18, 19,
+ 0, 0, 0, 0, 0, 103, 104, 105, 23, 24,
+ 25, 26, 0, 529, 106, 0, 0, 0, 0, 0,
+ 0, 0, 0, 31, 32, 0, 33, 34, 35, 36,
+ 37, 38, 238, 39, 40, 41, 0, 0, 42, 0,
+ 0, 43, 44, 0, 45, 46, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 200, 0, 0, 111, 49, 0,
+ 50, 51, 0, 633, 240, 53, 54, 55, 56, 57,
+ 58, 59, 0, 0, 60, 499, 0, 0, 500, 501,
+ 0, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 14, 0, 0, 0, 61, 241, 63, 15, 0, 16,
+ 17, 18, 19, 0, 0, 0, 0, 0, 20, 21,
+ 22, 23, 24, 25, 26, 0, 0, 27, 0, 0,
+ 0, 0, 0, 28, 29, 30, 31, 32, 0, 33,
+ 34, 35, 36, 37, 38, 0, 39, 40, 41, 0,
+ 0, 42, 0, 0, 43, 44, 0, 45, 46, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 47, 0, 0,
+ 48, 49, 0, 50, 51, 0, 52, 0, 53, 54,
+ 55, 56, 57, 58, 59, 0, 0, 60, 0, 0,
+ 0, 0, 0, 0, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 0, 0, 0, 0, 61, 62, 63,
+ 15, 0, 101, 102, 18, 19, 0, 0, 0, 0,
+ 0, 103, 104, 105, 23, 24, 25, 26, 0, 0,
+ 106, 0, 0, 0, 0, 0, 0, 0, 0, 31,
+ 32, 0, 33, 34, 35, 36, 37, 38, 238, 39,
+ 40, 41, 0, 0, 42, 0, 0, 43, 44, 0,
+ 45, 46, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 200, 0, 0, 111, 49, 0, 50, 51, 0, 633,
+ 0, 53, 54, 55, 56, 57, 58, 59, 0, 0,
+ 60, 499, 0, 0, 500, 501, 0, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 0, 0, 0,
+ 61, 241, 63, 15, 0, 16, 17, 18, 19, 0,
+ 0, 0, 0, 0, 20, 21, 22, 23, 24, 25,
+ 26, 0, 0, 27, 0, 0, 0, 0, 0, 28,
+ 0, 30, 31, 32, 0, 33, 34, 35, 36, 37,
+ 38, 0, 39, 40, 41, 0, 0, 42, 0, 0,
+ 43, 44, 0, 45, 46, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 47, 0, 0, 48, 49, 0, 50,
+ 51, 0, 52, 0, 53, 54, 55, 56, 57, 58,
+ 59, 0, 0, 60, 0, 0, 0, 0, 0, 0,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 0,
+ 0, 0, 0, 61, 62, 63, 15, 0, 101, 102,
+ 18, 19, 0, 0, 0, 0, 0, 103, 104, 105,
+ 23, 24, 25, 26, 0, 0, 106, 0, 0, 0,
+ 0, 0, 0, 0, 0, 31, 32, 0, 33, 34,
+ 35, 36, 37, 38, 0, 39, 40, 41, 0, 0,
+ 42, 0, 0, 43, 44, 0, 45, 46, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 200, 0, 0, 111,
+ 49, 0, 50, 51, 0, 756, 0, 53, 54, 55,
+ 56, 57, 58, 59, 0, 0, 60, 499, 0, 0,
+ 500, 501, 0, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 0, 0, 0, 0, 61, 241, 63, 15,
+ 0, 101, 102, 18, 19, 0, 0, 0, 0, 0,
+ 103, 104, 105, 23, 24, 25, 26, 0, 0, 106,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 32,
+ 0, 33, 34, 35, 36, 37, 38, 0, 39, 40,
+ 41, 0, 0, 42, 0, 0, 43, 44, 0, 45,
+ 46, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 200,
+ 0, 0, 111, 49, 0, 50, 51, 0, 792, 0,
+ 53, 54, 55, 56, 57, 58, 59, 0, 0, 60,
+ 499, 0, 0, 500, 501, 0, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 0, 0, 0, 0, 61,
+ 241, 63, 15, 0, 101, 102, 18, 19, 0, 0,
+ 0, 0, 0, 103, 104, 105, 23, 24, 25, 26,
+ 0, 0, 106, 0, 0, 0, 0, 0, 0, 0,
+ 0, 31, 32, 0, 33, 34, 35, 36, 37, 38,
+ 0, 39, 40, 41, 0, 0, 42, 0, 0, 43,
+ 44, 0, 45, 46, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 200, 0, 0, 111, 49, 0, 50, 51,
+ 0, 633, 0, 53, 54, 55, 56, 57, 58, 59,
+ 0, 0, 60, 499, 0, 0, 500, 501, 0, 5,
+ 6, 7, 8, 9, 10, 11, 12, 13, 0, 0,
+ 0, 0, 61, 241, 63, 15, 0, 16, 17, 18,
+ 19, 0, 0, 0, 0, 0, 20, 21, 22, 23,
+ 24, 25, 26, 0, 0, 106, 0, 0, 0, 0,
+ 0, 0, 0, 0, 31, 32, 0, 33, 34, 35,
+ 36, 37, 38, 238, 39, 40, 41, 0, 0, 42,
+ 0, 0, 43, 44, 0, 45, 46, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 200, 0, 0, 111, 49,
+ 0, 50, 51, 0, 239, 240, 53, 54, 55, 56,
+ 57, 58, 59, 0, 0, 60, 0, 0, 0, 0,
+ 0, 0, 5, 6, 7, 8, 9, 10, 11, 12,
+ 13, 0, 0, 0, 0, 61, 241, 63, 15, 0,
+ 101, 102, 18, 19, 0, 0, 0, 0, 0, 103,
+ 104, 105, 23, 24, 25, 26, 0, 0, 106, 0,
+ 0, 0, 0, 0, 0, 0, 0, 31, 32, 0,
+ 33, 34, 35, 36, 37, 38, 238, 39, 40, 41,
+ 0, 0, 42, 0, 0, 43, 44, 0, 45, 46,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 200, 0,
+ 0, 111, 49, 0, 50, 51, 0, 239, 0, 53,
+ 54, 55, 56, 57, 58, 59, 0, 0, 60, 0,
+ 0, 0, 0, 0, 0, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 0, 0, 0, 0, 61, 241,
+ 63, 15, 0, 101, 102, 18, 19, 0, 0, 0,
+ 0, 0, 103, 104, 105, 23, 24, 25, 26, 0,
+ 0, 106, 0, 0, 0, 0, 0, 0, 0, 0,
+ 31, 32, 0, 33, 34, 35, 36, 37, 38, 238,
+ 39, 40, 41, 0, 0, 42, 0, 0, 43, 44,
+ 0, 45, 46, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 200, 0, 0, 111, 49, 0, 50, 51, 0,
+ 0, 240, 53, 54, 55, 56, 57, 58, 59, 0,
+ 0, 60, 0, 0, 0, 0, 0, 0, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 0, 0, 0,
+ 0, 61, 241, 63, 15, 0, 101, 102, 18, 19,
+ 0, 0, 0, 0, 0, 103, 104, 105, 23, 24,
+ 25, 26, 0, 0, 106, 0, 0, 0, 0, 0,
+ 0, 0, 0, 31, 32, 0, 33, 34, 35, 36,
+ 37, 38, 238, 39, 40, 41, 0, 0, 42, 0,
+ 0, 43, 44, 0, 45, 46, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 200, 0, 0, 111, 49, 0,
+ 50, 51, 0, 0, 0, 53, 54, 55, 56, 57,
+ 58, 59, 0, 0, 60, 0, 0, 0, 0, 0,
+ 0, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 0, 0, 0, 0, 61, 241, 63, 15, 0, 16,
+ 17, 18, 19, 0, 0, 0, 0, 0, 20, 21,
+ 22, 23, 24, 25, 26, 0, 0, 106, 0, 0,
+ 0, 0, 0, 0, 0, 0, 31, 32, 0, 33,
+ 34, 35, 36, 37, 38, 0, 39, 40, 41, 0,
+ 0, 42, 0, 0, 43, 44, 0, 45, 46, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 200, 0, 0,
+ 111, 49, 0, 50, 51, 0, 523, 0, 53, 54,
+ 55, 56, 57, 58, 59, 0, 0, 60, 0, 0,
+ 0, 0, 0, 0, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 0, 0, 0, 0, 61, 241, 63,
+ 15, 0, 101, 102, 18, 19, 0, 0, 0, 0,
+ 0, 103, 104, 105, 23, 24, 25, 26, 0, 0,
+ 106, 0, 0, 0, 0, 0, 0, 0, 0, 31,
+ 32, 0, 33, 34, 35, 36, 37, 38, 0, 39,
+ 40, 41, 0, 0, 42, 0, 0, 43, 44, 0,
+ 45, 46, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 200, 0, 0, 111, 49, 0, 50, 51, 0, 239,
+ 0, 53, 54, 55, 56, 57, 58, 59, 0, 0,
+ 60, 0, 0, 0, 0, 0, 0, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 0, 0, 0, 0,
+ 61, 241, 63, 15, 0, 101, 102, 18, 19, 0,
+ 0, 0, 0, 0, 103, 104, 105, 23, 24, 25,
+ 26, 0, 0, 106, 0, 0, 0, 0, 0, 0,
+ 0, 0, 31, 32, 0, 33, 34, 35, 36, 37,
+ 38, 0, 39, 40, 41, 0, 0, 42, 0, 0,
+ 43, 44, 0, 45, 46, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 200, 0, 0, 111, 49, 0, 50,
+ 51, 0, 523, 0, 53, 54, 55, 56, 57, 58,
+ 59, 0, 0, 60, 0, 0, 0, 0, 0, 0,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 0,
+ 0, 0, 0, 61, 241, 63, 15, 0, 16, 17,
+ 18, 19, 0, 0, 0, 0, 0, 20, 21, 22,
+ 23, 24, 25, 26, 0, 0, 27, 0, 0, 0,
+ 0, 0, 0, 0, 0, 31, 32, 0, 33, 34,
+ 35, 36, 37, 38, 0, 39, 40, 41, 0, 0,
+ 42, 0, 0, 43, 44, 0, 45, 46, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 200, 0, 0, 111,
+ 49, 0, 50, 51, 0, 0, 0, 53, 54, 55,
+ 56, 57, 58, 59, 0, 0, 60, 0, 0, 0,
+ 0, 0, 0, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 0, 0, 0, 0, 61, 62, 63, 15,
+ 0, 101, 102, 18, 19, 0, 0, 0, 0, 0,
+ 103, 104, 105, 23, 24, 25, 26, 0, 0, 106,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 32,
+ 0, 33, 34, 35, 36, 37, 38, 0, 39, 40,
+ 41, 0, 0, 42, 0, 0, 43, 44, 0, 45,
+ 46, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 200,
+ 0, 0, 111, 49, 0, 50, 51, 0, 0, 0,
+ 53, 54, 55, 56, 57, 58, 59, 0, 0, 60,
+ 0, 0, 0, 0, 0, 0, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 0, 0, 0, 0, 61,
+ 241, 63, 15, 0, 16, 17, 18, 19, 0, 0,
+ 0, 0, 0, 20, 21, 22, 23, 24, 25, 26,
+ 0, 0, 106, 0, 0, 0, 0, 0, 0, 0,
+ 0, 31, 32, 0, 33, 34, 35, 36, 37, 38,
+ 0, 39, 40, 41, 0, 0, 42, 0, 0, 43,
+ 44, 0, 45, 46, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 200, 0, 0, 111, 49, 0, 50, 51,
+ 0, 0, 0, 53, 54, 55, 56, 57, 58, 59,
+ 0, 0, 60, 0, 0, 0, 0, 0, 0, 5,
+ 6, 7, 8, 9, 10, 11, 12, 13, 0, 0,
+ 0, 0, 61, 241, 63, 15, 0, 101, 102, 18,
+ 19, 0, 0, 0, 0, 0, 103, 104, 105, 23,
+ 24, 25, 26, 0, 0, 106, 0, 0, 0, 0,
+ 0, 0, 0, 0, 31, 32, 0, 107, 34, 35,
+ 36, 108, 38, 0, 39, 40, 41, 0, 0, 42,
+ 0, 0, 43, 44, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 109, 0, 0, 110, 0, 0, 111, 49,
+ 0, 50, 51, 0, 0, 0, 53, 54, 55, 56,
+ 57, 58, 59, 0, 0, 60, 0, 0, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 0, 0, 0,
+ 0, 0, 0, 0, 15, 112, 101, 102, 18, 19,
+ 0, 0, 0, 0, 0, 103, 104, 105, 23, 24,
+ 25, 26, 0, 0, 106, 0, 0, 0, 0, 0,
+ 0, 0, 0, 31, 32, 0, 33, 34, 35, 36,
+ 37, 38, 0, 39, 40, 41, 0, 0, 42, 0,
+ 0, 43, 44, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 211, 0, 0, 48, 49, 0,
+ 50, 51, 0, 52, 0, 53, 54, 55, 56, 57,
+ 58, 59, 0, 0, 60, 0, 0, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 0, 0, 0, 0,
+ 0, 0, 0, 15, 112, 101, 102, 18, 19, 0,
+ 0, 0, 0, 0, 103, 104, 105, 23, 24, 25,
+ 26, 0, 0, 106, 0, 0, 0, 0, 0, 0,
+ 0, 0, 31, 32, 0, 33, 34, 35, 36, 37,
+ 38, 0, 39, 40, 41, 0, 0, 42, 0, 0,
+ 43, 44, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 286, 0, 0, 333, 49, 0, 50,
+ 51, 0, 334, 0, 53, 54, 55, 56, 57, 58,
+ 59, 0, 0, 60, 0, 0, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 0, 0, 0, 0, 0,
+ 0, 0, 15, 112, 101, 102, 18, 19, 0, 0,
+ 0, 0, 0, 103, 104, 105, 23, 24, 25, 26,
+ 0, 0, 106, 0, 0, 0, 0, 0, 0, 0,
+ 0, 31, 32, 0, 107, 34, 35, 36, 108, 38,
+ 0, 39, 40, 41, 0, 0, 42, 0, 0, 43,
+ 44, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 110, 0, 0, 111, 49, 0, 50, 51,
+ 0, 0, 0, 53, 54, 55, 56, 57, 58, 59,
+ 0, 0, 60, 0, 0, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 0, 0, 0, 0, 0, 0,
+ 0, 15, 112, 101, 102, 18, 19, 0, 0, 0,
+ 0, 0, 103, 104, 105, 23, 24, 25, 26, 0,
+ 0, 106, 0, 0, 0, 0, 0, 0, 0, 0,
+ 31, 32, 0, 33, 34, 35, 36, 37, 38, 0,
+ 39, 40, 41, 0, 0, 42, 0, 0, 43, 44,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 286, 0, 0, 333, 49, 0, 50, 51, 0,
+ 0, 0, 53, 54, 55, 56, 57, 58, 59, 0,
+ 0, 60, 0, 0, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 0, 0, 0, 0, 0, 0, 0,
+ 15, 112, 101, 102, 18, 19, 0, 0, 0, 0,
+ 0, 103, 104, 105, 23, 24, 25, 26, 0, 0,
+ 106, 0, 0, 0, 0, 0, 0, 0, 0, 31,
+ 32, 0, 33, 34, 35, 36, 37, 38, 0, 39,
+ 40, 41, 0, 0, 42, 0, 0, 43, 44, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 863, 0, 0, 111, 49, 0, 50, 51, 0, 0,
+ 0, 53, 54, 55, 56, 57, 58, 59, 0, 0,
+ 60, 0, 0, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 0, 0, 0, 0, 0, 0, 0, 15,
+ 112, 101, 102, 18, 19, 0, 0, 0, 0, 0,
+ 103, 104, 105, 23, 24, 25, 26, 0, 0, 106,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 32,
+ 0, 33, 34, 35, 36, 37, 38, 0, 39, 40,
+ 41, 0, 0, 42, 0, 0, 43, 44, 0, 337,
+ 338, 339, 340, 341, 342, 343, 344, 345, 346, 347,
+ -556, -556, 0, 0, 350, 351, 0, 0, 0, 881,
+ 0, 0, 111, 49, 0, 50, 51, 0, 0, 0,
+ 53, 54, 55, 56, 57, 58, 59, 0, 0, 60,
+ 0, 0, 572, 573, 0, 0, 574, 353, 354, 355,
+ 356, 357, 358, 359, 360, 361, 362, 0, 0, 112,
+ 164, 165, 166, 167, 168, 169, 170, 171, 172, 0,
+ 0, 173, 174, 0, 0, 175, 176, 177, 178, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 179,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
+ 0, 190, 191, 593, 565, 0, 0, 594, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 192,
+ 255, 164, 165, 166, 167, 168, 169, 170, 171, 172,
+ 0, 0, 173, 174, 0, 0, 175, 176, 177, 178,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 179, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 180, 181, 182, 183, 184, 185, 186, 187, 188,
+ 189, 0, 190, 191, 578, 573, 0, 0, 579, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 192, 255, 164, 165, 166, 167, 168, 169, 170, 171,
+ 172, 0, 0, 173, 174, 0, 0, 175, 176, 177,
+ 178, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 179, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 180, 181, 182, 183, 184, 185, 186, 187,
+ 188, 189, 0, 190, 191, 610, 565, 0, 0, 611,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 192, 255, 164, 165, 166, 167, 168, 169, 170,
+ 171, 172, 0, 0, 173, 174, 0, 0, 175, 176,
+ 177, 178, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 179, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 180, 181, 182, 183, 184, 185, 186,
+ 187, 188, 189, 0, 190, 191, 613, 573, 0, 0,
+ 614, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 192, 255, 164, 165, 166, 167, 168, 169,
+ 170, 171, 172, 0, 0, 173, 174, 0, 0, 175,
+ 176, 177, 178, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 179, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 180, 181, 182, 183, 184, 185,
+ 186, 187, 188, 189, 0, 190, 191, 620, 565, 0,
+ 0, 621, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 192, 255, 164, 165, 166, 167, 168,
+ 169, 170, 171, 172, 0, 0, 173, 174, 0, 0,
+ 175, 176, 177, 178, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 179, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 180, 181, 182, 183, 184,
+ 185, 186, 187, 188, 189, 0, 190, 191, 623, 573,
+ 0, 0, 624, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 192, 255, 164, 165, 166, 167,
+ 168, 169, 170, 171, 172, 0, 0, 173, 174, 0,
+ 0, 175, 176, 177, 178, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 179, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 180, 181, 182, 183,
+ 184, 185, 186, 187, 188, 189, 0, 190, 191, 655,
+ 565, 0, 0, 656, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 192, 255, 164, 165, 166,
+ 167, 168, 169, 170, 171, 172, 0, 0, 173, 174,
+ 0, 0, 175, 176, 177, 178, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 179, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 180, 181, 182,
+ 183, 184, 185, 186, 187, 188, 189, 0, 190, 191,
+ 658, 573, 0, 0, 659, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 192, 255, 164, 165,
+ 166, 167, 168, 169, 170, 171, 172, 0, 0, 173,
+ 174, 0, 0, 175, 176, 177, 178, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 179, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 180, 181,
+ 182, 183, 184, 185, 186, 187, 188, 189, 0, 190,
+ 191, 939, 565, 0, 0, 940, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 192, 255, 164,
+ 165, 166, 167, 168, 169, 170, 171, 172, 0, 0,
+ 173, 174, 0, 0, 175, 176, 177, 178, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 179, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 180,
+ 181, 182, 183, 184, 185, 186, 187, 188, 189, 0,
+ 190, 191, 946, 565, 0, 0, 947, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 192, 255,
+ 164, 165, 166, 167, 168, 169, 170, 171, 172, 0,
+ 0, 173, 174, 0, 0, 175, 176, 177, 178, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 179,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
+ 0, 190, 191, 949, 573, 0, 0, 950, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 192,
+ 255, 164, 165, 166, 167, 168, 169, 170, 171, 172,
+ 0, 0, 173, 174, 0, 0, 175, 176, 177, 178,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 179, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 180, 181, 182, 183, 184, 185, 186, 187, 188,
+ 189, 0, 190, 191, 578, 573, 0, 0, 579, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 192, 255, 164, 165, 166, 167, 168, 169, 170, 171,
+ 172, 0, 0, 173, 174, 0, 0, 175, 176, 177,
+ 178, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 179, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 180, 181, 182, 183, 184, 185, 186, 187,
+ 188, 189, 0, 190, 191, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 192
+};
+
+static const yytype_int16 yycheck[] =
+{
+ 2, 83, 27, 16, 17, 248, 7, 20, 28, 208,
+ 5, 6, 292, 292, 62, 22, 417, 287, 13, 22,
+ 280, 76, 14, 10, 284, 258, 364, 390, 15, 48,
+ 425, 16, 17, 428, 15, 20, 28, 2, 408, 4,
+ 273, 52, 428, 336, 277, 336, 4, 691, 50, 51,
+ 388, 110, 605, 54, 468, 48, 363, 52, 365, 1,
+ 676, 368, 615, 597, 402, 50, 51, 65, 767, 65,
+ 26, 16, 17, 411, 460, 20, 765, 25, 612, 672,
+ 477, 76, 389, 16, 65, 672, 846, 27, 622, 676,
+ 16, 98, 111, 25, 401, 98, 403, 691, 105, 269,
+ 16, 581, 582, 865, 691, 412, 304, 26, 79, 29,
+ 116, 18, 119, 20, 90, 529, 88, 16, 17, 16,
+ 0, 20, 363, 657, 365, 88, 88, 368, 150, 25,
+ 90, 153, 470, 114, 16, 71, 706, 88, 502, 446,
+ 116, 147, 88, 713, 16, 55, 387, 28, 389, 88,
+ 121, 50, 143, 842, 55, 90, 116, 25, 147, 15,
+ 401, 116, 403, 333, 471, 25, 37, 38, 928, 410,
+ 149, 412, 25, 935, 146, 149, 25, 90, 120, 153,
+ 25, 116, 145, 146, 146, 88, 149, 143, 108, 783,
+ 126, 127, 128, 149, 437, 146, 895, 430, 468, 147,
+ 146, 434, 482, 482, 445, 446, 439, 146, 897, 65,
+ 152, 153, 152, 153, 147, 147, 449, 861, 416, 152,
+ 153, 865, 209, 210, 143, 226, 152, 153, 469, 592,
+ 471, 116, 287, 849, 149, 233, 152, 153, 927, 252,
+ 720, 254, 255, 146, 263, 247, 248, 642, 643, 149,
+ 269, 147, 233, 255, 116, 152, 153, 643, 114, 529,
+ 853, 88, 849, 25, 628, 662, 663, 252, 861, 254,
+ 152, 153, 636, 271, 861, 271, 269, 149, 865, 147,
+ 152, 153, 153, 331, 837, 699, 88, 147, 336, 149,
+ 271, 935, 287, 90, 147, 528, 149, 2, 147, 4,
+ 5, 6, 147, 268, 9, 10, 88, 252, 13, 254,
+ 15, 16, 17, 604, 333, 20, 88, 55, 145, 146,
+ 88, 147, 601, 334, 372, 373, 147, 153, 387, 51,
+ 58, 59, 153, 55, 25, 322, 323, 324, 325, 334,
+ 333, 26, 25, 48, 146, 20, 202, 52, 935, 152,
+ 153, 364, 208, 252, 116, 254, 321, 62, 365, 88,
+ 147, 326, 364, 321, 146, 728, 153, 600, 765, 90,
+ 767, 76, 147, 145, 146, 388, 26, 233, 146, 398,
+ 750, 152, 389, 91, 90, 147, 388, 406, 150, 402,
+ 147, 153, 652, 395, 637, 116, 403, 147, 411, 143,
+ 402, 71, 383, 88, 109, 412, 111, 700, 88, 411,
+ 116, 466, 691, 468, 948, 271, 145, 146, 651, 88,
+ 26, 153, 442, 279, 280, 116, 407, 408, 284, 699,
+ 150, 630, 331, 666, 436, 437, 837, 336, 88, 446,
+ 425, 443, 116, 90, 839, 842, 843, 727, 727, 88,
+ 442, 88, 815, 839, 88, 151, 147, 470, 143, 150,
+ 145, 146, 153, 144, 471, 145, 146, 88, 470, 116,
+ 55, 466, 457, 468, 529, 88, 145, 146, 443, 498,
+ 110, 147, 88, 113, 114, 147, 488, 452, 90, 491,
+ 71, 493, 71, 143, 199, 145, 146, 97, 895, 149,
+ 897, 15, 88, 13, 209, 210, 145, 146, 145, 146,
+ 88, 145, 146, 16, 116, 63, 759, 880, 15, 418,
+ 522, 150, 26, 147, 145, 146, 144, 383, 553, 90,
+ 927, 764, 145, 146, 529, 90, 147, 143, 147, 145,
+ 146, 116, 821, 149, 147, 147, 571, 252, 147, 254,
+ 255, 407, 408, 258, 259, 116, 37, 38, 263, 145,
+ 146, 116, 569, 268, 269, 51, 569, 145, 146, 51,
+ 577, 276, 597, 580, 577, 577, 147, 580, 580, 581,
+ 582, 147, 287, 921, 88, 818, 147, 612, 63, 596,
+ 110, 598, 147, 113, 114, 147, 598, 622, 58, 59,
+ 147, 602, 604, 605, 591, 607, 626, 51, 589, 53,
+ 54, 55, 56, 615, 90, 922, 321, 322, 323, 324,
+ 325, 326, 327, 328, 823, 116, 331, 90, 333, 334,
+ 829, 336, 657, 715, 626, 637, 18, 90, 625, 143,
+ 116, 145, 146, 668, 699, 149, 62, 15, 64, 65,
+ 669, 670, 700, 116, 71, 703, 704, 642, 15, 364,
+ 144, 709, 710, 116, 147, 684, 691, 372, 373, 147,
+ 911, 147, 51, 692, 53, 54, 55, 56, 144, 920,
+ 118, 922, 151, 388, 147, 390, 391, 62, 15, 64,
+ 65, 17, 18, 398, 147, 111, 112, 402, 717, 718,
+ 91, 406, 14, 147, 699, 604, 411, 124, 125, 126,
+ 127, 128, 56, 57, 58, 59, 735, 15, 720, 15,
+ 61, 147, 147, 64, 65, 152, 150, 15, 747, 748,
+ 144, 733, 147, 589, 736, 754, 111, 112, 443, 147,
+ 147, 722, 147, 9, 10, 144, 147, 452, 729, 15,
+ 121, 738, 147, 147, 15, 803, 15, 759, 783, 147,
+ 144, 466, 15, 468, 15, 470, 15, 147, 147, 750,
+ 111, 112, 774, 775, 630, 777, 121, 779, 780, 55,
+ 63, 64, 65, 785, 147, 144, 788, 789, 15, 147,
+ 15, 786, 55, 498, 61, 814, 652, 64, 65, 51,
+ 147, 53, 54, 55, 56, 147, 71, 826, 51, 147,
+ 53, 54, 55, 56, 147, 15, 147, 149, 2, 149,
+ 4, 86, 87, 443, 529, 9, 10, 822, 111, 112,
+ 13, 15, 16, 17, 6, 837, 20, 580, 924, 662,
+ 92, 928, 716, 109, 111, 112, 98, 99, 51, 92,
+ 53, 54, 55, 56, 923, 98, 99, 7, 123, 124,
+ 125, 126, 127, 128, 48, 672, 722, 886, 504, 888,
+ 198, 123, 891, 729, 126, 900, -1, 821, 62, 491,
+ 123, 493, -1, 126, 71, -1, 591, 592, 51, 92,
+ 53, 54, 55, 56, 750, 98, -1, 149, -1, 86,
+ 87, 903, 904, 905, 906, -1, 908, 909, 921, 861,
+ 912, -1, 914, 915, -1, 922, -1, -1, -1, 921,
+ 625, 923, 924, 948, -1, 109, -1, 111, 51, 92,
+ 53, 54, 55, 56, -1, 98, 99, 124, 125, 126,
+ 127, 128, -1, 209, 210, 51, -1, 51, -1, 53,
+ 54, 55, 56, -1, 956, 957, 958, 959, 960, -1,
+ 123, -1, -1, 126, 669, 670, 968, 823, -1, 92,
+ 63, 64, 65, 829, -1, -1, 99, -1, -1, 684,
+ -1, 676, -1, -1, 679, -1, -1, 692, 92, -1,
+ 153, -1, 258, 259, 699, 700, 691, -1, 703, 704,
+ 123, -1, -1, -1, 709, 710, 63, 64, 65, -1,
+ 276, -1, 717, 718, -1, 199, -1, -1, 111, 112,
+ -1, -1, -1, 728, -1, 209, 210, -1, -1, -1,
+ 735, -1, -1, 738, 63, 64, 65, -1, 63, 64,
+ 65, -1, 747, 748, -1, 63, 64, 65, 51, 754,
+ 53, 54, 55, 56, 111, 112, 322, 323, 324, 325,
+ -1, 327, 328, 40, 41, 42, 43, 44, 252, -1,
+ 254, 255, -1, -1, 258, 259, -1, -1, -1, 263,
+ -1, 786, 111, 112, 268, 269, 111, 112, -1, 92,
+ -1, -1, 276, 111, 112, 98, 99, -1, 803, -1,
+ -1, -1, 63, 64, 65, -1, -1, -1, -1, 814,
+ 815, 2, -1, 4, 5, 6, 7, 822, -1, -1,
+ 123, 826, 13, 126, 51, 391, 53, 54, 55, 56,
+ -1, -1, 238, 239, 240, -1, -1, 321, 322, 323,
+ 324, 325, 326, 327, 328, -1, 149, 331, -1, 333,
+ 111, 112, 336, -1, 849, -1, 851, 48, -1, -1,
+ 855, 52, 774, 775, -1, 777, -1, 779, 780, -1,
+ 865, -1, 867, 785, -1, 880, 788, 789, -1, -1,
+ 364, 886, -1, 888, -1, 76, 891, -1, 372, 373,
+ 51, -1, 53, 54, 55, 56, -1, -1, -1, -1,
+ 297, -1, -1, -1, 388, -1, 390, 391, 305, -1,
+ -1, 308, -1, 310, 398, 312, 921, 314, 402, -1,
+ 111, -1, 406, -1, -1, 331, -1, 411, -1, -1,
+ 336, 92, -1, -1, -1, -1, 931, 98, 0, -1,
+ 935, -1, 937, -1, -1, -1, -1, 942, -1, -1,
+ -1, 13, 14, 15, 16, 17, 18, -1, 20, 443,
+ -1, -1, -1, -1, 26, 27, -1, -1, 452, 964,
+ -1, -1, -1, -1, -1, 37, 38, -1, 40, 41,
+ 42, 43, 44, -1, -1, -1, 470, -1, -1, -1,
+ -1, 903, 904, 905, 906, -1, 908, 909, -1, -1,
+ 912, -1, 914, 915, -1, -1, -1, -1, 199, -1,
+ -1, -1, 418, -1, 498, -1, -1, -1, 424, 425,
+ -1, -1, 428, -1, -1, 591, 88, -1, -1, -1,
+ -1, -1, -1, 16, 17, -1, -1, 20, -1, -1,
+ -1, -1, -1, -1, 956, 957, 958, 959, 960, 71,
+ -1, 457, -1, -1, 460, -1, 968, -1, -1, 625,
+ -1, -1, 45, 46, 86, 87, -1, 50, 51, -1,
+ -1, -1, 263, -1, -1, -1, -1, 268, 269, 62,
+ 63, 143, 144, 489, 146, -1, -1, 149, 150, -1,
+ 152, 153, -1, -1, -1, -1, 287, -1, -1, 121,
+ 122, 123, 124, 125, 126, 127, 128, 591, 592, 71,
+ 72, 73, 74, 75, 76, 77, 78, 523, 80, 81,
+ -1, -1, -1, -1, 86, 87, -1, -1, -1, -1,
+ 321, -1, -1, -1, -1, 326, -1, -1, -1, -1,
+ -1, 625, 333, 334, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 119, 120, 121,
+ 122, 123, 124, 125, 126, 127, 128, -1, -1, -1,
+ -1, -1, 738, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 669, 670, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 604, 390,
+ 684, -1, -1, -1, -1, -1, -1, 398, 692, -1,
+ -1, -1, -1, -1, -1, 406, 700, -1, -1, 703,
+ 704, -1, -1, -1, -1, 709, 710, 633, -1, -1,
+ 636, -1, -1, 717, 718, -1, 642, 643, -1, -1,
+ -1, -1, -1, -1, 728, -1, -1, -1, -1, -1,
+ -1, 735, 443, -1, 738, 238, 239, 240, 241, -1,
+ -1, 452, -1, 747, 748, -1, -1, -1, -1, 252,
+ 754, 254, 255, -1, -1, 466, -1, 468, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 696, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 498, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 803,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 814, 815, -1, -1, -1, -1, -1, -1, 529, -1,
+ -1, -1, 826, -1, -1, -1, -1, 753, 331, -1,
+ 756, -1, -1, 336, 337, 338, 339, 340, 341, 342,
+ 343, 344, 345, 346, 347, 348, 349, 350, 351, 352,
+ 353, 354, 355, 356, 357, 358, 359, 360, 361, 362,
+ 2, 364, 4, 5, 6, -1, 792, -1, -1, 372,
+ 373, 13, -1, -1, -1, -1, 880, -1, -1, -1,
+ -1, 592, 886, -1, 888, 388, -1, 891, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 400, -1, 402,
+ -1, 404, 405, -1, -1, -1, 48, -1, 411, -1,
+ 52, -1, -1, 839, -1, 418, -1, 921, -1, -1,
+ -1, 424, 425, -1, -1, 428, -1, -1, -1, -1,
+ -1, -1, -1, -1, 76, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 447, -1, -1, -1, -1, -1,
+ -1, -1, -1, 2, 457, 4, -1, 460, 669, 670,
+ -1, -1, -1, -1, 13, -1, -1, 470, -1, 111,
+ -1, -1, -1, 684, -1, -1, -1, -1, -1, -1,
+ -1, 692, -1, -1, -1, -1, 489, -1, 699, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 48,
+ -1, -1, -1, -1, -1, -1, 717, 718, -1, 512,
+ 513, -1, -1, -1, -1, -1, -1, 728, -1, -1,
+ 523, -1, -1, -1, 735, -1, -1, -1, -1, 71,
+ 72, 73, 74, 75, 76, 77, 747, 748, 80, 81,
+ -1, -1, -1, 754, 86, 87, -1, -1, -1, -1,
+ -1, -1, 2, -1, 4, -1, -1, 199, -1, -1,
+ -1, -1, 111, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 786, -1, 119, 120, 121,
+ 122, 123, 124, 125, 126, 127, 128, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 48, -1,
+ -1, 604, -1, 814, 815, -1, -1, -1, -1, -1,
+ -1, 822, -1, -1, -1, 826, -1, -1, -1, -1,
+ -1, 263, -1, -1, -1, -1, 268, 269, -1, -1,
+ 633, -1, -1, 636, -1, -1, -1, -1, -1, 642,
+ 643, -1, -1, -1, -1, 287, -1, -1, -1, -1,
+ 199, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 111, -1, -1, -1, -1, -1, -1, -1, 880,
+ -1, -1, -1, -1, -1, 886, -1, 888, -1, 321,
+ 891, -1, -1, -1, 326, -1, -1, -1, -1, -1,
+ -1, 333, 334, 696, -1, -1, -1, 700, 701, -1,
+ 703, 704, -1, -1, -1, -1, 709, 710, -1, -1,
+ -1, -1, -1, -1, 263, -1, 719, -1, -1, 268,
+ 269, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 741, 742,
+ -1, 744, 745, -1, -1, -1, -1, -1, 390, 199,
+ 753, -1, -1, 756, -1, -1, 398, -1, -1, -1,
+ -1, -1, -1, -1, 406, -1, -1, -1, -1, -1,
+ -1, -1, 321, -1, -1, -1, -1, 326, -1, -1,
+ -1, -1, -1, -1, 333, -1, -1, 336, -1, 792,
+ -1, -1, -1, 796, -1, -1, -1, -1, -1, -1,
+ 803, 443, -1, -1, -1, -1, -1, -1, -1, -1,
+ 452, -1, -1, 263, -1, -1, -1, -1, 268, 269,
+ -1, -1, -1, -1, 466, -1, 468, -1, 831, -1,
+ -1, 44, -1, -1, -1, -1, 839, -1, -1, -1,
+ -1, 390, -1, -1, -1, -1, -1, -1, -1, 398,
+ -1, -1, -1, -1, -1, -1, 498, 406, 71, 72,
+ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
+ 83, 321, -1, 86, 87, -1, 326, -1, -1, -1,
+ -1, -1, -1, 333, -1, -1, -1, 529, -1, -1,
+ -1, -1, -1, -1, 443, -1, -1, -1, -1, -1,
+ -1, -1, -1, 452, 117, -1, 119, 120, 121, 122,
+ 123, 124, 125, 126, 127, 128, -1, -1, 921, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 147, -1, -1, -1, -1, -1,
+ 390, 51, 52, -1, -1, 55, -1, -1, 398, 498,
+ 592, -1, -1, -1, -1, -1, 406, -1, -1, 69,
+ 70, 71, 72, 73, 74, 75, 76, 77, -1, -1,
+ 80, 81, -1, -1, 84, 85, 86, 87, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 98, -1,
+ -1, -1, -1, 443, -1, -1, -1, -1, -1, -1,
+ -1, -1, 452, -1, -1, -1, -1, -1, -1, 119,
+ 120, 121, 122, 123, 124, 125, 126, 127, 128, -1,
+ 130, 131, -1, -1, -1, -1, -1, 669, 670, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 148, 149,
+ -1, -1, 684, 592, -1, -1, -1, -1, 498, -1,
+ 692, -1, -1, -1, -1, -1, -1, 699, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 717, 718, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 728, -1, -1, -1,
+ -1, -1, -1, 735, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 747, 748, -1, -1, -1,
+ -1, -1, 754, -1, -1, -1, -1, -1, -1, -1,
+ 669, 670, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 684, -1, -1, -1, -1,
+ -1, -1, 592, 692, 786, -1, -1, -1, -1, -1,
+ -1, 700, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 717, 718,
+ -1, -1, 814, 815, -1, -1, -1, -1, -1, 728,
+ 822, -1, -1, -1, 826, -1, 735, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 747, 748,
+ -1, -1, -1, -1, -1, 754, 71, 72, 73, 74,
+ 75, 76, 77, 78, 79, 80, 81, 82, 83, 669,
+ 670, 86, 87, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 684, -1, -1, -1, 880, -1,
+ -1, -1, 692, -1, 886, -1, 888, -1, -1, 891,
+ -1, -1, 117, -1, 119, 120, 121, 122, 123, 124,
+ 125, 126, 127, 128, -1, 814, 815, 717, 718, -1,
+ -1, -1, -1, 822, -1, -1, -1, 826, 728, -1,
+ -1, -1, -1, -1, -1, 735, -1, -1, 153, -1,
+ -1, -1, -1, -1, -1, -1, -1, 747, 748, -1,
+ -1, -1, -1, -1, 754, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 880, -1, -1, -1, -1, -1, 886, -1, 888,
+ -1, -1, 891, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, -1, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, 12, -1, 814, 815, -1, -1, -1, 19,
+ -1, 21, 22, 23, 24, -1, 826, -1, -1, -1,
+ 30, 31, 32, 33, 34, 35, 36, -1, -1, 39,
+ -1, -1, -1, -1, -1, 45, 46, 47, 48, 49,
+ -1, 51, 52, 53, 54, 55, 56, -1, 58, 59,
+ 60, -1, -1, 63, -1, -1, 66, 67, -1, 69,
+ 70, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 880, -1, -1, -1, -1, -1, 886, -1, 888, 89,
+ -1, 891, 92, 93, -1, 95, 96, 0, 98, -1,
+ 100, 101, 102, 103, 104, 105, 106, -1, -1, 109,
+ 13, 14, 15, 16, 17, 18, -1, 20, -1, -1,
+ -1, -1, -1, -1, 27, 28, 29, -1, -1, 129,
+ 130, 131, -1, -1, 37, 38, -1, 40, 41, 42,
+ 43, 44, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 152, 153, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 71, 72,
+ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
+ 83, -1, -1, 86, 87, 88, -1, 90, 91, -1,
+ -1, -1, -1, -1, 97, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 108, -1, -1, -1, -1,
+ -1, -1, -1, 116, 117, 118, 119, 120, 121, 122,
+ 123, 124, 125, 126, 127, 128, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 0, -1,
+ -1, 144, 145, 146, 147, -1, -1, 150, 151, 152,
+ 153, 13, 14, 15, 16, 17, 18, -1, 20, -1,
+ -1, 44, -1, -1, 26, 27, 28, -1, -1, -1,
+ -1, -1, -1, -1, -1, 37, 38, -1, 40, 41,
+ 42, 43, 44, -1, -1, -1, -1, -1, 71, 72,
+ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
+ 83, -1, -1, 86, 87, -1, -1, -1, -1, 71,
+ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
+ 82, 83, -1, -1, 86, 87, 88, -1, -1, 91,
+ -1, -1, -1, -1, 117, 97, 119, 120, 121, 122,
+ 123, 124, 125, 126, 127, 128, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 117, -1, 119, 120, 121,
+ 122, 123, 124, 125, 126, 127, 128, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 0,
+ -1, 143, 144, 145, 146, 147, -1, 149, 150, 151,
+ 152, 153, 13, 14, 15, 16, 17, 18, -1, 20,
+ -1, -1, 44, -1, -1, -1, 27, 28, 29, -1,
+ -1, -1, -1, -1, -1, -1, 37, 38, -1, 40,
+ 41, 42, 43, 44, -1, -1, -1, -1, -1, 71,
+ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
+ 82, 83, -1, -1, 86, 87, -1, -1, -1, -1,
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ 81, 82, 83, -1, -1, 86, 87, 88, -1, -1,
+ 91, -1, -1, -1, -1, 117, 97, 119, 120, 121,
+ 122, 123, 124, 125, 126, 127, 128, 108, -1, -1,
+ -1, -1, -1, -1, -1, -1, 117, 118, 119, 120,
+ 121, 122, 123, 124, 125, 126, 127, 128, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 0, -1, -1, 144, 145, 146, 147, -1, -1, 150,
+ 151, 152, 153, 13, 14, 15, 16, 17, 18, -1,
+ 20, -1, -1, -1, -1, -1, 26, 27, 28, -1,
+ -1, -1, -1, -1, -1, -1, -1, 37, 38, -1,
+ 40, 41, 42, 43, 44, -1, -1, -1, -1, -1,
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ 81, 82, 83, -1, -1, 86, 87, -1, -1, -1,
+ -1, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, -1, -1, 86, 87, 88, -1,
+ -1, 91, -1, -1, -1, -1, 117, 97, 119, 120,
+ 121, 122, 123, 124, 125, 126, 127, 128, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 117, -1, 119,
+ 120, 121, 122, 123, 124, 125, 126, 127, 128, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 0, -1, 143, 144, 145, 146, 147, -1, 149,
+ 150, 151, 152, 153, 13, 14, 15, 16, 17, 18,
+ -1, 20, -1, -1, -1, -1, -1, -1, 27, 28,
+ -1, -1, -1, -1, -1, -1, -1, -1, 37, 38,
+ -1, 40, 41, 42, 43, 44, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 71, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, -1, -1, 86, 87, 88,
+ -1, -1, 91, 0, -1, -1, -1, -1, 97, -1,
+ -1, -1, -1, -1, -1, -1, 13, 14, 15, -1,
+ 17, 18, -1, 20, -1, -1, -1, -1, 117, 26,
+ 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
+ 37, 38, -1, 40, 41, 42, 43, 44, -1, -1,
+ -1, -1, -1, -1, -1, 144, 145, 146, 147, -1,
+ 149, 150, 151, 152, 153, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 71, 72, 73, 74, 75, 76,
+ 77, 78, 79, 80, 81, 82, 83, -1, -1, 86,
+ 87, 88, -1, 90, -1, 0, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 13, 14,
+ 15, -1, 17, 18, -1, 20, -1, -1, -1, 116,
+ 117, -1, 119, 120, 121, 122, 123, 124, 125, 126,
+ 127, 128, 37, 38, -1, 40, 41, 42, 43, 44,
+ -1, -1, -1, -1, -1, -1, 143, 144, 145, 146,
+ 147, -1, -1, 150, -1, 152, 153, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 71, 72, 73, 74,
+ 75, 76, 77, 78, 79, 80, 81, 82, 83, -1,
+ -1, 86, 87, 88, -1, 90, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 116, 117, -1, 119, 120, 121, 122, 123, 124,
+ 125, 126, 127, 128, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 144,
+ 145, 146, 147, -1, -1, 150, -1, 152, 153, 1,
+ -1, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15, -1, -1, 18, 19, -1, 21,
+ 22, 23, 24, -1, -1, -1, -1, -1, 30, 31,
+ 32, 33, 34, 35, 36, -1, -1, 39, -1, -1,
+ -1, -1, -1, 45, -1, 47, 48, 49, -1, 51,
+ 52, 53, 54, 55, 56, -1, 58, 59, 60, -1,
+ -1, 63, -1, -1, 66, 67, -1, 69, 70, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 89, -1, -1,
+ 92, 93, -1, 95, 96, -1, 98, -1, 100, 101,
+ 102, 103, 104, 105, 106, -1, -1, 109, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 129, 130, 131,
+ -1, -1, -1, -1, -1, -1, -1, -1, 1, -1,
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
+ 152, 153, 15, -1, 17, 18, 19, -1, 21, 22,
+ 23, 24, -1, -1, -1, -1, -1, 30, 31, 32,
+ 33, 34, 35, 36, -1, -1, 39, -1, -1, -1,
+ -1, -1, 45, -1, 47, 48, 49, -1, 51, 52,
+ 53, 54, 55, 56, -1, 58, 59, 60, -1, -1,
+ 63, -1, -1, 66, 67, -1, 69, 70, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 89, -1, -1, 92,
+ 93, -1, 95, 96, -1, 98, -1, 100, 101, 102,
+ 103, 104, 105, 106, -1, -1, 109, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 129, 130, 131, -1,
+ -1, -1, -1, -1, 1, -1, 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, 12, -1, -1, 15, 152,
+ 153, 18, 19, 20, 21, 22, 23, 24, -1, -1,
+ -1, -1, -1, 30, 31, 32, 33, 34, 35, 36,
+ -1, -1, 39, -1, -1, -1, -1, -1, 45, -1,
+ 47, 48, 49, -1, 51, 52, 53, 54, 55, 56,
+ -1, 58, 59, 60, -1, -1, 63, -1, -1, 66,
+ 67, -1, 69, 70, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 89, -1, -1, 92, 93, -1, 95, 96,
+ -1, 98, -1, 100, 101, 102, 103, 104, 105, 106,
+ -1, -1, 109, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 129, 130, 131, -1, -1, -1, -1, -1,
+ 1, -1, 3, 4, 5, 6, 7, 8, 9, 10,
+ 11, 12, -1, -1, 15, 152, 153, 18, 19, -1,
+ 21, 22, 23, 24, -1, -1, -1, -1, -1, 30,
+ 31, 32, 33, 34, 35, 36, -1, -1, 39, -1,
+ -1, -1, -1, -1, 45, -1, 47, 48, 49, -1,
+ 51, 52, 53, 54, 55, 56, -1, 58, 59, 60,
+ -1, -1, 63, -1, -1, 66, 67, -1, 69, 70,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 89, -1,
+ -1, 92, 93, -1, 95, 96, -1, 98, -1, 100,
+ 101, 102, 103, 104, 105, 106, -1, -1, 109, -1,
+ -1, -1, -1, -1, -1, 1, -1, 3, 4, 5,
+ 6, 7, 8, 9, 10, 11, 12, -1, 129, 130,
+ 131, -1, -1, 19, -1, 21, 22, 23, 24, -1,
+ -1, -1, -1, -1, 30, 31, 32, 33, 34, 35,
+ 36, 152, 153, 39, -1, -1, -1, -1, -1, 45,
+ 46, 47, 48, 49, -1, 51, 52, 53, 54, 55,
+ 56, -1, 58, 59, 60, -1, -1, 63, -1, -1,
+ 66, 67, -1, 69, 70, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 89, -1, -1, 92, 93, -1, 95,
+ 96, -1, 98, -1, 100, 101, 102, 103, 104, 105,
+ 106, -1, -1, 109, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 129, 130, 131, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 144, -1,
+ -1, -1, -1, -1, -1, -1, 152, 153, 1, -1,
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
+ -1, 14, 15, -1, -1, -1, 19, -1, 21, 22,
+ 23, 24, -1, -1, -1, -1, -1, 30, 31, 32,
+ 33, 34, 35, 36, -1, -1, 39, -1, -1, -1,
+ -1, -1, 45, -1, 47, 48, 49, -1, 51, 52,
+ 53, 54, 55, 56, -1, 58, 59, 60, -1, -1,
+ 63, -1, -1, 66, 67, -1, 69, 70, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 89, -1, -1, 92,
+ 93, -1, 95, 96, -1, 98, -1, 100, 101, 102,
+ 103, 104, 105, 106, -1, -1, 109, -1, -1, -1,
+ -1, -1, -1, 1, -1, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, -1, 129, 130, 131, -1,
+ -1, 19, -1, 21, 22, 23, 24, -1, -1, -1,
+ -1, -1, 30, 31, 32, 33, 34, 35, 36, 152,
+ 153, 39, -1, -1, -1, -1, -1, 45, -1, 47,
+ 48, 49, -1, 51, 52, 53, 54, 55, 56, -1,
+ 58, 59, 60, -1, -1, 63, -1, -1, 66, 67,
+ -1, 69, 70, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 89, -1, -1, 92, 93, -1, 95, 96, -1,
+ 98, -1, 100, 101, 102, 103, 104, 105, 106, -1,
+ -1, 109, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 129, 130, 131, -1, -1, -1, -1, 1, -1,
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
+ -1, -1, 150, -1, 152, 153, 19, -1, 21, 22,
+ 23, 24, -1, -1, -1, -1, -1, 30, 31, 32,
+ 33, 34, 35, 36, -1, -1, 39, -1, -1, -1,
+ -1, -1, 45, -1, 47, 48, 49, -1, 51, 52,
+ 53, 54, 55, 56, -1, 58, 59, 60, -1, -1,
+ 63, -1, -1, 66, 67, -1, 69, 70, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 89, -1, -1, 92,
+ 93, -1, 95, 96, -1, 98, -1, 100, 101, 102,
+ 103, 104, 105, 106, -1, -1, 109, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 129, 130, 131, -1,
+ -1, -1, -1, 1, -1, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, -1, -1, 150, -1, 152,
+ 153, 19, -1, 21, 22, 23, 24, -1, -1, -1,
+ -1, -1, 30, 31, 32, 33, 34, 35, 36, -1,
+ -1, 39, -1, -1, -1, -1, -1, 45, -1, 47,
+ 48, 49, -1, 51, 52, 53, 54, 55, 56, -1,
+ 58, 59, 60, -1, -1, 63, -1, -1, 66, 67,
+ -1, 69, 70, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 89, -1, -1, 92, 93, -1, 95, 96, -1,
+ 98, -1, 100, 101, 102, 103, 104, 105, 106, -1,
+ -1, 109, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 129, 130, 131, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 144, -1, -1, -1,
+ -1, -1, -1, -1, 152, 153, 1, -1, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, -1, -1,
+ 15, -1, -1, -1, 19, -1, 21, 22, 23, 24,
+ -1, -1, -1, -1, -1, 30, 31, 32, 33, 34,
+ 35, 36, -1, -1, 39, -1, -1, -1, -1, -1,
+ 45, -1, 47, 48, 49, -1, 51, 52, 53, 54,
+ 55, 56, -1, 58, 59, 60, -1, -1, 63, -1,
+ -1, 66, 67, -1, 69, 70, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 89, -1, -1, 92, 93, -1,
+ 95, 96, -1, 98, -1, 100, 101, 102, 103, 104,
+ 105, 106, -1, -1, 109, -1, -1, -1, -1, -1,
+ -1, -1, -1, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, -1, -1, 129, 130, 131, -1, -1, 19,
+ -1, 21, 22, 23, 24, -1, -1, -1, -1, -1,
+ 30, 31, 32, 33, 34, 35, 36, 152, 153, 39,
+ -1, -1, -1, -1, -1, -1, -1, -1, 48, 49,
+ -1, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, -1, -1, 63, -1, -1, 66, 67, -1, 69,
+ 70, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 89,
+ -1, -1, 92, 93, -1, 95, 96, -1, 98, 99,
+ 100, 101, 102, 103, 104, 105, 106, -1, -1, 109,
+ -1, -1, -1, -1, -1, -1, 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, -1, -1, -1, -1, 129,
+ 130, 131, 19, -1, 21, 22, 23, 24, -1, -1,
+ -1, -1, -1, 30, 31, 32, 33, 34, 35, 36,
+ -1, -1, 39, 153, -1, -1, -1, -1, -1, -1,
+ -1, 48, 49, -1, 51, 52, 53, 54, 55, 56,
+ -1, 58, 59, 60, -1, -1, 63, -1, -1, 66,
+ 67, -1, 69, 70, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 89, -1, -1, 92, 93, -1, 95, 96,
+ -1, -1, -1, 100, 101, 102, 103, 104, 105, 106,
+ -1, -1, 109, -1, -1, -1, -1, -1, -1, -1,
+ -1, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+ -1, -1, 129, 130, 131, -1, -1, 19, -1, 21,
+ 22, 23, 24, -1, -1, -1, -1, -1, 30, 31,
+ 32, 33, 34, 35, 36, 152, 153, 39, -1, -1,
+ -1, -1, -1, -1, -1, -1, 48, 49, -1, 51,
+ 52, 53, 54, 55, 56, -1, 58, 59, 60, -1,
+ -1, 63, -1, -1, 66, 67, -1, 69, 70, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 89, -1, -1,
+ 92, 93, -1, 95, 96, -1, -1, -1, 100, 101,
+ 102, 103, 104, 105, 106, -1, -1, 109, -1, -1,
+ -1, -1, -1, -1, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, 12, -1, -1, -1, 129, 130, 131,
+ 19, -1, 21, 22, 23, 24, -1, -1, -1, -1,
+ -1, 30, 31, 32, 33, 34, 35, 36, -1, -1,
+ 39, 153, -1, -1, -1, -1, 45, 46, 47, 48,
+ 49, -1, 51, 52, 53, 54, 55, 56, -1, 58,
+ 59, 60, -1, -1, 63, -1, -1, 66, 67, -1,
+ 69, 70, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 89, -1, -1, 92, 93, -1, 95, 96, -1, 98,
+ -1, 100, 101, 102, 103, 104, 105, 106, -1, -1,
+ 109, -1, -1, -1, -1, -1, -1, -1, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, -1, -1,
+ 129, 130, 131, -1, 19, -1, 21, 22, 23, 24,
+ -1, -1, -1, -1, -1, 30, 31, 32, 33, 34,
+ 35, 36, -1, 152, 39, -1, -1, -1, -1, -1,
+ 45, -1, 47, 48, 49, -1, 51, 52, 53, 54,
+ 55, 56, -1, 58, 59, 60, -1, -1, 63, -1,
+ -1, 66, 67, -1, 69, 70, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 89, -1, -1, 92, 93, -1,
+ 95, 96, -1, 98, -1, 100, 101, 102, 103, 104,
+ 105, 106, -1, -1, 109, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 129, 130, 131, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 152, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, -1, -1, -1, 30, 31, 32, 33, 34,
+ 35, 36, 37, 38, 39, -1, -1, -1, -1, -1,
+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
+ 55, 56, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 69, 70, 71, 72, 73, 74,
+ 75, 76, 77, -1, -1, 80, 81, -1, -1, 84,
+ 85, 86, 87, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 98, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 119, 120, 121, 122, 123, 124,
+ 125, 126, 127, 128, -1, 130, 131, -1, -1, 3,
+ 4, 5, 6, 7, 8, 9, 10, 11, -1, -1,
+ -1, -1, -1, 148, 149, 19, -1, 21, 22, 23,
+ 24, -1, 26, -1, -1, -1, 30, 31, 32, 33,
+ 34, 35, 36, -1, -1, 39, -1, -1, -1, -1,
+ -1, -1, -1, -1, 48, 49, -1, 51, 52, 53,
+ 54, 55, 56, 57, 58, 59, 60, -1, -1, 63,
+ -1, -1, 66, 67, -1, 69, 70, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 89, -1, -1, 92, 93,
+ -1, 95, 96, -1, 98, 99, 100, 101, 102, 103,
+ 104, 105, 106, -1, -1, 109, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 129, 130, 131, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, -1, -1, 143,
+ -1, -1, -1, -1, 19, 149, 21, 22, 23, 24,
+ -1, 26, -1, -1, -1, 30, 31, 32, 33, 34,
+ 35, 36, -1, -1, 39, -1, -1, -1, -1, -1,
+ -1, -1, -1, 48, 49, -1, 51, 52, 53, 54,
+ 55, 56, 57, 58, 59, 60, -1, -1, 63, -1,
+ -1, 66, 67, -1, 69, 70, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 89, -1, -1, 92, 93, -1,
+ 95, 96, -1, 98, 99, 100, 101, 102, 103, 104,
+ 105, 106, -1, -1, 109, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 129, 130, 131, 3, 4, 5,
+ 6, 7, 8, 9, 10, 11, -1, -1, 143, -1,
+ -1, -1, -1, 19, 149, 21, 22, 23, 24, -1,
+ -1, -1, -1, -1, 30, 31, 32, 33, 34, 35,
+ 36, -1, -1, 39, -1, -1, -1, -1, -1, -1,
+ -1, -1, 48, 49, -1, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, -1, -1, 63, -1, -1,
+ 66, 67, -1, 69, 70, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 89, 90, -1, 92, 93, -1, 95,
+ 96, -1, 98, 99, 100, 101, 102, 103, 104, 105,
+ 106, -1, -1, 109, -1, -1, -1, -1, -1, -1,
+ 116, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 129, 130, 131, 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, -1, -1, -1, -1, -1,
+ -1, -1, 19, 149, 21, 22, 23, 24, -1, -1,
+ -1, -1, -1, 30, 31, 32, 33, 34, 35, 36,
+ -1, -1, 39, -1, -1, -1, -1, -1, -1, -1,
+ -1, 48, 49, -1, 51, 52, 53, 54, 55, 56,
+ 57, 58, 59, 60, -1, -1, 63, -1, -1, 66,
+ 67, -1, 69, 70, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 89, -1, -1, 92, 93, -1, 95, 96,
+ -1, 98, 99, 100, 101, 102, 103, 104, 105, 106,
+ -1, -1, 109, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 129, 130, 131, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, -1, -1, -1, -1, -1, -1,
+ -1, 19, 149, 21, 22, 23, 24, -1, -1, -1,
+ -1, -1, 30, 31, 32, 33, 34, 35, 36, -1,
+ -1, 39, -1, -1, -1, -1, -1, -1, -1, -1,
+ 48, 49, -1, 51, 52, 53, 54, 55, 56, 57,
+ 58, 59, 60, -1, -1, 63, -1, -1, 66, 67,
+ -1, 69, 70, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 89, -1, -1, 92, 93, -1, 95, 96, -1,
+ 98, 99, 100, 101, 102, 103, 104, 105, 106, -1,
+ -1, 109, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 129, 130, 131, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 149, 3, 4, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, -1, -1, -1, 30,
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, -1,
+ -1, -1, -1, -1, 45, 46, 47, 48, 49, 50,
+ 51, 52, 53, 54, 55, 56, -1, -1, -1, -1,
+ -1, -1, 63, -1, -1, -1, -1, -1, 69, 70,
+ 71, 72, 73, 74, 75, 76, 77, -1, -1, 80,
+ 81, -1, -1, 84, 85, 86, 87, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 98, -1, -1,
+ -1, -1, -1, -1, 105, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 119, 120,
+ 121, 122, 123, 124, 125, 126, 127, 128, -1, 130,
+ 131, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 148, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, -1, -1, -1, 30, 31, 32, 33, 34,
+ 35, 36, 37, 38, 39, -1, -1, -1, -1, -1,
+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
+ 55, 56, -1, -1, -1, -1, -1, -1, 63, -1,
+ -1, -1, -1, -1, 69, 70, 71, 72, 73, 74,
+ 75, 76, 77, -1, -1, 80, 81, -1, -1, 84,
+ 85, 86, 87, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 98, -1, -1, -1, -1, -1, -1,
+ 105, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 119, 120, 121, 122, 123, 124,
+ 125, 126, 127, 128, -1, 130, 131, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 148, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24, 25, 26, -1, -1,
+ -1, 30, 31, 32, 33, 34, 35, 36, 37, 38,
+ 39, -1, -1, -1, -1, -1, 45, 46, 47, 48,
+ 49, 50, 51, 52, -1, -1, 55, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 69, 70, 71, 72, 73, 74, 75, 76, 77, -1,
+ -1, 80, 81, -1, -1, 84, 85, 86, 87, -1,
+ -1, 71, 72, 73, 74, 75, 76, 77, -1, 98,
+ 80, 81, 101, -1, -1, -1, 86, 87, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
+ -1, 130, 131, -1, -1, -1, -1, -1, -1, 119,
+ 120, 121, 122, 123, 124, 125, 126, 127, 128, 148,
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
+ 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
+ 23, 24, 25, 26, -1, -1, -1, 30, 31, 32,
+ 33, 34, 35, 36, 37, 38, 39, -1, -1, -1,
+ -1, -1, 45, 46, 47, 48, 49, 50, 51, 52,
+ -1, -1, 55, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 69, 70, 71, 72,
+ 73, 74, 75, 76, 77, -1, -1, 80, 81, -1,
+ -1, 84, 85, 86, 87, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 98, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 119, 120, 121, 122,
+ 123, 124, 125, 126, 127, 128, -1, 130, 131, -1,
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, -1,
+ -1, -1, -1, -1, -1, 148, 19, -1, 21, 22,
+ 23, 24, -1, -1, -1, -1, -1, 30, 31, 32,
+ 33, 34, 35, 36, -1, -1, 39, -1, -1, -1,
+ -1, -1, -1, -1, -1, 48, 49, -1, 51, 52,
+ 53, 54, 55, 56, -1, 58, 59, 60, -1, -1,
+ 63, -1, -1, 66, 67, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 89, -1, -1, 92,
+ 93, -1, 95, 96, -1, -1, -1, 100, 101, 102,
+ 103, 104, 105, 106, -1, -1, 109, -1, -1, 3,
+ 4, 5, 6, 7, 8, 9, 10, 11, -1, -1,
+ -1, -1, -1, -1, -1, 19, 129, 21, 22, 23,
+ 24, -1, -1, -1, -1, -1, 30, 31, 32, 33,
+ 34, 35, 36, -1, 147, 39, -1, -1, -1, -1,
+ -1, -1, -1, -1, 48, 49, -1, 51, 52, 53,
+ 54, 55, 56, -1, 58, 59, 60, -1, -1, 63,
+ -1, -1, 66, 67, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 89, -1, -1, 92, 93,
+ -1, 95, 96, -1, -1, -1, 100, 101, 102, 103,
+ 104, 105, 106, -1, -1, 109, -1, -1, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, -1, -1, -1,
+ -1, -1, -1, -1, 19, 129, 21, 22, 23, 24,
+ -1, -1, -1, -1, -1, 30, 31, 32, 33, 34,
+ 35, 36, -1, 147, 39, -1, -1, -1, -1, -1,
+ -1, -1, -1, 48, 49, -1, 51, 52, 53, 54,
+ 55, 56, 57, 58, 59, 60, -1, -1, 63, -1,
+ -1, 66, 67, -1, 69, 70, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 89, -1, -1, 92, 93, -1,
+ 95, 96, -1, 98, 99, 100, 101, 102, 103, 104,
+ 105, 106, -1, -1, 109, 110, -1, -1, 113, 114,
+ -1, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+ 12, -1, -1, -1, 129, 130, 131, 19, -1, 21,
+ 22, 23, 24, -1, -1, -1, -1, -1, 30, 31,
+ 32, 33, 34, 35, 36, -1, -1, 39, -1, -1,
+ -1, -1, -1, 45, 46, 47, 48, 49, -1, 51,
+ 52, 53, 54, 55, 56, -1, 58, 59, 60, -1,
+ -1, 63, -1, -1, 66, 67, -1, 69, 70, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 89, -1, -1,
+ 92, 93, -1, 95, 96, -1, 98, -1, 100, 101,
+ 102, 103, 104, 105, 106, -1, -1, 109, -1, -1,
+ -1, -1, -1, -1, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, -1, -1, -1, -1, 129, 130, 131,
+ 19, -1, 21, 22, 23, 24, -1, -1, -1, -1,
+ -1, 30, 31, 32, 33, 34, 35, 36, -1, -1,
+ 39, -1, -1, -1, -1, -1, -1, -1, -1, 48,
+ 49, -1, 51, 52, 53, 54, 55, 56, 57, 58,
+ 59, 60, -1, -1, 63, -1, -1, 66, 67, -1,
+ 69, 70, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 89, -1, -1, 92, 93, -1, 95, 96, -1, 98,
+ -1, 100, 101, 102, 103, 104, 105, 106, -1, -1,
+ 109, 110, -1, -1, 113, 114, -1, 3, 4, 5,
+ 6, 7, 8, 9, 10, 11, 12, -1, -1, -1,
+ 129, 130, 131, 19, -1, 21, 22, 23, 24, -1,
+ -1, -1, -1, -1, 30, 31, 32, 33, 34, 35,
+ 36, -1, -1, 39, -1, -1, -1, -1, -1, 45,
+ -1, 47, 48, 49, -1, 51, 52, 53, 54, 55,
+ 56, -1, 58, 59, 60, -1, -1, 63, -1, -1,
+ 66, 67, -1, 69, 70, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 89, -1, -1, 92, 93, -1, 95,
+ 96, -1, 98, -1, 100, 101, 102, 103, 104, 105,
+ 106, -1, -1, 109, -1, -1, -1, -1, -1, -1,
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, -1,
+ -1, -1, -1, 129, 130, 131, 19, -1, 21, 22,
+ 23, 24, -1, -1, -1, -1, -1, 30, 31, 32,
+ 33, 34, 35, 36, -1, -1, 39, -1, -1, -1,
+ -1, -1, -1, -1, -1, 48, 49, -1, 51, 52,
+ 53, 54, 55, 56, -1, 58, 59, 60, -1, -1,
+ 63, -1, -1, 66, 67, -1, 69, 70, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 89, -1, -1, 92,
+ 93, -1, 95, 96, -1, 98, -1, 100, 101, 102,
+ 103, 104, 105, 106, -1, -1, 109, 110, -1, -1,
+ 113, 114, -1, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, -1, -1, -1, -1, 129, 130, 131, 19,
+ -1, 21, 22, 23, 24, -1, -1, -1, -1, -1,
+ 30, 31, 32, 33, 34, 35, 36, -1, -1, 39,
+ -1, -1, -1, -1, -1, -1, -1, -1, 48, 49,
+ -1, 51, 52, 53, 54, 55, 56, -1, 58, 59,
+ 60, -1, -1, 63, -1, -1, 66, 67, -1, 69,
+ 70, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 89,
+ -1, -1, 92, 93, -1, 95, 96, -1, 98, -1,
+ 100, 101, 102, 103, 104, 105, 106, -1, -1, 109,
+ 110, -1, -1, 113, 114, -1, 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, -1, -1, -1, -1, 129,
+ 130, 131, 19, -1, 21, 22, 23, 24, -1, -1,
+ -1, -1, -1, 30, 31, 32, 33, 34, 35, 36,
+ -1, -1, 39, -1, -1, -1, -1, -1, -1, -1,
+ -1, 48, 49, -1, 51, 52, 53, 54, 55, 56,
+ -1, 58, 59, 60, -1, -1, 63, -1, -1, 66,
+ 67, -1, 69, 70, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 89, -1, -1, 92, 93, -1, 95, 96,
+ -1, 98, -1, 100, 101, 102, 103, 104, 105, 106,
+ -1, -1, 109, 110, -1, -1, 113, 114, -1, 3,
+ 4, 5, 6, 7, 8, 9, 10, 11, -1, -1,
+ -1, -1, 129, 130, 131, 19, -1, 21, 22, 23,
+ 24, -1, -1, -1, -1, -1, 30, 31, 32, 33,
+ 34, 35, 36, -1, -1, 39, -1, -1, -1, -1,
+ -1, -1, -1, -1, 48, 49, -1, 51, 52, 53,
+ 54, 55, 56, 57, 58, 59, 60, -1, -1, 63,
+ -1, -1, 66, 67, -1, 69, 70, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 89, -1, -1, 92, 93,
+ -1, 95, 96, -1, 98, 99, 100, 101, 102, 103,
+ 104, 105, 106, -1, -1, 109, -1, -1, -1, -1,
+ -1, -1, 3, 4, 5, 6, 7, 8, 9, 10,
+ 11, -1, -1, -1, -1, 129, 130, 131, 19, -1,
+ 21, 22, 23, 24, -1, -1, -1, -1, -1, 30,
+ 31, 32, 33, 34, 35, 36, -1, -1, 39, -1,
+ -1, -1, -1, -1, -1, -1, -1, 48, 49, -1,
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
+ -1, -1, 63, -1, -1, 66, 67, -1, 69, 70,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 89, -1,
+ -1, 92, 93, -1, 95, 96, -1, 98, -1, 100,
+ 101, 102, 103, 104, 105, 106, -1, -1, 109, -1,
+ -1, -1, -1, -1, -1, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, -1, -1, -1, -1, 129, 130,
+ 131, 19, -1, 21, 22, 23, 24, -1, -1, -1,
+ -1, -1, 30, 31, 32, 33, 34, 35, 36, -1,
+ -1, 39, -1, -1, -1, -1, -1, -1, -1, -1,
+ 48, 49, -1, 51, 52, 53, 54, 55, 56, 57,
+ 58, 59, 60, -1, -1, 63, -1, -1, 66, 67,
+ -1, 69, 70, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 89, -1, -1, 92, 93, -1, 95, 96, -1,
+ -1, 99, 100, 101, 102, 103, 104, 105, 106, -1,
+ -1, 109, -1, -1, -1, -1, -1, -1, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, -1, -1, -1,
+ -1, 129, 130, 131, 19, -1, 21, 22, 23, 24,
+ -1, -1, -1, -1, -1, 30, 31, 32, 33, 34,
+ 35, 36, -1, -1, 39, -1, -1, -1, -1, -1,
+ -1, -1, -1, 48, 49, -1, 51, 52, 53, 54,
+ 55, 56, 57, 58, 59, 60, -1, -1, 63, -1,
+ -1, 66, 67, -1, 69, 70, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 89, -1, -1, 92, 93, -1,
+ 95, 96, -1, -1, -1, 100, 101, 102, 103, 104,
+ 105, 106, -1, -1, 109, -1, -1, -1, -1, -1,
+ -1, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+ -1, -1, -1, -1, 129, 130, 131, 19, -1, 21,
+ 22, 23, 24, -1, -1, -1, -1, -1, 30, 31,
+ 32, 33, 34, 35, 36, -1, -1, 39, -1, -1,
+ -1, -1, -1, -1, -1, -1, 48, 49, -1, 51,
+ 52, 53, 54, 55, 56, -1, 58, 59, 60, -1,
+ -1, 63, -1, -1, 66, 67, -1, 69, 70, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 89, -1, -1,
+ 92, 93, -1, 95, 96, -1, 98, -1, 100, 101,
+ 102, 103, 104, 105, 106, -1, -1, 109, -1, -1,
+ -1, -1, -1, -1, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, -1, -1, -1, -1, 129, 130, 131,
+ 19, -1, 21, 22, 23, 24, -1, -1, -1, -1,
+ -1, 30, 31, 32, 33, 34, 35, 36, -1, -1,
+ 39, -1, -1, -1, -1, -1, -1, -1, -1, 48,
+ 49, -1, 51, 52, 53, 54, 55, 56, -1, 58,
+ 59, 60, -1, -1, 63, -1, -1, 66, 67, -1,
+ 69, 70, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 89, -1, -1, 92, 93, -1, 95, 96, -1, 98,
+ -1, 100, 101, 102, 103, 104, 105, 106, -1, -1,
+ 109, -1, -1, -1, -1, -1, -1, 3, 4, 5,
+ 6, 7, 8, 9, 10, 11, -1, -1, -1, -1,
+ 129, 130, 131, 19, -1, 21, 22, 23, 24, -1,
+ -1, -1, -1, -1, 30, 31, 32, 33, 34, 35,
+ 36, -1, -1, 39, -1, -1, -1, -1, -1, -1,
+ -1, -1, 48, 49, -1, 51, 52, 53, 54, 55,
+ 56, -1, 58, 59, 60, -1, -1, 63, -1, -1,
+ 66, 67, -1, 69, 70, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 89, -1, -1, 92, 93, -1, 95,
+ 96, -1, 98, -1, 100, 101, 102, 103, 104, 105,
+ 106, -1, -1, 109, -1, -1, -1, -1, -1, -1,
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, -1,
+ -1, -1, -1, 129, 130, 131, 19, -1, 21, 22,
+ 23, 24, -1, -1, -1, -1, -1, 30, 31, 32,
+ 33, 34, 35, 36, -1, -1, 39, -1, -1, -1,
+ -1, -1, -1, -1, -1, 48, 49, -1, 51, 52,
+ 53, 54, 55, 56, -1, 58, 59, 60, -1, -1,
+ 63, -1, -1, 66, 67, -1, 69, 70, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 89, -1, -1, 92,
+ 93, -1, 95, 96, -1, -1, -1, 100, 101, 102,
+ 103, 104, 105, 106, -1, -1, 109, -1, -1, -1,
+ -1, -1, -1, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, -1, -1, -1, -1, 129, 130, 131, 19,
+ -1, 21, 22, 23, 24, -1, -1, -1, -1, -1,
+ 30, 31, 32, 33, 34, 35, 36, -1, -1, 39,
+ -1, -1, -1, -1, -1, -1, -1, -1, 48, 49,
+ -1, 51, 52, 53, 54, 55, 56, -1, 58, 59,
+ 60, -1, -1, 63, -1, -1, 66, 67, -1, 69,
+ 70, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 89,
+ -1, -1, 92, 93, -1, 95, 96, -1, -1, -1,
+ 100, 101, 102, 103, 104, 105, 106, -1, -1, 109,
+ -1, -1, -1, -1, -1, -1, 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, -1, -1, -1, -1, 129,
+ 130, 131, 19, -1, 21, 22, 23, 24, -1, -1,
+ -1, -1, -1, 30, 31, 32, 33, 34, 35, 36,
+ -1, -1, 39, -1, -1, -1, -1, -1, -1, -1,
+ -1, 48, 49, -1, 51, 52, 53, 54, 55, 56,
+ -1, 58, 59, 60, -1, -1, 63, -1, -1, 66,
+ 67, -1, 69, 70, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 89, -1, -1, 92, 93, -1, 95, 96,
+ -1, -1, -1, 100, 101, 102, 103, 104, 105, 106,
+ -1, -1, 109, -1, -1, -1, -1, -1, -1, 3,
+ 4, 5, 6, 7, 8, 9, 10, 11, -1, -1,
+ -1, -1, 129, 130, 131, 19, -1, 21, 22, 23,
+ 24, -1, -1, -1, -1, -1, 30, 31, 32, 33,
+ 34, 35, 36, -1, -1, 39, -1, -1, -1, -1,
+ -1, -1, -1, -1, 48, 49, -1, 51, 52, 53,
+ 54, 55, 56, -1, 58, 59, 60, -1, -1, 63,
+ -1, -1, 66, 67, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 86, -1, -1, 89, -1, -1, 92, 93,
+ -1, 95, 96, -1, -1, -1, 100, 101, 102, 103,
+ 104, 105, 106, -1, -1, 109, -1, -1, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, -1, -1, -1,
+ -1, -1, -1, -1, 19, 129, 21, 22, 23, 24,
+ -1, -1, -1, -1, -1, 30, 31, 32, 33, 34,
+ 35, 36, -1, -1, 39, -1, -1, -1, -1, -1,
+ -1, -1, -1, 48, 49, -1, 51, 52, 53, 54,
+ 55, 56, -1, 58, 59, 60, -1, -1, 63, -1,
+ -1, 66, 67, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 89, -1, -1, 92, 93, -1,
+ 95, 96, -1, 98, -1, 100, 101, 102, 103, 104,
+ 105, 106, -1, -1, 109, -1, -1, 3, 4, 5,
+ 6, 7, 8, 9, 10, 11, -1, -1, -1, -1,
+ -1, -1, -1, 19, 129, 21, 22, 23, 24, -1,
+ -1, -1, -1, -1, 30, 31, 32, 33, 34, 35,
+ 36, -1, -1, 39, -1, -1, -1, -1, -1, -1,
+ -1, -1, 48, 49, -1, 51, 52, 53, 54, 55,
+ 56, -1, 58, 59, 60, -1, -1, 63, -1, -1,
+ 66, 67, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 89, -1, -1, 92, 93, -1, 95,
+ 96, -1, 98, -1, 100, 101, 102, 103, 104, 105,
+ 106, -1, -1, 109, -1, -1, 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, -1, -1, -1, -1, -1,
+ -1, -1, 19, 129, 21, 22, 23, 24, -1, -1,
+ -1, -1, -1, 30, 31, 32, 33, 34, 35, 36,
+ -1, -1, 39, -1, -1, -1, -1, -1, -1, -1,
+ -1, 48, 49, -1, 51, 52, 53, 54, 55, 56,
+ -1, 58, 59, 60, -1, -1, 63, -1, -1, 66,
+ 67, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 89, -1, -1, 92, 93, -1, 95, 96,
+ -1, -1, -1, 100, 101, 102, 103, 104, 105, 106,
+ -1, -1, 109, -1, -1, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, -1, -1, -1, -1, -1, -1,
+ -1, 19, 129, 21, 22, 23, 24, -1, -1, -1,
+ -1, -1, 30, 31, 32, 33, 34, 35, 36, -1,
+ -1, 39, -1, -1, -1, -1, -1, -1, -1, -1,
+ 48, 49, -1, 51, 52, 53, 54, 55, 56, -1,
+ 58, 59, 60, -1, -1, 63, -1, -1, 66, 67,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 89, -1, -1, 92, 93, -1, 95, 96, -1,
+ -1, -1, 100, 101, 102, 103, 104, 105, 106, -1,
+ -1, 109, -1, -1, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, -1, -1, -1, -1, -1, -1, -1,
+ 19, 129, 21, 22, 23, 24, -1, -1, -1, -1,
+ -1, 30, 31, 32, 33, 34, 35, 36, -1, -1,
+ 39, -1, -1, -1, -1, -1, -1, -1, -1, 48,
+ 49, -1, 51, 52, 53, 54, 55, 56, -1, 58,
+ 59, 60, -1, -1, 63, -1, -1, 66, 67, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 89, -1, -1, 92, 93, -1, 95, 96, -1, -1,
+ -1, 100, 101, 102, 103, 104, 105, 106, -1, -1,
+ 109, -1, -1, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, -1, -1, -1, -1, -1, -1, -1, 19,
+ 129, 21, 22, 23, 24, -1, -1, -1, -1, -1,
+ 30, 31, 32, 33, 34, 35, 36, -1, -1, 39,
+ -1, -1, -1, -1, -1, -1, -1, -1, 48, 49,
+ -1, 51, 52, 53, 54, 55, 56, -1, 58, 59,
+ 60, -1, -1, 63, -1, -1, 66, 67, -1, 71,
+ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
+ 82, 83, -1, -1, 86, 87, -1, -1, -1, 89,
+ -1, -1, 92, 93, -1, 95, 96, -1, -1, -1,
+ 100, 101, 102, 103, 104, 105, 106, -1, -1, 109,
+ -1, -1, 51, 52, -1, -1, 55, 119, 120, 121,
+ 122, 123, 124, 125, 126, 127, 128, -1, -1, 129,
+ 69, 70, 71, 72, 73, 74, 75, 76, 77, -1,
+ -1, 80, 81, -1, -1, 84, 85, 86, 87, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 98,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
+ -1, 130, 131, 51, 52, -1, -1, 55, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 148,
+ 149, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+ -1, -1, 80, 81, -1, -1, 84, 85, 86, 87,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 98, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 119, 120, 121, 122, 123, 124, 125, 126, 127,
+ 128, -1, 130, 131, 51, 52, -1, -1, 55, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 148, 149, 69, 70, 71, 72, 73, 74, 75, 76,
+ 77, -1, -1, 80, 81, -1, -1, 84, 85, 86,
+ 87, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 98, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 119, 120, 121, 122, 123, 124, 125, 126,
+ 127, 128, -1, 130, 131, 51, 52, -1, -1, 55,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 148, 149, 69, 70, 71, 72, 73, 74, 75,
+ 76, 77, -1, -1, 80, 81, -1, -1, 84, 85,
+ 86, 87, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 98, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 119, 120, 121, 122, 123, 124, 125,
+ 126, 127, 128, -1, 130, 131, 51, 52, -1, -1,
+ 55, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 148, 149, 69, 70, 71, 72, 73, 74,
+ 75, 76, 77, -1, -1, 80, 81, -1, -1, 84,
+ 85, 86, 87, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 98, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 119, 120, 121, 122, 123, 124,
+ 125, 126, 127, 128, -1, 130, 131, 51, 52, -1,
+ -1, 55, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 148, 149, 69, 70, 71, 72, 73,
+ 74, 75, 76, 77, -1, -1, 80, 81, -1, -1,
+ 84, 85, 86, 87, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 98, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 119, 120, 121, 122, 123,
+ 124, 125, 126, 127, 128, -1, 130, 131, 51, 52,
+ -1, -1, 55, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 148, 149, 69, 70, 71, 72,
+ 73, 74, 75, 76, 77, -1, -1, 80, 81, -1,
+ -1, 84, 85, 86, 87, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 98, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 119, 120, 121, 122,
+ 123, 124, 125, 126, 127, 128, -1, 130, 131, 51,
+ 52, -1, -1, 55, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 148, 149, 69, 70, 71,
+ 72, 73, 74, 75, 76, 77, -1, -1, 80, 81,
+ -1, -1, 84, 85, 86, 87, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 98, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 119, 120, 121,
+ 122, 123, 124, 125, 126, 127, 128, -1, 130, 131,
+ 51, 52, -1, -1, 55, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 148, 149, 69, 70,
+ 71, 72, 73, 74, 75, 76, 77, -1, -1, 80,
+ 81, -1, -1, 84, 85, 86, 87, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 98, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 119, 120,
+ 121, 122, 123, 124, 125, 126, 127, 128, -1, 130,
+ 131, 51, 52, -1, -1, 55, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 148, 149, 69,
+ 70, 71, 72, 73, 74, 75, 76, 77, -1, -1,
+ 80, 81, -1, -1, 84, 85, 86, 87, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 98, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 119,
+ 120, 121, 122, 123, 124, 125, 126, 127, 128, -1,
+ 130, 131, 51, 52, -1, -1, 55, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 148, 149,
+ 69, 70, 71, 72, 73, 74, 75, 76, 77, -1,
+ -1, 80, 81, -1, -1, 84, 85, 86, 87, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 98,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
+ -1, 130, 131, 51, 52, -1, -1, 55, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 148,
+ 149, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+ -1, -1, 80, 81, -1, -1, 84, 85, 86, 87,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 98, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 119, 120, 121, 122, 123, 124, 125, 126, 127,
+ 128, -1, 130, 131, 51, 52, -1, -1, 55, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 148, 149, 69, 70, 71, 72, 73, 74, 75, 76,
+ 77, -1, -1, 80, 81, -1, -1, 84, 85, 86,
+ 87, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 98, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 119, 120, 121, 122, 123, 124, 125, 126,
+ 127, 128, -1, 130, 131, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 148
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+ symbol of state STATE-NUM. */
+static const yytype_uint16 yystos[] =
+{
+ 0, 155, 156, 0, 1, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 19, 21, 22, 23, 24,
+ 30, 31, 32, 33, 34, 35, 36, 39, 45, 46,
+ 47, 48, 49, 51, 52, 53, 54, 55, 56, 58,
+ 59, 60, 63, 66, 67, 69, 70, 89, 92, 93,
+ 95, 96, 98, 100, 101, 102, 103, 104, 105, 106,
+ 109, 129, 130, 131, 157, 158, 159, 164, 166, 167,
+ 169, 170, 173, 174, 176, 177, 178, 180, 181, 190,
+ 203, 223, 242, 243, 253, 254, 258, 259, 260, 267,
+ 268, 269, 271, 272, 273, 274, 275, 276, 300, 313,
+ 159, 21, 22, 30, 31, 32, 39, 51, 55, 86,
+ 89, 92, 129, 182, 183, 203, 223, 273, 276, 300,
+ 183, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, 26, 30, 31, 32, 33, 34,
+ 35, 36, 37, 38, 39, 45, 46, 47, 48, 49,
+ 50, 51, 52, 55, 69, 70, 71, 72, 73, 74,
+ 75, 76, 77, 80, 81, 84, 85, 86, 87, 98,
+ 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
+ 130, 131, 148, 149, 184, 188, 189, 275, 295, 204,
+ 89, 167, 168, 181, 223, 273, 274, 276, 168, 209,
+ 211, 89, 174, 181, 223, 228, 273, 276, 33, 34,
+ 35, 36, 48, 49, 51, 55, 101, 184, 185, 186,
+ 269, 152, 153, 168, 304, 309, 310, 312, 57, 98,
+ 99, 130, 173, 190, 191, 196, 199, 201, 298, 299,
+ 196, 196, 149, 197, 198, 149, 193, 197, 149, 305,
+ 310, 185, 160, 143, 190, 223, 190, 55, 1, 92,
+ 162, 163, 164, 175, 176, 313, 205, 207, 192, 201,
+ 298, 313, 191, 297, 298, 313, 89, 147, 180, 223,
+ 273, 276, 208, 53, 54, 56, 63, 105, 184, 270,
+ 62, 64, 65, 111, 112, 255, 256, 63, 255, 63,
+ 255, 63, 255, 61, 255, 58, 59, 169, 190, 190,
+ 304, 312, 40, 41, 42, 43, 44, 37, 38, 28,
+ 240, 116, 147, 92, 98, 177, 116, 71, 72, 73,
+ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
+ 86, 87, 117, 119, 120, 121, 122, 123, 124, 125,
+ 126, 127, 128, 88, 145, 146, 88, 146, 303, 26,
+ 143, 244, 90, 90, 193, 197, 244, 167, 51, 55,
+ 182, 58, 59, 1, 120, 277, 309, 88, 145, 146,
+ 218, 296, 219, 303, 161, 162, 55, 16, 224, 309,
+ 116, 88, 145, 146, 90, 90, 224, 168, 168, 55,
+ 88, 145, 146, 25, 105, 147, 311, 304, 20, 247,
+ 152, 191, 191, 191, 91, 147, 200, 313, 147, 200,
+ 196, 305, 306, 196, 195, 196, 201, 298, 313, 167,
+ 306, 167, 165, 143, 162, 88, 146, 90, 164, 175,
+ 150, 304, 312, 306, 167, 306, 151, 147, 308, 310,
+ 147, 308, 144, 308, 55, 177, 178, 179, 147, 88,
+ 145, 146, 51, 53, 54, 55, 56, 92, 98, 99,
+ 123, 126, 149, 238, 280, 281, 282, 283, 284, 285,
+ 286, 289, 290, 291, 292, 293, 63, 256, 257, 110,
+ 113, 114, 262, 263, 264, 265, 62, 256, 63, 63,
+ 63, 61, 71, 71, 159, 168, 168, 168, 168, 164,
+ 167, 167, 241, 98, 169, 191, 201, 202, 175, 147,
+ 180, 147, 166, 169, 181, 190, 191, 202, 190, 190,
+ 190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+ 190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+ 190, 190, 190, 190, 51, 52, 55, 188, 193, 301,
+ 302, 195, 51, 52, 55, 188, 193, 301, 51, 55,
+ 301, 246, 245, 169, 190, 169, 190, 97, 171, 216,
+ 309, 278, 215, 51, 55, 182, 301, 195, 301, 161,
+ 167, 220, 221, 15, 13, 249, 313, 162, 16, 190,
+ 51, 55, 195, 51, 55, 162, 27, 225, 309, 225,
+ 51, 55, 195, 51, 55, 213, 187, 261, 262, 247,
+ 201, 15, 191, 98, 191, 199, 262, 298, 299, 306,
+ 150, 306, 147, 147, 306, 185, 157, 144, 190, 306,
+ 164, 206, 298, 177, 179, 51, 55, 195, 51, 55,
+ 116, 51, 92, 98, 229, 230, 231, 282, 280, 29,
+ 108, 239, 147, 294, 313, 191, 147, 294, 51, 147,
+ 294, 51, 63, 162, 266, 263, 110, 265, 190, 190,
+ 79, 121, 233, 234, 313, 191, 147, 306, 179, 147,
+ 116, 44, 305, 90, 90, 193, 197, 305, 307, 90,
+ 90, 193, 194, 197, 313, 194, 197, 233, 233, 44,
+ 172, 309, 168, 161, 307, 15, 306, 149, 279, 280,
+ 184, 191, 202, 250, 313, 18, 227, 313, 17, 226,
+ 227, 90, 90, 307, 90, 90, 227, 210, 212, 307,
+ 168, 185, 15, 147, 224, 191, 98, 191, 200, 298,
+ 144, 306, 308, 307, 231, 147, 282, 147, 306, 235,
+ 305, 162, 162, 283, 289, 291, 293, 284, 286, 291,
+ 284, 144, 162, 232, 235, 284, 285, 287, 288, 291,
+ 293, 162, 98, 191, 179, 190, 118, 169, 190, 169,
+ 190, 171, 151, 90, 169, 190, 169, 190, 171, 244,
+ 240, 162, 162, 190, 233, 217, 309, 15, 280, 161,
+ 309, 222, 91, 251, 313, 162, 14, 252, 313, 168,
+ 15, 90, 15, 162, 162, 225, 191, 162, 191, 147,
+ 306, 230, 147, 98, 229, 150, 152, 15, 144, 147,
+ 294, 147, 294, 147, 294, 147, 294, 294, 144, 235,
+ 121, 147, 294, 89, 223, 147, 294, 147, 294, 15,
+ 191, 190, 169, 190, 15, 144, 162, 161, 306, 15,
+ 279, 89, 181, 223, 273, 276, 224, 162, 224, 15,
+ 15, 214, 227, 247, 248, 147, 230, 147, 282, 51,
+ 236, 237, 281, 284, 291, 284, 284, 121, 288, 291,
+ 55, 88, 284, 287, 291, 284, 144, 15, 161, 55,
+ 88, 145, 146, 162, 162, 162, 230, 147, 147, 305,
+ 294, 147, 294, 294, 294, 147, 294, 147, 294, 51,
+ 55, 294, 147, 294, 294, 15, 51, 55, 195, 51,
+ 55, 249, 226, 15, 230, 237, 284, 284, 291, 284,
+ 284, 307, 294, 294, 147, 294, 294, 294, 284, 294
+};
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY (-2)
+#define YYEOF 0
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror. This remains here temporarily
+ to ease the transition to the new meaning of YYERROR, for GCC.
+ Once GCC version 2 has supplanted version 1, this can go. However,
+ YYFAIL appears to be in use. Nevertheless, it is formally deprecated
+ in Bison 2.4.2's NEWS entry, where a plan to phase it out is
+ discussed. */
+
+#define YYFAIL goto yyerrlab
+#if defined YYFAIL
+ /* This is here to suppress warnings from the GCC cpp's
+ -Wunused-macros. Normally we don't worry about that warning, but
+ some users do, and we want to make it easy for users to remove
+ YYFAIL uses, which will produce warnings from Bison 2.5. */
+#endif
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+do \
+ if (yychar == YYEMPTY && yylen == 1) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ yytoken = YYTRANSLATE (yychar); \
+ YYPOPSTACK (1); \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror (p, YY_("syntax error: cannot back up")); \
+ YYERROR; \
+ } \
+while (YYID (0))
+
+
+#define YYTERROR 1
+#define YYERRCODE 256
+
+
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+ If N is 0, then set CURRENT to the empty location which ends
+ the previous symbol: RHS[0] (always defined). */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N) \
+ do \
+ if (YYID (N)) \
+ { \
+ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
+ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
+ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
+ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
+ } \
+ else \
+ { \
+ (Current).first_line = (Current).last_line = \
+ YYRHSLOC (Rhs, 0).last_line; \
+ (Current).first_column = (Current).last_column = \
+ YYRHSLOC (Rhs, 0).last_column; \
+ } \
+ while (YYID (0))
+#endif
+
+
+/* YY_LOCATION_PRINT -- Print the location on the stream.
+ This macro was not mandated originally: define only if we know
+ we won't break user code: when these are the locations we know. */
+
+#ifndef YY_LOCATION_PRINT
+# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
+# define YY_LOCATION_PRINT(File, Loc) \
+ fprintf (File, "%d.%d-%d.%d", \
+ (Loc).first_line, (Loc).first_column, \
+ (Loc).last_line, (Loc).last_column)
+# else
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments. */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (&yylval, YYLEX_PARAM)
+#else
+# define YYLEX yylex (&yylval, p)
+#endif
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (YYID (0))
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yy_symbol_print (stderr, \
+ Type, Value, p); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (YYID (0))
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, parser_state *p)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep, p)
+ FILE *yyoutput;
+ int yytype;
+ YYSTYPE const * const yyvaluep;
+ parser_state *p;
+#endif
+{
+ if (!yyvaluep)
+ return;
+ YYUSE (p);
+# ifdef YYPRINT
+ if (yytype < YYNTOKENS)
+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+ YYUSE (yyoutput);
+# endif
+ switch (yytype)
+ {
+ default:
+ break;
+ }
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, parser_state *p)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep, p)
+ FILE *yyoutput;
+ int yytype;
+ YYSTYPE const * const yyvaluep;
+ parser_state *p;
+#endif
+{
+ if (yytype < YYNTOKENS)
+ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+ else
+ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+ yy_symbol_value_print (yyoutput, yytype, yyvaluep, p);
+ YYFPRINTF (yyoutput, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
+#else
+static void
+yy_stack_print (yybottom, yytop)
+ yytype_int16 *yybottom;
+ yytype_int16 *yytop;
+#endif
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (; yybottom <= yytop; yybottom++)
+ {
+ int yybot = *yybottom;
+ YYFPRINTF (stderr, " %d", yybot);
+ }
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (YYID (0))
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule, parser_state *p)
+#else
+static void
+yy_reduce_print (yyvsp, yyrule, p)
+ YYSTYPE *yyvsp;
+ int yyrule;
+ parser_state *p;
+#endif
+{
+ int yynrhs = yyr2[yyrule];
+ int yyi;
+ unsigned long int yylno = yyrline[yyrule];
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+ yyrule - 1, yylno);
+ /* The symbols being reduced. */
+ for (yyi = 0; yyi < yynrhs; yyi++)
+ {
+ YYFPRINTF (stderr, " $%d = ", yyi + 1);
+ yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+ &(yyvsp[(yyi + 1) - (yynrhs)])
+ , p);
+ YYFPRINTF (stderr, "\n");
+ }
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (yyvsp, Rule, p); \
+} while (YYID (0))
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+# if defined __GLIBC__ && defined _STRING_H
+# define yystrlen strlen
+# else
+/* Return the length of YYSTR. */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static YYSIZE_T
+yystrlen (const char *yystr)
+#else
+static YYSIZE_T
+yystrlen (yystr)
+ const char *yystr;
+#endif
+{
+ YYSIZE_T yylen;
+ for (yylen = 0; yystr[yylen]; yylen++)
+ continue;
+ return yylen;
+}
+# endif
+# endif
+
+# ifndef yystpcpy
+# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+# define yystpcpy stpcpy
+# else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+ YYDEST. */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static char *
+yystpcpy (char *yydest, const char *yysrc)
+#else
+static char *
+yystpcpy (yydest, yysrc)
+ char *yydest;
+ const char *yysrc;
+#endif
+{
+ char *yyd = yydest;
+ const char *yys = yysrc;
+
+ while ((*yyd++ = *yys++) != '\0')
+ continue;
+
+ return yyd - 1;
+}
+# endif
+# endif
+
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+ quotes and backslashes, so that it's suitable for yyerror. The
+ heuristic is that double-quoting is unnecessary unless the string
+ contains an apostrophe, a comma, or backslash (other than
+ backslash-backslash). YYSTR is taken from yytname. If YYRES is
+ null, do not copy; instead, return the length of what the result
+ would have been. */
+static YYSIZE_T
+yytnamerr (char *yyres, const char *yystr)
+{
+ if (*yystr == '"')
+ {
+ YYSIZE_T yyn = 0;
+ char const *yyp = yystr;
+
+ for (;;)
+ switch (*++yyp)
+ {
+ case '\'':
+ case ',':
+ goto do_not_strip_quotes;
+
+ case '\\':
+ if (*++yyp != '\\')
+ goto do_not_strip_quotes;
+ /* Fall through. */
+ default:
+ if (yyres)
+ yyres[yyn] = *yyp;
+ yyn++;
+ break;
+
+ case '"':
+ if (yyres)
+ yyres[yyn] = '\0';
+ return yyn;
+ }
+ do_not_strip_quotes: ;
+ }
+
+ if (! yyres)
+ return yystrlen (yystr);
+
+ return yystpcpy (yyres, yystr) - yyres;
+}
+# endif
+
+/* Copy into YYRESULT an error message about the unexpected token
+ YYCHAR while in state YYSTATE. Return the number of bytes copied,
+ including the terminating null byte. If YYRESULT is null, do not
+ copy anything; just return the number of bytes that would be
+ copied. As a special case, return 0 if an ordinary "syntax error"
+ message will do. Return YYSIZE_MAXIMUM if overflow occurs during
+ size calculation. */
+static YYSIZE_T
+yysyntax_error (char *yyresult, int yystate, int yychar)
+{
+ int yyn = yypact[yystate];
+
+ if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
+ return 0;
+ else
+ {
+ int yytype = YYTRANSLATE (yychar);
+ YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
+ YYSIZE_T yysize = yysize0;
+ YYSIZE_T yysize1;
+ int yysize_overflow = 0;
+ enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+ int yyx;
+
+# if 0
+ /* This is so xgettext sees the translatable formats that are
+ constructed on the fly. */
+ YY_("syntax error, unexpected %s");
+ YY_("syntax error, unexpected %s, expecting %s");
+ YY_("syntax error, unexpected %s, expecting %s or %s");
+ YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+ YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+# endif
+ char *yyfmt;
+ char const *yyf;
+ static char const yyunexpected[] = "syntax error, unexpected %s";
+ static char const yyexpecting[] = ", expecting %s";
+ static char const yyor[] = " or %s";
+ char yyformat[sizeof yyunexpected
+ + sizeof yyexpecting - 1
+ + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+ * (sizeof yyor - 1))];
+ char const *yyprefix = yyexpecting;
+
+ /* Start YYX at -YYN if negative to avoid negative indexes in
+ YYCHECK. */
+ int yyxbegin = yyn < 0 ? -yyn : 0;
+
+ /* Stay within bounds of both yycheck and yytname. */
+ int yychecklim = YYLAST - yyn + 1;
+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+ int yycount = 1;
+
+ yyarg[0] = yytname[yytype];
+ yyfmt = yystpcpy (yyformat, yyunexpected);
+
+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+ {
+ if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+ {
+ yycount = 1;
+ yysize = yysize0;
+ yyformat[sizeof yyunexpected - 1] = '\0';
+ break;
+ }
+ yyarg[yycount++] = yytname[yyx];
+ yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+ yysize_overflow |= (yysize1 < yysize);
+ yysize = yysize1;
+ yyfmt = yystpcpy (yyfmt, yyprefix);
+ yyprefix = yyor;
+ }
+
+ yyf = YY_(yyformat);
+ yysize1 = yysize + yystrlen (yyf);
+ yysize_overflow |= (yysize1 < yysize);
+ yysize = yysize1;
+
+ if (yysize_overflow)
+ return YYSIZE_MAXIMUM;
+
+ if (yyresult)
+ {
+ /* Avoid sprintf, as that infringes on the user's name space.
+ Don't have undefined behavior even if the translation
+ produced a string with the wrong number of "%s"s. */
+ char *yyp = yyresult;
+ int yyi = 0;
+ while ((*yyp = *yyf) != '\0')
+ {
+ if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+ {
+ yyp += yytnamerr (yyp, yyarg[yyi++]);
+ yyf += 2;
+ }
+ else
+ {
+ yyp++;
+ yyf++;
+ }
+ }
+ }
+ return yysize;
+ }
+}
+#endif /* YYERROR_VERBOSE */
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, parser_state *p)
+#else
+static void
+yydestruct (yymsg, yytype, yyvaluep, p)
+ const char *yymsg;
+ int yytype;
+ YYSTYPE *yyvaluep;
+ parser_state *p;
+#endif
+{
+ YYUSE (yyvaluep);
+ YYUSE (p);
+
+ if (!yymsg)
+ yymsg = "Deleting";
+ YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+ switch (yytype)
+ {
+
+ default:
+ break;
+ }
+}
+
+/* Prevent warnings from -Wmissing-prototypes. */
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void *YYPARSE_PARAM);
+#else
+int yyparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int yyparse (parser_state *p);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+
+
+
+/*-------------------------.
+| yyparse or yypush_parse. |
+`-------------------------*/
+
+#ifdef YYPARSE_PARAM
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+ void *YYPARSE_PARAM;
+#endif
+#else /* ! YYPARSE_PARAM */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (parser_state *p)
+#else
+int
+yyparse (p)
+ parser_state *p;
+#endif
+#endif
+{
+/* The lookahead symbol. */
+int yychar;
+
+/* The semantic value of the lookahead symbol. */
+YYSTYPE yylval;
+
+ /* Number of syntax errors so far. */
+ int yynerrs;
+
+ int yystate;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus;
+
+ /* The stacks and their tools:
+ `yyss': related to states.
+ `yyvs': related to semantic values.
+
+ Refer to the stacks thru separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* The state stack. */
+ yytype_int16 yyssa[YYINITDEPTH];
+ yytype_int16 *yyss;
+ yytype_int16 *yyssp;
+
+ /* The semantic value stack. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs;
+ YYSTYPE *yyvsp;
+
+ YYSIZE_T yystacksize;
+
+ int yyn;
+ int yyresult;
+ /* Lookahead token as an internal (translated) token number. */
+ int yytoken;
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+#if YYERROR_VERBOSE
+ /* Buffer for error messages, and its allocated size. */
+ char yymsgbuf[128];
+ char *yymsg = yymsgbuf;
+ YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
+
+ /* The number of symbols on the RHS of the reduced rule.
+ Keep to zero when no symbol should be popped. */
+ int yylen = 0;
+
+ yytoken = 0;
+ yyss = yyssa;
+ yyvs = yyvsa;
+ yystacksize = YYINITDEPTH;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ so that they stay on the same level as the state stack.
+ The wasted elements are never initialized. */
+ yyssp = yyss;
+ yyvsp = yyvs;
+
+ goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+ yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. So pushing a state here evens the stacks. */
+ yyssp++;
+
+ yysetstate:
+ *yyssp = yystate;
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ yytype_int16 *yyss1 = yyss;
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow (YY_("memory exhausted"),
+ &yyss1, yysize * sizeof (*yyssp),
+ &yyvs1, yysize * sizeof (*yyvsp),
+ &yystacksize);
+
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+ goto yyexhaustedlab;
+# else
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ goto yyexhaustedlab;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ yytype_int16 *yyss1 = yyss;
+ union yyalloc *yyptr =
+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+ if (! yyptr)
+ goto yyexhaustedlab;
+ YYSTACK_RELOCATE (yyss_alloc, yyss);
+ YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+#endif /* no yyoverflow */
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+ (unsigned long int) yystacksize));
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+ if (yystate == YYFINAL)
+ YYACCEPT;
+
+ goto yybackup;
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+
+ /* Do appropriate processing given the current state. Read a
+ lookahead token if we need one and don't already have one. */
+
+ /* First try to decide what to do without reference to lookahead token. */
+ yyn = yypact[yystate];
+ if (yyn == YYPACT_NINF)
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token: "));
+ yychar = YYLEX;
+ }
+
+ if (yychar <= YYEOF)
+ {
+ yychar = yytoken = YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yyn == 0 || yyn == YYTABLE_NINF)
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ /* Shift the lookahead token. */
+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+ /* Discard the shifted token. */
+ yychar = YYEMPTY;
+
+ yystate = yyn;
+ *++yyvsp = yylval;
+
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ `$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 2:
+
+/* Line 1464 of yacc.c */
+#line 1166 "src/parse.y"
+ {
+ p->lstate = EXPR_BEG;
+ if (!p->locals) p->locals = cons(0,0);
+ ;}
+ break;
+
+ case 3:
+
+/* Line 1464 of yacc.c */
+#line 1171 "src/parse.y"
+ {
+ p->tree = new_scope(p, (yyvsp[(2) - (2)].nd));
+ NODE_LINENO(p->tree, (yyvsp[(2) - (2)].nd));
+ ;}
+ break;
+
+ case 4:
+
+/* Line 1464 of yacc.c */
+#line 1178 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(1) - (2)].nd);
+ ;}
+ break;
+
+ case 5:
+
+/* Line 1464 of yacc.c */
+#line 1184 "src/parse.y"
+ {
+ (yyval.nd) = new_begin(p, 0);
+ ;}
+ break;
+
+ case 6:
+
+/* Line 1464 of yacc.c */
+#line 1188 "src/parse.y"
+ {
+ (yyval.nd) = new_begin(p, (yyvsp[(1) - (1)].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[(1) - (1)].nd));
+ ;}
+ break;
+
+ case 7:
+
+/* Line 1464 of yacc.c */
+#line 1193 "src/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[(1) - (3)].nd), newline_node((yyvsp[(3) - (3)].nd)));
+ ;}
+ break;
+
+ case 8:
+
+/* Line 1464 of yacc.c */
+#line 1197 "src/parse.y"
+ {
+ (yyval.nd) = new_begin(p, 0);
+ ;}
+ break;
+
+ case 10:
+
+/* Line 1464 of yacc.c */
+#line 1204 "src/parse.y"
+ {
+ (yyval.nd) = local_switch(p);
+ ;}
+ break;
+
+ case 11:
+
+/* Line 1464 of yacc.c */
+#line 1208 "src/parse.y"
+ {
+ yyerror(p, "BEGIN not supported");
+ local_resume(p, (yyvsp[(2) - (5)].nd));
+ (yyval.nd) = 0;
+ ;}
+ break;
+
+ case 12:
+
+/* Line 1464 of yacc.c */
+#line 1219 "src/parse.y"
+ {
+ if ((yyvsp[(2) - (4)].nd)) {
+ (yyval.nd) = new_rescue(p, (yyvsp[(1) - (4)].nd), (yyvsp[(2) - (4)].nd), (yyvsp[(3) - (4)].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[(1) - (4)].nd));
+ }
+ else if ((yyvsp[(3) - (4)].nd)) {
+ yywarn(p, "else without rescue is useless");
+ (yyval.nd) = push((yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].nd));
+ }
+ else {
+ (yyval.nd) = (yyvsp[(1) - (4)].nd);
+ }
+ if ((yyvsp[(4) - (4)].nd)) {
+ if ((yyval.nd)) {
+ (yyval.nd) = new_ensure(p, (yyval.nd), (yyvsp[(4) - (4)].nd));
+ }
+ else {
+ (yyval.nd) = push((yyvsp[(4) - (4)].nd), new_nil(p));
+ }
+ }
+ ;}
+ break;
+
+ case 13:
+
+/* Line 1464 of yacc.c */
+#line 1243 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(1) - (2)].nd);
+ ;}
+ break;
+
+ case 14:
+
+/* Line 1464 of yacc.c */
+#line 1249 "src/parse.y"
+ {
+ (yyval.nd) = new_begin(p, 0);
+ ;}
+ break;
+
+ case 15:
+
+/* Line 1464 of yacc.c */
+#line 1253 "src/parse.y"
+ {
+ (yyval.nd) = new_begin(p, (yyvsp[(1) - (1)].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[(1) - (1)].nd));
+ ;}
+ break;
+
+ case 16:
+
+/* Line 1464 of yacc.c */
+#line 1258 "src/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[(1) - (3)].nd), newline_node((yyvsp[(3) - (3)].nd)));
+ ;}
+ break;
+
+ case 17:
+
+/* Line 1464 of yacc.c */
+#line 1262 "src/parse.y"
+ {
+ (yyval.nd) = new_begin(p, (yyvsp[(2) - (2)].nd));
+ ;}
+ break;
+
+ case 18:
+
+/* Line 1464 of yacc.c */
+#line 1267 "src/parse.y"
+ {p->lstate = EXPR_FNAME;;}
+ break;
+
+ case 19:
+
+/* Line 1464 of yacc.c */
+#line 1268 "src/parse.y"
+ {
+ (yyval.nd) = new_alias(p, (yyvsp[(2) - (4)].id), (yyvsp[(4) - (4)].id));
+ ;}
+ break;
+
+ case 20:
+
+/* Line 1464 of yacc.c */
+#line 1272 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(2) - (2)].nd);
+ ;}
+ break;
+
+ case 21:
+
+/* Line 1464 of yacc.c */
+#line 1276 "src/parse.y"
+ {
+ (yyval.nd) = new_if(p, cond((yyvsp[(3) - (3)].nd)), (yyvsp[(1) - (3)].nd), 0);
+ ;}
+ break;
+
+ case 22:
+
+/* Line 1464 of yacc.c */
+#line 1280 "src/parse.y"
+ {
+ (yyval.nd) = new_unless(p, cond((yyvsp[(3) - (3)].nd)), (yyvsp[(1) - (3)].nd), 0);
+ ;}
+ break;
+
+ case 23:
+
+/* Line 1464 of yacc.c */
+#line 1284 "src/parse.y"
+ {
+ (yyval.nd) = new_while(p, cond((yyvsp[(3) - (3)].nd)), (yyvsp[(1) - (3)].nd));
+ ;}
+ break;
+
+ case 24:
+
+/* Line 1464 of yacc.c */
+#line 1288 "src/parse.y"
+ {
+ (yyval.nd) = new_until(p, cond((yyvsp[(3) - (3)].nd)), (yyvsp[(1) - (3)].nd));
+ ;}
+ break;
+
+ case 25:
+
+/* Line 1464 of yacc.c */
+#line 1292 "src/parse.y"
+ {
+ (yyval.nd) = new_rescue(p, (yyvsp[(1) - (3)].nd), list1(list3(0, 0, (yyvsp[(3) - (3)].nd))), 0);
+ ;}
+ break;
+
+ case 26:
+
+/* Line 1464 of yacc.c */
+#line 1296 "src/parse.y"
+ {
+ yyerror(p, "END not suported");
+ (yyval.nd) = new_postexe(p, (yyvsp[(3) - (4)].nd));
+ ;}
+ break;
+
+ case 28:
+
+/* Line 1464 of yacc.c */
+#line 1302 "src/parse.y"
+ {
+ (yyval.nd) = new_masgn(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 29:
+
+/* Line 1464 of yacc.c */
+#line 1306 "src/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, (yyvsp[(1) - (3)].nd), (yyvsp[(2) - (3)].id), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 30:
+
+/* Line 1464 of yacc.c */
+#line 1310 "src/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[(1) - (6)].nd), intern("[]",2), (yyvsp[(3) - (6)].nd)), (yyvsp[(5) - (6)].id), (yyvsp[(6) - (6)].nd));
+ ;}
+ break;
+
+ case 31:
+
+/* Line 1464 of yacc.c */
+#line 1314 "src/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), 0), (yyvsp[(4) - (5)].id), (yyvsp[(5) - (5)].nd));
+ ;}
+ break;
+
+ case 32:
+
+/* Line 1464 of yacc.c */
+#line 1318 "src/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), 0), (yyvsp[(4) - (5)].id), (yyvsp[(5) - (5)].nd));
+ ;}
+ break;
+
+ case 33:
+
+/* Line 1464 of yacc.c */
+#line 1322 "src/parse.y"
+ {
+ yyerror(p, "constant re-assignment");
+ (yyval.nd) = 0;
+ ;}
+ break;
+
+ case 34:
+
+/* Line 1464 of yacc.c */
+#line 1327 "src/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), 0), (yyvsp[(4) - (5)].id), (yyvsp[(5) - (5)].nd));
+ ;}
+ break;
+
+ case 35:
+
+/* Line 1464 of yacc.c */
+#line 1331 "src/parse.y"
+ {
+ backref_error(p, (yyvsp[(1) - (3)].nd));
+ (yyval.nd) = new_begin(p, 0);
+ ;}
+ break;
+
+ case 36:
+
+/* Line 1464 of yacc.c */
+#line 1336 "src/parse.y"
+ {
+ (yyval.nd) = new_asgn(p, (yyvsp[(1) - (3)].nd), new_array(p, (yyvsp[(3) - (3)].nd)));
+ ;}
+ break;
+
+ case 37:
+
+/* Line 1464 of yacc.c */
+#line 1340 "src/parse.y"
+ {
+ (yyval.nd) = new_masgn(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 38:
+
+/* Line 1464 of yacc.c */
+#line 1344 "src/parse.y"
+ {
+ (yyval.nd) = new_masgn(p, (yyvsp[(1) - (3)].nd), new_array(p, (yyvsp[(3) - (3)].nd)));
+ ;}
+ break;
+
+ case 40:
+
+/* Line 1464 of yacc.c */
+#line 1351 "src/parse.y"
+ {
+ (yyval.nd) = new_asgn(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 41:
+
+/* Line 1464 of yacc.c */
+#line 1355 "src/parse.y"
+ {
+ (yyval.nd) = new_asgn(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 43:
+
+/* Line 1464 of yacc.c */
+#line 1363 "src/parse.y"
+ {
+ (yyval.nd) = new_and(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 44:
+
+/* Line 1464 of yacc.c */
+#line 1367 "src/parse.y"
+ {
+ (yyval.nd) = new_or(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 45:
+
+/* Line 1464 of yacc.c */
+#line 1371 "src/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, cond((yyvsp[(3) - (3)].nd)), "!");
+ ;}
+ break;
+
+ case 46:
+
+/* Line 1464 of yacc.c */
+#line 1375 "src/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, cond((yyvsp[(2) - (2)].nd)), "!");
+ ;}
+ break;
+
+ case 48:
+
+/* Line 1464 of yacc.c */
+#line 1382 "src/parse.y"
+ {
+ if (!(yyvsp[(1) - (1)].nd)) (yyval.nd) = new_nil(p);
+ else (yyval.nd) = (yyvsp[(1) - (1)].nd);
+ ;}
+ break;
+
+ case 53:
+
+/* Line 1464 of yacc.c */
+#line 1397 "src/parse.y"
+ {
+ local_nest(p);
+ ;}
+ break;
+
+ case 54:
+
+/* Line 1464 of yacc.c */
+#line 1403 "src/parse.y"
+ {
+ (yyval.nd) = new_block(p, (yyvsp[(3) - (5)].nd), (yyvsp[(4) - (5)].nd));
+ local_unnest(p);
+ ;}
+ break;
+
+ case 55:
+
+/* Line 1464 of yacc.c */
+#line 1410 "src/parse.y"
+ {
+ (yyval.nd) = new_fcall(p, (yyvsp[(1) - (2)].id), (yyvsp[(2) - (2)].nd));
+ ;}
+ break;
+
+ case 56:
+
+/* Line 1464 of yacc.c */
+#line 1414 "src/parse.y"
+ {
+ args_with_block(p, (yyvsp[(2) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ (yyval.nd) = new_fcall(p, (yyvsp[(1) - (3)].id), (yyvsp[(2) - (3)].nd));
+ ;}
+ break;
+
+ case 57:
+
+/* Line 1464 of yacc.c */
+#line 1419 "src/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].id), (yyvsp[(4) - (4)].nd));
+ ;}
+ break;
+
+ case 58:
+
+/* Line 1464 of yacc.c */
+#line 1423 "src/parse.y"
+ {
+ args_with_block(p, (yyvsp[(4) - (5)].nd), (yyvsp[(5) - (5)].nd));
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].nd));
+ ;}
+ break;
+
+ case 59:
+
+/* Line 1464 of yacc.c */
+#line 1428 "src/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].id), (yyvsp[(4) - (4)].nd));
+ ;}
+ break;
+
+ case 60:
+
+/* Line 1464 of yacc.c */
+#line 1432 "src/parse.y"
+ {
+ args_with_block(p, (yyvsp[(4) - (5)].nd), (yyvsp[(5) - (5)].nd));
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].nd));
+ ;}
+ break;
+
+ case 61:
+
+/* Line 1464 of yacc.c */
+#line 1437 "src/parse.y"
+ {
+ (yyval.nd) = new_super(p, (yyvsp[(2) - (2)].nd));
+ ;}
+ break;
+
+ case 62:
+
+/* Line 1464 of yacc.c */
+#line 1441 "src/parse.y"
+ {
+ (yyval.nd) = new_yield(p, (yyvsp[(2) - (2)].nd));
+ ;}
+ break;
+
+ case 63:
+
+/* Line 1464 of yacc.c */
+#line 1445 "src/parse.y"
+ {
+ (yyval.nd) = new_return(p, ret_args(p, (yyvsp[(2) - (2)].nd)));
+ ;}
+ break;
+
+ case 64:
+
+/* Line 1464 of yacc.c */
+#line 1449 "src/parse.y"
+ {
+ (yyval.nd) = new_break(p, ret_args(p, (yyvsp[(2) - (2)].nd)));
+ ;}
+ break;
+
+ case 65:
+
+/* Line 1464 of yacc.c */
+#line 1453 "src/parse.y"
+ {
+ (yyval.nd) = new_next(p, ret_args(p, (yyvsp[(2) - (2)].nd)));
+ ;}
+ break;
+
+ case 66:
+
+/* Line 1464 of yacc.c */
+#line 1459 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(1) - (1)].nd);
+ ;}
+ break;
+
+ case 67:
+
+/* Line 1464 of yacc.c */
+#line 1463 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(2) - (3)].nd);
+ ;}
+ break;
+
+ case 69:
+
+/* Line 1464 of yacc.c */
+#line 1470 "src/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[(2) - (3)].nd));
+ ;}
+ break;
+
+ case 70:
+
+/* Line 1464 of yacc.c */
+#line 1476 "src/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[(1) - (1)].nd));
+ ;}
+ break;
+
+ case 71:
+
+/* Line 1464 of yacc.c */
+#line 1480 "src/parse.y"
+ {
+ (yyval.nd) = list1(push((yyvsp[(1) - (2)].nd),(yyvsp[(2) - (2)].nd)));
+ ;}
+ break;
+
+ case 72:
+
+/* Line 1464 of yacc.c */
+#line 1484 "src/parse.y"
+ {
+ (yyval.nd) = list2((yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 73:
+
+/* Line 1464 of yacc.c */
+#line 1488 "src/parse.y"
+ {
+ (yyval.nd) = list3((yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].nd), (yyvsp[(5) - (5)].nd));
+ ;}
+ break;
+
+ case 74:
+
+/* Line 1464 of yacc.c */
+#line 1492 "src/parse.y"
+ {
+ (yyval.nd) = list2((yyvsp[(1) - (2)].nd), new_nil(p));
+ ;}
+ break;
+
+ case 75:
+
+/* Line 1464 of yacc.c */
+#line 1496 "src/parse.y"
+ {
+ (yyval.nd) = list3((yyvsp[(1) - (4)].nd), new_nil(p), (yyvsp[(4) - (4)].nd));
+ ;}
+ break;
+
+ case 76:
+
+/* Line 1464 of yacc.c */
+#line 1500 "src/parse.y"
+ {
+ (yyval.nd) = list2(0, (yyvsp[(2) - (2)].nd));
+ ;}
+ break;
+
+ case 77:
+
+/* Line 1464 of yacc.c */
+#line 1504 "src/parse.y"
+ {
+ (yyval.nd) = list3(0, (yyvsp[(2) - (4)].nd), (yyvsp[(4) - (4)].nd));
+ ;}
+ break;
+
+ case 78:
+
+/* Line 1464 of yacc.c */
+#line 1508 "src/parse.y"
+ {
+ (yyval.nd) = list2(0, new_nil(p));
+ ;}
+ break;
+
+ case 79:
+
+/* Line 1464 of yacc.c */
+#line 1512 "src/parse.y"
+ {
+ (yyval.nd) = list3(0, new_nil(p), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 81:
+
+/* Line 1464 of yacc.c */
+#line 1519 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(2) - (3)].nd);
+ ;}
+ break;
+
+ case 82:
+
+/* Line 1464 of yacc.c */
+#line 1525 "src/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[(1) - (2)].nd));
+ ;}
+ break;
+
+ case 83:
+
+/* Line 1464 of yacc.c */
+#line 1529 "src/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[(1) - (3)].nd), (yyvsp[(2) - (3)].nd));
+ ;}
+ break;
+
+ case 84:
+
+/* Line 1464 of yacc.c */
+#line 1535 "src/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[(1) - (1)].nd));
+ ;}
+ break;
+
+ case 85:
+
+/* Line 1464 of yacc.c */
+#line 1539 "src/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[(1) - (2)].nd), (yyvsp[(2) - (2)].nd));
+ ;}
+ break;
+
+ case 86:
+
+/* Line 1464 of yacc.c */
+#line 1545 "src/parse.y"
+ {
+ assignable(p, (yyvsp[(1) - (1)].nd));
+ ;}
+ break;
+
+ case 87:
+
+/* Line 1464 of yacc.c */
+#line 1549 "src/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (4)].nd), intern("[]",2), (yyvsp[(3) - (4)].nd));
+ ;}
+ break;
+
+ case 88:
+
+/* Line 1464 of yacc.c */
+#line 1553 "src/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id), 0);
+ ;}
+ break;
+
+ case 89:
+
+/* Line 1464 of yacc.c */
+#line 1557 "src/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id), 0);
+ ;}
+ break;
+
+ case 90:
+
+/* Line 1464 of yacc.c */
+#line 1561 "src/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id), 0);
+ ;}
+ break;
+
+ case 91:
+
+/* Line 1464 of yacc.c */
+#line 1565 "src/parse.y"
+ {
+ if (p->in_def || p->in_single)
+ yyerror(p, "dynamic constant assignment");
+ (yyval.nd) = new_colon2(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id));
+ ;}
+ break;
+
+ case 92:
+
+/* Line 1464 of yacc.c */
+#line 1571 "src/parse.y"
+ {
+ if (p->in_def || p->in_single)
+ yyerror(p, "dynamic constant assignment");
+ (yyval.nd) = new_colon3(p, (yyvsp[(2) - (2)].id));
+ ;}
+ break;
+
+ case 93:
+
+/* Line 1464 of yacc.c */
+#line 1577 "src/parse.y"
+ {
+ backref_error(p, (yyvsp[(1) - (1)].nd));
+ (yyval.nd) = 0;
+ ;}
+ break;
+
+ case 94:
+
+/* Line 1464 of yacc.c */
+#line 1584 "src/parse.y"
+ {
+ assignable(p, (yyvsp[(1) - (1)].nd));
+ ;}
+ break;
+
+ case 95:
+
+/* Line 1464 of yacc.c */
+#line 1588 "src/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (4)].nd), intern("[]",2), (yyvsp[(3) - (4)].nd));
+ ;}
+ break;
+
+ case 96:
+
+/* Line 1464 of yacc.c */
+#line 1592 "src/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id), 0);
+ ;}
+ break;
+
+ case 97:
+
+/* Line 1464 of yacc.c */
+#line 1596 "src/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id), 0);
+ ;}
+ break;
+
+ case 98:
+
+/* Line 1464 of yacc.c */
+#line 1600 "src/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id), 0);
+ ;}
+ break;
+
+ case 99:
+
+/* Line 1464 of yacc.c */
+#line 1604 "src/parse.y"
+ {
+ if (p->in_def || p->in_single)
+ yyerror(p, "dynamic constant assignment");
+ (yyval.nd) = new_colon2(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id));
+ ;}
+ break;
+
+ case 100:
+
+/* Line 1464 of yacc.c */
+#line 1610 "src/parse.y"
+ {
+ if (p->in_def || p->in_single)
+ yyerror(p, "dynamic constant assignment");
+ (yyval.nd) = new_colon3(p, (yyvsp[(2) - (2)].id));
+ ;}
+ break;
+
+ case 101:
+
+/* Line 1464 of yacc.c */
+#line 1616 "src/parse.y"
+ {
+ backref_error(p, (yyvsp[(1) - (1)].nd));
+ (yyval.nd) = 0;
+ ;}
+ break;
+
+ case 102:
+
+/* Line 1464 of yacc.c */
+#line 1623 "src/parse.y"
+ {
+ yyerror(p, "class/module name must be CONSTANT");
+ ;}
+ break;
+
+ case 104:
+
+/* Line 1464 of yacc.c */
+#line 1630 "src/parse.y"
+ {
+ (yyval.nd) = cons((node*)1, nsym((yyvsp[(2) - (2)].id)));
+ ;}
+ break;
+
+ case 105:
+
+/* Line 1464 of yacc.c */
+#line 1634 "src/parse.y"
+ {
+ (yyval.nd) = cons((node*)0, nsym((yyvsp[(1) - (1)].id)));
+ ;}
+ break;
+
+ case 106:
+
+/* Line 1464 of yacc.c */
+#line 1638 "src/parse.y"
+ {
+ (yyval.nd) = cons((yyvsp[(1) - (3)].nd), nsym((yyvsp[(3) - (3)].id)));
+ ;}
+ break;
+
+ case 110:
+
+/* Line 1464 of yacc.c */
+#line 1647 "src/parse.y"
+ {
+ p->lstate = EXPR_ENDFN;
+ (yyval.id) = (yyvsp[(1) - (1)].id);
+ ;}
+ break;
+
+ case 111:
+
+/* Line 1464 of yacc.c */
+#line 1652 "src/parse.y"
+ {
+ p->lstate = EXPR_ENDFN;
+ (yyval.id) = (yyvsp[(1) - (1)].id);
+ ;}
+ break;
+
+ case 114:
+
+/* Line 1464 of yacc.c */
+#line 1663 "src/parse.y"
+ {
+ (yyval.nd) = new_undef(p, (yyvsp[(1) - (1)].id));
+ ;}
+ break;
+
+ case 115:
+
+/* Line 1464 of yacc.c */
+#line 1666 "src/parse.y"
+ {p->lstate = EXPR_FNAME;;}
+ break;
+
+ case 116:
+
+/* Line 1464 of yacc.c */
+#line 1667 "src/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[(1) - (4)].nd), nsym((yyvsp[(4) - (4)].id)));
+ ;}
+ break;
+
+ case 117:
+
+/* Line 1464 of yacc.c */
+#line 1672 "src/parse.y"
+ { (yyval.id) = intern_c('|'); ;}
+ break;
+
+ case 118:
+
+/* Line 1464 of yacc.c */
+#line 1673 "src/parse.y"
+ { (yyval.id) = intern_c('^'); ;}
+ break;
+
+ case 119:
+
+/* Line 1464 of yacc.c */
+#line 1674 "src/parse.y"
+ { (yyval.id) = intern_c('&'); ;}
+ break;
+
+ case 120:
+
+/* Line 1464 of yacc.c */
+#line 1675 "src/parse.y"
+ { (yyval.id) = intern("<=>",3); ;}
+ break;
+
+ case 121:
+
+/* Line 1464 of yacc.c */
+#line 1676 "src/parse.y"
+ { (yyval.id) = intern("==",2); ;}
+ break;
+
+ case 122:
+
+/* Line 1464 of yacc.c */
+#line 1677 "src/parse.y"
+ { (yyval.id) = intern("===",3); ;}
+ break;
+
+ case 123:
+
+/* Line 1464 of yacc.c */
+#line 1678 "src/parse.y"
+ { (yyval.id) = intern("=~",2); ;}
+ break;
+
+ case 124:
+
+/* Line 1464 of yacc.c */
+#line 1679 "src/parse.y"
+ { (yyval.id) = intern("!~",2); ;}
+ break;
+
+ case 125:
+
+/* Line 1464 of yacc.c */
+#line 1680 "src/parse.y"
+ { (yyval.id) = intern_c('>'); ;}
+ break;
+
+ case 126:
+
+/* Line 1464 of yacc.c */
+#line 1681 "src/parse.y"
+ { (yyval.id) = intern(">=",2); ;}
+ break;
+
+ case 127:
+
+/* Line 1464 of yacc.c */
+#line 1682 "src/parse.y"
+ { (yyval.id) = intern_c('<'); ;}
+ break;
+
+ case 128:
+
+/* Line 1464 of yacc.c */
+#line 1683 "src/parse.y"
+ { (yyval.id) = intern("<=",2); ;}
+ break;
+
+ case 129:
+
+/* Line 1464 of yacc.c */
+#line 1684 "src/parse.y"
+ { (yyval.id) = intern("!=",2); ;}
+ break;
+
+ case 130:
+
+/* Line 1464 of yacc.c */
+#line 1685 "src/parse.y"
+ { (yyval.id) = intern("<<",2); ;}
+ break;
+
+ case 131:
+
+/* Line 1464 of yacc.c */
+#line 1686 "src/parse.y"
+ { (yyval.id) = intern(">>",2); ;}
+ break;
+
+ case 132:
+
+/* Line 1464 of yacc.c */
+#line 1687 "src/parse.y"
+ { (yyval.id) = intern_c('+'); ;}
+ break;
+
+ case 133:
+
+/* Line 1464 of yacc.c */
+#line 1688 "src/parse.y"
+ { (yyval.id) = intern_c('-'); ;}
+ break;
+
+ case 134:
+
+/* Line 1464 of yacc.c */
+#line 1689 "src/parse.y"
+ { (yyval.id) = intern_c('*'); ;}
+ break;
+
+ case 135:
+
+/* Line 1464 of yacc.c */
+#line 1690 "src/parse.y"
+ { (yyval.id) = intern_c('*'); ;}
+ break;
+
+ case 136:
+
+/* Line 1464 of yacc.c */
+#line 1691 "src/parse.y"
+ { (yyval.id) = intern_c('/'); ;}
+ break;
+
+ case 137:
+
+/* Line 1464 of yacc.c */
+#line 1692 "src/parse.y"
+ { (yyval.id) = intern_c('%'); ;}
+ break;
+
+ case 138:
+
+/* Line 1464 of yacc.c */
+#line 1693 "src/parse.y"
+ { (yyval.id) = intern("**",2); ;}
+ break;
+
+ case 139:
+
+/* Line 1464 of yacc.c */
+#line 1694 "src/parse.y"
+ { (yyval.id) = intern_c('!'); ;}
+ break;
+
+ case 140:
+
+/* Line 1464 of yacc.c */
+#line 1695 "src/parse.y"
+ { (yyval.id) = intern_c('~'); ;}
+ break;
+
+ case 141:
+
+/* Line 1464 of yacc.c */
+#line 1696 "src/parse.y"
+ { (yyval.id) = intern("+@",2); ;}
+ break;
+
+ case 142:
+
+/* Line 1464 of yacc.c */
+#line 1697 "src/parse.y"
+ { (yyval.id) = intern("-@",2); ;}
+ break;
+
+ case 143:
+
+/* Line 1464 of yacc.c */
+#line 1698 "src/parse.y"
+ { (yyval.id) = intern("[]",2); ;}
+ break;
+
+ case 144:
+
+/* Line 1464 of yacc.c */
+#line 1699 "src/parse.y"
+ { (yyval.id) = intern("[]=",3); ;}
+ break;
+
+ case 145:
+
+/* Line 1464 of yacc.c */
+#line 1700 "src/parse.y"
+ { (yyval.id) = intern_c('`'); ;}
+ break;
+
+ case 186:
+
+/* Line 1464 of yacc.c */
+#line 1718 "src/parse.y"
+ {
+ (yyval.nd) = new_asgn(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 187:
+
+/* Line 1464 of yacc.c */
+#line 1722 "src/parse.y"
+ {
+ (yyval.nd) = new_asgn(p, (yyvsp[(1) - (5)].nd), new_rescue(p, (yyvsp[(3) - (5)].nd), list1(list3(0, 0, (yyvsp[(5) - (5)].nd))), 0));
+ ;}
+ break;
+
+ case 188:
+
+/* Line 1464 of yacc.c */
+#line 1726 "src/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, (yyvsp[(1) - (3)].nd), (yyvsp[(2) - (3)].id), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 189:
+
+/* Line 1464 of yacc.c */
+#line 1730 "src/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, (yyvsp[(1) - (5)].nd), (yyvsp[(2) - (5)].id), new_rescue(p, (yyvsp[(3) - (5)].nd), list1(list3(0, 0, (yyvsp[(5) - (5)].nd))), 0));
+ ;}
+ break;
+
+ case 190:
+
+/* Line 1464 of yacc.c */
+#line 1734 "src/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[(1) - (6)].nd), intern("[]",2), (yyvsp[(3) - (6)].nd)), (yyvsp[(5) - (6)].id), (yyvsp[(6) - (6)].nd));
+ ;}
+ break;
+
+ case 191:
+
+/* Line 1464 of yacc.c */
+#line 1738 "src/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), 0), (yyvsp[(4) - (5)].id), (yyvsp[(5) - (5)].nd));
+ ;}
+ break;
+
+ case 192:
+
+/* Line 1464 of yacc.c */
+#line 1742 "src/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), 0), (yyvsp[(4) - (5)].id), (yyvsp[(5) - (5)].nd));
+ ;}
+ break;
+
+ case 193:
+
+/* Line 1464 of yacc.c */
+#line 1746 "src/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), 0), (yyvsp[(4) - (5)].id), (yyvsp[(5) - (5)].nd));
+ ;}
+ break;
+
+ case 194:
+
+/* Line 1464 of yacc.c */
+#line 1750 "src/parse.y"
+ {
+ yyerror(p, "constant re-assignment");
+ (yyval.nd) = new_begin(p, 0);
+ ;}
+ break;
+
+ case 195:
+
+/* Line 1464 of yacc.c */
+#line 1755 "src/parse.y"
+ {
+ yyerror(p, "constant re-assignment");
+ (yyval.nd) = new_begin(p, 0);
+ ;}
+ break;
+
+ case 196:
+
+/* Line 1464 of yacc.c */
+#line 1760 "src/parse.y"
+ {
+ backref_error(p, (yyvsp[(1) - (3)].nd));
+ (yyval.nd) = new_begin(p, 0);
+ ;}
+ break;
+
+ case 197:
+
+/* Line 1464 of yacc.c */
+#line 1765 "src/parse.y"
+ {
+ (yyval.nd) = new_dot2(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 198:
+
+/* Line 1464 of yacc.c */
+#line 1769 "src/parse.y"
+ {
+ (yyval.nd) = new_dot3(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 199:
+
+/* Line 1464 of yacc.c */
+#line 1773 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "+", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 200:
+
+/* Line 1464 of yacc.c */
+#line 1777 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "-", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 201:
+
+/* Line 1464 of yacc.c */
+#line 1781 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "*", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 202:
+
+/* Line 1464 of yacc.c */
+#line 1785 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "/", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 203:
+
+/* Line 1464 of yacc.c */
+#line 1789 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "%", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 204:
+
+/* Line 1464 of yacc.c */
+#line 1793 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "**", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 205:
+
+/* Line 1464 of yacc.c */
+#line 1797 "src/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, call_bin_op(p, (yyvsp[(2) - (4)].nd), "**", (yyvsp[(4) - (4)].nd)), "-@");
+ ;}
+ break;
+
+ case 206:
+
+/* Line 1464 of yacc.c */
+#line 1801 "src/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, call_bin_op(p, (yyvsp[(2) - (4)].nd), "**", (yyvsp[(4) - (4)].nd)), "-@");
+ ;}
+ break;
+
+ case 207:
+
+/* Line 1464 of yacc.c */
+#line 1805 "src/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, (yyvsp[(2) - (2)].nd), "+@");
+ ;}
+ break;
+
+ case 208:
+
+/* Line 1464 of yacc.c */
+#line 1809 "src/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, (yyvsp[(2) - (2)].nd), "-@");
+ ;}
+ break;
+
+ case 209:
+
+/* Line 1464 of yacc.c */
+#line 1813 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "|", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 210:
+
+/* Line 1464 of yacc.c */
+#line 1817 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "^", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 211:
+
+/* Line 1464 of yacc.c */
+#line 1821 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "&", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 212:
+
+/* Line 1464 of yacc.c */
+#line 1825 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "<=>", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 213:
+
+/* Line 1464 of yacc.c */
+#line 1829 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), ">", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 214:
+
+/* Line 1464 of yacc.c */
+#line 1833 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), ">=", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 215:
+
+/* Line 1464 of yacc.c */
+#line 1837 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "<", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 216:
+
+/* Line 1464 of yacc.c */
+#line 1841 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "<=", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 217:
+
+/* Line 1464 of yacc.c */
+#line 1845 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "==", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 218:
+
+/* Line 1464 of yacc.c */
+#line 1849 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "===", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 219:
+
+/* Line 1464 of yacc.c */
+#line 1853 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "!=", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 220:
+
+/* Line 1464 of yacc.c */
+#line 1857 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "=~", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 221:
+
+/* Line 1464 of yacc.c */
+#line 1861 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "!~", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 222:
+
+/* Line 1464 of yacc.c */
+#line 1865 "src/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, cond((yyvsp[(2) - (2)].nd)), "!");
+ ;}
+ break;
+
+ case 223:
+
+/* Line 1464 of yacc.c */
+#line 1869 "src/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, cond((yyvsp[(2) - (2)].nd)), "~");
+ ;}
+ break;
+
+ case 224:
+
+/* Line 1464 of yacc.c */
+#line 1873 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "<<", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 225:
+
+/* Line 1464 of yacc.c */
+#line 1877 "src/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), ">>", (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 226:
+
+/* Line 1464 of yacc.c */
+#line 1881 "src/parse.y"
+ {
+ (yyval.nd) = new_and(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 227:
+
+/* Line 1464 of yacc.c */
+#line 1885 "src/parse.y"
+ {
+ (yyval.nd) = new_or(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 228:
+
+/* Line 1464 of yacc.c */
+#line 1889 "src/parse.y"
+ {
+ (yyval.nd) = new_if(p, cond((yyvsp[(1) - (6)].nd)), (yyvsp[(3) - (6)].nd), (yyvsp[(6) - (6)].nd));
+ ;}
+ break;
+
+ case 229:
+
+/* Line 1464 of yacc.c */
+#line 1893 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(1) - (1)].nd);
+ ;}
+ break;
+
+ case 230:
+
+/* Line 1464 of yacc.c */
+#line 1899 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(1) - (1)].nd);
+ if (!(yyval.nd)) (yyval.nd) = new_nil(p);
+ ;}
+ break;
+
+ case 232:
+
+/* Line 1464 of yacc.c */
+#line 1907 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(1) - (2)].nd);
+ NODE_LINENO((yyval.nd), (yyvsp[(1) - (2)].nd));
+ ;}
+ break;
+
+ case 233:
+
+/* Line 1464 of yacc.c */
+#line 1912 "src/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[(1) - (4)].nd), new_hash(p, (yyvsp[(3) - (4)].nd)));
+ ;}
+ break;
+
+ case 234:
+
+/* Line 1464 of yacc.c */
+#line 1916 "src/parse.y"
+ {
+ (yyval.nd) = cons(new_hash(p, (yyvsp[(1) - (2)].nd)), 0);
+ NODE_LINENO((yyval.nd), (yyvsp[(1) - (2)].nd));
+ ;}
+ break;
+
+ case 235:
+
+/* Line 1464 of yacc.c */
+#line 1923 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(2) - (3)].nd);
+ ;}
+ break;
+
+ case 240:
+
+/* Line 1464 of yacc.c */
+#line 1935 "src/parse.y"
+ {
+ (yyval.nd) = cons((yyvsp[(1) - (2)].nd),0);
+ NODE_LINENO((yyval.nd), (yyvsp[(1) - (2)].nd));
+ ;}
+ break;
+
+ case 241:
+
+/* Line 1464 of yacc.c */
+#line 1940 "src/parse.y"
+ {
+ (yyval.nd) = cons(push((yyvsp[(1) - (4)].nd), new_hash(p, (yyvsp[(3) - (4)].nd))), 0);
+ NODE_LINENO((yyval.nd), (yyvsp[(1) - (4)].nd));
+ ;}
+ break;
+
+ case 242:
+
+/* Line 1464 of yacc.c */
+#line 1945 "src/parse.y"
+ {
+ (yyval.nd) = cons(list1(new_hash(p, (yyvsp[(1) - (2)].nd))), 0);
+ NODE_LINENO((yyval.nd), (yyvsp[(1) - (2)].nd));
+ ;}
+ break;
+
+ case 243:
+
+/* Line 1464 of yacc.c */
+#line 1952 "src/parse.y"
+ {
+ (yyval.nd) = cons(list1((yyvsp[(1) - (1)].nd)), 0);
+ NODE_LINENO((yyval.nd), (yyvsp[(1) - (1)].nd));
+ ;}
+ break;
+
+ case 244:
+
+/* Line 1464 of yacc.c */
+#line 1957 "src/parse.y"
+ {
+ (yyval.nd) = cons((yyvsp[(1) - (2)].nd), (yyvsp[(2) - (2)].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[(1) - (2)].nd));
+ ;}
+ break;
+
+ case 245:
+
+/* Line 1464 of yacc.c */
+#line 1962 "src/parse.y"
+ {
+ (yyval.nd) = cons(list1(new_hash(p, (yyvsp[(1) - (2)].nd))), (yyvsp[(2) - (2)].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[(1) - (2)].nd));
+ ;}
+ break;
+
+ case 246:
+
+/* Line 1464 of yacc.c */
+#line 1967 "src/parse.y"
+ {
+ (yyval.nd) = cons(push((yyvsp[(1) - (4)].nd), new_hash(p, (yyvsp[(3) - (4)].nd))), (yyvsp[(4) - (4)].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[(1) - (4)].nd));
+ ;}
+ break;
+
+ case 247:
+
+/* Line 1464 of yacc.c */
+#line 1972 "src/parse.y"
+ {
+ (yyval.nd) = cons(0, (yyvsp[(1) - (1)].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[(1) - (1)].nd));
+ ;}
+ break;
+
+ case 248:
+
+/* Line 1464 of yacc.c */
+#line 1978 "src/parse.y"
+ {
+ (yyval.stack) = p->cmdarg_stack;
+ CMDARG_PUSH(1);
+ ;}
+ break;
+
+ case 249:
+
+/* Line 1464 of yacc.c */
+#line 1983 "src/parse.y"
+ {
+ p->cmdarg_stack = (yyvsp[(1) - (2)].stack);
+ (yyval.nd) = (yyvsp[(2) - (2)].nd);
+ ;}
+ break;
+
+ case 250:
+
+/* Line 1464 of yacc.c */
+#line 1990 "src/parse.y"
+ {
+ (yyval.nd) = new_block_arg(p, (yyvsp[(2) - (2)].nd));
+ ;}
+ break;
+
+ case 251:
+
+/* Line 1464 of yacc.c */
+#line 1996 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(2) - (2)].nd);
+ ;}
+ break;
+
+ case 252:
+
+/* Line 1464 of yacc.c */
+#line 2000 "src/parse.y"
+ {
+ (yyval.nd) = 0;
+ ;}
+ break;
+
+ case 253:
+
+/* Line 1464 of yacc.c */
+#line 2006 "src/parse.y"
+ {
+ (yyval.nd) = cons((yyvsp[(1) - (1)].nd), 0);
+ NODE_LINENO((yyval.nd), (yyvsp[(1) - (1)].nd));
+ ;}
+ break;
+
+ case 254:
+
+/* Line 1464 of yacc.c */
+#line 2011 "src/parse.y"
+ {
+ (yyval.nd) = cons(new_splat(p, (yyvsp[(2) - (2)].nd)), 0);
+ NODE_LINENO((yyval.nd), (yyvsp[(2) - (2)].nd));
+ ;}
+ break;
+
+ case 255:
+
+/* Line 1464 of yacc.c */
+#line 2016 "src/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 256:
+
+/* Line 1464 of yacc.c */
+#line 2020 "src/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[(1) - (4)].nd), new_splat(p, (yyvsp[(4) - (4)].nd)));
+ ;}
+ break;
+
+ case 257:
+
+/* Line 1464 of yacc.c */
+#line 2024 "src/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[(1) - (4)].nd), (yyvsp[(4) - (4)].nd));
+ ;}
+ break;
+
+ case 258:
+
+/* Line 1464 of yacc.c */
+#line 2028 "src/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[(1) - (5)].nd), new_splat(p, (yyvsp[(5) - (5)].nd)));
+ ;}
+ break;
+
+ case 259:
+
+/* Line 1464 of yacc.c */
+#line 2034 "src/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 260:
+
+/* Line 1464 of yacc.c */
+#line 2038 "src/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[(1) - (4)].nd), new_splat(p, (yyvsp[(4) - (4)].nd)));
+ ;}
+ break;
+
+ case 261:
+
+/* Line 1464 of yacc.c */
+#line 2042 "src/parse.y"
+ {
+ (yyval.nd) = list1(new_splat(p, (yyvsp[(2) - (2)].nd)));
+ ;}
+ break;
+
+ case 269:
+
+/* Line 1464 of yacc.c */
+#line 2055 "src/parse.y"
+ {
+ (yyval.nd) = new_fcall(p, (yyvsp[(1) - (1)].id), 0);
+ ;}
+ break;
+
+ case 270:
+
+/* Line 1464 of yacc.c */
+#line 2059 "src/parse.y"
+ {
+ (yyval.stack) = p->cmdarg_stack;
+ p->cmdarg_stack = 0;
+ ;}
+ break;
+
+ case 271:
+
+/* Line 1464 of yacc.c */
+#line 2065 "src/parse.y"
+ {
+ p->cmdarg_stack = (yyvsp[(2) - (4)].stack);
+ (yyval.nd) = (yyvsp[(3) - (4)].nd);
+ ;}
+ break;
+
+ case 272:
+
+/* Line 1464 of yacc.c */
+#line 2070 "src/parse.y"
+ {
+ (yyval.stack) = p->cmdarg_stack;
+ p->cmdarg_stack = 0;
+ ;}
+ break;
+
+ case 273:
+
+/* Line 1464 of yacc.c */
+#line 2074 "src/parse.y"
+ {p->lstate = EXPR_ENDARG;;}
+ break;
+
+ case 274:
+
+/* Line 1464 of yacc.c */
+#line 2075 "src/parse.y"
+ {
+ p->cmdarg_stack = (yyvsp[(2) - (5)].stack);
+ (yyval.nd) = (yyvsp[(3) - (5)].nd);
+ ;}
+ break;
+
+ case 275:
+
+/* Line 1464 of yacc.c */
+#line 2079 "src/parse.y"
+ {p->lstate = EXPR_ENDARG;;}
+ break;
+
+ case 276:
+
+/* Line 1464 of yacc.c */
+#line 2080 "src/parse.y"
+ {
+ (yyval.nd) = 0;
+ ;}
+ break;
+
+ case 277:
+
+/* Line 1464 of yacc.c */
+#line 2084 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(2) - (3)].nd);
+ ;}
+ break;
+
+ case 278:
+
+/* Line 1464 of yacc.c */
+#line 2088 "src/parse.y"
+ {
+ (yyval.nd) = new_colon2(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id));
+ ;}
+ break;
+
+ case 279:
+
+/* Line 1464 of yacc.c */
+#line 2092 "src/parse.y"
+ {
+ (yyval.nd) = new_colon3(p, (yyvsp[(2) - (2)].id));
+ ;}
+ break;
+
+ case 280:
+
+/* Line 1464 of yacc.c */
+#line 2096 "src/parse.y"
+ {
+ (yyval.nd) = new_array(p, (yyvsp[(2) - (3)].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[(2) - (3)].nd));
+ ;}
+ break;
+
+ case 281:
+
+/* Line 1464 of yacc.c */
+#line 2101 "src/parse.y"
+ {
+ (yyval.nd) = new_hash(p, (yyvsp[(2) - (3)].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[(2) - (3)].nd));
+ ;}
+ break;
+
+ case 282:
+
+/* Line 1464 of yacc.c */
+#line 2106 "src/parse.y"
+ {
+ (yyval.nd) = new_return(p, 0);
+ ;}
+ break;
+
+ case 283:
+
+/* Line 1464 of yacc.c */
+#line 2110 "src/parse.y"
+ {
+ (yyval.nd) = new_yield(p, (yyvsp[(3) - (4)].nd));
+ ;}
+ break;
+
+ case 284:
+
+/* Line 1464 of yacc.c */
+#line 2114 "src/parse.y"
+ {
+ (yyval.nd) = new_yield(p, 0);
+ ;}
+ break;
+
+ case 285:
+
+/* Line 1464 of yacc.c */
+#line 2118 "src/parse.y"
+ {
+ (yyval.nd) = new_yield(p, 0);
+ ;}
+ break;
+
+ case 286:
+
+/* Line 1464 of yacc.c */
+#line 2122 "src/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, cond((yyvsp[(3) - (4)].nd)), "!");
+ ;}
+ break;
+
+ case 287:
+
+/* Line 1464 of yacc.c */
+#line 2126 "src/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, new_nil(p), "!");
+ ;}
+ break;
+
+ case 288:
+
+/* Line 1464 of yacc.c */
+#line 2130 "src/parse.y"
+ {
+ (yyval.nd) = new_fcall(p, (yyvsp[(1) - (2)].id), cons(0, (yyvsp[(2) - (2)].nd)));
+ ;}
+ break;
+
+ case 290:
+
+/* Line 1464 of yacc.c */
+#line 2135 "src/parse.y"
+ {
+ call_with_block(p, (yyvsp[(1) - (2)].nd), (yyvsp[(2) - (2)].nd));
+ (yyval.nd) = (yyvsp[(1) - (2)].nd);
+ ;}
+ break;
+
+ case 291:
+
+/* Line 1464 of yacc.c */
+#line 2140 "src/parse.y"
+ {
+ local_nest(p);
+ (yyval.num) = p->lpar_beg;
+ p->lpar_beg = ++p->paren_nest;
+ ;}
+ break;
+
+ case 292:
+
+/* Line 1464 of yacc.c */
+#line 2147 "src/parse.y"
+ {
+ p->lpar_beg = (yyvsp[(2) - (4)].num);
+ (yyval.nd) = new_lambda(p, (yyvsp[(3) - (4)].nd), (yyvsp[(4) - (4)].nd));
+ local_unnest(p);
+ ;}
+ break;
+
+ case 293:
+
+/* Line 1464 of yacc.c */
+#line 2156 "src/parse.y"
+ {
+ (yyval.nd) = new_if(p, cond((yyvsp[(2) - (6)].nd)), (yyvsp[(4) - (6)].nd), (yyvsp[(5) - (6)].nd));
+ SET_LINENO((yyval.nd), (yyvsp[(1) - (6)].num));
+ ;}
+ break;
+
+ case 294:
+
+/* Line 1464 of yacc.c */
+#line 2164 "src/parse.y"
+ {
+ (yyval.nd) = new_unless(p, cond((yyvsp[(2) - (6)].nd)), (yyvsp[(4) - (6)].nd), (yyvsp[(5) - (6)].nd));
+ SET_LINENO((yyval.nd), (yyvsp[(1) - (6)].num));
+ ;}
+ break;
+
+ case 295:
+
+/* Line 1464 of yacc.c */
+#line 2168 "src/parse.y"
+ {COND_PUSH(1);;}
+ break;
+
+ case 296:
+
+/* Line 1464 of yacc.c */
+#line 2168 "src/parse.y"
+ {COND_POP();;}
+ break;
+
+ case 297:
+
+/* Line 1464 of yacc.c */
+#line 2171 "src/parse.y"
+ {
+ (yyval.nd) = new_while(p, cond((yyvsp[(3) - (7)].nd)), (yyvsp[(6) - (7)].nd));
+ SET_LINENO((yyval.nd), (yyvsp[(1) - (7)].num));
+ ;}
+ break;
+
+ case 298:
+
+/* Line 1464 of yacc.c */
+#line 2175 "src/parse.y"
+ {COND_PUSH(1);;}
+ break;
+
+ case 299:
+
+/* Line 1464 of yacc.c */
+#line 2175 "src/parse.y"
+ {COND_POP();;}
+ break;
+
+ case 300:
+
+/* Line 1464 of yacc.c */
+#line 2178 "src/parse.y"
+ {
+ (yyval.nd) = new_until(p, cond((yyvsp[(3) - (7)].nd)), (yyvsp[(6) - (7)].nd));
+ SET_LINENO((yyval.nd), (yyvsp[(1) - (7)].num));
+ ;}
+ break;
+
+ case 301:
+
+/* Line 1464 of yacc.c */
+#line 2185 "src/parse.y"
+ {
+ (yyval.nd) = new_case(p, (yyvsp[(2) - (5)].nd), (yyvsp[(4) - (5)].nd));
+ ;}
+ break;
+
+ case 302:
+
+/* Line 1464 of yacc.c */
+#line 2189 "src/parse.y"
+ {
+ (yyval.nd) = new_case(p, 0, (yyvsp[(3) - (4)].nd));
+ ;}
+ break;
+
+ case 303:
+
+/* Line 1464 of yacc.c */
+#line 2193 "src/parse.y"
+ {COND_PUSH(1);;}
+ break;
+
+ case 304:
+
+/* Line 1464 of yacc.c */
+#line 2195 "src/parse.y"
+ {COND_POP();;}
+ break;
+
+ case 305:
+
+/* Line 1464 of yacc.c */
+#line 2198 "src/parse.y"
+ {
+ (yyval.nd) = new_for(p, (yyvsp[(2) - (9)].nd), (yyvsp[(5) - (9)].nd), (yyvsp[(8) - (9)].nd));
+ SET_LINENO((yyval.nd), (yyvsp[(1) - (9)].num));
+ ;}
+ break;
+
+ case 306:
+
+/* Line 1464 of yacc.c */
+#line 2204 "src/parse.y"
+ {
+ if (p->in_def || p->in_single)
+ yyerror(p, "class definition in method body");
+ (yyval.nd) = local_switch(p);
+ ;}
+ break;
+
+ case 307:
+
+/* Line 1464 of yacc.c */
+#line 2211 "src/parse.y"
+ {
+ (yyval.nd) = new_class(p, (yyvsp[(2) - (6)].nd), (yyvsp[(3) - (6)].nd), (yyvsp[(5) - (6)].nd));
+ SET_LINENO((yyval.nd), (yyvsp[(1) - (6)].num));
+ local_resume(p, (yyvsp[(4) - (6)].nd));
+ ;}
+ break;
+
+ case 308:
+
+/* Line 1464 of yacc.c */
+#line 2218 "src/parse.y"
+ {
+ (yyval.num) = p->in_def;
+ p->in_def = 0;
+ ;}
+ break;
+
+ case 309:
+
+/* Line 1464 of yacc.c */
+#line 2223 "src/parse.y"
+ {
+ (yyval.nd) = cons(local_switch(p), (node*)(intptr_t)p->in_single);
+ p->in_single = 0;
+ ;}
+ break;
+
+ case 310:
+
+/* Line 1464 of yacc.c */
+#line 2229 "src/parse.y"
+ {
+ (yyval.nd) = new_sclass(p, (yyvsp[(3) - (8)].nd), (yyvsp[(7) - (8)].nd));
+ SET_LINENO((yyval.nd), (yyvsp[(1) - (8)].num));
+ local_resume(p, (yyvsp[(6) - (8)].nd)->car);
+ p->in_def = (yyvsp[(4) - (8)].num);
+ p->in_single = (int)(intptr_t)(yyvsp[(6) - (8)].nd)->cdr;
+ ;}
+ break;
+
+ case 311:
+
+/* Line 1464 of yacc.c */
+#line 2238 "src/parse.y"
+ {
+ if (p->in_def || p->in_single)
+ yyerror(p, "module definition in method body");
+ (yyval.nd) = local_switch(p);
+ ;}
+ break;
+
+ case 312:
+
+/* Line 1464 of yacc.c */
+#line 2245 "src/parse.y"
+ {
+ (yyval.nd) = new_module(p, (yyvsp[(2) - (5)].nd), (yyvsp[(4) - (5)].nd));
+ SET_LINENO((yyval.nd), (yyvsp[(1) - (5)].num));
+ local_resume(p, (yyvsp[(3) - (5)].nd));
+ ;}
+ break;
+
+ case 313:
+
+/* Line 1464 of yacc.c */
+#line 2251 "src/parse.y"
+ {
+ (yyval.stack) = p->cmdarg_stack;
+ p->cmdarg_stack = 0;
+ ;}
+ break;
+
+ case 314:
+
+/* Line 1464 of yacc.c */
+#line 2255 "src/parse.y"
+ {
+ p->in_def++;
+ (yyval.nd) = local_switch(p);
+ ;}
+ break;
+
+ case 315:
+
+/* Line 1464 of yacc.c */
+#line 2262 "src/parse.y"
+ {
+ (yyval.nd) = new_def(p, (yyvsp[(2) - (7)].id), (yyvsp[(5) - (7)].nd), (yyvsp[(6) - (7)].nd));
+ SET_LINENO((yyval.nd), (yyvsp[(1) - (7)].num));
+ local_resume(p, (yyvsp[(4) - (7)].nd));
+ p->in_def--;
+ p->cmdarg_stack = (yyvsp[(3) - (7)].stack);
+ ;}
+ break;
+
+ case 316:
+
+/* Line 1464 of yacc.c */
+#line 2270 "src/parse.y"
+ {
+ p->lstate = EXPR_FNAME;
+ (yyval.stack) = p->cmdarg_stack;
+ p->cmdarg_stack = 0;
+ ;}
+ break;
+
+ case 317:
+
+/* Line 1464 of yacc.c */
+#line 2276 "src/parse.y"
+ {
+ p->in_single++;
+ p->lstate = EXPR_ENDFN; /* force for args */
+ (yyval.nd) = local_switch(p);
+ ;}
+ break;
+
+ case 318:
+
+/* Line 1464 of yacc.c */
+#line 2284 "src/parse.y"
+ {
+ (yyval.nd) = new_sdef(p, (yyvsp[(2) - (9)].nd), (yyvsp[(5) - (9)].id), (yyvsp[(7) - (9)].nd), (yyvsp[(8) - (9)].nd));
+ SET_LINENO((yyval.nd), (yyvsp[(1) - (9)].num));
+ local_resume(p, (yyvsp[(6) - (9)].nd));
+ p->in_single--;
+ p->cmdarg_stack = (yyvsp[(4) - (9)].stack);
+ ;}
+ break;
+
+ case 319:
+
+/* Line 1464 of yacc.c */
+#line 2292 "src/parse.y"
+ {
+ (yyval.nd) = new_break(p, 0);
+ ;}
+ break;
+
+ case 320:
+
+/* Line 1464 of yacc.c */
+#line 2296 "src/parse.y"
+ {
+ (yyval.nd) = new_next(p, 0);
+ ;}
+ break;
+
+ case 321:
+
+/* Line 1464 of yacc.c */
+#line 2300 "src/parse.y"
+ {
+ (yyval.nd) = new_redo(p);
+ ;}
+ break;
+
+ case 322:
+
+/* Line 1464 of yacc.c */
+#line 2304 "src/parse.y"
+ {
+ (yyval.nd) = new_retry(p);
+ ;}
+ break;
+
+ case 323:
+
+/* Line 1464 of yacc.c */
+#line 2310 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(1) - (1)].nd);
+ if (!(yyval.nd)) (yyval.nd) = new_nil(p);
+ ;}
+ break;
+
+ case 330:
+
+/* Line 1464 of yacc.c */
+#line 2329 "src/parse.y"
+ {
+ (yyval.nd) = new_if(p, cond((yyvsp[(2) - (5)].nd)), (yyvsp[(4) - (5)].nd), (yyvsp[(5) - (5)].nd));
+ ;}
+ break;
+
+ case 332:
+
+/* Line 1464 of yacc.c */
+#line 2336 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(2) - (2)].nd);
+ ;}
+ break;
+
+ case 333:
+
+/* Line 1464 of yacc.c */
+#line 2342 "src/parse.y"
+ {
+ (yyval.nd) = list1(list1((yyvsp[(1) - (1)].nd)));
+ ;}
+ break;
+
+ case 335:
+
+/* Line 1464 of yacc.c */
+#line 2349 "src/parse.y"
+ {
+ (yyval.nd) = new_arg(p, (yyvsp[(1) - (1)].id));
+ ;}
+ break;
+
+ case 336:
+
+/* Line 1464 of yacc.c */
+#line 2353 "src/parse.y"
+ {
+ (yyval.nd) = new_masgn(p, (yyvsp[(2) - (3)].nd), 0);
+ ;}
+ break;
+
+ case 337:
+
+/* Line 1464 of yacc.c */
+#line 2359 "src/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[(1) - (1)].nd));
+ ;}
+ break;
+
+ case 338:
+
+/* Line 1464 of yacc.c */
+#line 2363 "src/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 339:
+
+/* Line 1464 of yacc.c */
+#line 2369 "src/parse.y"
+ {
+ (yyval.nd) = list3((yyvsp[(1) - (1)].nd),0,0);
+ ;}
+ break;
+
+ case 340:
+
+/* Line 1464 of yacc.c */
+#line 2373 "src/parse.y"
+ {
+ (yyval.nd) = list3((yyvsp[(1) - (4)].nd), new_arg(p, (yyvsp[(4) - (4)].id)), 0);
+ ;}
+ break;
+
+ case 341:
+
+/* Line 1464 of yacc.c */
+#line 2377 "src/parse.y"
+ {
+ (yyval.nd) = list3((yyvsp[(1) - (6)].nd), new_arg(p, (yyvsp[(4) - (6)].id)), (yyvsp[(6) - (6)].nd));
+ ;}
+ break;
+
+ case 342:
+
+/* Line 1464 of yacc.c */
+#line 2381 "src/parse.y"
+ {
+ (yyval.nd) = list3((yyvsp[(1) - (3)].nd), (node*)-1, 0);
+ ;}
+ break;
+
+ case 343:
+
+/* Line 1464 of yacc.c */
+#line 2385 "src/parse.y"
+ {
+ (yyval.nd) = list3((yyvsp[(1) - (5)].nd), (node*)-1, (yyvsp[(5) - (5)].nd));
+ ;}
+ break;
+
+ case 344:
+
+/* Line 1464 of yacc.c */
+#line 2389 "src/parse.y"
+ {
+ (yyval.nd) = list3(0, new_arg(p, (yyvsp[(2) - (2)].id)), 0);
+ ;}
+ break;
+
+ case 345:
+
+/* Line 1464 of yacc.c */
+#line 2393 "src/parse.y"
+ {
+ (yyval.nd) = list3(0, new_arg(p, (yyvsp[(2) - (4)].id)), (yyvsp[(4) - (4)].nd));
+ ;}
+ break;
+
+ case 346:
+
+/* Line 1464 of yacc.c */
+#line 2397 "src/parse.y"
+ {
+ (yyval.nd) = list3(0, (node*)-1, 0);
+ ;}
+ break;
+
+ case 347:
+
+/* Line 1464 of yacc.c */
+#line 2401 "src/parse.y"
+ {
+ (yyval.nd) = list3(0, (node*)-1, (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 348:
+
+/* Line 1464 of yacc.c */
+#line 2407 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[(1) - (6)].nd), (yyvsp[(3) - (6)].nd), (yyvsp[(5) - (6)].id), 0, (yyvsp[(6) - (6)].id));
+ ;}
+ break;
+
+ case 349:
+
+/* Line 1464 of yacc.c */
+#line 2411 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[(1) - (8)].nd), (yyvsp[(3) - (8)].nd), (yyvsp[(5) - (8)].id), (yyvsp[(7) - (8)].nd), (yyvsp[(8) - (8)].id));
+ ;}
+ break;
+
+ case 350:
+
+/* Line 1464 of yacc.c */
+#line 2415 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].nd), 0, 0, (yyvsp[(4) - (4)].id));
+ ;}
+ break;
+
+ case 351:
+
+/* Line 1464 of yacc.c */
+#line 2419 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[(1) - (6)].nd), (yyvsp[(3) - (6)].nd), 0, (yyvsp[(5) - (6)].nd), (yyvsp[(6) - (6)].id));
+ ;}
+ break;
+
+ case 352:
+
+/* Line 1464 of yacc.c */
+#line 2423 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[(1) - (4)].nd), 0, (yyvsp[(3) - (4)].id), 0, (yyvsp[(4) - (4)].id));
+ ;}
+ break;
+
+ case 353:
+
+/* Line 1464 of yacc.c */
+#line 2427 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[(1) - (2)].nd), 0, 1, 0, 0);
+ ;}
+ break;
+
+ case 354:
+
+/* Line 1464 of yacc.c */
+#line 2431 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[(1) - (6)].nd), 0, (yyvsp[(3) - (6)].id), (yyvsp[(5) - (6)].nd), (yyvsp[(6) - (6)].id));
+ ;}
+ break;
+
+ case 355:
+
+/* Line 1464 of yacc.c */
+#line 2435 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[(1) - (2)].nd), 0, 0, 0, (yyvsp[(2) - (2)].id));
+ ;}
+ break;
+
+ case 356:
+
+/* Line 1464 of yacc.c */
+#line 2439 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, (yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].id), 0, (yyvsp[(4) - (4)].id));
+ ;}
+ break;
+
+ case 357:
+
+/* Line 1464 of yacc.c */
+#line 2443 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, (yyvsp[(1) - (6)].nd), (yyvsp[(3) - (6)].id), (yyvsp[(5) - (6)].nd), (yyvsp[(6) - (6)].id));
+ ;}
+ break;
+
+ case 358:
+
+/* Line 1464 of yacc.c */
+#line 2447 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, (yyvsp[(1) - (2)].nd), 0, 0, (yyvsp[(2) - (2)].id));
+ ;}
+ break;
+
+ case 359:
+
+/* Line 1464 of yacc.c */
+#line 2451 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, (yyvsp[(1) - (4)].nd), 0, (yyvsp[(3) - (4)].nd), (yyvsp[(4) - (4)].id));
+ ;}
+ break;
+
+ case 360:
+
+/* Line 1464 of yacc.c */
+#line 2455 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, 0, (yyvsp[(1) - (2)].id), 0, (yyvsp[(2) - (2)].id));
+ ;}
+ break;
+
+ case 361:
+
+/* Line 1464 of yacc.c */
+#line 2459 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, 0, (yyvsp[(1) - (4)].id), (yyvsp[(3) - (4)].nd), (yyvsp[(4) - (4)].id));
+ ;}
+ break;
+
+ case 362:
+
+/* Line 1464 of yacc.c */
+#line 2463 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, 0, 0, 0, (yyvsp[(1) - (1)].id));
+ ;}
+ break;
+
+ case 364:
+
+/* Line 1464 of yacc.c */
+#line 2470 "src/parse.y"
+ {
+ p->cmd_start = TRUE;
+ (yyval.nd) = (yyvsp[(1) - (1)].nd);
+ ;}
+ break;
+
+ case 365:
+
+/* Line 1464 of yacc.c */
+#line 2477 "src/parse.y"
+ {
+ (yyval.nd) = 0;
+ ;}
+ break;
+
+ case 366:
+
+/* Line 1464 of yacc.c */
+#line 2481 "src/parse.y"
+ {
+ (yyval.nd) = 0;
+ ;}
+ break;
+
+ case 367:
+
+/* Line 1464 of yacc.c */
+#line 2485 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(2) - (4)].nd);
+ ;}
+ break;
+
+ case 368:
+
+/* Line 1464 of yacc.c */
+#line 2492 "src/parse.y"
+ {
+ (yyval.nd) = 0;
+ ;}
+ break;
+
+ case 369:
+
+/* Line 1464 of yacc.c */
+#line 2496 "src/parse.y"
+ {
+ (yyval.nd) = 0;
+ ;}
+ break;
+
+ case 372:
+
+/* Line 1464 of yacc.c */
+#line 2506 "src/parse.y"
+ {
+ local_add_f(p, (yyvsp[(1) - (1)].id));
+ new_bv(p, (yyvsp[(1) - (1)].id));
+ ;}
+ break;
+
+ case 374:
+
+/* Line 1464 of yacc.c */
+#line 2514 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(2) - (4)].nd);
+ ;}
+ break;
+
+ case 375:
+
+/* Line 1464 of yacc.c */
+#line 2518 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(1) - (1)].nd);
+ ;}
+ break;
+
+ case 376:
+
+/* Line 1464 of yacc.c */
+#line 2524 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(2) - (3)].nd);
+ ;}
+ break;
+
+ case 377:
+
+/* Line 1464 of yacc.c */
+#line 2528 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(2) - (3)].nd);
+ ;}
+ break;
+
+ case 378:
+
+/* Line 1464 of yacc.c */
+#line 2534 "src/parse.y"
+ {
+ local_nest(p);
+ ;}
+ break;
+
+ case 379:
+
+/* Line 1464 of yacc.c */
+#line 2540 "src/parse.y"
+ {
+ (yyval.nd) = new_block(p,(yyvsp[(3) - (5)].nd),(yyvsp[(4) - (5)].nd));
+ local_unnest(p);
+ ;}
+ break;
+
+ case 380:
+
+/* Line 1464 of yacc.c */
+#line 2547 "src/parse.y"
+ {
+ if ((yyvsp[(1) - (2)].nd)->car == (node*)NODE_YIELD) {
+ yyerror(p, "block given to yield");
+ }
+ else {
+ call_with_block(p, (yyvsp[(1) - (2)].nd), (yyvsp[(2) - (2)].nd));
+ }
+ (yyval.nd) = (yyvsp[(1) - (2)].nd);
+ ;}
+ break;
+
+ case 381:
+
+/* Line 1464 of yacc.c */
+#line 2557 "src/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].id), (yyvsp[(4) - (4)].nd));
+ ;}
+ break;
+
+ case 382:
+
+/* Line 1464 of yacc.c */
+#line 2561 "src/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].nd));
+ call_with_block(p, (yyval.nd), (yyvsp[(5) - (5)].nd));
+ ;}
+ break;
+
+ case 383:
+
+/* Line 1464 of yacc.c */
+#line 2566 "src/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].nd));
+ call_with_block(p, (yyval.nd), (yyvsp[(5) - (5)].nd));
+ ;}
+ break;
+
+ case 384:
+
+/* Line 1464 of yacc.c */
+#line 2573 "src/parse.y"
+ {
+ (yyval.nd) = new_fcall(p, (yyvsp[(1) - (2)].id), (yyvsp[(2) - (2)].nd));
+ ;}
+ break;
+
+ case 385:
+
+/* Line 1464 of yacc.c */
+#line 2577 "src/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].id), (yyvsp[(4) - (4)].nd));
+ ;}
+ break;
+
+ case 386:
+
+/* Line 1464 of yacc.c */
+#line 2581 "src/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].id), (yyvsp[(4) - (4)].nd));
+ ;}
+ break;
+
+ case 387:
+
+/* Line 1464 of yacc.c */
+#line 2585 "src/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id), 0);
+ ;}
+ break;
+
+ case 388:
+
+/* Line 1464 of yacc.c */
+#line 2589 "src/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (3)].nd), intern("call",4), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 389:
+
+/* Line 1464 of yacc.c */
+#line 2593 "src/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (3)].nd), intern("call",4), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 390:
+
+/* Line 1464 of yacc.c */
+#line 2597 "src/parse.y"
+ {
+ (yyval.nd) = new_super(p, (yyvsp[(2) - (2)].nd));
+ ;}
+ break;
+
+ case 391:
+
+/* Line 1464 of yacc.c */
+#line 2601 "src/parse.y"
+ {
+ (yyval.nd) = new_zsuper(p);
+ ;}
+ break;
+
+ case 392:
+
+/* Line 1464 of yacc.c */
+#line 2605 "src/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[(1) - (4)].nd), intern("[]",2), (yyvsp[(3) - (4)].nd));
+ ;}
+ break;
+
+ case 393:
+
+/* Line 1464 of yacc.c */
+#line 2611 "src/parse.y"
+ {
+ local_nest(p);
+ (yyval.num) = p->lineno;
+ ;}
+ break;
+
+ case 394:
+
+/* Line 1464 of yacc.c */
+#line 2617 "src/parse.y"
+ {
+ (yyval.nd) = new_block(p,(yyvsp[(3) - (5)].nd),(yyvsp[(4) - (5)].nd));
+ SET_LINENO((yyval.nd), (yyvsp[(2) - (5)].num));
+ local_unnest(p);
+ ;}
+ break;
+
+ case 395:
+
+/* Line 1464 of yacc.c */
+#line 2623 "src/parse.y"
+ {
+ local_nest(p);
+ (yyval.num) = p->lineno;
+ ;}
+ break;
+
+ case 396:
+
+/* Line 1464 of yacc.c */
+#line 2629 "src/parse.y"
+ {
+ (yyval.nd) = new_block(p,(yyvsp[(3) - (5)].nd),(yyvsp[(4) - (5)].nd));
+ SET_LINENO((yyval.nd), (yyvsp[(2) - (5)].num));
+ local_unnest(p);
+ ;}
+ break;
+
+ case 397:
+
+/* Line 1464 of yacc.c */
+#line 2639 "src/parse.y"
+ {
+ (yyval.nd) = cons(cons((yyvsp[(2) - (5)].nd), (yyvsp[(4) - (5)].nd)), (yyvsp[(5) - (5)].nd));
+ ;}
+ break;
+
+ case 398:
+
+/* Line 1464 of yacc.c */
+#line 2645 "src/parse.y"
+ {
+ if ((yyvsp[(1) - (1)].nd)) {
+ (yyval.nd) = cons(cons(0, (yyvsp[(1) - (1)].nd)), 0);
+ }
+ else {
+ (yyval.nd) = 0;
+ }
+ ;}
+ break;
+
+ case 400:
+
+/* Line 1464 of yacc.c */
+#line 2659 "src/parse.y"
+ {
+ (yyval.nd) = list1(list3((yyvsp[(2) - (6)].nd), (yyvsp[(3) - (6)].nd), (yyvsp[(5) - (6)].nd)));
+ if ((yyvsp[(6) - (6)].nd)) (yyval.nd) = append((yyval.nd), (yyvsp[(6) - (6)].nd));
+ ;}
+ break;
+
+ case 402:
+
+/* Line 1464 of yacc.c */
+#line 2667 "src/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[(1) - (1)].nd));
+ ;}
+ break;
+
+ case 405:
+
+/* Line 1464 of yacc.c */
+#line 2675 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(2) - (2)].nd);
+ ;}
+ break;
+
+ case 407:
+
+/* Line 1464 of yacc.c */
+#line 2682 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(2) - (2)].nd);
+ ;}
+ break;
+
+ case 415:
+
+/* Line 1464 of yacc.c */
+#line 2697 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(2) - (2)].nd);
+ ;}
+ break;
+
+ case 416:
+
+/* Line 1464 of yacc.c */
+#line 2701 "src/parse.y"
+ {
+ (yyval.nd) = new_dstr(p, push((yyvsp[(2) - (3)].nd), (yyvsp[(3) - (3)].nd)));
+ ;}
+ break;
+
+ case 418:
+
+/* Line 1464 of yacc.c */
+#line 2708 "src/parse.y"
+ {
+ (yyval.nd) = append((yyvsp[(1) - (2)].nd), (yyvsp[(2) - (2)].nd));
+ ;}
+ break;
+
+ case 419:
+
+/* Line 1464 of yacc.c */
+#line 2714 "src/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[(1) - (1)].nd));
+ ;}
+ break;
+
+ case 420:
+
+/* Line 1464 of yacc.c */
+#line 2718 "src/parse.y"
+ {
+ (yyval.nd) = p->lex_strterm;
+ p->lex_strterm = NULL;
+ ;}
+ break;
+
+ case 421:
+
+/* Line 1464 of yacc.c */
+#line 2724 "src/parse.y"
+ {
+ p->lex_strterm = (yyvsp[(2) - (4)].nd);
+ (yyval.nd) = list2((yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].nd));
+ ;}
+ break;
+
+ case 422:
+
+/* Line 1464 of yacc.c */
+#line 2729 "src/parse.y"
+ {
+ (yyval.nd) = list1(new_literal_delim(p));
+ ;}
+ break;
+
+ case 423:
+
+/* Line 1464 of yacc.c */
+#line 2733 "src/parse.y"
+ {
+ (yyval.nd) = list1(new_literal_delim(p));
+ ;}
+ break;
+
+ case 424:
+
+/* Line 1464 of yacc.c */
+#line 2739 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(2) - (2)].nd);
+ ;}
+ break;
+
+ case 425:
+
+/* Line 1464 of yacc.c */
+#line 2743 "src/parse.y"
+ {
+ (yyval.nd) = new_dxstr(p, push((yyvsp[(2) - (3)].nd), (yyvsp[(3) - (3)].nd)));
+ ;}
+ break;
+
+ case 426:
+
+/* Line 1464 of yacc.c */
+#line 2749 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(2) - (2)].nd);
+ ;}
+ break;
+
+ case 427:
+
+/* Line 1464 of yacc.c */
+#line 2753 "src/parse.y"
+ {
+ (yyval.nd) = new_dregx(p, (yyvsp[(2) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 433:
+
+/* Line 1464 of yacc.c */
+#line 2770 "src/parse.y"
+ {
+ parser_heredoc_info * inf = parsing_heredoc_inf(p);
+ inf->doc = push(inf->doc, new_str(p, "", 0));
+ heredoc_end(p);
+ ;}
+ break;
+
+ case 434:
+
+/* Line 1464 of yacc.c */
+#line 2776 "src/parse.y"
+ {
+ heredoc_end(p);
+ ;}
+ break;
+
+ case 437:
+
+/* Line 1464 of yacc.c */
+#line 2786 "src/parse.y"
+ {
+ parser_heredoc_info * inf = parsing_heredoc_inf(p);
+ inf->doc = push(inf->doc, (yyvsp[(1) - (1)].nd));
+ heredoc_treat_nextline(p);
+ ;}
+ break;
+
+ case 438:
+
+/* Line 1464 of yacc.c */
+#line 2792 "src/parse.y"
+ {
+ (yyval.nd) = p->lex_strterm;
+ p->lex_strterm = NULL;
+ ;}
+ break;
+
+ case 439:
+
+/* Line 1464 of yacc.c */
+#line 2798 "src/parse.y"
+ {
+ parser_heredoc_info * inf = parsing_heredoc_inf(p);
+ p->lex_strterm = (yyvsp[(2) - (4)].nd);
+ inf->doc = push(push(inf->doc, (yyvsp[(1) - (4)].nd)), (yyvsp[(3) - (4)].nd));
+ ;}
+ break;
+
+ case 440:
+
+/* Line 1464 of yacc.c */
+#line 2806 "src/parse.y"
+ {
+ (yyval.nd) = new_words(p, list1((yyvsp[(2) - (2)].nd)));
+ ;}
+ break;
+
+ case 441:
+
+/* Line 1464 of yacc.c */
+#line 2810 "src/parse.y"
+ {
+ (yyval.nd) = new_words(p, push((yyvsp[(2) - (3)].nd), (yyvsp[(3) - (3)].nd)));
+ ;}
+ break;
+
+ case 442:
+
+/* Line 1464 of yacc.c */
+#line 2817 "src/parse.y"
+ {
+ (yyval.nd) = new_sym(p, (yyvsp[(1) - (1)].id));
+ ;}
+ break;
+
+ case 443:
+
+/* Line 1464 of yacc.c */
+#line 2821 "src/parse.y"
+ {
+ p->lstate = EXPR_END;
+ (yyval.nd) = new_dsym(p, push((yyvsp[(3) - (4)].nd), (yyvsp[(4) - (4)].nd)));
+ ;}
+ break;
+
+ case 444:
+
+/* Line 1464 of yacc.c */
+#line 2828 "src/parse.y"
+ {
+ p->lstate = EXPR_END;
+ (yyval.id) = (yyvsp[(2) - (2)].id);
+ ;}
+ break;
+
+ case 449:
+
+/* Line 1464 of yacc.c */
+#line 2839 "src/parse.y"
+ {
+ (yyval.id) = new_strsym(p, (yyvsp[(1) - (1)].nd));
+ ;}
+ break;
+
+ case 450:
+
+/* Line 1464 of yacc.c */
+#line 2843 "src/parse.y"
+ {
+ (yyval.id) = new_strsym(p, (yyvsp[(2) - (2)].nd));
+ ;}
+ break;
+
+ case 451:
+
+/* Line 1464 of yacc.c */
+#line 2849 "src/parse.y"
+ {
+ (yyval.nd) = new_symbols(p, list1((yyvsp[(2) - (2)].nd)));
+ ;}
+ break;
+
+ case 452:
+
+/* Line 1464 of yacc.c */
+#line 2853 "src/parse.y"
+ {
+ (yyval.nd) = new_symbols(p, push((yyvsp[(2) - (3)].nd), (yyvsp[(3) - (3)].nd)));
+ ;}
+ break;
+
+ case 455:
+
+/* Line 1464 of yacc.c */
+#line 2861 "src/parse.y"
+ {
+ (yyval.nd) = negate_lit(p, (yyvsp[(2) - (2)].nd));
+ ;}
+ break;
+
+ case 456:
+
+/* Line 1464 of yacc.c */
+#line 2865 "src/parse.y"
+ {
+ (yyval.nd) = negate_lit(p, (yyvsp[(2) - (2)].nd));
+ ;}
+ break;
+
+ case 457:
+
+/* Line 1464 of yacc.c */
+#line 2871 "src/parse.y"
+ {
+ (yyval.nd) = new_lvar(p, (yyvsp[(1) - (1)].id));
+ ;}
+ break;
+
+ case 458:
+
+/* Line 1464 of yacc.c */
+#line 2875 "src/parse.y"
+ {
+ (yyval.nd) = new_ivar(p, (yyvsp[(1) - (1)].id));
+ ;}
+ break;
+
+ case 459:
+
+/* Line 1464 of yacc.c */
+#line 2879 "src/parse.y"
+ {
+ (yyval.nd) = new_gvar(p, (yyvsp[(1) - (1)].id));
+ ;}
+ break;
+
+ case 460:
+
+/* Line 1464 of yacc.c */
+#line 2883 "src/parse.y"
+ {
+ (yyval.nd) = new_cvar(p, (yyvsp[(1) - (1)].id));
+ ;}
+ break;
+
+ case 461:
+
+/* Line 1464 of yacc.c */
+#line 2887 "src/parse.y"
+ {
+ (yyval.nd) = new_const(p, (yyvsp[(1) - (1)].id));
+ ;}
+ break;
+
+ case 462:
+
+/* Line 1464 of yacc.c */
+#line 2893 "src/parse.y"
+ {
+ assignable(p, (yyvsp[(1) - (1)].nd));
+ ;}
+ break;
+
+ case 463:
+
+/* Line 1464 of yacc.c */
+#line 2899 "src/parse.y"
+ {
+ (yyval.nd) = var_reference(p, (yyvsp[(1) - (1)].nd));
+ ;}
+ break;
+
+ case 464:
+
+/* Line 1464 of yacc.c */
+#line 2903 "src/parse.y"
+ {
+ (yyval.nd) = new_nil(p);
+ ;}
+ break;
+
+ case 465:
+
+/* Line 1464 of yacc.c */
+#line 2907 "src/parse.y"
+ {
+ (yyval.nd) = new_self(p);
+ ;}
+ break;
+
+ case 466:
+
+/* Line 1464 of yacc.c */
+#line 2911 "src/parse.y"
+ {
+ (yyval.nd) = new_true(p);
+ ;}
+ break;
+
+ case 467:
+
+/* Line 1464 of yacc.c */
+#line 2915 "src/parse.y"
+ {
+ (yyval.nd) = new_false(p);
+ ;}
+ break;
+
+ case 468:
+
+/* Line 1464 of yacc.c */
+#line 2919 "src/parse.y"
+ {
+ if (!p->filename) {
+ p->filename = "(null)";
+ }
+ (yyval.nd) = new_str(p, p->filename, strlen(p->filename));
+ ;}
+ break;
+
+ case 469:
+
+/* Line 1464 of yacc.c */
+#line 2926 "src/parse.y"
+ {
+ char buf[16];
+
+ snprintf(buf, sizeof(buf), "%d", p->lineno);
+ (yyval.nd) = new_int(p, buf, 10);
+ ;}
+ break;
+
+ case 472:
+
+/* Line 1464 of yacc.c */
+#line 2939 "src/parse.y"
+ {
+ (yyval.nd) = 0;
+ ;}
+ break;
+
+ case 473:
+
+/* Line 1464 of yacc.c */
+#line 2943 "src/parse.y"
+ {
+ p->lstate = EXPR_BEG;
+ p->cmd_start = TRUE;
+ ;}
+ break;
+
+ case 474:
+
+/* Line 1464 of yacc.c */
+#line 2948 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(3) - (4)].nd);
+ ;}
+ break;
+
+ case 475:
+
+/* Line 1464 of yacc.c */
+#line 2952 "src/parse.y"
+ {
+ yyerrok;
+ (yyval.nd) = 0;
+ ;}
+ break;
+
+ case 476:
+
+/* Line 1464 of yacc.c */
+#line 2959 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(2) - (3)].nd);
+ p->lstate = EXPR_BEG;
+ p->cmd_start = TRUE;
+ ;}
+ break;
+
+ case 477:
+
+/* Line 1464 of yacc.c */
+#line 2965 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(1) - (2)].nd);
+ ;}
+ break;
+
+ case 478:
+
+/* Line 1464 of yacc.c */
+#line 2971 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[(1) - (6)].nd), (yyvsp[(3) - (6)].nd), (yyvsp[(5) - (6)].id), 0, (yyvsp[(6) - (6)].id));
+ ;}
+ break;
+
+ case 479:
+
+/* Line 1464 of yacc.c */
+#line 2975 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[(1) - (8)].nd), (yyvsp[(3) - (8)].nd), (yyvsp[(5) - (8)].id), (yyvsp[(7) - (8)].nd), (yyvsp[(8) - (8)].id));
+ ;}
+ break;
+
+ case 480:
+
+/* Line 1464 of yacc.c */
+#line 2979 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].nd), 0, 0, (yyvsp[(4) - (4)].id));
+ ;}
+ break;
+
+ case 481:
+
+/* Line 1464 of yacc.c */
+#line 2983 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[(1) - (6)].nd), (yyvsp[(3) - (6)].nd), 0, (yyvsp[(5) - (6)].nd), (yyvsp[(6) - (6)].id));
+ ;}
+ break;
+
+ case 482:
+
+/* Line 1464 of yacc.c */
+#line 2987 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[(1) - (4)].nd), 0, (yyvsp[(3) - (4)].id), 0, (yyvsp[(4) - (4)].id));
+ ;}
+ break;
+
+ case 483:
+
+/* Line 1464 of yacc.c */
+#line 2991 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[(1) - (6)].nd), 0, (yyvsp[(3) - (6)].id), (yyvsp[(5) - (6)].nd), (yyvsp[(6) - (6)].id));
+ ;}
+ break;
+
+ case 484:
+
+/* Line 1464 of yacc.c */
+#line 2995 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[(1) - (2)].nd), 0, 0, 0, (yyvsp[(2) - (2)].id));
+ ;}
+ break;
+
+ case 485:
+
+/* Line 1464 of yacc.c */
+#line 2999 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, (yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].id), 0, (yyvsp[(4) - (4)].id));
+ ;}
+ break;
+
+ case 486:
+
+/* Line 1464 of yacc.c */
+#line 3003 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, (yyvsp[(1) - (6)].nd), (yyvsp[(3) - (6)].id), (yyvsp[(5) - (6)].nd), (yyvsp[(6) - (6)].id));
+ ;}
+ break;
+
+ case 487:
+
+/* Line 1464 of yacc.c */
+#line 3007 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, (yyvsp[(1) - (2)].nd), 0, 0, (yyvsp[(2) - (2)].id));
+ ;}
+ break;
+
+ case 488:
+
+/* Line 1464 of yacc.c */
+#line 3011 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, (yyvsp[(1) - (4)].nd), 0, (yyvsp[(3) - (4)].nd), (yyvsp[(4) - (4)].id));
+ ;}
+ break;
+
+ case 489:
+
+/* Line 1464 of yacc.c */
+#line 3015 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, 0, (yyvsp[(1) - (2)].id), 0, (yyvsp[(2) - (2)].id));
+ ;}
+ break;
+
+ case 490:
+
+/* Line 1464 of yacc.c */
+#line 3019 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, 0, (yyvsp[(1) - (4)].id), (yyvsp[(3) - (4)].nd), (yyvsp[(4) - (4)].id));
+ ;}
+ break;
+
+ case 491:
+
+/* Line 1464 of yacc.c */
+#line 3023 "src/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, 0, 0, 0, (yyvsp[(1) - (1)].id));
+ ;}
+ break;
+
+ case 492:
+
+/* Line 1464 of yacc.c */
+#line 3027 "src/parse.y"
+ {
+ local_add_f(p, 0);
+ (yyval.nd) = new_args(p, 0, 0, 0, 0, 0);
+ ;}
+ break;
+
+ case 493:
+
+/* Line 1464 of yacc.c */
+#line 3034 "src/parse.y"
+ {
+ yyerror(p, "formal argument cannot be a constant");
+ (yyval.nd) = 0;
+ ;}
+ break;
+
+ case 494:
+
+/* Line 1464 of yacc.c */
+#line 3039 "src/parse.y"
+ {
+ yyerror(p, "formal argument cannot be an instance variable");
+ (yyval.nd) = 0;
+ ;}
+ break;
+
+ case 495:
+
+/* Line 1464 of yacc.c */
+#line 3044 "src/parse.y"
+ {
+ yyerror(p, "formal argument cannot be a global variable");
+ (yyval.nd) = 0;
+ ;}
+ break;
+
+ case 496:
+
+/* Line 1464 of yacc.c */
+#line 3049 "src/parse.y"
+ {
+ yyerror(p, "formal argument cannot be a class variable");
+ (yyval.nd) = 0;
+ ;}
+ break;
+
+ case 497:
+
+/* Line 1464 of yacc.c */
+#line 3056 "src/parse.y"
+ {
+ (yyval.id) = 0;
+ ;}
+ break;
+
+ case 498:
+
+/* Line 1464 of yacc.c */
+#line 3060 "src/parse.y"
+ {
+ local_add_f(p, (yyvsp[(1) - (1)].id));
+ (yyval.id) = (yyvsp[(1) - (1)].id);
+ ;}
+ break;
+
+ case 499:
+
+/* Line 1464 of yacc.c */
+#line 3067 "src/parse.y"
+ {
+ (yyval.nd) = new_arg(p, (yyvsp[(1) - (1)].id));
+ ;}
+ break;
+
+ case 500:
+
+/* Line 1464 of yacc.c */
+#line 3071 "src/parse.y"
+ {
+ (yyval.nd) = new_masgn(p, (yyvsp[(2) - (3)].nd), 0);
+ ;}
+ break;
+
+ case 501:
+
+/* Line 1464 of yacc.c */
+#line 3077 "src/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[(1) - (1)].nd));
+ ;}
+ break;
+
+ case 502:
+
+/* Line 1464 of yacc.c */
+#line 3081 "src/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 503:
+
+/* Line 1464 of yacc.c */
+#line 3087 "src/parse.y"
+ {
+ local_add_f(p, (yyvsp[(1) - (2)].id));
+ (yyval.id) = (yyvsp[(1) - (2)].id);
+ ;}
+ break;
+
+ case 504:
+
+/* Line 1464 of yacc.c */
+#line 3094 "src/parse.y"
+ {
+ (yyval.nd) = cons(nsym((yyvsp[(1) - (2)].id)), (yyvsp[(2) - (2)].nd));
+ ;}
+ break;
+
+ case 505:
+
+/* Line 1464 of yacc.c */
+#line 3100 "src/parse.y"
+ {
+ (yyval.nd) = cons(nsym((yyvsp[(1) - (2)].id)), (yyvsp[(2) - (2)].nd));
+ ;}
+ break;
+
+ case 506:
+
+/* Line 1464 of yacc.c */
+#line 3106 "src/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[(1) - (1)].nd));
+ ;}
+ break;
+
+ case 507:
+
+/* Line 1464 of yacc.c */
+#line 3110 "src/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 508:
+
+/* Line 1464 of yacc.c */
+#line 3116 "src/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[(1) - (1)].nd));
+ ;}
+ break;
+
+ case 509:
+
+/* Line 1464 of yacc.c */
+#line 3120 "src/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 512:
+
+/* Line 1464 of yacc.c */
+#line 3130 "src/parse.y"
+ {
+ local_add_f(p, (yyvsp[(2) - (2)].id));
+ (yyval.id) = (yyvsp[(2) - (2)].id);
+ ;}
+ break;
+
+ case 513:
+
+/* Line 1464 of yacc.c */
+#line 3135 "src/parse.y"
+ {
+ local_add_f(p, 0);
+ (yyval.id) = -1;
+ ;}
+ break;
+
+ case 516:
+
+/* Line 1464 of yacc.c */
+#line 3146 "src/parse.y"
+ {
+ local_add_f(p, (yyvsp[(2) - (2)].id));
+ (yyval.id) = (yyvsp[(2) - (2)].id);
+ ;}
+ break;
+
+ case 517:
+
+/* Line 1464 of yacc.c */
+#line 3153 "src/parse.y"
+ {
+ (yyval.id) = (yyvsp[(2) - (2)].id);
+ ;}
+ break;
+
+ case 518:
+
+/* Line 1464 of yacc.c */
+#line 3157 "src/parse.y"
+ {
+ local_add_f(p, 0);
+ (yyval.id) = 0;
+ ;}
+ break;
+
+ case 519:
+
+/* Line 1464 of yacc.c */
+#line 3164 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(1) - (1)].nd);
+ if (!(yyval.nd)) (yyval.nd) = new_nil(p);
+ ;}
+ break;
+
+ case 520:
+
+/* Line 1464 of yacc.c */
+#line 3168 "src/parse.y"
+ {p->lstate = EXPR_BEG;;}
+ break;
+
+ case 521:
+
+/* Line 1464 of yacc.c */
+#line 3169 "src/parse.y"
+ {
+ if ((yyvsp[(3) - (4)].nd) == 0) {
+ yyerror(p, "can't define singleton method for ().");
+ }
+ else {
+ switch ((enum node_type)(int)(intptr_t)(yyvsp[(3) - (4)].nd)->car) {
+ case NODE_STR:
+ case NODE_DSTR:
+ case NODE_XSTR:
+ case NODE_DXSTR:
+ case NODE_DREGX:
+ case NODE_MATCH:
+ case NODE_FLOAT:
+ case NODE_ARRAY:
+ case NODE_HEREDOC:
+ yyerror(p, "can't define singleton method for literals");
+ default:
+ break;
+ }
+ }
+ (yyval.nd) = (yyvsp[(3) - (4)].nd);
+ ;}
+ break;
+
+ case 523:
+
+/* Line 1464 of yacc.c */
+#line 3195 "src/parse.y"
+ {
+ (yyval.nd) = (yyvsp[(1) - (2)].nd);
+ ;}
+ break;
+
+ case 524:
+
+/* Line 1464 of yacc.c */
+#line 3201 "src/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[(1) - (1)].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[(1) - (1)].nd));
+ ;}
+ break;
+
+ case 525:
+
+/* Line 1464 of yacc.c */
+#line 3206 "src/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 526:
+
+/* Line 1464 of yacc.c */
+#line 3212 "src/parse.y"
+ {
+ (yyval.nd) = cons((yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+ ;}
+ break;
+
+ case 527:
+
+/* Line 1464 of yacc.c */
+#line 3216 "src/parse.y"
+ {
+ (yyval.nd) = cons(new_sym(p, (yyvsp[(1) - (2)].id)), (yyvsp[(2) - (2)].nd));
+ ;}
+ break;
+
+ case 549:
+
+/* Line 1464 of yacc.c */
+#line 3260 "src/parse.y"
+ {yyerrok;;}
+ break;
+
+ case 551:
+
+/* Line 1464 of yacc.c */
+#line 3265 "src/parse.y"
+ {
+ p->lineno++;
+ p->column = 0;
+ ;}
+ break;
+
+ case 554:
+
+/* Line 1464 of yacc.c */
+#line 3272 "src/parse.y"
+ {yyerrok;;}
+ break;
+
+ case 555:
+
+/* Line 1464 of yacc.c */
+#line 3276 "src/parse.y"
+ {
+ (yyval.nd) = 0;
+ ;}
+ break;
+
+
+
+/* Line 1464 of yacc.c */
+#line 9260 "C:/Users/matsuzaki.takuya/work/daily/20150106/mruby-1.1.0/build/ARMCA9/src/y.tab.c"
+ default: break;
+ }
+ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+
+ *++yyvsp = yyval;
+
+ /* Now `shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTOKENS];
+
+ goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+#if ! YYERROR_VERBOSE
+ yyerror (p, YY_("syntax error"));
+#else
+ {
+ YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
+ if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
+ {
+ YYSIZE_T yyalloc = 2 * yysize;
+ if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
+ yyalloc = YYSTACK_ALLOC_MAXIMUM;
+ if (yymsg != yymsgbuf)
+ YYSTACK_FREE (yymsg);
+ yymsg = (char *) YYSTACK_ALLOC (yyalloc);
+ if (yymsg)
+ yymsg_alloc = yyalloc;
+ else
+ {
+ yymsg = yymsgbuf;
+ yymsg_alloc = sizeof yymsgbuf;
+ }
+ }
+
+ if (0 < yysize && yysize <= yymsg_alloc)
+ {
+ (void) yysyntax_error (yymsg, yystate, yychar);
+ yyerror (p, yymsg);
+ }
+ else
+ {
+ yyerror (p, YY_("syntax error"));
+ if (yysize != 0)
+ goto yyexhaustedlab;
+ }
+ }
+#endif
+ }
+
+
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ if (yychar <= YYEOF)
+ {
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ YYABORT;
+ }
+ else
+ {
+ yydestruct ("Error: discarding",
+ yytoken, &yylval, p);
+ yychar = YYEMPTY;
+ }
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+
+ /* Pacify compilers like GCC when the user code never invokes
+ YYERROR and the label yyerrorlab therefore never appears in user
+ code. */
+ if (/*CONSTCOND*/ 0)
+ goto yyerrorlab;
+
+ /* Do not reclaim the symbols of the rule which action triggered
+ this YYERROR. */
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (yyn != YYPACT_NINF)
+ {
+ yyn += YYTERROR;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+
+ yydestruct ("Error: popping",
+ yystos[yystate], yyvsp, p);
+ YYPOPSTACK (1);
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ *++yyvsp = yylval;
+
+
+ /* Shift the error token. */
+ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+#if !defined(yyoverflow) || YYERROR_VERBOSE
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here. |
+`-------------------------------------------------*/
+yyexhaustedlab:
+ yyerror (p, YY_("memory exhausted"));
+ yyresult = 2;
+ /* Fall through. */
+#endif
+
+yyreturn:
+ if (yychar != YYEMPTY)
+ yydestruct ("Cleanup: discarding lookahead",
+ yytoken, &yylval, p);
+ /* Do not reclaim the symbols of the rule which action triggered
+ this YYABORT or YYACCEPT. */
+ YYPOPSTACK (yylen);
+ YY_STACK_PRINT (yyss, yyssp);
+ while (yyssp != yyss)
+ {
+ yydestruct ("Cleanup: popping",
+ yystos[*yyssp], yyvsp, p);
+ YYPOPSTACK (1);
+ }
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+#if YYERROR_VERBOSE
+ if (yymsg != yymsgbuf)
+ YYSTACK_FREE (yymsg);
+#endif
+ /* Make sure YYID is used. */
+ return YYID (yyresult);
+}
+
+
+
+/* Line 1684 of yacc.c */
+#line 3280 "src/parse.y"
+
+#define yylval (*((YYSTYPE*)(p->ylval)))
+
+static void
+yyerror(parser_state *p, const char *s)
+{
+ char* c;
+ int n;
+
+ if (! p->capture_errors) {
+#ifdef ENABLE_STDIO
+ if (p->filename) {
+ fprintf(stderr, "%s:%d:%d: %s\n", p->filename, p->lineno, p->column, s);
+ }
+ else {
+ fprintf(stderr, "line %d:%d: %s\n", p->lineno, p->column, s);
+ }
+#endif
+ }
+ else if (p->nerr < sizeof(p->error_buffer) / sizeof(p->error_buffer[0])) {
+ n = strlen(s);
+ c = (char *)parser_palloc(p, n + 1);
+ memcpy(c, s, n + 1);
+ p->error_buffer[p->nerr].message = c;
+ p->error_buffer[p->nerr].lineno = p->lineno;
+ p->error_buffer[p->nerr].column = p->column;
+ }
+ p->nerr++;
+}
+
+static void
+yyerror_i(parser_state *p, const char *fmt, int i)
+{
+ char buf[256];
+
+ snprintf(buf, sizeof(buf), fmt, i);
+ yyerror(p, buf);
+}
+
+static void
+yywarn(parser_state *p, const char *s)
+{
+ char* c;
+ int n;
+
+ if (! p->capture_errors) {
+#ifdef ENABLE_STDIO
+ if (p->filename) {
+ fprintf(stderr, "%s:%d:%d: %s\n", p->filename, p->lineno, p->column, s);
+ }
+ else {
+ fprintf(stderr, "line %d:%d: %s\n", p->lineno, p->column, s);
+ }
+#endif
+ }
+ else if (p->nwarn < sizeof(p->warn_buffer) / sizeof(p->warn_buffer[0])) {
+ n = strlen(s);
+ c = (char *)parser_palloc(p, n + 1);
+ memcpy(c, s, n + 1);
+ p->warn_buffer[p->nwarn].message = c;
+ p->warn_buffer[p->nwarn].lineno = p->lineno;
+ p->warn_buffer[p->nwarn].column = p->column;
+ }
+ p->nwarn++;
+}
+
+static void
+yywarning(parser_state *p, const char *s)
+{
+ yywarn(p, s);
+}
+
+static void
+yywarning_s(parser_state *p, const char *fmt, const char *s)
+{
+ char buf[256];
+
+ snprintf(buf, sizeof(buf), fmt, s);
+ yywarning(p, buf);
+}
+
+static void
+backref_error(parser_state *p, node *n)
+{
+ int c;
+
+ c = (int)(intptr_t)n->car;
+
+ if (c == NODE_NTH_REF) {
+ yyerror_i(p, "can't set variable $%d", (int)(intptr_t)n->cdr);
+ }
+ else if (c == NODE_BACK_REF) {
+ yyerror_i(p, "can't set variable $%c", (int)(intptr_t)n->cdr);
+ }
+ else {
+ mrb_bug(p->mrb, "Internal error in backref_error() : n=>car == %S", mrb_fixnum_value(c));
+ }
+}
+
+static void pushback(parser_state *p, int c);
+static mrb_bool peeks(parser_state *p, const char *s);
+static mrb_bool skips(parser_state *p, const char *s);
+
+static inline int
+nextc(parser_state *p)
+{
+ int c;
+
+ if (p->pb) {
+ node *tmp;
+
+ c = (int)(intptr_t)p->pb->car;
+ tmp = p->pb;
+ p->pb = p->pb->cdr;
+ cons_free(tmp);
+ }
+ else {
+#ifdef ENABLE_STDIO
+ if (p->f) {
+ if (feof(p->f)) goto eof;
+ c = fgetc(p->f);
+ if (c == EOF) goto eof;
+ }
+ else
+#endif
+ if (!p->s || p->s >= p->send) {
+ goto eof;
+ }
+ else {
+ c = (unsigned char)*p->s++;
+ }
+ }
+ if (c >= 0) {
+ p->column++;
+ }
+ if (c == '\r') {
+ c = nextc(p);
+ if (c != '\n') {
+ pushback(p, c);
+ return '\r';
+ }
+ return c;
+ }
+ return c;
+
+ eof:
+ if (!p->cxt) return -1;
+ else {
+ if (p->cxt->partial_hook(p) < 0)
+ return -1; /* end of program(s) */
+ return -2; /* end of a file in the program files */
+ }
+}
+
+static void
+pushback(parser_state *p, int c)
+{
+ if (c >= 0) {
+ p->column--;
+ }
+ p->pb = cons((node*)(intptr_t)c, p->pb);
+}
+
+static void
+skip(parser_state *p, char term)
+{
+ int c;
+
+ for (;;) {
+ c = nextc(p);
+ if (c < 0) break;
+ if (c == term) break;
+ }
+}
+
+static int
+peekc_n(parser_state *p, int n)
+{
+ node *list = 0;
+ int c0;
+
+ do {
+ c0 = nextc(p);
+ if (c0 == -1) return c0; /* do not skip partial EOF */
+ list = push(list, (node*)(intptr_t)c0);
+ } while(n--);
+ if (p->pb) {
+ p->pb = append((node*)list, p->pb);
+ }
+ else {
+ p->pb = list;
+ }
+ return c0;
+}
+
+static mrb_bool
+peek_n(parser_state *p, int c, int n)
+{
+ return peekc_n(p, n) == c && c >= 0;
+}
+#define peek(p,c) peek_n((p), (c), 0)
+
+static mrb_bool
+peeks(parser_state *p, const char *s)
+{
+ int len = strlen(s);
+
+#ifdef ENABLE_STDIO
+ if (p->f) {
+ int n = 0;
+ while (*s) {
+ if (!peek_n(p, *s++, n++)) return FALSE;
+ }
+ return TRUE;
+ }
+ else
+#endif
+ if (p->s && p->s + len <= p->send) {
+ if (memcmp(p->s, s, len) == 0) return TRUE;
+ }
+ return FALSE;
+}
+
+static mrb_bool
+skips(parser_state *p, const char *s)
+{
+ int c;
+
+ for (;;) {
+ /* skip until first char */
+ for (;;) {
+ c = nextc(p);
+ if (c < 0) return c;
+ if (c == '\n') {
+ p->lineno++;
+ p->column = 0;
+ }
+ if (c == *s) break;
+ }
+ s++;
+ if (peeks(p, s)) {
+ int len = strlen(s);
+
+ while (len--) {
+ if (nextc(p) == '\n') {
+ p->lineno++;
+ p->column = 0;
+ }
+ }
+ return TRUE;
+ }
+ else{
+ s--;
+ }
+ }
+ return FALSE;
+}
+
+
+static int
+newtok(parser_state *p)
+{
+ p->bidx = 0;
+ return p->column - 1;
+}
+
+static void
+tokadd(parser_state *p, int32_t c)
+{
+ char utf8[4];
+ unsigned len;
+
+ /* mrb_assert(-0x10FFFF <= c && c <= 0xFF); */
+ if (c >= 0) {
+ /* Single byte from source or non-Unicode escape */
+ utf8[0] = (char)c;
+ len = 1;
+ }
+ else {
+ /* Unicode character */
+ c = -c;
+ if (c < 0x80) {
+ utf8[0] = (char)c;
+ len = 1;
+ }
+ else if (c < 0x800) {
+ utf8[0] = (char)(0xC0 | (c >> 6));
+ utf8[1] = (char)(0x80 | (c & 0x3F));
+ len = 2;
+ }
+ else if (c < 0x10000) {
+ utf8[0] = (char)(0xE0 | (c >> 12) );
+ utf8[1] = (char)(0x80 | ((c >> 6) & 0x3F));
+ utf8[2] = (char)(0x80 | ( c & 0x3F));
+ len = 3;
+ }
+ else {
+ utf8[0] = (char)(0xF0 | (c >> 18) );
+ utf8[1] = (char)(0x80 | ((c >> 12) & 0x3F));
+ utf8[2] = (char)(0x80 | ((c >> 6) & 0x3F));
+ utf8[3] = (char)(0x80 | ( c & 0x3F));
+ len = 4;
+ }
+ }
+ if (p->bidx+len <= MRB_PARSER_BUF_SIZE) {
+ unsigned i;
+ for (i = 0; i < len; i++) {
+ p->buf[p->bidx++] = utf8[i];
+ }
+ }
+}
+
+static int
+toklast(parser_state *p)
+{
+ return p->buf[p->bidx-1];
+}
+
+static void
+tokfix(parser_state *p)
+{
+ if (p->bidx >= MRB_PARSER_BUF_SIZE) {
+ yyerror(p, "string too long (truncated)");
+ }
+ p->buf[p->bidx] = '\0';
+}
+
+static const char*
+tok(parser_state *p)
+{
+ return p->buf;
+}
+
+static int
+toklen(parser_state *p)
+{
+ return p->bidx;
+}
+
+#define IS_ARG() (p->lstate == EXPR_ARG || p->lstate == EXPR_CMDARG)
+#define IS_END() (p->lstate == EXPR_END || p->lstate == EXPR_ENDARG || p->lstate == EXPR_ENDFN)
+#define IS_BEG() (p->lstate == EXPR_BEG || p->lstate == EXPR_MID || p->lstate == EXPR_VALUE || p->lstate == EXPR_CLASS)
+#define IS_SPCARG(c) (IS_ARG() && space_seen && !ISSPACE(c))
+#define IS_LABEL_POSSIBLE() ((p->lstate == EXPR_BEG && !cmd_state) || IS_ARG())
+#define IS_LABEL_SUFFIX(n) (peek_n(p, ':',(n)) && !peek_n(p, ':', (n)+1))
+
+static int
+scan_oct(const int *start, int len, int *retlen)
+{
+ const int *s = start;
+ int retval = 0;
+
+ /* mrb_assert(len <= 3) */
+ while (len-- && *s >= '0' && *s <= '7') {
+ retval <<= 3;
+ retval |= *s++ - '0';
+ }
+ *retlen = s - start;
+
+ return retval;
+}
+
+static int32_t
+scan_hex(const int *start, int len, int *retlen)
+{
+ static const char hexdigit[] = "0123456789abcdef0123456789ABCDEF";
+ const int *s = start;
+ int32_t retval = 0;
+ char *tmp;
+
+ /* mrb_assert(len <= 8) */
+ while (len-- && *s && (tmp = (char*)strchr(hexdigit, *s))) {
+ retval <<= 4;
+ retval |= (tmp - hexdigit) & 15;
+ s++;
+ }
+ *retlen = s - start;
+
+ return retval;
+}
+
+/* Return negative to indicate Unicode code point */
+static int32_t
+read_escape(parser_state *p)
+{
+ int32_t c;
+
+ switch (c = nextc(p)) {
+ case '\\':/* Backslash */
+ return c;
+
+ case 'n':/* newline */
+ return '\n';
+
+ case 't':/* horizontal tab */
+ return '\t';
+
+ case 'r':/* carriage-return */
+ return '\r';
+
+ case 'f':/* form-feed */
+ return '\f';
+
+ case 'v':/* vertical tab */
+ return '\13';
+
+ case 'a':/* alarm(bell) */
+ return '\007';
+
+ case 'e':/* escape */
+ return 033;
+
+ case '0': case '1': case '2': case '3': /* octal constant */
+ case '4': case '5': case '6': case '7':
+ {
+ int buf[3];
+ int i;
+
+ buf[0] = c;
+ for (i=1; i<3; i++) {
+ buf[i] = nextc(p);
+ if (buf[i] < 0) goto eof;
+ if (buf[i] < '0' || '7' < buf[i]) {
+ pushback(p, buf[i]);
+ break;
+ }
+ }
+ c = scan_oct(buf, i, &i);
+ }
+ return c;
+
+ case 'x': /* hex constant */
+ {
+ int buf[2];
+ int i;
+
+ for (i=0; i<2; i++) {
+ buf[i] = nextc(p);
+ if (buf[i] < 0) goto eof;
+ if (!ISXDIGIT(buf[i])) {
+ pushback(p, buf[i]);
+ break;
+ }
+ }
+ c = scan_hex(buf, i, &i);
+ if (i == 0) {
+ yyerror(p, "Invalid escape character syntax");
+ return 0;
+ }
+ }
+ return c;
+
+ case 'u': /* Unicode */
+ {
+ int buf[9];
+ int i;
+
+ /* Look for opening brace */
+ i = 0;
+ buf[0] = nextc(p);
+ if (buf[0] < 0) goto eof;
+ if (buf[0] == '{') {
+ /* \u{xxxxxxxx} form */
+ for (i=0; i<9; i++) {
+ buf[i] = nextc(p);
+ if (buf[i] < 0) goto eof;
+ if (buf[i] == '}') {
+ break;
+ }
+ else if (!ISXDIGIT(buf[i])) {
+ yyerror(p, "Invalid escape character syntax");
+ pushback(p, buf[i]);
+ return 0;
+ }
+ }
+ }
+ else if (ISXDIGIT(buf[0])) {
+ /* \uxxxx form */
+ for (i=1; i<4; i++) {
+ buf[i] = nextc(p);
+ if (buf[i] < 0) goto eof;
+ if (!ISXDIGIT(buf[i])) {
+ pushback(p, buf[i]);
+ break;
+ }
+ }
+ }
+ else {
+ pushback(p, buf[0]);
+ }
+ c = scan_hex(buf, i, &i);
+ if (i == 0) {
+ yyerror(p, "Invalid escape character syntax");
+ return 0;
+ }
+ if (c < 0 || c > 0x10FFFF || (c & 0xFFFFF800) == 0xD800) {
+ yyerror(p, "Invalid Unicode code point");
+ return 0;
+ }
+ }
+ return -c;
+
+ case 'b':/* backspace */
+ return '\010';
+
+ case 's':/* space */
+ return ' ';
+
+ case 'M':
+ if ((c = nextc(p)) != '-') {
+ yyerror(p, "Invalid escape character syntax");
+ pushback(p, c);
+ return '\0';
+ }
+ if ((c = nextc(p)) == '\\') {
+ return read_escape(p) | 0x80;
+ }
+ else if (c < 0) goto eof;
+ else {
+ return ((c & 0xff) | 0x80);
+ }
+
+ case 'C':
+ if ((c = nextc(p)) != '-') {
+ yyerror(p, "Invalid escape character syntax");
+ pushback(p, c);
+ return '\0';
+ }
+ case 'c':
+ if ((c = nextc(p))== '\\') {
+ c = read_escape(p);
+ }
+ else if (c == '?')
+ return 0177;
+ else if (c < 0) goto eof;
+ return c & 0x9f;
+
+ eof:
+ case -1:
+ case -2: /* end of a file */
+ yyerror(p, "Invalid escape character syntax");
+ return '\0';
+
+ default:
+ return c;
+ }
+}
+
+static int
+parse_string(parser_state *p)
+{
+ int c;
+ string_type type = (string_type)(intptr_t)p->lex_strterm->car;
+ int nest_level = (intptr_t)p->lex_strterm->cdr->car;
+ int beg = (intptr_t)p->lex_strterm->cdr->cdr->car;
+ int end = (intptr_t)p->lex_strterm->cdr->cdr->cdr;
+ parser_heredoc_info *hinf = (type & STR_FUNC_HEREDOC) ? parsing_heredoc_inf(p) : NULL;
+
+ newtok(p);
+ while ((c = nextc(p)) != end || nest_level != 0) {
+ if (hinf && (c == '\n' || c < 0)) {
+ mrb_bool line_head;
+ tokadd(p, '\n');
+ tokfix(p);
+ p->lineno++;
+ p->column = 0;
+ line_head = hinf->line_head;
+ hinf->line_head = TRUE;
+ if (line_head) {
+ /* check whether end of heredoc */
+ const char *s = tok(p);
+ int len = toklen(p);
+ if (hinf->allow_indent) {
+ while (ISSPACE(*s) && len > 0) {
+ ++s;
+ --len;
+ }
+ }
+ if ((len-1 == hinf->term_len) && (strncmp(s, hinf->term, len-1) == 0)) {
+ return tHEREDOC_END;
+ }
+ }
+ if (c < 0) {
+ char buf[256];
+ snprintf(buf, sizeof(buf), "can't find heredoc delimiter \"%s\" anywhere before EOF", hinf->term);
+ yyerror(p, buf);
+ return 0;
+ }
+ yylval.nd = new_str(p, tok(p), toklen(p));
+ return tHD_STRING_MID;
+ }
+ if (c < 0) {
+ yyerror(p, "unterminated string meets end of file");
+ return 0;
+ }
+ else if (c == beg) {
+ nest_level++;
+ p->lex_strterm->cdr->car = (node*)(intptr_t)nest_level;
+ }
+ else if (c == end) {
+ nest_level--;
+ p->lex_strterm->cdr->car = (node*)(intptr_t)nest_level;
+ }
+ else if (c == '\\') {
+ c = nextc(p);
+ if (type & STR_FUNC_EXPAND) {
+ if (c == end || c == beg) {
+ tokadd(p, c);
+ }
+ else if (c == '\n') {
+ p->lineno++;
+ p->column = 0;
+ if (type & STR_FUNC_ARRAY) {
+ tokadd(p, '\n');
+ }
+ }
+ else if (type & STR_FUNC_REGEXP) {
+ tokadd(p, '\\');
+ tokadd(p, c);
+ }
+ else {
+ pushback(p, c);
+ tokadd(p, read_escape(p));
+ if (hinf)
+ hinf->line_head = FALSE;
+ }
+ }
+ else {
+ if (c != beg && c != end) {
+ if (c == '\n') {
+ p->lineno++;
+ p->column = 0;
+ }
+ if (!(c == '\\' || ((type & STR_FUNC_ARRAY) && ISSPACE(c)))) {
+ tokadd(p, '\\');
+ }
+ }
+ tokadd(p, c);
+ }
+ continue;
+ }
+ else if ((c == '#') && (type & STR_FUNC_EXPAND)) {
+ c = nextc(p);
+ if (c == '{') {
+ tokfix(p);
+ p->lstate = EXPR_BEG;
+ p->cmd_start = TRUE;
+ yylval.nd = new_str(p, tok(p), toklen(p));
+ if (hinf) {
+ hinf->line_head = FALSE;
+ return tHD_STRING_PART;
+ }
+ return tSTRING_PART;
+ }
+ tokadd(p, '#');
+ pushback(p, c);
+ continue;
+ }
+ if ((type & STR_FUNC_ARRAY) && ISSPACE(c)) {
+ if (toklen(p) == 0) {
+ do {
+ if (c == '\n') {
+ p->lineno++;
+ p->column = 0;
+ heredoc_treat_nextline(p);
+ if (p->parsing_heredoc != NULL) {
+ return tHD_LITERAL_DELIM;
+ }
+ }
+ c = nextc(p);
+ } while (ISSPACE(c));
+ pushback(p, c);
+ return tLITERAL_DELIM;
+ }
+ else {
+ pushback(p, c);
+ tokfix(p);
+ yylval.nd = new_str(p, tok(p), toklen(p));
+ return tSTRING_MID;
+ }
+ }
+ tokadd(p, c);
+ }
+
+ tokfix(p);
+ p->lstate = EXPR_END;
+ end_strterm(p);
+
+ if (type & STR_FUNC_XQUOTE) {
+ yylval.nd = new_xstr(p, tok(p), toklen(p));
+ return tXSTRING;
+ }
+
+ if (type & STR_FUNC_REGEXP) {
+ int f = 0;
+ int re_opt;
+ char *s = strndup(tok(p), toklen(p));
+ char flags[3];
+ char *flag = flags;
+ char *dup;
+
+ newtok(p);
+ while (re_opt = nextc(p), re_opt >= 0 && ISALPHA(re_opt)) {
+ switch (re_opt) {
+ case 'i': f |= 1; break;
+ case 'x': f |= 2; break;
+ case 'm': f |= 4; break;
+ default: tokadd(p, re_opt); break;
+ }
+ }
+ pushback(p, re_opt);
+ if (toklen(p)) {
+ char msg[128];
+ tokfix(p);
+ snprintf(msg, sizeof(msg), "unknown regexp option%s - %s",
+ toklen(p) > 1 ? "s" : "", tok(p));
+ yyerror(p, msg);
+ }
+ if (f != 0) {
+ if (f & 1) *flag++ = 'i';
+ if (f & 2) *flag++ = 'x';
+ if (f & 4) *flag++ = 'm';
+ dup = strndup(flags, (size_t)(flag - flags));
+ }
+ else {
+ dup = NULL;
+ }
+ yylval.nd = new_regx(p, s, dup);
+
+ return tREGEXP;
+ }
+
+ yylval.nd = new_str(p, tok(p), toklen(p));
+ return tSTRING;
+}
+
+
+static int
+heredoc_identifier(parser_state *p)
+{
+ int c;
+ int type = str_heredoc;
+ mrb_bool indent = FALSE;
+ mrb_bool quote = FALSE;
+ node *newnode;
+ parser_heredoc_info *info;
+
+ c = nextc(p);
+ if (ISSPACE(c) || c == '=') {
+ pushback(p, c);
+ return 0;
+ }
+ if (c == '-') {
+ indent = TRUE;
+ c = nextc(p);
+ }
+ if (c == '\'' || c == '"') {
+ int term = c;
+ if (c == '\'')
+ quote = TRUE;
+ newtok(p);
+ while ((c = nextc(p)) >= 0 && c != term) {
+ if (c == '\n') {
+ c = -1;
+ break;
+ }
+ tokadd(p, c);
+ }
+ if (c < 0) {
+ yyerror(p, "unterminated here document identifier");
+ return 0;
+ }
+ }
+ else {
+ if (c < 0) {
+ return 0; /* missing here document identifier */
+ }
+ if (! identchar(c)) {
+ pushback(p, c);
+ if (indent) pushback(p, '-');
+ return 0;
+ }
+ newtok(p);
+ do {
+ tokadd(p, c);
+ } while ((c = nextc(p)) >= 0 && identchar(c));
+ pushback(p, c);
+ }
+ tokfix(p);
+ newnode = new_heredoc(p);
+ info = (parser_heredoc_info*)newnode->cdr;
+ info->term = strndup(tok(p), toklen(p));
+ info->term_len = toklen(p);
+ if (! quote)
+ type |= STR_FUNC_EXPAND;
+ info->type = (string_type)type;
+ info->allow_indent = indent;
+ info->line_head = TRUE;
+ info->doc = NULL;
+ p->heredocs_from_nextline = push(p->heredocs_from_nextline, newnode);
+ p->lstate = EXPR_END;
+
+ yylval.nd = newnode;
+ return tHEREDOC_BEG;
+}
+
+static int
+arg_ambiguous(parser_state *p)
+{
+ yywarning(p, "ambiguous first argument; put parentheses or even spaces");
+ return 1;
+}
+
+#include "lex.def"
+
+static int
+parser_yylex(parser_state *p)
+{
+ int32_t c;
+ int space_seen = 0;
+ int cmd_state;
+ enum mrb_lex_state_enum last_state;
+ int token_column;
+
+ if (p->lex_strterm) {
+ if (is_strterm_type(p, STR_FUNC_HEREDOC)) {
+ if (p->parsing_heredoc != NULL)
+ return parse_string(p);
+ }
+ else
+ return parse_string(p);
+ }
+ cmd_state = p->cmd_start;
+ p->cmd_start = FALSE;
+ retry:
+ last_state = p->lstate;
+ switch (c = nextc(p)) {
+ case '\0': /* NUL */
+ case '\004': /* ^D */
+ case '\032': /* ^Z */
+ return 0;
+ case -1: /* end of script. */
+ if (p->heredocs_from_nextline)
+ goto maybe_heredoc;
+ return 0;
+
+ /* white spaces */
+ case ' ': case '\t': case '\f': case '\r':
+ case '\13': /* '\v' */
+ space_seen = 1;
+ goto retry;
+
+ case '#': /* it's a comment */
+ skip(p, '\n');
+ /* fall through */
+ case -2: /* end of a file */
+ case '\n':
+ maybe_heredoc:
+ heredoc_treat_nextline(p);
+ switch (p->lstate) {
+ case EXPR_BEG:
+ case EXPR_FNAME:
+ case EXPR_DOT:
+ case EXPR_CLASS:
+ case EXPR_VALUE:
+ p->lineno++;
+ p->column = 0;
+ if (p->parsing_heredoc != NULL) {
+ return parse_string(p);
+ }
+ goto retry;
+ default:
+ break;
+ }
+ if (p->parsing_heredoc != NULL) {
+ return '\n';
+ }
+ while ((c = nextc(p))) {
+ switch (c) {
+ case ' ': case '\t': case '\f': case '\r':
+ case '\13': /* '\v' */
+ space_seen = 1;
+ break;
+ case '.':
+ if ((c = nextc(p)) != '.') {
+ pushback(p, c);
+ pushback(p, '.');
+ goto retry;
+ }
+ case -1: /* EOF */
+ case -2: /* end of a file */
+ goto normal_newline;
+ default:
+ pushback(p, c);
+ goto normal_newline;
+ }
+ }
+ normal_newline:
+ p->cmd_start = TRUE;
+ p->lstate = EXPR_BEG;
+ return '\n';
+
+ case '*':
+ if ((c = nextc(p)) == '*') {
+ if ((c = nextc(p)) == '=') {
+ yylval.id = intern("**",2);
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ pushback(p, c);
+ c = tPOW;
+ }
+ else {
+ if (c == '=') {
+ yylval.id = intern_c('*');
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ pushback(p, c);
+ if (IS_SPCARG(c)) {
+ yywarning(p, "`*' interpreted as argument prefix");
+ c = tSTAR;
+ }
+ else if (IS_BEG()) {
+ c = tSTAR;
+ }
+ else {
+ c = '*';
+ }
+ }
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ return c;
+
+ case '!':
+ c = nextc(p);
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ if (c == '@') {
+ return '!';
+ }
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ if (c == '=') {
+ return tNEQ;
+ }
+ if (c == '~') {
+ return tNMATCH;
+ }
+ pushback(p, c);
+ return '!';
+
+ case '=':
+ if (p->column == 1) {
+ static const char begin[] = "begin";
+ static const char end[] = "\n=end";
+ if (peeks(p, begin)) {
+ c = peekc_n(p, sizeof(begin)-1);
+ if (c < 0 || ISSPACE(c)) {
+ do {
+ if (!skips(p, end)) {
+ yyerror(p, "embedded document meets end of file");
+ return 0;
+ }
+ c = nextc(p);
+ } while (!(c < 0 || ISSPACE(c)));
+ if (c != '\n') skip(p, '\n');
+ p->lineno++;
+ p->column = 0;
+ goto retry;
+ }
+ }
+ }
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ if ((c = nextc(p)) == '=') {
+ if ((c = nextc(p)) == '=') {
+ return tEQQ;
+ }
+ pushback(p, c);
+ return tEQ;
+ }
+ if (c == '~') {
+ return tMATCH;
+ }
+ else if (c == '>') {
+ return tASSOC;
+ }
+ pushback(p, c);
+ return '=';
+
+ case '<':
+ c = nextc(p);
+ if (c == '<' &&
+ p->lstate != EXPR_DOT &&
+ p->lstate != EXPR_CLASS &&
+ !IS_END() &&
+ (!IS_ARG() || space_seen)) {
+ int token = heredoc_identifier(p);
+ if (token)
+ return token;
+ }
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ if (p->lstate == EXPR_CLASS) {
+ p->cmd_start = TRUE;
+ }
+ }
+ if (c == '=') {
+ if ((c = nextc(p)) == '>') {
+ return tCMP;
+ }
+ pushback(p, c);
+ return tLEQ;
+ }
+ if (c == '<') {
+ if ((c = nextc(p)) == '=') {
+ yylval.id = intern("<<",2);
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ pushback(p, c);
+ return tLSHFT;
+ }
+ pushback(p, c);
+ return '<';
+
+ case '>':
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ if ((c = nextc(p)) == '=') {
+ return tGEQ;
+ }
+ if (c == '>') {
+ if ((c = nextc(p)) == '=') {
+ yylval.id = intern(">>",2);
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ pushback(p, c);
+ return tRSHFT;
+ }
+ pushback(p, c);
+ return '>';
+
+ case '"':
+ p->lex_strterm = new_strterm(p, str_dquote, '"', 0);
+ return tSTRING_BEG;
+
+ case '\'':
+ p->lex_strterm = new_strterm(p, str_squote, '\'', 0);
+ return parse_string(p);
+
+ case '`':
+ if (p->lstate == EXPR_FNAME) {
+ p->lstate = EXPR_ENDFN;
+ return '`';
+ }
+ if (p->lstate == EXPR_DOT) {
+ if (cmd_state)
+ p->lstate = EXPR_CMDARG;
+ else
+ p->lstate = EXPR_ARG;
+ return '`';
+ }
+ p->lex_strterm = new_strterm(p, str_xquote, '`', 0);
+ return tXSTRING_BEG;
+
+ case '?':
+ if (IS_END()) {
+ p->lstate = EXPR_VALUE;
+ return '?';
+ }
+ c = nextc(p);
+ if (c < 0) {
+ yyerror(p, "incomplete character syntax");
+ return 0;
+ }
+ if (ISSPACE(c)) {
+ if (!IS_ARG()) {
+ int c2;
+ switch (c) {
+ case ' ':
+ c2 = 's';
+ break;
+ case '\n':
+ c2 = 'n';
+ break;
+ case '\t':
+ c2 = 't';
+ break;
+ case '\v':
+ c2 = 'v';
+ break;
+ case '\r':
+ c2 = 'r';
+ break;
+ case '\f':
+ c2 = 'f';
+ break;
+ default:
+ c2 = 0;
+ break;
+ }
+ if (c2) {
+ char buf[256];
+ snprintf(buf, sizeof(buf), "invalid character syntax; use ?\\%c", c2);
+ yyerror(p, buf);
+ }
+ }
+ ternary:
+ pushback(p, c);
+ p->lstate = EXPR_VALUE;
+ return '?';
+ }
+ newtok(p);
+ /* need support UTF-8 if configured */
+ if ((isalnum(c) || c == '_')) {
+ int c2 = nextc(p);
+ pushback(p, c2);
+ if ((isalnum(c2) || c2 == '_')) {
+ goto ternary;
+ }
+ }
+ if (c == '\\') {
+ c = read_escape(p);
+ tokadd(p, c);
+ }
+ else {
+ tokadd(p, c);
+ }
+ tokfix(p);
+ yylval.nd = new_str(p, tok(p), toklen(p));
+ p->lstate = EXPR_END;
+ return tCHAR;
+
+ case '&':
+ if ((c = nextc(p)) == '&') {
+ p->lstate = EXPR_BEG;
+ if ((c = nextc(p)) == '=') {
+ yylval.id = intern("&&",2);
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ pushback(p, c);
+ return tANDOP;
+ }
+ else if (c == '=') {
+ yylval.id = intern_c('&');
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ pushback(p, c);
+ if (IS_SPCARG(c)) {
+ yywarning(p, "`&' interpreted as argument prefix");
+ c = tAMPER;
+ }
+ else if (IS_BEG()) {
+ c = tAMPER;
+ }
+ else {
+ c = '&';
+ }
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ return c;
+
+ case '|':
+ if ((c = nextc(p)) == '|') {
+ p->lstate = EXPR_BEG;
+ if ((c = nextc(p)) == '=') {
+ yylval.id = intern("||",2);
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ pushback(p, c);
+ return tOROP;
+ }
+ if (c == '=') {
+ yylval.id = intern_c('|');
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ pushback(p, c);
+ return '|';
+
+ case '+':
+ c = nextc(p);
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ if (c == '@') {
+ return tUPLUS;
+ }
+ pushback(p, c);
+ return '+';
+ }
+ if (c == '=') {
+ yylval.id = intern_c('+');
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ if (IS_BEG() || (IS_SPCARG(c) && arg_ambiguous(p))) {
+ p->lstate = EXPR_BEG;
+ pushback(p, c);
+ if (c >= 0 && ISDIGIT(c)) {
+ c = '+';
+ goto start_num;
+ }
+ return tUPLUS;
+ }
+ p->lstate = EXPR_BEG;
+ pushback(p, c);
+ return '+';
+
+ case '-':
+ c = nextc(p);
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ if (c == '@') {
+ return tUMINUS;
+ }
+ pushback(p, c);
+ return '-';
+ }
+ if (c == '=') {
+ yylval.id = intern_c('-');
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ if (c == '>') {
+ p->lstate = EXPR_ENDFN;
+ return tLAMBDA;
+ }
+ if (IS_BEG() || (IS_SPCARG(c) && arg_ambiguous(p))) {
+ p->lstate = EXPR_BEG;
+ pushback(p, c);
+ if (c >= 0 && ISDIGIT(c)) {
+ return tUMINUS_NUM;
+ }
+ return tUMINUS;
+ }
+ p->lstate = EXPR_BEG;
+ pushback(p, c);
+ return '-';
+
+ case '.':
+ p->lstate = EXPR_BEG;
+ if ((c = nextc(p)) == '.') {
+ if ((c = nextc(p)) == '.') {
+ return tDOT3;
+ }
+ pushback(p, c);
+ return tDOT2;
+ }
+ pushback(p, c);
+ if (c >= 0 && ISDIGIT(c)) {
+ yyerror(p, "no .<digit> floating literal anymore; put 0 before dot");
+ }
+ p->lstate = EXPR_DOT;
+ return '.';
+
+ start_num:
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ {
+ int is_float, seen_point, seen_e, nondigit;
+
+ is_float = seen_point = seen_e = nondigit = 0;
+ p->lstate = EXPR_END;
+ newtok(p);
+ if (c == '-' || c == '+') {
+ tokadd(p, c);
+ c = nextc(p);
+ }
+ if (c == '0') {
+#define no_digits() do {yyerror(p,"numeric literal without digits"); return 0;} while (0)
+ int start = toklen(p);
+ c = nextc(p);
+ if (c == 'x' || c == 'X') {
+ /* hexadecimal */
+ c = nextc(p);
+ if (c >= 0 && ISXDIGIT(c)) {
+ do {
+ if (c == '_') {
+ if (nondigit) break;
+ nondigit = c;
+ continue;
+ }
+ if (!ISXDIGIT(c)) break;
+ nondigit = 0;
+ tokadd(p, tolower(c));
+ } while ((c = nextc(p)) >= 0);
+ }
+ pushback(p, c);
+ tokfix(p);
+ if (toklen(p) == start) {
+ no_digits();
+ }
+ else if (nondigit) goto trailing_uc;
+ yylval.nd = new_int(p, tok(p), 16);
+ return tINTEGER;
+ }
+ if (c == 'b' || c == 'B') {
+ /* binary */
+ c = nextc(p);
+ if (c == '0' || c == '1') {
+ do {
+ if (c == '_') {
+ if (nondigit) break;
+ nondigit = c;
+ continue;
+ }
+ if (c != '0' && c != '1') break;
+ nondigit = 0;
+ tokadd(p, c);
+ } while ((c = nextc(p)) >= 0);
+ }
+ pushback(p, c);
+ tokfix(p);
+ if (toklen(p) == start) {
+ no_digits();
+ }
+ else if (nondigit) goto trailing_uc;
+ yylval.nd = new_int(p, tok(p), 2);
+ return tINTEGER;
+ }
+ if (c == 'd' || c == 'D') {
+ /* decimal */
+ c = nextc(p);
+ if (c >= 0 && ISDIGIT(c)) {
+ do {
+ if (c == '_') {
+ if (nondigit) break;
+ nondigit = c;
+ continue;
+ }
+ if (!ISDIGIT(c)) break;
+ nondigit = 0;
+ tokadd(p, c);
+ } while ((c = nextc(p)) >= 0);
+ }
+ pushback(p, c);
+ tokfix(p);
+ if (toklen(p) == start) {
+ no_digits();
+ }
+ else if (nondigit) goto trailing_uc;
+ yylval.nd = new_int(p, tok(p), 10);
+ return tINTEGER;
+ }
+ if (c == '_') {
+ /* 0_0 */
+ goto octal_number;
+ }
+ if (c == 'o' || c == 'O') {
+ /* prefixed octal */
+ c = nextc(p);
+ if (c < 0 || c == '_' || !ISDIGIT(c)) {
+ no_digits();
+ }
+ }
+ if (c >= '0' && c <= '7') {
+ /* octal */
+ octal_number:
+ do {
+ if (c == '_') {
+ if (nondigit) break;
+ nondigit = c;
+ continue;
+ }
+ if (c < '0' || c > '9') break;
+ if (c > '7') goto invalid_octal;
+ nondigit = 0;
+ tokadd(p, c);
+ } while ((c = nextc(p)) >= 0);
+
+ if (toklen(p) > start) {
+ pushback(p, c);
+ tokfix(p);
+ if (nondigit) goto trailing_uc;
+ yylval.nd = new_int(p, tok(p), 8);
+ return tINTEGER;
+ }
+ if (nondigit) {
+ pushback(p, c);
+ goto trailing_uc;
+ }
+ }
+ if (c > '7' && c <= '9') {
+ invalid_octal:
+ yyerror(p, "Invalid octal digit");
+ }
+ else if (c == '.' || c == 'e' || c == 'E') {
+ tokadd(p, '0');
+ }
+ else {
+ pushback(p, c);
+ yylval.nd = new_int(p, "0", 10);
+ return tINTEGER;
+ }
+ }
+
+ for (;;) {
+ switch (c) {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ nondigit = 0;
+ tokadd(p, c);
+ break;
+
+ case '.':
+ if (nondigit) goto trailing_uc;
+ if (seen_point || seen_e) {
+ goto decode_num;
+ }
+ else {
+ int c0 = nextc(p);
+ if (c0 < 0 || !ISDIGIT(c0)) {
+ pushback(p, c0);
+ goto decode_num;
+ }
+ c = c0;
+ }
+ tokadd(p, '.');
+ tokadd(p, c);
+ is_float++;
+ seen_point++;
+ nondigit = 0;
+ break;
+
+ case 'e':
+ case 'E':
+ if (nondigit) {
+ pushback(p, c);
+ c = nondigit;
+ goto decode_num;
+ }
+ if (seen_e) {
+ goto decode_num;
+ }
+ tokadd(p, c);
+ seen_e++;
+ is_float++;
+ nondigit = c;
+ c = nextc(p);
+ if (c != '-' && c != '+') continue;
+ tokadd(p, c);
+ nondigit = c;
+ break;
+
+ case '_': /* `_' in number just ignored */
+ if (nondigit) goto decode_num;
+ nondigit = c;
+ break;
+
+ default:
+ goto decode_num;
+ }
+ c = nextc(p);
+ }
+
+ decode_num:
+ pushback(p, c);
+ if (nondigit) {
+ trailing_uc:
+ yyerror_i(p, "trailing `%c' in number", nondigit);
+ }
+ tokfix(p);
+ if (is_float) {
+ double d;
+ char *endp;
+
+ errno = 0;
+ d = strtod(tok(p), &endp);
+ if (d == 0 && endp == tok(p)) {
+ yywarning_s(p, "corrupted float value %s", tok(p));
+ }
+ else if (errno == ERANGE) {
+ yywarning_s(p, "float %s out of range", tok(p));
+ errno = 0;
+ }
+ yylval.nd = new_float(p, tok(p));
+ return tFLOAT;
+ }
+ yylval.nd = new_int(p, tok(p), 10);
+ return tINTEGER;
+ }
+
+ case ')':
+ case ']':
+ p->paren_nest--;
+ case '}':
+ COND_LEXPOP();
+ CMDARG_LEXPOP();
+ if (c == ')')
+ p->lstate = EXPR_ENDFN;
+ else
+ p->lstate = EXPR_ENDARG;
+ return c;
+
+ case ':':
+ c = nextc(p);
+ if (c == ':') {
+ if (IS_BEG() || p->lstate == EXPR_CLASS || IS_SPCARG(-1)) {
+ p->lstate = EXPR_BEG;
+ return tCOLON3;
+ }
+ p->lstate = EXPR_DOT;
+ return tCOLON2;
+ }
+ if (IS_END() || ISSPACE(c)) {
+ pushback(p, c);
+ p->lstate = EXPR_BEG;
+ return ':';
+ }
+ pushback(p, c);
+ p->lstate = EXPR_FNAME;
+ return tSYMBEG;
+
+ case '/':
+ if (IS_BEG()) {
+ p->lex_strterm = new_strterm(p, str_regexp, '/', 0);
+ return tREGEXP_BEG;
+ }
+ if ((c = nextc(p)) == '=') {
+ yylval.id = intern_c('/');
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ pushback(p, c);
+ if (IS_SPCARG(c)) {
+ p->lex_strterm = new_strterm(p, str_regexp, '/', 0);
+ return tREGEXP_BEG;
+ }
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ return '/';
+
+ case '^':
+ if ((c = nextc(p)) == '=') {
+ yylval.id = intern_c('^');
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ pushback(p, c);
+ return '^';
+
+ case ';':
+ p->lstate = EXPR_BEG;
+ return ';';
+
+ case ',':
+ p->lstate = EXPR_BEG;
+ return ',';
+
+ case '~':
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ if ((c = nextc(p)) != '@') {
+ pushback(p, c);
+ }
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ return '~';
+
+ case '(':
+ if (IS_BEG()) {
+ c = tLPAREN;
+ }
+ else if (IS_SPCARG(-1)) {
+ c = tLPAREN_ARG;
+ }
+ p->paren_nest++;
+ COND_PUSH(0);
+ CMDARG_PUSH(0);
+ p->lstate = EXPR_BEG;
+ return c;
+
+ case '[':
+ p->paren_nest++;
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ if ((c = nextc(p)) == ']') {
+ if ((c = nextc(p)) == '=') {
+ return tASET;
+ }
+ pushback(p, c);
+ return tAREF;
+ }
+ pushback(p, c);
+ return '[';
+ }
+ else if (IS_BEG()) {
+ c = tLBRACK;
+ }
+ else if (IS_ARG() && space_seen) {
+ c = tLBRACK;
+ }
+ p->lstate = EXPR_BEG;
+ COND_PUSH(0);
+ CMDARG_PUSH(0);
+ return c;
+
+ case '{':
+ if (p->lpar_beg && p->lpar_beg == p->paren_nest) {
+ p->lstate = EXPR_BEG;
+ p->lpar_beg = 0;
+ p->paren_nest--;
+ COND_PUSH(0);
+ CMDARG_PUSH(0);
+ return tLAMBEG;
+ }
+ if (IS_ARG() || p->lstate == EXPR_END || p->lstate == EXPR_ENDFN)
+ c = '{'; /* block (primary) */
+ else if (p->lstate == EXPR_ENDARG)
+ c = tLBRACE_ARG; /* block (expr) */
+ else
+ c = tLBRACE; /* hash */
+ COND_PUSH(0);
+ CMDARG_PUSH(0);
+ p->lstate = EXPR_BEG;
+ return c;
+
+ case '\\':
+ c = nextc(p);
+ if (c == '\n') {
+ p->lineno++;
+ p->column = 0;
+ space_seen = 1;
+ goto retry; /* skip \\n */
+ }
+ pushback(p, c);
+ return '\\';
+
+ case '%':
+ if (IS_BEG()) {
+ int term;
+ int paren;
+
+ c = nextc(p);
+ quotation:
+ if (c < 0 || !ISALNUM(c)) {
+ term = c;
+ c = 'Q';
+ }
+ else {
+ term = nextc(p);
+ if (isalnum(term)) {
+ yyerror(p, "unknown type of %string");
+ return 0;
+ }
+ }
+ if (c < 0 || term < 0) {
+ yyerror(p, "unterminated quoted string meets end of file");
+ return 0;
+ }
+ paren = term;
+ if (term == '(') term = ')';
+ else if (term == '[') term = ']';
+ else if (term == '{') term = '}';
+ else if (term == '<') term = '>';
+ else paren = 0;
+
+ switch (c) {
+ case 'Q':
+ p->lex_strterm = new_strterm(p, str_dquote, term, paren);
+ return tSTRING_BEG;
+
+ case 'q':
+ p->lex_strterm = new_strterm(p, str_squote, term, paren);
+ return parse_string(p);
+
+ case 'W':
+ p->lex_strterm = new_strterm(p, str_dword, term, paren);
+ return tWORDS_BEG;
+
+ case 'w':
+ p->lex_strterm = new_strterm(p, str_sword, term, paren);
+ return tWORDS_BEG;
+
+ case 'x':
+ p->lex_strterm = new_strterm(p, str_xquote, term, paren);
+ return tXSTRING_BEG;
+
+ case 'r':
+ p->lex_strterm = new_strterm(p, str_regexp, term, paren);
+ return tREGEXP_BEG;
+
+ case 's':
+ p->lex_strterm = new_strterm(p, str_ssym, term, paren);
+ return tSYMBEG;
+
+ case 'I':
+ p->lex_strterm = new_strterm(p, str_dsymbols, term, paren);
+ return tSYMBOLS_BEG;
+
+ case 'i':
+ p->lex_strterm = new_strterm(p, str_ssymbols, term, paren);
+ return tSYMBOLS_BEG;
+
+ default:
+ yyerror(p, "unknown type of %string");
+ return 0;
+ }
+ }
+ if ((c = nextc(p)) == '=') {
+ yylval.id = intern_c('%');
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ if (IS_SPCARG(c)) {
+ goto quotation;
+ }
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ pushback(p, c);
+ return '%';
+
+ case '$':
+ p->lstate = EXPR_END;
+ token_column = newtok(p);
+ c = nextc(p);
+ if (c < 0) {
+ yyerror(p, "incomplete global variable syntax");
+ return 0;
+ }
+ switch (c) {
+ case '_': /* $_: last read line string */
+ c = nextc(p);
+ if (c >= 0 && identchar(c)) { /* if there is more after _ it is a variable */
+ tokadd(p, '$');
+ tokadd(p, c);
+ break;
+ }
+ pushback(p, c);
+ c = '_';
+ /* fall through */
+ case '~': /* $~: match-data */
+ case '*': /* $*: argv */
+ case '$': /* $$: pid */
+ case '?': /* $?: last status */
+ case '!': /* $!: error string */
+ case '@': /* $@: error position */
+ case '/': /* $/: input record separator */
+ case '\\': /* $\: output record separator */
+ case ';': /* $;: field separator */
+ case ',': /* $,: output field separator */
+ case '.': /* $.: last read line number */
+ case '=': /* $=: ignorecase */
+ case ':': /* $:: load path */
+ case '<': /* $<: reading filename */
+ case '>': /* $>: default output handle */
+ case '\"': /* $": already loaded files */
+ tokadd(p, '$');
+ tokadd(p, c);
+ tokfix(p);
+ yylval.id = intern_cstr(tok(p));
+ return tGVAR;
+
+ case '-':
+ tokadd(p, '$');
+ tokadd(p, c);
+ c = nextc(p);
+ pushback(p, c);
+ gvar:
+ tokfix(p);
+ yylval.id = intern_cstr(tok(p));
+ return tGVAR;
+
+ case '&': /* $&: last match */
+ case '`': /* $`: string before last match */
+ case '\'': /* $': string after last match */
+ case '+': /* $+: string matches last pattern */
+ if (last_state == EXPR_FNAME) {
+ tokadd(p, '$');
+ tokadd(p, c);
+ goto gvar;
+ }
+ yylval.nd = new_back_ref(p, c);
+ return tBACK_REF;
+
+ case '1': case '2': case '3':
+ case '4': case '5': case '6':
+ case '7': case '8': case '9':
+ do {
+ tokadd(p, c);
+ c = nextc(p);
+ } while (c >= 0 && isdigit(c));
+ pushback(p, c);
+ if (last_state == EXPR_FNAME) goto gvar;
+ tokfix(p);
+ yylval.nd = new_nth_ref(p, atoi(tok(p)));
+ return tNTH_REF;
+
+ default:
+ if (!identchar(c)) {
+ pushback(p, c);
+ return '$';
+ }
+ case '0':
+ tokadd(p, '$');
+ }
+ break;
+
+ case '@':
+ c = nextc(p);
+ token_column = newtok(p);
+ tokadd(p, '@');
+ if (c == '@') {
+ tokadd(p, '@');
+ c = nextc(p);
+ }
+ if (c < 0) {
+ if (p->bidx == 1) {
+ yyerror(p, "incomplete instance variable syntax");
+ }
+ else {
+ yyerror(p, "incomplete class variable syntax");
+ }
+ return 0;
+ }
+ else if (isdigit(c)) {
+ if (p->bidx == 1) {
+ yyerror_i(p, "`@%c' is not allowed as an instance variable name", c);
+ }
+ else {
+ yyerror_i(p, "`@@%c' is not allowed as a class variable name", c);
+ }
+ return 0;
+ }
+ if (!identchar(c)) {
+ pushback(p, c);
+ return '@';
+ }
+ break;
+
+ case '_':
+ token_column = newtok(p);
+ break;
+
+ default:
+ if (!identchar(c)) {
+ yyerror_i(p, "Invalid char `\\x%02X' in expression", c);
+ goto retry;
+ }
+
+ token_column = newtok(p);
+ break;
+ }
+
+ do {
+ tokadd(p, c);
+ c = nextc(p);
+ if (c < 0) break;
+ } while (identchar(c));
+ if (token_column == 0 && toklen(p) == 7 && (c < 0 || c == '\n') &&
+ strncmp(tok(p), "__END__", toklen(p)) == 0)
+ return -1;
+
+ switch (tok(p)[0]) {
+ case '@': case '$':
+ pushback(p, c);
+ break;
+ default:
+ if ((c == '!' || c == '?') && !peek(p, '=')) {
+ tokadd(p, c);
+ }
+ else {
+ pushback(p, c);
+ }
+ }
+ tokfix(p);
+ {
+ int result = 0;
+
+ switch (tok(p)[0]) {
+ case '$':
+ p->lstate = EXPR_END;
+ result = tGVAR;
+ break;
+ case '@':
+ p->lstate = EXPR_END;
+ if (tok(p)[1] == '@')
+ result = tCVAR;
+ else
+ result = tIVAR;
+ break;
+
+ default:
+ if (toklast(p) == '!' || toklast(p) == '?') {
+ result = tFID;
+ }
+ else {
+ if (p->lstate == EXPR_FNAME) {
+ if ((c = nextc(p)) == '=' && !peek(p, '~') && !peek(p, '>') &&
+ (!peek(p, '=') || (peek_n(p, '>', 1)))) {
+ result = tIDENTIFIER;
+ tokadd(p, c);
+ tokfix(p);
+ }
+ else {
+ pushback(p, c);
+ }
+ }
+ if (result == 0 && ISUPPER(tok(p)[0])) {
+ result = tCONSTANT;
+ }
+ else {
+ result = tIDENTIFIER;
+ }
+ }
+
+ if (IS_LABEL_POSSIBLE()) {
+ if (IS_LABEL_SUFFIX(0)) {
+ p->lstate = EXPR_BEG;
+ nextc(p);
+ tokfix(p);
+ yylval.id = intern_cstr(tok(p));
+ return tLABEL;
+ }
+ }
+ if (p->lstate != EXPR_DOT) {
+ const struct kwtable *kw;
+
+ /* See if it is a reserved word. */
+ kw = mrb_reserved_word(tok(p), toklen(p));
+ if (kw) {
+ enum mrb_lex_state_enum state = p->lstate;
+ yylval.num = p->lineno;
+ p->lstate = kw->state;
+ if (state == EXPR_FNAME) {
+ yylval.id = intern_cstr(kw->name);
+ return kw->id[0];
+ }
+ if (p->lstate == EXPR_BEG) {
+ p->cmd_start = TRUE;
+ }
+ if (kw->id[0] == keyword_do) {
+ if (p->lpar_beg && p->lpar_beg == p->paren_nest) {
+ p->lpar_beg = 0;
+ p->paren_nest--;
+ return keyword_do_LAMBDA;
+ }
+ if (COND_P()) return keyword_do_cond;
+ if (CMDARG_P() && state != EXPR_CMDARG)
+ return keyword_do_block;
+ if (state == EXPR_ENDARG || state == EXPR_BEG)
+ return keyword_do_block;
+ return keyword_do;
+ }
+ if (state == EXPR_BEG || state == EXPR_VALUE)
+ return kw->id[0];
+ else {
+ if (kw->id[0] != kw->id[1])
+ p->lstate = EXPR_BEG;
+ return kw->id[1];
+ }
+ }
+ }
+
+ if (IS_BEG() || p->lstate == EXPR_DOT || IS_ARG()) {
+ if (cmd_state) {
+ p->lstate = EXPR_CMDARG;
+ }
+ else {
+ p->lstate = EXPR_ARG;
+ }
+ }
+ else if (p->lstate == EXPR_FNAME) {
+ p->lstate = EXPR_ENDFN;
+ }
+ else {
+ p->lstate = EXPR_END;
+ }
+ }
+ {
+ mrb_sym ident = intern_cstr(tok(p));
+
+ yylval.id = ident;
+#if 0
+ if (last_state != EXPR_DOT && islower(tok(p)[0]) && lvar_defined(ident)) {
+ p->lstate = EXPR_END;
+ }
+#endif
+ }
+ return result;
+ }
+}
+
+static int
+yylex(void *lval, parser_state *p)
+{
+ p->ylval = lval;
+ return parser_yylex(p);
+}
+
+static void
+parser_init_cxt(parser_state *p, mrbc_context *cxt)
+{
+ if (!cxt) return;
+ if (cxt->filename) mrb_parser_set_filename(p, cxt->filename);
+ if (cxt->lineno) p->lineno = cxt->lineno;
+ if (cxt->syms) {
+ int i;
+
+ p->locals = cons(0,0);
+ for (i=0; i<cxt->slen; i++) {
+ local_add_f(p, cxt->syms[i]);
+ }
+ }
+ p->capture_errors = cxt->capture_errors;
+ p->no_optimize = cxt->no_optimize;
+ if (cxt->partial_hook) {
+ p->cxt = cxt;
+ }
+}
+
+static void
+parser_update_cxt(parser_state *p, mrbc_context *cxt)
+{
+ node *n, *n0;
+ int i = 0;
+
+ if (!cxt) return;
+ if ((int)(intptr_t)p->tree->car != NODE_SCOPE) return;
+ n0 = n = p->tree->cdr->car;
+ while (n) {
+ i++;
+ n = n->cdr;
+ }
+ cxt->syms = (mrb_sym *)mrb_realloc(p->mrb, cxt->syms, i*sizeof(mrb_sym));
+ cxt->slen = i;
+ for (i=0, n=n0; n; i++,n=n->cdr) {
+ cxt->syms[i] = sym(n->car);
+ }
+}
+
+void mrb_codedump_all(mrb_state*, struct RProc*);
+void mrb_parser_dump(mrb_state *mrb, node *tree, int offset);
+
+MRB_API void
+mrb_parser_parse(parser_state *p, mrbc_context *c)
+{
+ struct mrb_jmpbuf buf;
+ p->jmp = &buf;
+
+ MRB_TRY(p->jmp) {
+
+ p->cmd_start = TRUE;
+ p->in_def = p->in_single = 0;
+ p->nerr = p->nwarn = 0;
+ p->lex_strterm = NULL;
+
+ parser_init_cxt(p, c);
+ yyparse(p);
+ if (!p->tree) {
+ p->tree = new_nil(p);
+ }
+ parser_update_cxt(p, c);
+ if (c && c->dump_result) {
+ mrb_parser_dump(p->mrb, p->tree, 0);
+ }
+
+ }
+ MRB_CATCH(p->jmp) {
+ yyerror(p, "memory allocation error");
+ p->nerr++;
+ p->tree = 0;
+ return;
+ }
+ MRB_END_EXC(p->jmp);
+}
+
+MRB_API parser_state*
+mrb_parser_new(mrb_state *mrb)
+{
+ mrb_pool *pool;
+ parser_state *p;
+ static const parser_state parser_state_zero = { 0 };
+
+ pool = mrb_pool_open(mrb);
+ if (!pool) return NULL;
+ p = (parser_state *)mrb_pool_alloc(pool, sizeof(parser_state));
+ if (!p) return NULL;
+
+ *p = parser_state_zero;
+ p->mrb = mrb;
+ p->pool = pool;
+
+ p->s = p->send = NULL;
+#ifdef ENABLE_STDIO
+ p->f = NULL;
+#endif
+
+ p->cmd_start = TRUE;
+ p->in_def = p->in_single = 0;
+
+ p->capture_errors = FALSE;
+ p->lineno = 1;
+ p->column = 0;
+#if defined(PARSER_TEST) || defined(PARSER_DEBUG)
+ yydebug = 1;
+#endif
+
+ p->lex_strterm = NULL;
+ p->all_heredocs = p->parsing_heredoc = NULL;
+ p->lex_strterm_before_heredoc = NULL;
+
+ p->current_filename_index = -1;
+ p->filename_table = NULL;
+ p->filename_table_length = 0;
+
+ return p;
+}
+
+MRB_API void
+mrb_parser_free(parser_state *p) {
+ mrb_pool_close(p->pool);
+}
+
+MRB_API mrbc_context*
+mrbc_context_new(mrb_state *mrb)
+{
+ return (mrbc_context *)mrb_calloc(mrb, 1, sizeof(mrbc_context));
+}
+
+MRB_API void
+mrbc_context_free(mrb_state *mrb, mrbc_context *cxt)
+{
+ mrb_free(mrb, cxt->syms);
+ mrb_free(mrb, cxt);
+}
+
+MRB_API const char*
+mrbc_filename(mrb_state *mrb, mrbc_context *c, const char *s)
+{
+ if (s) {
+ int len = strlen(s);
+ char *p = (char *)mrb_alloca(mrb, len + 1);
+
+ memcpy(p, s, len + 1);
+ c->filename = p;
+ }
+ return c->filename;
+}
+
+MRB_API void
+mrbc_partial_hook(mrb_state *mrb, mrbc_context *c, int (*func)(struct mrb_parser_state*), void *data)
+{
+ c->partial_hook = func;
+ c->partial_data = data;
+}
+
+MRB_API void
+mrb_parser_set_filename(struct mrb_parser_state *p, const char *f)
+{
+ mrb_sym sym;
+ size_t i;
+ mrb_sym* new_table;
+
+ sym = mrb_intern_cstr(p->mrb, f);
+ p->filename = mrb_sym2name_len(p->mrb, sym, NULL);
+ p->lineno = (p->filename_table_length > 0)? 0 : 1;
+
+ for (i = 0; i < p->filename_table_length; ++i) {
+ if (p->filename_table[i] == sym) {
+ p->current_filename_index = i;
+ return;
+ }
+ }
+
+ p->current_filename_index = p->filename_table_length++;
+
+ new_table = (mrb_sym*)parser_palloc(p, sizeof(mrb_sym) * p->filename_table_length);
+ if (p->filename_table) {
+ memmove(new_table, p->filename_table, sizeof(mrb_sym) * p->filename_table_length);
+ }
+ p->filename_table = new_table;
+ p->filename_table[p->filename_table_length - 1] = sym;
+}
+
+MRB_API char const*
+mrb_parser_get_filename(struct mrb_parser_state* p, uint16_t idx) {
+ if (idx >= p->filename_table_length) { return NULL; }
+ else {
+ return mrb_sym2name_len(p->mrb, p->filename_table[idx], NULL);
+ }
+}
+
+#ifdef ENABLE_STDIO
+MRB_API parser_state*
+mrb_parse_file(mrb_state *mrb, FILE *f, mrbc_context *c)
+{
+ parser_state *p;
+
+ p = mrb_parser_new(mrb);
+ if (!p) return NULL;
+ p->s = p->send = NULL;
+ p->f = f;
+
+ mrb_parser_parse(p, c);
+ return p;
+}
+#endif
+
+MRB_API parser_state*
+mrb_parse_nstring(mrb_state *mrb, const char *s, int len, mrbc_context *c)
+{
+ parser_state *p;
+
+ p = mrb_parser_new(mrb);
+ if (!p) return NULL;
+ p->s = s;
+ p->send = s + len;
+
+ mrb_parser_parse(p, c);
+ return p;
+}
+
+MRB_API parser_state*
+mrb_parse_string(mrb_state *mrb, const char *s, mrbc_context *c)
+{
+ return mrb_parse_nstring(mrb, s, strlen(s), c);
+}
+
+static mrb_value
+load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
+{
+ struct RClass *target = mrb->object_class;
+ struct RProc *proc;
+ mrb_value v;
+ unsigned int keep = 0;
+
+ if (!p) {
+ return mrb_undef_value();
+ }
+ if (!p->tree || p->nerr) {
+ if (p->capture_errors) {
+ char buf[256];
+ int n;
+
+ n = snprintf(buf, sizeof(buf), "line %d: %s\n",
+ p->error_buffer[0].lineno, p->error_buffer[0].message);
+ mrb->exc = mrb_obj_ptr(mrb_exc_new(mrb, E_SYNTAX_ERROR, buf, n));
+ mrb_parser_free(p);
+ return mrb_undef_value();
+ }
+ else {
+ mrb->exc = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, E_SYNTAX_ERROR, "syntax error"));
+ mrb_parser_free(p);
+ return mrb_undef_value();
+ }
+ }
+ proc = mrb_generate_code(mrb, p);
+ mrb_parser_free(p);
+ if (proc == NULL) {
+ mrb->exc = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, E_SCRIPT_ERROR, "codegen error"));
+ return mrb_undef_value();
+ }
+ if (c) {
+ if (c->dump_result) mrb_codedump_all(mrb, proc);
+ if (c->no_exec) return mrb_obj_value(proc);
+ if (c->target_class) {
+ target = c->target_class;
+ }
+ if (c->keep_lv) {
+ keep = c->slen + 1;
+ }
+ else {
+ c->keep_lv = TRUE;
+ }
+ }
+ proc->target_class = target;
+ if (mrb->c->ci) {
+ mrb->c->ci->target_class = target;
+ }
+ v = mrb_toplevel_run_keep(mrb, proc, keep);
+ if (mrb->exc) return mrb_nil_value();
+ return v;
+}
+
+#ifdef ENABLE_STDIO
+MRB_API mrb_value
+mrb_load_file_cxt(mrb_state *mrb, FILE *f, mrbc_context *c)
+{
+ return load_exec(mrb, mrb_parse_file(mrb, f, c), c);
+}
+
+MRB_API mrb_value
+mrb_load_file(mrb_state *mrb, FILE *f)
+{
+ return mrb_load_file_cxt(mrb, f, NULL);
+}
+#endif
+
+MRB_API mrb_value
+mrb_load_nstring_cxt(mrb_state *mrb, const char *s, int len, mrbc_context *c)
+{
+ return load_exec(mrb, mrb_parse_nstring(mrb, s, len, c), c);
+}
+
+MRB_API mrb_value
+mrb_load_nstring(mrb_state *mrb, const char *s, int len)
+{
+ return mrb_load_nstring_cxt(mrb, s, len, NULL);
+}
+
+MRB_API mrb_value
+mrb_load_string_cxt(mrb_state *mrb, const char *s, mrbc_context *c)
+{
+ return mrb_load_nstring_cxt(mrb, s, strlen(s), c);
+}
+
+MRB_API mrb_value
+mrb_load_string(mrb_state *mrb, const char *s)
+{
+ return mrb_load_string_cxt(mrb, s, NULL);
+}
+
+#ifdef ENABLE_STDIO
+
+static void
+dump_prefix(node *tree, int offset)
+{
+ printf("%05d ", tree->lineno);
+ while (offset--) {
+ putc(' ', stdout);
+ putc(' ', stdout);
+ }
+}
+
+static void
+dump_recur(mrb_state *mrb, node *tree, int offset)
+{
+ while (tree) {
+ mrb_parser_dump(mrb, tree->car, offset);
+ tree = tree->cdr;
+ }
+}
+
+#endif
+
+void
+mrb_parser_dump(mrb_state *mrb, node *tree, int offset)
+{
+#ifdef ENABLE_STDIO
+ int nodetype;
+
+ if (!tree) return;
+ again:
+ dump_prefix(tree, offset);
+ nodetype = (int)(intptr_t)tree->car;
+ tree = tree->cdr;
+ switch (nodetype) {
+ case NODE_BEGIN:
+ printf("NODE_BEGIN:\n");
+ dump_recur(mrb, tree, offset+1);
+ break;
+
+ case NODE_RESCUE:
+ printf("NODE_RESCUE:\n");
+ if (tree->car) {
+ dump_prefix(tree, offset+1);
+ printf("body:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ }
+ tree = tree->cdr;
+ if (tree->car) {
+ node *n2 = tree->car;
+
+ dump_prefix(n2, offset+1);
+ printf("rescue:\n");
+ while (n2) {
+ node *n3 = n2->car;
+ if (n3->car) {
+ dump_prefix(n2, offset+2);
+ printf("handle classes:\n");
+ dump_recur(mrb, n3->car, offset+3);
+ }
+ if (n3->cdr->car) {
+ dump_prefix(n3, offset+2);
+ printf("exc_var:\n");
+ mrb_parser_dump(mrb, n3->cdr->car, offset+3);
+ }
+ if (n3->cdr->cdr->car) {
+ dump_prefix(n3, offset+2);
+ printf("rescue body:\n");
+ mrb_parser_dump(mrb, n3->cdr->cdr->car, offset+3);
+ }
+ n2 = n2->cdr;
+ }
+ }
+ tree = tree->cdr;
+ if (tree->car) {
+ dump_prefix(tree, offset+1);
+ printf("else:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ }
+ break;
+
+ case NODE_ENSURE:
+ printf("NODE_ENSURE:\n");
+ dump_prefix(tree, offset+1);
+ printf("body:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ dump_prefix(tree, offset+1);
+ printf("ensure:\n");
+ mrb_parser_dump(mrb, tree->cdr->cdr, offset+2);
+ break;
+
+ case NODE_LAMBDA:
+ printf("NODE_BLOCK:\n");
+ goto block;
+
+ case NODE_BLOCK:
+ block:
+ printf("NODE_BLOCK:\n");
+ tree = tree->cdr;
+ if (tree->car) {
+ node *n = tree->car;
+
+ if (n->car) {
+ dump_prefix(n, offset+1);
+ printf("mandatory args:\n");
+ dump_recur(mrb, n->car, offset+2);
+ }
+ n = n->cdr;
+ if (n->car) {
+ dump_prefix(n, offset+1);
+ printf("optional args:\n");
+ {
+ node *n2 = n->car;
+
+ while (n2) {
+ dump_prefix(n2, offset+2);
+ printf("%s=", mrb_sym2name(mrb, sym(n2->car->car)));
+ mrb_parser_dump(mrb, n2->car->cdr, 0);
+ n2 = n2->cdr;
+ }
+ }
+ }
+ n = n->cdr;
+ if (n->car) {
+ dump_prefix(n, offset+1);
+ printf("rest=*%s\n", mrb_sym2name(mrb, sym(n->car)));
+ }
+ n = n->cdr;
+ if (n->car) {
+ dump_prefix(n, offset+1);
+ printf("post mandatory args:\n");
+ dump_recur(mrb, n->car, offset+2);
+ }
+ n = n->cdr;
+ if (n) {
+ dump_prefix(n, offset+1);
+ printf("blk=&%s\n", mrb_sym2name(mrb, sym(n)));
+ }
+ }
+ dump_prefix(tree, offset+1);
+ printf("body:\n");
+ mrb_parser_dump(mrb, tree->cdr->car, offset+2);
+ break;
+
+ case NODE_IF:
+ printf("NODE_IF:\n");
+ dump_prefix(tree, offset+1);
+ printf("cond:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ dump_prefix(tree, offset+1);
+ printf("then:\n");
+ mrb_parser_dump(mrb, tree->cdr->car, offset+2);
+ if (tree->cdr->cdr->car) {
+ dump_prefix(tree, offset+1);
+ printf("else:\n");
+ mrb_parser_dump(mrb, tree->cdr->cdr->car, offset+2);
+ }
+ break;
+
+ case NODE_AND:
+ printf("NODE_AND:\n");
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ mrb_parser_dump(mrb, tree->cdr, offset+1);
+ break;
+
+ case NODE_OR:
+ printf("NODE_OR:\n");
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ mrb_parser_dump(mrb, tree->cdr, offset+1);
+ break;
+
+ case NODE_CASE:
+ printf("NODE_CASE:\n");
+ if (tree->car) {
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ }
+ tree = tree->cdr;
+ while (tree) {
+ dump_prefix(tree, offset+1);
+ printf("case:\n");
+ dump_recur(mrb, tree->car->car, offset+2);
+ dump_prefix(tree, offset+1);
+ printf("body:\n");
+ mrb_parser_dump(mrb, tree->car->cdr, offset+2);
+ tree = tree->cdr;
+ }
+ break;
+
+ case NODE_WHILE:
+ printf("NODE_WHILE:\n");
+ dump_prefix(tree, offset+1);
+ printf("cond:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ dump_prefix(tree, offset+1);
+ printf("body:\n");
+ mrb_parser_dump(mrb, tree->cdr, offset+2);
+ break;
+
+ case NODE_UNTIL:
+ printf("NODE_UNTIL:\n");
+ dump_prefix(tree, offset+1);
+ printf("cond:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ dump_prefix(tree, offset+1);
+ printf("body:\n");
+ mrb_parser_dump(mrb, tree->cdr, offset+2);
+ break;
+
+ case NODE_FOR:
+ printf("NODE_FOR:\n");
+ dump_prefix(tree, offset+1);
+ printf("var:\n");
+ {
+ node *n2 = tree->car;
+
+ if (n2->car) {
+ dump_prefix(n2, offset+2);
+ printf("pre:\n");
+ dump_recur(mrb, n2->car, offset+3);
+ }
+ n2 = n2->cdr;
+ if (n2) {
+ if (n2->car) {
+ dump_prefix(n2, offset+2);
+ printf("rest:\n");
+ mrb_parser_dump(mrb, n2->car, offset+3);
+ }
+ n2 = n2->cdr;
+ if (n2) {
+ if (n2->car) {
+ dump_prefix(n2, offset+2);
+ printf("post:\n");
+ dump_recur(mrb, n2->car, offset+3);
+ }
+ }
+ }
+ }
+ tree = tree->cdr;
+ dump_prefix(tree, offset+1);
+ printf("in:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ tree = tree->cdr;
+ dump_prefix(tree, offset+1);
+ printf("do:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ break;
+
+ case NODE_SCOPE:
+ printf("NODE_SCOPE:\n");
+ {
+ node *n2 = tree->car;
+ mrb_bool first_lval = TRUE;
+
+ if (n2 && (n2->car || n2->cdr)) {
+ dump_prefix(n2, offset+1);
+ printf("local variables:\n");
+ dump_prefix(n2, offset+2);
+ while (n2) {
+ if (n2->car) {
+ if (!first_lval) printf(", ");
+ printf("%s", mrb_sym2name(mrb, sym(n2->car)));
+ first_lval = FALSE;
+ }
+ n2 = n2->cdr;
+ }
+ printf("\n");
+ }
+ }
+ tree = tree->cdr;
+ offset++;
+ goto again;
+
+ case NODE_FCALL:
+ case NODE_CALL:
+ printf("NODE_CALL:\n");
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ dump_prefix(tree, offset+1);
+ printf("method='%s' (%d)\n",
+ mrb_sym2name(mrb, sym(tree->cdr->car)),
+ (int)(intptr_t)tree->cdr->car);
+ tree = tree->cdr->cdr->car;
+ if (tree) {
+ dump_prefix(tree, offset+1);
+ printf("args:\n");
+ dump_recur(mrb, tree->car, offset+2);
+ if (tree->cdr) {
+ dump_prefix(tree, offset+1);
+ printf("block:\n");
+ mrb_parser_dump(mrb, tree->cdr, offset+2);
+ }
+ }
+ break;
+
+ case NODE_DOT2:
+ printf("NODE_DOT2:\n");
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ mrb_parser_dump(mrb, tree->cdr, offset+1);
+ break;
+
+ case NODE_DOT3:
+ printf("NODE_DOT3:\n");
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ mrb_parser_dump(mrb, tree->cdr, offset+1);
+ break;
+
+ case NODE_COLON2:
+ printf("NODE_COLON2:\n");
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ dump_prefix(tree, offset+1);
+ printf("::%s\n", mrb_sym2name(mrb, sym(tree->cdr)));
+ break;
+
+ case NODE_COLON3:
+ printf("NODE_COLON3:\n");
+ dump_prefix(tree, offset+1);
+ printf("::%s\n", mrb_sym2name(mrb, sym(tree)));
+ break;
+
+ case NODE_ARRAY:
+ printf("NODE_ARRAY:\n");
+ dump_recur(mrb, tree, offset+1);
+ break;
+
+ case NODE_HASH:
+ printf("NODE_HASH:\n");
+ while (tree) {
+ dump_prefix(tree, offset+1);
+ printf("key:\n");
+ mrb_parser_dump(mrb, tree->car->car, offset+2);
+ dump_prefix(tree, offset+1);
+ printf("value:\n");
+ mrb_parser_dump(mrb, tree->car->cdr, offset+2);
+ tree = tree->cdr;
+ }
+ break;
+
+ case NODE_SPLAT:
+ printf("NODE_SPLAT:\n");
+ mrb_parser_dump(mrb, tree, offset+1);
+ break;
+
+ case NODE_ASGN:
+ printf("NODE_ASGN:\n");
+ dump_prefix(tree, offset+1);
+ printf("lhs:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ dump_prefix(tree, offset+1);
+ printf("rhs:\n");
+ mrb_parser_dump(mrb, tree->cdr, offset+2);
+ break;
+
+ case NODE_MASGN:
+ printf("NODE_MASGN:\n");
+ dump_prefix(tree, offset+1);
+ printf("mlhs:\n");
+ {
+ node *n2 = tree->car;
+
+ if (n2->car) {
+ dump_prefix(tree, offset+2);
+ printf("pre:\n");
+ dump_recur(mrb, n2->car, offset+3);
+ }
+ n2 = n2->cdr;
+ if (n2) {
+ if (n2->car) {
+ dump_prefix(n2, offset+2);
+ printf("rest:\n");
+ if (n2->car == (node*)-1) {
+ dump_prefix(n2, offset+2);
+ printf("(empty)\n");
+ }
+ else {
+ mrb_parser_dump(mrb, n2->car, offset+3);
+ }
+ }
+ n2 = n2->cdr;
+ if (n2) {
+ if (n2->car) {
+ dump_prefix(n2, offset+2);
+ printf("post:\n");
+ dump_recur(mrb, n2->car, offset+3);
+ }
+ }
+ }
+ }
+ dump_prefix(tree, offset+1);
+ printf("rhs:\n");
+ mrb_parser_dump(mrb, tree->cdr, offset+2);
+ break;
+
+ case NODE_OP_ASGN:
+ printf("NODE_OP_ASGN:\n");
+ dump_prefix(tree, offset+1);
+ printf("lhs:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ tree = tree->cdr;
+ dump_prefix(tree, offset+1);
+ printf("op='%s' (%d)\n", mrb_sym2name(mrb, sym(tree->car)), (int)(intptr_t)tree->car);
+ tree = tree->cdr;
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ break;
+
+ case NODE_SUPER:
+ printf("NODE_SUPER:\n");
+ if (tree) {
+ dump_prefix(tree, offset+1);
+ printf("args:\n");
+ dump_recur(mrb, tree->car, offset+2);
+ if (tree->cdr) {
+ dump_prefix(tree, offset+1);
+ printf("block:\n");
+ mrb_parser_dump(mrb, tree->cdr, offset+2);
+ }
+ }
+ break;
+
+ case NODE_ZSUPER:
+ printf("NODE_ZSUPER\n");
+ break;
+
+ case NODE_RETURN:
+ printf("NODE_RETURN:\n");
+ mrb_parser_dump(mrb, tree, offset+1);
+ break;
+
+ case NODE_YIELD:
+ printf("NODE_YIELD:\n");
+ dump_recur(mrb, tree, offset+1);
+ break;
+
+ case NODE_BREAK:
+ printf("NODE_BREAK:\n");
+ mrb_parser_dump(mrb, tree, offset+1);
+ break;
+
+ case NODE_NEXT:
+ printf("NODE_NEXT:\n");
+ mrb_parser_dump(mrb, tree, offset+1);
+ break;
+
+ case NODE_REDO:
+ printf("NODE_REDO\n");
+ break;
+
+ case NODE_RETRY:
+ printf("NODE_RETRY\n");
+ break;
+
+ case NODE_LVAR:
+ printf("NODE_LVAR %s\n", mrb_sym2name(mrb, sym(tree)));
+ break;
+
+ case NODE_GVAR:
+ printf("NODE_GVAR %s\n", mrb_sym2name(mrb, sym(tree)));
+ break;
+
+ case NODE_IVAR:
+ printf("NODE_IVAR %s\n", mrb_sym2name(mrb, sym(tree)));
+ break;
+
+ case NODE_CVAR:
+ printf("NODE_CVAR %s\n", mrb_sym2name(mrb, sym(tree)));
+ break;
+
+ case NODE_CONST:
+ printf("NODE_CONST %s\n", mrb_sym2name(mrb, sym(tree)));
+ break;
+
+ case NODE_MATCH:
+ printf("NODE_MATCH:\n");
+ dump_prefix(tree, offset + 1);
+ printf("lhs:\n");
+ mrb_parser_dump(mrb, tree->car, offset + 2);
+ dump_prefix(tree, offset + 1);
+ printf("rhs:\n");
+ mrb_parser_dump(mrb, tree->cdr, offset + 2);
+ break;
+
+ case NODE_BACK_REF:
+ printf("NODE_BACK_REF: $%c\n", (int)(intptr_t)tree);
+ break;
+
+ case NODE_NTH_REF:
+ printf("NODE_NTH_REF: $%d\n", (int)(intptr_t)tree);
+ break;
+
+ case NODE_ARG:
+ printf("NODE_ARG %s\n", mrb_sym2name(mrb, sym(tree)));
+ break;
+
+ case NODE_BLOCK_ARG:
+ printf("NODE_BLOCK_ARG:\n");
+ mrb_parser_dump(mrb, tree, offset+1);
+ break;
+
+ case NODE_INT:
+ printf("NODE_INT %s base %d\n", (char*)tree->car, (int)(intptr_t)tree->cdr->car);
+ break;
+
+ case NODE_FLOAT:
+ printf("NODE_FLOAT %s\n", (char*)tree);
+ break;
+
+ case NODE_NEGATE:
+ printf("NODE_NEGATE\n");
+ mrb_parser_dump(mrb, tree, offset+1);
+ break;
+
+ case NODE_STR:
+ printf("NODE_STR \"%s\" len %d\n", (char*)tree->car, (int)(intptr_t)tree->cdr);
+ break;
+
+ case NODE_DSTR:
+ printf("NODE_DSTR\n");
+ dump_recur(mrb, tree, offset+1);
+ break;
+
+ case NODE_XSTR:
+ printf("NODE_XSTR \"%s\" len %d\n", (char*)tree->car, (int)(intptr_t)tree->cdr);
+ break;
+
+ case NODE_DXSTR:
+ printf("NODE_DXSTR\n");
+ dump_recur(mrb, tree, offset+1);
+ break;
+
+ case NODE_REGX:
+ printf("NODE_REGX /%s/%s\n", (char*)tree->car, (char*)tree->cdr);
+ break;
+
+ case NODE_DREGX:
+ printf("NODE_DREGX\n");
+ dump_recur(mrb, tree->car, offset+1);
+ dump_prefix(tree, offset);
+ printf("tail: %s\n", (char*)tree->cdr->cdr->car);
+ dump_prefix(tree, offset);
+ printf("opt: %s\n", (char*)tree->cdr->cdr->cdr);
+ break;
+
+ case NODE_SYM:
+ printf("NODE_SYM :%s\n", mrb_sym2name(mrb, sym(tree)));
+ break;
+
+ case NODE_SELF:
+ printf("NODE_SELF\n");
+ break;
+
+ case NODE_NIL:
+ printf("NODE_NIL\n");
+ break;
+
+ case NODE_TRUE:
+ printf("NODE_TRUE\n");
+ break;
+
+ case NODE_FALSE:
+ printf("NODE_FALSE\n");
+ break;
+
+ case NODE_ALIAS:
+ printf("NODE_ALIAS %s %s:\n",
+ mrb_sym2name(mrb, sym(tree->car)),
+ mrb_sym2name(mrb, sym(tree->cdr)));
+ break;
+
+ case NODE_UNDEF:
+ printf("NODE_UNDEF");
+ {
+ node *t = tree;
+ while (t) {
+ printf(" %s", mrb_sym2name(mrb, sym(t->car)));
+ t = t->cdr;
+ }
+ }
+ printf(":\n");
+ break;
+
+ case NODE_CLASS:
+ printf("NODE_CLASS:\n");
+ if (tree->car->car == (node*)0) {
+ dump_prefix(tree, offset+1);
+ printf(":%s\n", mrb_sym2name(mrb, sym(tree->car->cdr)));
+ }
+ else if (tree->car->car == (node*)1) {
+ dump_prefix(tree, offset+1);
+ printf("::%s\n", mrb_sym2name(mrb, sym(tree->car->cdr)));
+ }
+ else {
+ mrb_parser_dump(mrb, tree->car->car, offset+1);
+ dump_prefix(tree, offset+1);
+ printf("::%s\n", mrb_sym2name(mrb, sym(tree->car->cdr)));
+ }
+ if (tree->cdr->car) {
+ dump_prefix(tree, offset+1);
+ printf("super:\n");
+ mrb_parser_dump(mrb, tree->cdr->car, offset+2);
+ }
+ dump_prefix(tree, offset+1);
+ printf("body:\n");
+ mrb_parser_dump(mrb, tree->cdr->cdr->car->cdr, offset+2);
+ break;
+
+ case NODE_MODULE:
+ printf("NODE_MODULE:\n");
+ if (tree->car->car == (node*)0) {
+ dump_prefix(tree, offset+1);
+ printf(":%s\n", mrb_sym2name(mrb, sym(tree->car->cdr)));
+ }
+ else if (tree->car->car == (node*)1) {
+ dump_prefix(tree, offset+1);
+ printf("::%s\n", mrb_sym2name(mrb, sym(tree->car->cdr)));
+ }
+ else {
+ mrb_parser_dump(mrb, tree->car->car, offset+1);
+ dump_prefix(tree, offset+1);
+ printf("::%s\n", mrb_sym2name(mrb, sym(tree->car->cdr)));
+ }
+ dump_prefix(tree, offset+1);
+ printf("body:\n");
+ mrb_parser_dump(mrb, tree->cdr->car->cdr, offset+2);
+ break;
+
+ case NODE_SCLASS:
+ printf("NODE_SCLASS:\n");
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ dump_prefix(tree, offset+1);
+ printf("body:\n");
+ mrb_parser_dump(mrb, tree->cdr->car->cdr, offset+2);
+ break;
+
+ case NODE_DEF:
+ printf("NODE_DEF:\n");
+ dump_prefix(tree, offset+1);
+ printf("%s\n", mrb_sym2name(mrb, sym(tree->car)));
+ tree = tree->cdr;
+ {
+ node *n2 = tree->car;
+ mrb_bool first_lval = TRUE;
+
+ if (n2 && (n2->car || n2->cdr)) {
+ dump_prefix(n2, offset+1);
+ printf("local variables:\n");
+ dump_prefix(n2, offset+2);
+ while (n2) {
+ if (n2->car) {
+ if (!first_lval) printf(", ");
+ printf("%s", mrb_sym2name(mrb, sym(n2->car)));
+ first_lval = FALSE;
+ }
+ n2 = n2->cdr;
+ }
+ printf("\n");
+ }
+ }
+ tree = tree->cdr;
+ if (tree->car) {
+ node *n = tree->car;
+
+ if (n->car) {
+ dump_prefix(n, offset+1);
+ printf("mandatory args:\n");
+ dump_recur(mrb, n->car, offset+2);
+ }
+ n = n->cdr;
+ if (n->car) {
+ dump_prefix(n, offset+1);
+ printf("optional args:\n");
+ {
+ node *n2 = n->car;
+
+ while (n2) {
+ dump_prefix(n2, offset+2);
+ printf("%s=", mrb_sym2name(mrb, sym(n2->car->car)));
+ mrb_parser_dump(mrb, n2->car->cdr, 0);
+ n2 = n2->cdr;
+ }
+ }
+ }
+ n = n->cdr;
+ if (n->car) {
+ dump_prefix(n, offset+1);
+ printf("rest=*%s\n", mrb_sym2name(mrb, sym(n->car)));
+ }
+ n = n->cdr;
+ if (n->car) {
+ dump_prefix(n, offset+1);
+ printf("post mandatory args:\n");
+ dump_recur(mrb, n->car, offset+2);
+ }
+ n = n->cdr;
+ if (n) {
+ dump_prefix(n, offset+1);
+ printf("blk=&%s\n", mrb_sym2name(mrb, sym(n)));
+ }
+ }
+ mrb_parser_dump(mrb, tree->cdr->car, offset+1);
+ break;
+
+ case NODE_SDEF:
+ printf("NODE_SDEF:\n");
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ tree = tree->cdr;
+ dump_prefix(tree, offset+1);
+ printf(":%s\n", mrb_sym2name(mrb, sym(tree->car)));
+ tree = tree->cdr->cdr;
+ if (tree->car) {
+ node *n = tree->car;
+
+ if (n->car) {
+ dump_prefix(n, offset+1);
+ printf("mandatory args:\n");
+ dump_recur(mrb, n->car, offset+2);
+ }
+ n = n->cdr;
+ if (n->car) {
+ dump_prefix(n, offset+1);
+ printf("optional args:\n");
+ {
+ node *n2 = n->car;
+
+ while (n2) {
+ dump_prefix(n2, offset+2);
+ printf("%s=", mrb_sym2name(mrb, sym(n2->car->car)));
+ mrb_parser_dump(mrb, n2->car->cdr, 0);
+ n2 = n2->cdr;
+ }
+ }
+ }
+ n = n->cdr;
+ if (n->car) {
+ dump_prefix(n, offset+1);
+ printf("rest=*%s\n", mrb_sym2name(mrb, sym(n->car)));
+ }
+ n = n->cdr;
+ if (n->car) {
+ dump_prefix(n, offset+1);
+ printf("post mandatory args:\n");
+ dump_recur(mrb, n->car, offset+2);
+ }
+ n = n->cdr;
+ if (n) {
+ dump_prefix(n, offset+1);
+ printf("blk=&%s\n", mrb_sym2name(mrb, sym(n)));
+ }
+ }
+ tree = tree->cdr;
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ break;
+
+ case NODE_POSTEXE:
+ printf("NODE_POSTEXE:\n");
+ mrb_parser_dump(mrb, tree, offset+1);
+ break;
+
+ case NODE_HEREDOC:
+ printf("NODE_HEREDOC:\n");
+ mrb_parser_dump(mrb, ((parser_heredoc_info*)tree)->doc, offset+1);
+ break;
+
+ default:
+ printf("node type: %d (0x%x)\n", nodetype, (unsigned)nodetype);
+ break;
+ }
+#endif
+}
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pool.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,195 @@
+/*
+** pool.c - memory pool
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+#include "mruby.h"
+
+/* configuration section */
+/* allocated memory address should be multiple of POOL_ALIGNMENT */
+/* or undef it if alignment does not matter */
+#ifndef POOL_ALIGNMENT
+#define POOL_ALIGNMENT 4
+#endif
+/* page size of memory pool */
+#ifndef POOL_PAGE_SIZE
+#define POOL_PAGE_SIZE 16000
+#endif
+/* end of configuration section */
+
+struct mrb_pool_page {
+ struct mrb_pool_page *next;
+ size_t offset;
+ size_t len;
+ void *last;
+ char page[];
+};
+
+struct mrb_pool {
+ mrb_state *mrb;
+ struct mrb_pool_page *pages;
+};
+
+#undef TEST_POOL
+#ifdef TEST_POOL
+
+#define mrb_malloc_simple(m,s) malloc(s)
+#define mrb_free(m,p) free(p)
+#endif
+
+#ifdef POOL_ALIGNMENT
+# define ALIGN_PADDING(x) ((SIZE_MAX - (x) + 1) & (POOL_ALIGNMENT - 1))
+#else
+# define ALIGN_PADDING(x) (0)
+#endif
+
+MRB_API mrb_pool*
+mrb_pool_open(mrb_state *mrb)
+{
+ mrb_pool *pool = (mrb_pool *)mrb_malloc_simple(mrb, sizeof(mrb_pool));
+
+ if (pool) {
+ pool->mrb = mrb;
+ pool->pages = NULL;
+ }
+
+ return pool;
+}
+
+MRB_API void
+mrb_pool_close(mrb_pool *pool)
+{
+ struct mrb_pool_page *page, *tmp;
+
+ if (!pool) return;
+ page = pool->pages;
+ while (page) {
+ tmp = page;
+ page = page->next;
+ mrb_free(pool->mrb, tmp);
+ }
+ mrb_free(pool->mrb, pool);
+}
+
+static struct mrb_pool_page*
+page_alloc(mrb_pool *pool, size_t len)
+{
+ struct mrb_pool_page *page;
+
+ if (len < POOL_PAGE_SIZE)
+ len = POOL_PAGE_SIZE;
+ page = (struct mrb_pool_page *)mrb_malloc_simple(pool->mrb, sizeof(struct mrb_pool_page)+len);
+ if (page) {
+ page->offset = 0;
+ page->len = len;
+ }
+
+ return page;
+}
+
+MRB_API void*
+mrb_pool_alloc(mrb_pool *pool, size_t len)
+{
+ struct mrb_pool_page *page;
+ size_t n;
+
+ if (!pool) return NULL;
+ len += ALIGN_PADDING(len);
+ page = pool->pages;
+ while (page) {
+ if (page->offset + len <= page->len) {
+ n = page->offset;
+ page->offset += len;
+ page->last = (char*)page->page+n;
+ return page->last;
+ }
+ page = page->next;
+ }
+ page = page_alloc(pool, len);
+ if (!page) return NULL;
+ page->offset = len;
+ page->next = pool->pages;
+ pool->pages = page;
+
+ page->last = (void*)page->page;
+ return page->last;
+}
+
+MRB_API mrb_bool
+mrb_pool_can_realloc(mrb_pool *pool, void *p, size_t len)
+{
+ struct mrb_pool_page *page;
+
+ if (!pool) return FALSE;
+ len += ALIGN_PADDING(len);
+ page = pool->pages;
+ while (page) {
+ if (page->last == p) {
+ size_t beg;
+
+ beg = (char*)p - page->page;
+ if (beg + len > page->len) return FALSE;
+ return TRUE;
+ }
+ page = page->next;
+ }
+ return FALSE;
+}
+
+MRB_API void*
+mrb_pool_realloc(mrb_pool *pool, void *p, size_t oldlen, size_t newlen)
+{
+ struct mrb_pool_page *page;
+ void *np;
+
+ if (!pool) return NULL;
+ oldlen += ALIGN_PADDING(oldlen);
+ newlen += ALIGN_PADDING(newlen);
+ page = pool->pages;
+ while (page) {
+ if (page->last == p) {
+ size_t beg;
+
+ beg = (char*)p - page->page;
+ if (beg + oldlen != page->offset) break;
+ if (beg + newlen > page->len) {
+ page->offset = beg;
+ break;
+ }
+ page->offset = beg + newlen;
+ return p;
+ }
+ page = page->next;
+ }
+ np = mrb_pool_alloc(pool, newlen);
+ if (np == NULL) {
+ return NULL;
+ }
+ memcpy(np, p, oldlen);
+ return np;
+}
+
+#ifdef TEST_POOL
+int
+main(void)
+{
+ int i, len = 250;
+ mrb_pool *pool;
+ void *p;
+
+ pool = mrb_pool_open(NULL);
+ p = mrb_pool_alloc(pool, len);
+ for (i=1; i<20; i++) {
+ printf("%p (len=%d) %ud\n", p, len, mrb_pool_can_realloc(pool, p, len*2));
+ p = mrb_pool_realloc(pool, p, len, len*2);
+ len *= 2;
+ }
+ mrb_pool_close(pool);
+ return 0;
+}
+#endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/print.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,70 @@
+/*
+** print.c - Kernel.#p
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/string.h"
+#include "mruby/variable.h"
+
+static void
+printstr(mrb_state *mrb, mrb_value obj)
+{
+#ifdef ENABLE_STDIO
+ char *s;
+ int len;
+
+ if (mrb_string_p(obj)) {
+ s = RSTRING_PTR(obj);
+ len = RSTRING_LEN(obj);
+ fwrite(s, len, 1, stdout);
+ }
+#endif
+}
+
+MRB_API void
+mrb_p(mrb_state *mrb, mrb_value obj)
+{
+#ifdef ENABLE_STDIO
+ obj = mrb_funcall(mrb, obj, "inspect", 0);
+ printstr(mrb, obj);
+ putc('\n', stdout);
+#endif
+}
+
+MRB_API void
+mrb_print_error(mrb_state *mrb)
+{
+#ifdef ENABLE_STDIO
+ mrb_value s;
+
+ mrb_print_backtrace(mrb);
+ s = mrb_funcall(mrb, mrb_obj_value(mrb->exc), "inspect", 0);
+ if (mrb_string_p(s)) {
+ fwrite(RSTRING_PTR(s), RSTRING_LEN(s), 1, stderr);
+ putc('\n', stderr);
+ }
+#endif
+}
+
+MRB_API void
+mrb_show_version(mrb_state *mrb)
+{
+ mrb_value msg;
+
+ msg = mrb_const_get(mrb, mrb_obj_value(mrb->object_class), mrb_intern_lit(mrb, "MRUBY_DESCRIPTION"));
+ printstr(mrb, msg);
+ printstr(mrb, mrb_str_new_lit(mrb, "\n"));
+}
+
+MRB_API void
+mrb_show_copyright(mrb_state *mrb)
+{
+ mrb_value msg;
+
+ msg = mrb_const_get(mrb, mrb_obj_value(mrb->object_class), mrb_intern_lit(mrb, "MRUBY_COPYRIGHT"));
+ printstr(mrb, msg);
+ printstr(mrb, mrb_str_new_lit(mrb, "\n"));
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/proc.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,276 @@
+/*
+** proc.c - Proc class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/class.h"
+#include "mruby/proc.h"
+#include "mruby/opcode.h"
+
+static mrb_code call_iseq[] = {
+ MKOP_A(OP_CALL, 0),
+};
+
+struct RProc *
+mrb_proc_new(mrb_state *mrb, mrb_irep *irep)
+{
+ struct RProc *p;
+ mrb_callinfo *ci = mrb->c->ci;
+
+ p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);
+ p->target_class = 0;
+ if (ci) {
+ if (ci->proc)
+ p->target_class = ci->proc->target_class;
+ if (!p->target_class)
+ p->target_class = ci->target_class;
+ }
+ p->body.irep = irep;
+ p->env = 0;
+ mrb_irep_incref(mrb, irep);
+
+ return p;
+}
+
+static struct REnv*
+env_new(mrb_state *mrb, int nlocals)
+{
+ struct REnv *e;
+
+ e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, (struct RClass*)mrb->c->ci->proc->env);
+ MRB_SET_ENV_STACK_LEN(e, nlocals);
+ e->mid = mrb->c->ci->mid;
+ e->cioff = mrb->c->ci - mrb->c->cibase;
+ e->stack = mrb->c->stack;
+
+ return e;
+}
+
+static void
+closure_setup(mrb_state *mrb, struct RProc *p, int nlocals)
+{
+ struct REnv *e;
+
+ if (!mrb->c->ci->env) {
+ e = env_new(mrb, nlocals);
+ mrb->c->ci->env = e;
+ }
+ else {
+ e = mrb->c->ci->env;
+ }
+ p->env = e;
+}
+
+struct RProc *
+mrb_closure_new(mrb_state *mrb, mrb_irep *irep)
+{
+ struct RProc *p = mrb_proc_new(mrb, irep);
+
+ closure_setup(mrb, p, mrb->c->ci->proc->body.irep->nlocals);
+ return p;
+}
+
+MRB_API struct RProc *
+mrb_proc_new_cfunc(mrb_state *mrb, mrb_func_t func)
+{
+ struct RProc *p;
+
+ p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);
+ p->body.func = func;
+ p->flags |= MRB_PROC_CFUNC;
+ p->env = 0;
+
+ return p;
+}
+
+MRB_API struct RProc *
+mrb_proc_new_cfunc_with_env(mrb_state *mrb, mrb_func_t func, mrb_int argc, const mrb_value *argv)
+{
+ struct RProc *p = mrb_proc_new_cfunc(mrb, func);
+ struct REnv *e;
+ int i;
+
+ p->env = e = env_new(mrb, argc);
+ MRB_ENV_UNSHARE_STACK(e);
+ e->stack = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value) * argc);
+ if (argv) {
+ for (i = 0; i < argc; ++i) {
+ e->stack[i] = argv[i];
+ }
+ }
+ else {
+ for (i = 0; i < argc; ++i) {
+ SET_NIL_VALUE(e->stack[i]);
+ }
+ }
+ return p;
+}
+
+MRB_API struct RProc *
+mrb_closure_new_cfunc(mrb_state *mrb, mrb_func_t func, int nlocals)
+{
+ return mrb_proc_new_cfunc_with_env(mrb, func, nlocals, NULL);
+}
+
+MRB_API mrb_value
+mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx)
+{
+ struct RProc *p = mrb->c->ci->proc;
+ struct REnv *e = p->env;
+
+ if (!MRB_PROC_CFUNC_P(p)) {
+ mrb_raise(mrb, E_TYPE_ERROR, "Can't get cfunc env from non-cfunc proc.");
+ }
+ if (!e) {
+ mrb_raise(mrb, E_TYPE_ERROR, "Can't get cfunc env from cfunc Proc without REnv.");
+ }
+ if (idx < 0 || MRB_ENV_STACK_LEN(e) <= idx) {
+ mrb_raisef(mrb, E_INDEX_ERROR, "Env index out of range: %S (expected: 0 <= index < %S)",
+ mrb_fixnum_value(idx), mrb_fixnum_value(MRB_ENV_STACK_LEN(e)));
+ }
+
+ return e->stack[idx];
+}
+
+MRB_API void
+mrb_proc_copy(struct RProc *a, struct RProc *b)
+{
+ a->flags = b->flags;
+ a->body = b->body;
+ if (!MRB_PROC_CFUNC_P(a)) {
+ a->body.irep->refcnt++;
+ }
+ a->target_class = b->target_class;
+ a->env = b->env;
+}
+
+static mrb_value
+mrb_proc_initialize(mrb_state *mrb, mrb_value self)
+{
+ mrb_value blk;
+
+ mrb_get_args(mrb, "&", &blk);
+ if (mrb_nil_p(blk)) {
+ /* Calling Proc.new without a block is not implemented yet */
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block");
+ }
+ else {
+ mrb_proc_copy(mrb_proc_ptr(self), mrb_proc_ptr(blk));
+ }
+ return self;
+}
+
+static mrb_value
+mrb_proc_init_copy(mrb_state *mrb, mrb_value self)
+{
+ mrb_value proc;
+
+ mrb_get_args(mrb, "o", &proc);
+ if (mrb_type(proc) != MRB_TT_PROC) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "not a proc");
+ }
+ mrb_proc_copy(mrb_proc_ptr(self), mrb_proc_ptr(proc));
+ return self;
+}
+
+int
+mrb_proc_cfunc_p(struct RProc *p)
+{
+ return MRB_PROC_CFUNC_P(p);
+}
+
+mrb_value
+mrb_proc_call_cfunc(mrb_state *mrb, struct RProc *p, mrb_value self)
+{
+ return (p->body.func)(mrb, self);
+}
+
+mrb_code*
+mrb_proc_iseq(mrb_state *mrb, struct RProc *p)
+{
+ return p->body.irep->iseq;
+}
+
+/* 15.2.17.4.2 */
+static mrb_value
+mrb_proc_arity(mrb_state *mrb, mrb_value self)
+{
+ struct RProc *p = mrb_proc_ptr(self);
+ mrb_code *iseq = mrb_proc_iseq(mrb, p);
+ mrb_aspec aspec;
+ int ma, ra, pa, arity;
+
+ if (MRB_PROC_CFUNC_P(p)) {
+ /* TODO cfunc aspec not implemented yet */
+ return mrb_fixnum_value(-1);
+ }
+
+ /* arity is depend on OP_ENTER */
+ if (GET_OPCODE(*iseq) != OP_ENTER) {
+ return mrb_fixnum_value(0);
+ }
+
+ aspec = GETARG_Ax(*iseq);
+ ma = MRB_ASPEC_REQ(aspec);
+ ra = MRB_ASPEC_REST(aspec);
+ pa = MRB_ASPEC_POST(aspec);
+ arity = ra ? -(ma + pa + 1) : ma + pa;
+
+ return mrb_fixnum_value(arity);
+}
+
+/* 15.3.1.2.6 */
+/* 15.3.1.3.27 */
+/*
+ * call-seq:
+ * lambda { |...| block } -> a_proc
+ *
+ * Equivalent to <code>Proc.new</code>, except the resulting Proc objects
+ * check the number of parameters passed when called.
+ */
+static mrb_value
+proc_lambda(mrb_state *mrb, mrb_value self)
+{
+ mrb_value blk;
+ struct RProc *p;
+
+ mrb_get_args(mrb, "&", &blk);
+ if (mrb_nil_p(blk)) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block");
+ }
+ p = mrb_proc_ptr(blk);
+ if (!MRB_PROC_STRICT_P(p)) {
+ struct RProc *p2 = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, p->c);
+ mrb_proc_copy(p2, p);
+ p2->flags |= MRB_PROC_STRICT;
+ return mrb_obj_value(p2);
+ }
+ return blk;
+}
+
+void
+mrb_init_proc(mrb_state *mrb)
+{
+ struct RProc *m;
+ mrb_irep *call_irep = (mrb_irep *)mrb_malloc(mrb, sizeof(mrb_irep));
+ static const mrb_irep mrb_irep_zero = { 0 };
+
+ *call_irep = mrb_irep_zero;
+ call_irep->flags = MRB_ISEQ_NO_FREE;
+ call_irep->iseq = call_iseq;
+ call_irep->ilen = 1;
+
+ mrb_define_method(mrb, mrb->proc_class, "initialize", mrb_proc_initialize, MRB_ARGS_NONE());
+ mrb_define_method(mrb, mrb->proc_class, "initialize_copy", mrb_proc_init_copy, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, mrb->proc_class, "arity", mrb_proc_arity, MRB_ARGS_NONE());
+
+ m = mrb_proc_new(mrb, call_irep);
+ mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern_lit(mrb, "call"), m);
+ mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern_lit(mrb, "[]"), m);
+
+ mrb_define_class_method(mrb, mrb->kernel_module, "lambda", proc_lambda, MRB_ARGS_NONE()); /* 15.3.1.2.6 */
+ mrb_define_method(mrb, mrb->kernel_module, "lambda", proc_lambda, MRB_ARGS_NONE()); /* 15.3.1.3.27 */
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/range.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,435 @@
+/*
+** range.c - Range class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/class.h"
+#include "mruby/range.h"
+#include "mruby/string.h"
+#include "mruby/array.h"
+
+#define RANGE_CLASS (mrb_class_get(mrb, "Range"))
+
+static void
+range_check(mrb_state *mrb, mrb_value a, mrb_value b)
+{
+ mrb_value ans;
+ enum mrb_vtype ta;
+ enum mrb_vtype tb;
+
+ ta = mrb_type(a);
+ tb = mrb_type(b);
+ if ((ta == MRB_TT_FIXNUM || ta == MRB_TT_FLOAT) &&
+ (tb == MRB_TT_FIXNUM || tb == MRB_TT_FLOAT)) {
+ return;
+ }
+
+ ans = mrb_funcall(mrb, a, "<=>", 1, b);
+ if (mrb_nil_p(ans)) {
+ /* can not be compared */
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "bad value for range");
+ }
+}
+
+MRB_API mrb_value
+mrb_range_new(mrb_state *mrb, mrb_value beg, mrb_value end, mrb_bool excl)
+{
+ struct RRange *r;
+
+ range_check(mrb, beg, end);
+ r = (struct RRange*)mrb_obj_alloc(mrb, MRB_TT_RANGE, RANGE_CLASS);
+ r->edges = (mrb_range_edges *)mrb_malloc(mrb, sizeof(mrb_range_edges));
+ r->edges->beg = beg;
+ r->edges->end = end;
+ r->excl = excl;
+ return mrb_range_value(r);
+}
+
+/*
+ * call-seq:
+ * rng.first => obj
+ * rng.begin => obj
+ *
+ * Returns the first object in <i>rng</i>.
+ */
+mrb_value
+mrb_range_beg(mrb_state *mrb, mrb_value range)
+{
+ struct RRange *r = mrb_range_ptr(range);
+
+ return r->edges->beg;
+}
+
+/*
+ * call-seq:
+ * rng.end => obj
+ * rng.last => obj
+ *
+ * Returns the object that defines the end of <i>rng</i>.
+ *
+ * (1..10).end #=> 10
+ * (1...10).end #=> 10
+ */
+
+mrb_value
+mrb_range_end(mrb_state *mrb, mrb_value range)
+{
+ struct RRange *r = mrb_range_ptr(range);
+
+ return r->edges->end;
+}
+
+/*
+ * call-seq:
+ * range.exclude_end? => true or false
+ *
+ * Returns <code>true</code> if <i>range</i> excludes its end value.
+ */
+mrb_value
+mrb_range_excl(mrb_state *mrb, mrb_value range)
+{
+ struct RRange *r = mrb_range_ptr(range);
+
+ return mrb_bool_value(r->excl);
+}
+
+static void
+range_init(mrb_state *mrb, mrb_value range, mrb_value beg, mrb_value end, mrb_bool exclude_end)
+{
+ struct RRange *r = mrb_range_ptr(range);
+
+ range_check(mrb, beg, end);
+ r->excl = exclude_end;
+ if (!r->edges) {
+ r->edges = (mrb_range_edges *)mrb_malloc(mrb, sizeof(mrb_range_edges));
+ }
+ r->edges->beg = beg;
+ r->edges->end = end;
+}
+/*
+ * call-seq:
+ * Range.new(start, end, exclusive=false) => range
+ *
+ * Constructs a range using the given <i>start</i> and <i>end</i>. If the third
+ * parameter is omitted or is <code>false</code>, the <i>range</i> will include
+ * the end object; otherwise, it will be excluded.
+ */
+
+mrb_value
+mrb_range_initialize(mrb_state *mrb, mrb_value range)
+{
+ mrb_value beg, end;
+ mrb_bool exclusive;
+ int n;
+
+ n = mrb_get_args(mrb, "oo|b", &beg, &end, &exclusive);
+ if (n != 3) {
+ exclusive = FALSE;
+ }
+ /* Ranges are immutable, so that they should be initialized only once. */
+ range_init(mrb, range, beg, end, exclusive);
+ return range;
+}
+/*
+ * call-seq:
+ * range == obj => true or false
+ *
+ * Returns <code>true</code> only if
+ * 1) <i>obj</i> is a Range,
+ * 2) <i>obj</i> has equivalent beginning and end items (by comparing them with <code>==</code>),
+ * 3) <i>obj</i> has the same #exclude_end? setting as <i>rng</t>.
+ *
+ * (0..2) == (0..2) #=> true
+ * (0..2) == Range.new(0,2) #=> true
+ * (0..2) == (0...2) #=> false
+ *
+ */
+
+mrb_value
+mrb_range_eq(mrb_state *mrb, mrb_value range)
+{
+ struct RRange *rr;
+ struct RRange *ro;
+ mrb_value obj;
+
+ mrb_get_args(mrb, "o", &obj);
+
+ if (mrb_obj_equal(mrb, range, obj)) return mrb_true_value();
+ if (!mrb_obj_is_instance_of(mrb, obj, mrb_obj_class(mrb, range))) { /* same class? */
+ return mrb_false_value();
+ }
+
+ rr = mrb_range_ptr(range);
+ ro = mrb_range_ptr(obj);
+ if (!mrb_bool(mrb_funcall(mrb, rr->edges->beg, "==", 1, ro->edges->beg)) ||
+ !mrb_bool(mrb_funcall(mrb, rr->edges->end, "==", 1, ro->edges->end)) ||
+ rr->excl != ro->excl) {
+ return mrb_false_value();
+ }
+ return mrb_true_value();
+}
+
+static mrb_bool
+r_le(mrb_state *mrb, mrb_value a, mrb_value b)
+{
+ mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* compare result */
+ /* output :a < b => -1, a = b => 0, a > b => +1 */
+
+ if (mrb_fixnum_p(r)) {
+ mrb_int c = mrb_fixnum(r);
+ if (c == 0 || c == -1) return TRUE;
+ }
+
+ return FALSE;
+}
+
+static mrb_bool
+r_gt(mrb_state *mrb, mrb_value a, mrb_value b)
+{
+ mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b);
+ /* output :a < b => -1, a = b => 0, a > b => +1 */
+
+ return mrb_fixnum_p(r) && mrb_fixnum(r) == 1;
+}
+
+static mrb_bool
+r_ge(mrb_state *mrb, mrb_value a, mrb_value b)
+{
+ mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* compare result */
+ /* output :a < b => -1, a = b => 0, a > b => +1 */
+
+ if (mrb_fixnum_p(r)) {
+ mrb_int c = mrb_fixnum(r);
+ if (c == 0 || c == 1) return TRUE;
+ }
+
+ return FALSE;
+}
+
+/*
+ * call-seq:
+ * range === obj => true or false
+ * range.member?(val) => true or false
+ * range.include?(val) => true or false
+ *
+ */
+mrb_value
+mrb_range_include(mrb_state *mrb, mrb_value range)
+{
+ mrb_value val;
+ struct RRange *r = mrb_range_ptr(range);
+ mrb_value beg, end;
+ mrb_bool include_p;
+
+ mrb_get_args(mrb, "o", &val);
+
+ beg = r->edges->beg;
+ end = r->edges->end;
+ include_p = r_le(mrb, beg, val) && /* beg <= val */
+ ((r->excl && r_gt(mrb, end, val)) || /* end > val */
+ (r_ge(mrb, end, val))); /* end >= val */
+
+ return mrb_bool_value(include_p);
+}
+
+static mrb_bool
+range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len, mrb_bool trunc)
+{
+ mrb_int beg, end;
+ struct RRange *r = mrb_range_ptr(range);
+
+ if (mrb_type(range) != MRB_TT_RANGE) return FALSE;
+
+ beg = mrb_int(mrb, r->edges->beg);
+ end = mrb_int(mrb, r->edges->end);
+
+ if (beg < 0) {
+ beg += len;
+ if (beg < 0) return FALSE;
+ }
+
+ if (trunc) {
+ if (beg > len) return FALSE;
+ if (end > len) end = len;
+ }
+
+ if (end < 0) end += len;
+ if (!r->excl && (!trunc || end < len))
+ end++; /* include end point */
+ len = end - beg;
+ if (len < 0) len = 0;
+
+ *begp = beg;
+ *lenp = len;
+ return TRUE;
+}
+
+MRB_API mrb_bool
+mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len)
+{
+ return range_beg_len(mrb, range, begp, lenp, len, TRUE);
+}
+
+/* 15.2.14.4.12(x) */
+/*
+ * call-seq:
+ * rng.to_s -> string
+ *
+ * Convert this range object to a printable form.
+ */
+
+static mrb_value
+range_to_s(mrb_state *mrb, mrb_value range)
+{
+ mrb_value str, str2;
+ struct RRange *r = mrb_range_ptr(range);
+
+ str = mrb_obj_as_string(mrb, r->edges->beg);
+ str2 = mrb_obj_as_string(mrb, r->edges->end);
+ str = mrb_str_dup(mrb, str);
+ mrb_str_cat(mrb, str, "...", r->excl ? 3 : 2);
+ mrb_str_append(mrb, str, str2);
+
+ return str;
+}
+
+/* 15.2.14.4.13(x) */
+/*
+ * call-seq:
+ * rng.inspect -> string
+ *
+ * Convert this range object to a printable form (using
+ * <code>inspect</code> to convert the start and end
+ * objects).
+ */
+
+static mrb_value
+range_inspect(mrb_state *mrb, mrb_value range)
+{
+ mrb_value str, str2;
+ struct RRange *r = mrb_range_ptr(range);
+
+ str = mrb_inspect(mrb, r->edges->beg);
+ str2 = mrb_inspect(mrb, r->edges->end);
+ str = mrb_str_dup(mrb, str);
+ mrb_str_cat(mrb, str, "...", r->excl ? 3 : 2);
+ mrb_str_append(mrb, str, str2);
+
+ return str;
+}
+
+/* 15.2.14.4.14(x) */
+/*
+ * call-seq:
+ * rng.eql?(obj) -> true or false
+ *
+ * Returns <code>true</code> only if <i>obj</i> is a Range, has equivalent
+ * beginning and end items (by comparing them with #eql?), and has the same
+ * #exclude_end? setting as <i>rng</i>.
+ *
+ * (0..2).eql?(0..2) #=> true
+ * (0..2).eql?(Range.new(0,2)) #=> true
+ * (0..2).eql?(0...2) #=> false
+ *
+ */
+
+static mrb_value
+range_eql(mrb_state *mrb, mrb_value range)
+{
+ mrb_value obj;
+ struct RRange *r, *o;
+
+ mrb_get_args(mrb, "o", &obj);
+
+ if (mrb_obj_equal(mrb, range, obj)) return mrb_true_value();
+ if (!mrb_obj_is_kind_of(mrb, obj, RANGE_CLASS)) {
+ return mrb_false_value();
+ }
+ if (mrb_type(obj) != MRB_TT_RANGE) return mrb_false_value();
+
+ r = mrb_range_ptr(range);
+ o = mrb_range_ptr(obj);
+ if (!mrb_eql(mrb, r->edges->beg, o->edges->beg) ||
+ !mrb_eql(mrb, r->edges->end, o->edges->end) ||
+ (r->excl != o->excl)) {
+ return mrb_false_value();
+ }
+ return mrb_true_value();
+}
+
+/* 15.2.14.4.15(x) */
+static mrb_value
+range_initialize_copy(mrb_state *mrb, mrb_value copy)
+{
+ mrb_value src;
+ struct RRange *r;
+
+ mrb_get_args(mrb, "o", &src);
+
+ if (mrb_obj_equal(mrb, copy, src)) return copy;
+ if (!mrb_obj_is_instance_of(mrb, src, mrb_obj_class(mrb, copy))) {
+ mrb_raise(mrb, E_TYPE_ERROR, "wrong argument class");
+ }
+
+ r = mrb_range_ptr(src);
+ range_init(mrb, copy, r->edges->beg, r->edges->end, r->excl);
+
+ return copy;
+}
+
+mrb_value
+mrb_get_values_at(mrb_state *mrb, mrb_value obj, mrb_int olen, mrb_int argc, const mrb_value *argv, mrb_value (*func)(mrb_state*, mrb_value, mrb_int))
+{
+ mrb_int i, j, beg, len;
+ mrb_value result;
+ result = mrb_ary_new(mrb);
+
+ for (i = 0; i < argc; ++i) {
+ if (mrb_fixnum_p(argv[i])) {
+ mrb_ary_push(mrb, result, func(mrb, obj, mrb_fixnum(argv[i])));
+ }
+ else if (range_beg_len(mrb, argv[i], &beg, &len, olen, FALSE)) {
+ mrb_int const end = olen < beg + len ? olen : beg + len;
+ for (j = beg; j < end; ++j) {
+ mrb_ary_push(mrb, result, func(mrb, obj, j));
+ }
+
+ for (; j < beg + len; ++j) {
+ mrb_ary_push(mrb, result, mrb_nil_value());
+ }
+ }
+ else {
+ mrb_raisef(mrb, E_TYPE_ERROR, "invalid values selector: %S", argv[i]);
+ }
+ }
+
+ return result;
+}
+
+void
+mrb_init_range(mrb_state *mrb)
+{
+ struct RClass *r;
+
+ r = mrb_define_class(mrb, "Range", mrb->object_class); /* 15.2.14 */
+ MRB_SET_INSTANCE_TT(r, MRB_TT_RANGE);
+
+ mrb_define_method(mrb, r, "begin", mrb_range_beg, MRB_ARGS_NONE()); /* 15.2.14.4.3 */
+ mrb_define_method(mrb, r, "end", mrb_range_end, MRB_ARGS_NONE()); /* 15.2.14.4.5 */
+ mrb_define_method(mrb, r, "==", mrb_range_eq, MRB_ARGS_REQ(1)); /* 15.2.14.4.1 */
+ mrb_define_method(mrb, r, "===", mrb_range_include, MRB_ARGS_REQ(1)); /* 15.2.14.4.2 */
+ mrb_define_method(mrb, r, "exclude_end?", mrb_range_excl, MRB_ARGS_NONE()); /* 15.2.14.4.6 */
+ mrb_define_method(mrb, r, "first", mrb_range_beg, MRB_ARGS_NONE()); /* 15.2.14.4.7 */
+ mrb_define_method(mrb, r, "include?", mrb_range_include, MRB_ARGS_REQ(1)); /* 15.2.14.4.8 */
+ mrb_define_method(mrb, r, "initialize", mrb_range_initialize, MRB_ARGS_ANY()); /* 15.2.14.4.9 */
+ mrb_define_method(mrb, r, "last", mrb_range_end, MRB_ARGS_NONE()); /* 15.2.14.4.10 */
+ mrb_define_method(mrb, r, "member?", mrb_range_include, MRB_ARGS_REQ(1)); /* 15.2.14.4.11 */
+
+ mrb_define_method(mrb, r, "to_s", range_to_s, MRB_ARGS_NONE()); /* 15.2.14.4.12(x) */
+ mrb_define_method(mrb, r, "inspect", range_inspect, MRB_ARGS_NONE()); /* 15.2.14.4.13(x) */
+ mrb_define_method(mrb, r, "eql?", range_eql, MRB_ARGS_REQ(1)); /* 15.2.14.4.14(x) */
+ mrb_define_method(mrb, r, "initialize_copy", range_initialize_copy, MRB_ARGS_REQ(1)); /* 15.2.14.4.15(x) */
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/state.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,303 @@
+/*
+** state.c - mrb_state open/close functions
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <stdlib.h>
+#include <string.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include "mruby/variable.h"
+#include "mruby/debug.h"
+#include "mruby/string.h"
+
+void mrb_init_heap(mrb_state*);
+void mrb_init_core(mrb_state*);
+void mrb_init_mrbgems(mrb_state*);
+
+static mrb_value
+inspect_main(mrb_state *mrb, mrb_value mod)
+{
+ return mrb_str_new_lit(mrb, "main");
+}
+
+MRB_API mrb_state*
+mrb_open_core(mrb_allocf f, void *ud)
+{
+ static const mrb_state mrb_state_zero = { 0 };
+ static const struct mrb_context mrb_context_zero = { 0 };
+ mrb_state *mrb;
+
+ mrb = (mrb_state *)(f)(NULL, NULL, sizeof(mrb_state), ud);
+ if (mrb == NULL) return NULL;
+
+ *mrb = mrb_state_zero;
+ mrb->allocf_ud = ud;
+ mrb->allocf = f;
+ mrb->current_white_part = MRB_GC_WHITE_A;
+ mrb->atexit_stack_len = 0;
+
+#ifndef MRB_GC_FIXED_ARENA
+ mrb->arena = (struct RBasic**)mrb_malloc(mrb, sizeof(struct RBasic*)*MRB_GC_ARENA_SIZE);
+ mrb->arena_capa = MRB_GC_ARENA_SIZE;
+#endif
+
+ mrb_init_heap(mrb);
+ mrb->c = (struct mrb_context*)mrb_malloc(mrb, sizeof(struct mrb_context));
+ *mrb->c = mrb_context_zero;
+ mrb->root_c = mrb->c;
+
+ mrb_init_core(mrb);
+
+ return mrb;
+}
+
+void*
+mrb_default_allocf(mrb_state *mrb, void *p, size_t size, void *ud)
+{
+ if (size == 0) {
+ free(p);
+ return NULL;
+ }
+ else {
+ return realloc(p, size);
+ }
+}
+
+struct alloca_header {
+ struct alloca_header *next;
+ char buf[];
+};
+
+MRB_API void*
+mrb_alloca(mrb_state *mrb, size_t size)
+{
+ struct alloca_header *p;
+
+ p = (struct alloca_header*) mrb_malloc(mrb, sizeof(struct alloca_header)+size);
+ p->next = mrb->mems;
+ mrb->mems = p;
+ return (void*)p->buf;
+}
+
+static void
+mrb_alloca_free(mrb_state *mrb)
+{
+ struct alloca_header *p;
+ struct alloca_header *tmp;
+
+ if (mrb == NULL) return;
+ p = mrb->mems;
+
+ while (p) {
+ tmp = p;
+ p = p->next;
+ mrb_free(mrb, tmp);
+ }
+}
+
+MRB_API mrb_state*
+mrb_open(void)
+{
+ mrb_state *mrb = mrb_open_allocf(mrb_default_allocf, NULL);
+
+ return mrb;
+}
+
+MRB_API mrb_state*
+mrb_open_allocf(mrb_allocf f, void *ud)
+{
+ mrb_state *mrb = mrb_open_core(f, ud);
+
+ if (mrb == NULL) {
+ return NULL;
+ }
+
+#ifndef DISABLE_GEMS
+ mrb_init_mrbgems(mrb);
+ mrb_gc_arena_restore(mrb, 0);
+#endif
+ return mrb;
+}
+
+void mrb_free_symtbl(mrb_state *mrb);
+void mrb_free_heap(mrb_state *mrb);
+
+void
+mrb_irep_incref(mrb_state *mrb, mrb_irep *irep)
+{
+ irep->refcnt++;
+}
+
+void
+mrb_irep_decref(mrb_state *mrb, mrb_irep *irep)
+{
+ irep->refcnt--;
+ if (irep->refcnt == 0) {
+ mrb_irep_free(mrb, irep);
+ }
+}
+
+void
+mrb_irep_free(mrb_state *mrb, mrb_irep *irep)
+{
+ size_t i;
+
+ if (!(irep->flags & MRB_ISEQ_NO_FREE))
+ mrb_free(mrb, irep->iseq);
+ for (i=0; i<irep->plen; i++) {
+ if (mrb_type(irep->pool[i]) == MRB_TT_STRING) {
+ mrb_gc_free_str(mrb, RSTRING(irep->pool[i]));
+ mrb_free(mrb, mrb_obj_ptr(irep->pool[i]));
+ }
+#ifdef MRB_WORD_BOXING
+ else if (mrb_type(irep->pool[i]) == MRB_TT_FLOAT) {
+ mrb_free(mrb, mrb_obj_ptr(irep->pool[i]));
+ }
+#endif
+ }
+ mrb_free(mrb, irep->pool);
+ mrb_free(mrb, irep->syms);
+ for (i=0; i<irep->rlen; i++) {
+ mrb_irep_decref(mrb, irep->reps[i]);
+ }
+ mrb_free(mrb, irep->reps);
+ mrb_free(mrb, irep->lv);
+ mrb_free(mrb, (void *)irep->filename);
+ mrb_free(mrb, irep->lines);
+ mrb_debug_info_free(mrb, irep->debug_info);
+ mrb_free(mrb, irep);
+}
+
+mrb_value
+mrb_str_pool(mrb_state *mrb, mrb_value str)
+{
+ struct RString *s = mrb_str_ptr(str);
+ struct RString *ns;
+ char *ptr;
+ mrb_int len;
+
+ ns = (struct RString *)mrb_malloc(mrb, sizeof(struct RString));
+ ns->tt = MRB_TT_STRING;
+ ns->c = mrb->string_class;
+
+ if (RSTR_NOFREE_P(s)) {
+ ns->flags = MRB_STR_NOFREE;
+ ns->as.heap.ptr = s->as.heap.ptr;
+ ns->as.heap.len = s->as.heap.len;
+ ns->as.heap.aux.capa = 0;
+ }
+ else {
+ ns->flags = 0;
+ if (RSTR_EMBED_P(s)) {
+ ptr = s->as.ary;
+ len = RSTR_EMBED_LEN(s);
+ }
+ else {
+ ptr = s->as.heap.ptr;
+ len = s->as.heap.len;
+ }
+
+ if (len < RSTRING_EMBED_LEN_MAX) {
+ RSTR_SET_EMBED_FLAG(ns);
+ RSTR_SET_EMBED_LEN(ns, len);
+ if (ptr) {
+ memcpy(ns->as.ary, ptr, len);
+ }
+ ns->as.ary[len] = '\0';
+ }
+ else {
+ ns->as.heap.ptr = (char *)mrb_malloc(mrb, (size_t)len+1);
+ ns->as.heap.len = len;
+ ns->as.heap.aux.capa = len;
+ if (ptr) {
+ memcpy(ns->as.heap.ptr, ptr, len);
+ }
+ ns->as.heap.ptr[len] = '\0';
+ }
+ }
+ return mrb_obj_value(ns);
+}
+
+MRB_API void
+mrb_free_context(mrb_state *mrb, struct mrb_context *c)
+{
+ if (!c) return;
+ mrb_free(mrb, c->stbase);
+ mrb_free(mrb, c->cibase);
+ mrb_free(mrb, c->rescue);
+ mrb_free(mrb, c->ensure);
+ mrb_free(mrb, c);
+}
+
+MRB_API void
+mrb_close(mrb_state *mrb)
+{
+ if (mrb->atexit_stack_len > 0) {
+ mrb_int i;
+ for (i = mrb->atexit_stack_len; i > 0; --i) {
+ mrb->atexit_stack[i - 1](mrb);
+ }
+#ifndef MRB_FIXED_STATE_ATEXIT_STACK
+ mrb_free(mrb, mrb->atexit_stack);
+#endif
+ }
+
+ /* free */
+ mrb_gc_free_gv(mrb);
+ mrb_free_context(mrb, mrb->root_c);
+ mrb_free_symtbl(mrb);
+ mrb_free_heap(mrb);
+ mrb_alloca_free(mrb);
+#ifndef MRB_GC_FIXED_ARENA
+ mrb_free(mrb, mrb->arena);
+#endif
+ mrb_free(mrb, mrb);
+}
+
+MRB_API mrb_irep*
+mrb_add_irep(mrb_state *mrb)
+{
+ static const mrb_irep mrb_irep_zero = { 0 };
+ mrb_irep *irep;
+
+ irep = (mrb_irep *)mrb_malloc(mrb, sizeof(mrb_irep));
+ *irep = mrb_irep_zero;
+ irep->refcnt = 1;
+
+ return irep;
+}
+
+MRB_API mrb_value
+mrb_top_self(mrb_state *mrb)
+{
+ if (!mrb->top_self) {
+ mrb->top_self = (struct RObject*)mrb_obj_alloc(mrb, MRB_TT_OBJECT, mrb->object_class);
+ mrb_define_singleton_method(mrb, mrb->top_self, "inspect", inspect_main, MRB_ARGS_NONE());
+ mrb_define_singleton_method(mrb, mrb->top_self, "to_s", inspect_main, MRB_ARGS_NONE());
+ }
+ return mrb_obj_value(mrb->top_self);
+}
+
+MRB_API void
+mrb_state_atexit(mrb_state *mrb, mrb_atexit_func f)
+{
+#ifdef MRB_FIXED_STATE_ATEXIT_STACK
+ if (mrb->atexit_stack_len + 1 > MRB_FIXED_STATE_ATEXIT_STACK_SIZE) {
+ mrb_raise(mrb, E_RUNTIME_ERROR, "exceeded fixed state atexit stack limit");
+ }
+#else
+ size_t stack_size;
+
+ stack_size = sizeof(mrb_atexit_func) * (mrb->atexit_stack_len + 1);
+ if (mrb->atexit_stack_len == 0) {
+ mrb->atexit_stack = (mrb_atexit_func*)mrb_malloc(mrb, stack_size);
+ } else {
+ mrb->atexit_stack = (mrb_atexit_func*)mrb_realloc(mrb, mrb->atexit_stack, stack_size);
+ }
+#endif
+
+ mrb->atexit_stack[mrb->atexit_stack_len++] = f;
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/string.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,2524 @@
+/*
+** string.c - String class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <ctype.h>
+#include <float.h>
+#include <limits.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/range.h"
+#include "mruby/string.h"
+#include "mruby/re.h"
+
+const char mrb_digitmap[] = "0123456789abcdefghijklmnopqrstuvwxyz";
+
+typedef struct mrb_shared_string {
+ mrb_bool nofree : 1;
+ int refcnt;
+ char *ptr;
+ mrb_int len;
+} mrb_shared_string;
+
+static mrb_value str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2);
+static mrb_value mrb_str_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len);
+
+MRB_API mrb_int
+mrb_str_strlen(mrb_state *mrb, struct RString *s)
+{
+ mrb_int i, max = RSTR_LEN(s);
+ char *p = RSTR_PTR(s);
+
+ if (!p) return 0;
+ for (i=0; i<max; i++) {
+ if (p[i] == '\0') {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "string contains null byte");
+ }
+ }
+ return max;
+}
+
+static inline void
+resize_capa(mrb_state *mrb, struct RString *s, mrb_int capacity)
+{
+ if (RSTR_EMBED_P(s)) {
+ if (RSTRING_EMBED_LEN_MAX < capacity) {
+ char *const tmp = (char *)mrb_malloc(mrb, capacity+1);
+ const mrb_int len = RSTR_EMBED_LEN(s);
+ memcpy(tmp, s->as.ary, len);
+ RSTR_UNSET_EMBED_FLAG(s);
+ s->as.heap.ptr = tmp;
+ s->as.heap.len = len;
+ s->as.heap.aux.capa = capacity;
+ }
+ }
+ else {
+ s->as.heap.ptr = (char *)mrb_realloc(mrb, RSTR_PTR(s), capacity+1);
+ s->as.heap.aux.capa = capacity;
+ }
+}
+
+static void
+str_decref(mrb_state *mrb, mrb_shared_string *shared)
+{
+ shared->refcnt--;
+ if (shared->refcnt == 0) {
+ if (!shared->nofree) {
+ mrb_free(mrb, shared->ptr);
+ }
+ mrb_free(mrb, shared);
+ }
+}
+
+MRB_API void
+mrb_str_modify(mrb_state *mrb, struct RString *s)
+{
+ if (RSTR_SHARED_P(s)) {
+ mrb_shared_string *shared = s->as.heap.aux.shared;
+
+ if (shared->refcnt == 1 && s->as.heap.ptr == shared->ptr) {
+ s->as.heap.ptr = shared->ptr;
+ s->as.heap.aux.capa = shared->len;
+ RSTR_PTR(s)[s->as.heap.len] = '\0';
+ mrb_free(mrb, shared);
+ }
+ else {
+ char *ptr, *p;
+ mrb_int len;
+
+ p = RSTR_PTR(s);
+ len = s->as.heap.len;
+ ptr = (char *)mrb_malloc(mrb, (size_t)len + 1);
+ if (p) {
+ memcpy(ptr, p, len);
+ }
+ ptr[len] = '\0';
+ s->as.heap.ptr = ptr;
+ s->as.heap.aux.capa = len;
+ str_decref(mrb, shared);
+ }
+ RSTR_UNSET_SHARED_FLAG(s);
+ return;
+ }
+ if (RSTR_NOFREE_P(s)) {
+ char *p = s->as.heap.ptr;
+
+ s->as.heap.ptr = (char *)mrb_malloc(mrb, (size_t)s->as.heap.len+1);
+ if (p) {
+ memcpy(RSTR_PTR(s), p, s->as.heap.len);
+ }
+ RSTR_PTR(s)[s->as.heap.len] = '\0';
+ s->as.heap.aux.capa = s->as.heap.len;
+ RSTR_UNSET_NOFREE_FLAG(s);
+ return;
+ }
+}
+
+MRB_API mrb_value
+mrb_str_resize(mrb_state *mrb, mrb_value str, mrb_int len)
+{
+ mrb_int slen;
+ struct RString *s = mrb_str_ptr(str);
+
+ mrb_str_modify(mrb, s);
+ slen = RSTR_LEN(s);
+ if (len != slen) {
+ if (slen < len || slen - len > 256) {
+ resize_capa(mrb, s, len);
+ }
+ RSTR_SET_LEN(s, len);
+ RSTR_PTR(s)[len] = '\0'; /* sentinel */
+ }
+ return str;
+}
+
+#define mrb_obj_alloc_string(mrb) ((struct RString*)mrb_obj_alloc((mrb), MRB_TT_STRING, (mrb)->string_class))
+
+static struct RString*
+str_new_static(mrb_state *mrb, const char *p, size_t len)
+{
+ struct RString *s;
+
+ if (len >= MRB_INT_MAX) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big");
+ }
+ s = mrb_obj_alloc_string(mrb);
+ s->as.heap.len = len;
+ s->as.heap.aux.capa = 0; /* nofree */
+ s->as.heap.ptr = (char *)p;
+ s->flags = MRB_STR_NOFREE;
+
+ return s;
+}
+
+static struct RString*
+str_new(mrb_state *mrb, const char *p, size_t len)
+{
+ struct RString *s;
+
+ if (mrb_ro_data_p(p)) {
+ return str_new_static(mrb, p, len);
+ }
+ s = mrb_obj_alloc_string(mrb);
+ if (len < RSTRING_EMBED_LEN_MAX) {
+ RSTR_SET_EMBED_FLAG(s);
+ RSTR_SET_EMBED_LEN(s, len);
+ if (p) {
+ memcpy(s->as.ary, p, len);
+ }
+ } else {
+ if (len >= MRB_INT_MAX) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big");
+ }
+ s->as.heap.len = len;
+ s->as.heap.aux.capa = len;
+ s->as.heap.ptr = (char *)mrb_malloc(mrb, len+1);
+ if (p) {
+ memcpy(s->as.heap.ptr, p, len);
+ }
+ }
+ RSTR_PTR(s)[len] = '\0';
+ return s;
+}
+
+static inline void
+str_with_class(mrb_state *mrb, struct RString *s, mrb_value obj)
+{
+ s->c = mrb_str_ptr(obj)->c;
+}
+
+static mrb_value
+mrb_str_new_empty(mrb_state *mrb, mrb_value str)
+{
+ struct RString *s = str_new(mrb, 0, 0);
+
+ str_with_class(mrb, s, str);
+ return mrb_obj_value(s);
+}
+
+#ifndef MRB_STR_BUF_MIN_SIZE
+# define MRB_STR_BUF_MIN_SIZE 128
+#endif
+
+MRB_API mrb_value
+mrb_str_buf_new(mrb_state *mrb, size_t capa)
+{
+ struct RString *s;
+
+ s = mrb_obj_alloc_string(mrb);
+
+ if (capa >= MRB_INT_MAX) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "string capacity size too big");
+ }
+ if (capa < MRB_STR_BUF_MIN_SIZE) {
+ capa = MRB_STR_BUF_MIN_SIZE;
+ }
+ s->as.heap.len = 0;
+ s->as.heap.aux.capa = capa;
+ s->as.heap.ptr = (char *)mrb_malloc(mrb, capa+1);
+ RSTR_PTR(s)[0] = '\0';
+
+ return mrb_obj_value(s);
+}
+
+static void
+str_buf_cat(mrb_state *mrb, struct RString *s, const char *ptr, size_t len)
+{
+ size_t capa;
+ size_t total;
+ ptrdiff_t off = -1;
+
+ if (len == 0) return;
+ mrb_str_modify(mrb, s);
+ if (ptr >= RSTR_PTR(s) && ptr <= RSTR_PTR(s) + (size_t)RSTR_LEN(s)) {
+ off = ptr - RSTR_PTR(s);
+ }
+
+ if (RSTR_EMBED_P(s))
+ capa = RSTRING_EMBED_LEN_MAX;
+ else
+ capa = s->as.heap.aux.capa;
+
+ if (RSTR_LEN(s) >= MRB_INT_MAX - (mrb_int)len) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big");
+ }
+ total = RSTR_LEN(s)+len;
+ if (capa <= total) {
+ while (total > capa) {
+ if (capa + 1 >= MRB_INT_MAX / 2) {
+ capa = (total + 4095) / 4096;
+ break;
+ }
+ capa = (capa + 1) * 2;
+ }
+ resize_capa(mrb, s, capa);
+ }
+ if (off != -1) {
+ ptr = RSTR_PTR(s) + off;
+ }
+ memcpy(RSTR_PTR(s) + RSTR_LEN(s), ptr, len);
+ mrb_assert_int_fit(size_t, total, mrb_int, MRB_INT_MAX);
+ RSTR_SET_LEN(s, total);
+ RSTR_PTR(s)[total] = '\0'; /* sentinel */
+}
+
+MRB_API mrb_value
+mrb_str_new(mrb_state *mrb, const char *p, size_t len)
+{
+ return mrb_obj_value(str_new(mrb, p, len));
+}
+
+/*
+ * call-seq: (Caution! NULL string)
+ * String.new(str="") => new_str
+ *
+ * Returns a new string object containing a copy of <i>str</i>.
+ */
+
+MRB_API mrb_value
+mrb_str_new_cstr(mrb_state *mrb, const char *p)
+{
+ struct RString *s;
+ size_t len;
+
+ if (p) {
+ len = strlen(p);
+ }
+ else {
+ len = 0;
+ }
+
+ s = str_new(mrb, p, len);
+
+ return mrb_obj_value(s);
+}
+
+MRB_API mrb_value
+mrb_str_new_static(mrb_state *mrb, const char *p, size_t len)
+{
+ struct RString *s = str_new_static(mrb, p, len);
+ return mrb_obj_value(s);
+}
+
+void
+mrb_gc_free_str(mrb_state *mrb, struct RString *str)
+{
+ if (RSTR_EMBED_P(str))
+ /* no code */;
+ else if (RSTR_SHARED_P(str))
+ str_decref(mrb, str->as.heap.aux.shared);
+ else if (!RSTR_NOFREE_P(str))
+ mrb_free(mrb, str->as.heap.ptr);
+}
+
+MRB_API char*
+mrb_str_to_cstr(mrb_state *mrb, mrb_value str0)
+{
+ struct RString *s;
+
+ if (!mrb_string_p(str0)) {
+ mrb_raise(mrb, E_TYPE_ERROR, "expected String");
+ }
+
+ s = str_new(mrb, RSTRING_PTR(str0), RSTRING_LEN(str0));
+ if ((strlen(RSTR_PTR(s)) ^ RSTR_LEN(s)) != 0) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "string contains null byte");
+ }
+ return RSTR_PTR(s);
+}
+
+static void
+str_make_shared(mrb_state *mrb, struct RString *s)
+{
+ if (!RSTR_SHARED_P(s)) {
+ mrb_shared_string *shared = (mrb_shared_string *)mrb_malloc(mrb, sizeof(mrb_shared_string));
+
+ shared->refcnt = 1;
+ if (RSTR_EMBED_P(s)) {
+ const mrb_int len = RSTR_EMBED_LEN(s);
+ char *const tmp = (char *)mrb_malloc(mrb, len+1);
+ memcpy(tmp, s->as.ary, len);
+ tmp[len] = '\0';
+ RSTR_UNSET_EMBED_FLAG(s);
+ s->as.heap.ptr = tmp;
+ s->as.heap.len = len;
+ shared->nofree = FALSE;
+ shared->ptr = s->as.heap.ptr;
+ }
+ else if (RSTR_NOFREE_P(s)) {
+ shared->nofree = TRUE;
+ shared->ptr = s->as.heap.ptr;
+ RSTR_UNSET_NOFREE_FLAG(s);
+ }
+ else {
+ shared->nofree = FALSE;
+ if (s->as.heap.aux.capa > s->as.heap.len) {
+ s->as.heap.ptr = shared->ptr = (char *)mrb_realloc(mrb, s->as.heap.ptr, s->as.heap.len+1);
+ }
+ else {
+ shared->ptr = s->as.heap.ptr;
+ }
+ }
+ shared->len = s->as.heap.len;
+ s->as.heap.aux.shared = shared;
+ RSTR_SET_SHARED_FLAG(s);
+ }
+}
+
+/*
+ * call-seq: (Caution! String("abcd") change)
+ * String("abcdefg") = String("abcd") + String("efg")
+ *
+ * Returns a new string object containing a copy of <i>str</i>.
+ */
+MRB_API void
+mrb_str_concat(mrb_state *mrb, mrb_value self, mrb_value other)
+{
+ struct RString *s1 = mrb_str_ptr(self), *s2;
+ mrb_int len;
+
+ mrb_str_modify(mrb, s1);
+ if (!mrb_string_p(other)) {
+ other = mrb_str_to_str(mrb, other);
+ }
+ s2 = mrb_str_ptr(other);
+ len = RSTR_LEN(s1) + RSTR_LEN(s2);
+
+ if (RSTRING_CAPA(self) < len) {
+ resize_capa(mrb, s1, len);
+ }
+ memcpy(RSTR_PTR(s1)+RSTR_LEN(s1), RSTR_PTR(s2), RSTR_LEN(s2));
+ RSTR_SET_LEN(s1, len);
+ RSTR_PTR(s1)[len] = '\0';
+}
+
+/*
+ * call-seq: (Caution! String("abcd") remain)
+ * String("abcdefg") = String("abcd") + String("efg")
+ *
+ * Returns a new string object containing a copy of <i>str</i>.
+ */
+MRB_API mrb_value
+mrb_str_plus(mrb_state *mrb, mrb_value a, mrb_value b)
+{
+ struct RString *s = mrb_str_ptr(a);
+ struct RString *s2 = mrb_str_ptr(b);
+ struct RString *t;
+
+ t = str_new(mrb, 0, RSTR_LEN(s) + RSTR_LEN(s2));
+ memcpy(RSTR_PTR(t), RSTR_PTR(s), RSTR_LEN(s));
+ memcpy(RSTR_PTR(t) + RSTR_LEN(s), RSTR_PTR(s2), RSTR_LEN(s2));
+
+ return mrb_obj_value(t);
+}
+
+/* 15.2.10.5.2 */
+
+/*
+ * call-seq: (Caution! String("abcd") remain) for stack_argument
+ * String("abcdefg") = String("abcd") + String("efg")
+ *
+ * Returns a new string object containing a copy of <i>str</i>.
+ */
+static mrb_value
+mrb_str_plus_m(mrb_state *mrb, mrb_value self)
+{
+ mrb_value str;
+
+ mrb_get_args(mrb, "S", &str);
+ return mrb_str_plus(mrb, self, str);
+}
+
+/* 15.2.10.5.26 */
+/* 15.2.10.5.33 */
+/*
+ * call-seq:
+ * len = strlen(String("abcd"))
+ *
+ * Returns the length of string.
+ */
+static mrb_value
+mrb_str_size(mrb_state *mrb, mrb_value self)
+{
+ struct RString *s = mrb_str_ptr(self);
+ return mrb_fixnum_value(RSTR_LEN(s));
+}
+
+/* 15.2.10.5.1 */
+/*
+ * call-seq:
+ * str * integer => new_str
+ *
+ * Copy---Returns a new <code>String</code> containing <i>integer</i> copies of
+ * the receiver.
+ *
+ * "Ho! " * 3 #=> "Ho! Ho! Ho! "
+ */
+static mrb_value
+mrb_str_times(mrb_state *mrb, mrb_value self)
+{
+ mrb_int n,len,times;
+ struct RString *str2;
+ char *p;
+
+ mrb_get_args(mrb, "i", ×);
+ if (times < 0) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "negative argument");
+ }
+ if (times && MRB_INT_MAX / times < RSTRING_LEN(self)) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "argument too big");
+ }
+
+ len = RSTRING_LEN(self)*times;
+ str2 = str_new(mrb, 0, len);
+ str_with_class(mrb, str2, self);
+ p = RSTR_PTR(str2);
+ if (len > 0) {
+ n = RSTRING_LEN(self);
+ memcpy(p, RSTRING_PTR(self), n);
+ while (n <= len/2) {
+ memcpy(p + n, p, n);
+ n *= 2;
+ }
+ memcpy(p + n, p, len-n);
+ }
+ p[RSTR_LEN(str2)] = '\0';
+
+ return mrb_obj_value(str2);
+}
+/* -------------------------------------------------------------- */
+
+#define lesser(a,b) (((a)>(b))?(b):(a))
+
+/* ---------------------------*/
+/*
+ * call-seq:
+ * mrb_value str1 <=> mrb_value str2 => int
+ * > 1
+ * = 0
+ * < -1
+ */
+MRB_API int
+mrb_str_cmp(mrb_state *mrb, mrb_value str1, mrb_value str2)
+{
+ mrb_int len;
+ mrb_int retval;
+ struct RString *s1 = mrb_str_ptr(str1);
+ struct RString *s2 = mrb_str_ptr(str2);
+
+ len = lesser(RSTR_LEN(s1), RSTR_LEN(s2));
+ retval = memcmp(RSTR_PTR(s1), RSTR_PTR(s2), len);
+ if (retval == 0) {
+ if (RSTR_LEN(s1) == RSTR_LEN(s2)) return 0;
+ if (RSTR_LEN(s1) > RSTR_LEN(s2)) return 1;
+ return -1;
+ }
+ if (retval > 0) return 1;
+ return -1;
+}
+
+/* 15.2.10.5.3 */
+
+/*
+ * call-seq:
+ * str <=> other_str => -1, 0, +1
+ *
+ * Comparison---Returns -1 if <i>other_str</i> is less than, 0 if
+ * <i>other_str</i> is equal to, and +1 if <i>other_str</i> is greater than
+ * <i>str</i>. If the strings are of different lengths, and the strings are
+ * equal when compared up to the shortest length, then the longer string is
+ * considered greater than the shorter one. If the variable <code>$=</code> is
+ * <code>false</code>, the comparison is based on comparing the binary values
+ * of each character in the string. In older versions of Ruby, setting
+ * <code>$=</code> allowed case-insensitive comparisons; this is now deprecated
+ * in favor of using <code>String#casecmp</code>.
+ *
+ * <code><=></code> is the basis for the methods <code><</code>,
+ * <code><=</code>, <code>></code>, <code>>=</code>, and <code>between?</code>,
+ * included from module <code>Comparable</code>. The method
+ * <code>String#==</code> does not use <code>Comparable#==</code>.
+ *
+ * "abcdef" <=> "abcde" #=> 1
+ * "abcdef" <=> "abcdef" #=> 0
+ * "abcdef" <=> "abcdefg" #=> -1
+ * "abcdef" <=> "ABCDEF" #=> 1
+ */
+static mrb_value
+mrb_str_cmp_m(mrb_state *mrb, mrb_value str1)
+{
+ mrb_value str2;
+ mrb_int result;
+
+ mrb_get_args(mrb, "o", &str2);
+ if (!mrb_string_p(str2)) {
+ if (!mrb_respond_to(mrb, str2, mrb_intern_lit(mrb, "to_s"))) {
+ return mrb_nil_value();
+ }
+ else if (!mrb_respond_to(mrb, str2, mrb_intern_lit(mrb, "<=>"))) {
+ return mrb_nil_value();
+ }
+ else {
+ mrb_value tmp = mrb_funcall(mrb, str2, "<=>", 1, str1);
+
+ if (mrb_nil_p(tmp)) return mrb_nil_value();
+ if (!mrb_fixnum(tmp)) {
+ return mrb_funcall(mrb, mrb_fixnum_value(0), "-", 1, tmp);
+ }
+ result = -mrb_fixnum(tmp);
+ }
+ }
+ else {
+ result = mrb_str_cmp(mrb, str1, str2);
+ }
+ return mrb_fixnum_value(result);
+}
+
+static mrb_bool
+str_eql(mrb_state *mrb, const mrb_value str1, const mrb_value str2)
+{
+ const mrb_int len = RSTRING_LEN(str1);
+
+ if (len != RSTRING_LEN(str2)) return FALSE;
+ if (memcmp(RSTRING_PTR(str1), RSTRING_PTR(str2), (size_t)len) == 0)
+ return TRUE;
+ return FALSE;
+}
+
+MRB_API mrb_bool
+mrb_str_equal(mrb_state *mrb, mrb_value str1, mrb_value str2)
+{
+ if (mrb_immediate_p(str2)) return FALSE;
+ if (!mrb_string_p(str2)) {
+ if (mrb_nil_p(str2)) return FALSE;
+ if (!mrb_respond_to(mrb, str2, mrb_intern_lit(mrb, "to_str"))) {
+ return FALSE;
+ }
+ str2 = mrb_funcall(mrb, str2, "to_str", 0);
+ return mrb_equal(mrb, str2, str1);
+ }
+ return str_eql(mrb, str1, str2);
+}
+
+/* 15.2.10.5.4 */
+/*
+ * call-seq:
+ * str == obj => true or false
+ *
+ * Equality---
+ * If <i>obj</i> is not a <code>String</code>, returns <code>false</code>.
+ * Otherwise, returns <code>false</code> or <code>true</code>
+ *
+ * caution:if <i>str</i> <code><=></code> <i>obj</i> returns zero.
+ */
+static mrb_value
+mrb_str_equal_m(mrb_state *mrb, mrb_value str1)
+{
+ mrb_value str2;
+
+ mrb_get_args(mrb, "o", &str2);
+
+ return mrb_bool_value(mrb_str_equal(mrb, str1, str2));
+}
+/* ---------------------------------- */
+MRB_API mrb_value
+mrb_str_to_str(mrb_state *mrb, mrb_value str)
+{
+ mrb_value s;
+
+ if (!mrb_string_p(str)) {
+ s = mrb_check_convert_type(mrb, str, MRB_TT_STRING, "String", "to_str");
+ if (mrb_nil_p(s)) {
+ s = mrb_convert_type(mrb, str, MRB_TT_STRING, "String", "to_s");
+ }
+ return s;
+ }
+ return str;
+}
+
+MRB_API const char*
+mrb_string_value_ptr(mrb_state *mrb, mrb_value ptr)
+{
+ mrb_value str = mrb_str_to_str(mrb, ptr);
+ return RSTRING_PTR(str);
+}
+
+void
+mrb_noregexp(mrb_state *mrb, mrb_value self)
+{
+ mrb_raise(mrb, E_NOTIMP_ERROR, "Regexp class not implemented");
+}
+
+void
+mrb_regexp_check(mrb_state *mrb, mrb_value obj)
+{
+ if (mrb_regexp_p(mrb, obj)) {
+ mrb_noregexp(mrb, obj);
+ }
+}
+
+static inline mrb_int
+mrb_memsearch_qs(const unsigned char *xs, mrb_int m, const unsigned char *ys, mrb_int n)
+{
+ const unsigned char *x = xs, *xe = xs + m;
+ const unsigned char *y = ys;
+ int i, qstable[256];
+
+ /* Preprocessing */
+ for (i = 0; i < 256; ++i)
+ qstable[i] = m + 1;
+ for (; x < xe; ++x)
+ qstable[*x] = xe - x;
+ /* Searching */
+ for (; y + m <= ys + n; y += *(qstable + y[m])) {
+ if (*xs == *y && memcmp(xs, y, m) == 0)
+ return y - ys;
+ }
+ return -1;
+}
+
+static mrb_int
+mrb_memsearch(const void *x0, mrb_int m, const void *y0, mrb_int n)
+{
+ const unsigned char *x = (const unsigned char *)x0, *y = (const unsigned char *)y0;
+
+ if (m > n) return -1;
+ else if (m == n) {
+ return memcmp(x0, y0, m) == 0 ? 0 : -1;
+ }
+ else if (m < 1) {
+ return 0;
+ }
+ else if (m == 1) {
+ const unsigned char *ys = y, *ye = ys + n;
+ for (; y < ye; ++y) {
+ if (*x == *y)
+ return y - ys;
+ }
+ return -1;
+ }
+ return mrb_memsearch_qs((const unsigned char *)x0, m, (const unsigned char *)y0, n);
+}
+
+static mrb_int
+mrb_str_index(mrb_state *mrb, mrb_value str, mrb_value sub, mrb_int offset)
+{
+ mrb_int pos;
+ char *s, *sptr;
+ mrb_int len, slen;
+
+ len = RSTRING_LEN(str);
+ slen = RSTRING_LEN(sub);
+ if (offset < 0) {
+ offset += len;
+ if (offset < 0) return -1;
+ }
+ if (len - offset < slen) return -1;
+ s = RSTRING_PTR(str);
+ if (offset) {
+ s += offset;
+ }
+ if (slen == 0) return offset;
+ /* need proceed one character at a time */
+ sptr = RSTRING_PTR(sub);
+ slen = RSTRING_LEN(sub);
+ len = RSTRING_LEN(str) - offset;
+ pos = mrb_memsearch(sptr, slen, s, len);
+ if (pos < 0) return pos;
+ return pos + offset;
+}
+
+MRB_API mrb_value
+mrb_str_dup(mrb_state *mrb, mrb_value str)
+{
+ struct RString *s = mrb_str_ptr(str);
+ struct RString *dup = str_new(mrb, 0, 0);
+
+ str_with_class(mrb, dup, str);
+ return str_replace(mrb, dup, s);
+}
+
+static mrb_value
+mrb_str_aref(mrb_state *mrb, mrb_value str, mrb_value indx)
+{
+ mrb_int idx;
+
+ mrb_regexp_check(mrb, indx);
+ switch (mrb_type(indx)) {
+ case MRB_TT_FIXNUM:
+ idx = mrb_fixnum(indx);
+
+num_index:
+ str = mrb_str_substr(mrb, str, idx, 1);
+ if (!mrb_nil_p(str) && RSTRING_LEN(str) == 0) return mrb_nil_value();
+ return str;
+
+ case MRB_TT_STRING:
+ if (mrb_str_index(mrb, str, indx, 0) != -1)
+ return mrb_str_dup(mrb, indx);
+ return mrb_nil_value();
+
+ case MRB_TT_RANGE:
+ /* check if indx is Range */
+ {
+ mrb_int beg, len;
+
+ len = RSTRING_LEN(str);
+ if (mrb_range_beg_len(mrb, indx, &beg, &len, len)) {
+ return mrb_str_subseq(mrb, str, beg, len);
+ }
+ else {
+ return mrb_nil_value();
+ }
+ }
+ default:
+ idx = mrb_fixnum(indx);
+ goto num_index;
+ }
+ return mrb_nil_value(); /* not reached */
+}
+
+/* 15.2.10.5.6 */
+/* 15.2.10.5.34 */
+/*
+ * call-seq:
+ * str[fixnum] => fixnum or nil
+ * str[fixnum, fixnum] => new_str or nil
+ * str[range] => new_str or nil
+ * str[regexp] => new_str or nil
+ * str[regexp, fixnum] => new_str or nil
+ * str[other_str] => new_str or nil
+ * str.slice(fixnum) => fixnum or nil
+ * str.slice(fixnum, fixnum) => new_str or nil
+ * str.slice(range) => new_str or nil
+ * str.slice(other_str) => new_str or nil
+ *
+ * Element Reference---If passed a single <code>Fixnum</code>, returns the code
+ * of the character at that position. If passed two <code>Fixnum</code>
+ * objects, returns a substring starting at the offset given by the first, and
+ * a length given by the second. If given a range, a substring containing
+ * characters at offsets given by the range is returned. In all three cases, if
+ * an offset is negative, it is counted from the end of <i>str</i>. Returns
+ * <code>nil</code> if the initial offset falls outside the string, the length
+ * is negative, or the beginning of the range is greater than the end.
+ *
+ * If a <code>String</code> is given, that string is returned if it occurs in
+ * <i>str</i>. In both cases, <code>nil</code> is returned if there is no
+ * match.
+ *
+ * a = "hello there"
+ * a[1] #=> 101(1.8.7) "e"(1.9.2)
+ * a[1,3] #=> "ell"
+ * a[1..3] #=> "ell"
+ * a[-3,2] #=> "er"
+ * a[-4..-2] #=> "her"
+ * a[12..-1] #=> nil
+ * a[-2..-4] #=> ""
+ * a["lo"] #=> "lo"
+ * a["bye"] #=> nil
+ */
+static mrb_value
+mrb_str_aref_m(mrb_state *mrb, mrb_value str)
+{
+ mrb_value a1, a2;
+ int argc;
+
+ argc = mrb_get_args(mrb, "o|o", &a1, &a2);
+ if (argc == 2) {
+ mrb_regexp_check(mrb, a1);
+ return mrb_str_substr(mrb, str, mrb_fixnum(a1), mrb_fixnum(a2));
+ }
+ if (argc != 1) {
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (%S for 1)", mrb_fixnum_value(argc));
+ }
+ return mrb_str_aref(mrb, str, a1);
+}
+
+/* 15.2.10.5.8 */
+/*
+ * call-seq:
+ * str.capitalize! => str or nil
+ *
+ * Modifies <i>str</i> by converting the first character to uppercase and the
+ * remainder to lowercase. Returns <code>nil</code> if no changes are made.
+ *
+ * a = "hello"
+ * a.capitalize! #=> "Hello"
+ * a #=> "Hello"
+ * a.capitalize! #=> nil
+ */
+static mrb_value
+mrb_str_capitalize_bang(mrb_state *mrb, mrb_value str)
+{
+ char *p, *pend;
+ mrb_bool modify = FALSE;
+ struct RString *s = mrb_str_ptr(str);
+
+ mrb_str_modify(mrb, s);
+ if (RSTR_LEN(s) == 0 || !RSTR_PTR(s)) return mrb_nil_value();
+ p = RSTR_PTR(s); pend = RSTR_PTR(s) + RSTR_LEN(s);
+ if (ISLOWER(*p)) {
+ *p = TOUPPER(*p);
+ modify = TRUE;
+ }
+ while (++p < pend) {
+ if (ISUPPER(*p)) {
+ *p = TOLOWER(*p);
+ modify = TRUE;
+ }
+ }
+ if (modify) return str;
+ return mrb_nil_value();
+}
+
+/* 15.2.10.5.7 */
+/*
+ * call-seq:
+ * str.capitalize => new_str
+ *
+ * Returns a copy of <i>str</i> with the first character converted to uppercase
+ * and the remainder to lowercase.
+ *
+ * "hello".capitalize #=> "Hello"
+ * "HELLO".capitalize #=> "Hello"
+ * "123ABC".capitalize #=> "123abc"
+ */
+static mrb_value
+mrb_str_capitalize(mrb_state *mrb, mrb_value self)
+{
+ mrb_value str;
+
+ str = mrb_str_dup(mrb, self);
+ mrb_str_capitalize_bang(mrb, str);
+ return str;
+}
+
+/* 15.2.10.5.10 */
+/*
+ * call-seq:
+ * str.chomp!(separator=$/) => str or nil
+ *
+ * Modifies <i>str</i> in place as described for <code>String#chomp</code>,
+ * returning <i>str</i>, or <code>nil</code> if no modifications were made.
+ */
+static mrb_value
+mrb_str_chomp_bang(mrb_state *mrb, mrb_value str)
+{
+ mrb_value rs;
+ mrb_int newline;
+ char *p, *pp;
+ mrb_int rslen;
+ mrb_int len;
+ struct RString *s = mrb_str_ptr(str);
+
+ mrb_str_modify(mrb, s);
+ len = RSTR_LEN(s);
+ if (mrb_get_args(mrb, "|S", &rs) == 0) {
+ if (len == 0) return mrb_nil_value();
+ smart_chomp:
+ if (RSTR_PTR(s)[len-1] == '\n') {
+ RSTR_SET_LEN(s, RSTR_LEN(s) - 1);
+ if (RSTR_LEN(s) > 0 &&
+ RSTR_PTR(s)[RSTR_LEN(s)-1] == '\r') {
+ RSTR_SET_LEN(s, RSTR_LEN(s) - 1);
+ }
+ }
+ else if (RSTR_PTR(s)[len-1] == '\r') {
+ RSTR_SET_LEN(s, RSTR_LEN(s) - 1);
+ }
+ else {
+ return mrb_nil_value();
+ }
+ RSTR_PTR(s)[RSTR_LEN(s)] = '\0';
+ return str;
+ }
+
+ if (len == 0 || mrb_nil_p(rs)) return mrb_nil_value();
+ p = RSTR_PTR(s);
+ rslen = RSTRING_LEN(rs);
+ if (rslen == 0) {
+ while (len>0 && p[len-1] == '\n') {
+ len--;
+ if (len>0 && p[len-1] == '\r')
+ len--;
+ }
+ if (len < RSTR_LEN(s)) {
+ RSTR_SET_LEN(s, len);
+ p[len] = '\0';
+ return str;
+ }
+ return mrb_nil_value();
+ }
+ if (rslen > len) return mrb_nil_value();
+ newline = RSTRING_PTR(rs)[rslen-1];
+ if (rslen == 1 && newline == '\n')
+ newline = RSTRING_PTR(rs)[rslen-1];
+ if (rslen == 1 && newline == '\n')
+ goto smart_chomp;
+
+ pp = p + len - rslen;
+ if (p[len-1] == newline &&
+ (rslen <= 1 ||
+ memcmp(RSTRING_PTR(rs), pp, rslen) == 0)) {
+ RSTR_SET_LEN(s, len - rslen);
+ p[RSTR_LEN(s)] = '\0';
+ return str;
+ }
+ return mrb_nil_value();
+}
+
+/* 15.2.10.5.9 */
+/*
+ * call-seq:
+ * str.chomp(separator=$/) => new_str
+ *
+ * Returns a new <code>String</code> with the given record separator removed
+ * from the end of <i>str</i> (if present). If <code>$/</code> has not been
+ * changed from the default Ruby record separator, then <code>chomp</code> also
+ * removes carriage return characters (that is it will remove <code>\n</code>,
+ * <code>\r</code>, and <code>\r\n</code>).
+ *
+ * "hello".chomp #=> "hello"
+ * "hello\n".chomp #=> "hello"
+ * "hello\r\n".chomp #=> "hello"
+ * "hello\n\r".chomp #=> "hello\n"
+ * "hello\r".chomp #=> "hello"
+ * "hello \n there".chomp #=> "hello \n there"
+ * "hello".chomp("llo") #=> "he"
+ */
+static mrb_value
+mrb_str_chomp(mrb_state *mrb, mrb_value self)
+{
+ mrb_value str;
+
+ str = mrb_str_dup(mrb, self);
+ mrb_str_chomp_bang(mrb, str);
+ return str;
+}
+
+/* 15.2.10.5.12 */
+/*
+ * call-seq:
+ * str.chop! => str or nil
+ *
+ * Processes <i>str</i> as for <code>String#chop</code>, returning <i>str</i>,
+ * or <code>nil</code> if <i>str</i> is the empty string. See also
+ * <code>String#chomp!</code>.
+ */
+static mrb_value
+mrb_str_chop_bang(mrb_state *mrb, mrb_value str)
+{
+ struct RString *s = mrb_str_ptr(str);
+
+ mrb_str_modify(mrb, s);
+ if (RSTR_LEN(s) > 0) {
+ mrb_int len;
+ len = RSTR_LEN(s) - 1;
+ if (RSTR_PTR(s)[len] == '\n') {
+ if (len > 0 &&
+ RSTR_PTR(s)[len-1] == '\r') {
+ len--;
+ }
+ }
+ RSTR_SET_LEN(s, len);
+ RSTR_PTR(s)[len] = '\0';
+ return str;
+ }
+ return mrb_nil_value();
+}
+
+/* 15.2.10.5.11 */
+/*
+ * call-seq:
+ * str.chop => new_str
+ *
+ * Returns a new <code>String</code> with the last character removed. If the
+ * string ends with <code>\r\n</code>, both characters are removed. Applying
+ * <code>chop</code> to an empty string returns an empty
+ * string. <code>String#chomp</code> is often a safer alternative, as it leaves
+ * the string unchanged if it doesn't end in a record separator.
+ *
+ * "string\r\n".chop #=> "string"
+ * "string\n\r".chop #=> "string\n"
+ * "string\n".chop #=> "string"
+ * "string".chop #=> "strin"
+ * "x".chop #=> ""
+ */
+static mrb_value
+mrb_str_chop(mrb_state *mrb, mrb_value self)
+{
+ mrb_value str;
+ str = mrb_str_dup(mrb, self);
+ mrb_str_chop_bang(mrb, str);
+ return str;
+}
+
+/* 15.2.10.5.14 */
+/*
+ * call-seq:
+ * str.downcase! => str or nil
+ *
+ * Downcases the contents of <i>str</i>, returning <code>nil</code> if no
+ * changes were made.
+ */
+static mrb_value
+mrb_str_downcase_bang(mrb_state *mrb, mrb_value str)
+{
+ char *p, *pend;
+ mrb_bool modify = FALSE;
+ struct RString *s = mrb_str_ptr(str);
+
+ mrb_str_modify(mrb, s);
+ p = RSTR_PTR(s);
+ pend = RSTR_PTR(s) + RSTR_LEN(s);
+ while (p < pend) {
+ if (ISUPPER(*p)) {
+ *p = TOLOWER(*p);
+ modify = TRUE;
+ }
+ p++;
+ }
+
+ if (modify) return str;
+ return mrb_nil_value();
+}
+
+/* 15.2.10.5.13 */
+/*
+ * call-seq:
+ * str.downcase => new_str
+ *
+ * Returns a copy of <i>str</i> with all uppercase letters replaced with their
+ * lowercase counterparts. The operation is locale insensitive---only
+ * characters ``A'' to ``Z'' are affected.
+ *
+ * "hEllO".downcase #=> "hello"
+ */
+static mrb_value
+mrb_str_downcase(mrb_state *mrb, mrb_value self)
+{
+ mrb_value str;
+
+ str = mrb_str_dup(mrb, self);
+ mrb_str_downcase_bang(mrb, str);
+ return str;
+}
+
+/* 15.2.10.5.16 */
+/*
+ * call-seq:
+ * str.empty? => true or false
+ *
+ * Returns <code>true</code> if <i>str</i> has a length of zero.
+ *
+ * "hello".empty? #=> false
+ * "".empty? #=> true
+ */
+static mrb_value
+mrb_str_empty_p(mrb_state *mrb, mrb_value self)
+{
+ struct RString *s = mrb_str_ptr(self);
+
+ return mrb_bool_value(RSTR_LEN(s) == 0);
+}
+
+/* 15.2.10.5.17 */
+/*
+ * call-seq:
+ * str.eql?(other) => true or false
+ *
+ * Two strings are equal if the have the same length and content.
+ */
+static mrb_value
+mrb_str_eql(mrb_state *mrb, mrb_value self)
+{
+ mrb_value str2;
+ mrb_bool eql_p;
+
+ mrb_get_args(mrb, "o", &str2);
+ eql_p = (mrb_type(str2) == MRB_TT_STRING) && str_eql(mrb, self, str2);
+
+ return mrb_bool_value(eql_p);
+}
+
+static mrb_value
+mrb_str_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len)
+{
+ struct RString *orig, *s;
+ mrb_shared_string *shared;
+
+ orig = mrb_str_ptr(str);
+ if (RSTR_EMBED_P(orig)) {
+ s = str_new(mrb, orig->as.ary+beg, len);
+ } else {
+ str_make_shared(mrb, orig);
+ shared = orig->as.heap.aux.shared;
+ s = mrb_obj_alloc_string(mrb);
+ s->as.heap.ptr = orig->as.heap.ptr + beg;
+ s->as.heap.len = len;
+ s->as.heap.aux.shared = shared;
+ RSTR_SET_SHARED_FLAG(s);
+ shared->refcnt++;
+ }
+
+ return mrb_obj_value(s);
+}
+
+MRB_API mrb_value
+mrb_str_substr(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len)
+{
+ if (len < 0) return mrb_nil_value();
+ if (!RSTRING_LEN(str)) {
+ len = 0;
+ }
+ if (beg > RSTRING_LEN(str)) return mrb_nil_value();
+ if (beg < 0) {
+ beg += RSTRING_LEN(str);
+ if (beg < 0) return mrb_nil_value();
+ }
+ if (beg + len > RSTRING_LEN(str))
+ len = RSTRING_LEN(str) - beg;
+ if (len <= 0) {
+ len = 0;
+ }
+ return mrb_str_subseq(mrb, str, beg, len);
+}
+
+mrb_int
+mrb_str_hash(mrb_state *mrb, mrb_value str)
+{
+ /* 1-8-7 */
+ struct RString *s = mrb_str_ptr(str);
+ mrb_int len = RSTR_LEN(s);
+ char *p = RSTR_PTR(s);
+ mrb_int key = 0;
+
+ while (len--) {
+ key = key*65599 + *p;
+ p++;
+ }
+ return key + (key>>5);
+}
+
+/* 15.2.10.5.20 */
+/*
+ * call-seq:
+ * str.hash => fixnum
+ *
+ * Return a hash based on the string's length and content.
+ */
+static mrb_value
+mrb_str_hash_m(mrb_state *mrb, mrb_value self)
+{
+ mrb_int key = mrb_str_hash(mrb, self);
+ return mrb_fixnum_value(key);
+}
+
+/* 15.2.10.5.21 */
+/*
+ * call-seq:
+ * str.include? other_str => true or false
+ * str.include? fixnum => true or false
+ *
+ * Returns <code>true</code> if <i>str</i> contains the given string or
+ * character.
+ *
+ * "hello".include? "lo" #=> true
+ * "hello".include? "ol" #=> false
+ * "hello".include? ?h #=> true
+ */
+static mrb_value
+mrb_str_include(mrb_state *mrb, mrb_value self)
+{
+ mrb_int i;
+ mrb_value str2;
+ mrb_bool include_p;
+
+ mrb_get_args(mrb, "o", &str2);
+ if (mrb_fixnum_p(str2)) {
+ include_p = (memchr(RSTRING_PTR(self), mrb_fixnum(str2), RSTRING_LEN(self)) != NULL);
+ }
+ else {
+ str2 = mrb_str_to_str(mrb, str2);
+ i = mrb_str_index(mrb, self, str2, 0);
+
+ include_p = (i != -1);
+ }
+
+ return mrb_bool_value(include_p);
+}
+
+/* 15.2.10.5.22 */
+/*
+ * call-seq:
+ * str.index(substring [, offset]) => fixnum or nil
+ * str.index(fixnum [, offset]) => fixnum or nil
+ * str.index(regexp [, offset]) => fixnum or nil
+ *
+ * Returns the index of the first occurrence of the given
+ * <i>substring</i>,
+ * character (<i>fixnum</i>), or pattern (<i>regexp</i>) in <i>str</i>.
+ * Returns
+ * <code>nil</code> if not found.
+ * If the second parameter is present, it
+ * specifies the position in the string to begin the search.
+ *
+ * "hello".index('e') #=> 1
+ * "hello".index('lo') #=> 3
+ * "hello".index('a') #=> nil
+ * "hello".index(101) #=> 1(101=0x65='e')
+ * "hello".index(/[aeiou]/, -3) #=> 4
+ */
+static mrb_value
+mrb_str_index_m(mrb_state *mrb, mrb_value str)
+{
+ mrb_value *argv;
+ mrb_int argc;
+ mrb_value sub;
+ mrb_int pos;
+
+ mrb_get_args(mrb, "*", &argv, &argc);
+ if (argc == 2) {
+ pos = mrb_fixnum(argv[1]);
+ sub = argv[0];
+ }
+ else {
+ pos = 0;
+ if (argc > 0)
+ sub = argv[0];
+ else
+ sub = mrb_nil_value();
+ }
+ mrb_regexp_check(mrb, sub);
+ if (pos < 0) {
+ pos += RSTRING_LEN(str);
+ if (pos < 0) {
+ return mrb_nil_value();
+ }
+ }
+
+ switch (mrb_type(sub)) {
+ case MRB_TT_FIXNUM: {
+ int c = mrb_fixnum(sub);
+ mrb_int len = RSTRING_LEN(str);
+ unsigned char *p = (unsigned char*)RSTRING_PTR(str);
+
+ for (;pos<len;pos++) {
+ if (p[pos] == c) return mrb_fixnum_value(pos);
+ }
+ return mrb_nil_value();
+ }
+
+ default: {
+ mrb_value tmp;
+
+ tmp = mrb_check_string_type(mrb, sub);
+ if (mrb_nil_p(tmp)) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "type mismatch: %S given", sub);
+ }
+ sub = tmp;
+ }
+ /* fall through */
+ case MRB_TT_STRING:
+ pos = mrb_str_index(mrb, str, sub, pos);
+ break;
+ }
+
+ if (pos == -1) return mrb_nil_value();
+ return mrb_fixnum_value(pos);
+}
+
+#define STR_REPLACE_SHARED_MIN 10
+
+static mrb_value
+str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2)
+{
+ long len;
+
+ len = RSTR_LEN(s2);
+ if (RSTR_SHARED_P(s1)) {
+ str_decref(mrb, s1->as.heap.aux.shared);
+ }
+ else if (!RSTR_EMBED_P(s1) && !RSTR_NOFREE_P(s1)) {
+ mrb_free(mrb, s1->as.heap.ptr);
+ }
+
+ RSTR_UNSET_NOFREE_FLAG(s1);
+
+ if (RSTR_SHARED_P(s2)) {
+L_SHARE:
+ RSTR_UNSET_EMBED_FLAG(s1);
+ s1->as.heap.ptr = s2->as.heap.ptr;
+ s1->as.heap.len = len;
+ s1->as.heap.aux.shared = s2->as.heap.aux.shared;
+ RSTR_SET_SHARED_FLAG(s1);
+ s1->as.heap.aux.shared->refcnt++;
+ }
+ else {
+ if (len <= RSTRING_EMBED_LEN_MAX) {
+ RSTR_UNSET_SHARED_FLAG(s1);
+ RSTR_SET_EMBED_FLAG(s1);
+ memcpy(s1->as.ary, RSTR_PTR(s2), len);
+ RSTR_SET_EMBED_LEN(s1, len);
+ }
+ else {
+ str_make_shared(mrb, s2);
+ goto L_SHARE;
+ }
+ }
+
+ return mrb_obj_value(s1);
+}
+
+/* 15.2.10.5.24 */
+/* 15.2.10.5.28 */
+/*
+ * call-seq:
+ * str.replace(other_str) => str
+ *
+ * s = "hello" #=> "hello"
+ * s.replace "world" #=> "world"
+ */
+static mrb_value
+mrb_str_replace(mrb_state *mrb, mrb_value str)
+{
+ mrb_value str2;
+
+ mrb_get_args(mrb, "S", &str2);
+ return str_replace(mrb, mrb_str_ptr(str), mrb_str_ptr(str2));
+}
+
+/* 15.2.10.5.23 */
+/*
+ * call-seq:
+ * String.new(str="") => new_str
+ *
+ * Returns a new string object containing a copy of <i>str</i>.
+ */
+static mrb_value
+mrb_str_init(mrb_state *mrb, mrb_value self)
+{
+ mrb_value str2;
+
+ if (mrb_get_args(mrb, "|S", &str2) == 1) {
+ str_replace(mrb, mrb_str_ptr(self), mrb_str_ptr(str2));
+ }
+ return self;
+}
+
+/* 15.2.10.5.25 */
+/* 15.2.10.5.41 */
+/*
+ * call-seq:
+ * str.intern => symbol
+ * str.to_sym => symbol
+ *
+ * Returns the <code>Symbol</code> corresponding to <i>str</i>, creating the
+ * symbol if it did not previously exist. See <code>Symbol#id2name</code>.
+ *
+ * "Koala".intern #=> :Koala
+ * s = 'cat'.to_sym #=> :cat
+ * s == :cat #=> true
+ * s = '@cat'.to_sym #=> :@cat
+ * s == :@cat #=> true
+ *
+ * This can also be used to create symbols that cannot be represented using the
+ * <code>:xxx</code> notation.
+ *
+ * 'cat and dog'.to_sym #=> :"cat and dog"
+ */
+MRB_API mrb_value
+mrb_str_intern(mrb_state *mrb, mrb_value self)
+{
+ return mrb_symbol_value(mrb_intern_str(mrb, self));
+}
+/* ---------------------------------- */
+MRB_API mrb_value
+mrb_obj_as_string(mrb_state *mrb, mrb_value obj)
+{
+ mrb_value str;
+
+ if (mrb_string_p(obj)) {
+ return obj;
+ }
+ str = mrb_funcall(mrb, obj, "to_s", 0);
+ if (!mrb_string_p(str))
+ return mrb_any_to_s(mrb, obj);
+ return str;
+}
+
+MRB_API mrb_value
+mrb_ptr_to_str(mrb_state *mrb, void *p)
+{
+ struct RString *p_str;
+ char *p1;
+ char *p2;
+ uintptr_t n = (uintptr_t)p;
+
+ p_str = str_new(mrb, NULL, 2 + sizeof(uintptr_t) * CHAR_BIT / 4);
+ p1 = RSTR_PTR(p_str);
+ *p1++ = '0';
+ *p1++ = 'x';
+ p2 = p1;
+
+ do {
+ *p2++ = mrb_digitmap[n % 16];
+ n /= 16;
+ } while (n > 0);
+ *p2 = '\0';
+ RSTR_SET_LEN(p_str, (mrb_int)(p2 - RSTR_PTR(p_str)));
+
+ while (p1 < p2) {
+ const char c = *p1;
+ *p1++ = *--p2;
+ *p2 = c;
+ }
+
+ return mrb_obj_value(p_str);
+}
+
+MRB_API mrb_value
+mrb_string_type(mrb_state *mrb, mrb_value str)
+{
+ return mrb_convert_type(mrb, str, MRB_TT_STRING, "String", "to_str");
+}
+
+MRB_API mrb_value
+mrb_check_string_type(mrb_state *mrb, mrb_value str)
+{
+ return mrb_check_convert_type(mrb, str, MRB_TT_STRING, "String", "to_str");
+}
+
+/* ---------------------------------- */
+/* 15.2.10.5.29 */
+/*
+ * call-seq:
+ * str.reverse => new_str
+ *
+ * Returns a new string with the characters from <i>str</i> in reverse order.
+ *
+ * "stressed".reverse #=> "desserts"
+ */
+static mrb_value
+mrb_str_reverse(mrb_state *mrb, mrb_value str)
+{
+ struct RString *s2;
+ char *s, *e, *p;
+
+ if (RSTRING_LEN(str) <= 1) return mrb_str_dup(mrb, str);
+
+ s2 = str_new(mrb, 0, RSTRING_LEN(str));
+ str_with_class(mrb, s2, str);
+ s = RSTRING_PTR(str); e = RSTRING_END(str) - 1;
+ p = RSTR_PTR(s2);
+
+ while (e >= s) {
+ *p++ = *e--;
+ }
+ return mrb_obj_value(s2);
+}
+
+/* 15.2.10.5.30 */
+/*
+ * call-seq:
+ * str.reverse! => str
+ *
+ * Reverses <i>str</i> in place.
+ */
+static mrb_value
+mrb_str_reverse_bang(mrb_state *mrb, mrb_value str)
+{
+ struct RString *s = mrb_str_ptr(str);
+ char *p, *e;
+ char c;
+
+ mrb_str_modify(mrb, s);
+ if (RSTR_LEN(s) > 1) {
+ p = RSTR_PTR(s);
+ e = p + RSTR_LEN(s) - 1;
+ while (p < e) {
+ c = *p;
+ *p++ = *e;
+ *e-- = c;
+ }
+ }
+ return str;
+}
+
+/*
+ * call-seq:
+ * str.rindex(substring [, fixnum]) => fixnum or nil
+ * str.rindex(fixnum [, fixnum]) => fixnum or nil
+ * str.rindex(regexp [, fixnum]) => fixnum or nil
+ *
+ * Returns the index of the last occurrence of the given <i>substring</i>,
+ * character (<i>fixnum</i>), or pattern (<i>regexp</i>) in <i>str</i>. Returns
+ * <code>nil</code> if not found. If the second parameter is present, it
+ * specifies the position in the string to end the search---characters beyond
+ * this point will not be considered.
+ *
+ * "hello".rindex('e') #=> 1
+ * "hello".rindex('l') #=> 3
+ * "hello".rindex('a') #=> nil
+ * "hello".rindex(101) #=> 1
+ * "hello".rindex(/[aeiou]/, -2) #=> 1
+ */
+static mrb_int
+mrb_str_rindex(mrb_state *mrb, mrb_value str, mrb_value sub, mrb_int pos)
+{
+ char *s, *sbeg, *t;
+ struct RString *ps = mrb_str_ptr(str);
+ mrb_int len = RSTRING_LEN(sub);
+
+ /* substring longer than string */
+ if (RSTR_LEN(ps) < len) return -1;
+ if (RSTR_LEN(ps) - pos < len) {
+ pos = RSTR_LEN(ps) - len;
+ }
+ sbeg = RSTR_PTR(ps);
+ s = RSTR_PTR(ps) + pos;
+ t = RSTRING_PTR(sub);
+ if (len) {
+ while (sbeg <= s) {
+ if (memcmp(s, t, len) == 0) {
+ return s - RSTR_PTR(ps);
+ }
+ s--;
+ }
+ return -1;
+ }
+ else {
+ return pos;
+ }
+}
+
+/* 15.2.10.5.31 */
+/*
+ * call-seq:
+ * str.rindex(substring [, fixnum]) => fixnum or nil
+ * str.rindex(fixnum [, fixnum]) => fixnum or nil
+ * str.rindex(regexp [, fixnum]) => fixnum or nil
+ *
+ * Returns the index of the last occurrence of the given <i>substring</i>,
+ * character (<i>fixnum</i>), or pattern (<i>regexp</i>) in <i>str</i>. Returns
+ * <code>nil</code> if not found. If the second parameter is present, it
+ * specifies the position in the string to end the search---characters beyond
+ * this point will not be considered.
+ *
+ * "hello".rindex('e') #=> 1
+ * "hello".rindex('l') #=> 3
+ * "hello".rindex('a') #=> nil
+ * "hello".rindex(101) #=> 1
+ * "hello".rindex(/[aeiou]/, -2) #=> 1
+ */
+static mrb_value
+mrb_str_rindex_m(mrb_state *mrb, mrb_value str)
+{
+ mrb_value *argv;
+ mrb_int argc;
+ mrb_value sub;
+ mrb_value vpos;
+ mrb_int pos, len = RSTRING_LEN(str);
+
+ mrb_get_args(mrb, "*", &argv, &argc);
+ if (argc == 2) {
+ sub = argv[0];
+ vpos = argv[1];
+ pos = mrb_fixnum(vpos);
+ if (pos < 0) {
+ pos += len;
+ if (pos < 0) {
+ mrb_regexp_check(mrb, sub);
+ return mrb_nil_value();
+ }
+ }
+ if (pos > len) pos = len;
+ }
+ else {
+ pos = len;
+ if (argc > 0)
+ sub = argv[0];
+ else
+ sub = mrb_nil_value();
+ }
+ mrb_regexp_check(mrb, sub);
+
+ switch (mrb_type(sub)) {
+ case MRB_TT_FIXNUM: {
+ int c = mrb_fixnum(sub);
+ unsigned char *p = (unsigned char*)RSTRING_PTR(str);
+
+ for (pos=len-1;pos>=0;pos--) {
+ if (p[pos] == c) return mrb_fixnum_value(pos);
+ }
+ return mrb_nil_value();
+ }
+
+ default: {
+ mrb_value tmp;
+
+ tmp = mrb_check_string_type(mrb, sub);
+ if (mrb_nil_p(tmp)) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "type mismatch: %S given", sub);
+ }
+ sub = tmp;
+ }
+ /* fall through */
+ case MRB_TT_STRING:
+ pos = mrb_str_rindex(mrb, str, sub, pos);
+ if (pos >= 0) return mrb_fixnum_value(pos);
+ break;
+
+ } /* end of switch (TYPE(sub)) */
+ return mrb_nil_value();
+}
+
+/* 15.2.10.5.35 */
+
+/*
+ * call-seq:
+ * str.split(pattern=$;, [limit]) => anArray
+ *
+ * Divides <i>str</i> into substrings based on a delimiter, returning an array
+ * of these substrings.
+ *
+ * If <i>pattern</i> is a <code>String</code>, then its contents are used as
+ * the delimiter when splitting <i>str</i>. If <i>pattern</i> is a single
+ * space, <i>str</i> is split on whitespace, with leading whitespace and runs
+ * of contiguous whitespace characters ignored.
+ *
+ * If <i>pattern</i> is a <code>Regexp</code>, <i>str</i> is divided where the
+ * pattern matches. Whenever the pattern matches a zero-length string,
+ * <i>str</i> is split into individual characters.
+ *
+ * If <i>pattern</i> is omitted, the value of <code>$;</code> is used. If
+ * <code>$;</code> is <code>nil</code> (which is the default), <i>str</i> is
+ * split on whitespace as if ` ' were specified.
+ *
+ * If the <i>limit</i> parameter is omitted, trailing null fields are
+ * suppressed. If <i>limit</i> is a positive number, at most that number of
+ * fields will be returned (if <i>limit</i> is <code>1</code>, the entire
+ * string is returned as the only entry in an array). If negative, there is no
+ * limit to the number of fields returned, and trailing null fields are not
+ * suppressed.
+ *
+ * " now's the time".split #=> ["now's", "the", "time"]
+ * " now's the time".split(' ') #=> ["now's", "the", "time"]
+ * " now's the time".split(/ /) #=> ["", "now's", "", "the", "time"]
+ * "1, 2.34,56, 7".split(%r{,\s*}) #=> ["1", "2.34", "56", "7"]
+ * "hello".split(//) #=> ["h", "e", "l", "l", "o"]
+ * "hello".split(//, 3) #=> ["h", "e", "llo"]
+ * "hi mom".split(%r{\s*}) #=> ["h", "i", "m", "o", "m"]
+ *
+ * "mellow yellow".split("ello") #=> ["m", "w y", "w"]
+ * "1,2,,3,4,,".split(',') #=> ["1", "2", "", "3", "4"]
+ * "1,2,,3,4,,".split(',', 4) #=> ["1", "2", "", "3,4,,"]
+ * "1,2,,3,4,,".split(',', -4) #=> ["1", "2", "", "3", "4", "", ""]
+ */
+
+static mrb_value
+mrb_str_split_m(mrb_state *mrb, mrb_value str)
+{
+ int argc;
+ mrb_value spat = mrb_nil_value();
+ enum {awk, string, regexp} split_type = string;
+ long i = 0, lim_p;
+ mrb_int beg;
+ mrb_int end;
+ mrb_int lim = 0;
+ mrb_value result, tmp;
+
+ argc = mrb_get_args(mrb, "|oi", &spat, &lim);
+ lim_p = (lim > 0 && argc == 2);
+ if (argc == 2) {
+ if (lim == 1) {
+ if (RSTRING_LEN(str) == 0)
+ return mrb_ary_new_capa(mrb, 0);
+ return mrb_ary_new_from_values(mrb, 1, &str);
+ }
+ i = 1;
+ }
+
+ if (argc == 0 || mrb_nil_p(spat)) {
+ split_type = awk;
+ }
+ else {
+ if (mrb_string_p(spat)) {
+ split_type = string;
+ if (RSTRING_LEN(spat) == 1 && RSTRING_PTR(spat)[0] == ' ') {
+ split_type = awk;
+ }
+ }
+ else {
+ mrb_noregexp(mrb, str);
+ }
+ }
+
+ result = mrb_ary_new(mrb);
+ beg = 0;
+ if (split_type == awk) {
+ char *ptr = RSTRING_PTR(str);
+ char *eptr = RSTRING_END(str);
+ char *bptr = ptr;
+ mrb_bool skip = TRUE;
+ unsigned int c;
+
+ end = beg;
+ while (ptr < eptr) {
+ int ai = mrb_gc_arena_save(mrb);
+ c = (unsigned char)*ptr++;
+ if (skip) {
+ if (ISSPACE(c)) {
+ beg = ptr - bptr;
+ }
+ else {
+ end = ptr - bptr;
+ skip = FALSE;
+ if (lim_p && lim <= i) break;
+ }
+ }
+ else if (ISSPACE(c)) {
+ mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, beg, end-beg));
+ mrb_gc_arena_restore(mrb, ai);
+ skip = TRUE;
+ beg = ptr - bptr;
+ if (lim_p) ++i;
+ }
+ else {
+ end = ptr - bptr;
+ }
+ }
+ }
+ else if (split_type == string) {
+ char *ptr = RSTRING_PTR(str); /* s->as.ary */
+ char *temp = ptr;
+ char *eptr = RSTRING_END(str);
+ mrb_int slen = RSTRING_LEN(spat);
+
+ if (slen == 0) {
+ int ai = mrb_gc_arena_save(mrb);
+ while (ptr < eptr) {
+ mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, ptr-temp, 1));
+ mrb_gc_arena_restore(mrb, ai);
+ ptr++;
+ if (lim_p && lim <= ++i) break;
+ }
+ }
+ else {
+ char *sptr = RSTRING_PTR(spat);
+ int ai = mrb_gc_arena_save(mrb);
+
+ while (ptr < eptr &&
+ (end = mrb_memsearch(sptr, slen, ptr, eptr - ptr)) >= 0) {
+ mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, ptr - temp, end));
+ mrb_gc_arena_restore(mrb, ai);
+ ptr += end + slen;
+ if (lim_p && lim <= ++i) break;
+ }
+ }
+ beg = ptr - temp;
+ }
+ else {
+ mrb_noregexp(mrb, str);
+ }
+ if (RSTRING_LEN(str) > 0 && (lim_p || RSTRING_LEN(str) > beg || lim < 0)) {
+ if (RSTRING_LEN(str) == beg) {
+ tmp = mrb_str_new_empty(mrb, str);
+ }
+ else {
+ tmp = mrb_str_subseq(mrb, str, beg, RSTRING_LEN(str)-beg);
+ }
+ mrb_ary_push(mrb, result, tmp);
+ }
+ if (!lim_p && lim == 0) {
+ mrb_int len;
+ while ((len = RARRAY_LEN(result)) > 0 &&
+ (tmp = RARRAY_PTR(result)[len-1], RSTRING_LEN(tmp) == 0))
+ mrb_ary_pop(mrb, result);
+ }
+
+ return result;
+}
+
+MRB_API mrb_value
+mrb_cstr_to_inum(mrb_state *mrb, const char *str, int base, int badcheck)
+{
+ const char *p;
+ char sign = 1;
+ int c, uscore;
+ unsigned long n = 0;
+ mrb_int val;
+
+#define conv_digit(c) \
+ (ISDIGIT(c) ? ((c) - '0') : \
+ ISLOWER(c) ? ((c) - 'a' + 10) : \
+ ISUPPER(c) ? ((c) - 'A' + 10) : \
+ -1)
+
+ if (!str) {
+ if (badcheck) goto bad;
+ return mrb_fixnum_value(0);
+ }
+ while (ISSPACE(*str)) str++;
+
+ if (str[0] == '+') {
+ str++;
+ }
+ else if (str[0] == '-') {
+ str++;
+ sign = 0;
+ }
+ if (str[0] == '+' || str[0] == '-') {
+ if (badcheck) goto bad;
+ return mrb_fixnum_value(0);
+ }
+ if (base <= 0) {
+ if (str[0] == '0') {
+ switch (str[1]) {
+ case 'x': case 'X':
+ base = 16;
+ break;
+ case 'b': case 'B':
+ base = 2;
+ break;
+ case 'o': case 'O':
+ base = 8;
+ break;
+ case 'd': case 'D':
+ base = 10;
+ break;
+ default:
+ base = 8;
+ }
+ }
+ else if (base < -1) {
+ base = -base;
+ }
+ else {
+ base = 10;
+ }
+ }
+ switch (base) {
+ case 2:
+ if (str[0] == '0' && (str[1] == 'b'||str[1] == 'B')) {
+ str += 2;
+ }
+ break;
+ case 3:
+ break;
+ case 8:
+ if (str[0] == '0' && (str[1] == 'o'||str[1] == 'O')) {
+ str += 2;
+ }
+ case 4: case 5: case 6: case 7:
+ break;
+ case 10:
+ if (str[0] == '0' && (str[1] == 'd'||str[1] == 'D')) {
+ str += 2;
+ }
+ case 9: case 11: case 12: case 13: case 14: case 15:
+ break;
+ case 16:
+ if (str[0] == '0' && (str[1] == 'x'||str[1] == 'X')) {
+ str += 2;
+ }
+ break;
+ default:
+ if (base < 2 || 36 < base) {
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "illegal radix %S", mrb_fixnum_value(base));
+ }
+ break;
+ } /* end of switch (base) { */
+ if (*str == '0') { /* squeeze preceeding 0s */
+ uscore = 0;
+ while ((c = *++str) == '0' || c == '_') {
+ if (c == '_') {
+ if (++uscore >= 2)
+ break;
+ }
+ else
+ uscore = 0;
+ }
+ if (!(c = *str) || ISSPACE(c)) --str;
+ }
+ c = *str;
+ c = conv_digit(c);
+ if (c < 0 || c >= base) {
+ if (badcheck) goto bad;
+ return mrb_fixnum_value(0);
+ }
+
+ uscore = 0;
+ for (p=str;*p;p++) {
+ if (*p == '_') {
+ if (uscore == 0) {
+ uscore++;
+ continue;
+ }
+ if (badcheck) goto bad;
+ break;
+ }
+ uscore = 0;
+ c = conv_digit(*p);
+ if (c < 0 || c >= base) {
+ if (badcheck) goto bad;
+ break;
+ }
+ n *= base;
+ n += c;
+ }
+ if (n > MRB_INT_MAX) {
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "string (%S) too big for integer", mrb_str_new_cstr(mrb, str));
+ }
+ val = n;
+ if (badcheck) {
+ if (p == str) goto bad; /* no number */
+ while (*p && ISSPACE(*p)) p++;
+ if (*p) goto bad; /* trailing garbage */
+ }
+
+ return mrb_fixnum_value(sign ? val : -val);
+bad:
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid string for number(%S)", mrb_str_new_cstr(mrb, str));
+ /* not reached */
+ return mrb_fixnum_value(0);
+}
+
+MRB_API const char*
+mrb_string_value_cstr(mrb_state *mrb, mrb_value *ptr)
+{
+ struct RString *ps = mrb_str_ptr(*ptr);
+ mrb_int len = mrb_str_strlen(mrb, ps);
+ char *p = RSTR_PTR(ps);
+
+ if (!p || p[len] != '\0') {
+ mrb_str_modify(mrb, ps);
+ return RSTR_PTR(ps);
+ }
+ return p;
+}
+
+MRB_API mrb_value
+mrb_str_to_inum(mrb_state *mrb, mrb_value str, mrb_int base, mrb_bool badcheck)
+{
+ const char *s;
+ mrb_int len;
+
+ str = mrb_str_to_str(mrb, str);
+ if (badcheck) {
+ s = mrb_string_value_cstr(mrb, &str);
+ }
+ else {
+ s = RSTRING_PTR(str);
+ }
+ if (s) {
+ len = RSTRING_LEN(str);
+ if (s[len]) { /* no sentinel somehow */
+ struct RString *temp_str = str_new(mrb, s, len);
+ s = RSTR_PTR(temp_str);
+ }
+ }
+ return mrb_cstr_to_inum(mrb, s, base, badcheck);
+}
+
+/* 15.2.10.5.38 */
+/*
+ * call-seq:
+ * str.to_i(base=10) => integer
+ *
+ * Returns the result of interpreting leading characters in <i>str</i> as an
+ * integer base <i>base</i> (between 2 and 36). Extraneous characters past the
+ * end of a valid number are ignored. If there is not a valid number at the
+ * start of <i>str</i>, <code>0</code> is returned. This method never raises an
+ * exception.
+ *
+ * "12345".to_i #=> 12345
+ * "99 red balloons".to_i #=> 99
+ * "0a".to_i #=> 0
+ * "0a".to_i(16) #=> 10
+ * "hello".to_i #=> 0
+ * "1100101".to_i(2) #=> 101
+ * "1100101".to_i(8) #=> 294977
+ * "1100101".to_i(10) #=> 1100101
+ * "1100101".to_i(16) #=> 17826049
+ */
+static mrb_value
+mrb_str_to_i(mrb_state *mrb, mrb_value self)
+{
+ mrb_int base = 10;
+
+ mrb_get_args(mrb, "|i", &base);
+ if (base < 0) {
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "illegal radix %S", mrb_fixnum_value(base));
+ }
+ return mrb_str_to_inum(mrb, self, base, FALSE);
+}
+
+MRB_API double
+mrb_cstr_to_dbl(mrb_state *mrb, const char * p, mrb_bool badcheck)
+{
+ char *end;
+ double d;
+
+ enum {max_width = 20};
+
+ if (!p) return 0.0;
+ while (ISSPACE(*p)) p++;
+
+ if (!badcheck && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
+ return 0.0;
+ }
+ d = strtod(p, &end);
+ if (p == end) {
+ if (badcheck) {
+bad:
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid string for float(%S)", mrb_str_new_cstr(mrb, p));
+ /* not reached */
+ }
+ return d;
+ }
+ if (*end) {
+ char buf[DBL_DIG * 4 + 10];
+ char *n = buf;
+ char *e = buf + sizeof(buf) - 1;
+ char prev = 0;
+
+ while (p < end && n < e) prev = *n++ = *p++;
+ while (*p) {
+ if (*p == '_') {
+ /* remove underscores between digits */
+ if (badcheck) {
+ if (n == buf || !ISDIGIT(prev)) goto bad;
+ ++p;
+ if (!ISDIGIT(*p)) goto bad;
+ }
+ else {
+ while (*++p == '_');
+ continue;
+ }
+ }
+ prev = *p++;
+ if (n < e) *n++ = prev;
+ }
+ *n = '\0';
+ p = buf;
+
+ if (!badcheck && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
+ return 0.0;
+ }
+
+ d = strtod(p, &end);
+ if (badcheck) {
+ if (!end || p == end) goto bad;
+ while (*end && ISSPACE(*end)) end++;
+ if (*end) goto bad;
+ }
+ }
+ return d;
+}
+
+MRB_API double
+mrb_str_to_dbl(mrb_state *mrb, mrb_value str, mrb_bool badcheck)
+{
+ char *s;
+ mrb_int len;
+
+ str = mrb_str_to_str(mrb, str);
+ s = RSTRING_PTR(str);
+ len = RSTRING_LEN(str);
+ if (s) {
+ if (badcheck && memchr(s, '\0', len)) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "string for Float contains null byte");
+ }
+ if (s[len]) { /* no sentinel somehow */
+ struct RString *temp_str = str_new(mrb, s, len);
+ s = RSTR_PTR(temp_str);
+ }
+ }
+ return mrb_cstr_to_dbl(mrb, s, badcheck);
+}
+
+/* 15.2.10.5.39 */
+/*
+ * call-seq:
+ * str.to_f => float
+ *
+ * Returns the result of interpreting leading characters in <i>str</i> as a
+ * floating point number. Extraneous characters past the end of a valid number
+ * are ignored. If there is not a valid number at the start of <i>str</i>,
+ * <code>0.0</code> is returned. This method never raises an exception.
+ *
+ * "123.45e1".to_f #=> 1234.5
+ * "45.67 degrees".to_f #=> 45.67
+ * "thx1138".to_f #=> 0.0
+ */
+static mrb_value
+mrb_str_to_f(mrb_state *mrb, mrb_value self)
+{
+ return mrb_float_value(mrb, mrb_str_to_dbl(mrb, self, FALSE));
+}
+
+/* 15.2.10.5.40 */
+/*
+ * call-seq:
+ * str.to_s => str
+ * str.to_str => str
+ *
+ * Returns the receiver.
+ */
+static mrb_value
+mrb_str_to_s(mrb_state *mrb, mrb_value self)
+{
+ if (mrb_obj_class(mrb, self) != mrb->string_class) {
+ return mrb_str_dup(mrb, self);
+ }
+ return self;
+}
+
+/* 15.2.10.5.43 */
+/*
+ * call-seq:
+ * str.upcase! => str or nil
+ *
+ * Upcases the contents of <i>str</i>, returning <code>nil</code> if no changes
+ * were made.
+ */
+static mrb_value
+mrb_str_upcase_bang(mrb_state *mrb, mrb_value str)
+{
+ struct RString *s = mrb_str_ptr(str);
+ char *p, *pend;
+ mrb_bool modify = FALSE;
+
+ mrb_str_modify(mrb, s);
+ p = RSTRING_PTR(str);
+ pend = RSTRING_END(str);
+ while (p < pend) {
+ if (ISLOWER(*p)) {
+ *p = TOUPPER(*p);
+ modify = TRUE;
+ }
+ p++;
+ }
+
+ if (modify) return str;
+ return mrb_nil_value();
+}
+
+/* 15.2.10.5.42 */
+/*
+ * call-seq:
+ * str.upcase => new_str
+ *
+ * Returns a copy of <i>str</i> with all lowercase letters replaced with their
+ * uppercase counterparts. The operation is locale insensitive---only
+ * characters ``a'' to ``z'' are affected.
+ *
+ * "hEllO".upcase #=> "HELLO"
+ */
+static mrb_value
+mrb_str_upcase(mrb_state *mrb, mrb_value self)
+{
+ mrb_value str;
+
+ str = mrb_str_dup(mrb, self);
+ mrb_str_upcase_bang(mrb, str);
+ return str;
+}
+
+#define IS_EVSTR(p,e) ((p) < (e) && (*(p) == '$' || *(p) == '@' || *(p) == '{'))
+
+/*
+ * call-seq:
+ * str.dump -> new_str
+ *
+ * Produces a version of <i>str</i> with all nonprinting characters replaced by
+ * <code>\nnn</code> notation and all special characters escaped.
+ */
+mrb_value
+mrb_str_dump(mrb_state *mrb, mrb_value str)
+{
+ mrb_int len;
+ const char *p, *pend;
+ char *q;
+ struct RString *result;
+
+ len = 2; /* "" */
+ p = RSTRING_PTR(str); pend = p + RSTRING_LEN(str);
+ while (p < pend) {
+ unsigned char c = *p++;
+ switch (c) {
+ case '"': case '\\':
+ case '\n': case '\r':
+ case '\t': case '\f':
+ case '\013': case '\010': case '\007': case '\033':
+ len += 2;
+ break;
+
+ case '#':
+ len += IS_EVSTR(p, pend) ? 2 : 1;
+ break;
+
+ default:
+ if (ISPRINT(c)) {
+ len++;
+ }
+ else {
+ len += 4; /* \NNN */
+ }
+ break;
+ }
+ }
+
+ result = str_new(mrb, 0, len);
+ str_with_class(mrb, result, str);
+ p = RSTRING_PTR(str); pend = p + RSTRING_LEN(str);
+ q = RSTR_PTR(result);
+ *q++ = '"';
+ while (p < pend) {
+ unsigned char c = *p++;
+
+ switch (c) {
+ case '"':
+ case '\\':
+ *q++ = '\\';
+ *q++ = c;
+ break;
+
+ case '\n':
+ *q++ = '\\';
+ *q++ = 'n';
+ break;
+
+ case '\r':
+ *q++ = '\\';
+ *q++ = 'r';
+ break;
+
+ case '\t':
+ *q++ = '\\';
+ *q++ = 't';
+ break;
+
+ case '\f':
+ *q++ = '\\';
+ *q++ = 'f';
+ break;
+
+ case '\013':
+ *q++ = '\\';
+ *q++ = 'v';
+ break;
+
+ case '\010':
+ *q++ = '\\';
+ *q++ = 'b';
+ break;
+
+ case '\007':
+ *q++ = '\\';
+ *q++ = 'a';
+ break;
+
+ case '\033':
+ *q++ = '\\';
+ *q++ = 'e';
+ break;
+
+ case '#':
+ if (IS_EVSTR(p, pend)) *q++ = '\\';
+ *q++ = '#';
+ break;
+
+ default:
+ if (ISPRINT(c)) {
+ *q++ = c;
+ }
+ else {
+ *q++ = '\\';
+ q[2] = '0' + c % 8; c /= 8;
+ q[1] = '0' + c % 8; c /= 8;
+ q[0] = '0' + c % 8;
+ q += 3;
+ }
+ }
+ }
+ *q = '"';
+ return mrb_obj_value(result);
+}
+
+MRB_API mrb_value
+mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len)
+{
+ str_buf_cat(mrb, mrb_str_ptr(str), ptr, len);
+ return str;
+}
+
+MRB_API mrb_value
+mrb_str_cat_cstr(mrb_state *mrb, mrb_value str, const char *ptr)
+{
+ return mrb_str_cat(mrb, str, ptr, strlen(ptr));
+}
+
+MRB_API mrb_value
+mrb_str_cat_str(mrb_state *mrb, mrb_value str, mrb_value str2)
+{
+ return mrb_str_cat(mrb, str, RSTRING_PTR(str2), RSTRING_LEN(str2));
+}
+
+MRB_API mrb_value
+mrb_str_append(mrb_state *mrb, mrb_value str, mrb_value str2)
+{
+ str2 = mrb_str_to_str(mrb, str2);
+ return mrb_str_cat_str(mrb, str, str2);
+}
+
+#define CHAR_ESC_LEN 13 /* sizeof(\x{ hex of 32bit unsigned int } \0) */
+
+/*
+ * call-seq:
+ * str.inspect -> string
+ *
+ * Returns a printable version of _str_, surrounded by quote marks,
+ * with special characters escaped.
+ *
+ * str = "hello"
+ * str[3] = "\b"
+ * str.inspect #=> "\"hel\\bo\""
+ */
+mrb_value
+mrb_str_inspect(mrb_state *mrb, mrb_value str)
+{
+ const char *p, *pend;
+ char buf[CHAR_ESC_LEN + 1];
+ mrb_value result = mrb_str_new_lit(mrb, "\"");
+
+ p = RSTRING_PTR(str); pend = RSTRING_END(str);
+ for (;p < pend; p++) {
+ unsigned char c, cc;
+
+ c = *p;
+ if (c == '"'|| c == '\\' || (c == '#' && IS_EVSTR(p, pend))) {
+ buf[0] = '\\'; buf[1] = c;
+ mrb_str_cat(mrb, result, buf, 2);
+ continue;
+ }
+ if (ISPRINT(c)) {
+ buf[0] = c;
+ mrb_str_cat(mrb, result, buf, 1);
+ continue;
+ }
+ switch (c) {
+ case '\n': cc = 'n'; break;
+ case '\r': cc = 'r'; break;
+ case '\t': cc = 't'; break;
+ case '\f': cc = 'f'; break;
+ case '\013': cc = 'v'; break;
+ case '\010': cc = 'b'; break;
+ case '\007': cc = 'a'; break;
+ case 033: cc = 'e'; break;
+ default: cc = 0; break;
+ }
+ if (cc) {
+ buf[0] = '\\';
+ buf[1] = (char)cc;
+ mrb_str_cat(mrb, result, buf, 2);
+ continue;
+ }
+ else {
+ buf[0] = '\\';
+ buf[3] = '0' + c % 8; c /= 8;
+ buf[2] = '0' + c % 8; c /= 8;
+ buf[1] = '0' + c % 8;
+ mrb_str_cat(mrb, result, buf, 4);
+ continue;
+ }
+ }
+ mrb_str_cat_lit(mrb, result, "\"");
+
+ return result;
+}
+
+/*
+ * call-seq:
+ * str.bytes -> array of fixnums
+ *
+ * Returns an array of bytes in _str_.
+ *
+ * str = "hello"
+ * str.bytes #=> [104, 101, 108, 108, 111]
+ */
+static mrb_value
+mrb_str_bytes(mrb_state *mrb, mrb_value str)
+{
+ struct RString *s = mrb_str_ptr(str);
+ mrb_value a = mrb_ary_new_capa(mrb, RSTR_LEN(s));
+ unsigned char *p = (unsigned char *)(RSTR_PTR(s)), *pend = p + RSTR_LEN(s);
+
+ while (p < pend) {
+ mrb_ary_push(mrb, a, mrb_fixnum_value(p[0]));
+ p++;
+ }
+ return a;
+}
+
+/* ---------------------------*/
+void
+mrb_init_string(mrb_state *mrb)
+{
+ struct RClass *s;
+
+ mrb_static_assert(RSTRING_EMBED_LEN_MAX < (1 << 5), "pointer size too big for embedded string");
+
+ s = mrb->string_class = mrb_define_class(mrb, "String", mrb->object_class); /* 15.2.10 */
+ MRB_SET_INSTANCE_TT(s, MRB_TT_STRING);
+
+ mrb_define_method(mrb, s, "bytesize", mrb_str_size, MRB_ARGS_NONE());
+
+ mrb_define_method(mrb, s, "<=>", mrb_str_cmp_m, MRB_ARGS_REQ(1)); /* 15.2.10.5.1 */
+ mrb_define_method(mrb, s, "==", mrb_str_equal_m, MRB_ARGS_REQ(1)); /* 15.2.10.5.2 */
+ mrb_define_method(mrb, s, "+", mrb_str_plus_m, MRB_ARGS_REQ(1)); /* 15.2.10.5.4 */
+ mrb_define_method(mrb, s, "*", mrb_str_times, MRB_ARGS_REQ(1)); /* 15.2.10.5.5 */
+ mrb_define_method(mrb, s, "[]", mrb_str_aref_m, MRB_ARGS_ANY()); /* 15.2.10.5.6 */
+ mrb_define_method(mrb, s, "capitalize", mrb_str_capitalize, MRB_ARGS_NONE()); /* 15.2.10.5.7 */
+ mrb_define_method(mrb, s, "capitalize!", mrb_str_capitalize_bang, MRB_ARGS_NONE()); /* 15.2.10.5.8 */
+ mrb_define_method(mrb, s, "chomp", mrb_str_chomp, MRB_ARGS_ANY()); /* 15.2.10.5.9 */
+ mrb_define_method(mrb, s, "chomp!", mrb_str_chomp_bang, MRB_ARGS_ANY()); /* 15.2.10.5.10 */
+ mrb_define_method(mrb, s, "chop", mrb_str_chop, MRB_ARGS_REQ(1)); /* 15.2.10.5.11 */
+ mrb_define_method(mrb, s, "chop!", mrb_str_chop_bang, MRB_ARGS_REQ(1)); /* 15.2.10.5.12 */
+ mrb_define_method(mrb, s, "downcase", mrb_str_downcase, MRB_ARGS_NONE()); /* 15.2.10.5.13 */
+ mrb_define_method(mrb, s, "downcase!", mrb_str_downcase_bang, MRB_ARGS_NONE()); /* 15.2.10.5.14 */
+ mrb_define_method(mrb, s, "empty?", mrb_str_empty_p, MRB_ARGS_NONE()); /* 15.2.10.5.16 */
+ mrb_define_method(mrb, s, "eql?", mrb_str_eql, MRB_ARGS_REQ(1)); /* 15.2.10.5.17 */
+
+ mrb_define_method(mrb, s, "hash", mrb_str_hash_m, MRB_ARGS_NONE()); /* 15.2.10.5.20 */
+ mrb_define_method(mrb, s, "include?", mrb_str_include, MRB_ARGS_REQ(1)); /* 15.2.10.5.21 */
+ mrb_define_method(mrb, s, "index", mrb_str_index_m, MRB_ARGS_ANY()); /* 15.2.10.5.22 */
+ mrb_define_method(mrb, s, "initialize", mrb_str_init, MRB_ARGS_REQ(1)); /* 15.2.10.5.23 */
+ mrb_define_method(mrb, s, "initialize_copy", mrb_str_replace, MRB_ARGS_REQ(1)); /* 15.2.10.5.24 */
+ mrb_define_method(mrb, s, "intern", mrb_str_intern, MRB_ARGS_NONE()); /* 15.2.10.5.25 */
+ mrb_define_method(mrb, s, "length", mrb_str_size, MRB_ARGS_NONE()); /* 15.2.10.5.26 */
+ mrb_define_method(mrb, s, "replace", mrb_str_replace, MRB_ARGS_REQ(1)); /* 15.2.10.5.28 */
+ mrb_define_method(mrb, s, "reverse", mrb_str_reverse, MRB_ARGS_NONE()); /* 15.2.10.5.29 */
+ mrb_define_method(mrb, s, "reverse!", mrb_str_reverse_bang, MRB_ARGS_NONE()); /* 15.2.10.5.30 */
+ mrb_define_method(mrb, s, "rindex", mrb_str_rindex_m, MRB_ARGS_ANY()); /* 15.2.10.5.31 */
+ mrb_define_method(mrb, s, "size", mrb_str_size, MRB_ARGS_NONE()); /* 15.2.10.5.33 */
+ mrb_define_method(mrb, s, "slice", mrb_str_aref_m, MRB_ARGS_ANY()); /* 15.2.10.5.34 */
+ mrb_define_method(mrb, s, "split", mrb_str_split_m, MRB_ARGS_ANY()); /* 15.2.10.5.35 */
+
+ mrb_define_method(mrb, s, "to_f", mrb_str_to_f, MRB_ARGS_NONE()); /* 15.2.10.5.38 */
+ mrb_define_method(mrb, s, "to_i", mrb_str_to_i, MRB_ARGS_ANY()); /* 15.2.10.5.39 */
+ mrb_define_method(mrb, s, "to_s", mrb_str_to_s, MRB_ARGS_NONE()); /* 15.2.10.5.40 */
+ mrb_define_method(mrb, s, "to_str", mrb_str_to_s, MRB_ARGS_NONE());
+ mrb_define_method(mrb, s, "to_sym", mrb_str_intern, MRB_ARGS_NONE()); /* 15.2.10.5.41 */
+ mrb_define_method(mrb, s, "upcase", mrb_str_upcase, MRB_ARGS_NONE()); /* 15.2.10.5.42 */
+ mrb_define_method(mrb, s, "upcase!", mrb_str_upcase_bang, MRB_ARGS_NONE()); /* 15.2.10.5.43 */
+ mrb_define_method(mrb, s, "inspect", mrb_str_inspect, MRB_ARGS_NONE()); /* 15.2.10.5.46(x) */
+ mrb_define_method(mrb, s, "bytes", mrb_str_bytes, MRB_ARGS_NONE());
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/symbol.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,491 @@
+/*
+** symbol.c - Symbol class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <ctype.h>
+#include <limits.h>
+#include <string.h>
+#include "mruby.h"
+#include "mruby/khash.h"
+#include "mruby/string.h"
+#include "mruby/dump.h"
+
+/* ------------------------------------------------------ */
+typedef struct symbol_name {
+ mrb_bool lit : 1;
+ uint16_t len;
+ const char *name;
+} symbol_name;
+
+static inline khint_t
+sym_hash_func(mrb_state *mrb, mrb_sym s)
+{
+ khint_t h = 0;
+ size_t i, len = mrb->symtbl[s].len;
+ const char *p = mrb->symtbl[s].name;
+
+ for (i=0; i<len; i++) {
+ h = (h << 5) - h + *p++;
+ }
+ return h;
+}
+#define sym_hash_equal(mrb,a, b) (mrb->symtbl[a].len == mrb->symtbl[b].len && memcmp(mrb->symtbl[a].name, mrb->symtbl[b].name, mrb->symtbl[a].len) == 0)
+
+KHASH_DECLARE(n2s, mrb_sym, mrb_sym, FALSE)
+KHASH_DEFINE (n2s, mrb_sym, mrb_sym, FALSE, sym_hash_func, sym_hash_equal)
+/* ------------------------------------------------------ */
+
+static void
+sym_validate_len(mrb_state *mrb, size_t len)
+{
+ if (len >= RITE_LV_NULL_MARK) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "symbol length too long");
+ }
+}
+
+static mrb_sym
+sym_intern(mrb_state *mrb, const char *name, size_t len, mrb_bool lit)
+{
+ khash_t(n2s) *h = mrb->name2sym;
+ symbol_name *sname = mrb->symtbl; /* symtbl[0] for working memory */
+ khiter_t k;
+ mrb_sym sym;
+ char *p;
+
+ sym_validate_len(mrb, len);
+ if (sname) {
+ sname->lit = lit;
+ sname->len = (uint16_t)len;
+ sname->name = name;
+ k = kh_get(n2s, mrb, h, 0);
+ if (k != kh_end(h))
+ return kh_key(h, k);
+ }
+
+ /* registering a new symbol */
+ sym = ++mrb->symidx;
+ if (mrb->symcapa < sym) {
+ if (mrb->symcapa == 0) mrb->symcapa = 100;
+ else mrb->symcapa = (size_t)(mrb->symcapa * 1.2);
+ mrb->symtbl = (symbol_name*)mrb_realloc(mrb, mrb->symtbl, sizeof(symbol_name)*(mrb->symcapa+1));
+ }
+ sname = &mrb->symtbl[sym];
+ sname->len = (uint16_t)len;
+ if (lit || mrb_ro_data_p(name)) {
+ sname->name = name;
+ sname->lit = TRUE;
+ }
+ else {
+ p = (char *)mrb_malloc(mrb, len+1);
+ memcpy(p, name, len);
+ p[len] = 0;
+ sname->name = (const char*)p;
+ sname->lit = FALSE;
+ }
+ kh_put(n2s, mrb, h, sym);
+
+ return sym;
+}
+
+MRB_API mrb_sym
+mrb_intern(mrb_state *mrb, const char *name, size_t len)
+{
+ return sym_intern(mrb, name, len, FALSE);
+}
+
+MRB_API mrb_sym
+mrb_intern_static(mrb_state *mrb, const char *name, size_t len)
+{
+ return sym_intern(mrb, name, len, TRUE);
+}
+
+MRB_API mrb_sym
+mrb_intern_cstr(mrb_state *mrb, const char *name)
+{
+ return mrb_intern(mrb, name, strlen(name));
+}
+
+MRB_API mrb_sym
+mrb_intern_str(mrb_state *mrb, mrb_value str)
+{
+ return mrb_intern(mrb, RSTRING_PTR(str), RSTRING_LEN(str));
+}
+
+MRB_API mrb_value
+mrb_check_intern(mrb_state *mrb, const char *name, size_t len)
+{
+ khash_t(n2s) *h = mrb->name2sym;
+ symbol_name *sname = mrb->symtbl;
+ khiter_t k;
+
+ sym_validate_len(mrb, len);
+ sname->len = (uint16_t)len;
+ sname->name = name;
+
+ k = kh_get(n2s, mrb, h, 0);
+ if (k != kh_end(h)) {
+ return mrb_symbol_value(kh_key(h, k));
+ }
+ return mrb_nil_value();
+}
+
+MRB_API mrb_value
+mrb_check_intern_cstr(mrb_state *mrb, const char *name)
+{
+ return mrb_check_intern(mrb, name, (mrb_int)strlen(name));
+}
+
+MRB_API mrb_value
+mrb_check_intern_str(mrb_state *mrb, mrb_value str)
+{
+ return mrb_check_intern(mrb, RSTRING_PTR(str), RSTRING_LEN(str));
+}
+
+/* lenp must be a pointer to a size_t variable */
+MRB_API const char*
+mrb_sym2name_len(mrb_state *mrb, mrb_sym sym, mrb_int *lenp)
+{
+ if (sym == 0 || mrb->symidx < sym) {
+ if (lenp) *lenp = 0;
+ return NULL;
+ }
+
+ if (lenp) *lenp = mrb->symtbl[sym].len;
+ return mrb->symtbl[sym].name;
+}
+
+void
+mrb_free_symtbl(mrb_state *mrb)
+{
+ mrb_sym i, lim;
+
+ for (i=1, lim=mrb->symidx+1; i<lim; i++) {
+ if (!mrb->symtbl[i].lit) {
+ mrb_free(mrb, (char*)mrb->symtbl[i].name);
+ }
+ }
+ mrb_free(mrb, mrb->symtbl);
+ kh_destroy(n2s, mrb, mrb->name2sym);
+}
+
+void
+mrb_init_symtbl(mrb_state *mrb)
+{
+ mrb->name2sym = kh_init(n2s, mrb);
+}
+
+/**********************************************************************
+ * Document-class: Symbol
+ *
+ * <code>Symbol</code> objects represent names and some strings
+ * inside the Ruby
+ * interpreter. They are generated using the <code>:name</code> and
+ * <code>:"string"</code> literals
+ * syntax, and by the various <code>to_sym</code> methods. The same
+ * <code>Symbol</code> object will be created for a given name or string
+ * for the duration of a program's execution, regardless of the context
+ * or meaning of that name. Thus if <code>Fred</code> is a constant in
+ * one context, a method in another, and a class in a third, the
+ * <code>Symbol</code> <code>:Fred</code> will be the same object in
+ * all three contexts.
+ *
+ * module One
+ * class Fred
+ * end
+ * $f1 = :Fred
+ * end
+ * module Two
+ * Fred = 1
+ * $f2 = :Fred
+ * end
+ * def Fred()
+ * end
+ * $f3 = :Fred
+ * $f1.object_id #=> 2514190
+ * $f2.object_id #=> 2514190
+ * $f3.object_id #=> 2514190
+ *
+ */
+
+
+/* 15.2.11.3.1 */
+/*
+ * call-seq:
+ * sym == obj -> true or false
+ *
+ * Equality---If <i>sym</i> and <i>obj</i> are exactly the same
+ * symbol, returns <code>true</code>.
+ */
+
+static mrb_value
+sym_equal(mrb_state *mrb, mrb_value sym1)
+{
+ mrb_value sym2;
+
+ mrb_get_args(mrb, "o", &sym2);
+
+ return mrb_bool_value(mrb_obj_equal(mrb, sym1, sym2));
+}
+
+/* 15.2.11.3.2 */
+/* 15.2.11.3.3 */
+/*
+ * call-seq:
+ * sym.id2name -> string
+ * sym.to_s -> string
+ *
+ * Returns the name or string corresponding to <i>sym</i>.
+ *
+ * :fred.id2name #=> "fred"
+ */
+static mrb_value
+mrb_sym_to_s(mrb_state *mrb, mrb_value sym)
+{
+ mrb_sym id = mrb_symbol(sym);
+ const char *p;
+ mrb_int len;
+
+ p = mrb_sym2name_len(mrb, id, &len);
+ return mrb_str_new_static(mrb, p, len);
+}
+
+/* 15.2.11.3.4 */
+/*
+ * call-seq:
+ * sym.to_sym -> sym
+ * sym.intern -> sym
+ *
+ * In general, <code>to_sym</code> returns the <code>Symbol</code> corresponding
+ * to an object. As <i>sym</i> is already a symbol, <code>self</code> is returned
+ * in this case.
+ */
+
+static mrb_value
+sym_to_sym(mrb_state *mrb, mrb_value sym)
+{
+ return sym;
+}
+
+/* 15.2.11.3.5(x) */
+/*
+ * call-seq:
+ * sym.inspect -> string
+ *
+ * Returns the representation of <i>sym</i> as a symbol literal.
+ *
+ * :fred.inspect #=> ":fred"
+ */
+
+#if __STDC__
+# define SIGN_EXTEND_CHAR(c) ((signed char)(c))
+#else /* not __STDC__ */
+/* As in Harbison and Steele. */
+# define SIGN_EXTEND_CHAR(c) ((((unsigned char)(c)) ^ 128) - 128)
+#endif
+#define is_identchar(c) (SIGN_EXTEND_CHAR(c)!=-1&&(ISALNUM(c) || (c) == '_'))
+
+static mrb_bool
+is_special_global_name(const char* m)
+{
+ switch (*m) {
+ case '~': case '*': case '$': case '?': case '!': case '@':
+ case '/': case '\\': case ';': case ',': case '.': case '=':
+ case ':': case '<': case '>': case '\"':
+ case '&': case '`': case '\'': case '+':
+ case '0':
+ ++m;
+ break;
+ case '-':
+ ++m;
+ if (is_identchar(*m)) m += 1;
+ break;
+ default:
+ if (!ISDIGIT(*m)) return FALSE;
+ do ++m; while (ISDIGIT(*m));
+ break;
+ }
+ return !*m;
+}
+
+static mrb_bool
+symname_p(const char *name)
+{
+ const char *m = name;
+ mrb_bool localid = FALSE;
+
+ if (!m) return FALSE;
+ switch (*m) {
+ case '\0':
+ return FALSE;
+
+ case '$':
+ if (is_special_global_name(++m)) return TRUE;
+ goto id;
+
+ case '@':
+ if (*++m == '@') ++m;
+ goto id;
+
+ case '<':
+ switch (*++m) {
+ case '<': ++m; break;
+ case '=': if (*++m == '>') ++m; break;
+ default: break;
+ }
+ break;
+
+ case '>':
+ switch (*++m) {
+ case '>': case '=': ++m; break;
+ default: break;
+ }
+ break;
+
+ case '=':
+ switch (*++m) {
+ case '~': ++m; break;
+ case '=': if (*++m == '=') ++m; break;
+ default: return FALSE;
+ }
+ break;
+
+ case '*':
+ if (*++m == '*') ++m;
+ break;
+ case '!':
+ if (*++m == '=') ++m;
+ break;
+ case '+': case '-':
+ if (*++m == '@') ++m;
+ break;
+ case '|':
+ if (*++m == '|') ++m;
+ break;
+ case '&':
+ if (*++m == '&') ++m;
+ break;
+
+ case '^': case '/': case '%': case '~': case '`':
+ ++m;
+ break;
+
+ case '[':
+ if (*++m != ']') return FALSE;
+ if (*++m == '=') ++m;
+ break;
+
+ default:
+ localid = !ISUPPER(*m);
+id:
+ if (*m != '_' && !ISALPHA(*m)) return FALSE;
+ while (is_identchar(*m)) m += 1;
+ if (localid) {
+ switch (*m) {
+ case '!': case '?': case '=': ++m;
+ default: break;
+ }
+ }
+ break;
+ }
+ return *m ? FALSE : TRUE;
+}
+
+static mrb_value
+sym_inspect(mrb_state *mrb, mrb_value sym)
+{
+ mrb_value str;
+ const char *name;
+ mrb_int len;
+ mrb_sym id = mrb_symbol(sym);
+ char *sp;
+
+ name = mrb_sym2name_len(mrb, id, &len);
+ str = mrb_str_new(mrb, 0, len+1);
+ sp = RSTRING_PTR(str);
+ RSTRING_PTR(str)[0] = ':';
+ memcpy(sp+1, name, len);
+ mrb_assert_int_fit(mrb_int, len, size_t, SIZE_MAX);
+ if (!symname_p(name) || strlen(name) != (size_t)len) {
+ str = mrb_str_dump(mrb, str);
+ sp = RSTRING_PTR(str);
+ sp[0] = ':';
+ sp[1] = '"';
+ }
+ return str;
+}
+
+MRB_API mrb_value
+mrb_sym2str(mrb_state *mrb, mrb_sym sym)
+{
+ mrb_int len;
+ const char *name = mrb_sym2name_len(mrb, sym, &len);
+
+ if (!name) return mrb_undef_value(); /* can't happen */
+ return mrb_str_new_static(mrb, name, len);
+}
+
+MRB_API const char*
+mrb_sym2name(mrb_state *mrb, mrb_sym sym)
+{
+ mrb_int len;
+ const char *name = mrb_sym2name_len(mrb, sym, &len);
+
+ if (!name) return NULL;
+ if (symname_p(name) && strlen(name) == (size_t)len) {
+ return name;
+ }
+ else {
+ mrb_value str = mrb_str_dump(mrb, mrb_str_new_static(mrb, name, len));
+ return RSTRING_PTR(str);
+ }
+}
+
+#define lesser(a,b) (((a)>(b))?(b):(a))
+
+static mrb_value
+sym_cmp(mrb_state *mrb, mrb_value s1)
+{
+ mrb_value s2;
+ mrb_sym sym1, sym2;
+
+ mrb_get_args(mrb, "o", &s2);
+ if (mrb_type(s2) != MRB_TT_SYMBOL) return mrb_nil_value();
+ sym1 = mrb_symbol(s1);
+ sym2 = mrb_symbol(s2);
+ if (sym1 == sym2) return mrb_fixnum_value(0);
+ else {
+ const char *p1, *p2;
+ int retval;
+ mrb_int len, len1, len2;
+
+ p1 = mrb_sym2name_len(mrb, sym1, &len1);
+ p2 = mrb_sym2name_len(mrb, sym2, &len2);
+ len = lesser(len1, len2);
+ retval = memcmp(p1, p2, len);
+ if (retval == 0) {
+ if (len1 == len2) return mrb_fixnum_value(0);
+ if (len1 > len2) return mrb_fixnum_value(1);
+ return mrb_fixnum_value(-1);
+ }
+ if (retval > 0) return mrb_fixnum_value(1);
+ return mrb_fixnum_value(-1);
+ }
+}
+
+void
+mrb_init_symbol(mrb_state *mrb)
+{
+ struct RClass *sym;
+
+ sym = mrb->symbol_class = mrb_define_class(mrb, "Symbol", mrb->object_class); /* 15.2.11 */
+
+ mrb_define_method(mrb, sym, "===", sym_equal, MRB_ARGS_REQ(1)); /* 15.2.11.3.1 */
+ mrb_define_method(mrb, sym, "id2name", mrb_sym_to_s, MRB_ARGS_NONE()); /* 15.2.11.3.2 */
+ mrb_define_method(mrb, sym, "to_s", mrb_sym_to_s, MRB_ARGS_NONE()); /* 15.2.11.3.3 */
+ mrb_define_method(mrb, sym, "to_sym", sym_to_sym, MRB_ARGS_NONE()); /* 15.2.11.3.4 */
+ mrb_define_method(mrb, sym, "inspect", sym_inspect, MRB_ARGS_NONE()); /* 15.2.11.3.5(x) */
+ mrb_define_method(mrb, sym, "<=>", sym_cmp, MRB_ARGS_REQ(1));
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/value_array.h Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,28 @@
+#ifndef MRB_VALUE_ARRAY_H__
+#define MRB_VALUE_ARRAY_H__
+
+#include "mruby.h"
+
+static inline void
+value_move(mrb_value *s1, const mrb_value *s2, size_t n)
+{
+ if (s1 > s2 && s1 < s2 + n)
+ {
+ s1 += n;
+ s2 += n;
+ while (n-- > 0) {
+ *--s1 = *--s2;
+ }
+ }
+ else if (s1 != s2) {
+ while (n-- > 0) {
+ *s1++ = *s2++;
+ }
+ }
+ else {
+ /* nothing to do. */
+ }
+}
+
+#endif /* MRB_VALUE_ARRAY_H__ */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/variable.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,1163 @@
+/*
+** variable.c - mruby variables
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <ctype.h>
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/proc.h"
+#include "mruby/string.h"
+
+typedef int (iv_foreach_func)(mrb_state*,mrb_sym,mrb_value,void*);
+
+#ifdef MRB_USE_IV_SEGLIST
+
+#ifndef MRB_SEGMENT_SIZE
+#define MRB_SEGMENT_SIZE 4
+#endif
+
+typedef struct segment {
+ mrb_sym key[MRB_SEGMENT_SIZE];
+ mrb_value val[MRB_SEGMENT_SIZE];
+ struct segment *next;
+} segment;
+
+/* Instance variable table structure */
+typedef struct iv_tbl {
+ segment *rootseg;
+ size_t size;
+ size_t last_len;
+} iv_tbl;
+
+/*
+ * Creates the instance variable table.
+ *
+ * Parameters
+ * mrb
+ * Returns
+ * the instance variable table.
+ */
+static iv_tbl*
+iv_new(mrb_state *mrb)
+{
+ iv_tbl *t;
+
+ t = mrb_malloc(mrb, sizeof(iv_tbl));
+ t->size = 0;
+ t->rootseg = NULL;
+ t->last_len = 0;
+
+ return t;
+}
+
+/*
+ * Set the value for the symbol in the instance variable table.
+ *
+ * Parameters
+ * mrb
+ * t the instance variable table to be set in.
+ * sym the symbol to be used as the key.
+ * val the value to be set.
+ */
+static void
+iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val)
+{
+ segment *seg = t->rootseg;
+ segment *prev = NULL;
+ segment *matched_seg = NULL;
+ size_t matched_idx = 0;
+ size_t i;
+
+ while (seg) {
+ for (i=0; i<MRB_SEGMENT_SIZE; i++) {
+ mrb_sym key = seg->key[i];
+ /* Found room in last segment after last_len */
+ if (!seg->next && i >= t->last_len) {
+ seg->key[i] = sym;
+ seg->val[i] = val;
+ t->last_len = i+1;
+ t->size++;
+ return;
+ }
+ if (!matched_seg && key == 0) {
+ matched_seg = seg;
+ matched_idx = i;
+ }
+ else if (key == sym) {
+ seg->val[i] = val;
+ return;
+ }
+ }
+ prev = seg;
+ seg = seg->next;
+ }
+
+ /* Not found */
+ t->size++;
+ if (matched_seg) {
+ matched_seg->key[matched_idx] = sym;
+ matched_seg->val[matched_idx] = val;
+ return;
+ }
+
+ seg = mrb_malloc(mrb, sizeof(segment));
+ if (!seg) return;
+ seg->next = NULL;
+ seg->key[0] = sym;
+ seg->val[0] = val;
+ t->last_len = 1;
+ if (prev) {
+ prev->next = seg;
+ }
+ else {
+ t->rootseg = seg;
+ }
+}
+
+/*
+ * Get a value for a symbol from the instance variable table.
+ *
+ * Parameters
+ * mrb
+ * t the variable table to be searched.
+ * sym the symbol to be used as the key.
+ * vp the value pointer. Receives the value if the specified symbol is
+ * contained in the instance variable table.
+ * Returns
+ * true if the specified symbol is contained in the instance variable table.
+ */
+static mrb_bool
+iv_get(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp)
+{
+ segment *seg;
+ size_t i;
+
+ seg = t->rootseg;
+ while (seg) {
+ for (i=0; i<MRB_SEGMENT_SIZE; i++) {
+ mrb_sym key = seg->key[i];
+
+ if (!seg->next && i >= t->last_len) {
+ return FALSE;
+ }
+ if (key == sym) {
+ if (vp) *vp = seg->val[i];
+ return TRUE;
+ }
+ }
+ seg = seg->next;
+ }
+ return FALSE;
+}
+
+/*
+ * Deletes the value for the symbol from the instance variable table.
+ *
+ * Parameters
+ * t the variable table to be searched.
+ * sym the symbol to be used as the key.
+ * vp the value pointer. Receive the deleted value if the symbol is
+ * contained in the instance variable table.
+ * Returns
+ * true if the specified symbol is contained in the instance variable table.
+ */
+static mrb_bool
+iv_del(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp)
+{
+ segment *seg;
+ size_t i;
+
+ seg = t->rootseg;
+ while (seg) {
+ for (i=0; i<MRB_SEGMENT_SIZE; i++) {
+ mrb_sym key = seg->key[i];
+
+ if (!seg->next && i >= t->last_len) {
+ return FALSE;
+ }
+ if (key == sym) {
+ t->size--;
+ seg->key[i] = 0;
+ if (vp) *vp = seg->val[i];
+ return TRUE;
+ }
+ }
+ seg = seg->next;
+ }
+ return FALSE;
+}
+
+static mrb_bool
+iv_foreach(mrb_state *mrb, iv_tbl *t, iv_foreach_func *func, void *p)
+{
+ segment *seg;
+ size_t i;
+ int n;
+
+ seg = t->rootseg;
+ while (seg) {
+ for (i=0; i<MRB_SEGMENT_SIZE; i++) {
+ mrb_sym key = seg->key[i];
+
+ /* no value in last segment after last_len */
+ if (!seg->next && i >= t->last_len) {
+ return FALSE;
+ }
+ if (key != 0) {
+ n =(*func)(mrb, key, seg->val[i], p);
+ if (n > 0) return FALSE;
+ if (n < 0) {
+ t->size--;
+ seg->key[i] = 0;
+ }
+ }
+ }
+ seg = seg->next;
+ }
+ return TRUE;
+}
+
+static size_t
+iv_size(mrb_state *mrb, iv_tbl *t)
+{
+ segment *seg;
+ size_t size = 0;
+
+ if (!t) return 0;
+ if (t->size > 0) return t->size;
+ seg = t->rootseg;
+ while (seg) {
+ if (seg->next == NULL) {
+ size += t->last_len;
+ return size;
+ }
+ seg = seg->next;
+ size += MRB_SEGMENT_SIZE;
+ }
+ /* empty iv_tbl */
+ return 0;
+}
+
+static iv_tbl*
+iv_copy(mrb_state *mrb, iv_tbl *t)
+{
+ segment *seg;
+ iv_tbl *t2;
+
+ size_t i;
+
+ seg = t->rootseg;
+ t2 = iv_new(mrb);
+
+ while (seg != NULL) {
+ for (i=0; i<MRB_SEGMENT_SIZE; i++) {
+ mrb_sym key = seg->key[i];
+ mrb_value val = seg->val[i];
+
+ if ((seg->next == NULL) && (i >= t->last_len)) {
+ return t2;
+ }
+ iv_put(mrb, t2, key, val);
+ }
+ seg = seg->next;
+ }
+ return t2;
+}
+
+static void
+iv_free(mrb_state *mrb, iv_tbl *t)
+{
+ segment *seg;
+
+ seg = t->rootseg;
+ while (seg) {
+ segment *p = seg;
+ seg = seg->next;
+ mrb_free(mrb, p);
+ }
+ mrb_free(mrb, t);
+}
+
+#else
+
+#include "mruby/khash.h"
+
+#ifndef MRB_IVHASH_INIT_SIZE
+#define MRB_IVHASH_INIT_SIZE 8
+#endif
+
+KHASH_DECLARE(iv, mrb_sym, mrb_value, TRUE)
+KHASH_DEFINE(iv, mrb_sym, mrb_value, TRUE, kh_int_hash_func, kh_int_hash_equal)
+
+typedef struct iv_tbl {
+ khash_t(iv) h;
+} iv_tbl;
+
+static iv_tbl*
+iv_new(mrb_state *mrb)
+{
+ return (iv_tbl*)kh_init_size(iv, mrb, MRB_IVHASH_INIT_SIZE);
+}
+
+static void
+iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val)
+{
+ khash_t(iv) *h = &t->h;
+ khiter_t k;
+
+ k = kh_put(iv, mrb, h, sym);
+ kh_value(h, k) = val;
+}
+
+static mrb_bool
+iv_get(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp)
+{
+ khash_t(iv) *h = &t->h;
+ khiter_t k;
+
+ k = kh_get(iv, mrb, h, sym);
+ if (k != kh_end(h)) {
+ if (vp) *vp = kh_value(h, k);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static mrb_bool
+iv_del(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp)
+{
+ khash_t(iv) *h = &t->h;
+ khiter_t k;
+
+ if (h) {
+ k = kh_get(iv, mrb, h, sym);
+ if (k != kh_end(h)) {
+ mrb_value val = kh_value(h, k);
+ kh_del(iv, mrb, h, k);
+ if (vp) *vp = val;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static mrb_bool
+iv_foreach(mrb_state *mrb, iv_tbl *t, iv_foreach_func *func, void *p)
+{
+ khash_t(iv) *h = &t->h;
+ khiter_t k;
+ int n;
+
+ if (h) {
+ for (k = kh_begin(h); k != kh_end(h); k++) {
+ if (kh_exist(h, k)) {
+ n = (*func)(mrb, kh_key(h, k), kh_value(h, k), p);
+ if (n > 0) return FALSE;
+ if (n < 0) {
+ kh_del(iv, mrb, h, k);
+ }
+ }
+ }
+ }
+ return TRUE;
+}
+
+static size_t
+iv_size(mrb_state *mrb, iv_tbl *t)
+{
+ khash_t(iv) *h;
+
+ if (t && (h = &t->h)) {
+ return kh_size(h);
+ }
+ return 0;
+}
+
+static iv_tbl*
+iv_copy(mrb_state *mrb, iv_tbl *t)
+{
+ return (iv_tbl*)kh_copy(iv, mrb, &t->h);
+}
+
+static void
+iv_free(mrb_state *mrb, iv_tbl *t)
+{
+ kh_destroy(iv, mrb, &t->h);
+}
+
+#endif
+
+static int
+iv_mark_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
+{
+ mrb_gc_mark_value(mrb, v);
+ return 0;
+}
+
+static void
+mark_tbl(mrb_state *mrb, iv_tbl *t)
+{
+ if (t) {
+ iv_foreach(mrb, t, iv_mark_i, 0);
+ }
+}
+
+void
+mrb_gc_mark_gv(mrb_state *mrb)
+{
+ mark_tbl(mrb, mrb->globals);
+}
+
+void
+mrb_gc_free_gv(mrb_state *mrb)
+{
+ if (mrb->globals)
+ iv_free(mrb, mrb->globals);
+}
+
+void
+mrb_gc_mark_iv(mrb_state *mrb, struct RObject *obj)
+{
+ mark_tbl(mrb, obj->iv);
+}
+
+size_t
+mrb_gc_mark_iv_size(mrb_state *mrb, struct RObject *obj)
+{
+ return iv_size(mrb, obj->iv);
+}
+
+void
+mrb_gc_free_iv(mrb_state *mrb, struct RObject *obj)
+{
+ if (obj->iv) {
+ iv_free(mrb, obj->iv);
+ }
+}
+
+mrb_value
+mrb_vm_special_get(mrb_state *mrb, mrb_sym i)
+{
+ return mrb_fixnum_value(0);
+}
+
+void
+mrb_vm_special_set(mrb_state *mrb, mrb_sym i, mrb_value v)
+{
+}
+
+static mrb_bool
+obj_iv_p(mrb_value obj)
+{
+ switch (mrb_type(obj)) {
+ case MRB_TT_OBJECT:
+ case MRB_TT_CLASS:
+ case MRB_TT_MODULE:
+ case MRB_TT_SCLASS:
+ case MRB_TT_HASH:
+ case MRB_TT_DATA:
+ case MRB_TT_EXCEPTION:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+MRB_API mrb_value
+mrb_obj_iv_get(mrb_state *mrb, struct RObject *obj, mrb_sym sym)
+{
+ mrb_value v;
+
+ if (obj->iv && iv_get(mrb, obj->iv, sym, &v))
+ return v;
+ return mrb_nil_value();
+}
+
+MRB_API mrb_value
+mrb_iv_get(mrb_state *mrb, mrb_value obj, mrb_sym sym)
+{
+ if (obj_iv_p(obj)) {
+ return mrb_obj_iv_get(mrb, mrb_obj_ptr(obj), sym);
+ }
+ return mrb_nil_value();
+}
+
+MRB_API void
+mrb_obj_iv_set(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v)
+{
+ iv_tbl *t = obj->iv;
+
+ if (!t) {
+ t = obj->iv = iv_new(mrb);
+ }
+ mrb_write_barrier(mrb, (struct RBasic*)obj);
+ iv_put(mrb, t, sym, v);
+}
+
+MRB_API void
+mrb_obj_iv_ifnone(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v)
+{
+ iv_tbl *t = obj->iv;
+
+ if (!t) {
+ t = obj->iv = iv_new(mrb);
+ }
+ else if (iv_get(mrb, t, sym, &v)) {
+ return;
+ }
+ mrb_write_barrier(mrb, (struct RBasic*)obj);
+ iv_put(mrb, t, sym, v);
+}
+
+MRB_API void
+mrb_iv_set(mrb_state *mrb, mrb_value obj, mrb_sym sym, mrb_value v)
+{
+ if (obj_iv_p(obj)) {
+ mrb_obj_iv_set(mrb, mrb_obj_ptr(obj), sym, v);
+ }
+ else {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "cannot set instance variable");
+ }
+}
+
+MRB_API mrb_bool
+mrb_obj_iv_defined(mrb_state *mrb, struct RObject *obj, mrb_sym sym)
+{
+ iv_tbl *t;
+
+ t = obj->iv;
+ if (t) {
+ return iv_get(mrb, t, sym, NULL);
+ }
+ return FALSE;
+}
+
+MRB_API mrb_bool
+mrb_iv_defined(mrb_state *mrb, mrb_value obj, mrb_sym sym)
+{
+ if (!obj_iv_p(obj)) return FALSE;
+ return mrb_obj_iv_defined(mrb, mrb_obj_ptr(obj), sym);
+}
+
+#define identchar(c) (ISALNUM(c) || (c) == '_' || !ISASCII(c))
+
+MRB_API mrb_bool
+mrb_iv_p(mrb_state *mrb, mrb_sym iv_name)
+{
+ const char *s;
+ mrb_int i, len;
+
+ s = mrb_sym2name_len(mrb, iv_name, &len);
+ if (len < 2) return FALSE;
+ if (s[0] != '@') return FALSE;
+ if (s[1] == '@') return FALSE;
+ for (i=1; i<len; i++) {
+ if (!identchar(s[i])) return FALSE;
+ }
+ return TRUE;
+}
+
+MRB_API void
+mrb_iv_check(mrb_state *mrb, mrb_sym iv_name)
+{
+ if (!mrb_iv_p(mrb, iv_name)) {
+ mrb_name_error(mrb, iv_name, "`%S' is not allowed as an instance variable name", mrb_sym2str(mrb, iv_name));
+ }
+}
+
+MRB_API void
+mrb_iv_copy(mrb_state *mrb, mrb_value dest, mrb_value src)
+{
+ struct RObject *d = mrb_obj_ptr(dest);
+ struct RObject *s = mrb_obj_ptr(src);
+
+ if (d->iv) {
+ iv_free(mrb, d->iv);
+ d->iv = 0;
+ }
+ if (s->iv) {
+ mrb_write_barrier(mrb, (struct RBasic*)d);
+ d->iv = iv_copy(mrb, s->iv);
+ }
+}
+
+static int
+inspect_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
+{
+ mrb_value str = *(mrb_value*)p;
+ const char *s;
+ mrb_int len;
+ mrb_value ins;
+ char *sp = RSTRING_PTR(str);
+
+ /* need not to show internal data */
+ if (sp[0] == '-') { /* first element */
+ sp[0] = '#';
+ mrb_str_cat_lit(mrb, str, " ");
+ }
+ else {
+ mrb_str_cat_lit(mrb, str, ", ");
+ }
+ s = mrb_sym2name_len(mrb, sym, &len);
+ mrb_str_cat(mrb, str, s, len);
+ mrb_str_cat_lit(mrb, str, "=");
+ if (mrb_type(v) == MRB_TT_OBJECT) {
+ ins = mrb_any_to_s(mrb, v);
+ }
+ else {
+ ins = mrb_inspect(mrb, v);
+ }
+ mrb_str_append(mrb, str, ins);
+ return 0;
+}
+
+mrb_value
+mrb_obj_iv_inspect(mrb_state *mrb, struct RObject *obj)
+{
+ iv_tbl *t = obj->iv;
+ size_t len = iv_size(mrb, t);
+
+ if (len > 0) {
+ const char *cn = mrb_obj_classname(mrb, mrb_obj_value(obj));
+ mrb_value str = mrb_str_buf_new(mrb, 30);
+
+ mrb_str_cat_lit(mrb, str, "-<");
+ mrb_str_cat_cstr(mrb, str, cn);
+ mrb_str_cat_lit(mrb, str, ":");
+ mrb_str_concat(mrb, str, mrb_ptr_to_str(mrb, obj));
+
+ iv_foreach(mrb, t, inspect_i, &str);
+ mrb_str_cat_lit(mrb, str, ">");
+ return str;
+ }
+ return mrb_any_to_s(mrb, mrb_obj_value(obj));
+}
+
+MRB_API mrb_value
+mrb_iv_remove(mrb_state *mrb, mrb_value obj, mrb_sym sym)
+{
+ if (obj_iv_p(obj)) {
+ iv_tbl *t = mrb_obj_ptr(obj)->iv;
+ mrb_value val;
+
+ if (t && iv_del(mrb, t, sym, &val)) {
+ return val;
+ }
+ }
+ return mrb_undef_value();
+}
+
+mrb_value
+mrb_vm_iv_get(mrb_state *mrb, mrb_sym sym)
+{
+ /* get self */
+ return mrb_iv_get(mrb, mrb->c->stack[0], sym);
+}
+
+void
+mrb_vm_iv_set(mrb_state *mrb, mrb_sym sym, mrb_value v)
+{
+ /* get self */
+ mrb_iv_set(mrb, mrb->c->stack[0], sym, v);
+}
+
+static int
+iv_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
+{
+ mrb_value ary;
+ const char* s;
+ mrb_int len;
+
+ ary = *(mrb_value*)p;
+ s = mrb_sym2name_len(mrb, sym, &len);
+ if (len > 1 && s[0] == '@' && s[1] != '@') {
+ mrb_ary_push(mrb, ary, mrb_symbol_value(sym));
+ }
+ return 0;
+}
+
+/* 15.3.1.3.23 */
+/*
+ * call-seq:
+ * obj.instance_variables -> array
+ *
+ * Returns an array of instance variable names for the receiver. Note
+ * that simply defining an accessor does not create the corresponding
+ * instance variable.
+ *
+ * class Fred
+ * attr_accessor :a1
+ * def initialize
+ * @iv = 3
+ * end
+ * end
+ * Fred.new.instance_variables #=> [:@iv]
+ */
+mrb_value
+mrb_obj_instance_variables(mrb_state *mrb, mrb_value self)
+{
+ mrb_value ary;
+
+ ary = mrb_ary_new(mrb);
+ if (obj_iv_p(self) && mrb_obj_ptr(self)->iv) {
+ iv_foreach(mrb, mrb_obj_ptr(self)->iv, iv_i, &ary);
+ }
+ return ary;
+}
+
+static int
+cv_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
+{
+ mrb_value ary;
+ const char* s;
+ mrb_int len;
+
+ ary = *(mrb_value*)p;
+ s = mrb_sym2name_len(mrb, sym, &len);
+ if (len > 2 && s[0] == '@' && s[1] == '@') {
+ mrb_ary_push(mrb, ary, mrb_symbol_value(sym));
+ }
+ return 0;
+}
+
+/* 15.2.2.4.19 */
+/*
+ * call-seq:
+ * mod.class_variables -> array
+ *
+ * Returns an array of the names of class variables in <i>mod</i>.
+ *
+ * class One
+ * @@var1 = 1
+ * end
+ * class Two < One
+ * @@var2 = 2
+ * end
+ * One.class_variables #=> [:@@var1]
+ * Two.class_variables #=> [:@@var2]
+ */
+mrb_value
+mrb_mod_class_variables(mrb_state *mrb, mrb_value mod)
+{
+ mrb_value ary;
+ struct RClass *c;
+
+ ary = mrb_ary_new(mrb);
+ c = mrb_class_ptr(mod);
+ while (c) {
+ if (c->iv) {
+ iv_foreach(mrb, c->iv, cv_i, &ary);
+ }
+ c = c->super;
+ }
+ return ary;
+}
+
+MRB_API mrb_value
+mrb_mod_cv_get(mrb_state *mrb, struct RClass * c, mrb_sym sym)
+{
+ struct RClass * cls = c;
+
+ while (c) {
+ if (c->iv) {
+ iv_tbl *t = c->iv;
+ mrb_value v;
+
+ if (iv_get(mrb, t, sym, &v))
+ return v;
+ }
+ c = c->super;
+ }
+ mrb_name_error(mrb, sym, "uninitialized class variable %S in %S",
+ mrb_sym2str(mrb, sym), mrb_obj_value(cls));
+ /* not reached */
+ return mrb_nil_value();
+}
+
+MRB_API mrb_value
+mrb_cv_get(mrb_state *mrb, mrb_value mod, mrb_sym sym)
+{
+ return mrb_mod_cv_get(mrb, mrb_class_ptr(mod), sym);
+}
+
+MRB_API void
+mrb_mod_cv_set(mrb_state *mrb, struct RClass *c, mrb_sym sym, mrb_value v)
+{
+ struct RClass * cls = c;
+
+ while (c) {
+ if (c->iv) {
+ iv_tbl *t = c->iv;
+
+ if (iv_get(mrb, t, sym, NULL)) {
+ mrb_write_barrier(mrb, (struct RBasic*)c);
+ iv_put(mrb, t, sym, v);
+ return;
+ }
+ }
+ c = c->super;
+ }
+
+ if (!cls->iv) {
+ cls->iv = iv_new(mrb);
+ }
+
+ mrb_write_barrier(mrb, (struct RBasic*)cls);
+ iv_put(mrb, cls->iv, sym, v);
+}
+
+MRB_API void
+mrb_cv_set(mrb_state *mrb, mrb_value mod, mrb_sym sym, mrb_value v)
+{
+ mrb_mod_cv_set(mrb, mrb_class_ptr(mod), sym, v);
+}
+
+MRB_API mrb_bool
+mrb_mod_cv_defined(mrb_state *mrb, struct RClass * c, mrb_sym sym)
+{
+ while (c) {
+ if (c->iv) {
+ iv_tbl *t = c->iv;
+ if (iv_get(mrb, t, sym, NULL)) return TRUE;
+ }
+ c = c->super;
+ }
+
+ return FALSE;
+}
+
+MRB_API mrb_bool
+mrb_cv_defined(mrb_state *mrb, mrb_value mod, mrb_sym sym)
+{
+ return mrb_mod_cv_defined(mrb, mrb_class_ptr(mod), sym);
+}
+
+mrb_value
+mrb_vm_cv_get(mrb_state *mrb, mrb_sym sym)
+{
+ struct RClass *c = mrb->c->ci->proc->target_class;
+
+ if (!c) c = mrb->c->ci->target_class;
+
+ return mrb_mod_cv_get(mrb, c, sym);
+}
+
+void
+mrb_vm_cv_set(mrb_state *mrb, mrb_sym sym, mrb_value v)
+{
+ struct RClass *c = mrb->c->ci->proc->target_class;
+
+ if (!c) c = mrb->c->ci->target_class;
+ mrb_mod_cv_set(mrb, c, sym, v);
+}
+
+static void
+mod_const_check(mrb_state *mrb, mrb_value mod)
+{
+ switch (mrb_type(mod)) {
+ case MRB_TT_CLASS:
+ case MRB_TT_MODULE:
+ case MRB_TT_SCLASS:
+ break;
+ default:
+ mrb_raise(mrb, E_TYPE_ERROR, "constant look-up for non class/module");
+ break;
+ }
+}
+
+static mrb_value
+const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym)
+{
+ struct RClass *c = base;
+ mrb_value v;
+ iv_tbl *t;
+ mrb_bool retry = FALSE;
+ mrb_value name;
+
+L_RETRY:
+ while (c) {
+ if (c->iv) {
+ t = c->iv;
+ if (iv_get(mrb, t, sym, &v))
+ return v;
+ }
+ c = c->super;
+ }
+ if (!retry && base && base->tt == MRB_TT_MODULE) {
+ c = mrb->object_class;
+ retry = TRUE;
+ goto L_RETRY;
+ }
+ name = mrb_symbol_value(sym);
+ return mrb_funcall_argv(mrb, mrb_obj_value(base), mrb_intern_lit(mrb, "const_missing"), 1, &name);
+}
+
+MRB_API mrb_value
+mrb_const_get(mrb_state *mrb, mrb_value mod, mrb_sym sym)
+{
+ mod_const_check(mrb, mod);
+ return const_get(mrb, mrb_class_ptr(mod), sym);
+}
+
+mrb_value
+mrb_vm_const_get(mrb_state *mrb, mrb_sym sym)
+{
+ struct RClass *c = mrb->c->ci->proc->target_class;
+
+ if (!c) c = mrb->c->ci->target_class;
+ if (c) {
+ struct RClass *c2;
+ mrb_value v;
+
+ if (c->iv && iv_get(mrb, c->iv, sym, &v)) {
+ return v;
+ }
+ c2 = c;
+ for (;;) {
+ c2 = mrb_class_outer_module(mrb, c2);
+ if (!c2) break;
+ if (c2->iv && iv_get(mrb, c2->iv, sym, &v)) {
+ return v;
+ }
+ }
+ }
+ return const_get(mrb, c, sym);
+}
+
+MRB_API void
+mrb_const_set(mrb_state *mrb, mrb_value mod, mrb_sym sym, mrb_value v)
+{
+ mod_const_check(mrb, mod);
+ mrb_iv_set(mrb, mod, sym, v);
+}
+
+void
+mrb_vm_const_set(mrb_state *mrb, mrb_sym sym, mrb_value v)
+{
+ struct RClass *c = mrb->c->ci->proc->target_class;
+
+ if (!c) c = mrb->c->ci->target_class;
+ mrb_obj_iv_set(mrb, (struct RObject*)c, sym, v);
+}
+
+MRB_API void
+mrb_const_remove(mrb_state *mrb, mrb_value mod, mrb_sym sym)
+{
+ mod_const_check(mrb, mod);
+ mrb_iv_remove(mrb, mod, sym);
+}
+
+MRB_API void
+mrb_define_const(mrb_state *mrb, struct RClass *mod, const char *name, mrb_value v)
+{
+ mrb_obj_iv_set(mrb, (struct RObject*)mod, mrb_intern_cstr(mrb, name), v);
+}
+
+MRB_API void
+mrb_define_global_const(mrb_state *mrb, const char *name, mrb_value val)
+{
+ mrb_define_const(mrb, mrb->object_class, name, val);
+}
+
+static int
+const_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
+{
+ mrb_value ary;
+ const char* s;
+ mrb_int len;
+
+ ary = *(mrb_value*)p;
+ s = mrb_sym2name_len(mrb, sym, &len);
+ if (len >= 1 && ISUPPER(s[0])) {
+ mrb_ary_push(mrb, ary, mrb_symbol_value(sym));
+ }
+ return 0;
+}
+
+/* 15.2.2.4.24 */
+/*
+ * call-seq:
+ * mod.constants -> array
+ *
+ * Returns an array of all names of contants defined in the receiver.
+ */
+mrb_value
+mrb_mod_constants(mrb_state *mrb, mrb_value mod)
+{
+ mrb_value ary;
+ mrb_bool inherit = TRUE;
+ struct RClass *c = mrb_class_ptr(mod);
+
+ mrb_get_args(mrb, "|b", &inherit);
+ ary = mrb_ary_new(mrb);
+ while (c) {
+ if (c->iv) {
+ iv_foreach(mrb, c->iv, const_i, &ary);
+ }
+ if (!inherit) break;
+ c = c->super;
+ if (c == mrb->object_class) break;
+ }
+ return ary;
+}
+
+MRB_API mrb_value
+mrb_gv_get(mrb_state *mrb, mrb_sym sym)
+{
+ mrb_value v;
+
+ if (!mrb->globals) {
+ return mrb_nil_value();
+ }
+ if (iv_get(mrb, mrb->globals, sym, &v))
+ return v;
+ return mrb_nil_value();
+}
+
+MRB_API void
+mrb_gv_set(mrb_state *mrb, mrb_sym sym, mrb_value v)
+{
+ iv_tbl *t;
+
+ if (!mrb->globals) {
+ t = mrb->globals = iv_new(mrb);
+ }
+ else {
+ t = mrb->globals;
+ }
+ iv_put(mrb, t, sym, v);
+}
+
+MRB_API void
+mrb_gv_remove(mrb_state *mrb, mrb_sym sym)
+{
+ if (!mrb->globals) {
+ return;
+ }
+ iv_del(mrb, mrb->globals, sym, NULL);
+}
+
+static int
+gv_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
+{
+ mrb_value ary;
+
+ ary = *(mrb_value*)p;
+ mrb_ary_push(mrb, ary, mrb_symbol_value(sym));
+ return 0;
+}
+
+/* 15.3.1.2.4 */
+/* 15.3.1.3.14 */
+/*
+ * call-seq:
+ * global_variables -> array
+ *
+ * Returns an array of the names of global variables.
+ *
+ * global_variables.grep /std/ #=> [:$stdin, :$stdout, :$stderr]
+ */
+mrb_value
+mrb_f_global_variables(mrb_state *mrb, mrb_value self)
+{
+ iv_tbl *t = mrb->globals;
+ mrb_value ary = mrb_ary_new(mrb);
+ size_t i;
+ char buf[3];
+
+ if (t) {
+ iv_foreach(mrb, t, gv_i, &ary);
+ }
+ buf[0] = '$';
+ buf[2] = 0;
+ for (i = 1; i <= 9; ++i) {
+ buf[1] = (char)(i + '0');
+ mrb_ary_push(mrb, ary, mrb_symbol_value(mrb_intern(mrb, buf, 2)));
+ }
+ return ary;
+}
+
+static mrb_bool
+mrb_const_defined_0(mrb_state *mrb, mrb_value mod, mrb_sym id, mrb_bool exclude, mrb_bool recurse)
+{
+ struct RClass *klass = mrb_class_ptr(mod);
+ struct RClass *tmp;
+ mrb_bool mod_retry = 0;
+
+ tmp = klass;
+retry:
+ while (tmp) {
+ if (tmp->iv && iv_get(mrb, tmp->iv, id, NULL)) {
+ return TRUE;
+ }
+ if (!recurse && (klass != mrb->object_class)) break;
+ tmp = tmp->super;
+ }
+ if (!exclude && !mod_retry && (klass->tt == MRB_TT_MODULE)) {
+ mod_retry = 1;
+ tmp = mrb->object_class;
+ goto retry;
+ }
+ return FALSE;
+}
+
+MRB_API mrb_bool
+mrb_const_defined(mrb_state *mrb, mrb_value mod, mrb_sym id)
+{
+ return mrb_const_defined_0(mrb, mod, id, TRUE, TRUE);
+}
+
+MRB_API mrb_bool
+mrb_const_defined_at(mrb_state *mrb, mrb_value mod, mrb_sym id)
+{
+ return mrb_const_defined_0(mrb, mod, id, TRUE, FALSE);
+}
+
+MRB_API mrb_value
+mrb_attr_get(mrb_state *mrb, mrb_value obj, mrb_sym id)
+{
+ return mrb_iv_get(mrb, obj, id);
+}
+
+struct csym_arg {
+ struct RClass *c;
+ mrb_sym sym;
+};
+
+static int
+csym_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
+{
+ struct csym_arg *a = (struct csym_arg*)p;
+ struct RClass *c = a->c;
+
+ if (mrb_type(v) == c->tt && mrb_class_ptr(v) == c) {
+ a->sym = sym;
+ return 1; /* stop iteration */
+ }
+ return 0;
+}
+
+mrb_sym
+mrb_class_sym(mrb_state *mrb, struct RClass *c, struct RClass *outer)
+{
+ mrb_value name;
+
+ name = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__classid__"));
+ if (mrb_nil_p(name)) {
+
+ if (!outer) return 0;
+ else {
+ struct csym_arg arg;
+
+ arg.c = c;
+ arg.sym = 0;
+ iv_foreach(mrb, outer->iv, csym_i, &arg);
+ return arg.sym;
+ }
+ }
+ return mrb_symbol(name);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/version.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,14 @@
+#include "mruby.h"
+#include "mruby/variable.h"
+
+void
+mrb_init_version(mrb_state* mrb)
+{
+ mrb_define_global_const(mrb, "RUBY_VERSION", mrb_str_new_lit(mrb, MRUBY_RUBY_VERSION));
+ mrb_define_global_const(mrb, "RUBY_ENGINE", mrb_str_new_lit(mrb, MRUBY_RUBY_ENGINE));
+ mrb_define_global_const(mrb, "MRUBY_VERSION", mrb_str_new_lit(mrb, MRUBY_VERSION));
+ mrb_define_global_const(mrb, "MRUBY_RELEASE_DATE", mrb_str_new_lit(mrb, MRUBY_RELEASE_DATE));
+ mrb_define_global_const(mrb, "MRUBY_DESCRIPTION", mrb_str_new_lit(mrb, MRUBY_DESCRIPTION));
+ mrb_define_global_const(mrb, "MRUBY_COPYRIGHT", mrb_str_new_lit(mrb, MRUBY_COPYRIGHT));
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/vm.c Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,2403 @@
+/*
+** vm.c - virtual machine for mruby
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <stddef.h>
+#include <stdarg.h>
+#include <math.h>
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/hash.h"
+#include "mruby/irep.h"
+#include "mruby/numeric.h"
+#include "mruby/proc.h"
+#include "mruby/range.h"
+#include "mruby/string.h"
+#include "mruby/variable.h"
+#include "mruby/error.h"
+#include "mruby/opcode.h"
+#include "value_array.h"
+#include "mrb_throw.h"
+
+#ifndef ENABLE_STDIO
+#if defined(__cplusplus)
+extern "C" {
+#endif
+void abort(void);
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+#endif
+
+#define STACK_INIT_SIZE 128
+#define CALLINFO_INIT_SIZE 32
+
+/* Define amount of linear stack growth. */
+#ifndef MRB_STACK_GROWTH
+#define MRB_STACK_GROWTH 128
+#endif
+
+/* Maximum stack depth. Should be set lower on memory constrained systems.
+The value below allows about 60000 recursive calls in the simplest case. */
+#ifndef MRB_STACK_MAX
+#define MRB_STACK_MAX (0x40000 - MRB_STACK_GROWTH)
+#endif
+
+#ifdef VM_DEBUG
+# define DEBUG(x) (x)
+#else
+# define DEBUG(x)
+#endif
+
+#define ARENA_RESTORE(mrb,ai) (mrb)->arena_idx = (ai)
+
+static inline void
+stack_clear(mrb_value *from, size_t count)
+{
+#ifndef MRB_NAN_BOXING
+ const mrb_value mrb_value_zero = { { 0 } };
+
+ while (count-- > 0) {
+ *from++ = mrb_value_zero;
+ }
+#else
+ while (count-- > 0) {
+ SET_NIL_VALUE(*from);
+ from++;
+ }
+#endif
+}
+
+static inline void
+stack_copy(mrb_value *dst, const mrb_value *src, size_t size)
+{
+ while (size-- > 0) {
+ *dst++ = *src++;
+ }
+}
+
+static void
+stack_init(mrb_state *mrb)
+{
+ struct mrb_context *c = mrb->c;
+
+ /* mrb_assert(mrb->stack == NULL); */
+ c->stbase = (mrb_value *)mrb_calloc(mrb, STACK_INIT_SIZE, sizeof(mrb_value));
+ c->stend = c->stbase + STACK_INIT_SIZE;
+ c->stack = c->stbase;
+
+ /* mrb_assert(ci == NULL); */
+ c->cibase = (mrb_callinfo *)mrb_calloc(mrb, CALLINFO_INIT_SIZE, sizeof(mrb_callinfo));
+ c->ciend = c->cibase + CALLINFO_INIT_SIZE;
+ c->ci = c->cibase;
+ c->ci->target_class = mrb->object_class;
+ c->ci->stackent = c->stack;
+}
+
+static inline void
+envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase)
+{
+ mrb_callinfo *ci = mrb->c->cibase;
+
+ if (newbase == oldbase) return;
+ while (ci <= mrb->c->ci) {
+ struct REnv *e = ci->env;
+ if (e && MRB_ENV_STACK_SHARED_P(e)) {
+ ptrdiff_t off = e->stack - oldbase;
+
+ e->stack = newbase + off;
+ }
+ ci->stackent = newbase + (ci->stackent - oldbase);
+ ci++;
+ }
+}
+
+static inline void
+init_new_stack_space(mrb_state *mrb, int room, int keep)
+{
+ if (room > keep) {
+ /* do not leave uninitialized malloc region */
+ stack_clear(&(mrb->c->stack[keep]), room - keep);
+ }
+}
+
+/** def rec ; $deep =+ 1 ; if $deep > 1000 ; return 0 ; end ; rec ; end */
+
+static void
+stack_extend_alloc(mrb_state *mrb, int room, int keep)
+{
+ mrb_value *oldbase = mrb->c->stbase;
+ int size = mrb->c->stend - mrb->c->stbase;
+ int off = mrb->c->stack - mrb->c->stbase;
+
+#ifdef MRB_STACK_EXTEND_DOUBLING
+ if (room <= size)
+ size *= 2;
+ else
+ size += room;
+#else
+ /* Use linear stack growth.
+ It is slightly slower than doubling the stack space,
+ but it saves memory on small devices. */
+ if (room <= MRB_STACK_GROWTH)
+ size += MRB_STACK_GROWTH;
+ else
+ size += room;
+#endif
+
+ mrb->c->stbase = (mrb_value *)mrb_realloc(mrb, mrb->c->stbase, sizeof(mrb_value) * size);
+ mrb->c->stack = mrb->c->stbase + off;
+ mrb->c->stend = mrb->c->stbase + size;
+ envadjust(mrb, oldbase, mrb->c->stbase);
+
+ /* Raise an exception if the new stack size will be too large,
+ to prevent infinite recursion. However, do this only after resizing the stack, so mrb_raise has stack space to work with. */
+ if (size > MRB_STACK_MAX) {
+ init_new_stack_space(mrb, room, keep);
+ mrb_raise(mrb, E_SYSSTACK_ERROR, "stack level too deep. (limit=" MRB_STRINGIZE(MRB_STACK_MAX) ")");
+ }
+}
+
+static inline void
+stack_extend(mrb_state *mrb, int room, int keep)
+{
+ if (mrb->c->stack + room >= mrb->c->stend) {
+ stack_extend_alloc(mrb, room, keep);
+ }
+ init_new_stack_space(mrb, room, keep);
+}
+
+static inline struct REnv*
+uvenv(mrb_state *mrb, int up)
+{
+ struct REnv *e = mrb->c->ci->proc->env;
+
+ while (up--) {
+ if (!e) return NULL;
+ e = (struct REnv*)e->c;
+ }
+ return e;
+}
+
+static inline mrb_bool
+is_strict(mrb_state *mrb, struct REnv *e)
+{
+ int cioff = e->cioff;
+
+ if (MRB_ENV_STACK_SHARED_P(e) && mrb->c->cibase[cioff].proc &&
+ MRB_PROC_STRICT_P(mrb->c->cibase[cioff].proc)) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static inline struct REnv*
+top_env(mrb_state *mrb, struct RProc *proc)
+{
+ struct REnv *e = proc->env;
+
+ if (is_strict(mrb, e)) return e;
+ while (e->c) {
+ e = (struct REnv*)e->c;
+ if (is_strict(mrb, e)) return e;
+ }
+ return e;
+}
+
+#define CI_ACC_SKIP -1
+#define CI_ACC_DIRECT -2
+
+static mrb_callinfo*
+cipush(mrb_state *mrb)
+{
+ struct mrb_context *c = mrb->c;
+ mrb_callinfo *ci = c->ci;
+
+ int eidx = ci->eidx;
+ int ridx = ci->ridx;
+
+ if (ci + 1 == c->ciend) {
+ size_t size = ci - c->cibase;
+
+ c->cibase = (mrb_callinfo *)mrb_realloc(mrb, c->cibase, sizeof(mrb_callinfo)*size*2);
+ c->ci = c->cibase + size;
+ c->ciend = c->cibase + size * 2;
+ }
+ ci = ++c->ci;
+ ci->eidx = eidx;
+ ci->ridx = ridx;
+ ci->env = 0;
+ ci->pc = 0;
+ ci->err = 0;
+ ci->proc = 0;
+
+ return ci;
+}
+
+static void
+cipop(mrb_state *mrb)
+{
+ struct mrb_context *c = mrb->c;
+
+ if (c->ci->env) {
+ struct REnv *e = c->ci->env;
+ size_t len = (size_t)MRB_ENV_STACK_LEN(e);
+ mrb_value *p = (mrb_value *)mrb_malloc(mrb, sizeof(mrb_value)*len);
+
+ MRB_ENV_UNSHARE_STACK(e);
+ if (len > 0) {
+ stack_copy(p, e->stack, len);
+ }
+ e->stack = p;
+ mrb_write_barrier(mrb, (struct RBasic *)e);
+ }
+
+ c->ci--;
+}
+
+static void
+ecall(mrb_state *mrb, int i)
+{
+ struct RProc *p;
+ mrb_callinfo *ci;
+ mrb_value *self = mrb->c->stack;
+ struct RObject *exc;
+
+ p = mrb->c->ensure[i];
+ if (!p) return;
+ if (mrb->c->ci->eidx > i)
+ mrb->c->ci->eidx = i;
+ ci = cipush(mrb);
+ ci->stackent = mrb->c->stack;
+ ci->mid = ci[-1].mid;
+ ci->acc = CI_ACC_SKIP;
+ ci->argc = 0;
+ ci->proc = p;
+ ci->nregs = p->body.irep->nregs;
+ ci->target_class = p->target_class;
+ mrb->c->stack = mrb->c->stack + ci[-1].nregs;
+ exc = mrb->exc; mrb->exc = 0;
+ mrb_run(mrb, p, *self);
+ mrb->c->ensure[i] = NULL;
+ if (!mrb->exc) mrb->exc = exc;
+}
+
+#ifndef MRB_FUNCALL_ARGC_MAX
+#define MRB_FUNCALL_ARGC_MAX 16
+#endif
+
+MRB_API mrb_value
+mrb_funcall(mrb_state *mrb, mrb_value self, const char *name, mrb_int argc, ...)
+{
+ mrb_value argv[MRB_FUNCALL_ARGC_MAX];
+ va_list ap;
+ mrb_int i;
+ mrb_sym mid = mrb_intern_cstr(mrb, name);
+
+ if (argc > MRB_FUNCALL_ARGC_MAX) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "Too long arguments. (limit=" MRB_STRINGIZE(MRB_FUNCALL_ARGC_MAX) ")");
+ }
+
+ va_start(ap, argc);
+ for (i = 0; i < argc; i++) {
+ argv[i] = va_arg(ap, mrb_value);
+ }
+ va_end(ap);
+ return mrb_funcall_argv(mrb, self, mid, argc, argv);
+}
+
+MRB_API mrb_value
+mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc, const mrb_value *argv, mrb_value blk)
+{
+ mrb_value val;
+
+ if (!mrb->jmp) {
+ struct mrb_jmpbuf c_jmp;
+ mrb_callinfo *old_ci = mrb->c->ci;
+
+ MRB_TRY(&c_jmp) {
+ mrb->jmp = &c_jmp;
+ /* recursive call */
+ val = mrb_funcall_with_block(mrb, self, mid, argc, argv, blk);
+ mrb->jmp = 0;
+ }
+ MRB_CATCH(&c_jmp) { /* error */
+ while (old_ci != mrb->c->ci) {
+ mrb->c->stack = mrb->c->ci->stackent;
+ cipop(mrb);
+ }
+ mrb->jmp = 0;
+ val = mrb_obj_value(mrb->exc);
+ }
+ MRB_END_EXC(&c_jmp);
+ }
+ else {
+ struct RProc *p;
+ struct RClass *c;
+ mrb_sym undef = 0;
+ mrb_callinfo *ci;
+ int n;
+
+ if (!mrb->c->stack) {
+ stack_init(mrb);
+ }
+ n = mrb->c->ci->nregs;
+ if (argc < 0) {
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative argc for funcall (%S)", mrb_fixnum_value(argc));
+ }
+ c = mrb_class(mrb, self);
+ p = mrb_method_search_vm(mrb, &c, mid);
+ if (!p) {
+ undef = mid;
+ mid = mrb_intern_lit(mrb, "method_missing");
+ p = mrb_method_search_vm(mrb, &c, mid);
+ n++; argc++;
+ }
+ ci = cipush(mrb);
+ ci->mid = mid;
+ ci->proc = p;
+ ci->stackent = mrb->c->stack;
+ ci->argc = argc;
+ ci->target_class = c;
+ mrb->c->stack = mrb->c->stack + n;
+ if (MRB_PROC_CFUNC_P(p)) {
+ ci->nregs = argc + 2;
+ stack_extend(mrb, ci->nregs, 0);
+ }
+ else {
+ ci->nregs = p->body.irep->nregs + n;
+ stack_extend(mrb, ci->nregs, argc+2);
+ }
+ mrb->c->stack[0] = self;
+ if (undef) {
+ mrb->c->stack[1] = mrb_symbol_value(undef);
+ if (argc > 1) {
+ stack_copy(mrb->c->stack+2, argv, argc-1);
+ }
+ }
+ else if (argc > 0) {
+ stack_copy(mrb->c->stack+1, argv, argc);
+ }
+ mrb->c->stack[argc+1] = blk;
+
+ if (MRB_PROC_CFUNC_P(p)) {
+ int ai = mrb_gc_arena_save(mrb);
+
+ ci->acc = CI_ACC_DIRECT;
+ val = p->body.func(mrb, self);
+ mrb->c->stack = mrb->c->ci->stackent;
+ cipop(mrb);
+ mrb_gc_arena_restore(mrb, ai);
+ }
+ else {
+ ci->acc = CI_ACC_SKIP;
+ val = mrb_run(mrb, p, self);
+ }
+ }
+ mrb_gc_protect(mrb, val);
+ return val;
+}
+
+MRB_API mrb_value
+mrb_funcall_argv(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc, const mrb_value *argv)
+{
+ return mrb_funcall_with_block(mrb, self, mid, argc, argv, mrb_nil_value());
+}
+
+/* 15.3.1.3.4 */
+/* 15.3.1.3.44 */
+/*
+ * call-seq:
+ * obj.send(symbol [, args...]) -> obj
+ * obj.__send__(symbol [, args...]) -> obj
+ *
+ * Invokes the method identified by _symbol_, passing it any
+ * arguments specified. You can use <code>__send__</code> if the name
+ * +send+ clashes with an existing method in _obj_.
+ *
+ * class Klass
+ * def hello(*args)
+ * "Hello " + args.join(' ')
+ * end
+ * end
+ * k = Klass.new
+ * k.send :hello, "gentle", "readers" #=> "Hello gentle readers"
+ */
+MRB_API mrb_value
+mrb_f_send(mrb_state *mrb, mrb_value self)
+{
+ mrb_sym name;
+ mrb_value block, *argv, *regs;
+ mrb_int argc, i, len;
+ struct RProc *p;
+ struct RClass *c;
+ mrb_callinfo *ci;
+
+ mrb_get_args(mrb, "n*&", &name, &argv, &argc, &block);
+
+ c = mrb_class(mrb, self);
+ p = mrb_method_search_vm(mrb, &c, name);
+
+ if (!p) { /* call method_mising */
+ return mrb_funcall_with_block(mrb, self, name, argc, argv, block);
+ }
+
+ ci = mrb->c->ci;
+ ci->mid = name;
+ ci->target_class = c;
+ ci->proc = p;
+ regs = mrb->c->stack+1;
+ /* remove first symbol from arguments */
+ if (ci->argc >= 0) {
+ for (i=0,len=ci->argc; i<len; i++) {
+ regs[i] = regs[i+1];
+ }
+ ci->argc--;
+ }
+ else { /* variable length arguments */
+ mrb_ary_shift(mrb, regs[0]);
+ }
+
+ if (MRB_PROC_CFUNC_P(p)) {
+ return p->body.func(mrb, self);
+ }
+
+ ci->nregs = p->body.irep->nregs;
+ ci = cipush(mrb);
+ ci->nregs = 0;
+ ci->target_class = 0;
+ ci->pc = p->body.irep->iseq;
+ ci->stackent = mrb->c->stack;
+ ci->acc = 0;
+
+ return self;
+}
+
+static mrb_value
+eval_under(mrb_state *mrb, mrb_value self, mrb_value blk, struct RClass *c)
+{
+ struct RProc *p;
+ mrb_callinfo *ci;
+
+ if (mrb_nil_p(blk)) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
+ }
+ ci = mrb->c->ci;
+ if (ci->acc == CI_ACC_DIRECT) {
+ return mrb_yield_with_class(mrb, blk, 0, 0, self, c);
+ }
+ ci->target_class = c;
+ p = mrb_proc_ptr(blk);
+ ci->proc = p;
+ if (MRB_PROC_CFUNC_P(p)) {
+ return p->body.func(mrb, self);
+ }
+ ci->nregs = p->body.irep->nregs;
+ ci = cipush(mrb);
+ ci->nregs = 0;
+ ci->target_class = 0;
+ ci->pc = p->body.irep->iseq;
+ ci->stackent = mrb->c->stack;
+ ci->acc = 0;
+
+ return self;
+}
+
+/* 15.2.2.4.35 */
+/*
+ * call-seq:
+ * mod.class_eval {| | block } -> obj
+ * mod.module_eval {| | block } -> obj
+ *
+ * Evaluates block in the context of _mod_. This can
+ * be used to add methods to a class. <code>module_eval</code> returns
+ * the result of evaluating its argument.
+ */
+mrb_value
+mrb_mod_module_eval(mrb_state *mrb, mrb_value mod)
+{
+ mrb_value a, b;
+
+ if (mrb_get_args(mrb, "|S&", &a, &b) == 1) {
+ mrb_raise(mrb, E_NOTIMP_ERROR, "module_eval/class_eval with string not implemented");
+ }
+ return eval_under(mrb, mod, b, mrb_class_ptr(mod));
+}
+
+/* 15.3.1.3.18 */
+/*
+ * call-seq:
+ * obj.instance_eval {| | block } -> obj
+ *
+ * Evaluates the given block,within the context of the receiver (_obj_).
+ * In order to set the context, the variable +self+ is set to _obj_ while
+ * the code is executing, giving the code access to _obj_'s
+ * instance variables. In the version of <code>instance_eval</code>
+ * that takes a +String+, the optional second and third
+ * parameters supply a filename and starting line number that are used
+ * when reporting compilation errors.
+ *
+ * class KlassWithSecret
+ * def initialize
+ * @secret = 99
+ * end
+ * end
+ * k = KlassWithSecret.new
+ * k.instance_eval { @secret } #=> 99
+ */
+mrb_value
+mrb_obj_instance_eval(mrb_state *mrb, mrb_value self)
+{
+ mrb_value a, b;
+ mrb_value cv;
+ struct RClass *c;
+
+ if (mrb_get_args(mrb, "|S&", &a, &b) == 1) {
+ mrb_raise(mrb, E_NOTIMP_ERROR, "instance_eval with string not implemented");
+ }
+ switch (mrb_type(self)) {
+ case MRB_TT_SYMBOL:
+ case MRB_TT_FIXNUM:
+ case MRB_TT_FLOAT:
+ c = 0;
+ break;
+ default:
+ cv = mrb_singleton_class(mrb, self);
+ c = mrb_class_ptr(cv);
+ break;
+ }
+ return eval_under(mrb, self, b, c);
+}
+
+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)
+{
+ struct RProc *p;
+ mrb_sym mid = mrb->c->ci->mid;
+ mrb_callinfo *ci;
+ int n = mrb->c->ci->nregs;
+ mrb_value val;
+
+ if (mrb_nil_p(b)) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
+ }
+ p = mrb_proc_ptr(b);
+ ci = cipush(mrb);
+ ci->mid = mid;
+ ci->proc = p;
+ ci->stackent = mrb->c->stack;
+ ci->argc = argc;
+ ci->target_class = c;
+ ci->acc = CI_ACC_SKIP;
+ mrb->c->stack = mrb->c->stack + n;
+ if (MRB_PROC_CFUNC_P(p)) {
+ ci->nregs = argc + 2;
+ stack_extend(mrb, ci->nregs, 0);
+ }
+ else {
+ ci->nregs = p->body.irep->nregs;
+ stack_extend(mrb, ci->nregs, argc+2);
+ }
+
+ mrb->c->stack[0] = self;
+ if (argc > 0) {
+ stack_copy(mrb->c->stack+1, argv, argc);
+ }
+ mrb->c->stack[argc+1] = mrb_nil_value();
+
+ if (MRB_PROC_CFUNC_P(p)) {
+ val = p->body.func(mrb, self);
+ mrb->c->stack = mrb->c->ci->stackent;
+ cipop(mrb);
+ }
+ else {
+ val = mrb_run(mrb, p, self);
+ }
+ return val;
+}
+
+MRB_API mrb_value
+mrb_yield_argv(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value *argv)
+{
+ struct RProc *p = mrb_proc_ptr(b);
+
+ return mrb_yield_with_class(mrb, b, argc, argv, p->env->stack[0], p->target_class);
+}
+
+MRB_API mrb_value
+mrb_yield(mrb_state *mrb, mrb_value b, mrb_value arg)
+{
+ struct RProc *p = mrb_proc_ptr(b);
+
+ return mrb_yield_with_class(mrb, b, 1, &arg, p->env->stack[0], p->target_class);
+}
+
+typedef enum {
+ LOCALJUMP_ERROR_RETURN = 0,
+ LOCALJUMP_ERROR_BREAK = 1,
+ LOCALJUMP_ERROR_YIELD = 2
+} localjump_error_kind;
+
+static void
+localjump_error(mrb_state *mrb, localjump_error_kind kind)
+{
+ char kind_str[3][7] = { "return", "break", "yield" };
+ char kind_str_len[] = { 6, 5, 5 };
+ static const char lead[] = "unexpected ";
+ mrb_value msg;
+ mrb_value exc;
+
+ msg = mrb_str_buf_new(mrb, sizeof(lead) + 7);
+ mrb_str_cat(mrb, msg, lead, sizeof(lead) - 1);
+ mrb_str_cat(mrb, msg, kind_str[kind], kind_str_len[kind]);
+ exc = mrb_exc_new_str(mrb, E_LOCALJUMP_ERROR, msg);
+ mrb->exc = mrb_obj_ptr(exc);
+}
+
+static void
+argnum_error(mrb_state *mrb, mrb_int num)
+{
+ mrb_value exc;
+ mrb_value str;
+
+ if (mrb->c->ci->mid) {
+ str = mrb_format(mrb, "'%S': wrong number of arguments (%S for %S)",
+ mrb_sym2str(mrb, mrb->c->ci->mid),
+ mrb_fixnum_value(mrb->c->ci->argc), mrb_fixnum_value(num));
+ }
+ else {
+ str = mrb_format(mrb, "wrong number of arguments (%S for %S)",
+ mrb_fixnum_value(mrb->c->ci->argc), mrb_fixnum_value(num));
+ }
+ exc = mrb_exc_new_str(mrb, E_ARGUMENT_ERROR, str);
+ mrb->exc = mrb_obj_ptr(exc);
+}
+
+#define ERR_PC_SET(mrb, pc) mrb->c->ci->err = pc;
+#define ERR_PC_CLR(mrb) mrb->c->ci->err = 0;
+#ifdef ENABLE_DEBUG
+#define CODE_FETCH_HOOK(mrb, irep, pc, regs) if ((mrb)->code_fetch_hook) (mrb)->code_fetch_hook((mrb), (irep), (pc), (regs));
+#else
+#define CODE_FETCH_HOOK(mrb, irep, pc, regs)
+#endif
+
+#if defined __GNUC__ || defined __clang__ || defined __INTEL_COMPILER
+#define DIRECT_THREADED
+#endif
+
+#ifndef DIRECT_THREADED
+
+#define INIT_DISPATCH for (;;) { i = *pc; CODE_FETCH_HOOK(mrb, irep, pc, regs); switch (GET_OPCODE(i)) {
+#define CASE(op) case op:
+#define NEXT pc++; break
+#define JUMP break
+#define END_DISPATCH }}
+
+#else
+
+#define INIT_DISPATCH JUMP; return mrb_nil_value();
+#define CASE(op) L_ ## op:
+#define NEXT i=*++pc; CODE_FETCH_HOOK(mrb, irep, pc, regs); goto *optable[GET_OPCODE(i)]
+#define JUMP i=*pc; CODE_FETCH_HOOK(mrb, irep, pc, regs); goto *optable[GET_OPCODE(i)]
+
+#define END_DISPATCH
+
+#endif
+
+mrb_value mrb_gv_val_get(mrb_state *mrb, mrb_sym sym);
+void mrb_gv_val_set(mrb_state *mrb, mrb_sym sym, mrb_value val);
+
+#define CALL_MAXARGS 127
+
+MRB_API mrb_value
+mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep)
+{
+ /* mrb_assert(mrb_proc_cfunc_p(proc)) */
+ mrb_irep *irep = proc->body.irep;
+ mrb_code *pc = irep->iseq;
+ mrb_value *pool = irep->pool;
+ mrb_sym *syms = irep->syms;
+ mrb_value *regs = NULL;
+ mrb_code i;
+ int ai = mrb_gc_arena_save(mrb);
+ struct mrb_jmpbuf *prev_jmp = mrb->jmp;
+ struct mrb_jmpbuf c_jmp;
+
+#ifdef DIRECT_THREADED
+ static void *optable[] = {
+ &&L_OP_NOP, &&L_OP_MOVE,
+ &&L_OP_LOADL, &&L_OP_LOADI, &&L_OP_LOADSYM, &&L_OP_LOADNIL,
+ &&L_OP_LOADSELF, &&L_OP_LOADT, &&L_OP_LOADF,
+ &&L_OP_GETGLOBAL, &&L_OP_SETGLOBAL, &&L_OP_GETSPECIAL, &&L_OP_SETSPECIAL,
+ &&L_OP_GETIV, &&L_OP_SETIV, &&L_OP_GETCV, &&L_OP_SETCV,
+ &&L_OP_GETCONST, &&L_OP_SETCONST, &&L_OP_GETMCNST, &&L_OP_SETMCNST,
+ &&L_OP_GETUPVAR, &&L_OP_SETUPVAR,
+ &&L_OP_JMP, &&L_OP_JMPIF, &&L_OP_JMPNOT,
+ &&L_OP_ONERR, &&L_OP_RESCUE, &&L_OP_POPERR, &&L_OP_RAISE, &&L_OP_EPUSH, &&L_OP_EPOP,
+ &&L_OP_SEND, &&L_OP_SENDB, &&L_OP_FSEND,
+ &&L_OP_CALL, &&L_OP_SUPER, &&L_OP_ARGARY, &&L_OP_ENTER,
+ &&L_OP_KARG, &&L_OP_KDICT, &&L_OP_RETURN, &&L_OP_TAILCALL, &&L_OP_BLKPUSH,
+ &&L_OP_ADD, &&L_OP_ADDI, &&L_OP_SUB, &&L_OP_SUBI, &&L_OP_MUL, &&L_OP_DIV,
+ &&L_OP_EQ, &&L_OP_LT, &&L_OP_LE, &&L_OP_GT, &&L_OP_GE,
+ &&L_OP_ARRAY, &&L_OP_ARYCAT, &&L_OP_ARYPUSH, &&L_OP_AREF, &&L_OP_ASET, &&L_OP_APOST,
+ &&L_OP_STRING, &&L_OP_STRCAT, &&L_OP_HASH,
+ &&L_OP_LAMBDA, &&L_OP_RANGE, &&L_OP_OCLASS,
+ &&L_OP_CLASS, &&L_OP_MODULE, &&L_OP_EXEC,
+ &&L_OP_METHOD, &&L_OP_SCLASS, &&L_OP_TCLASS,
+ &&L_OP_DEBUG, &&L_OP_STOP, &&L_OP_ERR,
+ };
+#endif
+
+ mrb_bool exc_catched = FALSE;
+RETRY_TRY_BLOCK:
+
+ MRB_TRY(&c_jmp) {
+
+ if (exc_catched) {
+ exc_catched = FALSE;
+ goto L_RAISE;
+ }
+ mrb->jmp = &c_jmp;
+ if (!mrb->c->stack) {
+ stack_init(mrb);
+ }
+ stack_extend(mrb, irep->nregs, stack_keep);
+ mrb->c->ci->proc = proc;
+ mrb->c->ci->nregs = irep->nregs;
+ regs = mrb->c->stack;
+ regs[0] = self;
+
+ INIT_DISPATCH {
+ CASE(OP_NOP) {
+ /* do nothing */
+ NEXT;
+ }
+
+ CASE(OP_MOVE) {
+ /* A B R(A) := R(B) */
+ regs[GETARG_A(i)] = regs[GETARG_B(i)];
+ NEXT;
+ }
+
+ CASE(OP_LOADL) {
+ /* A Bx R(A) := Pool(Bx) */
+ regs[GETARG_A(i)] = pool[GETARG_Bx(i)];
+ NEXT;
+ }
+
+ CASE(OP_LOADI) {
+ /* A sBx R(A) := sBx */
+ SET_INT_VALUE(regs[GETARG_A(i)], GETARG_sBx(i));
+ NEXT;
+ }
+
+ CASE(OP_LOADSYM) {
+ /* A Bx R(A) := Syms(Bx) */
+ SET_SYM_VALUE(regs[GETARG_A(i)], syms[GETARG_Bx(i)]);
+ NEXT;
+ }
+
+ CASE(OP_LOADSELF) {
+ /* A R(A) := self */
+ regs[GETARG_A(i)] = regs[0];
+ NEXT;
+ }
+
+ CASE(OP_LOADT) {
+ /* A R(A) := true */
+ SET_TRUE_VALUE(regs[GETARG_A(i)]);
+ NEXT;
+ }
+
+ CASE(OP_LOADF) {
+ /* A R(A) := false */
+ SET_FALSE_VALUE(regs[GETARG_A(i)]);
+ NEXT;
+ }
+
+ CASE(OP_GETGLOBAL) {
+ /* A Bx R(A) := getglobal(Syms(Bx)) */
+ regs[GETARG_A(i)] = mrb_gv_get(mrb, syms[GETARG_Bx(i)]);
+ NEXT;
+ }
+
+ CASE(OP_SETGLOBAL) {
+ /* setglobal(Syms(Bx), R(A)) */
+ mrb_gv_set(mrb, syms[GETARG_Bx(i)], regs[GETARG_A(i)]);
+ NEXT;
+ }
+
+ CASE(OP_GETSPECIAL) {
+ /* A Bx R(A) := Special[Bx] */
+ regs[GETARG_A(i)] = mrb_vm_special_get(mrb, GETARG_Bx(i));
+ NEXT;
+ }
+
+ CASE(OP_SETSPECIAL) {
+ /* A Bx Special[Bx] := R(A) */
+ mrb_vm_special_set(mrb, GETARG_Bx(i), regs[GETARG_A(i)]);
+ NEXT;
+ }
+
+ CASE(OP_GETIV) {
+ /* A Bx R(A) := ivget(Bx) */
+ regs[GETARG_A(i)] = mrb_vm_iv_get(mrb, syms[GETARG_Bx(i)]);
+ NEXT;
+ }
+
+ CASE(OP_SETIV) {
+ /* ivset(Syms(Bx),R(A)) */
+ mrb_vm_iv_set(mrb, syms[GETARG_Bx(i)], regs[GETARG_A(i)]);
+ NEXT;
+ }
+
+ CASE(OP_GETCV) {
+ /* A Bx R(A) := cvget(Syms(Bx)) */
+ ERR_PC_SET(mrb, pc);
+ regs[GETARG_A(i)] = mrb_vm_cv_get(mrb, syms[GETARG_Bx(i)]);
+ ERR_PC_CLR(mrb);
+ NEXT;
+ }
+
+ CASE(OP_SETCV) {
+ /* cvset(Syms(Bx),R(A)) */
+ mrb_vm_cv_set(mrb, syms[GETARG_Bx(i)], regs[GETARG_A(i)]);
+ NEXT;
+ }
+
+ CASE(OP_GETCONST) {
+ /* A Bx R(A) := constget(Syms(Bx)) */
+ mrb_value val;
+
+ ERR_PC_SET(mrb, pc);
+ val = mrb_vm_const_get(mrb, syms[GETARG_Bx(i)]);
+ ERR_PC_CLR(mrb);
+ regs = mrb->c->stack;
+ regs[GETARG_A(i)] = val;
+ NEXT;
+ }
+
+ CASE(OP_SETCONST) {
+ /* A Bx constset(Syms(Bx),R(A)) */
+ mrb_vm_const_set(mrb, syms[GETARG_Bx(i)], regs[GETARG_A(i)]);
+ NEXT;
+ }
+
+ CASE(OP_GETMCNST) {
+ /* A Bx R(A) := R(A)::Syms(Bx) */
+ mrb_value val;
+ int a = GETARG_A(i);
+
+ ERR_PC_SET(mrb, pc);
+ val = mrb_const_get(mrb, regs[a], syms[GETARG_Bx(i)]);
+ ERR_PC_CLR(mrb);
+ regs = mrb->c->stack;
+ regs[a] = val;
+ NEXT;
+ }
+
+ CASE(OP_SETMCNST) {
+ /* A Bx R(A+1)::Syms(Bx) := R(A) */
+ int a = GETARG_A(i);
+
+ mrb_const_set(mrb, regs[a+1], syms[GETARG_Bx(i)], regs[a]);
+ NEXT;
+ }
+
+ CASE(OP_GETUPVAR) {
+ /* A B C R(A) := uvget(B,C) */
+ mrb_value *regs_a = regs + GETARG_A(i);
+ int up = GETARG_C(i);
+
+ struct REnv *e = uvenv(mrb, up);
+
+ if (!e) {
+ *regs_a = mrb_nil_value();
+ }
+ else {
+ int idx = GETARG_B(i);
+ *regs_a = e->stack[idx];
+ }
+ NEXT;
+ }
+
+ CASE(OP_SETUPVAR) {
+ /* A B C uvset(B,C,R(A)) */
+ int up = GETARG_C(i);
+
+ struct REnv *e = uvenv(mrb, up);
+
+ if (e) {
+ mrb_value *regs_a = regs + GETARG_A(i);
+ int idx = GETARG_B(i);
+ e->stack[idx] = *regs_a;
+ mrb_write_barrier(mrb, (struct RBasic*)e);
+ }
+ NEXT;
+ }
+
+ CASE(OP_JMP) {
+ /* sBx pc+=sBx */
+ pc += GETARG_sBx(i);
+ JUMP;
+ }
+
+ CASE(OP_JMPIF) {
+ /* A sBx if R(A) pc+=sBx */
+ if (mrb_test(regs[GETARG_A(i)])) {
+ pc += GETARG_sBx(i);
+ JUMP;
+ }
+ NEXT;
+ }
+
+ CASE(OP_JMPNOT) {
+ /* A sBx if !R(A) pc+=sBx */
+ if (!mrb_test(regs[GETARG_A(i)])) {
+ pc += GETARG_sBx(i);
+ JUMP;
+ }
+ NEXT;
+ }
+
+ CASE(OP_ONERR) {
+ /* sBx pc+=sBx on exception */
+ if (mrb->c->rsize <= mrb->c->ci->ridx) {
+ if (mrb->c->rsize == 0) mrb->c->rsize = 16;
+ else mrb->c->rsize *= 2;
+ mrb->c->rescue = (mrb_code **)mrb_realloc(mrb, mrb->c->rescue, sizeof(mrb_code*) * mrb->c->rsize);
+ }
+ mrb->c->rescue[mrb->c->ci->ridx++] = pc + GETARG_sBx(i);
+ NEXT;
+ }
+
+ CASE(OP_RESCUE) {
+ /* A R(A) := exc; clear(exc) */
+ SET_OBJ_VALUE(regs[GETARG_A(i)], mrb->exc);
+ mrb->exc = 0;
+ NEXT;
+ }
+
+ CASE(OP_POPERR) {
+ /* A A.times{rescue_pop()} */
+ int a = GETARG_A(i);
+
+ while (a--) {
+ mrb->c->ci->ridx--;
+ }
+ NEXT;
+ }
+
+ CASE(OP_RAISE) {
+ /* A raise(R(A)) */
+ mrb->exc = mrb_obj_ptr(regs[GETARG_A(i)]);
+ goto L_RAISE;
+ }
+
+ CASE(OP_EPUSH) {
+ /* Bx ensure_push(SEQ[Bx]) */
+ struct RProc *p;
+
+ p = mrb_closure_new(mrb, irep->reps[GETARG_Bx(i)]);
+ /* push ensure_stack */
+ if (mrb->c->esize <= mrb->c->ci->eidx) {
+ if (mrb->c->esize == 0) mrb->c->esize = 16;
+ else mrb->c->esize *= 2;
+ mrb->c->ensure = (struct RProc **)mrb_realloc(mrb, mrb->c->ensure, sizeof(struct RProc*) * mrb->c->esize);
+ }
+ mrb->c->ensure[mrb->c->ci->eidx++] = p;
+ ARENA_RESTORE(mrb, ai);
+ NEXT;
+ }
+
+ CASE(OP_EPOP) {
+ /* A A.times{ensure_pop().call} */
+ int a = GETARG_A(i);
+ mrb_callinfo *ci = mrb->c->ci;
+ int n, eidx = ci->eidx;
+
+ for (n=0; n<a && eidx > ci[-1].eidx; n++) {
+ ecall(mrb, --eidx);
+ ARENA_RESTORE(mrb, ai);
+ }
+ NEXT;
+ }
+
+ CASE(OP_LOADNIL) {
+ /* A R(A) := nil */
+ int a = GETARG_A(i);
+
+ SET_NIL_VALUE(regs[a]);
+ NEXT;
+ }
+
+ CASE(OP_SENDB) {
+ /* A B C R(A) := call(R(A),Syms(B),R(A+1),...,R(A+C),&R(A+C+1))*/
+ /* fall through */
+ };
+
+ L_SEND:
+ CASE(OP_SEND) {
+ /* A B C R(A) := call(R(A),Syms(B),R(A+1),...,R(A+C)) */
+ int a = GETARG_A(i);
+ int n = GETARG_C(i);
+ struct RProc *m;
+ struct RClass *c;
+ mrb_callinfo *ci;
+ mrb_value recv, result;
+ mrb_sym mid = syms[GETARG_B(i)];
+
+ recv = regs[a];
+ if (GET_OPCODE(i) != OP_SENDB) {
+ if (n == CALL_MAXARGS) {
+ SET_NIL_VALUE(regs[a+2]);
+ }
+ else {
+ SET_NIL_VALUE(regs[a+n+1]);
+ }
+ }
+ c = mrb_class(mrb, recv);
+ m = mrb_method_search_vm(mrb, &c, mid);
+ if (!m) {
+ mrb_value sym = mrb_symbol_value(mid);
+
+ mid = mrb_intern_lit(mrb, "method_missing");
+ m = mrb_method_search_vm(mrb, &c, mid);
+ if (n == CALL_MAXARGS) {
+ mrb_ary_unshift(mrb, regs[a+1], sym);
+ }
+ else {
+ value_move(regs+a+2, regs+a+1, ++n);
+ regs[a+1] = sym;
+ }
+ }
+
+ /* push callinfo */
+ ci = cipush(mrb);
+ ci->mid = mid;
+ ci->proc = m;
+ ci->stackent = mrb->c->stack;
+ if (c->tt == MRB_TT_ICLASS) {
+ ci->target_class = c->c;
+ }
+ else {
+ ci->target_class = c;
+ }
+
+ ci->pc = pc + 1;
+ ci->acc = a;
+
+ /* prepare stack */
+ mrb->c->stack += a;
+
+ if (MRB_PROC_CFUNC_P(m)) {
+ if (n == CALL_MAXARGS) {
+ ci->argc = -1;
+ ci->nregs = 3;
+ }
+ else {
+ ci->argc = n;
+ ci->nregs = n + 2;
+ }
+ result = m->body.func(mrb, recv);
+ mrb->c->stack[0] = result;
+ mrb_gc_arena_restore(mrb, ai);
+ if (mrb->exc) goto L_RAISE;
+ /* pop stackpos */
+ ci = mrb->c->ci;
+ if (!ci->target_class) { /* return from context modifying method (resume/yield) */
+ if (!MRB_PROC_CFUNC_P(ci[-1].proc)) {
+ proc = ci[-1].proc;
+ irep = proc->body.irep;
+ pool = irep->pool;
+ syms = irep->syms;
+ }
+ }
+ regs = mrb->c->stack = ci->stackent;
+ pc = ci->pc;
+ cipop(mrb);
+ JUMP;
+ }
+ else {
+ /* setup environment for calling method */
+ proc = mrb->c->ci->proc = m;
+ irep = m->body.irep;
+ pool = irep->pool;
+ syms = irep->syms;
+ ci->nregs = irep->nregs;
+ if (n == CALL_MAXARGS) {
+ ci->argc = -1;
+ stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
+ }
+ else {
+ ci->argc = n;
+ stack_extend(mrb, irep->nregs, n+2);
+ }
+ regs = mrb->c->stack;
+ pc = irep->iseq;
+ JUMP;
+ }
+ }
+
+ CASE(OP_FSEND) {
+ /* A B C R(A) := fcall(R(A),Syms(B),R(A+1),... ,R(A+C-1)) */
+ NEXT;
+ }
+
+ CASE(OP_CALL) {
+ /* A R(A) := self.call(frame.argc, frame.argv) */
+ mrb_callinfo *ci;
+ mrb_value recv = mrb->c->stack[0];
+ struct RProc *m = mrb_proc_ptr(recv);
+
+ /* replace callinfo */
+ ci = mrb->c->ci;
+ ci->target_class = m->target_class;
+ ci->proc = m;
+ if (m->env) {
+ if (m->env->mid) {
+ ci->mid = m->env->mid;
+ }
+ if (!m->env->stack) {
+ m->env->stack = mrb->c->stack;
+ }
+ }
+
+ /* prepare stack */
+ if (MRB_PROC_CFUNC_P(m)) {
+ recv = m->body.func(mrb, recv);
+ mrb_gc_arena_restore(mrb, ai);
+ if (mrb->exc) goto L_RAISE;
+ /* pop stackpos */
+ ci = mrb->c->ci;
+ regs = mrb->c->stack = ci->stackent;
+ regs[ci->acc] = recv;
+ pc = ci->pc;
+ cipop(mrb);
+ irep = mrb->c->ci->proc->body.irep;
+ pool = irep->pool;
+ syms = irep->syms;
+ JUMP;
+ }
+ else {
+ /* setup environment for calling method */
+ proc = m;
+ irep = m->body.irep;
+ if (!irep) {
+ mrb->c->stack[0] = mrb_nil_value();
+ goto L_RETURN;
+ }
+ pool = irep->pool;
+ syms = irep->syms;
+ ci->nregs = irep->nregs;
+ if (ci->argc < 0) {
+ stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
+ }
+ else {
+ stack_extend(mrb, irep->nregs, ci->argc+2);
+ }
+ regs = mrb->c->stack;
+ regs[0] = m->env->stack[0];
+ pc = irep->iseq;
+ JUMP;
+ }
+ }
+
+ CASE(OP_SUPER) {
+ /* A C R(A) := super(R(A+1),... ,R(A+C+1)) */
+ mrb_value recv;
+ mrb_callinfo *ci = mrb->c->ci;
+ struct RProc *m;
+ struct RClass *c;
+ mrb_sym mid = ci->mid;
+ int a = GETARG_A(i);
+ int n = GETARG_C(i);
+
+ recv = regs[0];
+ c = mrb->c->ci->target_class->super;
+ m = mrb_method_search_vm(mrb, &c, mid);
+ if (!m) {
+ mid = mrb_intern_lit(mrb, "method_missing");
+ m = mrb_method_search_vm(mrb, &c, mid);
+ if (n == CALL_MAXARGS) {
+ mrb_ary_unshift(mrb, regs[a+1], mrb_symbol_value(ci->mid));
+ }
+ else {
+ value_move(regs+a+2, regs+a+1, ++n);
+ SET_SYM_VALUE(regs[a+1], ci->mid);
+ }
+ }
+
+ /* push callinfo */
+ ci = cipush(mrb);
+ ci->mid = mid;
+ ci->proc = m;
+ ci->stackent = mrb->c->stack;
+ if (n == CALL_MAXARGS) {
+ ci->argc = -1;
+ }
+ else {
+ ci->argc = n;
+ }
+ ci->target_class = c;
+ ci->pc = pc + 1;
+
+ /* prepare stack */
+ mrb->c->stack += a;
+ mrb->c->stack[0] = recv;
+
+ if (MRB_PROC_CFUNC_P(m)) {
+ ci->nregs = 0;
+ mrb->c->stack[0] = m->body.func(mrb, recv);
+ mrb_gc_arena_restore(mrb, ai);
+ if (mrb->exc) goto L_RAISE;
+ /* pop stackpos */
+ regs = mrb->c->stack = mrb->c->ci->stackent;
+ cipop(mrb);
+ NEXT;
+ }
+ else {
+ /* fill callinfo */
+ ci->acc = a;
+
+ /* setup environment for calling method */
+ ci->proc = m;
+ irep = m->body.irep;
+ pool = irep->pool;
+ syms = irep->syms;
+ ci->nregs = irep->nregs;
+ if (n == CALL_MAXARGS) {
+ stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
+ }
+ else {
+ stack_extend(mrb, irep->nregs, ci->argc+2);
+ }
+ regs = mrb->c->stack;
+ pc = irep->iseq;
+ JUMP;
+ }
+ }
+
+ CASE(OP_ARGARY) {
+ /* A Bx R(A) := argument array (16=6:1:5:4) */
+ int a = GETARG_A(i);
+ int bx = GETARG_Bx(i);
+ int m1 = (bx>>10)&0x3f;
+ int r = (bx>>9)&0x1;
+ int m2 = (bx>>4)&0x1f;
+ int lv = (bx>>0)&0xf;
+ mrb_value *stack;
+
+ if (lv == 0) stack = regs + 1;
+ else {
+ struct REnv *e = uvenv(mrb, lv-1);
+ if (!e) {
+ mrb_value exc;
+ exc = mrb_exc_new_str_lit(mrb, E_NOMETHOD_ERROR, "super called outside of method");
+ mrb->exc = mrb_obj_ptr(exc);
+ goto L_RAISE;
+ }
+ stack = e->stack + 1;
+ }
+ if (r == 0) {
+ regs[a] = mrb_ary_new_from_values(mrb, m1+m2, stack);
+ }
+ else {
+ mrb_value *pp = NULL;
+ struct RArray *rest;
+ int len = 0;
+
+ if (mrb_array_p(stack[m1])) {
+ struct RArray *ary = mrb_ary_ptr(stack[m1]);
+
+ pp = ary->ptr;
+ len = ary->len;
+ }
+ regs[a] = mrb_ary_new_capa(mrb, m1+len+m2);
+ rest = mrb_ary_ptr(regs[a]);
+ if (m1 > 0) {
+ stack_copy(rest->ptr, stack, m1);
+ }
+ if (len > 0) {
+ stack_copy(rest->ptr+m1, pp, len);
+ }
+ if (m2 > 0) {
+ stack_copy(rest->ptr+m1+len, stack+m1+1, m2);
+ }
+ rest->len = m1+len+m2;
+ }
+ regs[a+1] = stack[m1+r+m2];
+ ARENA_RESTORE(mrb, ai);
+ NEXT;
+ }
+
+ CASE(OP_ENTER) {
+ /* Ax arg setup according to flags (23=5:5:1:5:5:1:1) */
+ /* number of optional arguments times OP_JMP should follow */
+ mrb_aspec ax = GETARG_Ax(i);
+ int m1 = MRB_ASPEC_REQ(ax);
+ int o = MRB_ASPEC_OPT(ax);
+ int r = MRB_ASPEC_REST(ax);
+ int m2 = MRB_ASPEC_POST(ax);
+ /* unused
+ int k = MRB_ASPEC_KEY(ax);
+ int kd = MRB_ASPEC_KDICT(ax);
+ int b = MRB_ASPEC_BLOCK(ax);
+ */
+ int argc = mrb->c->ci->argc;
+ mrb_value *argv = regs+1;
+ mrb_value *argv0 = argv;
+ int len = m1 + o + r + m2;
+ mrb_value *blk = &argv[argc < 0 ? 1 : argc];
+
+ if (!mrb_nil_p(*blk) && mrb_type(*blk) != MRB_TT_PROC) {
+ *blk = mrb_convert_type(mrb, *blk, MRB_TT_PROC, "Proc", "to_proc");
+ }
+ if (argc < 0) {
+ struct RArray *ary = mrb_ary_ptr(regs[1]);
+ argv = ary->ptr;
+ argc = ary->len;
+ mrb_gc_protect(mrb, regs[1]);
+ }
+ if (mrb->c->ci->proc && MRB_PROC_STRICT_P(mrb->c->ci->proc)) {
+ if (argc >= 0) {
+ if (argc < m1 + m2 || (r == 0 && argc > len)) {
+ argnum_error(mrb, m1+m2);
+ goto L_RAISE;
+ }
+ }
+ }
+ else if (len > 1 && argc == 1 && mrb_array_p(argv[0])) {
+ mrb_gc_protect(mrb, argv[0]);
+ argc = mrb_ary_ptr(argv[0])->len;
+ argv = mrb_ary_ptr(argv[0])->ptr;
+ }
+ mrb->c->ci->argc = len;
+ if (argc < len) {
+ int mlen = m2;
+ if (argc < m1+m2) {
+ if (m1 < argc)
+ mlen = argc - m1;
+ else
+ mlen = 0;
+ }
+ regs[len+1] = *blk; /* move block */
+ SET_NIL_VALUE(regs[argc+1]);
+ if (argv0 != argv) {
+ value_move(®s[1], argv, argc-mlen); /* m1 + o */
+ }
+ if (mlen) {
+ value_move(®s[len-m2+1], &argv[argc-mlen], mlen);
+ }
+ if (r) {
+ regs[m1+o+1] = mrb_ary_new_capa(mrb, 0);
+ }
+ if (o == 0 || argc < m1+m2) pc++;
+ else
+ pc += argc - m1 - m2 + 1;
+ }
+ else {
+ int rnum = 0;
+ if (argv0 != argv) {
+ regs[len+1] = *blk; /* move block */
+ value_move(®s[1], argv, m1+o);
+ }
+ if (r) {
+ rnum = argc-m1-o-m2;
+ regs[m1+o+1] = mrb_ary_new_from_values(mrb, rnum, argv+m1+o);
+ }
+ if (m2) {
+ if (argc-m2 > m1) {
+ value_move(®s[m1+o+r+1], &argv[m1+o+rnum], m2);
+ }
+ }
+ if (argv0 == argv) {
+ regs[len+1] = *blk; /* move block */
+ }
+ pc += o + 1;
+ }
+ JUMP;
+ }
+
+ CASE(OP_KARG) {
+ /* A B C R(A) := kdict[Syms(B)]; if C kdict.rm(Syms(B)) */
+ /* if C == 2; raise unless kdict.empty? */
+ /* OP_JMP should follow to skip init code */
+ NEXT;
+ }
+
+ CASE(OP_KDICT) {
+ /* A C R(A) := kdict */
+ NEXT;
+ }
+
+ L_RETURN:
+ i = MKOP_AB(OP_RETURN, GETARG_A(i), OP_R_NORMAL);
+ /* fall through */
+ CASE(OP_RETURN) {
+ /* A B return R(A) (B=normal,in-block return/break) */
+ if (mrb->exc) {
+ mrb_callinfo *ci;
+ int eidx;
+
+ L_RAISE:
+ ci = mrb->c->ci;
+ mrb_obj_iv_ifnone(mrb, mrb->exc, mrb_intern_lit(mrb, "lastpc"), mrb_cptr_value(mrb, pc));
+ mrb_obj_iv_ifnone(mrb, mrb->exc, mrb_intern_lit(mrb, "ciidx"), mrb_fixnum_value(ci - mrb->c->cibase));
+ eidx = ci->eidx;
+ if (ci == mrb->c->cibase) {
+ if (ci->ridx == 0) goto L_STOP;
+ goto L_RESCUE;
+ }
+ while (eidx > ci[-1].eidx) {
+ ecall(mrb, --eidx);
+ }
+ while (ci[0].ridx == ci[-1].ridx) {
+ cipop(mrb);
+ ci = mrb->c->ci;
+ mrb->c->stack = ci[1].stackent;
+ if (ci[1].acc == CI_ACC_SKIP && prev_jmp) {
+ mrb->jmp = prev_jmp;
+ MRB_THROW(prev_jmp);
+ }
+ if (ci > mrb->c->cibase) {
+ while (eidx > ci[-1].eidx) {
+ ecall(mrb, --eidx);
+ }
+ }
+ else if (ci == mrb->c->cibase) {
+ if (ci->ridx == 0) {
+ if (mrb->c == mrb->root_c) {
+ regs = mrb->c->stack = mrb->c->stbase;
+ goto L_STOP;
+ }
+ else {
+ struct mrb_context *c = mrb->c;
+
+ mrb->c = c->prev;
+ c->prev = NULL;
+ goto L_RAISE;
+ }
+ }
+ break;
+ }
+ }
+ L_RESCUE:
+ if (ci->ridx == 0) goto L_STOP;
+ proc = ci->proc;
+ irep = proc->body.irep;
+ pool = irep->pool;
+ syms = irep->syms;
+ regs = mrb->c->stack = ci[1].stackent;
+ pc = mrb->c->rescue[--ci->ridx];
+ }
+ else {
+ mrb_callinfo *ci = mrb->c->ci;
+ int acc, eidx = mrb->c->ci->eidx;
+ mrb_value v = regs[GETARG_A(i)];
+
+ switch (GETARG_B(i)) {
+ case OP_R_RETURN:
+ /* Fall through to OP_R_NORMAL otherwise */
+ if (proc->env && !MRB_PROC_STRICT_P(proc)) {
+ struct REnv *e = top_env(mrb, proc);
+
+ if (!MRB_ENV_STACK_SHARED_P(e)) {
+ localjump_error(mrb, LOCALJUMP_ERROR_RETURN);
+ goto L_RAISE;
+ }
+ ci = mrb->c->cibase + e->cioff;
+ if (ci == mrb->c->cibase) {
+ localjump_error(mrb, LOCALJUMP_ERROR_RETURN);
+ goto L_RAISE;
+ }
+ mrb->c->ci = ci;
+ break;
+ }
+ case OP_R_NORMAL:
+ if (ci == mrb->c->cibase) {
+ if (!mrb->c->prev) { /* toplevel return */
+ localjump_error(mrb, LOCALJUMP_ERROR_RETURN);
+ goto L_RAISE;
+ }
+ if (mrb->c->prev->ci == mrb->c->prev->cibase) {
+ mrb_value exc = mrb_exc_new_str_lit(mrb, E_FIBER_ERROR, "double resume");
+ mrb->exc = mrb_obj_ptr(exc);
+ goto L_RAISE;
+ }
+ /* automatic yield at the end */
+ mrb->c->status = MRB_FIBER_TERMINATED;
+ mrb->c = mrb->c->prev;
+ mrb->c->status = MRB_FIBER_RUNNING;
+ }
+ ci = mrb->c->ci;
+ break;
+ case OP_R_BREAK:
+ if (!proc->env || !MRB_ENV_STACK_SHARED_P(proc->env)) {
+ localjump_error(mrb, LOCALJUMP_ERROR_BREAK);
+ goto L_RAISE;
+ }
+ /* break from fiber block */
+ if (mrb->c->ci == mrb->c->cibase && mrb->c->ci->pc) {
+ struct mrb_context *c = mrb->c;
+
+ mrb->c = c->prev;
+ c->prev = NULL;
+ }
+ ci = mrb->c->ci;
+ mrb->c->ci = mrb->c->cibase + proc->env->cioff + 1;
+ while (ci > mrb->c->ci) {
+ if (ci[-1].acc == CI_ACC_SKIP) {
+ mrb->c->ci = ci;
+ break;
+ }
+ ci--;
+ }
+ break;
+ default:
+ /* cannot happen */
+ break;
+ }
+ while (eidx > mrb->c->ci[-1].eidx) {
+ ecall(mrb, --eidx);
+ }
+ cipop(mrb);
+ acc = ci->acc;
+ pc = ci->pc;
+ regs = mrb->c->stack = ci->stackent;
+ if (acc == CI_ACC_SKIP) {
+ mrb->jmp = prev_jmp;
+ return v;
+ }
+ DEBUG(printf("from :%s\n", mrb_sym2name(mrb, ci->mid)));
+ proc = mrb->c->ci->proc;
+ irep = proc->body.irep;
+ pool = irep->pool;
+ syms = irep->syms;
+
+ regs[acc] = v;
+ }
+ JUMP;
+ }
+
+ CASE(OP_TAILCALL) {
+ /* A B C return call(R(A),Syms(B),R(A+1),... ,R(A+C+1)) */
+ int a = GETARG_A(i);
+ int n = GETARG_C(i);
+ struct RProc *m;
+ struct RClass *c;
+ mrb_callinfo *ci;
+ mrb_value recv;
+ mrb_sym mid = syms[GETARG_B(i)];
+
+ recv = regs[a];
+ c = mrb_class(mrb, recv);
+ m = mrb_method_search_vm(mrb, &c, mid);
+ if (!m) {
+ mrb_value sym = mrb_symbol_value(mid);
+
+ mid = mrb_intern_lit(mrb, "method_missing");
+ m = mrb_method_search_vm(mrb, &c, mid);
+ if (n == CALL_MAXARGS) {
+ mrb_ary_unshift(mrb, regs[a+1], sym);
+ }
+ else {
+ value_move(regs+a+2, regs+a+1, ++n);
+ regs[a+1] = sym;
+ }
+ }
+
+ /* replace callinfo */
+ ci = mrb->c->ci;
+ ci->mid = mid;
+ ci->target_class = c;
+ if (n == CALL_MAXARGS) {
+ ci->argc = -1;
+ }
+ else {
+ ci->argc = n;
+ }
+
+ /* move stack */
+ value_move(mrb->c->stack, ®s[a], ci->argc+1);
+
+ if (MRB_PROC_CFUNC_P(m)) {
+ mrb->c->stack[0] = m->body.func(mrb, recv);
+ mrb_gc_arena_restore(mrb, ai);
+ goto L_RETURN;
+ }
+ else {
+ /* setup environment for calling method */
+ irep = m->body.irep;
+ pool = irep->pool;
+ syms = irep->syms;
+ if (ci->argc < 0) {
+ stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
+ }
+ else {
+ stack_extend(mrb, irep->nregs, ci->argc+2);
+ }
+ regs = mrb->c->stack;
+ pc = irep->iseq;
+ }
+ JUMP;
+ }
+
+ CASE(OP_BLKPUSH) {
+ /* A Bx R(A) := block (16=6:1:5:4) */
+ int a = GETARG_A(i);
+ int bx = GETARG_Bx(i);
+ int m1 = (bx>>10)&0x3f;
+ int r = (bx>>9)&0x1;
+ int m2 = (bx>>4)&0x1f;
+ int lv = (bx>>0)&0xf;
+ mrb_value *stack;
+
+ if (lv == 0) stack = regs + 1;
+ else {
+ struct REnv *e = uvenv(mrb, lv-1);
+ if (!e) {
+ localjump_error(mrb, LOCALJUMP_ERROR_YIELD);
+ goto L_RAISE;
+ }
+ stack = e->stack + 1;
+ }
+ regs[a] = stack[m1+r+m2];
+ NEXT;
+ }
+
+#define TYPES2(a,b) ((((uint16_t)(a))<<8)|(((uint16_t)(b))&0xff))
+#define OP_MATH_BODY(op,v1,v2) do {\
+ v1(regs[a]) = v1(regs[a]) op v2(regs[a+1]);\
+} while(0)
+
+ CASE(OP_ADD) {
+ /* A B C R(A) := R(A)+R(A+1) (Syms[B]=:+,C=1)*/
+ int a = GETARG_A(i);
+
+ /* need to check if op is overridden */
+ switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {
+ case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):
+ {
+ mrb_int x, y, z;
+ mrb_value *regs_a = regs + a;
+
+ x = mrb_fixnum(regs_a[0]);
+ y = mrb_fixnum(regs_a[1]);
+ if (mrb_int_add_overflow(x, y, &z)) {
+ SET_FLOAT_VALUE(mrb, regs_a[0], (mrb_float)x + (mrb_float)y);
+ break;
+ }
+ SET_INT_VALUE(regs[a], z);
+ }
+ break;
+ case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):
+ {
+ mrb_int x = mrb_fixnum(regs[a]);
+ mrb_float y = mrb_float(regs[a+1]);
+ SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x + y);
+ }
+ break;
+ case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):
+#ifdef MRB_WORD_BOXING
+ {
+ mrb_float x = mrb_float(regs[a]);
+ mrb_int y = mrb_fixnum(regs[a+1]);
+ SET_FLOAT_VALUE(mrb, regs[a], x + y);
+ }
+#else
+ OP_MATH_BODY(+,mrb_float,mrb_fixnum);
+#endif
+ break;
+ case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):
+#ifdef MRB_WORD_BOXING
+ {
+ mrb_float x = mrb_float(regs[a]);
+ mrb_float y = mrb_float(regs[a+1]);
+ SET_FLOAT_VALUE(mrb, regs[a], x + y);
+ }
+#else
+ OP_MATH_BODY(+,mrb_float,mrb_float);
+#endif
+ break;
+ case TYPES2(MRB_TT_STRING,MRB_TT_STRING):
+ regs[a] = mrb_str_plus(mrb, regs[a], regs[a+1]);
+ break;
+ default:
+ goto L_SEND;
+ }
+ ARENA_RESTORE(mrb, ai);
+ NEXT;
+ }
+
+ CASE(OP_SUB) {
+ /* A B C R(A) := R(A)-R(A+1) (Syms[B]=:-,C=1)*/
+ int a = GETARG_A(i);
+
+ /* need to check if op is overridden */
+ switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {
+ case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):
+ {
+ mrb_int x, y, z;
+
+ x = mrb_fixnum(regs[a]);
+ y = mrb_fixnum(regs[a+1]);
+ if (mrb_int_sub_overflow(x, y, &z)) {
+ SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x - (mrb_float)y);
+ break;
+ }
+ SET_INT_VALUE(regs[a], z);
+ }
+ break;
+ case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):
+ {
+ mrb_int x = mrb_fixnum(regs[a]);
+ mrb_float y = mrb_float(regs[a+1]);
+ SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x - y);
+ }
+ break;
+ case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):
+#ifdef MRB_WORD_BOXING
+ {
+ mrb_float x = mrb_float(regs[a]);
+ mrb_int y = mrb_fixnum(regs[a+1]);
+ SET_FLOAT_VALUE(mrb, regs[a], x - y);
+ }
+#else
+ OP_MATH_BODY(-,mrb_float,mrb_fixnum);
+#endif
+ break;
+ case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):
+#ifdef MRB_WORD_BOXING
+ {
+ mrb_float x = mrb_float(regs[a]);
+ mrb_float y = mrb_float(regs[a+1]);
+ SET_FLOAT_VALUE(mrb, regs[a], x - y);
+ }
+#else
+ OP_MATH_BODY(-,mrb_float,mrb_float);
+#endif
+ break;
+ default:
+ goto L_SEND;
+ }
+ NEXT;
+ }
+
+ CASE(OP_MUL) {
+ /* A B C R(A) := R(A)*R(A+1) (Syms[B]=:*,C=1)*/
+ int a = GETARG_A(i);
+
+ /* need to check if op is overridden */
+ switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {
+ case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):
+ {
+ mrb_value z;
+
+ z = mrb_fixnum_mul(mrb, regs[a], regs[a+1]);
+
+ switch (mrb_type(z)) {
+ case MRB_TT_FIXNUM:
+ {
+ SET_INT_VALUE(regs[a], mrb_fixnum(z));
+ }
+ break;
+ case MRB_TT_FLOAT:
+ {
+ SET_FLOAT_VALUE(mrb, regs[a], mrb_float(z));
+ }
+ break;
+ default:
+ /* cannot happen */
+ break;
+ }
+ }
+ break;
+ case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):
+ {
+ mrb_int x = mrb_fixnum(regs[a]);
+ mrb_float y = mrb_float(regs[a+1]);
+ SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x * y);
+ }
+ break;
+ case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):
+#ifdef MRB_WORD_BOXING
+ {
+ mrb_float x = mrb_float(regs[a]);
+ mrb_int y = mrb_fixnum(regs[a+1]);
+ SET_FLOAT_VALUE(mrb, regs[a], x * y);
+ }
+#else
+ OP_MATH_BODY(*,mrb_float,mrb_fixnum);
+#endif
+ break;
+ case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):
+#ifdef MRB_WORD_BOXING
+ {
+ mrb_float x = mrb_float(regs[a]);
+ mrb_float y = mrb_float(regs[a+1]);
+ SET_FLOAT_VALUE(mrb, regs[a], x * y);
+ }
+#else
+ OP_MATH_BODY(*,mrb_float,mrb_float);
+#endif
+ break;
+ default:
+ goto L_SEND;
+ }
+ NEXT;
+ }
+
+ CASE(OP_DIV) {
+ /* A B C R(A) := R(A)/R(A+1) (Syms[B]=:/,C=1)*/
+ int a = GETARG_A(i);
+
+ /* need to check if op is overridden */
+ switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {
+ case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):
+ {
+ mrb_int x = mrb_fixnum(regs[a]);
+ mrb_int y = mrb_fixnum(regs[a+1]);
+ SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x / (mrb_float)y);
+ }
+ break;
+ case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):
+ {
+ mrb_int x = mrb_fixnum(regs[a]);
+ mrb_float y = mrb_float(regs[a+1]);
+ SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x / y);
+ }
+ break;
+ case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):
+#ifdef MRB_WORD_BOXING
+ {
+ mrb_float x = mrb_float(regs[a]);
+ mrb_int y = mrb_fixnum(regs[a+1]);
+ SET_FLOAT_VALUE(mrb, regs[a], x / y);
+ }
+#else
+ OP_MATH_BODY(/,mrb_float,mrb_fixnum);
+#endif
+ break;
+ case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):
+#ifdef MRB_WORD_BOXING
+ {
+ mrb_float x = mrb_float(regs[a]);
+ mrb_float y = mrb_float(regs[a+1]);
+ SET_FLOAT_VALUE(mrb, regs[a], x / y);
+ }
+#else
+ OP_MATH_BODY(/,mrb_float,mrb_float);
+#endif
+ break;
+ default:
+ goto L_SEND;
+ }
+#ifdef MRB_NAN_BOXING
+ if (isnan(mrb_float(regs[a]))) {
+ regs[a] = mrb_float_value(mrb, mrb_float(regs[a]));
+ }
+#endif
+ NEXT;
+ }
+
+ CASE(OP_ADDI) {
+ /* A B C R(A) := R(A)+C (Syms[B]=:+)*/
+ int a = GETARG_A(i);
+
+ /* need to check if + is overridden */
+ switch (mrb_type(regs[a])) {
+ case MRB_TT_FIXNUM:
+ {
+ mrb_int x = mrb_fixnum(regs[a]);
+ mrb_int y = GETARG_C(i);
+ mrb_int z;
+
+ if (mrb_int_add_overflow(x, y, &z)) {
+ SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x + (mrb_float)y);
+ break;
+ }
+ mrb_fixnum(regs[a]) = z;
+ }
+ break;
+ case MRB_TT_FLOAT:
+#ifdef MRB_WORD_BOXING
+ {
+ mrb_float x = mrb_float(regs[a]);
+ SET_FLOAT_VALUE(mrb, regs[a], x + GETARG_C(i));
+ }
+#else
+ mrb_float(regs[a]) += GETARG_C(i);
+#endif
+ break;
+ default:
+ SET_INT_VALUE(regs[a+1], GETARG_C(i));
+ i = MKOP_ABC(OP_SEND, a, GETARG_B(i), 1);
+ goto L_SEND;
+ }
+ NEXT;
+ }
+
+ CASE(OP_SUBI) {
+ /* A B C R(A) := R(A)-C (Syms[B]=:-)*/
+ int a = GETARG_A(i);
+ mrb_value *regs_a = regs + a;
+
+ /* need to check if + is overridden */
+ switch (mrb_type(regs_a[0])) {
+ case MRB_TT_FIXNUM:
+ {
+ mrb_int x = mrb_fixnum(regs_a[0]);
+ mrb_int y = GETARG_C(i);
+ mrb_int z;
+
+ if (mrb_int_sub_overflow(x, y, &z)) {
+ SET_FLOAT_VALUE(mrb, regs_a[0], (mrb_float)x - (mrb_float)y);
+ }
+ else {
+ mrb_fixnum(regs_a[0]) = z;
+ }
+ }
+ break;
+ case MRB_TT_FLOAT:
+#ifdef MRB_WORD_BOXING
+ {
+ mrb_float x = mrb_float(regs[a]);
+ SET_FLOAT_VALUE(mrb, regs[a], x - GETARG_C(i));
+ }
+#else
+ mrb_float(regs_a[0]) -= GETARG_C(i);
+#endif
+ break;
+ default:
+ SET_INT_VALUE(regs_a[1], GETARG_C(i));
+ i = MKOP_ABC(OP_SEND, a, GETARG_B(i), 1);
+ goto L_SEND;
+ }
+ NEXT;
+ }
+
+#define OP_CMP_BODY(op,v1,v2) (v1(regs[a]) op v2(regs[a+1]))
+
+#define OP_CMP(op) do {\
+ int result;\
+ /* need to check if - is overridden */\
+ switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {\
+ case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):\
+ result = OP_CMP_BODY(op,mrb_fixnum,mrb_fixnum);\
+ break;\
+ case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):\
+ result = OP_CMP_BODY(op,mrb_fixnum,mrb_float);\
+ break;\
+ case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):\
+ result = OP_CMP_BODY(op,mrb_float,mrb_fixnum);\
+ break;\
+ case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):\
+ result = OP_CMP_BODY(op,mrb_float,mrb_float);\
+ break;\
+ default:\
+ goto L_SEND;\
+ }\
+ if (result) {\
+ SET_TRUE_VALUE(regs[a]);\
+ }\
+ else {\
+ SET_FALSE_VALUE(regs[a]);\
+ }\
+} while(0)
+
+ CASE(OP_EQ) {
+ /* A B C R(A) := R(A)==R(A+1) (Syms[B]=:==,C=1)*/
+ int a = GETARG_A(i);
+ if (mrb_obj_eq(mrb, regs[a], regs[a+1])) {
+ SET_TRUE_VALUE(regs[a]);
+ }
+ else {
+ OP_CMP(==);
+ }
+ NEXT;
+ }
+
+ CASE(OP_LT) {
+ /* A B C R(A) := R(A)<R(A+1) (Syms[B]=:<,C=1)*/
+ int a = GETARG_A(i);
+ OP_CMP(<);
+ NEXT;
+ }
+
+ CASE(OP_LE) {
+ /* A B C R(A) := R(A)<=R(A+1) (Syms[B]=:<=,C=1)*/
+ int a = GETARG_A(i);
+ OP_CMP(<=);
+ NEXT;
+ }
+
+ CASE(OP_GT) {
+ /* A B C R(A) := R(A)>R(A+1) (Syms[B]=:>,C=1)*/
+ int a = GETARG_A(i);
+ OP_CMP(>);
+ NEXT;
+ }
+
+ CASE(OP_GE) {
+ /* A B C R(A) := R(A)>=R(A+1) (Syms[B]=:>=,C=1)*/
+ int a = GETARG_A(i);
+ OP_CMP(>=);
+ NEXT;
+ }
+
+ CASE(OP_ARRAY) {
+ /* A B C R(A) := ary_new(R(B),R(B+1)..R(B+C)) */
+ regs[GETARG_A(i)] = mrb_ary_new_from_values(mrb, GETARG_C(i), ®s[GETARG_B(i)]);
+ ARENA_RESTORE(mrb, ai);
+ NEXT;
+ }
+
+ CASE(OP_ARYCAT) {
+ /* A B mrb_ary_concat(R(A),R(B)) */
+ mrb_ary_concat(mrb, regs[GETARG_A(i)],
+ mrb_ary_splat(mrb, regs[GETARG_B(i)]));
+ ARENA_RESTORE(mrb, ai);
+ NEXT;
+ }
+
+ CASE(OP_ARYPUSH) {
+ /* A B R(A).push(R(B)) */
+ mrb_ary_push(mrb, regs[GETARG_A(i)], regs[GETARG_B(i)]);
+ NEXT;
+ }
+
+ CASE(OP_AREF) {
+ /* A B C R(A) := R(B)[C] */
+ int a = GETARG_A(i);
+ int c = GETARG_C(i);
+ mrb_value v = regs[GETARG_B(i)];
+
+ if (!mrb_array_p(v)) {
+ if (c == 0) {
+ regs[GETARG_A(i)] = v;
+ }
+ else {
+ SET_NIL_VALUE(regs[a]);
+ }
+ }
+ else {
+ regs[GETARG_A(i)] = mrb_ary_ref(mrb, v, c);
+ }
+ NEXT;
+ }
+
+ CASE(OP_ASET) {
+ /* A B C R(B)[C] := R(A) */
+ mrb_ary_set(mrb, regs[GETARG_B(i)], GETARG_C(i), regs[GETARG_A(i)]);
+ NEXT;
+ }
+
+ CASE(OP_APOST) {
+ /* A B C *R(A),R(A+1)..R(A+C) := R(A) */
+ int a = GETARG_A(i);
+ mrb_value v = regs[a];
+ int pre = GETARG_B(i);
+ int post = GETARG_C(i);
+
+ if (!mrb_array_p(v)) {
+ regs[a++] = mrb_ary_new_capa(mrb, 0);
+ while (post--) {
+ SET_NIL_VALUE(regs[a]);
+ a++;
+ }
+ }
+ else {
+ struct RArray *ary = mrb_ary_ptr(v);
+ int len = ary->len;
+ int idx;
+
+ if (len > pre + post) {
+ regs[a++] = mrb_ary_new_from_values(mrb, len - pre - post, ary->ptr+pre);
+ while (post--) {
+ regs[a++] = ary->ptr[len-post-1];
+ }
+ }
+ else {
+ regs[a++] = mrb_ary_new_capa(mrb, 0);
+ for (idx=0; idx+pre<len; idx++) {
+ regs[a+idx] = ary->ptr[pre+idx];
+ }
+ while (idx < post) {
+ SET_NIL_VALUE(regs[a+idx]);
+ idx++;
+ }
+ }
+ }
+ ARENA_RESTORE(mrb, ai);
+ NEXT;
+ }
+
+ CASE(OP_STRING) {
+ /* A Bx R(A) := str_new(Lit(Bx)) */
+ regs[GETARG_A(i)] = mrb_str_dup(mrb, pool[GETARG_Bx(i)]);
+ ARENA_RESTORE(mrb, ai);
+ NEXT;
+ }
+
+ CASE(OP_STRCAT) {
+ /* A B R(A).concat(R(B)) */
+ mrb_str_concat(mrb, regs[GETARG_A(i)], regs[GETARG_B(i)]);
+ NEXT;
+ }
+
+ CASE(OP_HASH) {
+ /* A B C R(A) := hash_new(R(B),R(B+1)..R(B+C)) */
+ int b = GETARG_B(i);
+ int c = GETARG_C(i);
+ int lim = b+c*2;
+ mrb_value hash = mrb_hash_new_capa(mrb, c);
+
+ while (b < lim) {
+ mrb_hash_set(mrb, hash, regs[b], regs[b+1]);
+ b+=2;
+ }
+ regs[GETARG_A(i)] = hash;
+ ARENA_RESTORE(mrb, ai);
+ NEXT;
+ }
+
+ CASE(OP_LAMBDA) {
+ /* A b c R(A) := lambda(SEQ[b],c) (b:c = 14:2) */
+ struct RProc *p;
+ int c = GETARG_c(i);
+
+ if (c & OP_L_CAPTURE) {
+ p = mrb_closure_new(mrb, irep->reps[GETARG_b(i)]);
+ }
+ else {
+ p = mrb_proc_new(mrb, irep->reps[GETARG_b(i)]);
+ if (c & OP_L_METHOD) {
+ if (p->target_class->tt == MRB_TT_SCLASS) {
+ mrb_value klass;
+ klass = mrb_obj_iv_get(mrb,
+ (struct RObject *)p->target_class,
+ mrb_intern_lit(mrb, "__attached__"));
+ p->target_class = mrb_class_ptr(klass);
+ }
+ }
+ }
+ if (c & OP_L_STRICT) p->flags |= MRB_PROC_STRICT;
+ regs[GETARG_A(i)] = mrb_obj_value(p);
+ ARENA_RESTORE(mrb, ai);
+ NEXT;
+ }
+
+ CASE(OP_OCLASS) {
+ /* A R(A) := ::Object */
+ regs[GETARG_A(i)] = mrb_obj_value(mrb->object_class);
+ NEXT;
+ }
+
+ CASE(OP_CLASS) {
+ /* A B R(A) := newclass(R(A),Syms(B),R(A+1)) */
+ struct RClass *c = 0;
+ int a = GETARG_A(i);
+ mrb_value base, super;
+ mrb_sym id = syms[GETARG_B(i)];
+
+ base = regs[a];
+ super = regs[a+1];
+ if (mrb_nil_p(base)) {
+ base = mrb_obj_value(mrb->c->ci->target_class);
+ }
+ c = mrb_vm_define_class(mrb, base, super, id);
+ regs[a] = mrb_obj_value(c);
+ ARENA_RESTORE(mrb, ai);
+ NEXT;
+ }
+
+ CASE(OP_MODULE) {
+ /* A B R(A) := newmodule(R(A),Syms(B)) */
+ struct RClass *c = 0;
+ int a = GETARG_A(i);
+ mrb_value base;
+ mrb_sym id = syms[GETARG_B(i)];
+
+ base = regs[a];
+ if (mrb_nil_p(base)) {
+ base = mrb_obj_value(mrb->c->ci->target_class);
+ }
+ c = mrb_vm_define_module(mrb, base, id);
+ regs[a] = mrb_obj_value(c);
+ ARENA_RESTORE(mrb, ai);
+ NEXT;
+ }
+
+ CASE(OP_EXEC) {
+ /* A Bx R(A) := blockexec(R(A),SEQ[Bx]) */
+ int a = GETARG_A(i);
+ mrb_callinfo *ci;
+ mrb_value recv = regs[a];
+ struct RProc *p;
+
+ /* prepare stack */
+ ci = cipush(mrb);
+ ci->pc = pc + 1;
+ ci->acc = a;
+ ci->mid = 0;
+ ci->stackent = mrb->c->stack;
+ ci->argc = 0;
+ ci->target_class = mrb_class_ptr(recv);
+
+ /* prepare stack */
+ mrb->c->stack += a;
+
+ p = mrb_proc_new(mrb, irep->reps[GETARG_Bx(i)]);
+ p->target_class = ci->target_class;
+ ci->proc = p;
+
+ if (MRB_PROC_CFUNC_P(p)) {
+ ci->nregs = 0;
+ mrb->c->stack[0] = p->body.func(mrb, recv);
+ mrb_gc_arena_restore(mrb, ai);
+ if (mrb->exc) goto L_RAISE;
+ /* pop stackpos */
+ regs = mrb->c->stack = mrb->c->ci->stackent;
+ cipop(mrb);
+ NEXT;
+ }
+ else {
+ irep = p->body.irep;
+ pool = irep->pool;
+ syms = irep->syms;
+ stack_extend(mrb, irep->nregs, 1);
+ ci->nregs = irep->nregs;
+ regs = mrb->c->stack;
+ pc = irep->iseq;
+ JUMP;
+ }
+ }
+
+ CASE(OP_METHOD) {
+ /* A B R(A).newmethod(Syms(B),R(A+1)) */
+ int a = GETARG_A(i);
+ struct RClass *c = mrb_class_ptr(regs[a]);
+
+ mrb_define_method_vm(mrb, c, syms[GETARG_B(i)], regs[a+1]);
+ ARENA_RESTORE(mrb, ai);
+ NEXT;
+ }
+
+ CASE(OP_SCLASS) {
+ /* A B R(A) := R(B).singleton_class */
+ regs[GETARG_A(i)] = mrb_singleton_class(mrb, regs[GETARG_B(i)]);
+ ARENA_RESTORE(mrb, ai);
+ NEXT;
+ }
+
+ CASE(OP_TCLASS) {
+ /* A R(A) := target_class */
+ if (!mrb->c->ci->target_class) {
+ mrb_value exc = mrb_exc_new_str_lit(mrb, E_TYPE_ERROR, "no target class or module");
+ mrb->exc = mrb_obj_ptr(exc);
+ goto L_RAISE;
+ }
+ regs[GETARG_A(i)] = mrb_obj_value(mrb->c->ci->target_class);
+ NEXT;
+ }
+
+ CASE(OP_RANGE) {
+ /* A B C R(A) := range_new(R(B),R(B+1),C) */
+ int b = GETARG_B(i);
+ regs[GETARG_A(i)] = mrb_range_new(mrb, regs[b], regs[b+1], GETARG_C(i));
+ ARENA_RESTORE(mrb, ai);
+ NEXT;
+ }
+
+ CASE(OP_DEBUG) {
+ /* A B C debug print R(A),R(B),R(C) */
+#ifdef ENABLE_DEBUG
+ mrb->debug_op_hook(mrb, irep, pc, regs);
+#else
+#ifdef ENABLE_STDIO
+ printf("OP_DEBUG %d %d %d\n", GETARG_A(i), GETARG_B(i), GETARG_C(i));
+#else
+ abort();
+#endif
+#endif
+ NEXT;
+ }
+
+ CASE(OP_STOP) {
+ /* stop VM */
+ L_STOP:
+ {
+ int eidx_stop = mrb->c->ci == mrb->c->cibase ? 0 : mrb->c->ci[-1].eidx;
+ int eidx = mrb->c->ci->eidx;
+ while (eidx > eidx_stop) {
+ ecall(mrb, --eidx);
+ }
+ }
+ ERR_PC_CLR(mrb);
+ mrb->jmp = prev_jmp;
+ if (mrb->exc) {
+ return mrb_obj_value(mrb->exc);
+ }
+ return regs[irep->nlocals];
+ }
+
+ CASE(OP_ERR) {
+ /* Bx raise RuntimeError with message Lit(Bx) */
+ mrb_value msg = mrb_str_dup(mrb, pool[GETARG_Bx(i)]);
+ mrb_value exc;
+
+ if (GETARG_A(i) == 0) {
+ exc = mrb_exc_new_str(mrb, E_RUNTIME_ERROR, msg);
+ }
+ else {
+ exc = mrb_exc_new_str(mrb, E_LOCALJUMP_ERROR, msg);
+ }
+ mrb->exc = mrb_obj_ptr(exc);
+ goto L_RAISE;
+ }
+ }
+ END_DISPATCH;
+
+ }
+ MRB_CATCH(&c_jmp) {
+ exc_catched = TRUE;
+ goto RETRY_TRY_BLOCK;
+ }
+ MRB_END_EXC(&c_jmp);
+}
+
+MRB_API mrb_value
+mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
+{
+ return mrb_context_run(mrb, proc, self, mrb->c->ci->argc + 2); /* argc + 2 (receiver and block) */
+}
+
+MRB_API mrb_value
+mrb_toplevel_run_keep(mrb_state *mrb, struct RProc *proc, unsigned int stack_keep)
+{
+ mrb_callinfo *ci;
+ mrb_value v;
+
+ if (!mrb->c->cibase || mrb->c->ci == mrb->c->cibase) {
+ return mrb_context_run(mrb, proc, mrb_top_self(mrb), stack_keep);
+ }
+ ci = cipush(mrb);
+ ci->nregs = 1; /* protect the receiver */
+ ci->acc = CI_ACC_SKIP;
+ ci->target_class = mrb->object_class;
+ v = mrb_context_run(mrb, proc, mrb_top_self(mrb), stack_keep);
+ cipop(mrb);
+
+ return v;
+}
+
+MRB_API mrb_value
+mrb_toplevel_run(mrb_state *mrb, struct RProc *proc)
+{
+ return mrb_toplevel_run_keep(mrb, proc, 0);
+}
+