mbed I/F binding for mruby
Dependents: mruby_mbed_web mirb_mbed
mbed-mruby
How to use
Class
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); +} +