Kouhei Sutou
null+****@clear*****
Sun Jun 8 23:33:55 JST 2014
Kouhei Sutou 2014-06-08 23:33:55 +0900 (Sun, 08 Jun 2014) New Revision: 55be3d01e3cbdfbb9818355e82e74e8a8153471e https://github.com/groonga/groonga/commit/55be3d01e3cbdfbb9818355e82e74e8a8153471e Message: mrb: upgrade to the latest mruby You need to get mruby source by `git submodule update --init`. Added files: .gitmodules vendor/mruby-source vendor/mruby/build_config.rb vendor/mruby/update.rb Removed files: lib/mrb/mrb_kernel.c lib/mrb/mrb_kernel.h lib/mrb/scripts/kernel.rb mruby_version vendor/mruby-eeac4be/.gitignore vendor/mruby-eeac4be/.travis.yml vendor/mruby-eeac4be/AUTHORS vendor/mruby-eeac4be/CONTRIBUTING.md vendor/mruby-eeac4be/ChangeLog vendor/mruby-eeac4be/INSTALL vendor/mruby-eeac4be/LEGAL vendor/mruby-eeac4be/MITL vendor/mruby-eeac4be/NEWS vendor/mruby-eeac4be/README.md vendor/mruby-eeac4be/Rakefile vendor/mruby-eeac4be/TODO vendor/mruby-eeac4be/benchmark/ao-render.rb vendor/mruby-eeac4be/benchmark/bm_so_lists.rb vendor/mruby-eeac4be/benchmark/fib39.rb vendor/mruby-eeac4be/build_config.rb vendor/mruby-eeac4be/doc/.gitkeep vendor/mruby-eeac4be/doc/compile/README.md vendor/mruby-eeac4be/doc/mrbgems/README.md vendor/mruby-eeac4be/examples/mrbgems/c_and_ruby_extension_example/README.md vendor/mruby-eeac4be/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake vendor/mruby-eeac4be/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb vendor/mruby-eeac4be/examples/mrbgems/c_and_ruby_extension_example/src/example.c vendor/mruby-eeac4be/examples/mrbgems/c_and_ruby_extension_example/test/example.rb vendor/mruby-eeac4be/examples/mrbgems/c_extension_example/README.md vendor/mruby-eeac4be/examples/mrbgems/c_extension_example/mrbgem.rake vendor/mruby-eeac4be/examples/mrbgems/c_extension_example/src/example.c vendor/mruby-eeac4be/examples/mrbgems/c_extension_example/test/example.c vendor/mruby-eeac4be/examples/mrbgems/c_extension_example/test/example.rb vendor/mruby-eeac4be/examples/mrbgems/ruby_extension_example/README.md vendor/mruby-eeac4be/examples/mrbgems/ruby_extension_example/mrbgem.rake vendor/mruby-eeac4be/examples/mrbgems/ruby_extension_example/mrblib/example.rb vendor/mruby-eeac4be/examples/mrbgems/ruby_extension_example/test/example.rb vendor/mruby-eeac4be/examples/targets/ArduinoDue.rb vendor/mruby-eeac4be/examples/targets/chipKitMax32.rb vendor/mruby-eeac4be/include/mrbconf.h vendor/mruby-eeac4be/include/mruby.h vendor/mruby-eeac4be/include/mruby/array.h vendor/mruby-eeac4be/include/mruby/class.h vendor/mruby-eeac4be/include/mruby/compile.h vendor/mruby-eeac4be/include/mruby/data.h vendor/mruby-eeac4be/include/mruby/debug.h vendor/mruby-eeac4be/include/mruby/dump.h vendor/mruby-eeac4be/include/mruby/gc.h vendor/mruby-eeac4be/include/mruby/hash.h vendor/mruby-eeac4be/include/mruby/irep.h vendor/mruby-eeac4be/include/mruby/khash.h vendor/mruby-eeac4be/include/mruby/numeric.h vendor/mruby-eeac4be/include/mruby/proc.h vendor/mruby-eeac4be/include/mruby/range.h vendor/mruby-eeac4be/include/mruby/string.h vendor/mruby-eeac4be/include/mruby/value.h vendor/mruby-eeac4be/include/mruby/variable.h vendor/mruby-eeac4be/minirake vendor/mruby-eeac4be/mrbgems/default.gembox vendor/mruby-eeac4be/mrbgems/full-core.gembox vendor/mruby-eeac4be/mrbgems/mruby-array-ext/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-array-ext/mrblib/array.rb vendor/mruby-eeac4be/mrbgems/mruby-array-ext/src/array.c vendor/mruby-eeac4be/mrbgems/mruby-array-ext/test/array.rb vendor/mruby-eeac4be/mrbgems/mruby-bin-mirb/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c vendor/mruby-eeac4be/mrbgems/mruby-bin-mruby/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c vendor/mruby-eeac4be/mrbgems/mruby-enum-ext/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-enum-ext/mrblib/enum.rb vendor/mruby-eeac4be/mrbgems/mruby-enum-ext/test/enum.rb vendor/mruby-eeac4be/mrbgems/mruby-eval/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-eval/src/eval.c vendor/mruby-eeac4be/mrbgems/mruby-exit/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-exit/src/mruby-exit.c vendor/mruby-eeac4be/mrbgems/mruby-fiber/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-fiber/src/fiber.c vendor/mruby-eeac4be/mrbgems/mruby-fiber/test/fiber.rb vendor/mruby-eeac4be/mrbgems/mruby-hash-ext/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-hash-ext/mrblib/hash.rb vendor/mruby-eeac4be/mrbgems/mruby-hash-ext/src/hash-ext.c vendor/mruby-eeac4be/mrbgems/mruby-hash-ext/test/hash.rb vendor/mruby-eeac4be/mrbgems/mruby-math/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-math/src/math.c vendor/mruby-eeac4be/mrbgems/mruby-math/test/math.rb vendor/mruby-eeac4be/mrbgems/mruby-numeric-ext/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-numeric-ext/src/numeric_ext.c vendor/mruby-eeac4be/mrbgems/mruby-numeric-ext/test/numeric.rb vendor/mruby-eeac4be/mrbgems/mruby-object-ext/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-object-ext/src/object.c vendor/mruby-eeac4be/mrbgems/mruby-object-ext/test/nil.rb vendor/mruby-eeac4be/mrbgems/mruby-object-ext/test/object.rb vendor/mruby-eeac4be/mrbgems/mruby-objectspace/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-objectspace/src/mruby_objectspace.c vendor/mruby-eeac4be/mrbgems/mruby-objectspace/test/objectspace.rb vendor/mruby-eeac4be/mrbgems/mruby-print/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-print/mrblib/print.rb vendor/mruby-eeac4be/mrbgems/mruby-print/src/print.c vendor/mruby-eeac4be/mrbgems/mruby-proc-ext/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-proc-ext/mrblib/proc.rb vendor/mruby-eeac4be/mrbgems/mruby-proc-ext/src/proc.c vendor/mruby-eeac4be/mrbgems/mruby-proc-ext/test/proc.rb vendor/mruby-eeac4be/mrbgems/mruby-random/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-random/src/mt19937ar.c vendor/mruby-eeac4be/mrbgems/mruby-random/src/mt19937ar.h vendor/mruby-eeac4be/mrbgems/mruby-random/src/random.c vendor/mruby-eeac4be/mrbgems/mruby-random/src/random.h vendor/mruby-eeac4be/mrbgems/mruby-random/test/random.rb vendor/mruby-eeac4be/mrbgems/mruby-range-ext/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-range-ext/src/range.c vendor/mruby-eeac4be/mrbgems/mruby-range-ext/test/range.rb vendor/mruby-eeac4be/mrbgems/mruby-sprintf/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-sprintf/src/kernel.c vendor/mruby-eeac4be/mrbgems/mruby-sprintf/src/sprintf.c vendor/mruby-eeac4be/mrbgems/mruby-sprintf/test/sprintf.rb vendor/mruby-eeac4be/mrbgems/mruby-string-ext/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-string-ext/mrblib/string.rb vendor/mruby-eeac4be/mrbgems/mruby-string-ext/src/string.c vendor/mruby-eeac4be/mrbgems/mruby-string-ext/test/string.rb vendor/mruby-eeac4be/mrbgems/mruby-struct/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-struct/mrblib/struct.rb vendor/mruby-eeac4be/mrbgems/mruby-struct/src/struct.c vendor/mruby-eeac4be/mrbgems/mruby-struct/test/struct.rb vendor/mruby-eeac4be/mrbgems/mruby-symbol-ext/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-symbol-ext/mrblib/symbol.rb vendor/mruby-eeac4be/mrbgems/mruby-symbol-ext/src/symbol.c vendor/mruby-eeac4be/mrbgems/mruby-symbol-ext/test/symbol.rb vendor/mruby-eeac4be/mrbgems/mruby-time/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-time/src/time.c vendor/mruby-eeac4be/mrbgems/mruby-time/test/time.rb vendor/mruby-eeac4be/mrbgems/mruby-toplevel-ext/mrbgem.rake vendor/mruby-eeac4be/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb vendor/mruby-eeac4be/mrbgems/mruby-toplevel-ext/test/toplevel.rb vendor/mruby-eeac4be/mrblib/array.rb vendor/mruby-eeac4be/mrblib/class.rb vendor/mruby-eeac4be/mrblib/compar.rb vendor/mruby-eeac4be/mrblib/enum.rb vendor/mruby-eeac4be/mrblib/error.rb vendor/mruby-eeac4be/mrblib/hash.rb vendor/mruby-eeac4be/mrblib/init_mrblib.c vendor/mruby-eeac4be/mrblib/kernel.rb vendor/mruby-eeac4be/mrblib/mrblib.rake vendor/mruby-eeac4be/mrblib/numeric.rb vendor/mruby-eeac4be/mrblib/print.rb vendor/mruby-eeac4be/mrblib/range.rb vendor/mruby-eeac4be/mrblib/string.rb vendor/mruby-eeac4be/src/.dirstamp vendor/mruby-eeac4be/src/array.c vendor/mruby-eeac4be/src/backtrace.c vendor/mruby-eeac4be/src/class.c vendor/mruby-eeac4be/src/codegen.c vendor/mruby-eeac4be/src/compar.c vendor/mruby-eeac4be/src/crc.c vendor/mruby-eeac4be/src/debug.c vendor/mruby-eeac4be/src/dump.c vendor/mruby-eeac4be/src/enum.c vendor/mruby-eeac4be/src/error.c vendor/mruby-eeac4be/src/error.h vendor/mruby-eeac4be/src/etc.c vendor/mruby-eeac4be/src/ext/.gitkeep vendor/mruby-eeac4be/src/gc.c vendor/mruby-eeac4be/src/hash.c vendor/mruby-eeac4be/src/init.c vendor/mruby-eeac4be/src/kernel.c vendor/mruby-eeac4be/src/keywords vendor/mruby-eeac4be/src/lex.def vendor/mruby-eeac4be/src/load.c vendor/mruby-eeac4be/src/mrblib.c vendor/mruby-eeac4be/src/mruby_core.rake vendor/mruby-eeac4be/src/node.h vendor/mruby-eeac4be/src/numeric.c vendor/mruby-eeac4be/src/object.c vendor/mruby-eeac4be/src/opcode.h vendor/mruby-eeac4be/src/parse.c vendor/mruby-eeac4be/src/parse.y vendor/mruby-eeac4be/src/pool.c vendor/mruby-eeac4be/src/print.c vendor/mruby-eeac4be/src/proc.c vendor/mruby-eeac4be/src/range.c vendor/mruby-eeac4be/src/re.h vendor/mruby-eeac4be/src/state.c vendor/mruby-eeac4be/src/string.c vendor/mruby-eeac4be/src/symbol.c vendor/mruby-eeac4be/src/value_array.h vendor/mruby-eeac4be/src/variable.c vendor/mruby-eeac4be/src/vm.c vendor/mruby-eeac4be/tasks/libmruby.rake vendor/mruby-eeac4be/tasks/mrbgem_spec.rake vendor/mruby-eeac4be/tasks/mrbgems.rake vendor/mruby-eeac4be/tasks/mrbgems_test.rake vendor/mruby-eeac4be/tasks/mruby_build.rake vendor/mruby-eeac4be/tasks/mruby_build_commands.rake vendor/mruby-eeac4be/tasks/mruby_build_gem.rake vendor/mruby-eeac4be/tasks/ruby_ext.rake vendor/mruby-eeac4be/tasks/toolchains/androideabi.rake vendor/mruby-eeac4be/tasks/toolchains/clang.rake vendor/mruby-eeac4be/tasks/toolchains/gcc.rake vendor/mruby-eeac4be/tasks/toolchains/vs2010.rake vendor/mruby-eeac4be/tasks/toolchains/vs2012.rake vendor/mruby-eeac4be/test/README.md vendor/mruby-eeac4be/test/assert.rb vendor/mruby-eeac4be/test/driver.c vendor/mruby-eeac4be/test/init_mrbtest.c vendor/mruby-eeac4be/test/mrbtest.rake vendor/mruby-eeac4be/test/report.rb vendor/mruby-eeac4be/test/t/argumenterror.rb vendor/mruby-eeac4be/test/t/array.rb vendor/mruby-eeac4be/test/t/basicobject.rb vendor/mruby-eeac4be/test/t/bs_block.rb vendor/mruby-eeac4be/test/t/bs_literal.rb vendor/mruby-eeac4be/test/t/class.rb vendor/mruby-eeac4be/test/t/comparable.rb vendor/mruby-eeac4be/test/t/enumerable.rb vendor/mruby-eeac4be/test/t/exception.rb vendor/mruby-eeac4be/test/t/false.rb vendor/mruby-eeac4be/test/t/float.rb vendor/mruby-eeac4be/test/t/gc.rb vendor/mruby-eeac4be/test/t/hash.rb vendor/mruby-eeac4be/test/t/indexerror.rb vendor/mruby-eeac4be/test/t/integer.rb vendor/mruby-eeac4be/test/t/kernel.rb vendor/mruby-eeac4be/test/t/literals.rb vendor/mruby-eeac4be/test/t/localjumperror.rb vendor/mruby-eeac4be/test/t/methods.rb vendor/mruby-eeac4be/test/t/module.rb vendor/mruby-eeac4be/test/t/nameerror.rb vendor/mruby-eeac4be/test/t/nil.rb vendor/mruby-eeac4be/test/t/nomethoderror.rb vendor/mruby-eeac4be/test/t/numeric.rb vendor/mruby-eeac4be/test/t/object.rb vendor/mruby-eeac4be/test/t/proc.rb vendor/mruby-eeac4be/test/t/range.rb vendor/mruby-eeac4be/test/t/rangeerror.rb vendor/mruby-eeac4be/test/t/regexperror.rb vendor/mruby-eeac4be/test/t/runtimeerror.rb vendor/mruby-eeac4be/test/t/standarderror.rb vendor/mruby-eeac4be/test/t/string.rb vendor/mruby-eeac4be/test/t/symbol.rb vendor/mruby-eeac4be/test/t/syntax.rb vendor/mruby-eeac4be/test/t/true.rb vendor/mruby-eeac4be/test/t/typeerror.rb vendor/mruby-eeac4be/tools/mrbc/mrbc.c vendor/mruby-eeac4be/tools/mrbc/mrbc.rake vendor/mruby-eeac4be/travis_config.rb vendor/mruby/update.sh vendor/mruby/update_files.sh Modified files: .gitignore CMakeLists.txt configure.ac lib/ctx_impl_mrb.c lib/mrb.c lib/mrb/mrb_expr.c lib/mrb/scripts/sources.am lib/mrb/sources.am tools/travis-before-script.sh vendor/mruby/Makefile.am vendor/mruby/sources.am Modified: .gitignore (+4 -0) =================================================================== --- .gitignore 2014-06-08 19:01:14 +0900 (46736f7) +++ .gitignore 2014-06-08 23:33:55 +0900 (1ad222c) @@ -38,6 +38,10 @@ /data/scripts/groonga-httpd-restart /vendor/nginx-*/objs /vendor/mruby/parse.c +/vendor/mruby/mrblib.c +/vendor/mruby/mrbgems_init.c +/vendor/mruby/mruby-build.timestamp +/vendor/mruby-build/ /vendor/plugins/*/ /groonga.spec /stamp-h1 Added: .gitmodules (+3 -0) 100644 =================================================================== --- /dev/null +++ .gitmodules 2014-06-08 23:33:55 +0900 (cdbf702) @@ -0,0 +1,3 @@ +[submodule "vendor/mruby-source"] + path = vendor/mruby-source + url = https://github.com/mruby/mruby.git Modified: CMakeLists.txt (+1 -2) =================================================================== --- CMakeLists.txt 2014-06-08 19:01:14 +0900 (6a6a479) +++ CMakeLists.txt 2014-06-08 23:33:55 +0900 (b2dc96b) @@ -442,7 +442,6 @@ else() endif() option(GRN_WITH_MRUBY "use mruby" OFF) -file(READ "${CMAKE_CURRENT_SOURCE_DIR}/mruby_version" MRUBY_VERSION) if(GRN_WITH_MRUBY) if(CMAKE_VERSION VERSION_LESS "2.8.8") message(FATAL_ERROR @@ -450,7 +449,7 @@ if(GRN_WITH_MRUBY) "CMake 2.8.8 or later is required for mruby supported build") endif() set(MRUBY_INCLUDE_DIRS - "${CMAKE_CURRENT_SOURCE_DIR}/vendor/mruby-${MRUBY_VERSION}/include") + "${CMAKE_CURRENT_SOURCE_DIR}/vendor/mruby-source/include") set(MRUBY_LIBS "$<TARGET_OBJECTS:mruby>") else() set(MRUBY_INCLUDE_DIRS "") Modified: configure.ac (+4 -5) =================================================================== --- configure.ac 2014-06-08 19:01:14 +0900 (8735606) +++ configure.ac 2014-06-08 23:33:55 +0900 (b02a057) @@ -1342,13 +1342,12 @@ if test "x$enable_mruby" != "xyes"; then fi AC_MSG_RESULT($enable_mruby) -m4_define([mruby_version], m4_include(mruby_version)) -MRUBY_VERSION=mruby_version -AC_SUBST(MRUBY_VERSION) - if test "$enable_mruby" = "yes"; then + if test "$ac_cv_ruby_available" != "yes"; then + AC_MSG_ERROR(--enable-ruby requires --with-ruby) + fi AC_DEFINE(GRN_WITH_MRUBY, [1], [Define to 1 if mruby is enabled.]) - MRUBY_CFLAGS="-I\$(top_srcdir)/vendor/mruby-${MRUBY_VERSION}/include" + MRUBY_CFLAGS="-I\$(top_srcdir)/vendor/mruby-source/include" MRUBY_LIBS="\$(top_builddir)/vendor/mruby/libmruby.la" else MRUBY_CFLAGS= Modified: lib/ctx_impl_mrb.c (+0 -2) =================================================================== --- lib/ctx_impl_mrb.c 2014-06-08 19:01:14 +0900 (e1445c3) +++ lib/ctx_impl_mrb.c 2014-06-08 23:33:55 +0900 (ba7df47) @@ -20,7 +20,6 @@ #include "ctx_impl.h" #include "mrb.h" -#include "mrb/mrb_kernel.h" #include "mrb/mrb_ctx.h" #include "mrb/mrb_bulk.h" #include "mrb/mrb_obj.h" @@ -41,7 +40,6 @@ grn_ctx_impl_mrb_init_bindings(grn_ctx *ctx) mrb->ud = ctx; ctx->impl->mrb.module = mrb_define_module(mrb, "Groonga"); - grn_mrb_kernel_init(ctx); grn_mrb_ctx_init(ctx); grn_mrb_bulk_init(ctx); grn_mrb_obj_init(ctx); Modified: lib/mrb.c (+10 -10) =================================================================== --- lib/mrb.c 2014-06-08 19:01:14 +0900 (9d23f38) +++ lib/mrb.c 2014-06-08 23:33:55 +0900 (11b4e1c) @@ -110,7 +110,6 @@ grn_mrb_load(grn_ctx *ctx, const char *path) { grn_mrb_data *data = &(ctx->impl->mrb); mrb_state *mrb = data->state; - int n; FILE *file; mrb_value result; struct mrb_parser_state *parser; @@ -131,10 +130,12 @@ grn_mrb_load(grn_ctx *ctx, const char *path) parser = mrb_parse_file(mrb, file, NULL); fclose(file); - n = mrb_generate_code(mrb, parser); - result = mrb_run(mrb, - mrb_proc_new(mrb, mrb->irep[n]), - mrb_top_self(mrb)); + { + struct RProc *proc; + proc = mrb_generate_code(mrb, parser); + result = mrb_run(mrb, proc, mrb_top_self(mrb)); + mrb_irep_decref(mrb, proc->body.irep); + } mrb_parser_free(parser); return result; @@ -145,7 +146,6 @@ grn_mrb_eval(grn_ctx *ctx, const char *script, int script_length) { grn_mrb_data *data = &(ctx->impl->mrb); mrb_state *mrb = data->state; - int n; mrb_value result; struct mrb_parser_state *parser; @@ -157,16 +157,16 @@ grn_mrb_eval(grn_ctx *ctx, const char *script, int script_length) script_length = strlen(script); } parser = mrb_parse_nstring(mrb, script, script_length, NULL); - n = mrb_generate_code(mrb, parser); { + struct RProc *proc; struct RClass *eval_context_class; mrb_value eval_context; + proc = mrb_generate_code(mrb, parser); eval_context_class = mrb_class_get_under(mrb, data->module, "EvalContext"); eval_context = mrb_obj_new(mrb, eval_context_class, 0, NULL); - result = mrb_run(mrb, - mrb_proc_new(mrb, mrb->irep[n]), - eval_context); + result = mrb_run(mrb, proc, eval_context); + mrb_irep_decref(mrb, proc->body.irep); } mrb_parser_free(parser); Modified: lib/mrb/mrb_expr.c (+2 -4) =================================================================== --- lib/mrb/mrb_expr.c 2014-06-08 19:01:14 +0900 (2f23c8d) +++ lib/mrb/mrb_expr.c 2014-06-08 23:33:55 +0900 (b0d3f75) @@ -49,8 +49,7 @@ mrb_grn_scan_info_new(mrb_state *mrb, scan_info *scan_info) mrb_value mrb_scan_info; mrb_scan_info = mrb_cptr_value(mrb, scan_info); - klass = mrb_class_ptr(mrb_const_get(mrb, mrb_obj_value(module), - mrb_intern(mrb, "ScanInfo"))); + klass = mrb_class_get_under(mrb, module, "ScanInfo"); return mrb_obj_new(mrb, klass, 1, &mrb_scan_info); } @@ -63,8 +62,7 @@ mrb_grn_expr_code_new(mrb_state *mrb, grn_expr_code *code) mrb_value mrb_code; mrb_code = mrb_cptr_value(mrb, code); - klass = mrb_class_ptr(mrb_const_get(mrb, mrb_obj_value(module), - mrb_intern(mrb, "ExpressionCode"))); + klass = mrb_class_get_under(mrb, module, "ExpressionCode"); return mrb_obj_new(mrb, klass, 1, &mrb_code); } Deleted: lib/mrb/mrb_kernel.c (+0 -50) 100644 =================================================================== --- lib/mrb/mrb_kernel.c 2014-06-08 19:01:14 +0900 (b40c7f3) +++ /dev/null @@ -1,50 +0,0 @@ -/* -*- c-basic-offset: 2 -*- */ -/* - Copyright(C) 2014 Brazil - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License version 2.1 as published by the Free Software Foundation. - - This library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "../ctx_impl.h" - -#ifdef GRN_WITH_MRUBY -#include <mruby.h> - -#include "../mrb.h" -#include "mrb_kernel.h" - -static mrb_value -kernel_print(mrb_state *mrb, mrb_value self) -{ - char *content; - int content_length; - - mrb_get_args(mrb, "s", &content, &content_length); - printf("%.*s", content_length, content); - - return mrb_nil_value(); -} - -void -grn_mrb_kernel_init(grn_ctx *ctx) -{ - grn_mrb_data *data = &(ctx->impl->mrb); - mrb_state *mrb = data->state; - - mrb_define_method(mrb, mrb->kernel_module, - "print", kernel_print, MRB_ARGS_REQ(1)); - - grn_mrb_load(ctx, "kernel.rb"); -} -#endif Deleted: lib/mrb/mrb_kernel.h (+0 -34) 100644 =================================================================== --- lib/mrb/mrb_kernel.h 2014-06-08 19:01:14 +0900 (268509d) +++ /dev/null @@ -1,34 +0,0 @@ -/* -*- c-basic-offset: 2 -*- */ -/* - Copyright(C) 2014 Brazil - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License version 2.1 as published by the Free Software Foundation. - - This library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef GRN_MRB_KERNEL_H -#define GRN_MRB_KERNEL_H - -#include "../ctx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void grn_mrb_kernel_init(grn_ctx *ctx); - -#ifdef __cplusplus -} -#endif - -#endif /* GRN_MRB_KERNEL_H */ Deleted: lib/mrb/scripts/kernel.rb (+0 -25) 100644 =================================================================== --- lib/mrb/scripts/kernel.rb 2014-06-08 19:01:14 +0900 (6626fdd) +++ /dev/null @@ -1,25 +0,0 @@ -module Kernel - def puts(*arguments) - arguments.each do |argument| - argument = argument.to_s unless argument.is_a?(String) - print(argument) - print("\n") unless argument[argument.size] == "\n" - end - nil - end - - def p(*arguments) - return nil if arguments.empty? - - if arguments.size == 1 - argument = arguments.first - puts(argument.inspect) - argument - else - arguments.each do |argument| - puts(argument.inspect) - end - arguments - end - end -end Modified: lib/mrb/scripts/sources.am (+0 -1) =================================================================== --- lib/mrb/scripts/sources.am 2014-06-08 19:01:14 +0900 (6f0e559) +++ lib/mrb/scripts/sources.am 2014-06-08 23:33:55 +0900 (b4f7717) @@ -2,5 +2,4 @@ RUBY_SCRIPT_FILES = \ eval_context.rb \ expression.rb \ index_info.rb \ - kernel.rb \ scan_info.rb Modified: lib/mrb/sources.am (+0 -2) =================================================================== --- lib/mrb/sources.am 2014-06-08 19:01:14 +0900 (96fc28b) +++ lib/mrb/sources.am 2014-06-08 23:33:55 +0900 (9e4b1bd) @@ -15,8 +15,6 @@ libgrnmrb_la_SOURCES = \ mrb_fixed_size_column.h \ mrb_index_column.c \ mrb_index_column.h \ - mrb_kernel.c \ - mrb_kernel.h \ mrb_obj.c \ mrb_obj.h \ mrb_procedure.c \ Deleted: mruby_version (+0 -1) 100644 =================================================================== --- mruby_version 2014-06-08 19:01:14 +0900 (464a232) +++ /dev/null @@ -1 +0,0 @@ -eeac4be \ No newline at end of file Modified: tools/travis-before-script.sh (+3 -1) =================================================================== --- tools/travis-before-script.sh 2014-06-08 19:01:14 +0900 (1284875) +++ tools/travis-before-script.sh 2014-06-08 23:33:55 +0900 (943f41b) @@ -2,6 +2,8 @@ set -e +git submodule update --init --depth 1 + case "${BUILD_TOOL}" in autotools) ./autogen.sh @@ -11,7 +13,7 @@ case "${BUILD_TOOL}" in configure_args="${configure_args} --enable-debug" #fi if [ "$ENABLE_MRUBY" = "yes" ]; then - configure_args="${configure_args} --enable-mruby" + configure_args="${configure_args} --with-ruby --enable-mruby" fi ./configure --with-ruby ${configure_args} Deleted: vendor/mruby-eeac4be/.gitignore (+0 -19) 100644 =================================================================== --- vendor/mruby-eeac4be/.gitignore 2014-06-08 19:01:14 +0900 (ae18ca8) +++ /dev/null @@ -1,19 +0,0 @@ -# / -*.bak -*.d -*.o -*.orig -*.rej -*.sav -*.swp -*.tmp -*~ -.DS_Store -.ccmalloc -.svn -/.git -cscope.out -/src/y.tab.c -/bin -/build -/lib Deleted: vendor/mruby-eeac4be/.travis.yml (+0 -7) 100644 =================================================================== --- vendor/mruby-eeac4be/.travis.yml 2014-06-08 19:01:14 +0900 (b00a5db) +++ /dev/null @@ -1,7 +0,0 @@ -# no installation... - -install: - - sudo apt-get -q install gperf - -env: MRUBY_CONFIG=travis_config.rb -script: "./minirake all test" Deleted: vendor/mruby-eeac4be/AUTHORS (+0 -19) 100644 =================================================================== --- vendor/mruby-eeac4be/AUTHORS 2014-06-08 19:01:14 +0900 (85d117f) +++ /dev/null @@ -1,19 +0,0 @@ -Original Authors "mruby developers" are: - Yukihiro Matsumoto - FUKUOKA CSK CORPORATION - Kyushu Institute of Technology - Network Applied Communication Laboratory, Inc. - Daniel Bovensiepen - Jon Maken - Bjorn De Meyer - Yuichiro MASUI - Masamitsu MURASE - Masaki Muranaka - Internet Initiative Japan Inc. - Tadashi FUKUZAWA - MATSUMOTO Ryosuke - Yasuhiro Matsumoto - Koji Yoshioka - Jun Hiroe - Narihiro Nakamura - Yuichi Nishiwaki Deleted: vendor/mruby-eeac4be/CONTRIBUTING.md (+0 -65) 100644 =================================================================== --- vendor/mruby-eeac4be/CONTRIBUTING.md 2014-06-08 19:01:14 +0900 (b8db5a7) +++ /dev/null @@ -1,65 +0,0 @@ -# How to contribute - -mruby is an open-source project which is looking forward to each contribution. - -## Your Pull Request - -To make it easy to review and understand your change please keep the following -things in mind before submitting your pull request: - -* Work on the latest possible state of **mruby/master** -* Create a branch which is dedicated to your change -* Test your changes before creating a pull request (```./minirake test```) -* If possible write a test case which confirms your change -* Don't mix several features or bug-fixes in one pull request -* Create a meaningful commit message -* Explain your change (i.e. with a link to the issue you are fixing) - -## Coding conventions - -How to style your C and Ruby code which you want to submit. - -### C code - -The core part (parser, bytecode-interpreter, core-lib, etc.) of mruby is -written in the C programming language. Please note the following hints for your -C code: - -#### Comply with C99 (ISO/IEC 9899:1999) - -mruby should be highly portable to other systems and compilers. For this it is -recommended to keep your code as close as possible to the C99 standard -(http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf). - -Although we target C99, Visual C++ is also an important target for mruby. For this -reason a declaration of a local variable has to be at the beginning of a scope block. - -#### Reduce library dependencies to a minimum - -The dependencies to libraries should be kept to an absolute minimum. This -increases the portability but makes it also easier to cut away parts of mruby -on-demand. - -#### Don't use C++ style comments - - /* This is the prefered comment style */ - -Use C++ style comments only for temporary comment e.g. commenting out some code lines. - -#### Insert a break after the method return value: - - int - main(void) - { - ... - } - -### Ruby code - -Parts of the standard library of mruby are written in the Ruby programming language -itself. Please note the following hints for your Ruby code: - -#### Comply with the Ruby standard (ISO/IEC 30170:2012) - -mruby is currently targeting to execute Ruby code which complies to ISO/IEC -30170:2012 (http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=59579). Deleted: vendor/mruby-eeac4be/ChangeLog (+0 -15) 100644 =================================================================== --- vendor/mruby-eeac4be/ChangeLog 2014-06-08 19:01:14 +0900 (93a18f4) +++ /dev/null @@ -1,15 +0,0 @@ -Thu Apl 19 17:25:18 2012 Yukihiro Matsumoto <matz �� ruby-lang.org> - - * first release version 1.0.0 released. - -Local variables: -add-log-time-format: (lambda () - (let* ((time (current-time)) - (system-time-locale "C") - (diff (+ (cadr time) 32400)) - (lo (% diff 65536)) - (hi (+ (car time) (/ diff 65536)))) - (format-time-string "%a %b %e %H:%M:%S %Y" (list hi lo) t))) -indent-tabs-mode: t -tab-width: 8 -end: Deleted: vendor/mruby-eeac4be/INSTALL (+0 -29) 100644 =================================================================== --- vendor/mruby-eeac4be/INSTALL 2014-06-08 19:01:14 +0900 (5bad4aa) +++ /dev/null @@ -1,29 +0,0 @@ -* Prerequisites - - 1. Make sure you have bison (http://www.gnu.org/software/bison/) installed in your system. - 2. Make sure you have ruby installed in your system (required to build). - -* Compilation and Installation - - 1. Run make in the top directory. - - This command will create the following directories and - store libraries and binaries files into them. - - * bin - * lib - * include - - You can directory invoke 'minirake' as the following. - - $ ruby ./minirake - -If an error occurs when compiling mruby, it will be helpful for others if you -send a detailed report to the developers that includes the error log, machine, -and OS type. - - -* Porting to other platforms - - -That's all. Deleted: vendor/mruby-eeac4be/LEGAL (+0 -6) 100644 =================================================================== --- vendor/mruby-eeac4be/LEGAL 2014-06-08 19:01:14 +0900 (8492999) +++ /dev/null @@ -1,6 +0,0 @@ -LEGAL NOTICE INFORMATION ------------------------- - -All the files in this distribution are covered under the MIT license -(see the file MITL) except some files mentioned below: - Deleted: vendor/mruby-eeac4be/MITL (+0 -20) 100644 =================================================================== --- vendor/mruby-eeac4be/MITL 2014-06-08 19:01:14 +0900 (917a4e1) +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2013 mruby developers - -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. - Deleted: vendor/mruby-eeac4be/NEWS (+0 -13) 100644 =================================================================== --- vendor/mruby-eeac4be/NEWS 2014-06-08 19:01:14 +0900 (5c25238) +++ /dev/null @@ -1,13 +0,0 @@ -* NEWS - -This document is a list of user visible feature changes made between -releases except for bug fixes. - -Note that each entry is kept so brief that no reason behind or -reference information is supplied with. For a full list of changes -with all sufficient information, see the ChangeLog file. - - -** Information about first release v1.0.0 - - Deleted: vendor/mruby-eeac4be/README.md (+0 -118) 100644 =================================================================== --- vendor/mruby-eeac4be/README.md 2014-06-08 19:01:14 +0900 (8422184) +++ /dev/null @@ -1,118 +0,0 @@ -# !!Notice!! - This is a preliminary release for internal team review. - The URLs and addresses described below are not available yet. - The official release will be announced later. - Any suggestions for modification are welcome. - Delays in replies are to be expected. Sorry in advance. - -[](https://travis-ci.org/mruby/mruby) - -## What's mruby - -mruby is the lightweight implementation of the Ruby language complying to (part of) -the [ISO standard](http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=59579). -mruby can be linked and embedded within your application. We provide the interpreter program "mruby" and -the interactive mruby shell "mirb" as examples. You can also compile Ruby programs into compiled byte code -using the mruby compiler "mrbc". All those tools reside in "bin" directory. The "mrbc" is also able to -generate compiled byte code in a C source file. You can check the "mrbtest" program under the "test" directory. - -This achievement was sponsored by the Regional Innovation Creation R&D Programs of -the Ministry of Economy, Trade and Industry of Japan. - - -## How to get mruby - -The mruby distribution files can be found in the following site: - - https://github.com/mruby/mruby/zipball/master - -The trunk of the mruby source tree can be checked out with the -following command: - - $ git clone https://github.com/mruby/mruby.git - -There are some other branches under development. Try the following -command and see the list of branches: - - $ git branch -r - - -## mruby home-page - -mruby's website is not launched yet but we are actively working on it. - -The URL of the mruby home-page will be: - - http://www.mruby.org/ - - -## Mailing list - -To subscribe to the mruby mailing list....[T.B.D.] - - -## How to compile and install - -See the INSTALL file. - -## Running Tests - -To run the tests, execute the following from the project's root directory. - - $ make test - -Or - - $ ruby ./minirake test - -## Customization - -mruby contains a package manager called *mrbgems*. To create extensions -in C and/or Ruby you should create a *GEM*. You will find a complete -documentation with examples under *examples/mrbgems*. - -## License - -Copyright (c) 2013 mruby developers - -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. - -## Note for License - -mruby has chosen a MIT License due to its permissive license allowing -developers to target various environments such as embedded systems. -However, the license requires the display of the copyright notice and license -information in manuals for instance. Doing so for big projects can be -complicated or troublesome. -This is why mruby has decided to display "mruby developers" as the copyright name -to make it simple conventionally. -In the future, mruby might ask you to distribute your new code -(that you will commit,) under the MIT License as a member of -"mruby developers" but contributors will keep their copyright. -(We did not intend for contributors to transfer or waive their copyrights, - Actual copyright holder name (contributors) will be listed in the AUTHORS file.) - -Please ask us if you want to distribute your code under another license. - -## How to Contribute - -See the [contribution guidelines](https://github.com/mruby/mruby/blob/master/CONTRIBUTING.md) -then send a pull request to <http://github.com/mruby/mruby>. We consider you have granted -non-exclusive right to your contributed code under MIT license. If you want to be named -as one of mruby developers, please include an update to the AUTHORS file in your pull request. Deleted: vendor/mruby-eeac4be/Rakefile (+0 -114) 100644 =================================================================== --- vendor/mruby-eeac4be/Rakefile 2014-06-08 19:01:14 +0900 (c230a5f) +++ /dev/null @@ -1,114 +0,0 @@ -# encoding: utf-8 -# Build description. -# basic build file for mruby -MRUBY_ROOT = File.dirname(File.expand_path(__FILE__)) -MRUBY_BUILD_HOST_IS_CYGWIN = RUBY_PLATFORM.include?('cygwin') - -# load build systems -load "#{MRUBY_ROOT}/tasks/ruby_ext.rake" -load "#{MRUBY_ROOT}/tasks/mruby_build.rake" -load "#{MRUBY_ROOT}/tasks/mrbgem_spec.rake" - -# load configuration file -MRUBY_CONFIG = (ENV['MRUBY_CONFIG'] && ENV['MRUBY_CONFIG'] != '') ? ENV['MRUBY_CONFIG'] : "#{MRUBY_ROOT}/build_config.rb" -load MRUBY_CONFIG - -# load basic rules -MRuby.each_target do |build| - build.define_rules -end - -# load custom rules -load "#{MRUBY_ROOT}/src/mruby_core.rake" -load "#{MRUBY_ROOT}/mrblib/mrblib.rake" -load "#{MRUBY_ROOT}/tools/mrbc/mrbc.rake" - -load "#{MRUBY_ROOT}/tasks/mrbgems.rake" -load "#{MRUBY_ROOT}/tasks/libmruby.rake" - -load "#{MRUBY_ROOT}/tasks/mrbgems_test.rake" -load "#{MRUBY_ROOT}/test/mrbtest.rake" - -############################## -# generic build targets, rules -task :default => :all - -depfiles = MRuby.targets['host'].bins.map do |bin| - install_path = MRuby.targets['host'].exefile("#{MRUBY_ROOT}/bin/#{bin}") - source_path = MRuby.targets['host'].exefile("#{MRuby.targets['host'].build_dir}/bin/#{bin}") - - file install_path => source_path do |t| - FileUtils.rm_f t.name, { :verbose => $verbose } - FileUtils.cp t.prerequisites.first, t.name, { :verbose => $verbose } - end - - install_path -end - -MRuby.each_target do |target| - gems.map do |gem| - current_dir = gem.dir.relative_path_from(Dir.pwd) - relative_from_root = gem.dir.relative_path_from(MRUBY_ROOT) - current_build_dir = "#{build_dir}/#{relative_from_root}" - - gem.bins.each do |bin| - exec = exefile("#{build_dir}/bin/#{bin}") - objs = Dir.glob("#{current_dir}/tools/#{bin}/*.{c,cpp,cxx}").map { |f| objfile(f.pathmap("#{current_build_dir}/tools/#{bin}/%n")) } - - file exec => objs + [libfile("#{build_dir}/lib/libmruby")] do |t| - gem_flags = gems.map { |g| g.linker.flags } - gem_flags_before_libraries = gems.map { |g| g.linker.flags_before_libraries } - gem_flags_after_libraries = gems.map { |g| g.linker.flags_after_libraries } - gem_libraries = gems.map { |g| g.linker.libraries } - gem_library_paths = gems.map { |g| g.linker.library_paths } - linker.run t.name, t.prerequisites, gem_libraries, gem_library_paths, gem_flags, gem_flags_before_libraries - end - - if target == MRuby.targets['host'] - install_path = MRuby.targets['host'].exefile("#{MRUBY_ROOT}/bin/#{bin}") - - file install_path => exec do |t| - FileUtils.rm_f t.name, { :verbose => $verbose } - FileUtils.cp t.prerequisites.first, t.name, { :verbose => $verbose } - end - depfiles += [ install_path ] - else - depfiles += [ exec ] - end - end - end -end - -depfiles += MRuby.targets.map { |n, t| - [t.libfile("#{t.build_dir}/lib/libmruby")] -}.flatten - -depfiles += MRuby.targets.reject { |n, t| n == 'host' }.map { |n, t| - t.bins.map { |bin| t.exefile("#{t.build_dir}/bin/#{bin}") } -}.flatten - -desc "build all targets, install (locally) in-repo" -task :all => depfiles do - puts - puts "Build summary:" - puts - MRuby.each_target do - print_build_summary - end -end - -desc "run all mruby tests" -task :test => MRuby.targets.values.map { |t| t.build_mrbtest_lib_only? ? t.libfile("#{t.build_dir}/test/mrbtest") : t.exefile("#{t.build_dir}/test/mrbtest") } do - MRuby.each_target do - run_test unless build_mrbtest_lib_only? - end -end - -desc "clean all built and in-repo installed artifacts" -task :clean do - MRuby.each_target do |t| - FileUtils.rm_rf t.build_dir, { :verbose => $verbose } - end - FileUtils.rm_f depfiles, { :verbose => $verbose } - puts "Cleaned up build folder" -end Deleted: vendor/mruby-eeac4be/TODO (+0 -11) 100644 =================================================================== --- vendor/mruby-eeac4be/TODO 2014-06-08 19:01:14 +0900 (d3cb483) +++ /dev/null @@ -1,11 +0,0 @@ -Things to do (Things that are not done yet) - -* Special variables ($1,$2..) -* super in aliased methods - -Things to improve (Done but things to fix) - -* Hash (Reduce size. Use khash or save the order) -* stringEx (Delete encoding、delete CODERANGE、delete everything except UTF-8 or ASCII) -* Make additions as they are noticed. - Deleted: vendor/mruby-eeac4be/benchmark/ao-render.rb (+0 -315) 100644 =================================================================== --- vendor/mruby-eeac4be/benchmark/ao-render.rb 2014-06-08 19:01:14 +0900 (793804a) +++ /dev/null @@ -1,315 +0,0 @@ -# AO render benchmark -# Original program (C) Syoyo Fujita in Javascript (and other languages) -# http://lucille.atso-net.jp/blog/?p=642 -# http://lucille.atso-net.jp/blog/?p=711 -# Ruby(yarv2llvm) version by Hideki Miura -# mruby version by Hideki Miura -# - -IMAGE_WIDTH = 256 -IMAGE_HEIGHT = 256 -NSUBSAMPLES = 2 -NAO_SAMPLES = 8 - -module Rand - # Use xorshift - @@x = 123456789 - @@y = 362436069 - @@z = 521288629 - @@w = 88675123 - BNUM = 1 << 29 - BNUMF = BNUM.to_f - def self.rand - x = @@x - t = x ^ ((x & 0xfffff) << 11) - w = @@w - @@x, @@y, @@z = @@y, @@z, w - w = @@w = (w ^ (w >> 19) ^ (t ^ (t >> 8))) - (w % BNUM) / BNUMF - end -end - -class Vec - def initialize(x, y, z) - @x = x - @y = y - @z = z - end - - def x=(v); @x = v; end - def y=(v); @y = v; end - def z=(v); @z = v; end - def x; @x; end - def y; @y; end - def z; @z; end - - def vadd(b) - Vec.new(@x + b.x, @y + b.y, @z + b.z) - end - - def vsub(b) - Vec.new(@x - b.x, @y - b.y, @z - b.z) - end - - def vcross(b) - Vec.new(@y * b.z - @z * b.y, - @z * b.x - @x * b.z, - @x * b.y - @y * b.x) - end - - def vdot(b) - r = @x * b.x + @y * b.y + @z * b.z - r - end - - def vlength - Math.sqrt(@x * @x + @y * @y + @z * @z) - end - - def vnormalize - len = vlength - v = Vec.new(@x, @y, @z) - if len > 1.0e-17 then - v.x = v.x / len - v.y = v.y / len - v.z = v.z / len - end - v - end -end - - -class Sphere - def initialize(center, radius) - @center = center - @radius = radius - end - - def center; @center; end - def radius; @radius; end - - def intersect(ray, isect) - rs = ray.org.vsub(@center) - b = rs.vdot(ray.dir) - c = rs.vdot(rs) - (@radius * @radius) - d = b * b - c - if d > 0.0 then - t = - b - Math.sqrt(d) - - if t > 0.0 and t < isect.t then - isect.t = t - isect.hit = true - isect.pl = Vec.new(ray.org.x + ray.dir.x * t, - ray.org.y + ray.dir.y * t, - ray.org.z + ray.dir.z * t) - n = isect.pl.vsub(@center) - isect.n = n.vnormalize - end - end - end -end - -class Plane - def initialize(p, n) - @p = p - @n = n - end - - def intersect(ray, isect) - d = - �� p.vdot(@n) - v = ray.dir.vdot(@n) - v0 = v - if v < 0.0 then - v0 = -v - end - if v0 < 1.0e-17 then - return - end - - t = -(ray.org.vdot(@n) + d) / v - - if t > 0.0 and t < isect.t then - isect.hit = true - isect.t = t - isect.n = @n - isect.pl = Vec.new(ray.org.x + t * ray.dir.x, - ray.org.y + t * ray.dir.y, - ray.org.z + t * ray.dir.z) - end - end -end - -class Ray - def initialize(org, dir) - @org = org - @dir = dir - end - - def org; @org; end - def org=(v); @org = v; end - def dir; @dir; end - def dir=(v); @dir = v; end -end - -class Isect - def initialize - @t = 10000000.0 - @hit = false - @pl = Vec.new(0.0, 0.0, 0.0) - @n = Vec.new(0.0, 0.0, 0.0) - end - - def t; @t; end - def t=(v); @t = v; end - def hit; @hit; end - def hit=(v); @hit = v; end - def pl; @pl; end - def pl=(v); @pl = v; end - def n; @n; end - def n=(v); @n = v; end -end - -def clamp(f) - i = f * 255.5 - if i > 255.0 then - i = 255.0 - end - if i < 0.0 then - i = 0.0 - end - i.to_i -end - -def otherBasis(basis, n) - basis[2] = Vec.new(n.x, n.y, n.z) - basis[1] = Vec.new(0.0, 0.0, 0.0) - - if n.x < 0.6 and n.x > -0.6 then - basis[1].x = 1.0 - elsif n.y < 0.6 and n.y > -0.6 then - basis[1].y = 1.0 - elsif n.z < 0.6 and n.z > -0.6 then - basis[1].z = 1.0 - else - basis[1].x = 1.0 - end - - basis[0] = basis[1].vcross(basis[2]) - basis[0] = basis[0].vnormalize - - basis[1] = basis[2].vcross(basis[0]) - basis[1] = basis[1].vnormalize -end - -class Scene - def initialize - @spheres = Array.new - @spheres[0] = Sphere.new(Vec.new(-2.0, 0.0, -3.5), 0.5) - @spheres[1] = Sphere.new(Vec.new(-0.5, 0.0, -3.0), 0.5) - @spheres[2] = Sphere.new(Vec.new(1.0, 0.0, -2.2), 0.5) - @plane = Plane.new(Vec.new(0.0, -0.5, 0.0), Vec.new(0.0, 1.0, 0.0)) - end - - def ambient_occlusion(isect) - basis = Array.new(3) - otherBasis(basis, isect.n) - - ntheta = NAO_SAMPLES - nphi = NAO_SAMPLES - eps = 0.0001 - occlusion = 0.0 - - p0 = Vec.new(isect.pl.x + eps * isect.n.x, - isect.pl.y + eps * isect.n.y, - isect.pl.z + eps * isect.n.z) - nphi.times do |j| - ntheta.times do |i| - r = Rand::rand - phi = 2.0 * 3.14159265 * Rand::rand - x = Math.cos(phi) * Math.sqrt(1.0 - r) - y = Math.sin(phi) * Math.sqrt(1.0 - r) - z = Math.sqrt(r) - - rx = x * basis[0].x + y * basis[1].x + z * basis[2].x - ry = x * basis[0].y + y * basis[1].y + z * basis[2].y - rz = x * basis[0].z + y * basis[1].z + z * basis[2].z - - raydir = Vec.new(rx, ry, rz) - ray = Ray.new(p0, raydir) - - occisect = Isect.new - @spheres[0].intersect(ray, occisect) - @spheres[1].intersect(ray, occisect) - @spheres[2].intersect(ray, occisect) - @plane.intersect(ray, occisect) - if occisect.hit then - occlusion = occlusion + 1.0 - else - 0.0 - end - end - end - - occlusion = (ntheta.to_f * nphi.to_f - occlusion) / (ntheta.to_f * nphi.to_f) - Vec.new(occlusion, occlusion, occlusion) - end - - def render(w, h, nsubsamples) - cnt = 0 - nsf = nsubsamples.to_f - h.times do |y| - w.times do |x| - rad = Vec.new(0.0, 0.0, 0.0) - - # Subsmpling - nsubsamples.times do |v| - nsubsamples.times do |u| - cnt = cnt + 1 - wf = w.to_f - hf = h.to_f - xf = x.to_f - yf = y.to_f - uf = u.to_f - vf = v.to_f - - px = (xf + (uf / nsf) - (wf / 2.0)) / (wf / 2.0) - py = -(yf + (vf / nsf) - (hf / 2.0)) / (hf / 2.0) - - eye = Vec.new(px, py, -1.0).vnormalize - - ray = Ray.new(Vec.new(0.0, 0.0, 0.0), eye) - - isect = Isect.new - @spheres[0].intersect(ray, isect) - @spheres[1].intersect(ray, isect) - @spheres[2].intersect(ray, isect) - @plane.intersect(ray, isect) - if isect.hit then - col = ambient_occlusion(isect) - rad.x = rad.x + col.x - rad.y = rad.y + col.y - rad.z = rad.z + col.z - else - 0.0 - end - end - end - - r = rad.x / (nsf * nsf) - g = rad.y / (nsf * nsf) - b = rad.z / (nsf * nsf) - printf("%c", clamp(r)) - printf("%c", clamp(g)) - printf("%c", clamp(b)) - end - end - end -end - -# File.open("ao.ppm", "w") do |fp| - printf("P6\n") - printf("%d %d\n", IMAGE_WIDTH, IMAGE_HEIGHT) - printf("255\n", IMAGE_WIDTH, IMAGE_HEIGHT) - Scene.new.render(IMAGE_WIDTH, IMAGE_HEIGHT, NSUBSAMPLES) -# Scene.new.render(256, 256, 2) -# end Deleted: vendor/mruby-eeac4be/benchmark/bm_so_lists.rb (+0 -47) 100644 =================================================================== --- vendor/mruby-eeac4be/benchmark/bm_so_lists.rb 2014-06-08 19:01:14 +0900 (f8d2679) +++ /dev/null @@ -1,47 +0,0 @@ -#from http://www.bagley.org/~doug/shootout/bench/lists/lists.ruby - -NUM = 300 -SIZE = 10000 - -def test_lists() - # create a list of integers (Li1) from 1 to SIZE - li1 = (1..SIZE).to_a - # copy the list to li2 (not by individual items) - li2 = li1.dup - # remove each individual item from left side of li2 and - # append to right side of li3 (preserving order) - li3 = Array.new - while (not li2.empty?) - li3.push(li2.shift) - end - # li2 must now be empty - # remove each individual item from right side of li3 and - # append to right side of li2 (reversing list) - while (not li3.empty?) - li2.push(li3.pop) - end - # li3 must now be empty - # reverse li1 in place - li1.reverse! - # check that first item is now SIZE - if li1[0] != SIZE then - p "not SIZE" - 0 - else - # compare li1 and li2 for equality - if li1 != li2 then - return(0) - else - # return the length of the list - li1.length - end - end -end - -i = 0 -while i<NUM - i+=1 - result = test_lists() -end - -result Deleted: vendor/mruby-eeac4be/benchmark/fib39.rb (+0 -8) 100755 =================================================================== --- vendor/mruby-eeac4be/benchmark/fib39.rb 2014-06-08 19:01:14 +0900 (d5565b7) +++ /dev/null @@ -1,8 +0,0 @@ -# Fib 39 - -def fib n - return n if n < 2 - fib(n-2) + fib(n-1) -end - -puts fib(39) Deleted: vendor/mruby-eeac4be/build_config.rb (+0 -88) 100644 =================================================================== --- vendor/mruby-eeac4be/build_config.rb 2014-06-08 19:01:14 +0900 (fce4246) +++ /dev/null @@ -1,88 +0,0 @@ -MRuby::Build.new do |conf| - # load specific toolchain settings - toolchain :gcc - - # Use mrbgems - # conf.gem 'examples/mrbgems/ruby_extension_example' - # conf.gem 'examples/mrbgems/c_extension_example' do |g| - # g.cc.flags << '-g' # append cflags in this gem - # end - # conf.gem 'examples/mrbgems/c_and_ruby_extension_example' - # conf.gem :github => 'masuidrive/mrbgems-example', :branch => 'master' - # conf.gem :git => 'git �� github.com:masuidrive/mrbgems-example.git', :branch => 'master', :options => '-v' - - # include the default GEMs - conf.gembox 'default' - - # C compiler settings - # conf.cc do |cc| - # cc.command = ENV['CC'] || 'gcc' - # cc.flags = [ENV['CFLAGS'] || %w()] - # cc.include_paths = ["#{root}/include"] - # cc.defines = %w(DISABLE_GEMS) - # cc.option_include_path = '-I%s' - # cc.option_define = '-D%s' - # cc.compile_options = "%{flags} -MMD -o %{outfile} -c %{infile}" - # end - - # mrbc settings - # conf.mrbc do |mrbc| - # mrbc.compile_options = "-g -B%{funcname} -o-" # The -g option is required for line numbers - # end - - # Linker settings - # conf.linker do |linker| - # linker.command = ENV['LD'] || 'gcc' - # linker.flags = [ENV['LDFLAGS'] || []] - # linker.flags_before_libraries = [] - # linker.libraries = %w() - # linker.flags_after_libraries = [] - # linker.library_paths = [] - # linker.option_library = '-l%s' - # linker.option_library_path = '-L%s' - # linker.link_options = "%{flags} -o %{outfile} %{objs} %{libs}" - # end - - # Archiver settings - # conf.archiver do |archiver| - # archiver.command = ENV['AR'] || 'ar' - # archiver.archive_options = 'rs %{outfile} %{objs}' - # end - - # Parser generator settings - # conf.yacc do |yacc| - # yacc.command = ENV['YACC'] || 'bison' - # yacc.compile_options = '-o %{outfile} %{infile}' - # end - - # gperf settings - # conf.gperf do |gperf| - # gperf.command = 'gperf' - # gperf.compile_options = '-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" %{infile} > %{outfile}' - # end - - # file extensions - # conf.exts do |exts| - # exts.object = '.o' - # exts.executable = '' # '.exe' if Windows - # exts.library = '.a' - # end - - # file separetor - # conf.file_separator = '/' -end - -# Define cross build settings -# MRuby::CrossBuild.new('32bit') do |conf| -# toolchain :gcc -# -# conf.cc.flags << "-m32" -# conf.linker.flags << "-m32" -# -# conf.build_mrbtest_lib_only -# -# conf.gem 'examples/mrbgems/c_and_ruby_extension_example' -# -# conf.test_runner.command = 'env' -# -# end Deleted: vendor/mruby-eeac4be/doc/.gitkeep (+0 -0) 100644 =================================================================== --- vendor/mruby-eeac4be/doc/.gitkeep 2014-06-08 19:01:14 +0900 (e69de29) +++ /dev/null Deleted: vendor/mruby-eeac4be/doc/compile/README.md (+0 -376) 100644 =================================================================== --- vendor/mruby-eeac4be/doc/compile/README.md 2014-06-08 19:01:14 +0900 (e7f382f) +++ /dev/null @@ -1,376 +0,0 @@ -# Compile - -mruby is using Rake to compile and cross-compile all libraries and -binaries. - -## Prerequisites - -To compile mruby out of the source code you need the following tools: -* C Compiler (i.e. ```gcc```) -* Linker (i.e. ```gcc```) -* Archive utility (i.e. ```ar```) -* Parser generator (i.e. ```bison```) -* Ruby 1.8 or 1.9 (i.e. ```ruby``` or ```jruby```) - -Optional: -* GIT (to update mruby source and integrate mrbgems easier) -* C++ compiler (to use GEMs which include *.cpp) -* Assembler (to use GEMs which include *.asm) - -## Usage - -Inside of the root directory of the mruby source a file exists -called *build_config.rb*. This file contains the build configuration -of mruby and looks like this for example: - - MRuby::Build.new do |conf| - toolchain :gcc - end - -All tools necessary to compile mruby can be set or modified here. In case -you want to maintain an additional *build_config.rb* you can define a -customized path using the *$MRUBY_CONFIG* environment variable. - -To compile just call ```./minirake``` inside of the mruby source root. To -generate and execute the test tools call ```./minirake test```. To clean -all build files call ```./minirake clean```. To see full command line on -build, call ```./minirake -v```. - -## Build Configuration - -Inside of the *build_config.rb* the following options can be configured -based on your environment. - -### Toolchains - -The mruby build system already contains a set of toolchain templates which -configure the build environment for specific compiler infrastructures. - -#### GCC - -Toolchain configuration for the GNU C Compiler. - - toolchain :gcc - -#### clang - -Toolchain configuration for the LLVM C Compiler clang. Mainly equal to the -GCC toolchain. - - toolchain :clang - -#### Visual Studio 2010 - -Toolchain configuration for Visual Studio 2010 on Windows. - - toolchain :vs2010 - -#### Visual Studio 2012 - -Toolchain configuration for Visual Studio 2012 on Windows. - - toolchain :vs2012 - -#### Android - -Toolchain configuration for Android. - - toolchain :androideabi - -Requires the custom standalone Android NDK and the toolchain path -in ```ANDROID_STANDALONE_TOOLCHAIN```. - -### Binaries - -It is possible to select which tools should be compiled during the compilation -process. The following tools can be selected: -* mruby (mruby interpreter) -* mirb (mruby interactive shell) - -To select them declare conf.gem as follows: - - conf.gem "#{root}/mrbgems/mruby-bin-mruby" - - conf.gem "#{root}/mrbgems/mruby-bin-mirb" - -### File Separator - -Some environments require a different file separator character. It is possible to -set the character via ```conf.file_separator```. - - conf.file_separator = '/' - -### C Compiler - -Configuration of the C compiler binary, flags and include paths. - - conf.cc do |cc| - cc.command = ... - cc.flags = ... - cc.include_paths = ... - cc.defines = ... - cc.option_include_path = ... - cc.option_define = ... - cc.compile_options = ... - end - -### Linker - -Configuration of the Linker binary, flags and library paths. - - conf.linker do |linker| - linker.command = ... - linker.flags = ... - linker.flags_before_libraries = ... - linker.libraries = ... - linker.flags_after_libraries = ... - linker.library_paths = .... - linker.option_library = ... - linker.option_library_path = ... - linker.link_options = ... - end - -### Archiver - -Configuration of the Archiver binary and flags. - - conf.archiver do |archiver| - archiver.command = ... - archiver.archive_options = ... - end - -### Parser Generator - -Configuration of the Parser Generator binary and flags. - - conf.yacc do |yacc| - yacc.command = ... - yacc.compile_options = ... - end - -### GPerf - -Configuration of the GPerf binary and flags. - - conf.gperf do |gperf| - gperf.command = ... - gperf.compile_options = ... - end - -### File Extensions - - conf.exts do |exts - exts.object = ... - exts.executable = ... - exts.library = ... - end - -### Mrbgems - -Integrate GEMs in the build process. - - # Integrate GEM with additional configuration - conf.gem 'path/to/gem' do |g| - g.cc.flags << ... - end - - # Integrate GEM without additional configuration - conf.gem 'path/to/another/gem' - - -See doc/mrbgems/README.md for more option about mrbgems. -### Mrbtest - -Configuration Mrbtest build process. - -If you want mrbtest.a only, You should set ```conf.build_mrbtest_lib_only``` - - conf.build_mrbtest_lib_only - - -## Cross-Compilation - -mruby can also be cross-compiled from one platform to another. To -achieve this the *build_config.rb* needs to contain an instance of -```MRuby::CrossBuild```. This instance defines the compilation -tools and flags for the target platform. An example could look -like this: - - MRuby::CrossBuild.new('32bit') do |conf| - toolchain :gcc - - conf.cc.flags << "-m32" - conf.linker.flags << "-m32" - end - -All configuration options of ```MRuby::Build``` can also be used -in ```MRuby::CrossBuild```. - -## Build process - -During the build process the directory *build* will be created in the -root directory. The structure of this directory will look like this: - - +- build - | - +- host - | - +- bin <- Binaries (mirb, mrbc and mruby) - | - +- lib <- Libraries (libmruby.a and libmruby_core.a) - | - +- mrblib - | - +- src - | - +- test <- mrbtest tool - | - +- tools - | - +- mirb - | - +- mrbc - | - +- mruby - -The compilation workflow will look like this: -* compile all files under *src* (object files will be stored -in *build/host/src*) -* generate parser grammar out of *src/parse.y* (generated -result will be stored in *build/host/src/y.tab.c*) -* compile *build/host/src/y.tab.c* to *build/host/src/y.tab.o* -* create *build/host/lib/libmruby_core.a* out of all object files (C only) -* create ```build/host/bin/mrbc``` by compiling *tools/mrbc/mrbc.c* and -linking with *build/host/lib/libmruby_core.a* -* create *build/host/mrblib/mrblib.c* by compiling all *.rb files -under *mrblib* with ```build/host/bin/mrbc``` -* compile *build/host/mrblib/mrblib.c* to *build/host/mrblib/mrblib.o* -* create *build/host/lib/libmruby.a* out of all object files (C and Ruby) -* create ```build/host/bin/mruby``` by compiling *mrbgems/mruby-bin-mruby/tools/mruby/mruby.c* and -linking with *build/host/lib/libmruby.a* -* create ```build/host/bin/mirb``` by compiling *mrbgems/mruby-bin-mirb/tools/mirb/mirb.c* and -linking with *build/host/lib/libmruby.a* - -``` - _____ _____ ______ ____ ____ _____ _____ ____ -| CC |->|GEN |->|AR |->|CC |->|CC |->|AR |->|CC |->|CC | -| *.c | |y.tab| |core.a| |mrbc| |*.rb| |lib.a| |mruby| |mirb| - ----- ----- ------ ---- ---- ----- ----- ---- -``` - -### Cross-Compilation - -In case of a cross-compilation to *i386* the *build* directory structure looks -like this: - - +- build - | - +- host - | | - | +- bin <- Native Binaries - | | - | +- lib <- Native Libraries - | | - | +- mrblib - | | - | +- src - | | - | +- test <- Native mrbtest tool - | | - | +- tools - | | - | +- mirb - | | - | +- mrbc - | | - | +- mruby - +- i386 - | - +- bin <- Cross-compiled Binaries - | - +- lib <- Cross-compiled Libraries - | - +- mrblib - | - +- src - | - +- test <- Cross-compiled mrbtest tool - | - +- tools - | - +- mirb - | - +- mrbc - | - +- mruby - -An extra directory is created for the target platform. In case you -compile for *i386* a directory called *i386* is created under the -build direcotry. - -The cross compilation workflow starts in the same way as the normal -compilation by compiling all *native* libraries and binaries. -Afterwards the cross compilation process proceeds like this: -* cross-compile all files under *src* (object files will be stored -in *build/i386/src*) -* generate parser grammar out of *src/parse.y* (generated -result will be stored in *build/i386/src/y.tab.c*) -* cross-compile *build/i386/src/y.tab.c* to *build/i386/src/y.tab.o* -* create *build/i386/mrblib/mrblib.c* by compiling all *.rb files -under *mrblib* with the native ```build/host/bin/mrbc``` -* cross-compile *build/host/mrblib/mrblib.c* to *build/host/mrblib/mrblib.o* -* create *build/i386/lib/libmruby.a* out of all object files (C and Ruby) -* create ```build/i386/bin/mruby``` by cross-compiling *mrbgems/mruby-bin-mruby/tools/mruby/mruby.c* and -linking with *build/i386/lib/libmruby.a* -* create ```build/i386/bin/mirb``` by cross-compiling *mrbgems/mruby-bin-mirb/tools/mirb/mirb.c* and -linking with *build/i386/lib/libmruby.a* -* create *build/i386/lib/libmruby_core.a* out of all object files (C only) -* create ```build/i386/bin/mrbc``` by cross-compiling *tools/mrbc/mrbc.c* and -linking with *build/i386/lib/libmruby_core.a* - -``` - _______________________________________________________________ -| Native Compilation for Host System | -| _____ ______ _____ ____ ____ _____ | -| | CC | -> |AR | -> |GEN | -> |CC | -> |CC | -> |AR | | -| | *.c | |core.a| |y.tab| |mrbc| |*.rb| |lib.a| | -| ----- ------ ----- ---- ---- ----- | - --------------------------------------------------------------- - || - \||/ - \/ - ________________________________________________________________ -| Cross Compilation for Target System | -| _____ _____ _____ ____ ______ _____ | -| | CC | -> |AR | -> |CC | -> |CC | -> |AR | -> |CC | | -| | *.c | |lib.a| |mruby| |mirb| |core.a| |mrbc | | -| ----- ----- ----- ---- ------ ----- | - ---------------------------------------------------------------- -``` - -## Build Configuration Examples - -### Minimal Library - -To build a minimal mruby library you need to use the Cross Compiling -feature due to the reason that there are functions (i.e. stdio) which -can't be disabled for the main build. - - MRuby::CrossBuild.new('Minimal') do |conf| - toolchain :gcc - - conf.cc.defines = %w(DISABLE_STDIO) - conf.bins = [] - end - -This configuration defines a cross compile build called 'Minimal' which -is using the GCC and compiles for the host machine. It also disables -all usages of stdio and doesn't compile any binaries (i.e. mrbc). - -## Test Environment - -mruby's build process includes a test environment. In case you start the testing -of mruby, a native binary called ```mrbtest``` will be generated and executed. -This binary contains all test cases which are defined under *test/t*. In case -of a cross-compilation an additional cross-compiled *mrbtest* binary is -generated. You can copy this binary and run on your target system. Deleted: vendor/mruby-eeac4be/doc/mrbgems/README.md (+0 -254) 100644 =================================================================== --- vendor/mruby-eeac4be/doc/mrbgems/README.md 2014-06-08 19:01:14 +0900 (65b794d) +++ /dev/null @@ -1,254 +0,0 @@ -# mrbgems - -mrbgems is a library manager to integrate C and Ruby extension in an easy and -standardised way into mruby. - -## Usage - -By default mrbgems is currently deactivated. As soon as you add a GEM to your -build configuration (i.e. *build_config.rb*), mrbgems will be activated and the -extension integrated. - -To add a GEM into the *build_config.rb* add the following line for example: - - conf.gem '/path/to/your/gem/dir' - -You can also use a relative path which would be relative from the mruby root: - - conf.gem 'examples/mrbgems/ruby_extension_example' - -A remote GIT repository location for a GEM is also supported: - - conf.gem :git => 'https://github.com/masuidrive/mrbgems-example.git', :branch => 'master' - - conf.gem :github => 'masuidrive/mrbgems-example', :branch => 'master' - - conf.gem :bitbucket => 'mruby/mrbgems-example', :branch => 'master' - -To pull all gems from remote GIT repository on build, call ```./minirake -p```, -or ```./minirake --pull-gems```. - -NOTE: `:bitbucket` option supports only git. Hg is unsupported in this version. - -## GemBox - -There are instances when you wish to add a collection of mrbgems into mruby at -once, or be able to substitute mrbgems based on configuration, without having to -add each gem to the *build_config.rb* file. A packaged collection of mrbgems -is called a GemBox. A GemBox is a file that contains a list of mrbgems to load -into mruby, in the same format as if you were adding them to *build_config.rb* -via `config.gem`, but wrapped in an `MRuby::GemBox` object. GemBoxes are -loaded into mruby via `config.gembox 'boxname'`. - -Below we have created a GemBox containing *mruby-time* and *mrbgems-example*: - - MRuby::GemBox.new do |conf| - conf.gem "#{root}/mrbgems/mruby-time" - conf.gem :github => 'masuidrive/mrbgems-example' - end - -As mentioned, the GemBox uses the same conventions as `MRuby::Build`. The GemBox -must be saved with a *.gembox* extension inside the *mrbgems* directory to to be -picked up by mruby. - -To use this example GemBox, we save it as `custom.gembox` inside the *mrbgems* -directory in mruby, and add the following to our *build_config.rb* file inside -the build block: - - conf.gembox 'custom' - -This will cause the *custom* GemBox to be read in during the build process, -adding *mruby-time* and *mrbgems-example* to the build. - -If you want, you can put GemBox outside of mruby directory. In that case you must -specify absolute path like below. - - conf.gembox "#{ENV["HOME"]}/mygemboxes/custom" - -There are two GemBoxes that ship with mruby: [default](../../mrbgems/default.gembox) -and [full-core](../../mrbgems/full-core.gembox). The [default](../../mrbgems/default.gembox) GemBox -contains several core components of mruby, and [full-core](../../mrbgems/full-core.gembox) -contains every gem found in the *mrbgems* directory. - -## GEM Structure - -The maximal GEM structure looks like this: - - +- GEM_NAME <- Name of GEM - | - +- mrblib/ <- Source for Ruby extension - | - +- src/ <- Source for C extension - | - +- test/ <- Test code (Ruby) - | - +- mrbgem.rake <- GEM Specification - | - +- README.md <- Readme for GEM - -The folder *mrblib* contains pure Ruby files to extend mruby. The folder *src* -contains C files to extend mruby. The folder *test* contains C and pure Ruby files -for testing purposes which will be used by `mrbtest`. *mrbgem.rake* contains -the specification to compile C and Ruby files. *README.md* is a short description -of your GEM. - -## Build process - -mrbgems expects a specification file called *mrbgem.rake* inside of your -GEM directory. A typical GEM specification could look like this for example: - - MRuby::Gem::Specification.new('c_and_ruby_extension_example') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' - end - -The mrbgems build process will use this specification to compile Object and Ruby -files. The compilation results will be added to *lib/libmruby.a*. This file exposes -the GEM functionality to tools like `mruby` and `mirb`. - -The following properties can be set inside of your `MRuby::Gem::Specification` for -information purpose: - -* `spec.license` or `spec.licenses` (A single license or a list of them under which this GEM is licensed) -* `spec.author` or `spec.authors` (Developer name or a list of them) -* `spec.version` (Current version) -* `spec.description` (Detailed description) -* `spec.summary` (Short summary) -* `spec.homepage` (Homepage) -* `spec.requirements` (External requirements as information for user) - -The license and author properties are required in every GEM! - -In case your GEM is depending on other GEMs please use -`spec.add_dependency(gem, *requirements)` like: - - MRuby::Gem::Specification.new('c_and_ruby_extension_example') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' - - # add GEM dependency mruby-parser. - # Version has to be between 1.0.0 and 1.5.2 - spec.add_dependency('mruby-parser', '> 1.0.0', '< 1.5.2') - end - -The usage of versions is optional. - -__ATTENTION:__ -The dependency system is currently (May 2013) under development and doesn't check -or resolve dependencies! - -In case your GEM has more complex build requirements you can use -the following options additionally inside of your GEM specification: - -* `spec.cflags` (C compiler flags) -* `spec.mruby_cflags` (global C compiler flags for everything) -* `spec.mruby_ldflags` (global linker flags for everything) -* `spec.mruby_libs` (global libraries for everything) -* `spec.mruby_includes` (global includes for everything) -* `spec.rbfiles` (Ruby files to compile) -* `spec.objs` (Object files to compile) -* `spec.test_rbfiles` (Ruby test files for integration into mrbtest) -* `spec.test_objs` (Object test files for integration into mrbtest) -* `spec.test_preload` (Initialization files for mrbtest) - -## C Extension - -mruby can be extended with C. This is possible by using the C API to -integrate C libraries into mruby. - -### Preconditions - -mrbgems expects that you have implemented a C method called -`mrb_YOURGEMNAME_gem_init(mrb_state)`. `YOURGEMNAME` will be replaced -by the name of your GEM. If you call your GEM *c_extension_example*, your -initialisation method could look like this: - - void - mrb_c_extension_example_gem_init(mrb_state* mrb) { - struct RClass *class_cextension = mrb_define_module(mrb, "CExtension"); - mrb_define_class_method(mrb, class_cextension, "c_method", mrb_c_method, MRB_ARGS_NONE()); - } - -### Finalize - -mrbgems expects that you have implemented a C method called -`mrb_YOURGEMNAME_gem_final(mrb_state)`. `YOURGEMNAME` will be replaced -by the name of your GEM. If you call your GEM *c_extension_example*, your -finalizer method could look like this: - - void - mrb_c_extension_example_gem_final(mrb_state* mrb) { - free(someone); - } - -### Example - - +- c_extension_example/ - | - +- src/ - | | - | +- example.c <- C extension source - | - +- test/ - | | - | +- example.rb <- Test code for C extension - | - +- mrbgem.rake <- GEM specification - | - +- README.md - -## Ruby Extension - -mruby can be extended with pure Ruby. It is possible to override existing -classes or add new ones in this way. Put all Ruby files into the *mrblib* -folder. - -### Pre-Conditions - -none - -### Example - - +- ruby_extension_example/ - | - +- mrblib/ - | | - | +- example.rb <- Ruby extension source - | - +- test/ - | | - | +- example.rb <- Test code for Ruby extension - | - +- mrbgem.rake <- GEM specification - | - +- README.md - -## C and Ruby Extension - -mruby can be extended with C and Ruby at the same time. It is possible to -override existing classes or add new ones in this way. Put all Ruby files -into the *mrblib* folder and all C files into the *src* folder. - -### Pre-Conditions - -See C and Ruby example. - -### Example - - +- c_and_ruby_extension_example/ - | - +- mrblib/ - | | - | +- example.rb <- Ruby extension source - | - +- src/ - | | - | +- example.c <- C extension source - | - +- test/ - | | - | +- example.rb <- Test code for C and Ruby extension - | - +- mrbgem.rake <- GEM specification - | - +- README.md Deleted: vendor/mruby-eeac4be/examples/mrbgems/c_and_ruby_extension_example/README.md (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/examples/mrbgems/c_and_ruby_extension_example/README.md 2014-06-08 19:01:14 +0900 (0b428b0) +++ /dev/null @@ -1,4 +0,0 @@ -C and Ruby Extension Example -========= - -This is an example gem which implements a C and Ruby extension. Deleted: vendor/mruby-eeac4be/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake (+0 -23) 100644 =================================================================== --- vendor/mruby-eeac4be/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake 2014-06-08 19:01:14 +0900 (a1f964b) +++ /dev/null @@ -1,23 +0,0 @@ -MRuby::Gem::Specification.new('c_and_ruby_extension_example') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' - - # Add compile flags - # spec.cc.flags << '' - - # Add cflags to all - # spec.mruby.cc.flags << '-g' - - # Add libraries - # spec.linker.libraries << 'external_lib' - - # Default build files - # spec.rbfiles = Dir.glob("#{dir}/mrblib/*.rb") - # spec.objs = Dir.glob("#{dir}/src/*.{c,cpp,m,asm,S}").map { |f| objfile(f.relative_path_from(dir).pathmap("#{build_dir}/%X")) } - # spec.test_rbfiles = Dir.glob("#{dir}/test/*.rb") - # spec.test_objs = Dir.glob("#{dir}/test/*.{c,cpp,m,asm,S}").map { |f| objfile(f.relative_path_from(dir).pathmap("#{build_dir}/%X")) } - # spec.test_preload = 'test/assert.rb' - - # Values accessible as TEST_ARGS inside test scripts - # spec.test_args = {'tmp_dir' => Dir::tmpdir} -end Deleted: vendor/mruby-eeac4be/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb (+0 -5) 100644 =================================================================== --- vendor/mruby-eeac4be/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb 2014-06-08 19:01:14 +0900 (d3899c3) +++ /dev/null @@ -1,5 +0,0 @@ -module CRubyExtension - def CRubyExtension.ruby_method - puts "A Ruby Extension" - end -end Deleted: vendor/mruby-eeac4be/examples/mrbgems/c_and_ruby_extension_example/src/example.c (+0 -20) 100644 =================================================================== --- vendor/mruby-eeac4be/examples/mrbgems/c_and_ruby_extension_example/src/example.c 2014-06-08 19:01:14 +0900 (5566b71) +++ /dev/null @@ -1,20 +0,0 @@ -#include <mruby.h> -#include <stdio.h> - -static mrb_value -mrb_c_method(mrb_state *mrb, mrb_value self) -{ - puts("A C Extension"); - return self; -} - -void -mrb_c_and_ruby_extension_example_gem_init(mrb_state* mrb) { - struct RClass *class_cextension = mrb_define_module(mrb, "CRubyExtension"); - mrb_define_class_method(mrb, class_cextension, "c_method", mrb_c_method, MRB_ARGS_NONE()); -} - -void -mrb_c_and_ruby_extension_example_gem_final(mrb_state* mrb) { - // finalizer -} Deleted: vendor/mruby-eeac4be/examples/mrbgems/c_and_ruby_extension_example/test/example.rb (+0 -7) 100644 =================================================================== --- vendor/mruby-eeac4be/examples/mrbgems/c_and_ruby_extension_example/test/example.rb 2014-06-08 19:01:14 +0900 (fffad71) +++ /dev/null @@ -1,7 +0,0 @@ -assert('C and Ruby Extension Example 1') do - CRubyExtension.respond_to? :c_method -end - -assert('C and Ruby Extension Example 2') do - CRubyExtension.respond_to? :ruby_method -end Deleted: vendor/mruby-eeac4be/examples/mrbgems/c_extension_example/README.md (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/examples/mrbgems/c_extension_example/README.md 2014-06-08 19:01:14 +0900 (3803c20) +++ /dev/null @@ -1,4 +0,0 @@ -C Extension Example -========= - -This is an example gem which implements a C extension. Deleted: vendor/mruby-eeac4be/examples/mrbgems/c_extension_example/mrbgem.rake (+0 -23) 100644 =================================================================== --- vendor/mruby-eeac4be/examples/mrbgems/c_extension_example/mrbgem.rake 2014-06-08 19:01:14 +0900 (3524e22) +++ /dev/null @@ -1,23 +0,0 @@ -MRuby::Gem::Specification.new('c_extension_example') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' - - # Add compile flags - # spec.cc.flags << '-g' - - # Add cflags to all - # spec.mruby.cc.flags << '-g' - - # Add libraries - # spec.linker.libraries << 'external_lib' - - # Default build files - # spec.rbfiles = Dir.glob("#{dir}/mrblib/*.rb") - # spec.objs = Dir.glob("#{dir}/src/*.{c,cpp,m,asm,S}").map { |f| objfile(f.relative_path_from(dir).pathmap("#{build_dir}/%X")) } - # spec.test_rbfiles = Dir.glob("#{dir}/test/*.rb") - # spec.test_objs = Dir.glob("#{dir}/test/*.{c,cpp,m,asm,S}").map { |f| objfile(f.relative_path_from(dir).pathmap("#{build_dir}/%X")) } - # spec.test_preload = 'test/assert.rb' - - # Values accessible as TEST_ARGS inside test scripts - # spec.test_args = {'tmp_dir' => Dir::tmpdir} -end Deleted: vendor/mruby-eeac4be/examples/mrbgems/c_extension_example/src/example.c (+0 -20) 100644 =================================================================== --- vendor/mruby-eeac4be/examples/mrbgems/c_extension_example/src/example.c 2014-06-08 19:01:14 +0900 (63517a9) +++ /dev/null @@ -1,20 +0,0 @@ -#include <mruby.h> -#include <stdio.h> - -static mrb_value -mrb_c_method(mrb_state *mrb, mrb_value self) -{ - puts("A C Extension"); - return self; -} - -void -mrb_c_extension_example_gem_init(mrb_state* mrb) { - struct RClass *class_cextension = mrb_define_module(mrb, "CExtension"); - mrb_define_class_method(mrb, class_cextension, "c_method", mrb_c_method, MRB_ARGS_NONE()); -} - -void -mrb_c_extension_example_gem_final(mrb_state* mrb) { - // finalizer -} Deleted: vendor/mruby-eeac4be/examples/mrbgems/c_extension_example/test/example.c (+0 -7) 100644 =================================================================== --- vendor/mruby-eeac4be/examples/mrbgems/c_extension_example/test/example.c 2014-06-08 19:01:14 +0900 (ab41033) +++ /dev/null @@ -1,7 +0,0 @@ -#include <mruby.h> - -void -mrb_c_extension_example_gem_test(mrb_state *mrb) -{ - /* test initializer in C */ -} Deleted: vendor/mruby-eeac4be/examples/mrbgems/c_extension_example/test/example.rb (+0 -3) 100644 =================================================================== --- vendor/mruby-eeac4be/examples/mrbgems/c_extension_example/test/example.rb 2014-06-08 19:01:14 +0900 (367d180) +++ /dev/null @@ -1,3 +0,0 @@ -assert('C Extension Example') do - CExtension.respond_to? :c_method -end Deleted: vendor/mruby-eeac4be/examples/mrbgems/ruby_extension_example/README.md (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/examples/mrbgems/ruby_extension_example/README.md 2014-06-08 19:01:14 +0900 (906a0d8) +++ /dev/null @@ -1,4 +0,0 @@ -Pure Ruby Extension Example -========= - -This is an example gem which implements a pure Ruby extension. Deleted: vendor/mruby-eeac4be/examples/mrbgems/ruby_extension_example/mrbgem.rake (+0 -23) 100644 =================================================================== --- vendor/mruby-eeac4be/examples/mrbgems/ruby_extension_example/mrbgem.rake 2014-06-08 19:01:14 +0900 (5624c33) +++ /dev/null @@ -1,23 +0,0 @@ -MRuby::Gem::Specification.new('ruby_extension_example') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' - - # Add compile flags - # spec.cc.flags << '' - - # Add cflags to all - # spec.mruby.cc.flags << '-g' - - # Add libraries - # spec.linker.libraries << 'external_lib' - - # Default build files - # spec.rbfiles = Dir.glob("#{dir}/mrblib/*.rb") - # spec.objs = Dir.glob("#{dir}/src/*.{c,cpp,m,asm,S}").map { |f| objfile(f.relative_path_from(dir).pathmap("#{build_dir}/%X")) } - # spec.test_rbfiles = Dir.glob("#{dir}/test/*.rb") - # spec.test_objs = Dir.glob("#{dir}/test/*.{c,cpp,m,asm,S}").map { |f| objfile(f.relative_path_from(dir).pathmap("#{build_dir}/%X")) } - # spec.test_preload = 'test/assert.rb' - - # Values accessible as TEST_ARGS inside test scripts - # spec.test_args = {'tmp_dir' => Dir::tmpdir} -end Deleted: vendor/mruby-eeac4be/examples/mrbgems/ruby_extension_example/mrblib/example.rb (+0 -5) 100644 =================================================================== --- vendor/mruby-eeac4be/examples/mrbgems/ruby_extension_example/mrblib/example.rb 2014-06-08 19:01:14 +0900 (b07a2b5) +++ /dev/null @@ -1,5 +0,0 @@ -class RubyExtension - def RubyExtension.ruby_method - puts "A Ruby Extension" - end -end Deleted: vendor/mruby-eeac4be/examples/mrbgems/ruby_extension_example/test/example.rb (+0 -3) 100644 =================================================================== --- vendor/mruby-eeac4be/examples/mrbgems/ruby_extension_example/test/example.rb 2014-06-08 19:01:14 +0900 (0c1b634) +++ /dev/null @@ -1,3 +0,0 @@ -assert('Ruby Extension Example') do - RubyExtension.respond_to? :ruby_method -end Deleted: vendor/mruby-eeac4be/examples/targets/ArduinoDue.rb (+0 -65) 100644 =================================================================== --- vendor/mruby-eeac4be/examples/targets/ArduinoDue.rb 2014-06-08 19:01:14 +0900 (a4af4a9) +++ /dev/null @@ -1,65 +0,0 @@ -# Cross Compiling configuration for Arduino Due -# http://arduino.cc/en/Main/ArduinoBoardDue -# -# Requires Arduino IDE >= 1.5 -MRuby::CrossBuild.new("Arduino Due") do |conf| - toolchain :gcc - - # Mac OS X - # ARDUINO_PATH = '/Applications/Arduino.app/Contents/Resources/Java' - # GNU Linux - ARDUINO_PATH = '/opt/arduino' - BIN_PATH = "#{ARDUINO_PATH}/hardware/tools/g++_arm_none_eabi/bin" - SAM_PATH = "#{ARDUINO_PATH}/hardware/arduino/sam" - TARGET_PATH = "#{SAM_PATH}/variants/arduino_due_x" - - conf.cc do |cc| - cc.command = "#{BIN_PATH}/arm-none-eabi-gcc" - cc.include_paths << ["#{SAM_PATH}/system/libsam", "#{SAM_PATH}/system/CMSIS/CMSIS/Include/", - "#{SAM_PATH}/system/CMSIS/Device/ATMEL/", - "#{SAM_PATH}/cores/arduino", "#{SAM_PATH}/libraries","#{TARGET_PATH}"] - cc.flags = %w(-g -Os -w -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 - -Dprintf=iprintf -mcpu=cortex-m3 -DF_CPU=84000000L -DARDUINO=152 -D__SAM3X8E__ -mthumb -DUSB_PID=0x003e -DUSB_VID=0x2341 -DUSBCON) - cc.compile_options = "%{flags} -o %{outfile} -c %{infile}" - - #configuration for low memory environment - cc.defines << %w(MRB_HEAP_PAGE_SIZE=64) - cc.defines << %w(MRB_USE_IV_SEGLIST) - cc.defines << %w(KHASH_DEFAULT_SIZE=8) - cc.defines << %w(MRB_STR_BUF_MIN_SIZE=20) - cc.defines << %w(MRB_GC_STRESS) - #cc.defines << %w(DISABLE_STDIO) #if you dont need stdio. - #cc.defines << %w(POOL_PAGE_SIZE=1000) #effective only for use with mruby-eval - end - - conf.cxx do |cxx| - cxx.command = conf.cc.command.dup - cxx.include_paths = conf.cc.include_paths.dup - cxx.flags = conf.cc.flags.dup - cxx.defines = conf.cc.defines.dup - cxx.compile_options = conf.cc.compile_options.dup - end - - conf.archiver do |archiver| - archiver.command = "#{BIN_PATH}/arm-none-eabi-ar" - archiver.archive_options = 'rcs %{outfile} %{objs}' - end - - #no executables - conf.bins = [] - - #do not build executable test - conf.build_mrbtest_lib_only - - #gems from core - conf.gem :core => "mruby-print" - conf.gem :core => "mruby-math" - conf.gem :core => "mruby-enum-ext" - - #light-weight regular expression - conf.gem :github => "masamitsu-murase/mruby-hs-regexp", :branch => "master" - - #Arduino API - #conf.gem :github =>"kyab/mruby-arduino", :branch => "master" - -end Deleted: vendor/mruby-eeac4be/examples/targets/chipKitMax32.rb (+0 -68) 100644 =================================================================== --- vendor/mruby-eeac4be/examples/targets/chipKitMax32.rb 2014-06-08 19:01:14 +0900 (5c3a30a) +++ /dev/null @@ -1,68 +0,0 @@ -# Cross Compiling configuration for Digilent chipKIT Max32 -# http://www.digilentinc.com/Products/Detail.cfm?Prod=CHIPKIT-MAX32 -# -# Requires MPIDE (https://github.com/chipKIT32/chipKIT32-MAX) -# -# This configuration is based on @kyab's version -# http://d.hatena.ne.jp/kyab/20130201 -MRuby::CrossBuild.new("chipKitMax32") do |conf| - toolchain :gcc - - # Mac OS X - # MPIDE_PATH = '/Applications/Mpide.app/Contents/Resources/Java' - # GNU Linux - MPIDE_PATH = '/opt/mpide-0023-linux-20120903' - - PIC32_PATH = "#{MPIDE_PATH}/hardware/pic32" - - conf.cc do |cc| - cc.command = "#{PIC32_PATH}/compiler/pic32-tools/bin/pic32-gcc" - cc.include_paths << ["#{PIC32_PATH}/cores/pic32", - "#{PIC32_PATH}/variants/Max32", - "#{PIC32_PATH}/libraries"] - cc.flags = %w(-O2 -mno-smart-io -w -ffunction-sections -fdata-sections -g -mdebugger -Wcast-align - -fno-short-double -mprocessor=32MX795F512L -DF_CPU=80000000L -DARDUINO=23 -D_BOARD_MEGA_ - -DMPIDEVER=0x01000202 -DMPIDE=23) - cc.compile_options = "%{flags} -o %{outfile} -c %{infile}" - - #configuration for low memory environment - cc.defines << %w(MRB_HEAP_PAGE_SIZE=64) - cc.defines << %w(MRB_USE_IV_SEGLIST) - cc.defines << %w(KHASH_DEFAULT_SIZE=8) - cc.defines << %w(MRB_STR_BUF_MIN_SIZE=20) - cc.defines << %w(MRB_GC_STRESS) - #cc.defines << %w(DISABLE_STDIO) #if you dont need stdio. - #cc.defines << %w(POOL_PAGE_SIZE=1000) #effective only for use with mruby-eval - end - - conf.cxx do |cxx| - cxx.command = conf.cc.command.dup - cxx.include_paths = conf.cc.include_paths.dup - cxx.flags = conf.cc.flags.dup - cxx.defines = conf.cc.defines.dup - cxx.compile_options = conf.cc.compile_options.dup - end - - conf.archiver do |archiver| - archiver.command = "#{PIC32_PATH}/compiler/pic32-tools/bin/pic32-ar" - archiver.archive_options = 'rcs %{outfile} %{objs}' - end - - #no executables - conf.bins = [] - - #do not build test executable - conf.build_mrbtest_lib_only - - #gems from core - conf.gem :core => "mruby-print" - conf.gem :core => "mruby-math" - conf.gem :core => "mruby-enum-ext" - - #light-weight regular expression - conf.gem :github => "masamitsu-murase/mruby-hs-regexp", :branch => "master" - - #Arduino API - #conf.gem :github =>"kyab/mruby-arduino", :branch => "master" - -end Deleted: vendor/mruby-eeac4be/include/mrbconf.h (+0 -90) 100644 =================================================================== --- vendor/mruby-eeac4be/include/mrbconf.h 2014-06-08 19:01:14 +0900 (a10a1d0) +++ /dev/null @@ -1,90 +0,0 @@ -/* -** 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 - -/* initial size for IREP array */ -//#define MRB_IREP_ARRAY_INIT_SIZE (256u) - -/* 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 - -/* array size for parser buffer */ -//#define MRB_PARSER_BUF_SIZE 1024 - -/* -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 - -#endif /* MRUBYCONF_H */ Deleted: vendor/mruby-eeac4be/include/mruby.h (+0 -395) 100644 =================================================================== --- vendor/mruby-eeac4be/include/mruby.h 2014-06-08 19:01:14 +0900 (0541bc7) +++ /dev/null @@ -1,395 +0,0 @@ -/* -** mruby - An embeddable Ruby implementation -** -** Copyright (c) mruby developers 2010-2013 -** -** 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 "mrbconf.h" -#include "mruby/value.h" - -typedef uint32_t mrb_code; -typedef uint32_t mrb_aspec; - -struct mrb_state; - -typedef void* (*mrb_allocf) (struct mrb_state *mrb, void*, size_t, void *ud); - -#ifndef MRB_ARENA_SIZE -#define MRB_ARENA_SIZE 100 -#endif - -typedef struct { - mrb_sym mid; - struct RProc *proc; - int stackidx; - int nregs; - int argc; - mrb_code *pc; - int acc; - struct RClass *target_class; - int ridx; - int eidx; - struct REnv *env; -} mrb_callinfo; - -enum mrb_fiber_state { - MRB_FIBER_CREATED = 0, - MRB_FIBER_RUNNING, - MRB_FIBER_RESUMED, - 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; - - uint8_t status; - struct RFiber *fib; -}; - -enum gc_state { - GC_STATE_NONE = 0, - GC_STATE_MARK, - GC_STATE_SWEEP -}; - -typedef struct mrb_state { - void *jmp; - - mrb_allocf allocf; /* memory allocation function */ - - struct mrb_context *c; - struct mrb_context *root_c; - - struct RObject *exc; /* exception */ - struct iv_tbl *globals; /* global variable table */ - struct mrb_irep **irep; /* program data array */ - size_t irep_len, irep_capa; - - 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 */ - struct RBasic *arena[MRB_ARENA_SIZE]; /* GC protection array */ - 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 table */ - -#ifdef ENABLE_DEBUG - void (*code_fetch_hook)(struct mrb_state* mrb, struct mrb_irep *irep, mrb_code *pc, mrb_value *regs); -#endif - - struct RClass *eException_class; - struct RClass *eStandardError_class; - - void *ud; /* auxiliary data */ -} mrb_state; - -typedef mrb_value (*mrb_func_t)(mrb_state *mrb, mrb_value); -struct RClass *mrb_define_class(mrb_state *, const char*, struct RClass*); -struct RClass *mrb_define_module(mrb_state *, const char*); -mrb_value mrb_singleton_class(mrb_state*, mrb_value); -void mrb_include_module(mrb_state*, struct RClass*, struct RClass*); - -void mrb_define_method(mrb_state*, struct RClass*, const char*, mrb_func_t, mrb_aspec); -void mrb_define_class_method(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec); -void mrb_define_singleton_method(mrb_state*, struct RObject*, const char*, mrb_func_t, mrb_aspec); -void mrb_define_module_function(mrb_state*, struct RClass*, const char*, mrb_func_t, mrb_aspec); -void mrb_define_const(mrb_state*, struct RClass*, const char *name, mrb_value); -void mrb_undef_method(mrb_state*, struct RClass*, const char*); -void mrb_undef_class_method(mrb_state*, struct RClass*, const char*); -mrb_value mrb_obj_new(mrb_state *mrb, struct RClass *c, int argc, mrb_value *argv); -#define mrb_class_new_instance(mrb,argc,argv,c) mrb_obj_new(mrb,c,argc,argv) -mrb_value mrb_instance_new(mrb_state *mrb, mrb_value cv); -struct RClass * mrb_class_new(mrb_state *mrb, struct RClass *super); -struct RClass * mrb_module_new(mrb_state *mrb); -mrb_bool mrb_class_defined(mrb_state *mrb, const char *name); -struct RClass * mrb_class_get(mrb_state *mrb, const char *name); -struct RClass * mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name); - -mrb_value mrb_obj_dup(mrb_state *mrb, mrb_value obj); -mrb_value mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method); -mrb_bool mrb_obj_respond_to(struct RClass* c, mrb_sym mid); -struct RClass * mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super); -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() 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() - -int mrb_get_args(mrb_state *mrb, const char *format, ...); - -mrb_value mrb_funcall(mrb_state*, mrb_value, const char*, int,...); -mrb_value mrb_funcall_argv(mrb_state*, mrb_value, mrb_sym, int, mrb_value*); -mrb_value mrb_funcall_with_block(mrb_state*, mrb_value, mrb_sym, int, mrb_value*, mrb_value); -mrb_sym mrb_intern_cstr(mrb_state*,const char*); -mrb_sym mrb_intern2(mrb_state*,const char*,size_t); -mrb_sym mrb_intern_str(mrb_state*,mrb_value); -mrb_value mrb_check_intern_cstr(mrb_state*,const char*); -mrb_value mrb_check_intern(mrb_state*,const char*,size_t); -mrb_value mrb_check_intern_str(mrb_state*,mrb_value); -const char *mrb_sym2name(mrb_state*,mrb_sym); -const char *mrb_sym2name_len(mrb_state*,mrb_sym,size_t*); -mrb_value mrb_sym2str(mrb_state*,mrb_sym); -mrb_value mrb_str_format(mrb_state *, int, const mrb_value *, mrb_value); - -/* For backward compatibility. */ -static inline -mrb_sym mrb_intern(mrb_state *mrb,const char *cstr) -{ - return mrb_intern_cstr(mrb, cstr); -} - -void *mrb_malloc(mrb_state*, size_t); /* raise RuntimeError if no mem */ -void *mrb_calloc(mrb_state*, size_t, size_t); /* ditto */ -void *mrb_realloc(mrb_state*, void*, size_t); /* ditto */ -void *mrb_realloc_simple(mrb_state*, void*, size_t); /* return NULL if no memory available */ -void *mrb_malloc_simple(mrb_state*, size_t); /* return NULL if no memory available */ -struct RBasic *mrb_obj_alloc(mrb_state*, enum mrb_vtype, struct RClass*); -void mrb_free(mrb_state*, void*); - -mrb_value mrb_str_new(mrb_state *mrb, const char *p, size_t len); -mrb_value mrb_str_new_cstr(mrb_state*, const char*); -mrb_value mrb_str_new_static(mrb_state *mrb, const char *p, size_t len); - -mrb_state* mrb_open(void); -mrb_state* mrb_open_allocf(mrb_allocf, void *ud); -void mrb_irep_free(mrb_state*, struct mrb_irep*); -void mrb_close(mrb_state*); - -mrb_value mrb_top_self(mrb_state *); -mrb_value mrb_run(mrb_state*, struct RProc*, mrb_value); - -void mrb_p(mrb_state*, mrb_value); -mrb_int mrb_obj_id(mrb_value obj); -mrb_sym mrb_obj_to_sym(mrb_state *mrb, mrb_value name); - -mrb_bool mrb_obj_eq(mrb_state*, mrb_value, mrb_value); -mrb_bool mrb_obj_equal(mrb_state*, mrb_value, mrb_value); -mrb_bool mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2); -mrb_value mrb_Integer(mrb_state *mrb, mrb_value val); -mrb_value mrb_Float(mrb_state *mrb, mrb_value val); -mrb_value mrb_inspect(mrb_state *mrb, mrb_value obj); -mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2); - -void mrb_garbage_collect(mrb_state*); -void mrb_full_gc(mrb_state*); -void mrb_incremental_gc(mrb_state *); -int mrb_gc_arena_save(mrb_state*); -void mrb_gc_arena_restore(mrb_state*,int); -void mrb_gc_mark(mrb_state*,struct RBasic*); -#define mrb_gc_mark_value(mrb,val) do {\ - if (mrb_type(val) >= MRB_TT_HAS_BASIC) mrb_gc_mark((mrb), mrb_basic_ptr(val));\ -} while (0) -void mrb_field_write_barrier(mrb_state *, struct RBasic*, struct RBasic*); -#define mrb_field_write_barrier_value(mrb, obj, val) do{\ - if ((val.tt >= MRB_TT_HAS_BASIC)) mrb_field_write_barrier((mrb), (obj), mrb_basic_ptr(val));\ -} while (0) -void mrb_write_barrier(mrb_state *, struct RBasic*); - -mrb_value mrb_check_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method); -mrb_value mrb_any_to_s(mrb_state *mrb, mrb_value obj); -const char * mrb_obj_classname(mrb_state *mrb, mrb_value obj); -struct RClass* mrb_obj_class(mrb_state *mrb, mrb_value obj); -mrb_value mrb_class_path(mrb_state *mrb, struct RClass *c); -mrb_value mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method); -mrb_bool mrb_obj_is_kind_of(mrb_state *mrb, mrb_value obj, struct RClass *c); -mrb_value mrb_obj_inspect(mrb_state *mrb, mrb_value self); -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) isascii((int)(unsigned char)(c)) -#define ISASCII(c) 1 -#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 TOUPPER(c) (ISASCII(c) ? toupper((int)(unsigned char)(c)) : (c)) -#define TOLOWER(c) (ISASCII(c) ? tolower((int)(unsigned char)(c)) : (c)) -#endif - -mrb_value mrb_exc_new(mrb_state *mrb, struct RClass *c, const char *ptr, long len); -void mrb_exc_raise(mrb_state *mrb, mrb_value exc); - -void mrb_raise(mrb_state *mrb, struct RClass *c, const char *msg); -void mrb_raisef(mrb_state *mrb, struct RClass *c, const char *fmt, ...); -void mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...); -void mrb_warn(mrb_state *mrb, const char *fmt, ...); -void mrb_bug(mrb_state *mrb, const char *fmt, ...); -void mrb_print_backtrace(mrb_state *mrb); -void mrb_print_verbose_backtrace(mrb_state *mrb); -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_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_value mrb_yield(mrb_state *mrb, mrb_value b, mrb_value arg); -mrb_value mrb_yield_argv(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv); - -void mrb_gc_protect(mrb_state *mrb, mrb_value obj); -mrb_value mrb_to_int(mrb_state *mrb, mrb_value val); -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; - -void mrb_define_alias(mrb_state *mrb, struct RClass *klass, const char *name1, const char *name2); -const char *mrb_class_name(mrb_state *mrb, struct RClass* klass); -void mrb_define_global_const(mrb_state *mrb, const char *name, mrb_value val); - -mrb_value mrb_block_proc(void); -mrb_value mrb_attr_get(mrb_state *mrb, mrb_value obj, mrb_sym id); - -mrb_bool mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid); -mrb_bool mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c); - -/* memory pool implementation */ -typedef struct mrb_pool mrb_pool; -struct mrb_pool* mrb_pool_open(mrb_state*); -void mrb_pool_close(struct mrb_pool*); -void* mrb_pool_alloc(struct mrb_pool*, size_t); -void* mrb_pool_realloc(struct mrb_pool*, void*, size_t oldlen, size_t newlen); -mrb_bool mrb_pool_can_realloc(struct mrb_pool*, void*, size_t); -void* mrb_alloca(mrb_state *mrb, size_t); - -#ifdef MRB_DEBUG -#include <assert.h> -#define mrb_assert(p) assert(p) -#else -#define mrb_assert(p) ((void)0) -#endif - -#if defined(__cplusplus) -} /* extern "C" { */ -#endif - -#endif /* MRUBY_H */ Deleted: vendor/mruby-eeac4be/include/mruby/array.h (+0 -63) 100644 =================================================================== --- vendor/mruby-eeac4be/include/mruby/array.h 2014-06-08 19:01:14 +0900 (29f9be5) +++ /dev/null @@ -1,63 +0,0 @@ -/* -** 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_value *ptr; - mrb_int len; -} 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) (RARRAY(a)->ptr) -#define MRB_ARY_SHARED 256 - -void mrb_ary_decref(mrb_state*, mrb_shared_array*); -mrb_value mrb_ary_new_capa(mrb_state*, mrb_int); -mrb_value mrb_ary_new(mrb_state *mrb); -mrb_value mrb_ary_new_from_values(mrb_state *mrb, mrb_int size, const mrb_value *vals); -void mrb_ary_concat(mrb_state*, mrb_value, mrb_value); -mrb_value mrb_ary_splat(mrb_state*, mrb_value); -void mrb_ary_push(mrb_state*, mrb_value, mrb_value); -mrb_value mrb_ary_pop(mrb_state *mrb, mrb_value ary); -mrb_value mrb_ary_aget(mrb_state *mrb, mrb_value self); -mrb_value mrb_ary_ref(mrb_state *mrb, mrb_value ary, mrb_int n); -void mrb_ary_set(mrb_state *mrb, mrb_value ary, mrb_int n, mrb_value val); -mrb_int mrb_ary_len(mrb_state *mrb, mrb_value ary); -void mrb_ary_replace(mrb_state *mrb, mrb_value a, mrb_value b); -mrb_value mrb_check_array_type(mrb_state *mrb, mrb_value self); -mrb_value mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item); -mrb_value mrb_assoc_new(mrb_state *mrb, mrb_value car, mrb_value cdr); -mrb_value mrb_ary_entry(mrb_value ary, mrb_int offset); -mrb_value mrb_ary_shift(mrb_state *mrb, mrb_value self); -mrb_value mrb_ary_clear(mrb_state *mrb, mrb_value self); -mrb_value mrb_ary_join(mrb_state *mrb, mrb_value ary, mrb_value sep); - -#if defined(__cplusplus) -} /* extern "C" { */ -#endif - -#endif /* MRUBY_ARRAY_H */ Deleted: vendor/mruby-eeac4be/include/mruby/class.h (+0 -75) 100644 =================================================================== --- vendor/mruby-eeac4be/include/mruby/class.h 2014-06-08 19:01:14 +0900 (28ba6b1) +++ /dev/null @@ -1,75 +0,0 @@ -/* -** 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 (v.value.i) - 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; - 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) - -struct RClass* mrb_define_class_id(mrb_state*, mrb_sym, struct RClass*); -struct RClass* mrb_define_module_id(mrb_state*, mrb_sym); -struct RClass *mrb_vm_define_class(mrb_state*, mrb_value, mrb_value, mrb_sym); -struct RClass *mrb_vm_define_module(mrb_state*, mrb_value, mrb_sym); -void mrb_define_method_vm(mrb_state*, struct RClass*, mrb_sym, mrb_value); -void mrb_define_method_raw(mrb_state*, struct RClass*, mrb_sym, struct RProc *); -void mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, mrb_aspec aspec); -void mrb_alias_method(mrb_state *mrb, struct RClass *c, mrb_sym a, mrb_sym b); - -struct RClass *mrb_class_outer_module(mrb_state*, struct RClass *); -struct RProc *mrb_method_search_vm(mrb_state*, struct RClass**, mrb_sym); -struct RProc *mrb_method_search(mrb_state*, struct RClass*, mrb_sym); - -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 */ Deleted: vendor/mruby-eeac4be/include/mruby/compile.h (+0 -184) 100644 =================================================================== --- vendor/mruby-eeac4be/include/mruby/compile.h 2014-06-08 19:01:14 +0900 (f8bb50e) +++ /dev/null @@ -1,184 +0,0 @@ -/* -** mruby/compile.h - mruby parser -** -** See Copyright Notice in mruby.h -*/ - -#ifndef MRUBY_COMPILE_H -#define MRUBY_COMPILE_H 1 - -#if defined(__cplusplus) -extern "C" { -#endif - -#include "mruby.h" -#include <setjmp.h> - -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; -} mrbc_context; - -mrbc_context* mrbc_context_new(mrb_state *mrb); -void mrbc_context_free(mrb_state *mrb, mrbc_context *cxt); -const char *mrbc_filename(mrb_state *mrb, mrbc_context *c, const char *s); -void mrbc_partial_hook(mrb_state *mrb, mrbc_context *c, int (*partial_hook)(struct mrb_parser_state*), void*data); - -/* 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; -}; - -#ifndef MRB_PARSER_BUF_SIZE -# define MRB_PARSER_BUF_SIZE 1024 -#endif - -/* 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, cmd_start; - mrb_ast_node *locals; - - mrb_ast_node *pb; - char buf[MRB_PARSER_BUF_SIZE]; - int bidx; - - mrb_ast_node *heredocs; /* list of mrb_parser_heredoc_info* */ - mrb_ast_node *parsing_heredoc; - mrb_bool heredoc_starts_nextline:1; - mrb_bool heredoc_end_now:1; /* for mirb */ - - void *ylval; - - size_t nerr; - size_t nwarn; - mrb_ast_node *tree; - - int capture_errors; - 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; - - jmp_buf jmp; -}; - -struct mrb_parser_state* mrb_parser_new(mrb_state*); -void mrb_parser_free(struct mrb_parser_state*); -void mrb_parser_parse(struct mrb_parser_state*,mrbc_context*); - -void mrb_parser_set_filename(struct mrb_parser_state*, char const*); -char const* mrb_parser_get_filename(struct mrb_parser_state*, uint16_t idx); - -/* utility functions */ -#ifdef ENABLE_STDIO -struct mrb_parser_state* mrb_parse_file(mrb_state*,FILE*,mrbc_context*); -#endif -struct mrb_parser_state* mrb_parse_string(mrb_state*,const char*,mrbc_context*); -struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,int,mrbc_context*); -int mrb_generate_code(mrb_state*, struct mrb_parser_state*); - -/* program load functions */ -#ifdef ENABLE_STDIO -mrb_value mrb_load_file(mrb_state*,FILE*); -#endif -mrb_value mrb_load_string(mrb_state *mrb, const char *s); -mrb_value mrb_load_nstring(mrb_state *mrb, const char *s, int len); -#ifdef ENABLE_STDIO -mrb_value mrb_load_file_cxt(mrb_state*,FILE*, mrbc_context *cxt); -#endif -mrb_value mrb_load_string_cxt(mrb_state *mrb, const char *s, mrbc_context *cxt); -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 */ Deleted: vendor/mruby-eeac4be/include/mruby/data.h (+0 -58) 100644 =================================================================== --- vendor/mruby-eeac4be/include/mruby/data.h 2014-06-08 19:01:14 +0900 (f0420a0) +++ /dev/null @@ -1,58 +0,0 @@ -/* -** mruby/data.h - Data class -** -** See Copyright Notice in mruby.h -*/ - -#ifndef MRUBY_DATA_H -#define MRUBY_DATA_H 1 - -#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; -}; - -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) -void mrb_data_check_type(mrb_state *mrb, mrb_value, const mrb_data_type*); -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) -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) - -#if defined(__cplusplus) -} /* extern "C" { */ -#endif - -#endif /* MRUBY_DATA_H */ Deleted: vendor/mruby-eeac4be/include/mruby/debug.h (+0 -65) 100644 =================================================================== --- vendor/mruby-eeac4be/include/mruby/debug.h 2014-06-08 19:01:14 +0900 (2e358a4) +++ /dev/null @@ -1,65 +0,0 @@ -/* -** 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 *line_ptr; - mrb_irep_debug_info_line *line_flat_map; - uint16_t *line_ary; - }; -} 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 - */ -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 - */ -int32_t mrb_debug_get_line(mrb_irep *irep, uint32_t pc); - -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 *mrb_debug_info_alloc(mrb_state *mrb, mrb_irep *irep); -void mrb_debug_info_free(mrb_state *mrb, mrb_irep_debug_info *d); - -#if defined(__cplusplus) -} /* extern "C" { */ -#endif - -#endif /* MRUBY_DEBUG_H */ Deleted: vendor/mruby-eeac4be/include/mruby/dump.h (+0 -159) 100644 =================================================================== --- vendor/mruby-eeac4be/include/mruby/dump.h 2014-06-08 19:01:14 +0900 (e75be9f) +++ /dev/null @@ -1,159 +0,0 @@ -/* -** 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" - -#ifdef ENABLE_STDIO -int mrb_dump_irep_binary(mrb_state*, size_t, int, FILE*); -int mrb_dump_irep_cfunc(mrb_state *mrb, size_t n, int, FILE *f, const char *initname); -int32_t mrb_read_irep_file(mrb_state*, FILE*); -#endif -int32_t mrb_read_irep(mrb_state*, const uint8_t*); - -#ifdef ENABLE_STDIO -mrb_value mrb_load_irep_file(mrb_state*,FILE*); -#endif - -/* 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 "0001" -#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 MRB_DUMP_DEFAULT_STR_LEN 128 - -// 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 - uint8_t nirep[2]; // Number of ireps - uint8_t sirep[2]; // Start index -}; - -struct rite_section_lineno_header { - RITE_SECTION_HEADER; - - uint8_t nirep[2]; // Number of ireps - uint8_t sirep[2]; // Start index -}; - -struct rite_section_debug_header { - RITE_SECTION_HEADER; - - uint8_t nirep[2]; // Number of ireps - uint8_t sirep[2]; // Start index -}; - -struct rite_binary_footer { - RITE_SECTION_HEADER; -}; - -static inline int -uint8_to_bin(uint8_t s, uint8_t *bin) -{ - *bin = s; - return sizeof(uint8_t); -} - -static inline int -uint16_to_bin(uint16_t s, uint8_t *bin) -{ - *bin++ = (s >> 8) & 0xff; - *bin = s & 0xff; - return sizeof(uint16_t); -} - -static inline int -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 */ Deleted: vendor/mruby-eeac4be/include/mruby/gc.h (+0 -17) 100644 =================================================================== --- vendor/mruby-eeac4be/include/mruby/gc.h 2014-06-08 19:01:14 +0900 (7afa24b) +++ /dev/null @@ -1,17 +0,0 @@ -/* -** gc.h - garbage collector for mruby -** -** See Copyright Notice in mruby.h -*/ - -#ifndef MRUBY_GC_H -#define MRUBY_GC_H - -#include "mruby.h" -#include "mruby/value.h" - -typedef void (each_object_callback)(mrb_state *mrb, struct RBasic* obj, void *data); -void mrb_objspace_each_objects(mrb_state *mrb, each_object_callback* callback, void *data); -void mrb_free_context(mrb_state *mrb, struct mrb_context *c); - -#endif /* MRUBY_GC_H */ Deleted: vendor/mruby-eeac4be/include/mruby/hash.h (+0 -54) 100644 =================================================================== --- vendor/mruby-eeac4be/include/mruby/hash.h 2014-06-08 19:01:14 +0900 (ba3f84c) +++ /dev/null @@ -1,54 +0,0 @@ -/* -** 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_value mrb_hash_new_capa(mrb_state*, int); -mrb_value mrb_hash_new(mrb_state *mrb); - -void mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val); -mrb_value mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key); -mrb_value mrb_hash_fetch(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value def); -mrb_value mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key); -mrb_value mrb_hash_keys(mrb_state *mrb, mrb_value hash); -mrb_value mrb_check_hash_type(mrb_state *mrb, mrb_value hash); -mrb_value mrb_hash_empty_p(mrb_state *mrb, mrb_value self); -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_intern2(mrb, "ifnone", 6)) -#define RHASH_PROCDEFAULT(h) RHASH_IFNONE(h) -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 */ Deleted: vendor/mruby-eeac4be/include/mruby/irep.h (+0 -42) 100644 =================================================================== --- vendor/mruby-eeac4be/include/mruby/irep.h 2014-06-08 19:01:14 +0900 (56e043e) +++ /dev/null @@ -1,42 +0,0 @@ -/* -** 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 - -/* Program data array struct */ -typedef struct mrb_irep { - uint32_t idx; - 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; - - /* debug info */ - const char *filename; - uint16_t *lines; - struct mrb_irep_debug_info* debug_info; - - size_t ilen, plen, slen; -} mrb_irep; - -#define MRB_ISEQ_NO_FREE 1 - -mrb_irep *mrb_add_irep(mrb_state *mrb); -mrb_value mrb_load_irep(mrb_state*, const uint8_t*); - -#if defined(__cplusplus) -} /* extern "C" { */ -#endif - -#endif /* MRUBY_IREP_H */ Deleted: vendor/mruby-eeac4be/include/mruby/khash.h (+0 -257) 100644 =================================================================== --- vendor/mruby-eeac4be/include/mruby/khash.h 2014-06-08 19:01:14 +0900 (fb11586) +++ /dev/null @@ -1,257 +0,0 @@ -/* -** mruby/khash.c - Hash for mruby -** -** See Copyright Notice in mruby.h -*/ - -#ifndef KHASH_H -#define 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[8] = {0x02, 0x08, 0x20, 0x80}; -static const uint8_t __m_del[8] = {0x01, 0x04, 0x10, 0x40}; -static const uint8_t __m_either[8] = {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) - -/* declare struct kh_xxx and kh_xxx_funcs - - name: hash name - khkey_t: key data type - khval_t: value data type - kh_is_map: (not implemented / not used in RiteVM) -*/ -#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; \ - khint_t upper_bound; \ - uint8_t *ed_flags; \ - khkey_t *keys; \ - khval_t *vals; \ - khint_t mask; \ - khint_t inc; \ - mrb_state *mrb; \ - } kh_##name##_t; \ - void kh_alloc_##name(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(kh_##name##_t *h); \ - void kh_clear_##name(kh_##name##_t *h); \ - khint_t kh_get_##name(kh_##name##_t *h, khkey_t key); \ - khint_t kh_put_##name(kh_##name##_t *h, khkey_t key); \ - void kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets); \ - void kh_del_##name(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: (not implemented / not used in RiteVM) - __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(kh_##name##_t *h) \ - { \ - khint_t sz = h->n_buckets; \ - uint8_t *p = mrb_malloc(h->mrb, sizeof(uint8_t)*sz/4+(sizeof(khkey_t)+sizeof(khval_t))*sz); \ - h->size = h->n_occupied = 0; \ - h->upper_bound = UPPER_BOUND(sz); \ - h->keys = (khkey_t *)p; \ - h->vals = (khval_t *)(p+sizeof(khkey_t)*sz); \ - h->ed_flags = (p+sizeof(khkey_t)*sz+sizeof(khval_t)*sz); \ - kh_fill_flags(h->ed_flags, 0xaa, sz/4); \ - h->mask = sz-1; \ - h->inc = sz/2-1; \ - } \ - 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; \ - h->mrb = mrb; \ - kh_alloc_##name(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(kh_##name##_t *h) \ - { \ - if (h) { \ - mrb_free(h->mrb, h->keys); \ - mrb_free(h->mrb, h); \ - } \ - } \ - void kh_clear_##name(kh_##name##_t *h) \ - { \ - 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(kh_##name##_t *h, khkey_t key) \ - { \ - khint_t k = __hash_func(h->mrb,key) & (h->mask); \ - while (!__ac_isempty(h->ed_flags, k)) { \ - if (!__ac_isdel(h->ed_flags, k)) { \ - if (__hash_equal(h->mrb,h->keys[k], key)) return k; \ - } \ - k = (k+h->inc) & (h->mask); \ - } \ - return h->n_buckets; \ - } \ - void kh_resize_##name(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(h); \ - /* relocate */ \ - for (i=0 ; i<old_n_buckets ; i++) { \ - if (!__ac_iseither(old_ed_flags, i)) { \ - khint_t k = kh_put_##name(h, old_keys[i]); \ - kh_value(h,k) = old_vals[i]; \ - } \ - } \ - mrb_free(h->mrb, old_keys); \ - } \ - } \ - khint_t kh_put_##name(kh_##name##_t *h, khkey_t key) \ - { \ - khint_t k; \ - if (h->n_occupied >= h->upper_bound) { \ - kh_resize_##name(h, h->n_buckets*2); \ - } \ - k = __hash_func(h->mrb,key) & (h->mask); \ - while (!__ac_iseither(h->ed_flags, k)) { \ - if (__hash_equal(h->mrb,h->keys[k], key)) break; \ - k = (k+h->inc) & (h->mask); \ - } \ - if (__ac_isempty(h->ed_flags, k)) { \ - /* put at empty */ \ - h->keys[k] = key; \ - h->ed_flags[k/4] &= ~__m_empty[k%4]; \ - h->size++; \ - h->n_occupied++; \ - } else if (__ac_isdel(h->ed_flags, k)) { \ - /* put at del */ \ - h->keys[k] = key; \ - h->ed_flags[k/4] &= ~__m_del[k%4]; \ - h->size++; \ - } \ - return k; \ - } \ - void kh_del_##name(kh_##name##_t *h, khint_t 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(h2, kh_key(h, k)); \ - 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, h) kh_destroy_##name(h) -#define kh_clear(name, h) kh_clear_##name(h) -#define kh_resize(name, h, s) kh_resize_##name(h, s) -#define kh_put(name, h, k) kh_put_##name(h, k) -#define kh_get(name, h, k) kh_get_##name(h, k) -#define kh_del(name, h, k) kh_del_##name(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 /* KHASH_H */ Deleted: vendor/mruby-eeac4be/include/mruby/numeric.h (+0 -32) 100644 =================================================================== --- vendor/mruby-eeac4be/include/mruby/numeric.h 2014-06-08 19:01:14 +0900 (aac7b99) +++ /dev/null @@ -1,32 +0,0 @@ -/* -** 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_value mrb_flo_to_fixnum(mrb_state *mrb, mrb_value val); -mrb_value mrb_flo_to_str(mrb_state *mrb, mrb_value flo, int max_digit); - -mrb_value mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, int base); - -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); - -#if defined(__cplusplus) -} /* extern "C" { */ -#endif - -#endif /* MRUBY_NUMERIC_H */ Deleted: vendor/mruby-eeac4be/include/mruby/proc.h (+0 -62) 100644 =================================================================== --- vendor/mruby-eeac4be/include/mruby/proc.h 2014-06-08 19:01:14 +0900 (602b522) +++ /dev/null @@ -1,62 +0,0 @@ -/* -** 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; - int cioff; -}; - -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) & (1<<12)) -#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_proc_new_cfunc(mrb_state*, mrb_func_t); -struct RProc *mrb_closure_new(mrb_state*, mrb_irep*); -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); - -#include "mruby/khash.h" -KHASH_DECLARE(mt, mrb_sym, struct RProc*, 1) - -#if defined(__cplusplus) -} /* extern "C" { */ -#endif - -#endif /* MRUBY_PROC_H */ Deleted: vendor/mruby-eeac4be/include/mruby/range.h (+0 -35) 100644 =================================================================== --- vendor/mruby-eeac4be/include/mruby/range.h 2014-06-08 19:01:14 +0900 (6030410) +++ /dev/null @@ -1,35 +0,0 @@ -/* -** 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; - int excl; -}; - -#define mrb_range_ptr(v) ((struct RRange*)(mrb_ptr(v))) -#define mrb_range_value(p) mrb_obj_value((void*)(p)) - -mrb_value mrb_range_new(mrb_state*, mrb_value, mrb_value, int); -mrb_int mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len); - -#if defined(__cplusplus) -} /* extern "C" { */ -#endif - -#endif /* MRUBY_RANGE_H */ Deleted: vendor/mruby-eeac4be/include/mruby/string.h (+0 -79) 100644 =================================================================== --- vendor/mruby-eeac4be/include/mruby/string.h 2014-06-08 19:01:14 +0900 (727d956) +++ /dev/null @@ -1,79 +0,0 @@ -/* -** 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 - -#define IS_EVSTR(p,e) ((p) < (e) && (*(p) == '$' || *(p) == '@' || *(p) == '{')) - -extern const char mrb_digitmap[]; - -struct RString { - MRB_OBJECT_HEADER; - mrb_int len; - union { - mrb_int capa; - struct mrb_shared_string *shared; - } aux; - char *ptr; -}; - -#define mrb_str_ptr(s) ((struct RString*)(mrb_ptr(s))) -#define RSTRING(s) ((struct RString*)(mrb_ptr(s))) -#define RSTRING_PTR(s) (RSTRING(s)->ptr) -#define RSTRING_LEN(s) (RSTRING(s)->len) -#define RSTRING_CAPA(s) (RSTRING(s)->aux.capa) -#define RSTRING_END(s) (RSTRING(s)->ptr + RSTRING(s)->len) - -void mrb_gc_free_str(mrb_state*, struct RString*); -void mrb_str_modify(mrb_state*, struct RString*); -mrb_value mrb_str_literal(mrb_state*, mrb_value); -void mrb_str_concat(mrb_state*, mrb_value, mrb_value); -mrb_value mrb_str_plus(mrb_state*, mrb_value, mrb_value); -mrb_value mrb_ptr_to_str(mrb_state *, void*); -mrb_value mrb_obj_as_string(mrb_state *mrb, mrb_value obj); -mrb_value mrb_str_resize(mrb_state *mrb, mrb_value str, mrb_int len); -mrb_value mrb_str_substr(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len); -mrb_value mrb_string_type(mrb_state *mrb, mrb_value str); -mrb_value mrb_check_string_type(mrb_state *mrb, mrb_value str); -mrb_value mrb_str_buf_new(mrb_state *mrb, mrb_int capa); -mrb_value mrb_str_buf_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len); - -char *mrb_string_value_cstr(mrb_state *mrb, mrb_value *ptr); -char *mrb_string_value_ptr(mrb_state *mrb, mrb_value ptr); -int mrb_str_offset(mrb_state *mrb, mrb_value str, int pos); -mrb_value mrb_str_dup(mrb_state *mrb, mrb_value str); -mrb_value mrb_str_intern(mrb_state *mrb, mrb_value self); -mrb_value mrb_str_cat_cstr(mrb_state *, mrb_value, const char *); -mrb_value mrb_str_to_inum(mrb_state *mrb, mrb_value str, int base, int badcheck); -double mrb_str_to_dbl(mrb_state *mrb, mrb_value str, int badcheck); -mrb_value mrb_str_to_str(mrb_state *mrb, mrb_value str); -mrb_int mrb_str_hash(mrb_state *mrb, mrb_value str); -mrb_value mrb_str_buf_append(mrb_state *mrb, mrb_value str, mrb_value str2); -mrb_value mrb_str_inspect(mrb_state *mrb, mrb_value str); -mrb_bool mrb_str_equal(mrb_state *mrb, mrb_value str1, mrb_value str2); -mrb_value mrb_str_dump(mrb_state *mrb, mrb_value str); -mrb_value mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len); -mrb_value mrb_str_append(mrb_state *mrb, mrb_value str, mrb_value str2); - -int mrb_str_cmp(mrb_state *mrb, mrb_value str1, mrb_value str2); -char *mrb_str_to_cstr(mrb_state *mrb, mrb_value str); - -/* For backward compatibility */ -static inline mrb_value -mrb_str_cat2(mrb_state *mrb, mrb_value str, const char *ptr) { - return mrb_str_cat_cstr(mrb, str, ptr); -} - -#if defined(__cplusplus) -} /* extern "C" { */ -#endif - -#endif /* MRUBY_STRING_H */ Deleted: vendor/mruby-eeac4be/include/mruby/value.h (+0 -507) 100644 =================================================================== --- vendor/mruby-eeac4be/include/mruby/value.h 2014-06-08 19:01:14 +0900 (c48c916) +++ /dev/null @@ -1,507 +0,0 @@ -/* -** mruby/value.h - mrb_value definition -** -** See Copyright Notice in mruby.h -*/ - -#ifndef MRUBY_VALUE_H -#define MRUBY_VALUE_H - -#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 - -#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) -# ifdef MRB_NAN_BOXING -# error Cannot use NaN boxing when mrb_int is 64bit -# else - typedef int64_t mrb_int; -# define MRB_INT_MIN INT64_MIN -# define MRB_INT_MAX INT64_MAX -# define PRIdMRB_INT PRId64 -# define PRIiMRB_INT PRIi64 -# define PRIoMRB_INT PRIo64 -# define PRIxMRB_INT PRIx64 -# define PRIXMRB_INT PRIX64 -# endif -#elif defined(MRB_INT16) - typedef int16_t mrb_int; -# define MRB_INT_MIN INT16_MIN -# define MRB_INT_MAX INT16_MAX -#else - typedef int32_t mrb_int; -# define MRB_INT_MIN INT32_MIN -# define MRB_INT_MAX INT32_MAX -# define PRIdMRB_INT PRId32 -# define PRIiMRB_INT PRIi32 -# define PRIoMRB_INT PRIo32 -# define PRIxMRB_INT PRIx32 -# define PRIXMRB_INT PRIX32 -#endif -typedef short mrb_sym; - -#ifdef _MSC_VER -# ifndef __cplusplus -# define inline __inline -# endif -# define snprintf _snprintf -# if _MSC_VER < 1800 -# include <float.h> -# define isnan _isnan -# define isinf(n) (!_finite(n) && !_isnan(n)) -# define strtoll _strtoi64 -# define strtof (float)strtod -# define PRId32 "I32d" -# define PRIi32 "I32i" -# define PRIo32 "I32o" -# define PRIx32 "I32x" -# define PRIX32 "I32X" -# define PRId64 "I64d" -# define PRIi64 "I64i" -# define PRIo64 "I64o" -# define PRIx64 "I64x" -# define PRIX64 "I64X" -# else -# include <inttypes.h> -# endif -#else -# include <inttypes.h> -#endif - -typedef uint8_t mrb_bool; -struct mrb_state; - -#if defined(MRB_NAN_BOXING) - -#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 - -enum mrb_vtype { - MRB_TT_FALSE = 1, /* 1 */ - MRB_TT_FREE, /* 2 */ - MRB_TT_TRUE, /* 3 */ - MRB_TT_FIXNUM, /* 4 */ - MRB_TT_SYMBOL, /* 5 */ - MRB_TT_UNDEF, /* 6 */ - MRB_TT_FLOAT, /* 7 */ - MRB_TT_CPTR, /* 8 */ - MRB_TT_OBJECT, /* 9 */ - MRB_TT_CLASS, /* 10 */ - MRB_TT_MODULE, /* 11 */ - MRB_TT_ICLASS, /* 12 */ - MRB_TT_SCLASS, /* 13 */ - MRB_TT_PROC, /* 14 */ - MRB_TT_ARRAY, /* 15 */ - MRB_TT_HASH, /* 16 */ - MRB_TT_STRING, /* 17 */ - MRB_TT_RANGE, /* 18 */ - MRB_TT_EXCEPTION, /* 19 */ - MRB_TT_FILE, /* 20 */ - MRB_TT_ENV, /* 21 */ - MRB_TT_DATA, /* 22 */ - MRB_TT_FIBER, /* 23 */ - MRB_TT_MAXDEFINE /* 24 */ -}; - -#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 - -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; - -/* 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. - */ -#define mrb_tt(o) (((o).value.ttt & 0xfc000)>>14) -#define mrb_mktt(tt) (0xfff00000|((tt)<<14)) -#define mrb_type(o) ((uint32_t)0xfff00000 < (o).value.ttt ? mrb_tt(o) : MRB_TT_FLOAT) -#define mrb_ptr(o) ((void*)((((intptr_t)0x3fffffffffff)&((intptr_t)((o).value.p)))<<2)) -#define mrb_float(o) (o).f - -#define MRB_SET_VALUE(o, tt, attr, v) do {\ - (o).value.ttt = mrb_mktt(tt);\ - 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*)((intptr_t)(o).value.p | (((intptr_t)(v))>>2)); break;\ - }\ -} while (0) - -static inline mrb_value -mrb_float_value(struct mrb_state *mrb, mrb_float f) -{ - mrb_value v; - - if (f != f) { - v.value.ttt = 0x7ff80000; - v.value.i = 0; - } else { - v.f = f; - } - return v; -} - -#else - -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 */ -}; - -#if defined(MRB_WORD_BOXING) - -#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_FIXNUM_SHIFT 1 -#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 : (sizeof(mrb_int) * CHAR_BIT - MRB_FIXNUM_SHIFT); - }; - struct { - unsigned int sym_flag : MRB_SPECIAL_SHIFT; - int sym : (sizeof(mrb_sym) * CHAR_BIT); - }; - struct RBasic *bp; - struct RFloat *fp; - struct RCptr *vp; - } value; - unsigned long w; -} mrb_value; - -#define mrb_ptr(o) (o).value.p -#define mrb_float(o) (o).value.fp->f - -#define MRB_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) - -extern mrb_value -mrb_float_value(struct mrb_state *mrb, mrb_float f); - -#else /* No MRB_xxx_BOXING */ - -#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_type(o) (o).tt -#define mrb_ptr(o) (o).value.p -#define mrb_float(o) (o).value.f - -#define MRB_SET_VALUE(o, ttt, attr, v) do {\ - (o).tt = ttt;\ - (o).attr = v;\ -} while (0) - -static inline mrb_value -mrb_float_value(struct mrb_state *mrb, mrb_float f) -{ - mrb_value v; - (void) mrb; - - MRB_SET_VALUE(v, MRB_TT_FLOAT, value.f, f); - return v; -} - -#endif /* no boxing */ - -#endif - -#ifdef MRB_WORD_BOXING - -#define mrb_cptr(o) (o).value.vp->p -#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 mrb_bool(o) ((o).w != MRB_Qnil && (o).w != MRB_Qfalse) - -#else -#define mrb_cptr(o) mrb_ptr(o) -#define mrb_fixnum_p(o) (mrb_type(o) == MRB_TT_FIXNUM) -#define mrb_undef_p(o) (mrb_type(o) == MRB_TT_UNDEF) -#define mrb_nil_p(o) (mrb_type(o) == MRB_TT_FALSE && !(o).value.i) -#define mrb_bool(o) (mrb_type(o) != MRB_TT_FALSE) - -#endif /* no boxing */ - -#define mrb_fixnum(o) (o).value.i -#define mrb_symbol(o) (o).value.sym -#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_test(o) mrb_bool(o) - -#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))) -/* obsolete macro mrb_basic; will be removed soon */ -#define mrb_basic(v) mrb_basic_ptr(v) - -struct RObject { - MRB_OBJECT_HEADER; - struct iv_tbl *iv; -}; -#define mrb_obj_ptr(v) ((struct RObject*)(mrb_ptr(v))) -/* obsolete macro mrb_object; will be removed soon */ -#define mrb_object(o) mrb_obj_ptr(o) -#define mrb_immediate_p(x) (mrb_type(x) <= MRB_TT_CPTR) -#define mrb_special_const_p(x) mrb_immediate_p(x) - -struct RFiber { - MRB_OBJECT_HEADER; - struct mrb_context *cxt; -}; - -#ifdef MRB_WORD_BOXING -struct RFloat { - MRB_OBJECT_HEADER; - mrb_float f; -}; - -struct RCptr { - MRB_OBJECT_HEADER; - void *p; -}; - -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; -} -#endif /* MRB_WORD_BOXING */ - -static inline mrb_value -mrb_fixnum_value(mrb_int i) -{ - mrb_value v; - - MRB_SET_VALUE(v, MRB_TT_FIXNUM, value.i, i); - return v; -} - -static inline mrb_value -mrb_symbol_value(mrb_sym i) -{ - mrb_value v; - - MRB_SET_VALUE(v, MRB_TT_SYMBOL, value.sym, i); - return v; -} - -static inline mrb_value -mrb_obj_value(void *p) -{ - mrb_value v; - struct RBasic *b = (struct RBasic*)p; - - MRB_SET_VALUE(v, b->tt, value.p, p); - return v; -} - -#ifdef MRB_WORD_BOXING -mrb_value -mrb_cptr_value(struct mrb_state *mrb, void *p); -#else -static inline mrb_value -mrb_cptr_value(struct mrb_state *mrb, void *p) -{ - mrb_value v; - (void) mrb; - - MRB_SET_VALUE(v, MRB_TT_CPTR, value.p, p); - return v; -} -#endif -/* obsolete macros; will be removed */ -#define MRB_TT_VOIDP MRB_TT_CPTR -#define mrb_voidp_value(m,p) mrb_cptr_value((m),(p)) -#define mrb_voidp(o) mrb_cptr(o) -#define mrb_voidp_p(o) mrb_cptr_p(o) - -static inline mrb_value -mrb_false_value(void) -{ - mrb_value v; - - MRB_SET_VALUE(v, MRB_TT_FALSE, value.i, 1); - return v; -} - -static inline mrb_value -mrb_nil_value(void) -{ - mrb_value v; - - MRB_SET_VALUE(v, MRB_TT_FALSE, value.i, 0); - return v; -} - -static inline mrb_value -mrb_true_value(void) -{ - mrb_value v; - - MRB_SET_VALUE(v, MRB_TT_TRUE, value.i, 1); - return v; -} - -static inline mrb_value -mrb_undef_value(void) -{ - mrb_value v; - - MRB_SET_VALUE(v, MRB_TT_UNDEF, value.i, 0); - return v; -} - -static inline mrb_value -mrb_bool_value(mrb_bool boolean) -{ - mrb_value v; - - MRB_SET_VALUE(v, boolean ? MRB_TT_TRUE : MRB_TT_FALSE, value.i, 1); - return v; -} - -#endif /* MRUBY_OBJECT_H */ Deleted: vendor/mruby-eeac4be/include/mruby/variable.h (+0 -78) 100644 =================================================================== --- vendor/mruby-eeac4be/include/mruby/variable.h 2014-06-08 19:01:14 +0900 (2845e0d) +++ /dev/null @@ -1,78 +0,0 @@ -/* -** 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_value mrb_const_get(mrb_state*, mrb_value, mrb_sym); -void mrb_const_set(mrb_state*, mrb_value, mrb_sym, mrb_value); -mrb_bool mrb_const_defined(mrb_state*, mrb_value, mrb_sym); -void mrb_const_remove(mrb_state*, mrb_value, mrb_sym); - -mrb_value mrb_obj_iv_get(mrb_state *mrb, struct RObject *obj, mrb_sym sym); -void mrb_obj_iv_set(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v); -mrb_bool mrb_obj_iv_defined(mrb_state *mrb, struct RObject *obj, mrb_sym sym); -void mrb_obj_iv_ifnone(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v); -mrb_value mrb_iv_get(mrb_state *mrb, mrb_value obj, mrb_sym sym); -void mrb_iv_set(mrb_state *mrb, mrb_value obj, mrb_sym sym, mrb_value v); -mrb_bool mrb_iv_defined(mrb_state*, mrb_value, mrb_sym); -mrb_value mrb_iv_remove(mrb_state *mrb, mrb_value obj, mrb_sym sym); -void mrb_iv_copy(mrb_state *mrb, mrb_value dst, mrb_value src); -int mrb_const_defined_at(mrb_state *mrb, struct RClass *klass, mrb_sym id); -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_gv_get(mrb_state *mrb, mrb_sym sym); -void mrb_gv_set(mrb_state *mrb, mrb_sym sym, mrb_value val); -mrb_value mrb_obj_instance_variables(mrb_state*, mrb_value); -mrb_value mrb_obj_iv_inspect(mrb_state*, struct RObject*); -mrb_sym mrb_class_sym(mrb_state *mrb, struct RClass *c, struct RClass *outer); -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_value mrb_cv_get(mrb_state *mrb, mrb_value mod, mrb_sym sym); -void mrb_mod_cv_set(mrb_state *mrb, struct RClass * c, mrb_sym sym, mrb_value v); -void mrb_cv_set(mrb_state *mrb, mrb_value mod, mrb_sym sym, mrb_value v); -mrb_bool mrb_mod_cv_defined(mrb_state *mrb, struct RClass * c, mrb_sym sym); -mrb_bool mrb_cv_defined(mrb_state *mrb, mrb_value mod, mrb_sym sym); - -/* 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 */ Deleted: vendor/mruby-eeac4be/minirake (+0 -477) 100755 =================================================================== --- vendor/mruby-eeac4be/minirake 2014-06-08 19:01:14 +0900 (e48ca13) +++ /dev/null @@ -1,477 +0,0 @@ -#!/usr/bin/env ruby - -# Original is https://github.com/jimweirich/rake/ -# Copyright (c) 2003 Jim Weirich -# License: MIT-LICENSE - -require 'getoptlong' -require 'fileutils' - -class String - def ext(newext='') - return self.dup if ['.', '..'].include? self - if newext != '' - newext = (newext =~ /^\./) ? newext : ("." + newext) - end - self.chomp(File.extname(self)) << newext - end - - def pathmap(spec=nil, &block) - return self if spec.nil? - result = '' - spec.scan(/%\{[^}]*\}-?\d*[sdpfnxX%]|%-?\d+d|%.|[^%]+/) do |frag| - case frag - when '%f' - result << File.basename(self) - when '%n' - result << File.basename(self).ext - when '%d' - result << File.dirname(self) - when '%x' - result << File.extname(self) - when '%X' - result << self.ext - when '%p' - result << self - when '%s' - result << (File::ALT_SEPARATOR || File::SEPARATOR) - when '%-' - # do nothing - when '%%' - result << "%" - when /%(-?\d+)d/ - result << pathmap_partial($1.to_i) - when /^%\{([^}]*)\}(\d*[dpfnxX])/ - patterns, operator = $1, $2 - result << pathmap('%' + operator).pathmap_replace(patterns, &block) - when /^%/ - fail ArgumentError, "Unknown pathmap specifier #{frag} in '#{spec}'" - else - result << frag - end - end - result - end -end - -module MiniRake - class Task - TASKS = Hash.new - RULES = Array.new - - # List of prerequisites for a task. - attr_reader :prerequisites - - # Source dependency for rule synthesized tasks. Nil if task was not - # sythesized from a rule. - attr_accessor :source - - # Create a task named +task_name+ with no actions or prerequisites.. - # use +enhance+ to add actions and prerequisites. - def initialize(task_name) - @name = task_name - @prerequisites = [] - @actions = [] - end - - # Enhance a task with prerequisites or actions. Returns self. - def enhance(deps=nil, &block) - @prerequisites |= deps if deps - @actions << block if block_given? - self - end - - # Name of the task. - def name - @name.to_s - end - - # Invoke the task if it is needed. Prerequites are invoked first. - def invoke - puts "Invoke #{name} (already=[#{@already_invoked}], needed=[#{needed?}])" if $trace - return if @already_invoked - @already_invoked = true - prerequisites =****@prere*****{ |n| n.is_a?(Proc) ? n.call(name) : n }.flatten - prerequisites.each { |n| Task[n].invoke } - execute if needed? - end - - # Execute the actions associated with this task. - def execute - puts "Execute #{name}" if $trace - self.class.enhance_with_matching_rule(name) if****@actio*****? - unless $dryrun - @actions.each { |act| act.call(self) } - end - end - - # Is this task needed? - def needed? - true - end - - # Timestamp for this task. Basic tasks return the current time for - # their time stamp. Other tasks can be more sophisticated. - def timestamp - prerequisites =****@prere*****{ |n| n.is_a?(Proc) ? n.call(name) : n }.flatten - prerequisites.collect { |n| Task[n].timestamp }.max || Time.now - end - - # Class Methods ---------------------------------------------------- - - class << self - - # Clear the task list. This cause rake to immediately forget all - # the tasks that have been assigned. (Normally used in the unit - # tests.) - def clear - TASKS.clear - RULES.clear - end - - # List of all defined tasks. - def tasks - TASKS.keys.sort.collect { |tn| Task[tn] } - end - - # Return a task with the given name. If the task is not currently - # known, try to synthesize one from the defined rules. If no - # rules are found, but an existing file matches the task name, - # assume it is a file task with no dependencies or actions. - def [](task_name) - task_name = task_name.to_s - if task = TASKS[task_name] - return task - end - if task = enhance_with_matching_rule(task_name) - return task - end - if File.exist?(task_name) - return FileTask.define_task(task_name) - end - fail "Don't know how to rake #{task_name}" - end - - # Define a task given +args+ and an option block. If a rule with - # the given name already exists, the prerequisites and actions are - # added to the existing task. - def define_task(args, &block) - task_name, deps = resolve_args(args) - lookup(task_name).enhance([deps].flatten, &block) - end - - # Define a rule for synthesizing tasks. - def create_rule(args, &block) - pattern, deps = resolve_args(args) - pattern = Regexp.new(Regexp.quote(pattern) + '$') if String === pattern - RULES << [pattern, deps, block] - end - - - # Lookup a task. Return an existing task if found, otherwise - # create a task of the current type. - def lookup(task_name) - name = task_name.to_s - TASKS[name] ||= self.new(name) - end - - # If a rule can be found that matches the task name, enhance the - # task with the prerequisites and actions from the rule. Set the - # source attribute of the task appropriately for the rule. Return - # the enhanced task or nil of no rule was found. - def enhance_with_matching_rule(task_name) - RULES.each do |pattern, extensions, block| - if pattern.match(task_name) - ext = extensions.first - deps = extensions[1..-1] - case ext - when String - source = task_name.sub(/\.[^.]*$/, ext) - when Proc - source = ext.call(task_name) - else - fail "Don't know how to handle rule dependent: #{ext.inspect}" - end - if File.exist?(source) - task = FileTask.define_task({task_name => [source]+deps}, &block) - task.source = source - return task - end - end - end - nil - end - - private - - # Resolve the arguments for a task/rule. - def resolve_args(args) - case args - when Hash - fail "Too Many Task Names: #{args.keys.join(' ')}" if args.size > 1 - fail "No Task Name Given" if args.size < 1 - task_name = args.keys[0] - deps = args[task_name] - deps = [deps] if (String===deps) || (Regexp===deps) || (Proc===deps) - else - task_name = args - deps = [] - end - [task_name, deps] - end - end - end - - - ###################################################################### - class FileTask < Task - # Is this file task needed? Yes if it doesn't exist, or if its time - # stamp is out of date. - def needed? - return true unless File.exist?(name) - prerequisites =****@prere*****{ |n| n.is_a?(Proc) ? n.call(name) : n }.flatten - latest_prereq = prerequisites.collect{|n| Task[n].timestamp}.max - return false if latest_prereq.nil? - timestamp < latest_prereq - end - - # Time stamp for file task. - def timestamp - File::stat(name.to_s).mtime - end - end - - module DSL - # Declare a basic task. - def task(args, &block) - MiniRake::Task.define_task(args, &block) - end - - # Declare a file task. - def file(args, &block) - MiniRake::FileTask.define_task(args, &block) - end - - # Declare a set of files tasks to create the given directories on - # demand. - def directory(dir) - path = [] - Sys.split_all(dir).each do |p| - path << p - FileTask.define_task(File.join(path)) do |t| - Sys.makedirs(t.name) - end - end - end - - # Declare a rule for auto-tasks. - def rule(args, &block) - MiniRake::Task.create_rule(args, &block) - end - - # Write a message to standard out if $verbose is enabled. - def log(msg) - print " " if $trace && $verbose - puts msg if $verbose - end - - # Run the system command +cmd+. - def sh(cmd) - puts cmd if $verbose - system(cmd) or fail "Command Failed: [#{cmd}]" - end - - def desc(text) - end - end -end - -Rake = MiniRake -extend MiniRake::DSL - - -###################################################################### -# Task Definition Functions ... - -###################################################################### -# Rake main application object. When invoking +rake+ from the command -# line, a RakeApp object is created and run. -# -class RakeApp - RAKEFILES = ['rakefile', 'Rakefile'] - - OPTIONS = [ - ['--dry-run', '-n', GetoptLong::NO_ARGUMENT, - "Do a dry run without executing actions."], - ['--help', '-H', GetoptLong::NO_ARGUMENT, - "Display this help message."], - ['--libdir', '-I', GetoptLong::REQUIRED_ARGUMENT, - "Include LIBDIR in the search path for required modules."], - ['--nosearch', '-N', GetoptLong::NO_ARGUMENT, - "Do not search parent directories for the Rakefile."], - ['--quiet', '-q', GetoptLong::NO_ARGUMENT, - "Do not log messages to standard output."], - ['--rakefile', '-f', GetoptLong::REQUIRED_ARGUMENT, - "Use FILE as the rakefile."], - ['--require', '-r', GetoptLong::REQUIRED_ARGUMENT, - "Require MODULE before executing rakefile."], - ['--tasks', '-T', GetoptLong::NO_ARGUMENT, - "Display the tasks and dependencies, then exit."], - ['--pull-gems','-p', GetoptLong::NO_ARGUMENT, - "Pull all git mrbgems."], - ['--trace', '-t', GetoptLong::NO_ARGUMENT, - "Turn on invoke/execute tracing."], - ['--usage', '-h', GetoptLong::NO_ARGUMENT, - "Display usage."], - ['--verbose', '-v', GetoptLong::NO_ARGUMENT, - "Log message to standard output (default)."], - ] - - # Create a RakeApp object. - def initialize - @rakefile = nil - @nosearch = false - end - - # True if one of the files in RAKEFILES is in the current directory. - # If a match is found, it is copied into @rakefile. - def have_rakefile - RAKEFILES.each do |fn| - if File.exist?(fn) - @rakefile = fn - return true - end - end - return false - end - - # Display the program usage line. - def usage - puts "rake [-f rakefile] {options} targets..." - end - - # Display the rake command line help. - def help - usage - puts - puts "Options are ..." - puts - OPTIONS.sort.each do |long, short, mode, desc| - if mode == GetoptLong::REQUIRED_ARGUMENT - if desc =~ /\b([A-Z]{2,})\b/ - long = long + "=#{$1}" - end - end - printf " %-20s (%s)\n", long, short - printf " %s\n", desc - end - end - - # Display the tasks and dependencies. - def display_tasks - MiniRake::Task.tasks.each do |t| - puts "#{t.class} #{t.name}" - t.prerequisites.each { |pre| puts " #{pre}" } - end - end - - # Return a list of the command line options supported by the - # program. - def command_line_options - OPTIONS.collect { |lst| lst[0..-2] } - end - - # Do the option defined by +opt+ and +value+. - def do_option(opt, value) - case opt - when '--dry-run' - $dryrun = true - $trace = true - when '--help' - help - exit - when '--libdir' - $:.push(value) - when '--nosearch' - @nosearch = true - when '--quiet' - $verbose = false - when '--rakefile' - RAKEFILES.clear - RAKEFILES << value - when '--require' - require value - when '--tasks' - $show_tasks = true - when '--pull-gems' - $pull_gems = true - when '--trace' - $trace = true - when '--usage' - usage - exit - when '--verbose' - $verbose = true - when '--version' - puts "rake, version #{RAKEVERSION}" - exit - else - fail "Unknown option: #{opt}" - end - end - - # Read and handle the command line options. - def handle_options - $verbose = false - $pull_gems = false - opts = GetoptLong.new(*command_line_options) - opts.each { |opt, value| do_option(opt, value) } - end - - # Run the +rake+ application. - def run - handle_options - begin - here = Dir.pwd - while ! have_rakefile - Dir.chdir("..") - if Dir.pwd == here || @nosearch - fail "No Rakefile found (looking for: #{RAKEFILES.join(', ')})" - end - here = Dir.pwd - end - tasks = [] - ARGV.each do |task_name| - if /^(\w+)=(.*)/.match(task_name) - ENV[$1] = $2 - else - tasks << task_name - end - end - puts "(in #{Dir.pwd})" - $rakefile = @rakefile - load @rakefile - if $show_tasks - display_tasks - else - tasks.push("default") if tasks.size == 0 - tasks.each do |task_name| - MiniRake::Task[task_name].invoke - end - end - rescue Exception => ex - puts "rake aborted!" - puts ex.message - if $trace - puts ex.backtrace.join("\n") - else - puts ex.backtrace.find {|str| str =~ /#{@rakefile}/ } || "" - end - exit 1 - end - end -end - -if __FILE__ == $0 then - RakeApp.new.run -end Deleted: vendor/mruby-eeac4be/mrbgems/default.gembox (+0 -61) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/default.gembox 2014-06-08 19:01:14 +0900 (33ee99b) +++ /dev/null @@ -1,61 +0,0 @@ -MRuby::GemBox.new do |conf| - # Use standard Kernel#sprintf method - conf.gem :core => "mruby-sprintf" - - # Use standard print/puts/p - conf.gem :core => "mruby-print" - - # Use standard Math module - conf.gem :core => "mruby-math" - - # Use standard Time class - conf.gem :core => "mruby-time" - - # Use standard Struct class - conf.gem :core => "mruby-struct" - - # Use extensional Enumerable module - conf.gem :core => "mruby-enum-ext" - - # Use extensional String class - conf.gem :core => "mruby-string-ext" - - # Use extensional Numeric class - conf.gem :core => "mruby-numeric-ext" - - # Use extensional Array class - conf.gem :core => "mruby-array-ext" - - # Use extensional Hash class - conf.gem :core => "mruby-hash-ext" - - # Use extensional Range class - conf.gem :core => "mruby-range-ext" - - # Use extensional Proc class - conf.gem :core => "mruby-proc-ext" - - # Use extensional Symbol class - conf.gem :core => "mruby-symbol-ext" - - # Use Random class - conf.gem :core => "mruby-random" - - # Use extensional Object class - conf.gem :core => "mruby-object-ext" - - # Use ObjectSpace class - conf.gem :core => "mruby-objectspace" - - # Use Fiber class - conf.gem :core => "mruby-fiber" - - # Use extended toplevel object (main) methods - conf.gem :core => "mruby-toplevel-ext" - - # Generate mirb command - conf.gem :core => "mruby-bin-mirb" - - # Generate mruby command - conf.gem :core => "mruby-bin-mruby" -end Deleted: vendor/mruby-eeac4be/mrbgems/full-core.gembox (+0 -9) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/full-core.gembox 2014-06-08 19:01:14 +0900 (4a6ebbc) +++ /dev/null @@ -1,9 +0,0 @@ -MRuby::GemBox.new do |conf| - conf.gem :core => "mruby-sprintf" - conf.gem :core => "mruby-print" - - Dir.glob("#{root}/mrbgems/mruby-*") do |x| - g = File.basename(x) - conf.gem :core => g unless g =~ /^mruby-(print|sprintf)$/ - end -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-array-ext/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-array-ext/mrbgem.rake 2014-06-08 19:01:14 +0900 (18f92ad) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-array-ext') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-array-ext/mrblib/array.rb (+0 -204) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-array-ext/mrblib/array.rb 2014-06-08 19:01:14 +0900 (337cef6) +++ /dev/null @@ -1,204 +0,0 @@ -class Array - ## - # call-seq: - # ary.uniq! -> ary or nil - # - # Removes duplicate elements from +self+. - # Returns <code>nil</code> if no changes are made (that is, no - # duplicates are found). - # - # a = [ "a", "a", "b", "b", "c" ] - # a.uniq! #=> ["a", "b", "c"] - # b = [ "a", "b", "c" ] - # b.uniq! #=> nil - # - def uniq! - ary = self.dup - result = [] - while ary.size > 0 - result << ary.shift - ary.delete(result.last) - end - if result.size == self.size - nil - else - self.replace(result) - end - end - - ## - # call-seq: - # ary.uniq -> new_ary - # - # Returns a new array by removing duplicate values in +self+. - # - # a = [ "a", "a", "b", "b", "c" ] - # a.uniq #=> ["a", "b", "c"] - # - def uniq - ary = self.dup - ary.uniq! - ary - end - - ## - # call-seq: - # ary - other_ary -> new_ary - # - # Array Difference---Returns a new array that is a copy of - # the original array, removing any items that also appear in - # <i>other_ary</i>. (If you need set-like behavior, see the - # library class Set.) - # - # [ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ] - # - def -(elem) - raise TypeError, "can't convert #{elem.class} into Array" unless elem.class == Array - - hash = {} - array = [] - elem.each { |x| hash[x] = true } - self.each { |x| array << x unless hash[x] } - array - end - - ## - # call-seq: - # ary | other_ary -> new_ary - # - # Set Union---Returns a new array by joining this array with - # <i>other_ary</i>, removing duplicates. - # - # [ "a", "b", "c" ] | [ "c", "d", "a" ] - # #=> [ "a", "b", "c", "d" ] - # - def |(elem) - raise TypeError, "can't convert #{elem.class} into Array" unless elem.class == Array - - ary = self + elem - ary.uniq! or ary - end - - ## - # call-seq: - # ary & other_ary -> new_ary - # - # Set Intersection---Returns a new array - # containing elements common to the two arrays, with no duplicates. - # - # [ 1, 1, 3, 5 ] & [ 1, 2, 3 ] #=> [ 1, 3 ] - # - def &(elem) - raise TypeError, "can't convert #{elem.class} into Array" unless elem.class == Array - - hash = {} - array = [] - elem.each{|v| hash[v] = true } - self.each do |v| - if hash[v] - array << v - hash.delete v - end - end - array - end - - ## - # call-seq: - # ary.flatten -> new_ary - # ary.flatten(level) -> new_ary - # - # Returns a new array that is a one-dimensional flattening of this - # array (recursively). That is, for every element that is an array, - # extract its elements into the new array. If the optional - # <i>level</i> argument determines the level of recursion to flatten. - # - # s = [ 1, 2, 3 ] #=> [1, 2, 3] - # t = [ 4, 5, 6, [7, 8] ] #=> [4, 5, 6, [7, 8]] - # a = [ s, t, 9, 10 ] #=> [[1, 2, 3], [4, 5, 6, [7, 8]], 9, 10] - # a.flatten #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - # a = [ 1, 2, [3, [4, 5] ] ] - # a.flatten(1) #=> [1, 2, 3, [4, 5]] - # - def flatten(depth=nil) - ar = [] - self.each do |e| - if e.is_a?(Array) && (depth.nil? || depth > 0) - ar += e.flatten(depth.nil? ? nil : depth - 1) - else - ar << e - end - end - ar - end - - ## - # call-seq: - # ary.flatten! -> ary or nil - # ary.flatten!(level) -> array or nil - # - # Flattens +self+ in place. - # Returns <code>nil</code> if no modifications were made (i.e., - # <i>ary</i> contains no subarrays.) If the optional <i>level</i> - # argument determines the level of recursion to flatten. - # - # a = [ 1, 2, [3, [4, 5] ] ] - # a.flatten! #=> [1, 2, 3, 4, 5] - # a.flatten! #=> nil - # a #=> [1, 2, 3, 4, 5] - # a = [ 1, 2, [3, [4, 5] ] ] - # a.flatten!(1) #=> [1, 2, 3, [4, 5]] - # - def flatten!(depth=nil) - modified = false - ar = [] - self.each do |e| - if e.is_a?(Array) && (depth.nil? || depth > 0) - ar += e.flatten(depth.nil? ? nil : depth - 1) - modified = true - else - ar << e - end - end - if modified - self.replace(ar) - else - nil - end - end - - ## - # call-seq: - # ary.compact -> new_ary - # - # Returns a copy of +self+ with all +nil+ elements removed. - # - # [ "a", nil, "b", nil, "c", nil ].compact - # #=> [ "a", "b", "c" ] - # - def compact - result = self.dup - result.compact! - result - end - - ## - # call-seq: - # ary.compact! -> ary or nil - # - # Removes +nil+ elements from the array. - # Returns +nil+ if no changes were made, otherwise returns - # <i>ary</i>. - # - # [ "a", nil, "b", nil, "c" ].compact! #=> [ "a", "b", "c" ] - # [ "a", "b", "c" ].compact! #=> nil - # - def compact! - result = self.select { |e| e != nil } - if result.size == self.size - nil - else - self.replace(result) - end - end -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-array-ext/src/array.c (+0 -140) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-array-ext/src/array.c 2014-06-08 19:01:14 +0900 (ad6cead) +++ /dev/null @@ -1,140 +0,0 @@ -#include "mruby.h" -#include "mruby/value.h" -#include "mruby/array.h" - -/* - * call-seq: - * Array.try_convert(obj) -> array or nil - * - * Try to convert <i>obj</i> into an array, using +to_ary+ method. - * Returns converted array or +nil+ if <i>obj</i> cannot be converted - * for any reason. This method can be used to check if an argument is an - * array. - * - * Array.try_convert([1]) #=> [1] - * Array.try_convert("1") #=> nil - * - * if tmp = Array.try_convert(arg) - * # the argument is an array - * elsif tmp = String.try_convert(arg) - * # the argument is a string - * end - * - */ - -static mrb_value -mrb_ary_s_try_convert(mrb_state *mrb, mrb_value self) -{ - mrb_value ary; - - mrb_get_args(mrb, "o", &ary); - return mrb_check_array_type(mrb, ary); -} - -/* - * 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); -} - -void -mrb_mruby_array_ext_gem_init(mrb_state* mrb) -{ - struct RClass * a = mrb->array_class; - - mrb_define_class_method(mrb, a, "try_convert", mrb_ary_s_try_convert, MRB_ARGS_REQ(1)); - - 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)); -} - -void -mrb_mruby_array_ext_gem_final(mrb_state* mrb) -{ -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-array-ext/test/array.rb (+0 -109) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-array-ext/test/array.rb 2014-06-08 19:01:14 +0900 (1c441ce) +++ /dev/null @@ -1,109 +0,0 @@ -## -# Array(Ext) Test - -assert("Array::try_convert") do - Array.try_convert([1]) == [1] and - Array.try_convert("1").nil? -end - -assert("Array#assoc") do - s1 = [ "colors", "red", "blue", "green" ] - s2 = [ "letters", "a", "b", "c" ] - s3 = "foo" - a = [ s1, s2, s3 ] - - a.assoc("letters") == [ "letters", "a", "b", "c" ] and - a.assoc("foo").nil? -end - -assert("Array#at") do - a = [ "a", "b", "c", "d", "e" ] - a.at(0) == "a" and a.at(-1) == "e" -end - -assert("Array#rassoc") do - a = [ [ 1, "one"], [2, "two"], [3, "three"], ["ii", "two"] ] - - a.rassoc("two") == [2, "two"] and - a.rassoc("four").nil? -end - -assert("Array#uniq!") do - a = [1, 2, 3, 1] - a.uniq! - a == [1, 2, 3] -end - -assert("Array#uniq") do - a = [1, 2, 3, 1] - a.uniq == [1, 2, 3] && a == [1, 2, 3, 1] -end - -assert("Array#-") do - a = [1, 2, 3, 1] - b = [1] - c = 1 - e1 = nil - - begin - a - c - rescue => e1 - end - - (a - b) == [2, 3] and e1.class == TypeError and a == [1, 2, 3, 1] -end - -assert("Array#|") do - a = [1, 2, 3, 1] - b = [1, 4] - c = 1 - e1 = nil - - begin - a | c - rescue => e1 - end - - (a | b) == [1, 2, 3, 4] and e1.class == TypeError and a == [1, 2, 3, 1] -end - -assert("Array#&") do - a = [1, 2, 3, 1] - b = [1, 4] - c = 1 - e1 = nil - - begin - a & c - rescue => e1 - end - - (a & b) == [1] and e1.class == TypeError and a == [1, 2, 3, 1] -end - -assert("Array#flatten") do - [1, 2, "3", {4=>5}, :'6'] == [1, 2, "3", {4=>5}, :'6'].flatten and - [1, 2, 3, 4, 5, 6] == [1, 2, [3, 4, 5], 6].flatten and - [1, 2, 3, 4, 5, 6] == [1, 2, [3, [4, 5], 6]].flatten and - [1, [2, [3, [4, [5, [6]]]]]] == [1, [2, [3, [4, [5, [6]]]]]].flatten(0) and - [1, 2, [3, [4, [5, [6]]]]] == [1, [2, [3, [4, [5, [6]]]]]].flatten(1) and - [1, 2, 3, [4, [5, [6]]]] == [1, [2, [3, [4, [5, [6]]]]]].flatten(2) and - [1, 2, 3, 4, [5, [6]]] == [1, [2, [3, [4, [5, [6]]]]]].flatten(3) and - [1, 2, 3, 4, 5, [6]] == [1, [2, [3, [4, [5, [6]]]]]].flatten(4) and - [1, 2, 3, 4, 5, 6] == [1, [2, [3, [4, [5, [6]]]]]].flatten(5) -end - -assert("Array#flatten!") do - [1, 2, 3, 4, 5, 6] == [1, 2, [3, [4, 5], 6]].flatten! -end - -assert("Array#compact") do - a = [1, nil, "2", nil, :t, false, nil] - a.compact == [1, "2", :t, false] && a == [1, nil, "2", nil, :t, false, nil] -end - -assert("Array#compact!") do - a = [1, nil, "2", nil, :t, false, nil] - a.compact! - a == [1, "2", :t, false] -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-bin-mirb/mrbgem.rake (+0 -8) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-bin-mirb/mrbgem.rake 2014-06-08 19:01:14 +0900 (846a3b0) +++ /dev/null @@ -1,8 +0,0 @@ -MRuby::Gem::Specification.new('mruby-bin-mirb') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' - - spec.linker.libraries << 'readline' if spec.cc.defines.include? "ENABLE_READLINE" - - spec.bins = %w(mirb) -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c (+0 -399) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c 2014-06-08 19:01:14 +0900 (1c746db) +++ /dev/null @@ -1,399 +0,0 @@ -/* -** mirb - Embeddable Interactive Ruby Shell -** -** This program takes code from the user in -** an interactive way and executes it -** immediately. It's a REPL... -*/ - -#include <stdlib.h> -#include <string.h> - -#include <mruby.h> -#include "mruby/array.h" -#include <mruby/proc.h> -#include <mruby/data.h> -#include <mruby/compile.h> -#ifdef ENABLE_READLINE -#include <limits.h> -#include <readline/readline.h> -#include <readline/history.h> -#endif -#include <mruby/string.h> - - -#ifdef ENABLE_READLINE -static const char *history_file_name = ".mirb_history"; -char history_path[PATH_MAX]; -#endif - - -static void -p(mrb_state *mrb, mrb_value obj, int prompt) -{ - obj = mrb_funcall(mrb, obj, "inspect", 0); - if (prompt) { - if (!mrb->exc) { - fputs(" => ", stdout); - } - else { - obj = mrb_funcall(mrb, mrb_obj_value(mrb->exc), "inspect", 0); - } - } - fwrite(RSTRING_PTR(obj), RSTRING_LEN(obj), 1, stdout); - putc('\n', stdout); -} - -/* Guess if the user might want to enter more - * or if he wants an evaluation of his code now */ -mrb_bool -is_code_block_open(struct mrb_parser_state *parser) -{ - int code_block_open = FALSE; - - /* check for heredoc */ - if (parser->parsing_heredoc != NULL) return TRUE; - if (parser->heredoc_end_now) { - parser->heredoc_end_now = FALSE; - return FALSE; - } - - /* check if parser error are available */ - if (0 < parser->nerr) { - const char *unexpected_end = "syntax error, unexpected $end"; - const char *message = parser->error_buffer[0].message; - - /* a parser error occur, we have to check if */ - /* we need to read one more line or if there is */ - /* a different issue which we have to show to */ - /* the user */ - - if (strncmp(message, unexpected_end, strlen(unexpected_end)) == 0) { - code_block_open = TRUE; - } - else if (strcmp(message, "syntax error, unexpected keyword_end") == 0) { - code_block_open = FALSE; - } - else if (strcmp(message, "syntax error, unexpected tREGEXP_BEG") == 0) { - code_block_open = FALSE; - } - return code_block_open; - } - - /* check for unterminated string */ - if (parser->lex_strterm) return TRUE; - - switch (parser->lstate) { - - /* all states which need more code */ - - case EXPR_BEG: - /* an expression was just started, */ - /* we can't end it like this */ - code_block_open = TRUE; - break; - case EXPR_DOT: - /* a message dot was the last token, */ - /* there has to come more */ - code_block_open = TRUE; - break; - case EXPR_CLASS: - /* a class keyword is not enough! */ - /* we need also a name of the class */ - code_block_open = TRUE; - break; - case EXPR_FNAME: - /* a method name is necessary */ - code_block_open = TRUE; - break; - case EXPR_VALUE: - /* if, elsif, etc. without condition */ - code_block_open = TRUE; - break; - - /* now all the states which are closed */ - - case EXPR_ARG: - /* an argument is the last token */ - code_block_open = FALSE; - break; - - /* all states which are unsure */ - - case EXPR_CMDARG: - break; - case EXPR_END: - /* an expression was ended */ - break; - case EXPR_ENDARG: - /* closing parenthese */ - break; - case EXPR_ENDFN: - /* definition end */ - break; - case EXPR_MID: - /* jump keyword like break, return, ... */ - break; - case EXPR_MAX_STATE: - /* don't know what to do with this token */ - break; - default: - /* this state is unexpected! */ - break; - } - - return code_block_open; -} - -void mrb_show_version(mrb_state *); -void mrb_show_copyright(mrb_state *); - -struct _args { - mrb_bool verbose : 1; - int argc; - char** argv; -}; - -static void -usage(const char *name) -{ - static const char *const usage_msg[] = { - "switches:", - "-v print version number, then run in verbose mode", - "--verbose run in verbose mode", - "--version print the version", - "--copyright print the copyright", - NULL - }; - const char *const *p = usage_msg; - - printf("Usage: %s [switches]\n", name); - while (*p) - printf(" %s\n", *p++); -} - -static int -parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) -{ - static const struct _args args_zero = { 0 }; - - *args = args_zero; - - for (argc--,argv++; argc > 0; argc--,argv++) { - char *item; - if (argv[0][0] != '-') break; - - item = argv[0] + 1; - switch (*item++) { - case 'v': - if (!args->verbose) mrb_show_version(mrb); - args->verbose = 1; - break; - case '-': - if (strcmp((*argv) + 2, "version") == 0) { - mrb_show_version(mrb); - exit(EXIT_SUCCESS); - } - else if (strcmp((*argv) + 2, "verbose") == 0) { - args->verbose = 1; - break; - } - else if (strcmp((*argv) + 2, "copyright") == 0) { - mrb_show_copyright(mrb); - exit(EXIT_SUCCESS); - } - default: - return EXIT_FAILURE; - } - } - return EXIT_SUCCESS; -} - -static void -cleanup(mrb_state *mrb, struct _args *args) -{ - mrb_close(mrb); -} - -/* Print a short remark for the user */ -static void -print_hint(void) -{ - printf("mirb - Embeddable Interactive Ruby Shell\n"); - printf("\nThis is a very early version, please test and report errors.\n"); - printf("Thanks :)\n\n"); -} - -/* Print the command line prompt of the REPL */ -void -print_cmdline(int code_block_open) -{ - if (code_block_open) { - printf("* "); - } - else { - printf("> "); - } -} - -int -main(int argc, char **argv) -{ - char ruby_code[1024] = { 0 }; - char last_code_line[1024] = { 0 }; -#ifndef ENABLE_READLINE - int last_char; - int char_index; -#else - char *home = NULL; -#endif - mrbc_context *cxt; - struct mrb_parser_state *parser; - mrb_state *mrb; - mrb_value result; - struct _args args; - int n; - int code_block_open = FALSE; - int ai; - - /* new interpreter instance */ - mrb = mrb_open(); - if (mrb == NULL) { - fputs("Invalid mrb interpreter, exiting mirb\n", stderr); - return EXIT_FAILURE; - } - mrb_define_global_const(mrb, "ARGV", mrb_ary_new_capa(mrb, 0)); - - n = parse_args(mrb, argc, argv, &args); - if (n == EXIT_FAILURE) { - cleanup(mrb, &args); - usage(argv[0]); - return n; - } - - print_hint(); - - cxt = mrbc_context_new(mrb); - cxt->capture_errors = 1; - cxt->lineno = 1; - mrbc_filename(mrb, cxt, "(mirb)"); - if (args.verbose) cxt->dump_result = 1; - - ai = mrb_gc_arena_save(mrb); - -#ifdef ENABLE_READLINE - using_history(); - home = getenv("HOME"); -#ifdef _WIN32 - if (!home) - home = getenv("USERPROFILE"); -#endif - if (home) { - strcpy(history_path, home); - strcat(history_path, "/"); - strcat(history_path, history_file_name); - read_history(history_path); - } -#endif - - - while (TRUE) { -#ifndef ENABLE_READLINE - print_cmdline(code_block_open); - - char_index = 0; - while ((last_char = getchar()) != '\n') { - if (last_char == EOF) break; - last_code_line[char_index++] = last_char; - } - if (last_char == EOF) { - fputs("\n", stdout); - break; - } - - last_code_line[char_index] = '\0'; -#else - char* line = readline(code_block_open ? "* " : "> "); - if (line == NULL) { - printf("\n"); - break; - } - strncpy(last_code_line, line, sizeof(last_code_line)-1); - add_history(line); - free(line); -#endif - - if ((strcmp(last_code_line, "quit") == 0) || (strcmp(last_code_line, "exit") == 0)) { - if (!code_block_open) { - break; - } - else{ - /* count the quit/exit commands as strings if in a quote block */ - strcat(ruby_code, "\n"); - strcat(ruby_code, last_code_line); - } - } - else { - if (code_block_open) { - strcat(ruby_code, "\n"); - strcat(ruby_code, last_code_line); - } - else { - strcpy(ruby_code, last_code_line); - } - } - - /* parse code */ - parser = mrb_parser_new(mrb); - parser->s = ruby_code; - parser->send = ruby_code + strlen(ruby_code); - parser->lineno = cxt->lineno; - mrb_parser_parse(parser, cxt); - code_block_open = is_code_block_open(parser); - - if (code_block_open) { - /* no evaluation of code */ - } - else { - if (0 < parser->nerr) { - /* syntax error */ - printf("line %d: %s\n", parser->error_buffer[0].lineno, parser->error_buffer[0].message); - } - else { - /* generate bytecode */ - n = mrb_generate_code(mrb, parser); - - /* evaluate the bytecode */ - result = mrb_run(mrb, - /* pass a proc for evaulation */ - mrb_proc_new(mrb, mrb->irep[n]), - mrb_top_self(mrb)); - /* did an exception occur? */ - if (mrb->exc) { - p(mrb, mrb_obj_value(mrb->exc), 0); - mrb->exc = 0; - } - else { - /* no */ - if (!mrb_respond_to(mrb, result, mrb_intern2(mrb, "inspect", 7))){ - result = mrb_any_to_s(mrb,result); - } - p(mrb, result, 1); - } - } - ruby_code[0] = '\0'; - last_code_line[0] = '\0'; - mrb_gc_arena_restore(mrb, ai); - } - mrb_parser_free(parser); - cxt->lineno++; - } - mrbc_context_free(mrb, cxt); - mrb_close(mrb); - -#ifdef ENABLE_READLINE - write_history(history_path); -#endif - - return 0; -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-bin-mruby/mrbgem.rake (+0 -5) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-bin-mruby/mrbgem.rake 2014-06-08 19:01:14 +0900 (08ba898) +++ /dev/null @@ -1,5 +0,0 @@ -MRuby::Gem::Specification.new('mruby-bin-mruby') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' - spec.bins = %w(mruby) -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c (+0 -251) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c 2014-06-08 19:01:14 +0900 (baeb959) +++ /dev/null @@ -1,251 +0,0 @@ -#include "mruby.h" -#include "mruby/proc.h" -#include "mruby/array.h" -#include "mruby/string.h" -#include "mruby/compile.h" -#include "mruby/dump.h" -#include "mruby/variable.h" -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#ifndef ENABLE_STDIO -static void -p(mrb_state *mrb, mrb_value obj) -{ - obj = mrb_funcall(mrb, obj, "inspect", 0); - fwrite(RSTRING_PTR(obj), RSTRING_LEN(obj), 1, stdout); - putc('\n', stdout); -} -#else -#define p(mrb,obj) mrb_p(mrb,obj) -#endif - -void mrb_show_version(mrb_state *); -void mrb_show_copyright(mrb_state *); - -struct _args { - FILE *rfp; - char* cmdline; - mrb_bool fname : 1; - mrb_bool mrbfile : 1; - mrb_bool check_syntax : 1; - mrb_bool verbose : 1; - int argc; - char** argv; -}; - -static void -usage(const char *name) -{ - static const char *const usage_msg[] = { - "switches:", - "-b load and execute RiteBinary (mrb) file", - "-c check syntax only", - "-e 'command' one line of script", - "-v print version number, then run in verbose mode", - "--verbose run in verbose mode", - "--version print the version", - "--copyright print the copyright", - NULL - }; - const char *const *p = usage_msg; - - printf("Usage: %s [switches] programfile\n", name); - while (*p) - printf(" %s\n", *p++); -} - -static int -parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) -{ - char **origargv = argv; - static const struct _args args_zero = { 0 }; - - *args = args_zero; - - for (argc--,argv++; argc > 0; argc--,argv++) { - char *item; - if (argv[0][0] != '-') break; - - if (strlen(*argv) <= 1) { - argc--; argv++; - args->rfp = stdin; - break; - } - - item = argv[0] + 1; - switch (*item++) { - case 'b': - args->mrbfile = 1; - break; - case 'c': - args->check_syntax = 1; - break; - case 'e': - if (item[0]) { - goto append_cmdline; - } - else if (argc > 1) { - argc--; argv++; - item = argv[0]; -append_cmdline: - if (!args->cmdline) { - size_t buflen; - char *buf; - - buflen = strlen(item) + 1; - buf = (char *)mrb_malloc(mrb, buflen); - memcpy(buf, item, buflen); - args->cmdline = buf; - } - else { - size_t cmdlinelen; - size_t itemlen; - - cmdlinelen = strlen(args->cmdline); - itemlen = strlen(item); - args->cmdline = - (char *)mrb_realloc(mrb, args->cmdline, cmdlinelen + itemlen + 2); - args->cmdline[cmdlinelen] = '\n'; - memcpy(args->cmdline + cmdlinelen + 1, item, itemlen + 1); - } - } - else { - printf("%s: No code specified for -e\n", *origargv); - return EXIT_SUCCESS; - } - break; - case 'v': - if (!args->verbose) mrb_show_version(mrb); - args->verbose = 1; - break; - case '-': - if (strcmp((*argv) + 2, "version") == 0) { - mrb_show_version(mrb); - exit(EXIT_SUCCESS); - } - else if (strcmp((*argv) + 2, "verbose") == 0) { - args->verbose = 1; - break; - } - else if (strcmp((*argv) + 2, "copyright") == 0) { - mrb_show_copyright(mrb); - exit(EXIT_SUCCESS); - } - default: - return EXIT_FAILURE; - } - } - - if (args->rfp == NULL && args->cmdline == NULL) { - if (*argv == NULL) args->rfp = stdin; - else { - args->rfp = fopen(argv[0], args->mrbfile ? "rb" : "r"); - if (args->rfp == NULL) { - printf("%s: Cannot open program file. (%s)\n", *origargv, *argv); - return 0; - } - args->fname = 1; - args->cmdline = argv[0]; - argc--; argv++; - } - } - args->argv = (char **)mrb_realloc(mrb, args->argv, sizeof(char*) * (argc + 1)); - memcpy(args->argv, argv, (argc+1) * sizeof(char*)); - args->argc = argc; - - return EXIT_SUCCESS; -} - -static void -cleanup(mrb_state *mrb, struct _args *args) -{ - if (args->rfp && args->rfp != stdin) - fclose(args->rfp); - if (args->cmdline && !args->fname) - mrb_free(mrb, args->cmdline); - if (args->argv) - mrb_free(mrb, args->argv); - mrb_close(mrb); -} - -int -main(int argc, char **argv) -{ - mrb_state *mrb = mrb_open(); - int n = -1; - int i; - struct _args args; - mrb_value ARGV; - - if (mrb == NULL) { - fputs("Invalid mrb_state, exiting mruby\n", stderr); - return EXIT_FAILURE; - } - - n = parse_args(mrb, argc, argv, &args); - if (n == EXIT_FAILURE || (args.cmdline == NULL && args.rfp == NULL)) { - cleanup(mrb, &args); - usage(argv[0]); - return n; - } - - ARGV = mrb_ary_new_capa(mrb, args.argc); - for (i = 0; i < args.argc; i++) { - mrb_ary_push(mrb, ARGV, mrb_str_new(mrb, args.argv[i], strlen(args.argv[i]))); - } - mrb_define_global_const(mrb, "ARGV", ARGV); - - if (args.mrbfile) { - n = mrb_read_irep_file(mrb, args.rfp); - if (n < 0) { - fprintf(stderr, "failed to load mrb file: %s\n", args.cmdline); - } - else if (!args.check_syntax) { - mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); - n = 0; - if (mrb->exc) { - mrb_print_error(mrb); - n = -1; - } - } - } - else { - mrbc_context *c = mrbc_context_new(mrb); - mrb_sym zero_sym = mrb_intern2(mrb, "$0", 2); - mrb_value v; - - if (args.verbose) - c->dump_result = 1; - if (args.check_syntax) - c->no_exec = 1; - - if (args.rfp) { - char *cmdline; - cmdline = args.cmdline ? args.cmdline : "-"; - mrbc_filename(mrb, c, cmdline); - mrb_gv_set(mrb, zero_sym, mrb_str_new_cstr(mrb, cmdline)); - v = mrb_load_file_cxt(mrb, args.rfp, c); - } - else { - mrbc_filename(mrb, c, "-e"); - mrb_gv_set(mrb, zero_sym, mrb_str_new(mrb, "-e", 2)); - v = mrb_load_string_cxt(mrb, args.cmdline, c); - } - - mrbc_context_free(mrb, c); - if (mrb->exc) { - if (!mrb_undef_p(v)) { - mrb_print_error(mrb); - } - n = -1; - } - else if (args.check_syntax) { - printf("Syntax OK\n"); - } - } - cleanup(mrb, &args); - - return n == 0 ? EXIT_SUCCESS : EXIT_FAILURE; -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-enum-ext/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-enum-ext/mrbgem.rake 2014-06-08 19:01:14 +0900 (e054f43) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-enum-ext') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-enum-ext/mrblib/enum.rb (+0 -164) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-enum-ext/mrblib/enum.rb 2014-06-08 19:01:14 +0900 (f250d39) +++ /dev/null @@ -1,164 +0,0 @@ -## -# Enumerable -# -module Enumerable - ## - # call-seq: - # enum.drop(n) -> array - # - # Drops first n elements from <i>enum</i>, and returns rest elements - # in an array. - # - # a = [1, 2, 3, 4, 5, 0] - # a.drop(3) #=> [4, 5, 0] - - def drop(n) - raise TypeError, "expected Integer for 1st argument" unless n.kind_of? Integer - raise ArgumentError, "attempt to drop negative size" if n < 0 - - ary = [] - self.each {|e| n == 0 ? ary << e : n -= 1 } - ary - end - - ## - # call-seq: - # enum.drop_while {|arr| block } -> array - # - # Drops elements up to, but not including, the first element for - # which the block returns +nil+ or +false+ and returns an array - # containing the remaining elements. - # - # a = [1, 2, 3, 4, 5, 0] - # a.drop_while {|i| i < 3 } #=> [3, 4, 5, 0] - - def drop_while(&block) - ary, state = [], false - self.each do |e| - state = true if !state and !block.call(e) - ary << e if state - end - ary - end - - ## - # call-seq: - # enum.take(n) -> array - # - # Returns first n elements from <i>enum</i>. - # - # a = [1, 2, 3, 4, 5, 0] - # a.take(3) #=> [1, 2, 3] - - def take(n) - raise TypeError, "expected Integer for 1st argument" unless n.kind_of? Integer - raise ArgumentError, "attempt to take negative size" if n < 0 - - ary = [] - self.each do |e| - break if ary.size >= n - ary << e - end - ary - end - - ## - # call-seq: - # enum.take_while {|arr| block } -> array - # - # Passes elements to the block until the block returns +nil+ or +false+, - # then stops iterating and returns an array of all prior elements. - # - # - # a = [1, 2, 3, 4, 5, 0] - # a.take_while {|i| i < 3 } #=> [1, 2] - - def take_while(&block) - ary = [] - self.each do |e| - return ary unless block.call(e) - ary << e - end - ary - end - - ## - # call-seq: - # enum.each_cons(n) {...} -> nil - # - # Iterates the given block for each array of consecutive <n> - # elements. - # - # e.g.: - # (1..10).each_cons(3) {|a| p a} - # # outputs below - # [1, 2, 3] - # [2, 3, 4] - # [3, 4, 5] - # [4, 5, 6] - # [5, 6, 7] - # [6, 7, 8] - # [7, 8, 9] - # [8, 9, 10] - - def each_cons(n, &block) - raise TypeError, "expected Integer for 1st argument" unless n.kind_of? Integer - raise ArgumentError, "invalid size" if n <= 0 - - ary = [] - self.each do |e| - ary.shift if ary.size == n - ary << e - block.call(ary.dup) if ary.size == n - end - end - - ## - # call-seq: - # enum.each_slice(n) {...} -> nil - # - # Iterates the given block for each slice of <n> elements. - # - # e.g.: - # (1..10).each_slice(3) {|a| p a} - # # outputs below - # [1, 2, 3] - # [4, 5, 6] - # [7, 8, 9] - # [10] - - def each_slice(n, &block) - raise TypeError, "expected Integer for 1st argument" unless n.kind_of? Integer - raise ArgumentError, "invalid slice size" if n <= 0 - - ary = [] - self.each do |e| - ary << e - if ary.size == n - block.call(ary) - ary = [] - end - end - block.call(ary) unless ary.empty? - end - - ## - # call-seq: - # enum.group_by {| obj | block } -> a_hash - # - # Returns a hash, which keys are evaluated result from the - # block, and values are arrays of elements in <i>enum</i> - # corresponding to the key. - # - # (1..6).group_by {|i| i%3} #=> {0=>[3, 6], 1=>[1, 4], 2=>[2, 5]} - - def group_by(&block) - h = {} - self.each do |e| - key = block.call(e) - h.key?(key) ? (h[key] << e) : (h[key] = [e]) - end - h - end - -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-enum-ext/test/enum.rb (+0 -43) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-enum-ext/test/enum.rb 2014-06-08 19:01:14 +0900 (a776223) +++ /dev/null @@ -1,43 +0,0 @@ -## -# Enumerable(Ext) Test - -assert("Enumerable#drop") do - a = [1, 2, 3, 4, 5, 0] - - assert_equal [4, 5, 0], a.drop(3) - assert_equal [], a.drop(6) -end - -assert("Enumerable#drop_while") do - a = [1, 2, 3, 4, 5, 0] - assert_equal [3, 4, 5, 0], a.drop_while {|i| i < 3 } -end - -assert("Enumerable#take") do - a = [1, 2, 3, 4, 5, 0] - assert_equal [1, 2, 3], a.take(3) -end - -assert("Enumerable#take_while") do - a = [1, 2, 3, 4, 5, 0] - assert_equal [1, 2], a.take_while {|i| i < 3} -end - -assert("Enumerable#each_cons") do - a = [] - (1..5).each_cons(3){|e| a << e} - assert_equal [[1, 2, 3], [2, 3, 4], [3, 4, 5]], a -end - -assert("Enumerable#each_slice") do - a = [] - (1..10).each_slice(3){|e| a << e} - assert_equal [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]], a -end - -assert("Enumerable#group_by") do - r = (1..6).group_by {|i| i % 3 } - assert_equal [3, 6], r[0] - assert_equal [1, 4], r[1] - assert_equal [2, 5], r[2] -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-eval/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-eval/mrbgem.rake 2014-06-08 19:01:14 +0900 (217a9e6) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-eval') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-eval/src/eval.c (+0 -23) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-eval/src/eval.c 2014-06-08 19:01:14 +0900 (c935f5e) +++ /dev/null @@ -1,23 +0,0 @@ -#include "mruby.h" -#include "mruby/compile.h" - -static mrb_value -f_eval(mrb_state *mrb, mrb_value self) -{ - char *s; - int len; - - mrb_get_args(mrb, "s", &s, &len); - return mrb_load_nstring(mrb, s, len); -} - -void -mrb_mruby_eval_gem_init(mrb_state* mrb) -{ - mrb_define_class_method(mrb, mrb->kernel_module, "eval", f_eval, MRB_ARGS_REQ(1)); -} - -void -mrb_mruby_eval_gem_final(mrb_state* mrb) -{ -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-exit/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-exit/mrbgem.rake 2014-06-08 19:01:14 +0900 (910b3b4) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-exit') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-exit/src/mruby-exit.c (+0 -24) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-exit/src/mruby-exit.c 2014-06-08 19:01:14 +0900 (d816575) +++ /dev/null @@ -1,24 +0,0 @@ -#include <stdlib.h> -#include "mruby.h" - -static mrb_value -f_exit(mrb_state *mrb, mrb_value self) -{ - mrb_int i = EXIT_SUCCESS; - - mrb_get_args(mrb, "|i", &i); - exit(i); - /* not reached */ - return mrb_nil_value(); -} - -void -mrb_mruby_exit_gem_init(mrb_state* mrb) -{ - mrb_define_method(mrb, mrb->kernel_module, "exit", f_exit, MRB_ARGS_REQ(1)); -} - -void -mrb_mruby_exit_gem_final(mrb_state* mrb) -{ -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-fiber/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-fiber/mrbgem.rake 2014-06-08 19:01:14 +0900 (25009c4) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-fiber') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-fiber/src/fiber.c (+0 -253) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-fiber/src/fiber.c 2014-06-08 19:01:14 +0900 (c764b47) +++ /dev/null @@ -1,253 +0,0 @@ -#include "mruby.h" -#include "mruby/array.h" -#include "mruby/class.h" -#include "mruby/proc.h" - -#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 (RuntimeError) - * - * 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 (RuntimeError) - * - */ -static mrb_value -fiber_init(mrb_state *mrb, mrb_value self) -{ - static const struct mrb_context mrb_context_zero = { 0 }; - struct RFiber *f = (struct RFiber*)mrb_ptr(self); - struct mrb_context *c; - struct RProc *p; - mrb_callinfo *ci; - mrb_value blk; - - 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_ARGUMENT_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 */ - c->stbase = (mrb_value *)mrb_calloc(mrb, FIBER_STACK_INIT_SIZE, sizeof(mrb_value)); - c->stend = c->stbase + FIBER_STACK_INIT_SIZE; - c->stack = c->stbase; - - /* 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; - - /* 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 = (struct RFiber*)mrb_ptr(fib); - - if (!f->cxt) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "uninitialized Fiber"); - } - return f->cxt; -} - -static mrb_value -fiber_result(mrb_state *mrb, mrb_value *a, 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 - -/* - * 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) -{ - struct mrb_context *c = fiber_check(mrb, self); - mrb_value *a; - int len; - - if (c->status == MRB_FIBER_RESUMED) { - mrb_raise(mrb, E_RUNTIME_ERROR, "double resume"); - } - if (c->status == MRB_FIBER_TERMINATED) { - mrb_raise(mrb, E_RUNTIME_ERROR, "resuming dead fiber"); - } - mrb_get_args(mrb, "*", &a, &len); - mrb->c->status = MRB_FIBER_RESUMED; - 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; - c->prev = mrb->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; - - MARK_CONTEXT_MODIFY(c); - return c->ci->proc->env->stack[0]; - } - MARK_CONTEXT_MODIFY(c); - c->prev = mrb->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.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); -} - -/* - * 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) -{ - struct mrb_context *c = mrb->c; - mrb_value *a; - int len; - - if (!c->prev) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "can't yield from root fiber"); - } - mrb_get_args(mrb, "*", &a, &len); - c->prev->status = MRB_FIBER_RUNNING; - mrb->c = c->prev; - c->prev = NULL; - MARK_CONTEXT_MODIFY(mrb->c); - return fiber_result(mrb, a, len); -} - -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, "alive?", fiber_alive_p, MRB_ARGS_NONE()); - - mrb_define_class_method(mrb, c, "yield", fiber_yield, MRB_ARGS_ANY()); -} - -void -mrb_mruby_fiber_gem_final(mrb_state* mrb) -{ -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-fiber/test/fiber.rb (+0 -64) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-fiber/test/fiber.rb 2014-06-08 19:01:14 +0900 (8caf725) +++ /dev/null @@ -1,64 +0,0 @@ -assert('Fiber.new') { - f = Fiber.new{} - f.class == Fiber -} - -assert('Fiber#resume') { - f = Fiber.new{|x| x == 2} - f.resume(2) -} - -assert('Fiber#alive?') { - f = Fiber.new{ Fiber.yield } - f.resume - r1 = f.alive? - f.resume - r2 = f.alive? - r1 == true and r2 == false -} - -assert('Fiber.yield') { - f = Fiber.new{|x| Fiber.yield(x == 3)} - f.resume(3) -} - -assert('Fiber iteration') { - f1 = Fiber.new{ - [1,2,3].each{|x| Fiber.yield(x)} - } - f2 = Fiber.new{ - [9,8,7].each{|x| Fiber.yield(x)} - } - a = [] - 3.times { - a << f1.resume - a << f2.resume - } - a == [1,9,2,8,3,7] -} - -assert('Fiber with splat in the block argument list') { - Fiber.new{|*x|x}.resume(1) == [1] -} - -assert('Fiber raises on resume when dead') { - r1 = true - begin - f = Fiber.new{} - f.resume - r1 = f.alive? - f.resume - false - rescue => e1 - true - end -} - -assert('Yield raises when called on root fiber') { - begin - Fiber.yield - false - rescue => e1 - true - end -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-hash-ext/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-hash-ext/mrbgem.rake 2014-06-08 19:01:14 +0900 (25d4f8e) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-hash-ext') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-hash-ext/mrblib/hash.rb (+0 -13) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-hash-ext/mrblib/hash.rb 2014-06-08 19:01:14 +0900 (3fb83ab) +++ /dev/null @@ -1,13 +0,0 @@ -class Hash - def merge!(other, &block) - raise "can't convert argument into Hash" unless other.respond_to?(:to_hash) - if block - other.each_key{|k| - self[k] = (self.has_key?(k))? block.call(k, self[k], other[k]): other[k] - } - else - other.each_key{|k| self[k] = other[k]} - end - self - end -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-hash-ext/src/hash-ext.c (+0 -62) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-hash-ext/src/hash-ext.c 2014-06-08 19:01:14 +0900 (9451892) +++ /dev/null @@ -1,62 +0,0 @@ -/* -** 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" - -/* - * 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"] - */ - -mrb_value -mrb_hash_values_at(mrb_state *mrb, int argc, mrb_value *argv, mrb_value hash) -{ - mrb_value result = mrb_ary_new_capa(mrb, argc); - long i; - - for (i=0; i<argc; i++) { - mrb_ary_push(mrb, result, mrb_hash_get(mrb, hash, argv[i])); - } - return result; -} - -static mrb_value -hash_values_at(mrb_state *mrb, mrb_value hash) -{ - mrb_value *argv; - int argc; - - mrb_get_args(mrb, "*", &argv, &argc); - - return mrb_hash_values_at(mrb, argc, argv, hash); -} - -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) -{ -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-hash-ext/test/hash.rb (+0 -24) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-hash-ext/test/hash.rb 2014-06-08 19:01:14 +0900 (40f6ac8) +++ /dev/null @@ -1,24 +0,0 @@ -## -# Hash(Ext) Test - -assert('Hash#merge!') do - a = { 'abc_key' => 'abc_value', 'cba_key' => 'cba_value' } - b = { 'cba_key' => 'XXX', 'xyz_key' => 'xyz_value' } - - result_1 = a.merge! b - - a = { 'abc_key' => 'abc_value', 'cba_key' => 'cba_value' } - result_2 = a.merge!(b) do |key, original, new| - original - end - - assert_equal({'abc_key' => 'abc_value', 'cba_key' => 'XXX', - 'xyz_key' => 'xyz_value' }, result_1) - assert_equal({'abc_key' => 'abc_value', 'cba_key' => 'cba_value', - 'xyz_key' => 'xyz_value' }, result_2) -end - -assert('Hash#values_at') do - h = { "cat" => "feline", "dog" => "canine", "cow" => "bovine" } - assert_equal ["bovine", "feline"], h.values_at("cow", "cat") -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-math/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-math/mrbgem.rake 2014-06-08 19:01:14 +0900 (75d3d1f) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-math') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-math/src/math.c (+0 -689) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-math/src/math.c 2014-06-08 19:01:14 +0900 (4960de6) +++ /dev/null @@ -1,689 +0,0 @@ -/* -** math.c - Math module -** -** See Copyright Notice in mruby.h -*/ - -#include "mruby.h" -#include "mruby/array.h" - -#include <math.h> - -#define domain_error(msg) \ - mrb_raise(mrb, E_RANGE_ERROR, "Numerical argument is out of domain - " #msg) - -/* math functions not provided by Microsoft Visual C++ 2012 or older */ -#if defined _MSC_VER && _MSC_VER < 1800 - -#define MATH_TOLERANCE 1E-12 - -#define asinh(x) log(x + sqrt(pow(x,2.0) + 1)) -#define acosh(x) log(x + sqrt(pow(x,2.0) - 1)) -#define atanh(x) (log(1+x) - log(1-x))/2.0 -#define cbrt(x) pow(x,1.0/3.0) - -/* 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__ - -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); - 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); - 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); - 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); - x = atanh(x); - - return mrb_float_value(mrb, x); -} - -/* - EXPONENTIALS AND LOGARITHMS -*/ -#if defined __CYGWIN__ -# include <cygwin/version.h> -# if CYGWIN_VERSION_DLL_MAJOR < 1005 -# define nan(x) nan() -# endif -# define log(x) ((x) < 0.0 ? nan("") : log(x)) -# define log10(x) ((x) < 0.0 ? nan("") : log10(x)) -#endif - -/* - * 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); - x = log(x); - if (argc == 2) { - 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); - 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); - 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); - 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"); - -#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) -{ -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-math/test/math.rb (+0 -136) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-math/test/math.rb 2014-06-08 19:01:14 +0900 (1cc3a20) +++ /dev/null @@ -1,136 +0,0 @@ -## -# Math Test - -## -# Performs fuzzy check for equality on methods returning floats -# on the basis of the Math::TOLERANCE constant. -def check_float(a, b) - tolerance = Math::TOLERANCE - a = a.to_f - b = b.to_f - if a.finite? and b.finite? - (a-b).abs < tolerance - else - true - end -end - -assert('Math.sin 0') do - check_float(Math.sin(0), 0) -end - -assert('Math.sin PI/2') do - check_float(Math.sin(Math::PI / 2), 1) -end - -assert('Fundamental trig identities') do - result = true - N = 13 - N.times do |i| - a = Math::PI / N * i - ca = Math::PI / 2 - a - s = Math.sin(a) - c = Math.cos(a) - t = Math.tan(a) - result &= check_float(s, Math.cos(ca)) - result &= check_float(t, 1 / Math.tan(ca)) - result &= check_float(s ** 2 + c ** 2, 1) - result &= check_float(t ** 2 + 1, (1/c) ** 2) - result &= check_float((1/t) ** 2 + 1, (1/s) ** 2) - end - result -end - -assert('Math.erf 0') do - check_float(Math.erf(0), 0) -end - -assert('Math.exp 0') do - check_float(Math.exp(0), 1.0) -end - -assert('Math.exp 1') do - check_float(Math.exp(1), 2.718281828459045) -end - -assert('Math.exp 1.5') do - check_float(Math.exp(1.5), 4.4816890703380645) -end - -assert('Math.log 1') do - check_float(Math.log(1), 0) -end - -assert('Math.log E') do - check_float(Math.log(Math::E), 1.0) -end - -assert('Math.log E**3') do - check_float(Math.log(Math::E**3), 3.0) -end - -assert('Math.log2 1') do - check_float(Math.log2(1), 0.0) -end - -assert('Math.log2 2') do - check_float(Math.log2(2), 1.0) -end - -assert('Math.log10 1') do - check_float(Math.log10(1), 0.0) -end - -assert('Math.log10 10') do - check_float(Math.log10(10), 1.0) -end - -assert('Math.log10 10**100') do - check_float(Math.log10(10**100), 100.0) -end - -assert('Math.sqrt') do - num = [0.0, 1.0, 2.0, 3.0, 4.0] - sqr = [0, 1, 4, 9, 16] - result = true - sqr.each_with_index do |v,i| - result &= check_float(Math.sqrt(v), num[i]) - end - result -end - -assert('Math.cbrt') do - num = [-2.0, -1.0, 0.0, 1.0, 2.0] - cub = [-8, -1, 0, 1, 8] - result = true - cub.each_with_index do |v,i| - result &= check_float(Math.cbrt(v), num[i]) - end - result -end - -assert('Math.hypot') do - check_float(Math.hypot(3, 4), 5.0) -end - -assert('Math.frexp 1234') do - n = 1234 - fraction, exponent = Math.frexp(n) - check_float(Math.ldexp(fraction, exponent), n) -end - -assert('Math.erf 1') do - check_float(Math.erf(1), 0.842700792949715) -end - -assert('Math.erfc 1') do - check_float(Math.erfc(1), 0.157299207050285) -end - -assert('Math.erf -1') do - check_float(Math.erf(-1), -0.8427007929497148) -end - -assert('Math.erfc -1') do - check_float(Math.erfc(-1), 1.8427007929497148) -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-numeric-ext/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-numeric-ext/mrbgem.rake 2014-06-08 19:01:14 +0900 (0108040) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-numeric-ext') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-numeric-ext/src/numeric_ext.c (+0 -31) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-numeric-ext/src/numeric_ext.c 2014-06-08 19:01:14 +0900 (bb6955b) +++ /dev/null @@ -1,31 +0,0 @@ -#include <limits.h> -#include "mruby.h" -#include "mruby/numeric.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) -{ -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-numeric-ext/test/numeric.rb (+0 -10) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-numeric-ext/test/numeric.rb 2014-06-08 19:01:14 +0900 (7d85eaa) +++ /dev/null @@ -1,10 +0,0 @@ -## -# Numeric(Ext) Test - -assert('Integer#chr') do - assert_equal("A", 65.chr) - assert_equal("B", 0x42.chr) - - # multibyte encoding (not support yet) - assert_raise(RangeError) { 12345.chr } -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-object-ext/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-object-ext/mrbgem.rake 2014-06-08 19:01:14 +0900 (980f166) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-object-ext') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-object-ext/src/object.c (+0 -108) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-object-ext/src/object.c 2014-06-08 19:01:14 +0900 (927a23d) +++ /dev/null @@ -1,108 +0,0 @@ -#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 - */ - -mrb_value -mrb_yield_internal(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv, mrb_value self, struct RClass *c); - -static mrb_value -mrb_obj_instance_exec(mrb_state *mrb, mrb_value self) -{ - mrb_value *argv; - 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_internal(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) -{ -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-object-ext/test/nil.rb (+0 -11) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-object-ext/test/nil.rb 2014-06-08 19:01:14 +0900 (5cd1cf4) +++ /dev/null @@ -1,11 +0,0 @@ -assert('NilClass#to_a') do - assert_equal [], nil.to_a -end - -assert('NilClass#to_f') do - assert_equal 0.0, nil.to_f -end - -assert('NilClass#to_i') do - assert_equal 0, nil.to_i -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-object-ext/test/object.rb (+0 -9) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-object-ext/test/object.rb 2014-06-08 19:01:14 +0900 (1f2dd1b) +++ /dev/null @@ -1,9 +0,0 @@ -assert('Object#instance_exec') do - class KlassWithSecret - def initialize - @secret = 99 - end - end - k = KlassWithSecret.new - assert_equal 104, k.instance_exec(5) {|x| @secret+x } -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-objectspace/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-objectspace/mrbgem.rake 2014-06-08 19:01:14 +0900 (6a6a3e7) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-objectspace') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-objectspace/src/mruby_objectspace.c (+0 -117) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-objectspace/src/mruby_objectspace.c 2014-06-08 19:01:14 +0900 (ac6189d) +++ /dev/null @@ -1,117 +0,0 @@ -#include <mruby.h> -#include <mruby/gc.h> -#include <mruby/hash.h> -#include <mruby/value.h> - -struct os_count_struct { - size_t total; - size_t freed; - size_t counts[MRB_TT_MAXDEFINE+1]; -}; - -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); - - if (is_dead(mrb, obj)) { - obj_count->freed++; - } else { - obj_count->counts[obj->tt]++; - obj_count->total++; - } -} - -/* - * call-seq: - * ObjectSpace.count_objects([result_hash]) -> hash - * - * Counts objects for each type. - * - * It returns a hash, such as: - * { - * :TOTAL=>10000, - * :FREE=>3011, - * :MRB_TT_OBJECT=>6, - * :MRB_TT_CLASS=>404, - * # ... - * } - * - * If the optional argument +result_hash+ is given, - * it is overwritten and returned. This is intended to avoid probe effect. - * - */ - -mrb_value -os_count_objects(mrb_state *mrb, mrb_value self) -{ - struct os_count_struct obj_count; - size_t 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); - } - - for (i = 0; i <= MRB_TT_MAXDEFINE; i++) { - obj_count.counts[i] = 0; - } - obj_count.total = 0; - obj_count.freed = 0; - - mrb_objspace_each_objects(mrb, os_count_object_type, &obj_count); - - mrb_hash_set(mrb, hash, mrb_symbol_value(mrb_intern_cstr(mrb, "TOTAL")), mrb_fixnum_value(obj_count.total)); - mrb_hash_set(mrb, hash, mrb_symbol_value(mrb_intern_cstr(mrb, "FREE")), mrb_fixnum_value(obj_count.freed)); - - for (i = 0; i < MRB_TT_MAXDEFINE; i++) { - mrb_value type; - switch (i) { -#define COUNT_TYPE(t) case (t): type = mrb_symbol_value(mrb_intern_cstr(mrb, #t)); break; - COUNT_TYPE(MRB_TT_FALSE); - COUNT_TYPE(MRB_TT_FREE); - COUNT_TYPE(MRB_TT_TRUE); - COUNT_TYPE(MRB_TT_FIXNUM); - COUNT_TYPE(MRB_TT_SYMBOL); - COUNT_TYPE(MRB_TT_UNDEF); - COUNT_TYPE(MRB_TT_FLOAT); - COUNT_TYPE(MRB_TT_CPTR); - COUNT_TYPE(MRB_TT_OBJECT); - COUNT_TYPE(MRB_TT_CLASS); - COUNT_TYPE(MRB_TT_MODULE); - COUNT_TYPE(MRB_TT_ICLASS); - COUNT_TYPE(MRB_TT_SCLASS); - COUNT_TYPE(MRB_TT_PROC); - COUNT_TYPE(MRB_TT_ARRAY); - COUNT_TYPE(MRB_TT_HASH); - COUNT_TYPE(MRB_TT_STRING); - COUNT_TYPE(MRB_TT_RANGE); - COUNT_TYPE(MRB_TT_EXCEPTION); - COUNT_TYPE(MRB_TT_FILE); - COUNT_TYPE(MRB_TT_ENV); - COUNT_TYPE(MRB_TT_DATA); -#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; -} - -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_ANY()); -} - -void -mrb_mruby_objectspace_gem_final(mrb_state* mrb) { -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-objectspace/test/objectspace.rb (+0 -37) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-objectspace/test/objectspace.rb 2014-06-08 19:01:14 +0900 (6121370) +++ /dev/null @@ -1,37 +0,0 @@ -assert('ObjectSpace.count_objects') do - h = {} - ObjectSpace.count_objects(h) - assert_kind_of(Hash, h) - assert_true(h.keys.all? {|x| x.is_a?(Symbol) || x.is_a?(Integer) }) - assert_true(h.values.all? {|x| x.is_a?(Integer) }) - - assert_true(h.has_key?(:TOTAL)) - assert_true(h.has_key?(:FREE)) - - h = ObjectSpace.count_objects - assert_kind_of(Hash, h) - assert_true(h.keys.all? {|x| x.is_a?(Symbol) || x.is_a?(Integer) }) - assert_true(h.values.all? {|x| x.is_a?(Integer) }) - - assert_raise(TypeError) { ObjectSpace.count_objects(1) } - - h0 = {:MRB_TT_FOO=>1000} - h = ObjectSpace.count_objects(h0) - assert_false(h0.has_key?(:MRB_TT_FOO)) - - GC.start - h_after = {} - h_before = ObjectSpace.count_objects - - objs = [] - 1000.times do - objs << {} - end - objs = nil - ObjectSpace.count_objects(h) - GC.start - ObjectSpace.count_objects(h_after) - - assert_equal(h[:MRB_TT_HASH], h_before[:MRB_TT_HASH] + 1000) - assert_equal(h_after[:MRB_TT_HASH], h_before[:MRB_TT_HASH]) -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-print/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-print/mrbgem.rake 2014-06-08 19:01:14 +0900 (768fc2e) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-print') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-print/mrblib/print.rb (+0 -64) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-print/mrblib/print.rb 2014-06-08 19:01:14 +0900 (38a1066) +++ /dev/null @@ -1,64 +0,0 @@ -## -# Kernel -# -# ISO 15.3.1 -module Kernel - ## - # Invoke method +print+ on STDOUT and passing +*args+ - # - # ISO 15.3.1.2.10 - def print(*args) - i = 0 - len = args.size - while i < len - __printstr__ args[i].to_s - i += 1 - end - end - - ## - # Invoke method +puts+ on STDOUT and passing +*args*+ - # - # ISO 15.3.1.2.11 - def puts(*args) - i = 0 - len = args.size - while i < len - s = args[i].to_s - __printstr__ s - __printstr__ "\n" if (s[-1] != "\n") - i += 1 - end - __printstr__ "\n" if len == 0 - nil - end - - ## - # Print human readable object description - # - # ISO 15.3.1.3.34 - def p(*args) - i = 0 - len = args.size - while i < len - __printstr__ args[i].inspect - __printstr__ "\n" - i += 1 - end - args[0] - end - - unless Kernel.respond_to?(:sprintf) - def printf(*args) - raise NotImplementedError.new('printf not available') - end - def sprintf(*args) - raise NotImplementedError.new('sprintf not available') - end - else - def printf(*args) - __printstr__(sprintf(*args)) - nil - end - end -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-print/src/print.c (+0 -44) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-print/src/print.c 2014-06-08 19:01:14 +0900 (788b924) +++ /dev/null @@ -1,44 +0,0 @@ -#include "mruby.h" -#include "mruby/string.h" -#include <stdio.h> - -static void -printstr(mrb_state *mrb, mrb_value obj) -{ - struct RString *str; - char *s; - int len; - - if (mrb_string_p(obj)) { - str = mrb_str_ptr(obj); - s = str->ptr; - len = str->len; - 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) -{ -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-proc-ext/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-proc-ext/mrbgem.rake 2014-06-08 19:01:14 +0900 (b75fced) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-proc-ext') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-proc-ext/mrblib/proc.rb (+0 -40) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-proc-ext/mrblib/proc.rb 2014-06-08 19:01:14 +0900 (5dd9981) +++ /dev/null @@ -1,40 +0,0 @@ -class Proc - - def ===(*args) - call(*args) - end - - def yield(*args) - call(*args) - end - - def to_proc - self - end - - def curry(arity=self.arity) - abs = lambda {|a| a < 0 ? -a - 1 : a} - arity = abs[arity] - if lambda? - self_arity = self.arity - if (self_arity >= 0 && arity != self_arity) || - (self_arity < 0 && abs[self_arity] > arity) - raise ArgumentError, "wrong number of arguments (#{arity} for #{abs[self_arity]})" - end - end - - pproc = self - make_curry = proc do |given_args=[]| - proc do |*args| - new_args = given_args + args - if new_args.size >= arity - pproc[*new_args] - else - make_curry[new_args] - end - end - end - make_curry.call - end - -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-proc-ext/src/proc.c (+0 -97) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-proc-ext/src/proc.c 2014-06-08 19:01:14 +0900 (87d96a8) +++ /dev/null @@ -1,97 +0,0 @@ -#include "mruby.h" -#include "mruby/proc.h" -#include "mruby/array.h" -#include "mruby/string.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; - mrb_value filename = mrb_nil_value(); - mrb_value lines = mrb_nil_value(); - - if (irep->filename) filename = mrb_str_new_cstr(mrb, irep->filename); - if (irep->lines) lines = mrb_fixnum_value(*irep->lines); - - return mrb_assoc_new(mrb, filename, lines); - } -} - -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_cstr(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; - mrb_str_cat_cstr(mrb, str, "@"); - - if (irep->filename) { - mrb_str_cat_cstr(mrb, str, irep->filename); - } - else { - mrb_str_cat_cstr(mrb, str, "-"); - } - mrb_str_cat_cstr(mrb, str, ":"); - - if (irep->lines) { - mrb_str_append(mrb, str, mrb_fixnum_value(*irep->lines)); - } - else { - mrb_str_cat_cstr(mrb, str, "-"); - } - } - - if (MRB_PROC_STRICT_P(p)) { - mrb_str_cat_cstr(mrb, str, " (lambda)"); - } - - mrb_str_cat_cstr(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; -} - -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_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) -{ -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-proc-ext/test/proc.rb (+0 -41) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-proc-ext/test/proc.rb 2014-06-08 19:01:14 +0900 (abbd7a9) +++ /dev/null @@ -1,41 +0,0 @@ -## -# Proc(Ext) Test - -assert('Proc#lambda?') do - assert_true lambda{}.lambda? - assert_true !Proc.new{}.lambda? -end - -assert('Proc#===') do - proc = Proc.new {|a| a * 2} - assert_equal 20, (proc === 10) -end - -assert('Proc#yield') do - proc = Proc.new {|a| a * 2} - assert_equal 20, proc.yield(10) -end - -assert('Proc#curry') do - b = proc {|x, y, z| (x||0) + (y||0) + (z||0) } - assert_equal 6, b.curry[1][2][3] - assert_equal 6, b.curry[1, 2][3, 4] - assert_equal 6, b.curry(5)[1][2][3][4][5] - assert_equal 6, b.curry(5)[1, 2][3, 4][5] - assert_equal 1, b.curry(1)[1] - - b = lambda {|x, y, z| (x||0) + (y||0) + (z||0) } - assert_equal 6, b.curry[1][2][3] - assert_raise(ArgumentError) { b.curry[1, 2][3, 4] } - assert_raise(ArgumentError) { b.curry(5) } - assert_raise(ArgumentError) { b.curry(1) } -end - -assert('Proc#to_proc') do - proc = Proc.new {} - assert_equal proc, proc.to_proc -end - -assert('Kernel#proc') do - assert_true !proc{|a|}.lambda? -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-random/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-random/mrbgem.rake 2014-06-08 19:01:14 +0900 (7ad3c85) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-random') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-random/src/mt19937ar.c (+0 -193) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-random/src/mt19937ar.c 2014-06-08 19:01:14 +0900 (3246909) +++ /dev/null @@ -1,193 +0,0 @@ -/* -** mt19937ar.c - MT Random functions -** -** See Copyright Notice in mruby.h -*/ - -#include <stdio.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 */ - -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 */ - -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 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_dbl = t->gen_int*(1.0/4294967295.0); - return t->gen_dbl; - /* divided by 2^32-1 */ -} - -/* 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 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 */ Deleted: vendor/mruby-eeac4be/mrbgems/mruby-random/src/mt19937ar.h (+0 -48) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-random/src/mt19937ar.h 2014-06-08 19:01:14 +0900 (d59bd87) +++ /dev/null @@ -1,48 +0,0 @@ -/* -** 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 gen_int; - double gen_dbl; - }; -} 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); Deleted: vendor/mruby-eeac4be/mrbgems/mruby-random/src/random.c (+0 -228) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-random/src/random.c 2014-06-08 19:01:14 +0900 (771167f) +++ /dev/null @@ -1,228 +0,0 @@ -/* -** random.c - Random module -** -** See Copyright Notice in mruby.h -*/ - -#include "mruby.h" -#include "mruby/variable.h" -#include "mruby/data.h" -#include "mt19937ar.h" - -#include <time.h> - -#define GLOBAL_RAND_SEED_KEY "$mrb_g_rand_seed" -#define GLOBAL_RAND_SEED_KEY_CSTR_LEN 16 - -#define INSTANCE_RAND_SEED_KEY "$mrb_i_rand_seed" -#define INSTANCE_RAND_SEED_KEY_CSTR_LEN 16 - -#define MT_STATE_KEY "$mrb_i_mt_state" -#define MT_STATE_KEY_CSTR_LEN 15 - -static const struct mrb_data_type mt_state_type = { - MT_STATE_KEY, mrb_free, -}; - -static mt_state *mrb_mt_get_context(mrb_state *mrb, mrb_value self) -{ - mt_state *t; - mrb_value context; - - context = mrb_iv_get(mrb, self, mrb_intern2(mrb, MT_STATE_KEY, MT_STATE_KEY_CSTR_LEN)); - t = DATA_GET_PTR(mrb, context, &mt_state_type, mt_state); - - return t; -} - -static void mt_g_srand(unsigned long seed) -{ - init_genrand(seed); -} - -static unsigned long mt_g_rand() -{ - return genrand_int32(); -} - -static double mt_g_rand_real() -{ - return genrand_real1(); -} - -static mrb_value mrb_random_mt_g_srand(mrb_state *mrb, mrb_value seed) -{ - if (mrb_nil_p(seed)) { - seed = mrb_fixnum_value(time(NULL) + mt_g_rand()); - if (mrb_fixnum(seed) < 0) { - seed = mrb_fixnum_value( 0 - mrb_fixnum(seed)); - } - } - - mt_g_srand((unsigned) mrb_fixnum(seed)); - - return seed; -} - -static mrb_value mrb_random_mt_g_rand(mrb_state *mrb, mrb_value max) -{ - mrb_value value; - - if (mrb_fixnum(max) == 0) { - value = mrb_float_value(mrb, mt_g_rand_real()); - } else { - value = mrb_fixnum_value(mt_g_rand() % mrb_fixnum(max)); - } - - return value; -} - -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(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_fixnum_value(0); - 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 mrb_random_g_rand(mrb_state *mrb, mrb_value self) -{ - mrb_value max; - mrb_value seed; - - max = get_opt(mrb); - seed = mrb_gv_get(mrb, mrb_intern2(mrb, GLOBAL_RAND_SEED_KEY, GLOBAL_RAND_SEED_KEY_CSTR_LEN)); - if (mrb_nil_p(seed)) { - mrb_random_mt_g_srand(mrb, mrb_nil_value()); - } - return mrb_random_mt_g_rand(mrb, max); -} - -static mrb_value mrb_random_g_srand(mrb_state *mrb, mrb_value self) -{ - mrb_value seed; - mrb_value old_seed; - - seed = get_opt(mrb); - seed = mrb_random_mt_g_srand(mrb, seed); - old_seed = mrb_gv_get(mrb, mrb_intern2(mrb, GLOBAL_RAND_SEED_KEY, GLOBAL_RAND_SEED_KEY_CSTR_LEN)); - mrb_gv_set(mrb, mrb_intern2(mrb, GLOBAL_RAND_SEED_KEY, GLOBAL_RAND_SEED_KEY_CSTR_LEN), seed); - return old_seed; -} - -static mrb_value mrb_random_init(mrb_state *mrb, mrb_value self) -{ - mrb_value seed; - - - mt_state *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); - mrb_iv_set(mrb, self, mrb_intern2(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN), seed); - mrb_iv_set(mrb, self, mrb_intern2(mrb, MT_STATE_KEY, MT_STATE_KEY_CSTR_LEN), - mrb_obj_value(Data_Wrap_Struct(mrb, mrb->object_class, &mt_state_type, (void*) t))); - return self; -} - -static mrb_value mrb_random_rand(mrb_state *mrb, mrb_value self) -{ - mrb_value max; - mrb_value seed; - mt_state *t = mrb_mt_get_context(mrb, self); - - max = get_opt(mrb); - seed = mrb_iv_get(mrb, self, mrb_intern2(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN)); - if (mrb_nil_p(seed)) { - mrb_random_mt_srand(mrb, t, mrb_nil_value()); - } - 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 = mrb_mt_get_context(mrb, self); - - seed = get_opt(mrb); - seed = mrb_random_mt_srand(mrb, t, seed); - old_seed = mrb_iv_get(mrb, self, mrb_intern2(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN)); - mrb_iv_set(mrb, self, mrb_intern2(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN), seed); - - return old_seed; -} - -void mrb_mruby_random_gem_init(mrb_state *mrb) -{ - struct RClass *random; - - 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_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)); -} - -void mrb_mruby_random_gem_final(mrb_state *mrb) -{ -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-random/src/random.h (+0 -12) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-random/src/random.h 2014-06-08 19:01:14 +0900 (3dc5d4e) +++ /dev/null @@ -1,12 +0,0 @@ -/* -// 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 Deleted: vendor/mruby-eeac4be/mrbgems/mruby-random/test/random.rb (+0 -32) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-random/test/random.rb 2014-06-08 19:01:14 +0900 (01d231d) +++ /dev/null @@ -1,32 +0,0 @@ -## -# Random Test - -assert("Random#srand") do - r1 = Random.new(123) - r2 = Random.new(123) - r1.rand == r2.rand -end - -assert("Kernel::srand") do - srand(234) - r1 = rand - srand(234) - r2 = rand - r1 == r2 -end - -assert("Random::srand") do - Random.srand(345) - r1 = rand - srand(345) - r2 = Random.rand - r1 == r2 -end - -assert("fixnum") do - rand(3).class == Fixnum -end - -assert("float") do - rand.class == Float -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-range-ext/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-range-ext/mrbgem.rake 2014-06-08 19:01:14 +0900 (a7970aa) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-range-ext') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-range-ext/src/range.c (+0 -141) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-range-ext/src/range.c 2014-06-08 19:01:14 +0900 (4e17dac) +++ /dev/null @@ -1,141 +0,0 @@ -#include "mruby.h" -#include "mruby/range.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_type(r) == MRB_TT_FIXNUM) { - 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 */ - - if (mrb_type(r) == MRB_TT_FIXNUM) { - if (mrb_fixnum(r) == -1) return TRUE; - } - - return FALSE; -} - -/* - * 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_value num; - mrb_value array; - struct RRange *r = mrb_range_ptr(range); - - if (mrb_get_args(mrb, "|o", &num) == 0) { - return r->edges->beg; - } - - array = mrb_funcall(mrb, range, "to_a", 0); - return mrb_funcall(mrb, array, "first", 1, mrb_to_int(mrb, 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)); -} - -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)); -} - -void -mrb_mruby_range_ext_gem_final(mrb_state* mrb) -{ -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-range-ext/test/range.rb (+0 -20) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-range-ext/test/range.rb 2014-06-08 19:01:14 +0900 (2a170a6) +++ /dev/null @@ -1,20 +0,0 @@ -## -# Range(Ext) Test - -assert('Range#cover?') do - assert_true ("a".."z").cover?("c") - assert_true !("a".."z").cover?("5") - assert_true ("a".."z").cover?("cc") -end - -assert('Range#first') do - assert_equal 10, (10..20).first - assert_equal [10, 11, 12], (10..20).first(3) -end - -assert('Range#last') do - assert_equal 20, (10..20).last - assert_equal 20, (10...20).last - assert_equal [18, 19, 20], (10..20).last(3) - assert_equal [17, 18, 19], (10...20).last(3) -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-sprintf/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-sprintf/mrbgem.rake 2014-06-08 19:01:14 +0900 (3e15ee7) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-sprintf') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-sprintf/src/kernel.c (+0 -30) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-sprintf/src/kernel.c 2014-06-08 19:01:14 +0900 (bd4f2bc) +++ /dev/null @@ -1,30 +0,0 @@ -/* -** 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. */ -} - Deleted: vendor/mruby-eeac4be/mrbgems/mruby-sprintf/src/sprintf.c (+0 -1102) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-sprintf/src/sprintf.c 2014-06-08 19:01:14 +0900 (6479b19) +++ /dev/null @@ -1,1102 +0,0 @@ -/* -** 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> - -#ifdef HAVE_IEEEFP_H -#include <ieeefp.h> -#endif - -#define BIT_DIGITS(N) (((N)*146)/485 + 1) /* log2(10) =~ 146/485 */ -#define BITSPERDIG (sizeof(mrb_int)*CHAR_BIT) -#define EXTENDSIGN(n, l) (((~0 << (n)) >> (((n)*(l)) % BITSPERDIG)) & ~(~0 << (n))) - -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(mrb, "0", 1); - } - *--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 { \ - t = p++; \ - n = 0; \ - GETNUM(n, val); \ - if (*p == '$') { \ - tmp = GETPOSARG(n); \ - } \ - else { \ - tmp = GETARG(); \ - p = t; \ - } \ - num = mrb_fixnum(tmp); \ -} 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) -{ - 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 tmp; - 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--; - - 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; - unsigned int c; - - tmp = mrb_check_string_type(mrb, val); - if (!mrb_nil_p(tmp)) { - if (RSTRING_LEN(tmp) != 1 ) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "%c requires a character"); - } - c = RSTRING_PTR(tmp)[0]; - n = 1; - } - else { - c = mrb_fixnum(val); - n = 1; - } - if (n <= 0) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid character"); - } - if (!(flags & FWIDTH)) { - CHECK(n); - buf[blen] = c; - blen += n; - } - else if ((flags & FMINUS)) { - CHECK(n); - buf[blen] = c; - blen += n; - FILL(' ', width-1); - } - else { - FILL(' ', width-1); - CHECK(n); - buf[blen] = c; - 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); - RSTRING_LEN(result) = 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, 0/*Qfalse*/)); - } - 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 (isnan(fval) || isinf(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'; -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-sprintf/test/sprintf.rb (+0 -3) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-sprintf/test/sprintf.rb 2014-06-08 19:01:14 +0900 (52e94fb) +++ /dev/null @@ -1,3 +0,0 @@ -## -# Kernel#sprintf Kernel#format Test - Deleted: vendor/mruby-eeac4be/mrbgems/mruby-string-ext/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-string-ext/mrbgem.rake 2014-06-08 19:01:14 +0900 (4a33699) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-string-ext') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-string-ext/mrblib/string.rb (+0 -52) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-string-ext/mrblib/string.rb 2014-06-08 19:01:14 +0900 (005438b) +++ /dev/null @@ -1,52 +0,0 @@ -class String - def lstrip - a = 0 - z = self.size - 1 - a += 1 while " \f\n\r\t\v".include?(self[a]) and a <= z - (z >= 0) ? self[a..z] : "" - end - - def rstrip - a = 0 - z = self.size - 1 - z -= 1 while " \f\n\r\t\v\0".include?(self[z]) and a <= z - (z >= 0) ? self[a..z] : "" - end - - def strip - a = 0 - z = self.size - 1 - a += 1 while " \f\n\r\t\v".include?(self[a]) and a <= z - z -= 1 while " \f\n\r\t\v\0".include?(self[z]) and a <= z - (z >= 0) ? self[a..z] : "" - end - - def lstrip! - s = self.lstrip - (s == self) ? nil : self.replace(s) - end - - def rstrip! - s = self.rstrip - (s == self) ? nil : self.replace(s) - end - - def strip! - s = self.strip - (s == self) ? nil : self.replace(s) - end - -# call-seq: -# str.casecmp(other_str) -> -1, 0, +1 or nil -# -# Case-insensitive version of <code>String#<=></code>. -# -# "abcdef".casecmp("abcde") #=> 1 -# "aBcDeF".casecmp("abcdef") #=> 0 -# "abcdef".casecmp("abcdefg") #=> -1 -# "abcdef".casecmp("ABCDEF") #=> 0 -# - def casecmp(str) - self.downcase <=> str.downcase - end -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-string-ext/src/string.c (+0 -184) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-string-ext/src/string.c 2014-06-08 19:01:14 +0900 (6718e73) +++ /dev/null @@ -1,184 +0,0 @@ -#include "mruby.h" -#include "mruby/string.h" -#include <ctype.h> -#include <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 = s->ptr; - pend = s->ptr + s->len; - 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; - 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; - 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(); -} - -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()); -} - -void -mrb_mruby_string_ext_gem_final(mrb_state* mrb) -{ -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-string-ext/test/string.rb (+0 -116) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-string-ext/test/string.rb 2014-06-08 19:01:14 +0900 (3ab9594) +++ /dev/null @@ -1,116 +0,0 @@ -## -# String(Ext) Test - -assert('String#getbyte') do - str1 = "hello" - bytes1 = [104, 101, 108, 108, 111] - assert_equal bytes1[0], str1.getbyte(0) - assert_equal bytes1[-1], str1.getbyte(-1) - assert_equal bytes1[6], str1.getbyte(6) - - str2 = "\xFF" - bytes2 = [0xFF] - assert_equal bytes2[0], str2.getbyte(0) -end - -assert('String#dump') do - ("\1" * 100).dump # should not raise an exception - regress #1210 - "\0".inspect == "\"\\000\"" and - "foo".dump == "\"foo\"" -end - -assert('String#strip') do - s = " abc " - s.strip - "".strip == "" and " \t\r\n\f\v".strip == "" and - "\0a\0".strip == "\0a" and - "abc".strip == "abc" and - " abc".strip == "abc" and - "abc ".strip == "abc" and - " abc ".strip == "abc" and - s == " abc " -end - -assert('String#lstrip') do - s = " abc " - s.lstrip - "".lstrip == "" and " \t\r\n\f\v".lstrip == "" and - "\0a\0".lstrip == "\0a\0" and - "abc".lstrip == "abc" and - " abc".lstrip == "abc" and - "abc ".lstrip == "abc " and - " abc ".lstrip == "abc " and - s == " abc " -end - -assert('String#rstrip') do - s = " abc " - s.rstrip - "".rstrip == "" and " \t\r\n\f\v".rstrip == "" and - "\0a\0".rstrip == "\0a" and - "abc".rstrip == "abc" and - " abc".rstrip == " abc" and - "abc ".rstrip == "abc" and - " abc ".rstrip == " abc" and - s == " abc " -end - -assert('String#strip!') do - s = " abc " - t = "abc" - s.strip! == "abc" and s == "abc" and t.strip! == nil -end - -assert('String#lstrip!') do - s = " abc " - t = "abc " - s.lstrip! == "abc " and s == "abc " and t.lstrip! == nil -end - -assert('String#rstrip!') do - s = " abc " - t = " abc" - s.rstrip! == " abc" and s == " abc" and t.rstrip! == nil -end - -assert('String#swapcase') do - assert_equal "hELLO", "Hello".swapcase - assert_equal "CyBeR_pUnK11", "cYbEr_PuNk11".swapcase -end - -assert('String#swapcase!') do - s = "Hello" - t = s.clone - t.swapcase! - assert_equal s.swapcase, t -end - -assert('String#concat') do - s = "Hello " - s.concat "World!" - t = "Hello " - t << "World!" - assert_equal "Hello World!", t - assert_equal "Hello World!", s -end - -assert('String#casecmp') do - assert_equal 1, "abcdef".casecmp("abcde") - assert_equal 0, "aBcDeF".casecmp("abcdef") - assert_equal(-1, "abcdef".casecmp("abcdefg")) - assert_equal 0, "abcdef".casecmp("ABCDEF") -end - -assert('String#start_with?') do - assert_true "hello".start_with?("heaven", "hell") - assert_true !"hello".start_with?("heaven", "paradise") - assert_true !"h".start_with?("heaven", "hell") - assert_raise TypeError do "hello".start_with?(true) end -end - -assert('String#end_with?') do - assert_true "string".end_with?("ing", "mng") - assert_true !"string".end_with?("str", "tri") - assert_true !"ng".end_with?("ing", "mng") - assert_raise TypeError do "hello".end_with?(true) end -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-struct/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-struct/mrbgem.rake 2014-06-08 19:01:14 +0900 (3e9eab8) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-struct') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-struct/mrblib/struct.rb (+0 -50) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-struct/mrblib/struct.rb 2014-06-08 19:01:14 +0900 (5d0ede9) +++ /dev/null @@ -1,50 +0,0 @@ -## -# Struct -# -# ISO 15.2.18 - -if Object.const_defined?(:Struct) - class Struct - - ## - # Calls the given block for each element of +self+ - # and pass the respective element. - # - # ISO 15.2.18.4.4 - def each(&block) - self.class.members.each{|field| - block.call(self[field]) - } - self - end - - ## - # Calls the given block for each element of +self+ - # and pass the name and value of the respectiev - # element. - # - # ISO 15.2.18.4.5 - def each_pair(&block) - self.class.members.each{|field| - block.call(field.to_sym, self[field]) - } - self - end - - ## - # Calls the given block for each element of +self+ - # and returns an array with all elements of which - # block is not false. - # - # ISO 15.2.18.4.7 - def select(&block) - ary = [] - self.class.members.each{|field| - val = self[field] - ary.push(val) if block.call(val) - } - ary - end - end -end - Deleted: vendor/mruby-eeac4be/mrbgems/mruby-struct/src/struct.c (+0 -818) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-struct/src/struct.c 2014-06-08 19:01:14 +0900 (a8511fc) +++ /dev/null @@ -1,818 +0,0 @@ -/* -** struct.c - Struct class -** -** See Copyright Notice in mruby.h -*/ - -#include <string.h> -#include <stdarg.h> -#include "mruby.h" -#include "mruby/array.h" -#include "mruby/string.h" -#include "mruby/class.h" -#include "mruby/data.h" -#include "mruby/variable.h" - -#define RSTRUCT_ARY(st) mrb_ary_ptr(st) -#define RSTRUCT_LEN(st) RSTRUCT_ARY(st)->len -#define RSTRUCT_PTR(st) RSTRUCT_ARY(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); - } -} - -mrb_value -mrb_struct_iv_get(mrb_state *mrb, mrb_value c, const char *name) -{ - return struct_ivar_get(mrb, c, mrb_intern_cstr(mrb, name)); -} - -mrb_value -mrb_struct_s_members(mrb_state *mrb, mrb_value klass) -{ - mrb_value members = struct_ivar_get(mrb, klass, mrb_intern2(mrb, "__members__", 11)); - - 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; -} - -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; - mrb_value *p, *pend; - - members = mrb_struct_s_members(mrb, klass); - ary = mrb_ary_new_capa(mrb, RARRAY_LEN(members)); - p = RARRAY_PTR(members); pend = p + RARRAY_LEN(members); - while (p < pend) { - mrb_ary_push(mrb, ary, *p); - p++; - } - 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))); -} - -mrb_value -mrb_struct_getmember(mrb_state *mrb, mrb_value obj, mrb_sym id) -{ - mrb_value members, slot, *ptr, *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 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 mrb_value (*const ref_func[])(mrb_state*, mrb_value) = { - 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, -}; - -mrb_sym -mrb_id_attrset(mrb_state *mrb, mrb_sym id) -{ - const char *name; - char *buf; - size_t len; - mrb_sym mid; - - name = mrb_sym2name_len(mrb, id, &len); - buf = (char *)mrb_malloc(mrb, len+2); - memcpy(buf, name, len); - buf[len] = '='; - buf[len+1] = '\0'; - - mid = mrb_intern2(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; - size_t i, len; - mrb_sym mid; - mrb_value members, slot, *ptr, *ptr_members; - - /* get base id */ - name = mrb_sym2name_len(mrb, mrb->c->ci->mid, &len); - mid = mrb_intern2(mrb, name, len-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); -} - -#define is_notop_id(id) (id)//((id)>tLAST_TOKEN) -#define is_local_id(id) (is_notop_id(id))//&&((id)&ID_SCOPE_MASK)==ID_LOCAL) -int -mrb_is_local_id(mrb_sym id) -{ - return is_local_id(id); -} - -#define is_const_id(id) (is_notop_id(id))//&&((id)&ID_SCOPE_MASK)==ID_CONST) -int -mrb_is_const_id(mrb_sym id) -{ - return is_const_id(id); -} - -static mrb_value -make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass * klass) -{ - mrb_value nstr, *ptr_members; - mrb_sym id; - mrb_int i, len; - 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 (!mrb_is_const_id(id)) { - mrb_name_error(mrb, id, "identifier %S needs to be constant", name); - } - if (mrb_const_defined_at(mrb, 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_intern2(mrb, "__members__", 11), 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; - ptr_members = RARRAY_PTR(members); - len = RARRAY_LEN(members); - for (i=0; i< len; i++) { - mrb_sym id = mrb_symbol(ptr_members[i]); - if (mrb_is_local_id(id) || mrb_is_const_id(id)) { - 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)); - } - } - return nstr; -} - -mrb_value -mrb_struct_define(mrb_state *mrb, const char *name, ...) -{ - va_list ar; - mrb_value nm, ary; - char *mem; - - if (!name) nm = mrb_nil_value(); - else nm = mrb_str_new_cstr(mrb, name); - ary = mrb_ary_new(mrb); - - va_start(ar, name); - while ((mem = va_arg(ar, char*)) != 0) { - mrb_sym slot = mrb_intern(mrb, mem); - mrb_ary_push(mrb, ary, mrb_symbol_value(slot)); - } - va_end(ar); - - return make_struct(mrb, nm, ary, struct_class(mrb)); -} - -/* 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; - int argcnt; - mrb_int i; - mrb_value b, st; - mrb_sym id; - mrb_value *argv; - 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]); - RARRAY_PTR(rest)[i] = mrb_symbol_value(id); - } - } - st = make_struct(mrb, name, rest, struct_class(mrb)); - if (!mrb_nil_p(b)) { - mrb_funcall(mrb, b, "call", 1, &st); - } - - return st; -} - -static int -num_members(mrb_state *mrb, struct RClass *klass) -{ - mrb_value members; - - members = struct_ivar_get(mrb, mrb_obj_value(klass), mrb_intern2(mrb, "__members__", 11)); - 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, int argc, mrb_value *argv, mrb_value self) -{ - struct RClass *klass = mrb_obj_class(mrb, self); - 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; - int argc; - - mrb_get_args(mrb, "*", &argv, &argc); - return mrb_struct_initialize_withArg(mrb, argc, argv, self); -} - -mrb_value -mrb_struct_initialize(mrb_state *mrb, mrb_value self, mrb_value values) -{ - return mrb_struct_initialize_withArg(mrb, RARRAY_LEN(values), RARRAY_PTR(values), self); -} - -static mrb_value -inspect_struct(mrb_state *mrb, mrb_value s, int recur) -{ - const char *cn = mrb_class_name(mrb, mrb_obj_class(mrb, s)); - mrb_value members, str = mrb_str_new(mrb, "#<struct ", 9); - mrb_value *ptr, *ptr_members; - mrb_int i, len; - - if (cn) { - mrb_str_append(mrb, str, mrb_str_new_cstr(mrb, cn)); - } - if (recur) { - return mrb_str_cat2(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; - - if (i > 0) { - mrb_str_cat2(mrb, str, ", "); - } - else if (cn) { - mrb_str_cat2(mrb, str, " "); - } - slot = ptr_members[i]; - id = mrb_symbol(slot); - if (mrb_is_local_id(id) || mrb_is_const_id(id)) { - const char *name; - size_t len; - - name = mrb_sym2name_len(mrb, id, &len); - mrb_str_append(mrb, str, mrb_str_new(mrb, name, len)); - } - else { - mrb_str_append(mrb, str, mrb_inspect(mrb, slot)); - } - mrb_str_cat2(mrb, str, "="); - mrb_str_append(mrb, str, mrb_inspect(mrb, ptr[i])); - } - mrb_str_cat2(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, 0); -} - -/* 15.2.18.4.9 */ -/* :nodoc: */ -mrb_value -mrb_struct_init_copy(mrb_state *mrb, mrb_value copy) -{ - mrb_value s; - 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 -mrb_struct_aref_id(mrb_state *mrb, mrb_value s, mrb_sym id) -{ - mrb_value *ptr, members, *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 */ -} - -/* 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" - */ -mrb_value -mrb_struct_aref_n(mrb_state *mrb, mrb_value s, mrb_value idx) -{ - mrb_int i; - - 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_aref_id(mrb, s, mrb_symbol(idx)); - } - - i = mrb_fixnum(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]; -} - -mrb_value -mrb_struct_aref(mrb_state *mrb, mrb_value s) -{ - mrb_value idx; - - mrb_get_args(mrb, "o", &idx); - return mrb_struct_aref_n(mrb, s, idx); -} - -static mrb_value -mrb_struct_aset_id(mrb_state *mrb, mrb_value s, mrb_sym id, mrb_value val) -{ - mrb_value members, *ptr, *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" - */ - -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_symbol_p(idx)) { - return mrb_struct_aset_id(mrb, s, mrb_obj_to_sym(mrb, idx), val); - } - - i = mrb_fixnum(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); -} - -/* - * 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) */ -} - -void -mrb_mruby_struct_gem_final(mrb_state* mrb) -{ -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-struct/test/struct.rb (+0 -77) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-struct/test/struct.rb 2014-06-08 19:01:14 +0900 (d79b30c) +++ /dev/null @@ -1,77 +0,0 @@ -## -# Struct ISO Test - -if Object.const_defined?(:Struct) - assert('Struct', '15.2.18') do - Struct.class == Class - end - - assert('Struct superclass', '15.2.18.2') do - Struct.superclass == Object - end - - assert('Struct.new', '15.2.18.3.1') do - c = Struct.new(:m1, :m2) - c.superclass == Struct and - c.members == [:m1,:m2] - end - - # Check crash bug with Struc.new and no params. - assert('Struct.new', '15.2.18.3.1') do - c = Struct.new() - c.superclass == Struct and c.members == [] - end - - assert('Struct#==', '15.2.18.4.1') do - c = Struct.new(:m1, :m2) - cc1 = c.new(1,2) - cc2 = c.new(1,2) - cc1 == cc2 - end - - assert('Struct#[]', '15.2.18.4.2') do - c = Struct.new(:m1, :m2) - cc = c.new(1,2) - cc[:m1] == 1 and cc["m2"] == 2 - end - - assert('Struct#[]=', '15.2.18.4.3') do - c = Struct.new(:m1, :m2) - cc = c.new(1,2) - cc[:m1] = 3 - cc[:m1] == 3 - end - - assert('Struct#each', '15.2.18.4.4') do - c = Struct.new(:m1, :m2) - cc = c.new(1,2) - a = [] - cc.each{|x| - a << x - } - a[0] == 1 and a[1] == 2 - end - - assert('Struct#each_pair', '15.2.18.4.5') do - c = Struct.new(:m1, :m2) - cc = c.new(1,2) - a = [] - cc.each_pair{|k,v| - a << [k,v] - } - a[0] == [:m1, 1] and a[1] == [:m2, 2] - end - - assert('Struct#members', '15.2.18.4.6') do - c = Struct.new(:m1, :m2) - cc = c.new(1,2) - cc.members == [:m1,:m2] - end - - assert('Struct#select', '15.2.18.4.7') do - c = Struct.new(:m1, :m2) - cc = c.new(1,2) - cc.select{|v| v % 2 == 0} == [2] - end -end - Deleted: vendor/mruby-eeac4be/mrbgems/mruby-symbol-ext/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-symbol-ext/mrbgem.rake 2014-06-08 19:01:14 +0900 (6294e7a) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-symbol-ext') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-symbol-ext/mrblib/symbol.rb (+0 -9) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-symbol-ext/mrblib/symbol.rb 2014-06-08 19:01:14 +0900 (f716162) +++ /dev/null @@ -1,9 +0,0 @@ -class Symbol - - def to_proc - Proc.new do |obj, *args| - obj.send(self, *args) - end - end - -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-symbol-ext/src/symbol.c (+0 -55) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-symbol-ext/src/symbol.c 2014-06-08 19:01:14 +0900 (3d2cb1e) +++ /dev/null @@ -1,55 +0,0 @@ -#include "mruby.h" -#include "mruby/khash.h" -#include "mruby/array.h" - -typedef struct symbol_name { - size_t len; - const char *name; -} symbol_name; - -KHASH_DECLARE(n2s, symbol_name, mrb_sym, 1) - -/* - * 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) -{ - khiter_t k; - mrb_sym sym; - khash_t(n2s) *h = mrb->name2sym; - mrb_value ary = mrb_ary_new_capa(mrb, kh_size(h)); - - for (k = kh_begin(h); k != kh_end(h); k++) { - if (kh_exist(h, k)) { - sym = kh_value(h, k); - mrb_ary_push(mrb, ary, mrb_symbol_value(sym)); - } - } - - return ary; -} - -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()); -} - -void -mrb_mruby_symbol_ext_gem_final(mrb_state* mrb) -{ -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-symbol-ext/test/symbol.rb (+0 -12) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-symbol-ext/test/symbol.rb 2014-06-08 19:01:14 +0900 (741315d) +++ /dev/null @@ -1,12 +0,0 @@ -## -# Symbol(Ext) Test - -assert('Symbol#to_proc') do - assert_equal 5, :abs.to_proc[-5] -end - -assert('Symbol.all_symbols') do - foo = [:__symbol_test_1, :__symbol_test_2, :__symbol_test_3].sort - symbols = Symbol.all_symbols.select{|sym|sym.to_s.include? '__symbol_test'}.sort - assert_equal foo, symbols -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-time/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-time/mrbgem.rake 2014-06-08 19:01:14 +0900 (edf2aa3) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-time') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-time/src/time.c (+0 -721) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-time/src/time.c 2014-06-08 19:01:14 +0900 (2ec3529) +++ /dev/null @@ -1,721 +0,0 @@ -/* -** time.c - Time class -** -** See Copyright Notice in mruby.h -*/ - - -#include "mruby.h" -#include <stdio.h> -#include <time.h> -#include "mruby/class.h" -#include "mruby/data.h" - -/** Time class configuration */ - -/* gettimeofday(2) */ -/* C99 does not have gettimeofday that is required to retrieve microseconds */ -/* uncomment following macro on platforms without gettimeofday(2) */ -/* #define NO_GETTIMEOFDAY */ - -/* gmtime(3) */ -/* C99 does not have reentrant gmtime_r() so it might cause troubles under */ -/* multi-threading environment. undef following macro on platforms that */ -/* does not have gmtime_r() and localtime_r(). */ -/* #define NO_GMTIME_R */ - -#ifdef _WIN32 -#if _MSC_VER -/* Win32 platform do not provide gmtime_r/localtime_r; emulate them using gmtime_s/localtime_s */ -#define gmtime_r(tp, tm) ((gmtime_s((tm), (tp)) == 0) ? (tm) : NULL) -#define localtime_r(tp, tm) ((localtime_s((tm), (tp)) == 0) ? (tm) : NULL) -#else -#define NO_GMTIME_R -#endif -#endif - -/* timegm(3) */ -/* mktime() creates tm structure for localtime; timegm() is for UTF time */ -/* define following macro to use probably faster timegm() on the platform */ -/* #define USE_SYSTEM_TIMEGM */ - -/** end of Time class configuration */ - -#ifndef NO_GETTIMEOFDAY -#include <sys/time.h> -#endif -#ifdef NO_GMTIME_R -#define gmtime_r(t,r) gmtime(t) -#define localtime_r(t,r) (tzset(),localtime(t)) -#endif - -#ifndef USE_SYSTEM_TIMEGM -#define timegm my_timgm - -static unsigned int -is_leapyear(unsigned int y) -{ - return (y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0); -} - -static time_t -timegm(struct tm *tm) -{ - static const unsigned int ndays[2][12] = { - {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, - {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} - }; - time_t r = 0; - int i; - unsigned int *nday = (unsigned int*) ndays[is_leapyear(tm->tm_year+1900)]; - - for (i = 70; i < tm->tm_year; ++i) - r += is_leapyear(i+1900) ? 366*24*60*60 : 365*24*60*60; - for (i = 0; i < tm->tm_mon; ++i) - r += nday[i] * 24 * 60 * 60; - r += (tm->tm_mday - 1) * 24 * 60 * 60; - r += tm->tm_hour * 60 * 60; - r += tm->tm_min * 60; - r += tm->tm_sec; - return r; -} -#endif - -/* Since we are limited to using ISO C89, this implementation is based -* on time_t. That means the resolution of time is only precise to the -* second level. Also, there are only 2 timezones, namely UTC and LOCAL. -*/ - -enum mrb_timezone { - MRB_TIMEZONE_NONE = 0, - MRB_TIMEZONE_UTC = 1, - MRB_TIMEZONE_LOCAL = 2, - MRB_TIMEZONE_LAST = 3 -}; - -static const char *timezone_names[] = { - "none", - "UTC", - "LOCAL", - NULL -}; - -static const char *mon_names[] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", -}; - -static const char *wday_names[] = { - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", -}; - -struct mrb_time { - time_t sec; - time_t usec; - enum mrb_timezone timezone; - struct tm datetime; -}; - -static struct mrb_data_type mrb_time_type = { "Time", mrb_free }; - -/** Updates the datetime of a mrb_time based on it's timezone and -seconds setting. Returns self on success, NULL of failure. */ -static struct mrb_time* -mrb_time_update_datetime(struct mrb_time *self) -{ - struct tm *aid; - - if (self->timezone == MRB_TIMEZONE_UTC) { - aid = gmtime_r(&self->sec, &self->datetime); - } - else { - aid = localtime_r(&self->sec, &self->datetime); - } - if (!aid) return NULL; -#ifdef NO_GMTIME_R - self->datetime = *aid; // copy data -#endif - - return self; -} - -static mrb_value -mrb_time_wrap(mrb_state *mrb, struct RClass *tc, struct mrb_time *tm) -{ - return mrb_obj_value(Data_Wrap_Struct(mrb, tc, &mrb_time_type, tm)); -} - - -/* Allocates a mrb_time object and initializes it. */ -static struct mrb_time* -time_alloc(mrb_state *mrb, double sec, double usec, enum mrb_timezone timezone) -{ - struct mrb_time *tm; - - tm = (struct mrb_time *)mrb_malloc(mrb, sizeof(struct mrb_time)); - tm->sec = (time_t)sec; - tm->usec = (sec - tm->sec) * 1.0e6 + usec; - while (tm->usec < 0) { - tm->sec--; - tm->usec += 1.0e6; - } - while (tm->usec > 1.0e6) { - tm->sec++; - tm->usec -= 1.0e6; - } - tm->timezone = timezone; - mrb_time_update_datetime(tm); - - return tm; -} - -static mrb_value -mrb_time_make(mrb_state *mrb, struct RClass *c, double sec, double usec, enum mrb_timezone timezone) -{ - return mrb_time_wrap(mrb, c, time_alloc(mrb, sec, usec, timezone)); -} - -static struct mrb_time* -current_mrb_time(mrb_state *mrb) -{ - struct mrb_time *tm; - - tm = (struct mrb_time *)mrb_malloc(mrb, sizeof(*tm)); -#ifdef NO_GETTIMEOFDAY - { - static time_t last_sec = 0, last_usec = 0; - - tm->sec = time(NULL); - if (tm->sec != last_sec) { - last_sec = tm->sec; - last_usec = 0; - } - else { - /* add 1 usec to differentiate two times */ - last_usec += 1; - } - tm->usec = last_usec; - } -#else - { - struct timeval tv; - - gettimeofday(&tv, NULL); - tm->sec = tv.tv_sec; - tm->usec = tv.tv_usec; - } -#endif - tm->timezone = MRB_TIMEZONE_LOCAL; - mrb_time_update_datetime(tm); - - return tm; -} - -/* Allocates a new Time object with given millis value. */ -static mrb_value -mrb_time_now(mrb_state *mrb, mrb_value self) -{ - return mrb_time_wrap(mrb, mrb_class_ptr(self), current_mrb_time(mrb)); -} - -/* 15.2.19.6.1 */ -/* Creates an instance of time at the given time in seconds, etc. */ -static mrb_value -mrb_time_at(mrb_state *mrb, mrb_value self) -{ - mrb_float f, f2 = 0; - - mrb_get_args(mrb, "f|f", &f, &f2); - return mrb_time_make(mrb, mrb_class_ptr(self), f, f2, MRB_TIMEZONE_LOCAL); -} - -static struct mrb_time* -time_mktime(mrb_state *mrb, mrb_int ayear, mrb_int amonth, mrb_int aday, - mrb_int ahour, mrb_int amin, mrb_int asec, mrb_int ausec, - enum mrb_timezone timezone) -{ - time_t nowsecs; - struct tm nowtime = { 0 }; - - nowtime.tm_year = (int)ayear - 1900; - nowtime.tm_mon = (int)amonth - 1; - nowtime.tm_mday = (int)aday; - nowtime.tm_hour = (int)ahour; - nowtime.tm_min = (int)amin; - nowtime.tm_sec = (int)asec; - nowtime.tm_isdst = -1; - if (timezone == MRB_TIMEZONE_UTC) { - nowsecs = timegm(&nowtime); - } - else { - nowsecs = mktime(&nowtime); - } - if (nowsecs < 0) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "Not a valid time."); - } - - return time_alloc(mrb, nowsecs, ausec, timezone); -} - -/* 15.2.19.6.2 */ -/* Creates an instance of time at the given time in UTC. */ -static mrb_value -mrb_time_gm(mrb_state *mrb, mrb_value self) -{ - mrb_int ayear = 0, amonth = 1, aday = 1, ahour = 0, amin = 0, asec = 0, ausec = 0; - - mrb_get_args(mrb, "i|iiiiii", - &ayear, &amonth, &aday, &ahour, &amin, &asec, &ausec); - return mrb_time_wrap(mrb, mrb_class_ptr(self), - time_mktime(mrb, ayear, amonth, aday, ahour, amin, asec, ausec, MRB_TIMEZONE_UTC)); -} - - -/* 15.2.19.6.3 */ -/* Creates an instance of time at the given time in local time zone. */ -static mrb_value -mrb_time_local(mrb_state *mrb, mrb_value self) -{ - mrb_int ayear = 0, amonth = 1, aday = 1, ahour = 0, amin = 0, asec = 0, ausec = 0; - - mrb_get_args(mrb, "i|iiiiii", - &ayear, &amonth, &aday, &ahour, &amin, &asec, &ausec); - return mrb_time_wrap(mrb, mrb_class_ptr(self), - time_mktime(mrb, ayear, amonth, aday, ahour, amin, asec, ausec, MRB_TIMEZONE_LOCAL)); -} - - -static mrb_value -mrb_time_eq(mrb_state *mrb, mrb_value self) -{ - mrb_value other; - struct mrb_time *tm1, *tm2; - mrb_bool eq_p; - - mrb_get_args(mrb, "o", &other); - tm1 = DATA_CHECK_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - tm2 = DATA_CHECK_GET_PTR(mrb, other, &mrb_time_type, struct mrb_time); - eq_p = tm1 && tm2 && tm1->sec == tm2->sec && tm1->usec == tm2->usec; - - return mrb_bool_value(eq_p); -} - -static mrb_value -mrb_time_cmp(mrb_state *mrb, mrb_value self) -{ - mrb_value other; - struct mrb_time *tm1, *tm2; - - mrb_get_args(mrb, "o", &other); - tm1 = DATA_CHECK_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - tm2 = DATA_CHECK_GET_PTR(mrb, other, &mrb_time_type, struct mrb_time); - if (!tm1 || !tm2) return mrb_nil_value(); - if (tm1->sec > tm2->sec) { - return mrb_fixnum_value(1); - } - else if (tm1->sec < tm2->sec) { - return mrb_fixnum_value(-1); - } - /* tm1->sec == tm2->sec */ - if (tm1->usec > tm2->usec) { - return mrb_fixnum_value(1); - } - else if (tm1->usec < tm2->usec) { - return mrb_fixnum_value(-1); - } - return mrb_fixnum_value(0); -} - -static mrb_value -mrb_time_plus(mrb_state *mrb, mrb_value self) -{ - mrb_float f; - struct mrb_time *tm; - - mrb_get_args(mrb, "f", &f); - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - return mrb_time_make(mrb, mrb_obj_class(mrb, self), (double)tm->sec+f, tm->usec, tm->timezone); -} - -static mrb_value -mrb_time_minus(mrb_state *mrb, mrb_value self) -{ - mrb_float f; - mrb_value other; - struct mrb_time *tm, *tm2; - - mrb_get_args(mrb, "o", &other); - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - - tm2 = DATA_CHECK_GET_PTR(mrb, other, &mrb_time_type, struct mrb_time); - if (tm2) { - f = (mrb_float)(tm->sec - tm2->sec) - + (mrb_float)(tm->usec - tm2->usec) / 1.0e6; - return mrb_float_value(mrb, f); - } - else { - mrb_get_args(mrb, "f", &f); - return mrb_time_make(mrb, mrb_obj_class(mrb, self), (double)tm->sec-f, tm->usec, tm->timezone); - } -} - -/* 15.2.19.7.30 */ -/* Returns week day number of time. */ -static mrb_value -mrb_time_wday(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - return mrb_fixnum_value(tm->datetime.tm_wday); -} - -/* 15.2.19.7.31 */ -/* Returns year day number of time. */ -static mrb_value -mrb_time_yday(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - return mrb_fixnum_value(tm->datetime.tm_yday + 1); -} - -/* 15.2.19.7.32 */ -/* Returns year of time. */ -static mrb_value -mrb_time_year(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - return mrb_fixnum_value(tm->datetime.tm_year + 1900); -} - -/* 15.2.19.7.33 */ -/* Returns name of time's timezone. */ -static mrb_value -mrb_time_zone(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - if (tm->timezone <= MRB_TIMEZONE_NONE) return mrb_nil_value(); - if (tm->timezone >= MRB_TIMEZONE_LAST) return mrb_nil_value(); - return mrb_str_new_cstr(mrb, timezone_names[tm->timezone]); -} - -/* 15.2.19.7.4 */ -/* Returns a string that describes the time. */ -static mrb_value -mrb_time_asctime(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm; - struct tm *d; - char buf[256]; - int len; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - d = &tm->datetime; - len = snprintf(buf, sizeof(buf), "%s %s %02d %02d:%02d:%02d %s%d", - wday_names[d->tm_wday], mon_names[d->tm_mon], d->tm_mday, - d->tm_hour, d->tm_min, d->tm_sec, - tm->timezone == MRB_TIMEZONE_UTC ? "UTC " : "", - d->tm_year + 1900); - return mrb_str_new(mrb, buf, len); -} - -/* 15.2.19.7.6 */ -/* Returns the day in the month of the time. */ -static mrb_value -mrb_time_day(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - if (!tm) return mrb_nil_value(); - return mrb_fixnum_value(tm->datetime.tm_mday); -} - - -/* 15.2.19.7.7 */ -/* Returns true if daylight saving was applied for this time. */ -static mrb_value -mrb_time_dst_p(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - return mrb_bool_value(tm->datetime.tm_isdst); -} - -/* 15.2.19.7.8 */ -/* 15.2.19.7.10 */ -/* Returns the Time object of the UTC(GMT) timezone. */ -static mrb_value -mrb_time_getutc(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm, *tm2; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - tm2 = (struct mrb_time *)mrb_malloc(mrb, sizeof(*tm)); - *tm2 = *tm; - tm2->timezone = MRB_TIMEZONE_UTC; - mrb_time_update_datetime(tm2); - return mrb_time_wrap(mrb, mrb_obj_class(mrb, self), tm2); -} - -/* 15.2.19.7.9 */ -/* Returns the Time object of the LOCAL timezone. */ -static mrb_value -mrb_time_getlocal(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm, *tm2; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - tm2 = (struct mrb_time *)mrb_malloc(mrb, sizeof(*tm)); - *tm2 = *tm; - tm2->timezone = MRB_TIMEZONE_LOCAL; - mrb_time_update_datetime(tm2); - return mrb_time_wrap(mrb, mrb_obj_class(mrb, self), tm2); -} - -/* 15.2.19.7.15 */ -/* Returns hour of time. */ -static mrb_value -mrb_time_hour(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - return mrb_fixnum_value(tm->datetime.tm_hour); -} - -/* 15.2.19.7.16 */ -/* Initializes a time by setting the amount of milliseconds since the epoch.*/ -static mrb_value -mrb_time_initialize(mrb_state *mrb, mrb_value self) -{ - mrb_int ayear = 0, amonth = 1, aday = 1, ahour = 0, - amin = 0, asec = 0, ausec = 0; - int n; - struct mrb_time *tm; - - tm = (struct mrb_time*)DATA_PTR(self); - if (tm) { - mrb_free(mrb, tm); - } - DATA_TYPE(self) = &mrb_time_type; - DATA_PTR(self) = NULL; - - n = mrb_get_args(mrb, "|iiiiiii", - &ayear, &amonth, &aday, &ahour, &amin, &asec, &ausec); - if (n == 0) { - tm = current_mrb_time(mrb); - } - else { - tm = time_mktime(mrb, ayear, amonth, aday, ahour, amin, asec, ausec, MRB_TIMEZONE_LOCAL); - } - DATA_PTR(self) = tm; - return self; -} - -/* 15.2.19.7.17(x) */ -/* Initializes a copy of this time object. */ -static mrb_value -mrb_time_initialize_copy(mrb_state *mrb, mrb_value copy) -{ - mrb_value src; - - 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"); - } - if (!DATA_PTR(copy)) { - DATA_PTR(copy) = mrb_malloc(mrb, sizeof(struct mrb_time)); - DATA_TYPE(copy) = &mrb_time_type; - } - *(struct mrb_time *)DATA_PTR(copy) = *(struct mrb_time *)DATA_PTR(src); - return copy; -} - -/* 15.2.19.7.18 */ -/* Sets the timezone attribute of the Time object to LOCAL. */ -static mrb_value -mrb_time_localtime(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - tm->timezone = MRB_TIMEZONE_LOCAL; - mrb_time_update_datetime(tm); - return self; -} - -/* 15.2.19.7.19 */ -/* Returns day of month of time. */ -static mrb_value -mrb_time_mday(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - return mrb_fixnum_value(tm->datetime.tm_mday); -} - -/* 15.2.19.7.20 */ -/* Returns minutes of time. */ -static mrb_value -mrb_time_min(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - return mrb_fixnum_value(tm->datetime.tm_min); -} - -/* 15.2.19.7.21 and 15.2.19.7.22 */ -/* Returns month of time. */ -static mrb_value -mrb_time_mon(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - return mrb_fixnum_value(tm->datetime.tm_mon + 1); -} - -/* 15.2.19.7.23 */ -/* Returns seconds in minute of time. */ -static mrb_value -mrb_time_sec(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - return mrb_fixnum_value(tm->datetime.tm_sec); -} - - -/* 15.2.19.7.24 */ -/* Returns a Float with the time since the epoch in seconds. */ -static mrb_value -mrb_time_to_f(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - return mrb_float_value(mrb, (mrb_float)tm->sec + (mrb_float)tm->usec/1.0e6); -} - -/* 15.2.19.7.25 */ -/* Returns a Fixnum with the time since the epoch in seconds. */ -static mrb_value -mrb_time_to_i(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - return mrb_fixnum_value(tm->sec); -} - -/* 15.2.19.7.26 */ -/* Returns a Float with the time since the epoch in microseconds. */ -static mrb_value -mrb_time_usec(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - return mrb_fixnum_value(tm->usec); -} - -/* 15.2.19.7.27 */ -/* Sets the timezone attribute of the Time object to UTC. */ -static mrb_value -mrb_time_utc(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - tm->timezone = MRB_TIMEZONE_UTC; - mrb_time_update_datetime(tm); - return self; -} - -/* 15.2.19.7.28 */ -/* Returns true if this time is in the UTC timezone false if not. */ -static mrb_value -mrb_time_utc_p(mrb_state *mrb, mrb_value self) -{ - struct mrb_time *tm; - - tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); - return mrb_bool_value(tm->timezone == MRB_TIMEZONE_UTC); -} - - -void -mrb_mruby_time_gem_init(mrb_state* mrb) -{ - struct RClass *tc; - /* ISO 15.2.19.2 */ - tc = mrb_define_class(mrb, "Time", mrb->object_class); - MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); - mrb_include_module(mrb, tc, mrb_class_get(mrb, "Comparable")); - mrb_define_class_method(mrb, tc, "at", mrb_time_at, MRB_ARGS_ANY()); /* 15.2.19.6.1 */ - mrb_define_class_method(mrb, tc, "gm", mrb_time_gm, MRB_ARGS_ARG(1,6)); /* 15.2.19.6.2 */ - mrb_define_class_method(mrb, tc, "local", mrb_time_local, MRB_ARGS_ARG(1,6)); /* 15.2.19.6.3 */ - mrb_define_class_method(mrb, tc, "mktime", mrb_time_local, MRB_ARGS_ARG(1,6));/* 15.2.19.6.4 */ - mrb_define_class_method(mrb, tc, "now", mrb_time_now, MRB_ARGS_NONE()); /* 15.2.19.6.5 */ - mrb_define_class_method(mrb, tc, "utc", mrb_time_gm, MRB_ARGS_ARG(1,6)); /* 15.2.19.6.6 */ - - mrb_define_method(mrb, tc, "==" , mrb_time_eq , MRB_ARGS_REQ(1)); - mrb_define_method(mrb, tc, "<=>" , mrb_time_cmp , MRB_ARGS_REQ(1)); /* 15.2.19.7.1 */ - mrb_define_method(mrb, tc, "+" , mrb_time_plus , MRB_ARGS_REQ(1)); /* 15.2.19.7.2 */ - mrb_define_method(mrb, tc, "-" , mrb_time_minus , MRB_ARGS_REQ(1)); /* 15.2.19.7.3 */ - mrb_define_method(mrb, tc, "to_s" , mrb_time_asctime, MRB_ARGS_NONE()); - mrb_define_method(mrb, tc, "inspect", mrb_time_asctime, MRB_ARGS_NONE()); - mrb_define_method(mrb, tc, "asctime", mrb_time_asctime, MRB_ARGS_NONE()); /* 15.2.19.7.4 */ - mrb_define_method(mrb, tc, "ctime" , mrb_time_asctime, MRB_ARGS_NONE()); /* 15.2.19.7.5 */ - mrb_define_method(mrb, tc, "day" , mrb_time_day , MRB_ARGS_NONE()); /* 15.2.19.7.6 */ - mrb_define_method(mrb, tc, "dst?" , mrb_time_dst_p , MRB_ARGS_NONE()); /* 15.2.19.7.7 */ - mrb_define_method(mrb, tc, "getgm" , mrb_time_getutc , MRB_ARGS_NONE()); /* 15.2.19.7.8 */ - mrb_define_method(mrb, tc, "getlocal",mrb_time_getlocal,MRB_ARGS_NONE()); /* 15.2.19.7.9 */ - mrb_define_method(mrb, tc, "getutc" , mrb_time_getutc , MRB_ARGS_NONE()); /* 15.2.19.7.10 */ - mrb_define_method(mrb, tc, "gmt?" , mrb_time_utc_p , MRB_ARGS_NONE()); /* 15.2.19.7.11 */ - mrb_define_method(mrb, tc, "gmtime" , mrb_time_utc , MRB_ARGS_NONE()); /* 15.2.19.7.13 */ - mrb_define_method(mrb, tc, "hour" , mrb_time_hour, MRB_ARGS_NONE()); /* 15.2.19.7.15 */ - mrb_define_method(mrb, tc, "localtime", mrb_time_localtime, MRB_ARGS_NONE()); /* 15.2.19.7.18 */ - mrb_define_method(mrb, tc, "mday" , mrb_time_mday, MRB_ARGS_NONE()); /* 15.2.19.7.19 */ - mrb_define_method(mrb, tc, "min" , mrb_time_min, MRB_ARGS_NONE()); /* 15.2.19.7.20 */ - - mrb_define_method(mrb, tc, "mon" , mrb_time_mon, MRB_ARGS_NONE()); /* 15.2.19.7.21 */ - mrb_define_method(mrb, tc, "month", mrb_time_mon, MRB_ARGS_NONE()); /* 15.2.19.7.22 */ - - mrb_define_method(mrb, tc, "sec" , mrb_time_sec, MRB_ARGS_NONE()); /* 15.2.19.7.23 */ - mrb_define_method(mrb, tc, "to_i", mrb_time_to_i, MRB_ARGS_NONE()); /* 15.2.19.7.25 */ - mrb_define_method(mrb, tc, "to_f", mrb_time_to_f, MRB_ARGS_NONE()); /* 15.2.19.7.24 */ - mrb_define_method(mrb, tc, "usec", mrb_time_usec, MRB_ARGS_NONE()); /* 15.2.19.7.26 */ - mrb_define_method(mrb, tc, "utc" , mrb_time_utc, MRB_ARGS_NONE()); /* 15.2.19.7.27 */ - mrb_define_method(mrb, tc, "utc?", mrb_time_utc_p,MRB_ARGS_NONE()); /* 15.2.19.7.28 */ - mrb_define_method(mrb, tc, "wday", mrb_time_wday, MRB_ARGS_NONE()); /* 15.2.19.7.30 */ - mrb_define_method(mrb, tc, "yday", mrb_time_yday, MRB_ARGS_NONE()); /* 15.2.19.7.31 */ - mrb_define_method(mrb, tc, "year", mrb_time_year, MRB_ARGS_NONE()); /* 15.2.19.7.32 */ - mrb_define_method(mrb, tc, "zone", mrb_time_zone, MRB_ARGS_NONE()); /* 15.2.19.7.33 */ - - mrb_define_method(mrb, tc, "initialize", mrb_time_initialize, MRB_ARGS_REQ(1)); /* 15.2.19.7.16 */ - mrb_define_method(mrb, tc, "initialize_copy", mrb_time_initialize_copy, MRB_ARGS_REQ(1)); /* 15.2.19.7.17 */ - - /* - methods not available: - gmt_offset(15.2.19.7.12) - gmtoff(15.2.19.7.14) - utc_offset(15.2.19.7.29) - */ -} - -void -mrb_mruby_time_gem_final(mrb_state* mrb) -{ -} Deleted: vendor/mruby-eeac4be/mrbgems/mruby-time/test/time.rb (+0 -201) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-time/test/time.rb 2014-06-08 19:01:14 +0900 (f92459d) +++ /dev/null @@ -1,201 +0,0 @@ -## -# Time ISO Test - -if Object.const_defined?(:Time) - assert('Time.new', '15.2.3.3.3') do - Time.new.class == Time - end - - assert('Time', '15.2.19') do - Time.class == Class - end - - assert('Time superclass', '15.2.19.2') do - Time.superclass == Object - end - - assert('Time.at', '15.2.19.6.1') do - Time.at(1300000000.0) - end - - assert('Time.gm', '15.2.19.6.2') do - Time.gm(2012, 12, 23) - end - - assert('Time.local', '15.2.19.6.3') do - Time.local(2012, 12, 23) - end - - assert('Time.mktime', '15.2.19.6.4') do - Time.mktime(2012, 12, 23) - end - - assert('Time.now', '15.2.19.6.5') do - Time.now.class == Time - end - - assert('Time.utc', '15.2.19.6.6') do - Time.utc(2012, 12, 23) - end - - assert('Time#+', '15.2.19.7.1') do - t1 = Time.at(1300000000.0) - t2 = t1.+(60) - - t2.utc.asctime == "Sun Mar 13 07:07:40 UTC 2011" - end - - assert('Time#-', '15.2.19.7.2') do - t1 = Time.at(1300000000.0) - t2 = t1.-(60) - - t2.utc.asctime == "Sun Mar 13 07:05:40 UTC 2011" - end - - assert('Time#<=>', '15.2.19.7.3') do - t1 = Time.at(1300000000.0) - t2 = Time.at(1400000000.0) - t3 = Time.at(1500000000.0) - - t2.<=>(t1) == 1 and - t2.<=>(t2) == 0 and - t2.<=>(t3) == -1 and - t2.<=>(nil) == nil - end - - assert('Time#asctime', '15.2.19.7.4') do - Time.at(1300000000.0).utc.asctime == "Sun Mar 13 07:06:40 UTC 2011" - end - - assert('Time#ctime', '15.2.19.7.5') do - Time.at(1300000000.0).utc.ctime == "Sun Mar 13 07:06:40 UTC 2011" - end - - assert('Time#day', '15.2.19.7.6') do - Time.gm(2012, 12, 23).day == 23 - end - - assert('Time#dst?', '15.2.19.7.7') do - not Time.gm(2012, 12, 23).utc.dst? - end - - assert('Time#getgm', '15.2.19.7.8') do - Time.at(1300000000.0).getgm.asctime == "Sun Mar 13 07:06:40 UTC 2011" - end - - assert('Time#getlocal', '15.2.19.7.9') do - t1 = Time.at(1300000000.0) - t2 = Time.at(1300000000.0) - t3 = t1.getlocal - - t1 == t3 and t3 == t2.getlocal - end - - assert('Time#getutc', '15.2.19.7.10') do - Time.at(1300000000.0).getutc.asctime == "Sun Mar 13 07:06:40 UTC 2011" - end - - assert('Time#gmt?', '15.2.19.7.11') do - Time.at(1300000000.0).utc.gmt? - end - - # ATM not implemented - # assert('Time#gmt_offset', '15.2.19.7.12') do - - assert('Time#gmtime', '15.2.19.7.13') do - Time.at(1300000000.0).gmtime - end - - # ATM not implemented - # assert('Time#gmtoff', '15.2.19.7.14') do - - assert('Time#hour', '15.2.19.7.15') do - Time.gm(2012, 12, 23, 7, 6).hour == 7 - end - - # ATM doesn't really work - # assert('Time#initialize', '15.2.19.7.16') do - - assert('Time#initialize_copy', '15.2.19.7.17') do - time_tmp_2 = Time.at(7.0e6) - time_tmp_2.clone == time_tmp_2 - end - - assert('Time#localtime', '15.2.19.7.18') do - t1 = Time.at(1300000000.0) - t2 = Time.at(1300000000.0) - - t1.localtime - t1 == t2.getlocal - end - - assert('Time#mday', '15.2.19.7.19') do - Time.gm(2012, 12, 23).mday == 23 - end - - assert('Time#min', '15.2.19.7.20') do - Time.gm(2012, 12, 23, 7, 6).min == 6 - end - - assert('Time#mon', '15.2.19.7.21') do - Time.gm(2012, 12, 23).mon == 12 - end - - assert('Time#month', '15.2.19.7.22') do - Time.gm(2012, 12, 23).month == 12 - end - - assert('Times#sec', '15.2.19.7.23') do - Time.gm(2012, 12, 23, 7, 6, 40).sec == 40 - end - - assert('Time#to_f', '15.2.19.7.24') do - Time.at(1300000000.0).to_f == 1300000000.0 - end - - assert('Time#to_i', '15.2.19.7.25') do - Time.at(1300000000.0).to_i == 1300000000 - end - - assert('Time#usec', '15.2.19.7.26') do - Time.at(1300000000.0).usec == 0 - end - - assert('Time#utc', '15.2.19.7.27') do - Time.at(1300000000.0).utc - end - - assert('Time#utc?', '15.2.19.7.28') do - Time.at(1300000000.0).utc.utc? - end - - # ATM not implemented - # assert('Time#utc_offset', '15.2.19.7.29') do - - assert('Time#wday', '15.2.19.7.30') do - Time.gm(2012, 12, 23).wday == 0 - end - - assert('Time#yday', '15.2.19.7.31') do - Time.gm(2012, 12, 23).yday == 358 - end - - assert('Time#year', '15.2.19.7.32') do - Time.gm(2012, 12, 23).year == 2012 - end - - assert('Time#zone', '15.2.19.7.33') do - Time.at(1300000000.0).utc.zone == 'UTC' - end - - # Not ISO specified - - assert('Time#to_s') do - Time.at(1300000000.0).utc.to_s == "Sun Mar 13 07:06:40 UTC 2011" - end - - assert('Time#inspect') do - Time.at(1300000000.0).utc.inspect == "Sun Mar 13 07:06:40 UTC 2011" - end -end - Deleted: vendor/mruby-eeac4be/mrbgems/mruby-toplevel-ext/mrbgem.rake (+0 -4) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-toplevel-ext/mrbgem.rake 2014-06-08 19:01:14 +0900 (78eb73a) +++ /dev/null @@ -1,4 +0,0 @@ -MRuby::Gem::Specification.new('mruby-toplevel-ext') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb (+0 -11) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb 2014-06-08 19:01:14 +0900 (7745623) +++ /dev/null @@ -1,11 +0,0 @@ - -def self.include (*modules) - self.class.include(*modules) -end - -def self.private(*methods) -end -def self.protected(*methods) -end -def self.public(*methods) -end Deleted: vendor/mruby-eeac4be/mrbgems/mruby-toplevel-ext/test/toplevel.rb (+0 -24) 100644 =================================================================== --- vendor/mruby-eeac4be/mrbgems/mruby-toplevel-ext/test/toplevel.rb 2014-06-08 19:01:14 +0900 (9630fe3) +++ /dev/null @@ -1,24 +0,0 @@ -## -# Toplevel Self(Ext) Test - -assert('Toplevel#include') do - module ToplevelTestModule1 - def method_foo - :foo - end - - CONST_BAR = :bar - end - - module ToplevelTestModule2 - CONST_BAR = :bar2 - end - - self.include ToplevelTestModule2, ToplevelTestModule1 - - assert_true self.class.included_modules.include?( ToplevelTestModule1 ) - assert_true self.class.included_modules.include?( ToplevelTestModule2 ) - assert_equal :foo, method_foo - assert_equal :bar2, CONST_BAR -end - Deleted: vendor/mruby-eeac4be/mrblib/array.rb (+0 -111) 100644 =================================================================== --- vendor/mruby-eeac4be/mrblib/array.rb 2014-06-08 19:01:14 +0900 (82df909) +++ /dev/null @@ -1,111 +0,0 @@ -## -# Array -# -# ISO 15.2.12 -class Array - - ## - # Calls the given block for each element of +self+ - # and pass the respective element. - # - # ISO 15.2.12.5.10 - def each(&block) - idx, length = -1, self.length-1 - while idx < length and length <= self.length and length = self.length-1 - elm = self[idx += 1] - unless elm - if elm == nil and length >= self.length - break - end - end - block.call(elm) - end - self - end - - ## - # Calls the given block for each element of +self+ - # and pass the index of the respective element. - # - # ISO 15.2.12.5.11 - def each_index(&block) - idx = 0 - while(idx < length) - block.call(idx) - idx += 1 - end - self - end - - ## - # Calls the given block for each element of +self+ - # and pass the respective element. Each element will - # be replaced by the resulting values. - # - # ISO 15.2.12.5.7 - def collect!(&block) - self.each_index{|idx| - self[idx] = block.call(self[idx]) - } - self - end - - ## - # Alias for collect! - # - # ISO 15.2.12.5.20 - alias map! collect! - - ## - # Private method for Array creation. - # - # ISO 15.2.12.5.15 - def initialize(size=0, obj=nil, &block) - raise TypeError, "expected Integer for 1st argument" unless size.kind_of? Integer - raise ArgumentError, "negative array size" if size < 0 - - self.clear - if size > 0 - self[size - 1] = nil # allocate - - idx = 0 - while(idx < size) - self[idx] = (block)? block.call(idx): obj - idx += 1 - end - end - - self - end - - ## - # Delete element with index +key+ - def delete(key, &block) - while i = self.index(key) - self.delete_at(i) - ret = key - end - if ret == nil && block - block.call - else - ret - end - end -end - -## -# Array is enumerable and comparable -module Enumerable; end -module Comparable; end -class Array - # ISO 15.2.12.3 - include Enumerable - include Comparable - - ## - # Sort all elements and replace +self+ with these - # elements. - def sort!(&block) - self.replace(self.sort(&block)) - end -end Deleted: vendor/mruby-eeac4be/mrblib/class.rb (+0 -32) 100644 =================================================================== --- vendor/mruby-eeac4be/mrblib/class.rb 2014-06-08 19:01:14 +0900 (ebfb1f7) +++ /dev/null @@ -1,32 +0,0 @@ -class Module - # 15.2.2.4.13 - def attr_reader(*names) - names.each do |name| - name = name.to_s - raise(NameError, "#{name.inspect} is not allowed as an instance variable name") if name.include?('@') || name.include?('?') || name.include?('$') - - attr_name = '@'+name - define_method(name){self.instance_variable_get(attr_name)} - end - end - # 15.2.2.4.14 - def attr_writer(*names) - names.each do |name| - name = name.to_s - raise(NameError, "#{name.inspect} is not allowed as an instance variable name") if name.include?('@') || name.include?('?') || name.include?('$') - - attr_name = '@'+name - name = (name+"=").intern - define_method(name){|v|self.instance_variable_set(attr_name,v)} - end - end - # 15.2.2.4.12 - def attr_accessor(*names) - attr_reader(*names) - attr_writer(*names) - end - # 15.2.2.4.11 - def attr(name) - attr_reader(name) - end -end Deleted: vendor/mruby-eeac4be/mrblib/compar.rb (+0 -104) 100644 =================================================================== --- vendor/mruby-eeac4be/mrblib/compar.rb 2014-06-08 19:01:14 +0900 (40fb2e7) +++ /dev/null @@ -1,104 +0,0 @@ -## -# Comparable -# -# ISO 15.3.3 -module Comparable - - ## - # Return true if +self+ is less - # than +other+. Otherwise return - # false. - # - # ISO 15.3.3.2.1 - def < other - cmp = self <=> other - if cmp.nil? - false - elsif cmp < 0 - true - else - false - end - end - - ## - # Return true if +self+ is less - # than or equal to +other+. - # Otherwise return false. - # - # ISO 15.3.3.2.2 - def <= other - cmp = self <=> other - if cmp.nil? - false - elsif cmp <= 0 - true - else - false - end - end - - ## - # Return true if +self+ is equal - # to +other+. Otherwise return - # false. - # - # ISO 15.3.3.2.3 - def == other - cmp = self <=> other - if cmp == 0 - true - else - false - end - end - - ## - # Return true if +self+ is greater - # than +other+. Otherwise return - # false. - # - # ISO 15.3.3.2.4 - def > other - cmp = self <=> other - if cmp.nil? - false - elsif cmp > 0 - true - else - false - end - end - - ## - # Return true if +self+ is greater - # than or equal to +other+. - # Otherwise return false. - # - # ISO 15.3.3.2.5 - def >= other - cmp = self <=> other - if cmp.nil? - false - elsif cmp >= 0 - true - else - false - end - end - - ## - # Return true if +self+ is greater - # than or equal to +min+ and - # less than or equal to +max+. - # Otherwise return false. - # - # ISO 15.3.3.2.6 - def between?(min, max) - if self < min or self > max - false - else - true - end - end -end Deleted: vendor/mruby-eeac4be/mrblib/enum.rb (+0 -398) 100644 =================================================================== --- vendor/mruby-eeac4be/mrblib/enum.rb 2014-06-08 19:01:14 +0900 (0593e1f) +++ /dev/null @@ -1,398 +0,0 @@ -## -# Enumerable -# -# ISO 15.3.2 -# -# The <code>Enumerable</code> mixin provides collection classes with -# several traversal and searching methods, and with the ability to -# sort. The class must provide a method <code>each</code>, which -# yields successive members of the collection. If -# <code>Enumerable#max</code>, <code>#min</code>, or -# <code>#sort</code> is used, the objects in the collection must also -# implement a meaningful <code><=></code> operator, as these methods -# rely on an ordering between members of the collection. - -module Enumerable - - ## - # Call the given block for each element - # which is yield by +each+. Return false - # if one block value is false. Otherwise - # return true. If no block is given and - # +self+ is false return false. - # - # ISO 15.3.2.2.1 - def all?(&block) - st = true - if block - self.each{|val| - unless block.call(val) - st = false - break - end - } - else - self.each{|val| - unless val - st = false - break - end - } - end - st - end - - ## - # Call the given block for each element - # which is yield by +each+. Return true - # if one block value is true. Otherwise - # return false. If no block is given and - # +self+ is true object return true. - # - # ISO 15.3.2.2.2 - def any?(&block) - st = false - if block - self.each{|val| - if block.call(val) - st = true - break - end - } - else - self.each{|val| - if val - st = true - break - end - } - end - st - end - - ## - # Call the given block for each element - # which is yield by +each+. Append all - # values of each block together and - # return this value. - # - # ISO 15.3.2.2.3 - def collect(&block) - ary = [] - self.each{|val| - ary.push(block.call(val)) - } - ary - end - - ## - # Call the given block for each element - # which is yield by +each+. Return - # +ifnone+ if no block value was true. - # Otherwise return the first block value - # which had was true. - # - # ISO 15.3.2.2.4 - def detect(ifnone=nil, &block) - ret = ifnone - self.each{|val| - if block.call(val) - ret = val - break - end - } - ret - end - - ## - # Call the given block for each element - # which is yield by +each+. Pass an - # index to the block which starts at 0 - # and increase by 1 for each element. - # - # ISO 15.3.2.2.5 - def each_with_index(&block) - i = 0 - self.each{|val| - block.call(val, i) - i += 1 - } - self - end - - ## - # Return an array of all elements which - # are yield by +each+. - # - # ISO 15.3.2.2.6 - def entries - ary = [] - self.each{|val| - ary.push val - } - ary - end - - ## - # Alias for find - # - # ISO 15.3.2.2.7 - alias find detect - - ## - # Call the given block for each element - # which is yield by +each+. Return an array - # which contains all elements whose block - # value was true. - # - # ISO 15.3.2.2.8 - def find_all(&block) - ary = [] - self.each{|val| - ary.push(val) if block.call(val) - } - ary - end - - ## - # Call the given block for each element - # which is yield by +each+ and which return - # value was true when invoking === with - # +pattern+. Return an array with all - # elements or the respective block values. - # - # ISO 15.3.2.2.9 - def grep(pattern, &block) - ary = [] - self.each{|val| - if pattern === val - ary.push((block)? block.call(val): val) - end - } - ary - end - - ## - # Return true if at least one element which - # is yield by +each+ returns a true value - # by invoking == with +obj+. Otherwise return - # false. - # - # ISO 15.3.2.2.10 - def include?(obj) - st = false - self.each{|val| - if val == obj - st = true - break - end - } - st - end - - ## - # Call the given block for each element - # which is yield by +each+. Return value - # is the sum of all block values. Pass - # to each block the current sum and the - # current element. - # - # ISO 15.3.2.2.11 - def inject(*args, &block) - raise ArgumentError, "too many arguments" if args.size > 2 - if Symbol === args[-1] - sym = args[-1] - block = ->(x,y){x.send(sym,y)} - args.pop - end - if args.empty? - flag = true # no initial argument - result = nil - else - flag = false - result = args[0] - end - self.each{|val| - if flag - # push first element as initial - flag = false - result = val - else - result = block.call(result, val) - end - } - result - end - alias reduce inject - - ## - # Alias for collect - # - # ISO 15.3.2.2.12 - alias map collect - - ## - # Return the maximum value of all elements - # yield by +each+. If no block is given <=> - # will be invoked to define this value. If - # a block is given it will be used instead. - # - # ISO 15.3.2.2.13 - def max(&block) - flag = true # 1st element? - result = nil - self.each{|val| - if flag - # 1st element - result = val - flag = false - else - if block - result = val if block.call(val, result) > 0 - else - result = val if (val <=> result) > 0 - end - end - } - result - end - - ## - # Return the minimum value of all elements - # yield by +each+. If no block is given <=> - # will be invoked to define this value. If - # a block is given it will be used instead. - # - # ISO 15.3.2.2.14 - def min(&block) - flag = true # 1st element? - result = nil - self.each{|val| - if flag - # 1st element - result = val - flag = false - else - if block - result = val if block.call(val, result) < 0 - else - result = val if (val <=> result) < 0 - end - end - } - result - end - - ## - # Alias for include? - # - # ISO 15.3.2.2.15 - alias member? include? - - ## - # Call the given block for each element - # which is yield by +each+. Return an - # array which contains two arrays. The - # first array contains all elements - # whose block value was true. The second - # array contains all elements whose - # block value was false. - # - # ISO 15.3.2.2.16 - def partition(&block) - ary_T = [] - ary_F = [] - self.each{|val| - if block.call(val) - ary_T.push(val) - else - ary_F.push(val) - end - } - [ary_T, ary_F] - end - - ## - # Call the given block for each element - # which is yield by +each+. Return an - # array which contains only the elements - # whose block value was false. - # - # ISO 15.3.2.2.17 - def reject(&block) - ary = [] - self.each{|val| - ary.push(val) unless block.call(val) - } - ary - end - - ## - # Alias for find_all. - # - # ISO 15.3.2.2.18 - alias select find_all - - ## - # TODO - # Does this OK? Please test it. - def __sort_sub__(sorted, work, src_ary, head, tail, &block) - if head == tail - sorted[head] = work[head] if src_ary == 1 - return - end - - # on current step, which is a src ary? - if src_ary == 0 - src, dst = sorted, work - else - src, dst = work, sorted - end - - key = src[head] # key value for dividing values - i, j = head, tail # position to store on the dst ary - - (head + 1).upto(tail){|idx| - if ((block)? block.call(src[idx], key): (src[idx] <=> key)) > 0 - # larger than key - dst[j] = src[idx] - j -= 1 - else - dst[i] = src[idx] - i += 1 - end - } - - sorted[i] = key - - # sort each sub-array - src_ary = (src_ary + 1) % 2 # exchange a src ary - __sort_sub__(sorted, work, src_ary, head, i - 1, &block) if i > head - __sort_sub__(sorted, work, src_ary, i + 1, tail, &block) if i < tail - end -# private :__sort_sub__ - - ## - # Return a sorted array of all elements - # which are yield by +each+. If no block - # is given <=> will be invoked on each - # element to define the order. Otherwise - # the given block will be used for - # sorting. - # - # ISO 15.3.2.2.19 - def sort(&block) - ary = [] - self.each{|val| ary.push(val)} - unless ary.empty? - __sort_sub__(ary, ::Array.new(ary.size), 0, 0, ary.size - 1, &block) - end - ary - end - - ## - # Alias for entries. - # - # ISO 15.3.2.2.20 - alias to_a entries -end Deleted: vendor/mruby-eeac4be/mrblib/error.rb (+0 -66) 100644 =================================================================== --- vendor/mruby-eeac4be/mrblib/error.rb 2014-06-08 19:01:14 +0900 (9e5a3da) +++ /dev/null @@ -1,66 +0,0 @@ -## -# Exception -# -# ISO 15.2.22 -class Exception - - ## - # Raise an exception. - # - # ISO 15.2.22.4.1 - def self.exception(*args, &block) - self.new(*args, &block) - end -end - -# ISO 15.2.24 -class ArgumentError < StandardError -end - -# ISO 15.2.25 -class LocalJumpError < StandardError -end - -# ISO 15.2.26 -class RangeError < StandardError -end - -class FloatDomainError < RangeError -end - -# ISO 15.2.26 -class RegexpError < StandardError -end - -# ISO 15.2.29 -class TypeError < StandardError -end - -# ISO 15.2.31 -class NameError < StandardError - attr_accessor :name - - def new(message="NameError", name=nil) - initialize(message, name) - end - - def initialize(message=nil, name=nil) - @name = name - super(message) - end -end - -# ISO 15.2.32 -class NoMethodError < NameError -end - -# ISO 15.2.33 -class IndexError < StandardError -end - -class KeyError < IndexError -end - -class NotImplementedError < ScriptError -end - Deleted: vendor/mruby-eeac4be/mrblib/hash.rb (+0 -193) 100644 =================================================================== --- vendor/mruby-eeac4be/mrblib/hash.rb 2014-06-08 19:01:14 +0900 (f7cdbdc) +++ /dev/null @@ -1,193 +0,0 @@ -## -# Hash -# -# ISO 15.2.13 -class Hash - - ## - # Delete the element with the key +key+. - # Return the value of the element if +key+ - # was found. Return nil if nothing was - # found. If a block is given, call the - # block with the value of the element. - # - # ISO 15.2.13.4.8 - def delete(key, &block) - if block && ! self.has_key?(key) - block.call(key) - else - self.__delete(key) - end - end - - ## - # Calls the given block for each element of +self+ - # and pass the key and value of each element. - # - # call-seq: - # hsh.each {| key, value | block } -> hsh - # hsh.each_pair {| key, value | block } -> hsh - # hsh.each -> an_enumerator - # hsh.each_pair -> an_enumerator - # - # - # If no block is given, an enumerator is returned instead. - # - # h = { "a" => 100, "b" => 200 } - # h.each {|key, value| puts "#{key} is #{value}" } - # - # <em>produces:</em> - # - # a is 100 - # b is 200 - # - # ISO 15.2.13.4.9 - def each(&block) - self.keys.each{|k| block.call([k, self[k]])} - self - end - - ## - # Calls the given block for each element of +self+ - # and pass the key of each element. - # - # call-seq: - # hsh.each_key {| key | block } -> hsh - # hsh.each_key -> an_enumerator - # - # If no block is given, an enumerator is returned instead. - # - # h = { "a" => 100, "b" => 200 } - # h.each_key {|key| puts key } - # - # <em>produces:</em> - # - # a - # b - # - # ISO 15.2.13.4.10 - def each_key(&block) - self.keys.each{|k| block.call(k)} - self - end - - ## - # Calls the given block for each element of +self+ - # and pass the value of each element. - # - # call-seq: - # hsh.each_value {| value | block } -> hsh - # hsh.each_value -> an_enumerator - # - # If no block is given, an enumerator is returned instead. - # - # h = { "a" => 100, "b" => 200 } - # h.each_value {|value| puts value } - # - # <em>produces:</em> - # - # 100 - # 200 - # - # ISO 15.2.13.4.11 - def each_value(&block) - self.keys.each{|k| block.call(self[k])} - self - end - - ## - # Create a direct instance of the class Hash. - # - # ISO 15.2.13.4.16 - def initialize(*args, &block) - self.__init_core(block, *args) - end - - ## - # Return a hash which contains the content of - # +self+ and +other+. If a block is given - # it will be called for each element with - # a duplicate key. The value of the block - # will be the final value of this element. - # - # ISO 15.2.13.4.22 - def merge(other, &block) - h = {} - raise "can't convert argument into Hash" unless other.respond_to?(:to_hash) - other = other.to_hash - self.each_key{|k| h[k] = self[k]} - if block - other.each_key{|k| - h[k] = (self.has_key?(k))? block.call(k, self[k], other[k]): other[k] - } - else - other.each_key{|k| h[k] = other[k]} - end - h - end - - # 1.8/1.9 Hash#reject! returns Hash; ISO says nothing. - def reject!(&b) - keys = [] - self.each_key{|k| - v = self[k] - if b.call(k, v) - keys.push(k) - end - } - return nil if keys.size == 0 - keys.each{|k| - self.delete(k) - } - self - end - - # 1.8/1.9 Hash#reject returns Hash; ISO says nothing. - def reject(&b) - h = {} - self.each_key{|k| - v = self[k] - unless b.call(k, v) - h[k] = v - end - } - h - end - - # 1.9 Hash#select! returns Hash; ISO says nothing. - def select!(&b) - keys = [] - self.each_key{|k| - v = self[k] - unless b.call(k, v) - keys.push(k) - end - } - return nil if keys.size == 0 - keys.each{|k| - self.delete(k) - } - self - end - - # 1.9 Hash#select returns Hash; ISO says nothing. - def select(&b) - h = {} - self.each_key{|k| - v = self[k] - if b.call(k, v) - h[k] = v - end - } - h - end -end - -## -# Hash is enumerable -# -# ISO 15.2.13.3 -module Enumerable; end -class Hash - include Enumerable -end Deleted: vendor/mruby-eeac4be/mrblib/init_mrblib.c (+0 -14) 100644 =================================================================== --- vendor/mruby-eeac4be/mrblib/init_mrblib.c 2014-06-08 19:01:14 +0900 (f65b185) +++ /dev/null @@ -1,14 +0,0 @@ -#include "mruby.h" -#include "mruby/irep.h" -#include "mruby/dump.h" -#include "mruby/string.h" -#include "mruby/proc.h" - -extern const uint8_t mrblib_irep[]; - -void -mrb_init_mrblib(mrb_state *mrb) -{ - mrb_load_irep(mrb, mrblib_irep); -} - Deleted: vendor/mruby-eeac4be/mrblib/kernel.rb (+0 -46) 100644 =================================================================== --- vendor/mruby-eeac4be/mrblib/kernel.rb 2014-06-08 19:01:14 +0900 (8ccf3cf) +++ /dev/null @@ -1,46 +0,0 @@ -## -# Kernel -# -# ISO 15.3.1 -module Kernel - - # 15.3.1.2.1 - def self.`(s) - raise NotImplementedError.new("` not implemented") - end - - # 15.3.1.3.5 - def `(s) - Kernel.`(s) - end - - ## - # Calls the given block repetitively. - # - # ISO 15.3.1.2.8 - def self.loop #(&block) - while(true) - yield - end - end - - # 15.3.1.2.3 - def self.eval(s) - raise NotImplementedError.new("eval not implemented") - end - - # 15.3.1.3.12 - def eval(s) - Kernel.eval(s) - end - - ## - # Alias for +Kernel.loop+. - # - # ISO 15.3.1.3.29 - def loop #(&block) - while(true) - yield - end - end -end Deleted: vendor/mruby-eeac4be/mrblib/mrblib.rake (+0 -18) 100644 =================================================================== --- vendor/mruby-eeac4be/mrblib/mrblib.rake 2014-06-08 19:01:14 +0900 (db70842) +++ /dev/null @@ -1,18 +0,0 @@ -MRuby.each_target do - current_dir = File.dirname(__FILE__).relative_path_from(Dir.pwd) - relative_from_root = File.dirname(__FILE__).relative_path_from(MRUBY_ROOT) - current_build_dir = "#{build_dir}/#{relative_from_root}" - - self.libmruby << objfile("#{current_build_dir}/mrblib") - - file objfile("#{current_build_dir}/mrblib") => "#{current_build_dir}/mrblib.c" - file "#{current_build_dir}/mrblib.c" => [mrbcfile] + Dir.glob("#{current_dir}/*.rb").sort do |t| - mrbc_, *rbfiles = t.prerequisites - FileUtils.mkdir_p File.dirname(t.name) - open(t.name, 'w') do |f| - _pp "GEN", "*.rb", "#{t.name.relative_path}" - f.puts File.read("#{current_dir}/init_mrblib.c") - mrbc.run f, rbfiles, 'mrblib_irep' - end - end -end Deleted: vendor/mruby-eeac4be/mrblib/numeric.rb (+0 -101) 100644 =================================================================== --- vendor/mruby-eeac4be/mrblib/numeric.rb 2014-06-08 19:01:14 +0900 (daa35c5) +++ /dev/null @@ -1,101 +0,0 @@ -## -# Integer -# -# ISO 15.2.8 -class Integer - - ## - # Returns the receiver simply. - # - # ISO 15.2.8.3.14 - def ceil - self - end - - ## - # Calls the given block once for each Integer - # from +self+ downto +num+. - # - # ISO 15.2.8.3.15 - def downto(num, &block) - i = self - while(i >= num) - block.call(i) - i -= 1 - end - self - end - - ## - # Returns the receiver simply. - # - # ISO 15.2.8.3.17 - def floor - self - end - - ## - # Calls the given block +self+ times. - # - # ISO 15.2.8.3.22 - def times(&block) - i = 0 - while(i < self) - block.call(i) - i += 1 - end - self - end - - ## - # Returns the receiver simply. - # - # ISO 15.2.8.3.24 - def round - self - end - - ## - # Returns the receiver simply. - # - # ISO 15.2.8.3.26 - def truncate - self - end - - ## - # Calls the given block once for each Integer - # from +self+ upto +num+. - # - # ISO 15.2.8.3.27 - def upto(num, &block) - i = self - while(i <= num) - block.call(i) - i += 1 - end - self - end - - ## - # Calls the given block from +self+ to +num+ - # incremented by +step+ (default 1). - # - def step(num, step=1, &block) - i = if num.kind_of? Float then self.to_f else self end - while(i <= num) - block.call(i) - i += step - end - self - end -end - -## -# Numeric is comparable -# -# ISO 15.2.7.3 -module Comparable; end -class Numeric - include Comparable -end Deleted: vendor/mruby-eeac4be/mrblib/print.rb (+0 -18) 100644 =================================================================== --- vendor/mruby-eeac4be/mrblib/print.rb 2014-06-08 19:01:14 +0900 (1ae3ae8) +++ /dev/null @@ -1,18 +0,0 @@ -## -# Kernel -# -# ISO 15.3.1 -module Kernel - def print(*a) - raise NotImplementedError.new('print not available') - end - def puts(*a) - raise NotImplementedError.new('puts not available') - end - def p(*a) - raise NotImplementedError.new('p not available') - end - def printf(*args) - raise NotImplementedError.new('printf not available') - end -end Deleted: vendor/mruby-eeac4be/mrblib/range.rb (+0 -40) 100644 =================================================================== --- vendor/mruby-eeac4be/mrblib/range.rb 2014-06-08 19:01:14 +0900 (d43e3c2) +++ /dev/null @@ -1,40 +0,0 @@ -## -# Range -# -# ISO 15.2.14 -class Range - - ## - # Calls the given block for each element of +self+ - # and pass the respective element. - # - # ISO 15.2.14.4.4 - def each(&block) - val = self.first - unless val.respond_to? :succ - raise TypeError, "can't iterate" - end - - last = self.last - return self if (val <=> last) > 0 - - while((val <=> last) < 0) - block.call(val) - val = val.succ - end - - if not exclude_end? and (val <=> last) == 0 - block.call(val) - end - self - end -end - -## -# Range is enumerable -# -# ISO 15.2.14.3 -module Enumerable; end -class Range - include Enumerable -end Deleted: vendor/mruby-eeac4be/mrblib/string.rb (+0 -157) 100644 =================================================================== --- vendor/mruby-eeac4be/mrblib/string.rb 2014-06-08 19:01:14 +0900 (49f87be) +++ /dev/null @@ -1,157 +0,0 @@ -## -# String -# -# ISO 15.2.10 -class String - - ## - # Calls the given block for each line - # and pass the respective line. - # - # ISO 15.2.10.5.15 - def each_line(&block) - # expect that str.index accepts an Integer for 1st argument as a byte data - offset = 0 - while(pos = self.index(0x0a, offset)) - block.call(self[offset, pos + 1 - offset]) - offset = pos + 1 - end - block.call(self[offset, self.size - offset]) if self.size > offset - self - end - - ## - # Replace all matches of +pattern+ with +replacement+. - # Call block (if given) for each match and replace - # +pattern+ with the value of the block. Return the - # final value. - # - # ISO 15.2.10.5.18 - def gsub(*args, &block) - if args.size == 2 - split(args[0], -1).join(args[1]) - elsif args.size == 1 && block - split(args[0], -1).join(block.call(args[0])) - else - raise ArgumentError, "wrong number of arguments" - end - end - - ## - # Replace all matches of +pattern+ with +replacement+. - # Call block (if given) for each match and replace - # +pattern+ with the value of the block. Modify - # +self+ with the final value. - # - # ISO 15.2.10.5.19 - def gsub!(*args, &block) - str = self.gsub(*args, &block) - if str != self - self.replace(str) - self - else - nil - end - end - - ## - # Calls the given block for each match of +pattern+ - # If no block is given return an array with all - # matches of +pattern+. - # - # ISO 15.2.10.5.32 - def scan(reg, &block) - ### *** TODO *** ### - unless Object.const_defined?(:Regexp) - raise NotImplementedError, "scan not available (yet)" - end - end - - ## - # Replace only the first match of +pattern+ with - # +replacement+. Call block (if given) for each - # match and replace +pattern+ with the value of the - # block. Return the final value. - # - # ISO 15.2.10.5.36 - def sub(*args, &block) - if args.size == 2 - split(args[0], 2).join(args[1]) - elsif args.size == 1 && block - split(args[0], 2).join(block.call(args[0])) - else - raise ArgumentError, "wrong number of arguments" - end - end - - ## - # Replace only the first match of +pattern+ with - # +replacement+. Call block (if given) for each - # match and replace +pattern+ with the value of the - # block. Modify +self+ with the final value. - # - # ISO 15.2.10.5.37 - def sub!(*args, &block) - str = self.sub(*args, &block) - if str != self - self.replace(str) - self - else - nil - end - end - - ## - # Call the given block for each character of - # +self+. - def each_char(&block) - pos = 0 - while(pos < self.size) - block.call(self[pos]) - pos += 1 - end - self - end - - ## - # Call the given block for each byte of +self+. - def each_byte(&block) - bytes = self.bytes - pos = 0 - while(pos < bytes.size) - block.call(bytes[pos]) - pos += 1 - end - self - end - - ## - # Modify +self+ by replacing the content of +self+ - # at the position +pos+ with +value+. - def []=(pos, value) - b = self[0, pos] - a = self[pos+1..-1] - self.replace([b, value, a].join('')) - end - - ## - # ISO 15.2.10.5.5 - def =~(re) - re =~ self - end - - ## - # ISO 15.2.10.5.27 - def match(re, &block) - re.match(self, &block) - end -end - -## -# String is comparable -# -# ISO 15.2.10.3 -module Comparable; end -class String - include Comparable -end Deleted: vendor/mruby-eeac4be/src/.dirstamp (+0 -0) 100644 =================================================================== --- vendor/mruby-eeac4be/src/.dirstamp 2014-06-08 19:01:14 +0900 (e69de29) +++ /dev/null Deleted: vendor/mruby-eeac4be/src/array.c (+0 -1151) 100644 =================================================================== --- vendor/mruby-eeac4be/src/array.c 2014-06-08 19:01:14 +0900 (526cf49) +++ /dev/null @@ -1,1151 +0,0 @@ -/* -** array.c - Array class -** -** See Copyright Notice in mruby.h -*/ - -#ifndef SIZE_MAX - /* Some versions of VC++ - * has SIZE_MAX in stdint.h - */ -# include <limits.h> -#endif -#include "mruby.h" -#include "mruby/array.h" -#include "mruby/class.h" -#include "mruby/string.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_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_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, size_t size) -{ - size_t i; - - for (i = 0; i < size; i++) { - dst[i] = src[i]; - } -} - -mrb_value -mrb_assoc_new(mrb_state *mrb, mrb_value car, mrb_value cdr) -{ - mrb_value arv[2]; - arv[0] = car; - arv[1] = cdr; - return mrb_ary_new_from_values(mrb, 2, arv); -} - -static void -ary_fill_with_nil(mrb_value *ptr, mrb_int size) -{ - mrb_value nil = mrb_nil_value(); - - while ((int)(size--)) { - *ptr++ = nil; - } -} - -static void -ary_modify(mrb_state *mrb, struct RArray *a) -{ - if (a->flags & MRB_ARY_SHARED) { - 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); - } - a->flags &= ~MRB_ARY_SHARED; - } -} - -static void -ary_make_shared(mrb_state *mrb, struct RArray *a) -{ - if (!(a->flags & MRB_ARY_SHARED)) { - 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; - a->flags |= MRB_ARY_SHARED; - } -} - -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"); - } - - while (capa < len) { - if (capa == 0) { - capa = ARY_DEFAULT_LEN; - } - else { - 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); - - if (!expanded_ptr) { - mrb_raise(mrb, E_RUNTIME_ERROR, "out of memory"); - } - - 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_value -mrb_ary_s_create(mrb_state *mrb, mrb_value self) -{ - mrb_value *vals; - 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; -} - -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); -} - -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; -} - -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; -} - -/* - * call-seq: - * ary <=> other_ary -> -1, 0, +1 or nil - * - * Comparison---Returns an integer (-1, 0, or +1) - * if this array is less than, equal to, or greater than <i>other_ary</i>. - * Each object in each array is compared (using <=>). If any value isn't - * equal, then that inequality is the return value. If all the - * values found are equal, then the return is based on a - * comparison of the array lengths. Thus, two arrays are - * ``equal'' according to <code>Array#<=></code> if and only if they have - * the same length and the value of each element is equal to the - * value of the corresponding element in the other array. - * - * [ "a", "a", "c" ] <=> [ "a", "b", "c" ] #=> -1 - * [ 1, 2, 3, 4, 5, 6 ] <=> [ 1, 2 ] #=> +1 - * - */ -mrb_value -mrb_ary_cmp(mrb_state *mrb, mrb_value ary1) -{ - mrb_value ary2; - struct RArray *a1, *a2; - mrb_value r; - mrb_int i, len; - - mrb_get_args(mrb, "o", &ary2); - if (!mrb_array_p(ary2)) return mrb_nil_value(); - a1 = RARRAY(ary1); a2 = RARRAY(ary2); - if (a1->len == a2->len && a1->ptr == a2->ptr) return mrb_fixnum_value(0); - else { - mrb_sym cmp = mrb_intern2(mrb, "<=>", 3); - - len = RARRAY_LEN(ary1); - if (len > RARRAY_LEN(ary2)) { - len = RARRAY_LEN(ary2); - } - for (i=0; i<len; i++) { - mrb_value v = ary_elt(ary2, i); - r = mrb_funcall_argv(mrb, ary_elt(ary1, i), cmp, 1, &v); - if (mrb_type(r) != MRB_TT_FIXNUM || mrb_fixnum(r) != 0) return r; - } - } - len = a1->len - a2->len; - return mrb_fixnum_value((len == 0)? 0: (len > 0)? 1: -1); -} - -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; -} - -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); -} - -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; -} - -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; -} - -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; -} - -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_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; -} - -void -mrb_ary_push(mrb_state *mrb, mrb_value ary, mrb_value elem) /* mrb_ary_push */ -{ - 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_write_barrier(mrb, (struct RBasic*)a); -} - -mrb_value -mrb_ary_push_m(mrb_state *mrb, mrb_value self) -{ - mrb_value *argv; - int len; - - mrb_get_args(mrb, "*", &argv, &len); - while (len--) { - mrb_ary_push(mrb, self, *argv++); - } - - return self; -} - -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_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 (a->flags & MRB_ARY_SHARED) { - 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 ((int)(--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_value -mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item) -{ - struct RArray *a = mrb_ary_ptr(self); - - if ((a->flags & MRB_ARY_SHARED) - && 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_write_barrier(mrb, (struct RBasic*)a); - - return self; -} - -mrb_value -mrb_ary_unshift_m(mrb_state *mrb, mrb_value self) -{ - struct RArray *a = mrb_ary_ptr(self); - mrb_value *vals; - int len; - - mrb_get_args(mrb, "*", &vals, &len); - if ((a->flags & MRB_ARY_SHARED) - && 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; - mrb_write_barrier(mrb, (struct RBasic*)a); - - return self; -} - -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 <= (int)n) return mrb_nil_value(); - - return a->ptr[n]; -} - -void -mrb_ary_set(mrb_state *mrb, mrb_value ary, mrb_int n, mrb_value val) /* rb_ary_store */ -{ - 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 <= (int)n) { - if (a->aux.capa <= (int)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_write_barrier(mrb, (struct RBasic*)a); -} - -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; - mrb_value *argv; - mrb_int i, argc; - - ary_modify(mrb, a); - /* 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, (int)(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); - } - - a->len = size; - - return ary; -} - -mrb_int -mrb_ary_len(mrb_state *mrb, mrb_value ary) -{ - return RARRAY_LEN(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++; - b->flags |= MRB_ARY_SHARED; - - return mrb_obj_value(b); -} - -mrb_value -mrb_ary_aget(mrb_state *mrb, mrb_value self) -{ - struct RArray *a = mrb_ary_ptr(self); - mrb_int index, len; - mrb_value *argv; - int size; - - mrb_get_args(mrb, "i*", &index, &argv, &size); - switch(size) { - case 0: - return mrb_ary_ref(mrb, self, index); - - case 1: - if (mrb_type(argv[0]) != MRB_TT_FIXNUM) { - mrb_raise(mrb, E_TYPE_ERROR, "expected Fixnum"); - } - if (index < 0) index += a->len; - if (index < 0 || a->len < (int)index) return mrb_nil_value(); - len = mrb_fixnum(argv[0]); - if (len < 0) return mrb_nil_value(); - if (a->len == (int)index) return mrb_ary_new(mrb); - if (len > a->len - index) len = a->len - index; - return ary_subseq(mrb, a, index, len); - - default: - mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); - break; - } - - return mrb_nil_value(); /* dummy to avoid warning : not reach here */ -} - -mrb_value -mrb_ary_aset(mrb_state *mrb, mrb_value self) -{ - mrb_value *argv; - int argc; - - mrb_get_args(mrb, "*", &argv, &argc); - switch(argc) { - case 2: - if (!mrb_fixnum_p(argv[0])) { - /* Should we support Range object for 1st arg ? */ - mrb_raise(mrb, E_TYPE_ERROR, "expected Fixnum for 1st argument"); - } - mrb_ary_set(mrb, self, mrb_fixnum(argv[0]), argv[1]); - return argv[1]; - - case 3: - mrb_ary_splice(mrb, self, mrb_fixnum(argv[0]), mrb_fixnum(argv[1]), argv[2]); - return argv[2]; - - default: - mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); - return mrb_nil_value(); - } -} - -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 <= (int)index) return mrb_nil_value(); - - ary_modify(mrb, a); - val = a->ptr[index]; - - ptr = a->ptr + index; - len = a->len - index; - while ((int)(--len)) { - *ptr = *(ptr+1); - ++ptr; - } - --a->len; - - ary_shrink_capa(mrb, a); - - return val; -} - -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 (a->flags & MRB_ARY_SHARED) { - return ary_subseq(mrb, a, 0, size); - } - return mrb_ary_new_from_values(mrb, size, a->ptr); -} - -mrb_value -mrb_ary_last(mrb_state *mrb, mrb_value self) -{ - struct RArray *a = mrb_ary_ptr(self); - mrb_int size; - mrb_value *vals; - int len; - - mrb_get_args(mrb, "*", &vals, &len); - if (len > 1) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); - } - - if (len == 0) return (a->len > 0)? a->ptr[a->len - 1]: mrb_nil_value(); - - /* len == 1 */ - size = mrb_fixnum(*vals); - if (size < 0) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "negative array size"); - } - if (size > a->len) size = a->len; - if ((a->flags & MRB_ARY_SHARED) || 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); -} - -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(); -} - -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_value -mrb_ary_splat(mrb_state *mrb, mrb_value v) -{ - if (mrb_array_p(v)) { - return v; - } - 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_value -mrb_ary_clear(mrb_state *mrb, mrb_value self) -{ - struct RArray *a = mrb_ary_ptr(self); - - ary_modify(mrb, a); - a->len = 0; - a->aux.capa = 0; - mrb_free(mrb, a->ptr); - a->ptr = 0; - - return self; -} - -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_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_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 -inspect_ary(mrb_state *mrb, mrb_value ary, mrb_value list) -{ - mrb_int i; - mrb_value s, arystr; - char head[] = { '[' }; - char sep[] = { ',', ' ' }; - char tail[] = { ']' }; - - /* check recursive */ - for(i=0; i<RARRAY_LEN(list); i++) { - if (mrb_obj_equal(mrb, ary, RARRAY_PTR(list)[i])) { - return mrb_str_new(mrb, "[...]", 5); - } - } - - mrb_ary_push(mrb, list, ary); - - arystr = mrb_str_buf_new(mrb, 64); - mrb_str_buf_cat(mrb, arystr, head, sizeof(head)); - - for(i=0; i<RARRAY_LEN(ary); i++) { - int ai = mrb_gc_arena_save(mrb); - - if (i > 0) { - mrb_str_buf_cat(mrb, arystr, sep, sizeof(sep)); - } - if (mrb_array_p(RARRAY_PTR(ary)[i])) { - s = inspect_ary(mrb, RARRAY_PTR(ary)[i], list); - } - else { - s = mrb_inspect(mrb, RARRAY_PTR(ary)[i]); - } - mrb_str_buf_cat(mrb, arystr, RSTRING_PTR(s), RSTRING_LEN(s)); - mrb_gc_arena_restore(mrb, ai); - } - - mrb_str_buf_cat(mrb, arystr, tail, sizeof(tail)); - mrb_ary_pop(mrb, list); - - return arystr; -} - -/* 15.2.12.5.31 (x) */ -/* - * call-seq: - * ary.to_s -> string - * ary.inspect -> string - * - * Creates a string representation of +self+. - */ - -static mrb_value -mrb_ary_inspect(mrb_state *mrb, mrb_value ary) -{ - if (RARRAY_LEN(ary) == 0) return mrb_str_new(mrb, "[]", 2); - return inspect_ary(mrb, ary, mrb_ary_new(mrb)); -} - -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_buf_cat(mrb, result, RSTRING_PTR(sep), RSTRING_LEN(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_buf_cat(mrb, result, RSTRING_PTR(val), RSTRING_LEN(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_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); -} - -/* 15.2.12.5.33 (x) */ -/* - * call-seq: - * ary == other_ary -> bool - * - * Equality---Two arrays are equal if they contain the same number - * of elements and if each element is equal to (according to - * Object.==) the corresponding element in the other array. - * - * [ "a", "c" ] == [ "a", "c", 7 ] #=> false - * [ "a", "c", 7 ] == [ "a", "c", 7 ] #=> true - * [ "a", "c", 7 ] == [ "a", "d", "f" ] #=> false - * - */ - -static mrb_value -mrb_ary_equal(mrb_state *mrb, mrb_value ary1) -{ - mrb_value ary2; - mrb_int i; - - mrb_get_args(mrb, "o", &ary2); - if (mrb_obj_equal(mrb, ary1, ary2)) return mrb_true_value(); - if (mrb_special_const_p(ary2)) return mrb_false_value(); - if (!mrb_array_p(ary2)) { - if (!mrb_respond_to(mrb, ary2, mrb_intern2(mrb, "to_ary", 6))) { - return mrb_false_value(); - } - else { - return mrb_bool_value(mrb_equal(mrb, ary2, ary1)); - } - } - if (RARRAY_LEN(ary1) != RARRAY_LEN(ary2)) return mrb_false_value(); - for (i=0; i<RARRAY_LEN(ary1); i++) { - if (!mrb_equal(mrb, ary_elt(ary1, i), ary_elt(ary2, i))) { - return mrb_false_value(); - } - } - return mrb_true_value(); -} - -/* 15.2.12.5.34 (x) */ -/* - * call-seq: - * ary.eql?(other) -> true or false - * - * Returns <code>true</code> if +self+ and _other_ are the same object, - * or are both arrays with the same content. - */ - -static mrb_value -mrb_ary_eql(mrb_state *mrb, mrb_value ary1) -{ - mrb_value ary2; - mrb_int i; - - mrb_get_args(mrb, "o", &ary2); - if (mrb_obj_equal(mrb, ary1, ary2)) return mrb_true_value(); - if (!mrb_array_p(ary2)) return mrb_false_value(); - if (RARRAY_LEN(ary1) != RARRAY_LEN(ary2)) return mrb_false_value(); - for (i=0; i<RARRAY_LEN(ary1); i++) { - if (!mrb_eql(mrb, ary_elt(ary1, i), ary_elt(ary2, i))) { - return mrb_false_value(); - } - } - return mrb_true_value(); -} - -void -mrb_init_array(mrb_state *mrb) -{ - struct RClass *a; - - a = mrb->array_class = mrb_define_class(mrb, "Array", mrb->object_class); - MRB_SET_INSTANCE_TT(a, MRB_TT_ARRAY); - mrb_include_module(mrb, a, mrb_class_get(mrb, "Enumerable")); - - 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_times, MRB_ARGS_REQ(1)); /* 15.2.12.5.1 */ - mrb_define_method(mrb, a, "+", mrb_ary_plus, 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, "inspect", mrb_ary_inspect, MRB_ARGS_NONE()); /* 15.2.12.5.31 (x) */ - mrb_define_alias(mrb, a, "to_s", "inspect"); /* 15.2.12.5.32 (x) */ - mrb_define_method(mrb, a, "==", mrb_ary_equal, MRB_ARGS_REQ(1)); /* 15.2.12.5.33 (x) */ - mrb_define_method(mrb, a, "eql?", mrb_ary_eql, MRB_ARGS_REQ(1)); /* 15.2.12.5.34 (x) */ - mrb_define_method(mrb, a, "<=>", mrb_ary_cmp, MRB_ARGS_REQ(1)); /* 15.2.12.5.36 (x) */ -} Deleted: vendor/mruby-eeac4be/src/backtrace.c (+0 -143) 100644 =================================================================== --- vendor/mruby-eeac4be/src/backtrace.c 2014-06-08 19:01:14 +0900 (4ad792a) +++ /dev/null @@ -1,143 +0,0 @@ -/* -** backtrace.c - -** -** See Copyright Notice in mruby.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 <stdarg.h> - -typedef void (*output_stream_func)(mrb_state*, void*, int, const char*, ...); - -#ifdef ENABLE_STDIO -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); -} -#endif - -#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 -mrb_output_backtrace(mrb_state *mrb, struct RObject *exc, output_stream_func func, void *stream) -{ - mrb_callinfo *ci; - mrb_int ciidx; - const char *filename, *method, *sep; - int i, line; - - func(mrb, stream, 1, "trace:\n"); - ciidx = mrb_fixnum(mrb_obj_iv_get(mrb, exc, mrb_intern2(mrb, "ciidx", 5))); - 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; - line = -1; - - if (MRB_PROC_CFUNC_P(ci->proc)) { - continue; - } - if(!MRB_PROC_CFUNC_P(ci->proc)) { - mrb_irep *irep = ci->proc->body.irep; - mrb_code *pc; - - if (i+1 <= ciidx) { - pc = mrb->c->cibase[i+1].pc; - } - else { - pc = (mrb_code*)mrb_cptr(mrb_obj_iv_get(mrb, exc, mrb_intern2(mrb, "lastpc", 6))); - } - filename = mrb_debug_get_filename(irep, pc - irep->iseq - 1); - line = mrb_debug_get_line(irep, pc - irep->iseq - 1); - } - if (line == -1) continue; - if (ci->target_class == ci->proc->target_class) - sep = "."; - else - sep = "#"; - - if (!filename) { - filename = "(unknown)"; - } - - 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, line, 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, line, method); - func(mrb, stream, 1, "\n"); - } - } - else { - func(mrb, stream, 1, "\t[%d] ", i); - func(mrb, stream, 0, "%s:%d", filename, line); - func(mrb, stream, 1, "\n"); - } - } -} - -void -mrb_print_backtrace(mrb_state *mrb) -{ -#ifdef ENABLE_STDIO - mrb_output_backtrace(mrb, mrb->exc, print_backtrace_i, (void*)stderr); -#endif -} - -mrb_value -mrb_get_backtrace(mrb_state *mrb, mrb_value self) -{ - mrb_value ary; - - ary = mrb_ary_new(mrb); - mrb_output_backtrace(mrb, mrb_obj_ptr(self), get_backtrace_i, (void*)mrb_ary_ptr(ary)); - - return ary; -} Deleted: vendor/mruby-eeac4be/src/class.c (+0 -1936) 100644 =================================================================== --- vendor/mruby-eeac4be/src/class.c 2014-06-08 19:01:14 +0900 (2fc14b2) +++ /dev/null @@ -1,1936 +0,0 @@ -/* -** class.c - Class class -** -** See Copyright Notice in mruby.h -*/ - -#include "mruby.h" -#include <stdarg.h> -#include <ctype.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 "error.h" - -KHASH_DEFINE(mt, mrb_sym, struct RProc*, 1, 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, c->mt); -} - -void -mrb_name_class(mrb_state *mrb, struct RClass *c, mrb_sym name) -{ - mrb_obj_iv_set(mrb, (struct RObject*)c, - mrb_intern2(mrb, "__classid__", 11), mrb_symbol_value(name)); -} - -#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_intern2(mrb, "__attached__", 12), mrb_obj_value(o)); -} - -struct RClass* -mrb_define_module_id(mrb_state *mrb, mrb_sym name) -{ - struct RClass *m = mrb_module_new(mrb); - - mrb_obj_iv_set(mrb, (struct RObject*)mrb->object_class, - name, mrb_obj_value(m)); - mrb_name_class(mrb, m, name); - - return m; -} - -struct RClass* -mrb_define_module(mrb_state *mrb, const char *name) -{ - return mrb_define_module_id(mrb, mrb_intern_cstr(mrb, name)); -} - -static void -setup_class(mrb_state *mrb, mrb_value outer, struct RClass *c, mrb_sym id) -{ - mrb_name_class(mrb, c, id); - mrb_const_set(mrb, outer, id, mrb_obj_value(c)); - mrb_obj_iv_set(mrb, (struct RObject*)c, - mrb_intern2(mrb, "__outer__", 9), outer); -} - -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_intern2(mrb, "__outer__", 9)); - if (mrb_nil_p(outer)) return 0; - return mrb_class_ptr(outer); -} - -struct RClass* -mrb_vm_define_module(mrb_state *mrb, mrb_value outer, mrb_sym id) -{ - struct RClass *c; - mrb_value v; - - if (mrb_const_defined(mrb, outer, id)) { - v = mrb_const_get(mrb, outer, id); - c = mrb_class_ptr(v); - } - else { - c = mrb_module_new(mrb); - setup_class(mrb, outer, c, id); - } - return c; -} - -struct RClass* -mrb_define_class_id(mrb_state *mrb, mrb_sym name, struct RClass *super) -{ - struct RClass *c = mrb_class_new(mrb, super); - - mrb_obj_iv_set(mrb, (struct RObject*)mrb->object_class, - name, mrb_obj_value(c)); - mrb_name_class(mrb, c, name); - - return c; -} - -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); -} - -struct RClass* -mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id) -{ - struct RClass *c, *s; - - if (mrb_const_defined(mrb, outer, id)) { - mrb_value v = mrb_const_get(mrb, outer, id); - - mrb_check_type(mrb, v, MRB_TT_CLASS); - c = mrb_class_ptr(v); - 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); - } - - if (!c->super || mrb_class_ptr(super) != mrb_class_real(c->super)) { - mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for class %S", mrb_sym2str(mrb, id)); - } - } - return 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 = mrb->object_class; - } - - c = mrb_class_new(mrb, s); - setup_class(mrb, outer, c, id); - mrb_funcall(mrb, mrb_obj_value(s), "inherited", 1, mrb_obj_value(c)); - - return c; -} - -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)); -} - -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); - - if (mrb_type(c) != MRB_TT_MODULE && mrb_type(c) != MRB_TT_CLASS) { - mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a class/module", mrb_sym2str(mrb, id)); - } - return mrb_class_ptr(c); -} - -struct RClass * -mrb_class_get(mrb_state *mrb, const char *name) -{ - return mrb_class_get_under(mrb, mrb->object_class, name); -} - -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)); -} - -/*! - * 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. - */ -struct RClass * -mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super) -{ - struct RClass * c; - mrb_sym id = mrb_intern_cstr(mrb, name); - - if (mrb_const_defined_at(mrb, outer, id)) { - c = class_from_sym(mrb, outer, id); - if (mrb_class_real(c->super) != super) { - mrb_name_error(mrb, id, "%S is already defined", name); - } - return c; - } - if (!super) { - mrb_warn(mrb, "no super class for `%S::%S', Object assumed", outer, name); - } - c = mrb_class_new(mrb, super); - setup_class(mrb, mrb_obj_value(outer), c, id); - - return c; -} - -struct RClass * -mrb_define_module_under(mrb_state *mrb, struct RClass *outer, const char *name) -{ - struct RClass * c; - mrb_sym id = mrb_intern_cstr(mrb, name); - - if (mrb_const_defined_at(mrb, outer, id)) { - c = class_from_sym(mrb, outer, id); - return c; - } - c = mrb_module_new(mrb); - setup_class(mrb, mrb_obj_value(outer), c, id); - - return c; -} - -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, h, mid); - kh_value(h, k) = p; - if (p) { - mrb_field_write_barrier(mrb, (struct RBasic *)c, (struct RBasic *)p); - } -} - -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); -} - -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); -} - -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, 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); - } -} - -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"); -} - -/* - 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] - S: String [mrb_value] - A: Array [mrb_value] - H: Hash [mrb_value] - s: String [char*,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] - &: Block [mrb_value] - *: rest argument [mrb_value*,int] Receive the rest of the arguments as an array. - |: optional Next argument of '|' and later are optional. - */ -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; - int opt = 0; - - 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 '&': - break; - default: - if (argc <= i && !opt) { - 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 '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; - struct RString *s; - char **ps = 0; - int *pl = 0; - - ps = va_arg(ap, char**); - pl = va_arg(ap, int*); - if (i < argc) { - ss = to_str(mrb, *sp++); - s = mrb_str_ptr(ss); - *ps = s->ptr; - *pl = s->len; - i++; - } - } - break; - case 'z': - { - mrb_value ss; - struct RString *s; - char **ps; - mrb_int len; - - ps = va_arg(ap, char**); - if (i < argc) { - ss = to_str(mrb, *sp++); - s = mrb_str_ptr(ss); - len = (mrb_int)strlen(s->ptr); - if (len < s->len) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "String contains NUL"); - } - else if (len > s->len) { - mrb_str_modify(mrb, s); - } - *ps = s->ptr; - 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) { - switch (mrb_type(*sp)) { - case MRB_TT_FLOAT: - *p = mrb_float(*sp); - break; - case MRB_TT_FIXNUM: - *p = (mrb_float)mrb_fixnum(*sp); - break; - case MRB_TT_STRING: - mrb_raise(mrb, E_TYPE_ERROR, "String can't be coerced into Float"); - break; - default: - { - mrb_value tmp; - - tmp = mrb_convert_type(mrb, *sp, MRB_TT_FLOAT, "Float", "to_f"); - *p = mrb_float(tmp); - } - break; - } - 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_FALSE: - *p = 0; - break; - default: - { - mrb_value tmp; - - tmp = mrb_convert_type(mrb, *sp, MRB_TT_FIXNUM, "Integer", "to_int"); - *p = mrb_fixnum(tmp); - } - 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++; - if (mrb_type(ss) == MRB_TT_SYMBOL) { - *symp = mrb_symbol(ss); - } - else if (mrb_string_p(ss)) { - *symp = 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); - } - 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 = 1; - break; - - case '*': - { - mrb_value **var; - int *pl; - - var = va_arg(ap, mrb_value**); - pl = va_arg(ap, 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); - c->super = super ? super : mrb->object_class; - mrb_field_write_barrier(mrb, (struct RBasic*)c, (struct RBasic*)super); - c->mt = kh_init(mt, mrb); - return c; -} - -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 == 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, "o", &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; - 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, "o", &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; -} - -mrb_value 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 class_instance_method_list(mrb, recur, c, 0); -} - -mrb_value mrb_yield_internal(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv, mrb_value self, struct RClass *c); - -/* 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; - struct RClass *c; - - if (mrb_get_args(mrb, "|S&", &a, &b) == 1) { - mrb_raise(mrb, E_NOTIMP_ERROR, "module_eval/class_eval with string not implemented"); - } - c = mrb_class_ptr(mod); - return mrb_yield_internal(mrb, b, 0, 0, mod, c); -} - -mrb_value -mrb_mod_dummy_visibility(mrb_state *mrb, mrb_value mod) -{ - return mod; -} - -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); - return mrb_obj_value(obj->c); -} - -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); -} - -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); -} - -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); -} - -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, h, mid); - if (k != kh_end(h)) { - m = kh_value(h, k); - if (!m) break; - *cp = c; - return m; - } - } - c = c->super; - } - return 0; /* no method */ -} - -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 -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_value -mrb_instance_new(mrb_state *mrb, mrb_value cv) -{ - mrb_value obj, blk; - mrb_value *argv; - int argc; - - obj = mrb_instance_alloc(mrb, cv); - mrb_get_args(mrb, "*&", &argv, &argc, &blk); - mrb_funcall_with_block(mrb, obj, mrb_intern(mrb, "initialize"), argc, argv, blk); - - return obj; -} - -mrb_value -mrb_obj_new(mrb_state *mrb, struct RClass *c, int argc, mrb_value *argv) -{ - mrb_value obj; - - obj = mrb_instance_alloc(mrb, mrb_obj_value(c)); - mrb_funcall_argv(mrb, obj, mrb_intern(mrb, "initialize"), argc, argv); - - return obj; -} - -static mrb_value -mrb_class_new_class(mrb_state *mrb, mrb_value cv) -{ - mrb_value super; - struct RClass *new_class; - - if (mrb_get_args(mrb, "|o", &super) == 0) { - super = mrb_obj_value(mrb->object_class); - } - new_class = mrb_class_new(mrb, mrb_class_ptr(super)); - mrb_funcall(mrb, super, "inherited", 1, mrb_obj_value(new_class)); - return mrb_obj_value(new_class); -} - -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; - int alen; - mrb_value inspect; - - mrb_get_args(mrb, "n*", &name, &a, &alen); - - if (mrb_respond_to(mrb,mod,mrb_intern2(mrb, "inspect",7))){ - inspect = mrb_funcall(mrb, mod, "inspect", 0); - if (RSTRING_LEN(inspect) > 64) { - inspect = mrb_any_to_s(mrb, mod); - } - } - else { - inspect = mrb_any_to_s(mrb, mod); - } - - mrb_raisef(mrb, E_NOMETHOD_ERROR, "undefined method '%S' for %S", - mrb_sym2str(mrb, name), inspect); - /* not reached */ - return mrb_nil_value(); -} - -mrb_bool -mrb_obj_respond_to(struct RClass* c, mrb_sym mid) -{ - khiter_t k; - - while (c) { - khash_t(mt) *h = c->mt; - - if (h) { - k = kh_get(mt, 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_bool -mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid) -{ - return mrb_obj_respond_to(mrb_class(mrb, obj), mid); -} - -mrb_value -mrb_class_path(mrb_state *mrb, struct RClass *c) -{ - mrb_value path; - const char *name; - size_t len; - mrb_sym classpath = mrb_intern2(mrb, "__classpath__", 13); - - 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); - 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_plus(mrb, base, mrb_str_new(mrb, "::", 2)); - name = mrb_sym2name_len(mrb, sym, &len); - mrb_str_concat(mrb, path, mrb_str_new(mrb, 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; -} - -struct RClass * -mrb_class_real(struct RClass* cl) -{ - while ((cl->tt == MRB_TT_SCLASS) || (cl->tt == MRB_TT_ICLASS)) { - cl = cl->super; - } - return cl; -} - -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(mrb, "#<Class:", 8); - mrb_str_concat(mrb, path, mrb_ptr_to_str(mrb, c)); - mrb_str_cat(mrb, path, ">", 1); - } - return mrb_str_ptr(path)->ptr; -} - -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. - */ -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. - */ -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. - */ -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 - */ - -struct RClass* -mrb_obj_class(mrb_state *mrb, mrb_value obj) -{ - return mrb_class_real(mrb_class(mrb, obj)); -} - -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 - */ -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_intern2(mrb, "__attached__", 12)); - - str = mrb_str_new(mrb, "#<Class:", 8); - - 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; - } - mrb_str_cat(mrb, str, ">", 1); - } - 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(mrb, str, "#<Class:", 8); - break; - - case MRB_TT_MODULE: - mrb_str_cat(mrb, str, "#<Module:", 9); - break; - - default: - /* Shouldn't be happened? */ - mrb_str_cat(mrb, str, "#<??????:", 9); - break; - } - mrb_str_concat(mrb, str, mrb_ptr_to_str(mrb, c)); - mrb_str_cat(mrb, str, ">", 1); - } - else { - str = path; - } - } - - return str; -} - -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(c, a)) { - mrb_name_error(mrb, a, "undefined method '%S' for class '%S'", mrb_sym2str(mrb, a), mrb_obj_value(c)); - } - else { - MRB_SET_VALUE(m, MRB_TT_PROC, value.p, 0); - mrb_define_method_vm(mrb, c, a, m); - } -} - -void -mrb_undef_method(mrb_state *mrb, struct RClass *c, const char *name) -{ - undef_method(mrb, c, mrb_intern_cstr(mrb, name)); -} - -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); -} - -mrb_value -mrb_mod_undef(mrb_state *mrb, mrb_value mod) -{ - struct RClass *c = mrb_class_ptr(mod); - 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_sym(mrb_state *mrb, mrb_sym id) -{ - const char *s; - size_t len; - - s = mrb_sym2name_len(mrb, id, &len); - if (len < 3 || !(s[0] == '@' && s[1] == '@')) { - mrb_name_error(mrb, id, "`%S' is not allowed as a class variable name", mrb_sym2str(mrb, id)); - } -} - -static void -check_cv_name_str(mrb_state *mrb, mrb_value str) -{ - const char *s = RSTRING_PTR(str); - size_t const 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 mrb_value -get_sym_or_str_arg(mrb_state *mrb) -{ - mrb_value sym_or_str; - - mrb_get_args(mrb, "o", &sym_or_str); - - if (mrb_symbol_p(sym_or_str) || mrb_string_p(sym_or_str)) { - return sym_or_str; - } - else { - mrb_value obj = mrb_funcall(mrb, sym_or_str, "inspect", 0); - mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", obj); - return mrb_nil_value(); - } -} - -/* 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_value id; - mrb_bool defined_p; - - id = get_sym_or_str_arg(mrb); - if (mrb_symbol_p(id)) { - check_cv_name_sym(mrb, mrb_symbol(id)); - defined_p = mrb_cv_defined(mrb, mod, mrb_symbol(id)); - } - else { - mrb_value sym; - check_cv_name_str(mrb, id); - sym = mrb_check_intern_str(mrb, id); - if (mrb_nil_p(sym)) { - defined_p = FALSE; - } - else { - defined_p = mrb_cv_defined(mrb, mod, mrb_symbol(sym)); - } - } - return mrb_bool_value(defined_p); -} - -/* 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] - * [] - */ - -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_value id; - mrb_bool method_defined_p; - - id = get_sym_or_str_arg(mrb); - if (mrb_symbol_p(id)) { - method_defined_p = mrb_obj_respond_to(mrb_class_ptr(mod), mrb_symbol(id)); - } - else { - mrb_value sym = mrb_check_intern_str(mrb, id); - if (mrb_nil_p(sym)) { - method_defined_p = FALSE; - } - else { - method_defined_p = mrb_obj_respond_to(mrb_class_ptr(mod), mrb_symbol(sym)); - } - } - return mrb_bool_value(method_defined_p); -} - -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, h, mid); - if (k != kh_end(h)) { - kh_del(mt, 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>. - */ - -mrb_value -mrb_mod_remove_method(mrb_state *mrb, mrb_value mod) -{ - 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_sym(mrb_state *mrb, mrb_sym id) -{ - const char *s; - size_t len; - - s = mrb_sym2name_len(mrb, id, &len); - if (len < 1 || !ISUPPER(*s)) { - mrb_name_error(mrb, id, "wrong constant name %S", mrb_sym2str(mrb, id)); - } -} - -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); - } -} - -mrb_value -mrb_mod_const_defined(mrb_state *mrb, mrb_value mod) -{ - mrb_value id; - mrb_bool const_defined_p; - - id = get_sym_or_str_arg(mrb); - if (mrb_type(id) == MRB_TT_SYMBOL) { - check_const_name_sym(mrb, mrb_symbol(id)); - const_defined_p = mrb_const_defined(mrb, mod, mrb_symbol(id)); - } - else { - mrb_value sym; - check_const_name_str(mrb, id); - sym = mrb_check_intern_str(mrb, id); - if (mrb_nil_p(sym)) { - const_defined_p = FALSE; - } - else { - const_defined_p = mrb_const_defined(mrb, mod, mrb_symbol(sym)); - } - } - - return mrb_bool_value(const_defined_p); -} - -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); -} - -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; -} - -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_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); -} - -void -mrb_init_class(mrb_state *mrb) -{ - struct RClass *bob; /* BasicObject */ - struct RClass *obj; /* Object */ - struct RClass *mod; /* Module */ - struct RClass *cls; /* Class */ - //struct RClass *krn; /* Kernel */ - - /* 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 */ - mrb_name_class(mrb, bob, mrb_intern2(mrb, "BasicObject", 11)); - mrb_name_class(mrb, obj, mrb_intern2(mrb, "Object", 6)); - mrb_name_class(mrb, mod, mrb_intern2(mrb, "Module", 6)); - mrb_name_class(mrb, cls, mrb_intern2(mrb, "Class", 5)); - - 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_ANY()); - 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, "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, "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, "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, "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_REQ(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_NONE()); /* 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, "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"); -} Deleted: vendor/mruby-eeac4be/src/codegen.c (+0 -2864) 100644 =================================================================== --- vendor/mruby-eeac4be/src/codegen.c 2014-06-08 19:01:14 +0900 (b77ead3) +++ /dev/null @@ -1,2864 +0,0 @@ -/* -** codegen.c - mruby code generator -** -** See Copyright Notice in mruby.h -*/ - -#include <ctype.h> -#include <stdlib.h> -#include <string.h> -#include "mruby.h" -#include "mruby/compile.h" -#include "mruby/irep.h" -#include "mruby/numeric.h" -#include "mruby/string.h" -#include "mruby/debug.h" -#include "node.h" -#include "opcode.h" -#include "re.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, -} type; - -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; - jmp_buf 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; - int scapa; - - int nlocals; - int nregs; - int ai; - - int idx; - - 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 *node, 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 -codegen_error(codegen_scope *s, const char *message) -{ - if (!s) return; - while (s->prev) { - mrb_pool_close(s->mpool); - s = s->prev; - } - mrb_pool_close(s->mpool); -#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 - longjmp(s->jmp, 1); -} - -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; -} - -void* -codegen_malloc(codegen_scope *s, size_t len) -{ - void *p = mrb_malloc(s->mrb, len); - - if (!p) codegen_error(s, "mrb_malloc"); - return p; -} - -void* -codegen_realloc(codegen_scope *s, void *p, size_t len) -{ - p = mrb_realloc(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 void -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; - } - s->pc++; -} - -#define NOVAL 0 -#define VAL 1 - -static void -genop_peep(codegen_scope *s, mrb_code i, int val) -{ - /* peephole optimization */ - if (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; - } - if (val) break; - switch (c0) { - case OP_MOVE: - if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i) == GETARG_B(i0) && GETARG_A(i) >= s->nlocals) { - /* skip swapping OP_MOVE */ - return; - } - if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) { - s->iseq[s->pc-1] = MKOP_AB(OP_MOVE, GETARG_A(i), GETARG_B(i0)); - return; - } - 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; - } - 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; - } - 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; - } - 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; - } - 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; - } - 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; - } - } - 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; - } - } - break; - case OP_EPOP: - if (c0 == OP_EPOP) { - s->iseq[s->pc-1] = MKOP_A(OP_EPOP, GETARG_A(i0)+GETARG_A(i)); - return; - } - break; - case OP_POPERR: - if (c0 == OP_POPERR) { - s->iseq[s->pc-1] = MKOP_A(OP_POPERR, GETARG_A(i0)+GETARG_A(i)); - return; - } - break; - case OP_RETURN: - switch (c0) { - case OP_RETURN: - return; - case OP_MOVE: - s->iseq[s->pc-1] = MKOP_AB(OP_RETURN, GETARG_B(i0), OP_R_NORMAL); - return; - 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]; - genop(s, MKOP_AB(OP_RETURN, GETARG_A(i0), OP_R_NORMAL)); - return; -#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; - } - case OP_STRCAT: - if (c0 == OP_STRING) { - int i = GETARG_Bx(i0); - - if (mrb_type(s->irep->pool[i]) == MRB_TT_STRING && - RSTRING_LEN(s->irep->pool[i]) == 0) { - s->pc--; - return; - } - } - break; - default: - break; - } - } - 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; - - switch (mrb_type(val)) { - case MRB_TT_STRING: - for (i=0; i<s->irep->plen; i++) { - mrb_value pv = s->irep->pool[i]; - mrb_int len; - - 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: - default: - for (i=0; i<s->irep->plen; i++) { - if (mrb_obj_equal(s->mrb, s->irep->pool[i], val)) return i; - } - break; - } - - 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); - } - s->irep->pool[s->irep->plen] = val; - i = s->irep->plen++; - - return i; -} - -static inline int -new_msym(codegen_scope *s, mrb_sym sym) -{ - size_t i, len; - - 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, base = s->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, tree->car); - idx = s->idx; - - lp = loop_push(s, LOOP_FOR); - lp->pc1 = new_label(s); - - // generate loop variable - n2 = tree->car; - if (n2->car && !n2->car->cdr && !n2->cdr) { - genop(s, MKOP_Ax(OP_ENTER, 0x40000)); - gen_assignment(s, n2->car->car, 1, NOVAL); - } - else { - genop(s, MKOP_Ax(OP_ENTER, 0x40000)); - 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(), idx - base, OP_L_BLOCK)); - pop(); - idx = new_msym(s, mrb_intern2(s->mrb, "each", 4)); - genop(s, MKOP_ABC(OP_SENDB, cursp(), idx, 0)); -} - -static int -lambda_body(codegen_scope *s, node *tree, int blk) -{ - int idx, base = s->idx; - mrb_code c; - - s = scope_new(s->mrb, s, tree->car); - idx = s->idx; - 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 idx - base; -} - -static int -scope_body(codegen_scope *s, node *tree) -{ - codegen_scope *scope = scope_new(s->mrb, s, tree->car); - int idx = scope->idx; - - codegen(scope, tree->cdr, VAL); - if (!s->iseq) { - genop(scope, MKOP_A(OP_STOP, 0)); - } - 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, OP_R_NORMAL), NOVAL); - } - } - scope_finish(scope); - - return idx - s->idx; -} - -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; - size_t len; - char *name2; - - name = mrb_sym2name_len(s->mrb, a, &len); - name2 = (char *)codegen_palloc(s, len+1); - memcpy(name2, name, len); - name2[len] = '='; - name2[len+1] = '\0'; - - return mrb_intern2(s->mrb, name2, len+1); -} - -static int -gen_values(codegen_scope *s, node *t, int val) -{ - int n = 0; - - while (t) { - if (n >= 127 || (intptr_t)t->car->car == NODE_SPLAT) { // splat mode - if (val) { - pop_n(n); - genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n)); - push(); - codegen(s, t->car, VAL); - pop(); pop(); - genop(s, MKOP_AB(OP_ARYCAT, 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(); - } - pop_n(n+1); - { - size_t len; - const char *name = mrb_sym2name_len(s->mrb, sym, &len); - - if (!noop && len == 1 && name[0] == '+') { - genop_peep(s, MKOP_ABC(OP_ADD, cursp(), idx, n), val); - } - else if (!noop && len == 1 && name[0] == '-') { - genop_peep(s, MKOP_ABC(OP_SUB, cursp(), idx, n), val); - } - else if (!noop && len == 1 && name[0] == '*') { - genop(s, MKOP_ABC(OP_MUL, cursp(), idx, n)); - } - else if (!noop && len == 1 && name[0] == '/') { - genop(s, MKOP_ABC(OP_DIV, cursp(), idx, n)); - } - else if (!noop && len == 1 && name[0] == '<') { - genop(s, MKOP_ABC(OP_LT, cursp(), idx, n)); - } - else if (!noop && len == 2 && name[0] == '<' && name[1] == '=') { - genop(s, MKOP_ABC(OP_LE, cursp(), idx, n)); - } - else if (!noop && len == 1 && name[0] == '>') { - genop(s, MKOP_ABC(OP_GT, cursp(), idx, n)); - } - else if (!noop && len == 2 && name[0] == '>' && name[1] == '=') { - genop(s, MKOP_ABC(OP_GE, cursp(), idx, n)); - } - else if (!noop && len == 2 && name[0] == '=' && name[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 *node, int sp, int val) -{ - int idx; - int type = (intptr_t)node->car; - - node = node->cdr; - switch ((intptr_t)type) { - case NODE_GVAR: - idx = new_sym(s, sym(node)); - genop_peep(s, MKOP_ABx(OP_SETGLOBAL, sp, idx), val); - break; - case NODE_LVAR: - idx = lv_idx(s, sym(node)); - 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(node)); - 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(node)); - genop_peep(s, MKOP_ABx(OP_SETIV, sp, idx), val); - break; - case NODE_CVAR: - idx = new_sym(s, sym(node)); - genop_peep(s, MKOP_ABx(OP_SETCV, sp, idx), val); - break; - case NODE_CONST: - idx = new_sym(s, sym(node)); - genop_peep(s, MKOP_ABx(OP_SETCONST, sp, idx), val); - break; - case NODE_COLON2: - idx = new_sym(s, sym(node->cdr)); - genop_peep(s, MKOP_AB(OP_MOVE, cursp(), sp), NOVAL); - push(); - codegen(s, node->car, VAL); - pop_n(2); - genop_peep(s, MKOP_ABx(OP_SETMCNST, cursp(), idx), val); - break; - - case NODE_CALL: - push(); - gen_call(s, node, attrsym(s, sym(node->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_intern2(s->mrb, "intern", 6)), 0)); - push(); -} -static void -gen_literal_array(codegen_scope *s, node *tree, int 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, int neg, int *overflow) -{ - const char *e = p + strlen(p); - mrb_int result = 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) { - 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->pc > 0 && 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 = new_label(s); - 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 = new_label(s); - 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_intern2(s->mrb, "StandardError", 13)))); - push(); - } - genop(s, MKOP_AB(OP_MOVE, cursp(), exc)); - pop(); - genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern2(s->mrb, "===", 3)), 1)); - tmp = new_label(s); - genop(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2)); - pos2 = tmp; - if (n4) { - n4 = n4->cdr; - } - } while (n4); - pos1 = new_label(s); - 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 = new_label(s); - 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); - 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 = new_label(s); - genop(s, MKOP_AsBx(OP_JMPNOT, cursp(), 0)); - - 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 = new_label(s); - genop(s, MKOP_sBx(OP_JMP, 0)); - dispatch(s, pos1); - codegen(s, e, val); - dispatch(s, pos2); - } - else { - if (val) { - pop(); - pos2 = new_label(s); - 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); - pos = new_label(s); - pop(); - 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); - pos = new_label(s); - pop(); - 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 = new_label(s); - 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 = new_label(s); - 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(); - genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern2(s->mrb, "===", 3)), 1)); - } - else { - pop(); - } - tmp = new_label(s); - genop(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2)); - pos2 = tmp; - n = n->cdr; - } - if (tree->car->car) { - pos1 = new_label(s); - genop(s, MKOP_sBx(OP_JMP, 0)); - dispatch_linked(s, pos2); - } - codegen(s, tree->car->cdr, val); - if (val) pop(); - tmp = new_label(s); - genop(s, MKOP_sBx(OP_JMP, pos3)); - pos3 = tmp; - if (pos1) dispatch(s, pos1); - tree = tree->cdr; - } - if (val) { - genop(s, MKOP_A(OP_LOADNIL, cursp())); - push(); - } - if (pos3) dispatch_linked(s, pos3); - } - break; - - case NODE_SCOPE: - scope_body(s, tree); - 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(), 0)); - 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(), 1)); - 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; - - while (tree) { - codegen(s, tree->car->car, val); - codegen(s, tree->car->cdr, val); - len++; - tree = tree->cdr; - } - if (val) { - pop_n(len*2); - genop(s, MKOP_ABC(OP_HASH, cursp(), cursp(), len)); - 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); - size_t 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 = new_label(s); - genop(s, MKOP_AsBx(name[0] == '|' ? OP_JMPIF : OP_JMPNOT, cursp(), 0)); - 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); - 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())); - } - 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))); - if (tree && tree->cdr) { - push(); - codegen(s, tree->cdr, VAL); - pop_n(2); - } - 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_intern2(s->mrb, "call", 4)), 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(s, MKOP_AB(OP_MOVE, cursp(), idx)); - } - 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_buf_cat(mrb, str, "$", 1); - mrb_str_buf_append(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; - int 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; - int 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_intern2(s->mrb, "-", 1)); - - 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_XSTR: - if (val) { - 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_intern2(s->mrb, "Kernel", 6)); - int off = new_lit(s, mrb_str_new(s->mrb, p, len)); - - 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_intern2(s->mrb, "`", 1)); - genop(s, MKOP_ABC(OP_SEND, cursp(), sym, 1)); - mrb_gc_arena_restore(s->mrb, ai); - push(); - } - 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_intern2(s->mrb, REGEXP_CLASS, REGEXP_CLASS_CSTR_LEN)); - int off = new_lit(s, mrb_str_new(s->mrb, p1, strlen(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(s->mrb, p2, strlen(p2))); - genop(s, MKOP_ABx(OP_STRING, cursp(), off)); - argc++; - pop(); - } - pop(); - sym = new_sym(s, mrb_intern2(s->mrb, "compile", 7)); - 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_intern2(s->mrb, REGEXP_CLASS, REGEXP_CLASS_CSTR_LEN)); - 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(s->mrb, p, strlen(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; - int off; - - push(); - off = new_lit(s, mrb_str_new(s->mrb, p2, strlen(p2))); - genop(s, MKOP_ABx(OP_STRING, cursp(), off)); - argc++; - pop(); - } - pop(); - sym = new_sym(s, mrb_intern2(s->mrb, "compile", 7)); - 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_intern2(s->mrb, "alias_method", 12)); - - 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_intern2(s->mrb, "undef_method", 12)); - 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); - 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); - 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); - 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)); - 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 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 0; - *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); - p->idx = p->irep->idx; - - p->icapa = 1024; - p->iseq = (mrb_code*)mrb_malloc(mrb, sizeof(mrb_code)*p->icapa); - - 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)*256); - p->irep->slen = 0; - - p->lv = lv; - p->sp += node_len(lv)+1; /* add self */ - p->nlocals = p->sp; - 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); - 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 = 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 = new_label(s); - 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(); -} - -static void -codedump(mrb_state *mrb, int n) -{ -#ifdef ENABLE_STDIO - mrb_irep *irep = mrb->irep[n]; - uint32_t i; - int ai; - mrb_code c; - - if (!irep) return; - printf("irep %d nregs=%d nlocals=%d pools=%d syms=%d\n", n, - irep->nregs, irep->nlocals, (int)irep->plen, (int)irep->slen); - for (i=0; i<irep->ilen; i++) { - ai = mrb_gc_arena_save(mrb); - 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\n", GETARG_A(c), GETARG_B(c)); - break; - case OP_LOADL: - printf("OP_LOADL\tR%d\tL(%d)\n", GETARG_A(c), GETARG_Bx(c)); - break; - case OP_LOADI: - printf("OP_LOADI\tR%d\t%d\n", GETARG_A(c), GETARG_sBx(c)); - break; - case OP_LOADSYM: - printf("OP_LOADSYM\tR%d\t:%s\n", GETARG_A(c), - mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)])); - break; - case OP_LOADNIL: - printf("OP_LOADNIL\tR%d\n", GETARG_A(c)); - break; - case OP_LOADSELF: - printf("OP_LOADSELF\tR%d\n", GETARG_A(c)); - break; - case OP_LOADT: - printf("OP_LOADT\tR%d\n", GETARG_A(c)); - break; - case OP_LOADF: - printf("OP_LOADF\tR%d\n", GETARG_A(c)); - break; - case OP_GETGLOBAL: - printf("OP_GETGLOBAL\tR%d\t:%s\n", GETARG_A(c), - mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)])); - break; - case OP_SETGLOBAL: - printf("OP_SETGLOBAL\t:%s\tR%d\n", - mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]), - GETARG_A(c)); - break; - case OP_GETCONST: - printf("OP_GETCONST\tR%d\t:%s\n", GETARG_A(c), - mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)])); - break; - case OP_SETCONST: - printf("OP_SETCONST\t:%s\tR%d\n", - mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]), - GETARG_A(c)); - break; - case OP_GETMCNST: - printf("OP_GETMCNST\tR%d\tR%d::%s\n", GETARG_A(c), GETARG_A(c), - mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)])); - break; - case OP_SETMCNST: - printf("OP_SETMCNST\tR%d::%s\tR%d\n", GETARG_A(c)+1, - mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]), - GETARG_A(c)); - break; - case OP_GETIV: - printf("OP_GETIV\tR%d\t%s\n", GETARG_A(c), - mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)])); - break; - case OP_SETIV: - printf("OP_SETIV\t%s\tR%d\n", - mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]), - GETARG_A(c)); - break; - case OP_GETUPVAR: - printf("OP_GETUPVAR\tR%d\t%d\t%d\n", - GETARG_A(c), GETARG_B(c), GETARG_C(c)); - break; - case OP_SETUPVAR: - printf("OP_SETUPVAR\tR%d\t%d\t%d\n", - GETARG_A(c), GETARG_B(c), GETARG_C(c)); - break; - case OP_GETCV: - printf("OP_GETCV\tR%d\t%s\n", GETARG_A(c), - mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)])); - break; - case OP_SETCV: - printf("OP_SETCV\t%s\tR%d\n", - mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]), - GETARG_A(c)); - 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\n", GETARG_A(c), - (GETARG_Bx(c)>>10)&0x3f, - (GETARG_Bx(c)>>9)&0x1, - (GETARG_Bx(c)>>4)&0x1f, - (GETARG_Bx(c)>>0)&0xf); - 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: - printf("\n"); break; - case OP_R_RETURN: - printf("\treturn\n"); break; - case OP_R_BREAK: - printf("\tbreak\n"); break; - default: - printf("\tbroken\n"); break; - break; - } - break; - case OP_BLKPUSH: - printf("OP_BLKPUSH\tR%d\t%d:%d:%d:%d\n", GETARG_A(c), - (GETARG_Bx(c)>>10)&0x3f, - (GETARG_Bx(c)>>9)&0x1, - (GETARG_Bx(c)>>4)&0x1f, - (GETARG_Bx(c)>>0)&0xf); - break; - - case OP_LAMBDA: - printf("OP_LAMBDA\tR%d\tI(%+d)\t%d\n", GETARG_A(c), GETARG_b(c), GETARG_c(c)); - break; - case OP_RANGE: - printf("OP_RANGE\tR%d\tR%d\t%d\n", GETARG_A(c), GETARG_B(c), GETARG_C(c)); - break; - case OP_METHOD: - printf("OP_METHOD\tR%d\t:%s\n", GETARG_A(c), - mrb_sym2name(mrb, irep->syms[GETARG_B(c)])); - 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\n", GETARG_A(c), GETARG_B(c), GETARG_C(c)); - break; - case OP_ARYCAT: - printf("OP_ARYCAT\tR%d\tR%d\n", GETARG_A(c), GETARG_B(c)); - break; - case OP_ARYPUSH: - printf("OP_ARYPUSH\tR%d\tR%d\n", GETARG_A(c), GETARG_B(c)); - break; - case OP_AREF: - printf("OP_AREF\tR%d\tR%d\t%d\n", GETARG_A(c), GETARG_B(c), GETARG_C(c)); - break; - case OP_APOST: - printf("OP_APOST\tR%d\t%d\t%d\n", GETARG_A(c), GETARG_B(c), GETARG_C(c)); - break; - case OP_STRING: - { - mrb_value s = irep->pool[GETARG_Bx(c)]; - - s = mrb_str_dump(mrb, s); - printf("OP_STRING\tR%d\t%s\n", GETARG_A(c), RSTRING_PTR(s)); - } - break; - case OP_STRCAT: - printf("OP_STRCAT\tR%d\tR%d\n", GETARG_A(c), GETARG_B(c)); - break; - case OP_HASH: - printf("OP_HASH\tR%d\tR%d\t%d\n", GETARG_A(c), GETARG_B(c), GETARG_C(c)); - break; - - case OP_OCLASS: - printf("OP_OCLASS\tR%d\n", GETARG_A(c)); - break; - case OP_CLASS: - printf("OP_CLASS\tR%d\t:%s\n", GETARG_A(c), - mrb_sym2name(mrb, irep->syms[GETARG_B(c)])); - break; - case OP_MODULE: - printf("OP_MODULE\tR%d\t:%s\n", GETARG_A(c), - mrb_sym2name(mrb, irep->syms[GETARG_B(c)])); - break; - case OP_EXEC: - printf("OP_EXEC\tR%d\tI(%d)\n", GETARG_A(c), n+GETARG_Bx(c)); - break; - case OP_SCLASS: - printf("OP_SCLASS\tR%d\tR%d\n", GETARG_A(c), GETARG_B(c)); - break; - case OP_TCLASS: - printf("OP_TCLASS\tR%d\n", GETARG_A(c)); - break; - case OP_ERR: - printf("OP_ERR\tL(%d)\n", GETARG_Bx(c)); - break; - case OP_EPUSH: - printf("OP_EPUSH\t:I(%d)\n", n+GETARG_Bx(c)); - break; - case OP_ONERR: - printf("OP_ONERR\t%03d\n", i+GETARG_sBx(c)); - break; - case OP_RESCUE: - printf("OP_RESCUE\tR%d\n", GETARG_A(c)); - break; - case OP_RAISE: - printf("OP_RAISE\tR%d\n", GETARG_A(c)); - break; - case OP_POPERR: - printf("OP_POPERR\t%d\n", GETARG_A(c)); - 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 -} - -void -codedump_all(mrb_state *mrb, int start) -{ - size_t i; - - for (i=start; i<mrb->irep_len; i++) { - codedump(mrb, i); - } -} -static int -codegen_start(mrb_state *mrb, parser_state *p) -{ - codegen_scope *scope = scope_new(mrb, 0, 0); - - if (!scope) { - return -1; - } - scope->mrb = mrb; - scope->parser = p; - scope->filename = p->filename; - scope->filename_index = p->current_filename_index; - if (setjmp(scope->jmp) == 0) { - // prepare irep - codegen(scope, p->tree, NOVAL); - mrb_pool_close(scope->mpool); - return 0; - } - else { - return -1; - } -} - -int -mrb_generate_code(mrb_state *mrb, parser_state *p) -{ - int start = mrb->irep_len; - int n; - - n = codegen_start(mrb, p); - if (n < 0) return n; - - return start; -} Deleted: vendor/mruby-eeac4be/src/compar.c (+0 -13) 100644 =================================================================== --- vendor/mruby-eeac4be/src/compar.c 2014-06-08 19:01:14 +0900 (1614d23) +++ /dev/null @@ -1,13 +0,0 @@ -/* -** 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"); -} Deleted: vendor/mruby-eeac4be/src/crc.c (+0 -38) 100644 =================================================================== --- vendor/mruby-eeac4be/src/crc.c 2014-06-08 19:01:14 +0900 (3bda7bc) +++ /dev/null @@ -1,38 +0,0 @@ -/* -** 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); -} - Deleted: vendor/mruby-eeac4be/src/debug.c (+0 -214) 100644 =================================================================== --- vendor/mruby-eeac4be/src/debug.c 2014-06-08 19:01:14 +0900 (8e4311f) +++ /dev/null @@ -1,214 +0,0 @@ -#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; -} - -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; -} - -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->line_ary[pc - f->start_pos]; - - case mrb_debug_line_flat_map: { - // get upper bound - mrb_irep_debug_info_line *ret = f->line_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->line_flat_map <= ret && ret < (f->line_flat_map + f->line_entry_count)); - // check pc range - mrb_assert(ret->start_pos <= pc && - pc < (((ret + 1 - f->line_flat_map) < f->line_entry_count) - ? (ret+1)->start_pos : irep->debug_info->pc_count)); - - return ret->line; - } - } - } - } - return -1; -} - -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_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; - size_t 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_intern2(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->line_ptr = NULL; - - switch(ret->line_type) { - case mrb_debug_line_ary: - ret->line_entry_count = file_pc_count; - ret->line_ary = mrb_malloc(mrb, sizeof(uint16_t) * file_pc_count); - for(i = 0; i < file_pc_count; ++i) { - ret->line_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->line_flat_map = 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->line_flat_map = mrb_realloc( - mrb, ret->line_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->line_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; -} - -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]->line_ptr); - mrb_free(mrb, d->files[i]); - } - mrb_free(mrb, d->files); - mrb_free(mrb, d); -} Deleted: vendor/mruby-eeac4be/src/dump.c (+0 -770) 100644 =================================================================== --- vendor/mruby-eeac4be/src/dump.c 2014-06-08 19:01:14 +0900 (73c3ed5) +++ /dev/null @@ -1,770 +0,0 @@ -/* -** dump.c - mruby binary dumper (mrbc binary format) -** -** See Copyright Notice in mruby.h -*/ - -#include <string.h> -#include "mruby/dump.h" -#include <ctype.h> - -#include "mruby/string.h" -#include "mruby/irep.h" -#include "mruby/numeric.h" -#include "mruby/debug.h" - -static size_t get_irep_record_size(mrb_state *mrb, mrb_irep *irep); - -static uint32_t -get_irep_header_size(mrb_state *mrb) -{ - uint32_t size = 0; - - size += sizeof(uint32_t) * 1; - size += sizeof(uint16_t) * 2; - - return size; -} - -static size_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(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 */ - - return (cur - buf); -} - - -static uint32_t -get_iseq_block_size(mrb_state *mrb, mrb_irep *irep) -{ - uint32_t size = 0; - size += sizeof(uint32_t); /* ilen */ - size += sizeof(uint32_t) * irep->ilen; /* iseq(n) */ - return size; -} - -static int -write_iseq_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf) -{ - uint8_t *cur = buf; - size_t iseq_no; - - cur += uint32_to_bin(irep->ilen, cur); /* number of opcode */ - 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; - int len; - 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); - size += RSTRING_LEN(str); - break; - - case MRB_TT_FLOAT: - len = mrb_float_to_str(buf, mrb_float(irep->pool[pool_no])); - size += len; - break; - - case MRB_TT_STRING: - str = mrb_str_to_str(mrb, irep->pool[pool_no]); - size += RSTRING_LEN(str); - break; - - default: - break; - } - - mrb_gc_arena_restore(mrb, ai); - } - - return size; -} - -static int -write_pool_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf) -{ - size_t pool_no; - uint8_t *cur = buf; - size_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); - - cur += uint8_to_bin(mrb_type(irep->pool[pool_no]), cur); /* data type */ - - switch (mrb_type(irep->pool[pool_no])) { - case MRB_TT_FIXNUM: - str = mrb_fixnum_to_str(mrb, irep->pool[pool_no], 10); - char_ptr = RSTRING_PTR(str); - len = RSTRING_LEN(str); - break; - - case MRB_TT_FLOAT: - len = mrb_float_to_str(char_buf, mrb_float(irep->pool[pool_no])); - char_ptr = &char_buf[0]; - break; - - case MRB_TT_STRING: - str = irep->pool[pool_no]; - char_ptr = RSTRING_PTR(str); - len = RSTRING_LEN(str); - break; - - default: - continue; - } - - cur += uint16_to_bin(len, cur); /* data length */ - memcpy(cur, char_ptr, len); - cur += len; - - mrb_gc_arena_restore(mrb, ai); - } - - return (int)(cur - buf); -} - - -static size_t -get_syms_block_size(mrb_state *mrb, mrb_irep *irep) -{ - size_t size = 0; - size_t sym_no; - size_t 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 int -write_syms_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf) -{ - size_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) { - size_t len; - - name = mrb_sym2name_len(mrb, irep->syms[sym_no], &len); - if (len > UINT16_MAX) { - return MRB_DUMP_GENERAL_FAILURE; - } - - 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 (int)(cur - buf); -} - - - -static size_t -get_irep_record_size(mrb_state *mrb, mrb_irep *irep) -{ - uint32_t size = 0; - - //size += sizeof(uint16_t); /* rlen */ - 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 int -write_irep_record(mrb_state *mrb, mrb_irep *irep, uint8_t* bin, uint32_t *irep_record_size) -{ - if (irep == NULL) { - return MRB_DUMP_INVALID_IREP; - } - - *irep_record_size = get_irep_record_size(mrb, irep); - if (*irep_record_size == 0) { - return MRB_DUMP_GENERAL_FAILURE; - } - - memset(bin, 0, *irep_record_size); - - //bin += uint16_to_bin(*irep_record_size, bin); - bin += write_irep_header(mrb, irep, bin); - bin += write_iseq_block(mrb, irep, bin); - bin += write_pool_block(mrb, irep, bin); - bin += write_syms_block(mrb, irep, bin); - - return MRB_DUMP_OK; -} - -static size_t -mrb_write_eof(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 -mrb_write_section_irep_header(mrb_state *mrb, uint32_t section_size, uint16_t nirep, uint16_t sirep, 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)); - uint32_to_bin(section_size, header->section_size); - memcpy(header->rite_version, RITE_VM_VER, sizeof(header->rite_version)); - uint16_to_bin(nirep, header->nirep); - uint16_to_bin(sirep, header->sirep); - - return MRB_DUMP_OK; -} - -static int -mrb_write_section_irep(mrb_state *mrb, size_t start_index, uint8_t *bin) -{ - int result; - size_t irep_no; - uint32_t section_size = 0, rlen = 0; /* size of irep record */ - uint8_t *cur = bin; - - if (mrb == NULL || start_index >= mrb->irep_len || bin == NULL) { - return MRB_DUMP_INVALID_ARGUMENT; - } - - cur += sizeof(struct rite_section_irep_header); - section_size += sizeof(struct rite_section_irep_header); - - for (irep_no = start_index; irep_no < mrb->irep_len; irep_no++) { - result = write_irep_record(mrb, mrb->irep[irep_no], cur, &rlen); - if (result != MRB_DUMP_OK) { - return result; - } - cur += rlen; - section_size += rlen; - } - - mrb_write_section_irep_header(mrb, section_size, mrb->irep_len - start_index, start_index, bin); - - return MRB_DUMP_OK; -} - -static int -mrb_write_section_lineno_header(mrb_state *mrb, uint32_t section_size, uint16_t nirep, uint16_t sirep, uint8_t *bin) -{ - struct rite_section_lineno_header *header = (struct rite_section_lineno_header*)bin; - - // TODO - memcpy(header->section_identify, RITE_SECTION_LINENO_IDENTIFIER, sizeof(header->section_identify)); - uint32_to_bin(section_size, header->section_size); - uint16_to_bin(nirep, header->nirep); - uint16_to_bin(sirep, header->sirep); - - 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 int -write_lineno_record(mrb_state *mrb, mrb_irep *irep, uint8_t* bin) -{ - uint8_t *cur = bin; - size_t filename_len = 0, iseq_no; - - cur += sizeof(uint32_t); /* record size */ - - if (irep->filename) { - filename_len = strlen(irep->filename); - } - cur += uint16_to_bin(filename_len, cur); /* filename size */ - - if (filename_len) { - memcpy(cur, irep->filename, filename_len); - cur += filename_len; /* filename */ - } - - if (irep->lines) { - cur += uint32_to_bin(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 */ - } - - uint32_to_bin(cur - bin, bin); /* record size */ - - return (cur - bin); -} - -static int -mrb_write_section_lineno(mrb_state *mrb, size_t start_index, uint8_t *bin) -{ - size_t irep_no; - uint32_t section_size = 0, rlen = 0; /* size of irep record */ - uint8_t *cur = bin; - - if (mrb == NULL || start_index >= mrb->irep_len || bin == NULL) { - return MRB_DUMP_INVALID_ARGUMENT; - } - - cur += sizeof(struct rite_section_lineno_header); - section_size += sizeof(struct rite_section_lineno_header); - - for (irep_no = start_index; irep_no < mrb->irep_len; irep_no++) { - rlen = write_lineno_record(mrb, mrb->irep[irep_no], cur); - cur += rlen; - section_size += rlen; - } - - mrb_write_section_lineno_header(mrb, section_size, mrb->irep_len - start_index, start_index, bin); - - return MRB_DUMP_OK; -} - -static size_t -get_debug_record_size(mrb_state *mrb, mrb_irep *irep) -{ - size_t ret = 0; - uint32_t f_idx; - - 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) * file->line_entry_count; - break; - - case mrb_debug_line_flat_map: - ret += (sizeof(uint32_t) + sizeof(uint16_t)) * file->line_entry_count; - break; - - default: mrb_assert(0); break; - } - } - - return ret; -} - -static int -find_filename_index(const mrb_sym *ary, size_t ary_len, mrb_sym s) -{ - size_t i; - - for(i = 0; i < ary_len; ++i) { - if(ary[i] == s) { return i; } - } - return -1; -} - -static int -write_debug_record(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, mrb_sym const* filenames, size_t filenames_len) -{ - uint8_t *cur; - uint32_t f_idx; - size_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(filename_idx != -1); - cur += uint16_to_bin(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: { - size_t l; - for(l = 0; l < file->line_entry_count; ++l) { - cur += uint16_to_bin(file->line_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->line_flat_map[line].start_pos, cur); - cur += uint16_to_bin(file->line_flat_map[line].line, cur); - } - } break; - - default: mrb_assert(0); break; - } - } - - ret = cur - bin; - uint32_to_bin(ret, bin); - - mrb_assert((cur - bin) == (int)get_debug_record_size(mrb, irep)); - - return ret; -} - -static int -mrb_write_section_debug(mrb_state *mrb, size_t start_index, uint8_t *cur) -{ - uint32_t section_size = 0; - const uint8_t *bin = cur; - struct rite_section_debug_header *header; - mrb_sym *filenames; - size_t filenames_len; - uint8_t *filenames_len_out; - size_t irep_i; - size_t file_i; - uint16_t fn_len; - size_t i; - - if (mrb == NULL || start_index >= mrb->irep_len || 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 - filenames = (mrb_sym *)mrb_malloc(mrb, sizeof(mrb_sym *) * 1); - filenames_len = 0; - filenames_len_out = cur; - cur += sizeof(uint16_t); - section_size += sizeof(uint16_t); - for (irep_i = start_index; irep_i < mrb->irep_len; ++irep_i) { - mrb_irep_debug_info *debug_info = mrb->irep[irep_i]->debug_info; - - for(file_i = 0; file_i < debug_info->flen; ++file_i) { - mrb_irep_debug_info_file *file = debug_info->files[file_i]; - if(find_filename_index(filenames, filenames_len, file->filename_sym) != -1) continue; - - // register filename - filenames = (mrb_sym*)mrb_realloc(mrb, filenames, sizeof(mrb_sym*) * ++filenames_len); - filenames[filenames_len - 1] = file->filename_sym; - - // filename - fn_len = (uint16_t)strlen(file->filename); - cur += uint16_to_bin(fn_len, cur); - memcpy(cur, file->filename, fn_len); - cur += fn_len; - - section_size += sizeof(uint16_t) + fn_len; - } - } - uint16_to_bin(filenames_len, filenames_len_out); - - // records - for (i = start_index; i < mrb->irep_len; ++i) { - uint32_t rlen = write_debug_record(mrb, mrb->irep[i], cur, filenames, filenames_len); - cur += rlen; - section_size += rlen; - } - - memcpy(header->section_identify, RITE_SECTION_DEBUG_IDENTIFIER, sizeof(header->section_identify)); - uint32_to_bin(section_size, header->section_size); - uint16_to_bin(mrb->irep_len - start_index, header->nirep); - uint16_to_bin(start_index, header->sirep); - - mrb_free(mrb, filenames); - - return MRB_DUMP_OK; -} - -static int -write_rite_binary_header(mrb_state *mrb, size_t binary_size, uint8_t *bin) -{ - struct rite_binary_header *header = (struct rite_binary_header *)bin; - uint16_t crc; - size_t offset; - - 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)); - uint32_to_bin(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; -} - -mrb_bool is_debug_info_defined(mrb_state *mrb, size_t const start_index) -{ - size_t i; - for (i = start_index; i < mrb->irep_len; ++i) { - if (!mrb->irep[i]->debug_info) { return 0; } - } - return 1; -} - -static int -mrb_dump_irep(mrb_state *mrb, size_t start_index, int debug_info, uint8_t **bin, size_t *bin_size) -{ - int result = MRB_DUMP_GENERAL_FAILURE; - size_t section_size = 0; - size_t section_irep_size; - size_t section_lineno_size = 0; - size_t irep_no; - uint8_t *cur = NULL; - - mrb_bool const debug_info_defined = is_debug_info_defined(mrb, start_index); - - if (mrb == NULL || start_index >= mrb->irep_len) { - *bin = NULL; - return MRB_DUMP_GENERAL_FAILURE; - } - - section_irep_size = sizeof(struct rite_section_irep_header); - for (irep_no = start_index; irep_no < mrb->irep_len; irep_no++) { - section_irep_size += get_irep_record_size(mrb, mrb->irep[irep_no]); - } - section_size += section_irep_size; - - /* DEBUG section size */ - if (debug_info) { - if (debug_info_defined) { - mrb_sym *filenames; - size_t filenames_len; - size_t irep_i; - size_t file_i; - - section_lineno_size += sizeof(struct rite_section_debug_header); - - // filename table - filenames = (mrb_sym *)mrb_malloc(mrb, sizeof(mrb_sym *) + 1); - filenames_len = 0; - // filename table size - section_lineno_size += sizeof(uint16_t); - for (irep_i = start_index; irep_i < mrb->irep_len; ++irep_i) { - mrb_irep_debug_info *di = mrb->irep[irep_i]->debug_info; - - for(file_i = 0; file_i < di->flen; ++file_i) { - mrb_irep_debug_info_file *file; - size_t filename_len; - - file = di->files[file_i]; - if(find_filename_index(filenames, filenames_len, file->filename_sym) != -1) continue; - - // register filename - filenames = (mrb_sym *)mrb_realloc(mrb, filenames, sizeof(mrb_sym*) * ++filenames_len); - filenames[filenames_len - 1] = file->filename_sym; - - // filename - mrb_sym2name_len(mrb, file->filename_sym, &filename_len); - section_lineno_size += sizeof(uint16_t) + filename_len; - } - } - mrb_free(mrb, filenames); - - for(irep_no = start_index; irep_no < mrb->irep_len; ++irep_no) { - section_lineno_size += get_debug_record_size(mrb, mrb->irep[irep_no]); - } - section_size += section_lineno_size; - } - else { - section_lineno_size += sizeof(struct rite_section_lineno_header); - for (irep_no = start_index; irep_no < mrb->irep_len; irep_no++) { - section_lineno_size += get_lineno_record_size(mrb, mrb->irep[irep_no]); - } - section_size += section_lineno_size; - } - } - - *bin_size += sizeof(struct rite_binary_header) + section_size + sizeof(struct rite_binary_footer); - cur = *bin = (uint8_t *)mrb_malloc(mrb, *bin_size); - if (cur == NULL) { - goto error_exit; - } - - cur += sizeof(struct rite_binary_header); - - result = mrb_write_section_irep(mrb, start_index, cur); - if (result != MRB_DUMP_OK) { - goto error_exit; - } - - cur += section_irep_size; - - /* write DEBUG section */ - if (debug_info) { - if(debug_info_defined) { - result = mrb_write_section_debug(mrb, start_index, cur); - if(result != MRB_DUMP_OK) { - goto error_exit; - } - cur += section_lineno_size; - } - else { - result = mrb_write_section_lineno(mrb, start_index, cur); - if (result != MRB_DUMP_OK) { - goto error_exit; - } - cur += section_lineno_size; - } - } - - mrb_write_eof(mrb, cur); - - result = write_rite_binary_header(mrb, *bin_size, *bin); - -error_exit: - if (result != MRB_DUMP_OK) { - mrb_free(mrb, *bin); - *bin = NULL; - } - return result; -} - - -#ifdef ENABLE_STDIO - -int -mrb_dump_irep_binary(mrb_state *mrb, size_t start_index, 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 = mrb_dump_irep(mrb, start_index, debug_info, &bin, &bin_size); - if (result == MRB_DUMP_OK) { - fwrite(bin, bin_size, 1, fp); - } - - mrb_free(mrb, bin); - return result; -} - -static int -is_valid_c_symbol_name(const char *name) -{ - const char *c = NULL; - - if (name == NULL || name[0] == '\0') return 0; - if (!ISALPHA(name[0]) && name[0] != '_') return 0; - - c = &name[1]; - for (; *c != '\0'; ++c) { - if (!ISALNUM(*c) && *c != '_') return 0; - } - - return 1; -} - -int -mrb_dump_irep_cfunc(mrb_state *mrb, size_t start_index, 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 = mrb_dump_irep(mrb, start_index, debug_info, &bin, &bin_size); - if (result == MRB_DUMP_OK) { - fprintf(fp, "#include <stdint.h>\n"); // for uint8_t under at least Darwin - fprintf(fp, "const uint8_t %s[] = {", initname); - while (bin_idx < bin_size) { - if (bin_idx % 16 == 0 ) fputs("\n", fp); - fprintf(fp, "0x%02x,", bin[bin_idx++]); - } - fputs("\n};\n", fp); - } - - mrb_free(mrb, bin); - return result; -} - -#endif /* ENABLE_STDIO */ Deleted: vendor/mruby-eeac4be/src/enum.c (+0 -14) 100644 =================================================================== --- vendor/mruby-eeac4be/src/enum.c 2014-06-08 19:01:14 +0900 (0a58cc5) +++ /dev/null @@ -1,14 +0,0 @@ -/* -** 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"); -} - Deleted: vendor/mruby-eeac4be/src/error.c (+0 -462) 100644 =================================================================== --- vendor/mruby-eeac4be/src/error.c 2014-06-08 19:01:14 +0900 (4ce2b4a) +++ /dev/null @@ -1,462 +0,0 @@ -/* -** error.c - Exception class -** -** See Copyright Notice in mruby.h -*/ - -#include <errno.h> -#include <stdarg.h> -#include <stdlib.h> -#include <string.h> -#include "mruby.h" -#include "mruby/array.h" -#include "mruby/class.h" -#include "mruby/irep.h" -#include "mruby/proc.h" -#include "mruby/string.h" -#include "mruby/variable.h" -#include "mruby/debug.h" -#include "error.h" - -mrb_value -mrb_exc_new(mrb_state *mrb, struct RClass *c, const char *ptr, long len) -{ - return mrb_funcall(mrb, mrb_obj_value(c), "new", 1, mrb_str_new(mrb, ptr, len)); -} - -mrb_value -mrb_exc_new3(mrb_state *mrb, struct RClass* c, mrb_value str) -{ - str = mrb_str_to_str(mrb, str); - return mrb_funcall(mrb, mrb_obj_value(c), "new", 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_intern2(mrb, "mesg", 4), 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_intern2(mrb, "mesg", 4), 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_intern2(mrb, "mesg", 4)); - - if (mrb_nil_p(mesg)) return mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, exc)); - 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 - * - * Return this exception's class name an message - */ - -static mrb_value -exc_inspect(mrb_state *mrb, mrb_value exc) -{ - mrb_value str, mesg, file, line; - - mesg = mrb_attr_get(mrb, exc, mrb_intern2(mrb, "mesg", 4)); - file = mrb_attr_get(mrb, exc, mrb_intern2(mrb, "file", 4)); - line = mrb_attr_get(mrb, exc, mrb_intern2(mrb, "line", 4)); - - if (!mrb_nil_p(file) && !mrb_nil_p(line)) { - str = file; - mrb_str_cat(mrb, str, ":", 1); - mrb_str_append(mrb, str, line); - mrb_str_cat(mrb, str, ": ", 2); - if (!mrb_nil_p(mesg) && RSTRING_LEN(mesg) > 0) { - mrb_str_append(mrb, str, mesg); - mrb_str_cat(mrb, str, " (", 2); - } - mrb_str_cat_cstr(mrb, str, mrb_obj_classname(mrb, exc)); - if (!mrb_nil_p(mesg) && RSTRING_LEN(mesg) > 0) { - mrb_str_cat(mrb, str, ")", 1); - } - } - else { - str = mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, exc)); - if (!mrb_nil_p(mesg) && RSTRING_LEN(mesg) > 0) { - mrb_str_cat(mrb, str, ": ", 2); - mrb_str_append(mrb, str, mesg); - } - else { - mrb_str_cat(mrb, str, ": ", 2); - mrb_str_cat_cstr(mrb, str, mrb_obj_classname(mrb, exc)); - } - } - return str; -} - - -static mrb_value -exc_equal(mrb_state *mrb, mrb_value exc) -{ - mrb_value obj; - mrb_value mesg; - mrb_bool equal_p; - mrb_sym id_mesg = mrb_intern2(mrb, "mesg", 4); - - mrb_get_args(mrb, "o", &obj); - if (mrb_obj_equal(mrb, exc, obj)) { - equal_p = 1; - } - else { - if (mrb_obj_class(mrb, exc) != mrb_obj_class(mrb, obj)) { - if (mrb_respond_to(mrb, obj, mrb_intern2(mrb, "message", 7))) { - mesg = mrb_funcall(mrb, obj, "message", 0); - } - else - return mrb_false_value(); - } - else { - mesg = mrb_attr_get(mrb, obj, id_mesg); - } - - equal_p = mrb_equal(mrb, mrb_attr_get(mrb, exc, id_mesg), mesg); - } - - return mrb_bool_value(equal_p); -} - -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_intern2(mrb, "ciidx", 5), mrb_fixnum_value(ci - mrb->c->cibase)); - ci--; - while (ci >= mrb->c->cibase) { - if (ci->proc && !MRB_PROC_CFUNC_P(ci->proc)) { - mrb_irep *irep = ci->proc->body.irep; - - int32_t const line = mrb_debug_get_line(irep, pc - irep->iseq - 1); - char const* file = mrb_debug_get_filename(irep, pc - irep->iseq - 1); - if(line != -1 && file) { - mrb_obj_iv_set(mrb, exc, mrb_intern2(mrb, "file", 4), mrb_str_new_cstr(mrb, file)); - mrb_obj_iv_set(mrb, exc, mrb_intern2(mrb, "line", 4), mrb_fixnum_value(line)); - return; - } - } - pc = ci->pc; - ci--; - } -} - -void -mrb_exc_raise(mrb_state *mrb, mrb_value exc) -{ - mrb->exc = mrb_obj_ptr(exc); - exc_debug_info(mrb, mrb->exc); - if (!mrb->jmp) { - mrb_p(mrb, exc); - abort(); - } - mrb_longjmp(mrb); -} - -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_new3(mrb, c, mesg)); -} - -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_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; -} - -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_new3(mrb, c, mesg)); -} - -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); -} - -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 -} - -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); -} - -int -sysexit_status(mrb_state *mrb, mrb_value err) -{ - mrb_value st = mrb_iv_get(mrb, err, mrb_intern2(mrb, "status", 6)); - return mrb_fixnum(st); -} - -static void -set_backtrace(mrb_state *mrb, mrb_value info, mrb_value bt) -{ - mrb_funcall(mrb, info, "set_backtrace", 1, bt); -} - -mrb_value -make_exception(mrb_state *mrb, int argc, mrb_value *argv, int 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_new3(mrb, E_RUNTIME_ERROR, mesg); - break; - } - } - n = 0; - goto exception_call; - - case 2: - case 3: - n = 1; -exception_call: - { - mrb_sym exc = mrb_intern2(mrb, "exception", 9); - 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_value -mrb_make_exception(mrb_state *mrb, int argc, mrb_value *argv) -{ - return make_exception(mrb, argc, argv, TRUE); -} - -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_value mrb_get_backtrace(mrb_state*, mrb_value); - -void -mrb_init_exception(mrb_state *mrb) -{ - struct RClass *e; - - mrb->eException_class = e = mrb_define_class(mrb, "Exception", mrb->object_class); /* 15.2.22 */ - mrb_define_class_method(mrb, e, "exception", mrb_instance_new, MRB_ARGS_ANY()); - mrb_define_method(mrb, e, "exception", exc_exception, MRB_ARGS_ANY()); - mrb_define_method(mrb, e, "initialize", exc_initialize, MRB_ARGS_ANY()); - mrb_define_method(mrb, e, "==", exc_equal, MRB_ARGS_REQ(1)); - mrb_define_method(mrb, e, "to_s", exc_to_s, MRB_ARGS_NONE()); - mrb_define_method(mrb, e, "message", exc_message, MRB_ARGS_NONE()); - mrb_define_method(mrb, e, "inspect", exc_inspect, MRB_ARGS_NONE()); - mrb_define_method(mrb, e, "backtrace", mrb_get_backtrace, MRB_ARGS_NONE()); - - mrb->eStandardError_class = mrb_define_class(mrb, "StandardError", mrb->eException_class); /* 15.2.23 */ - mrb_define_class(mrb, "RuntimeError", mrb->eStandardError_class); /* 15.2.28 */ - e = mrb_define_class(mrb, "ScriptError", mrb->eException_class); /* 15.2.37 */ - mrb_define_class(mrb, "SyntaxError", e); /* 15.2.38 */ -} Deleted: vendor/mruby-eeac4be/src/error.h (+0 -19) 100644 =================================================================== --- vendor/mruby-eeac4be/src/error.h 2014-06-08 19:01:14 +0900 (5aa4ca3) +++ /dev/null @@ -1,19 +0,0 @@ -/* -** error.h - Exception class -** -** See Copyright Notice in mruby.h -*/ - -#ifndef MRUBY_ERROR_H -#define MRUBY_ERROR_H - -void mrb_sys_fail(mrb_state *mrb, const char *mesg); -int sysexit_status(mrb_state *mrb, mrb_value err); -mrb_value mrb_exc_new3(mrb_state *mrb, struct RClass* c, mrb_value str); -mrb_value make_exception(mrb_state *mrb, int argc, mrb_value *argv, int isstr); -mrb_value mrb_make_exception(mrb_state *mrb, int argc, mrb_value *argv); -mrb_value mrb_format(mrb_state *mrb, const char *format, ...); -void mrb_exc_print(mrb_state *mrb, struct RObject *exc); -void mrb_longjmp(mrb_state *mrb); - -#endif /* MRUBY_ERROR_H */ Deleted: vendor/mruby-eeac4be/src/etc.c (+0 -211) 100644 =================================================================== --- vendor/mruby-eeac4be/src/etc.c 2014-06-08 19:01:14 +0900 (70b22cf) +++ /dev/null @@ -1,211 +0,0 @@ -/* -** etc.c - -** -** See Copyright Notice in mruby.h -*/ - -#include "mruby.h" -#include "mruby/string.h" -#include "error.h" -#include "mruby/numeric.h" -#include "mruby/data.h" -#include "mruby/class.h" - -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 = (mrb_data_type*) type; - - return data; -} - -void -mrb_data_check_type(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) -{ - if (mrb_special_const_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)); - } - } -} - -void * -mrb_data_check_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) -{ - if (mrb_special_const_p(obj) || (mrb_type(obj) != MRB_TT_DATA)) { - return NULL; - } - if (DATA_TYPE(obj) != type) { - return NULL; - } - return DATA_PTR(obj); -} - -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_value -mrb_lastline_get(mrb_state *mrb) -{ - mrb_value *argv; - int argc; - - mrb_get_args(mrb, "*", &argv, &argc); - if (argc < 1) { - return mrb_nil_value(); - } - else - { - return argv[0]; - } -} - -/* ------------------------------------------------ */ -/* - * Calls func(obj, arg, recursive), where recursive is non-zero if the - * current method is called recursively on obj - */ - -mrb_value -mrb_exec_recursive(mrb_state *mrb, mrb_value (*func) (mrb_state *, mrb_value, mrb_value, int), mrb_value obj, void *arg) -{ - return func(mrb, obj, *(mrb_value*)arg, 0); -} - -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: - return mrb_symbol(name); - } - return id; -} - -/* - * call-seq: - * proc { |...| block } -> a_proc - * - * Equivalent to <code>Proc.new</code>. - */ - -mrb_value -mrb_block_proc(void) -{ - return mrb_nil_value(); -} - -static mrb_int -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_int -mrb_obj_id(mrb_value obj) -{ - mrb_int tt = mrb_type(obj); - -#define MakeID2(p,t) (((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(float_id((mrb_float)mrb_fixnum(obj)), MRB_TT_FLOAT); - case MRB_TT_FLOAT: - return MakeID(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_value -mrb_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_value -mrb_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 */ - Deleted: vendor/mruby-eeac4be/src/ext/.gitkeep (+0 -0) 100644 =================================================================== --- vendor/mruby-eeac4be/src/ext/.gitkeep 2014-06-08 19:01:14 +0900 (e69de29) +++ /dev/null Deleted: vendor/mruby-eeac4be/src/gc.c (+0 -1577) 100644 =================================================================== --- vendor/mruby-eeac4be/src/gc.c 2014-06-08 19:01:14 +0900 (16d187e) +++ /dev/null @@ -1,1577 +0,0 @@ -/* -** gc.c - garbage collector for mruby -** -** See Copyright Notice in mruby.h -*/ - -#ifndef SIZE_MAX - /* Some versions of VC++ - * has SIZE_MAX in stdint.h - */ -# include <limits.h> -#endif -#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" - -/* - = Tri-color Incremental Garbage Collection - - mruby's GC is Tri-color Incremental GC with Mark & Sweep. - Algorithm details are omitted. - Instead, the part about the implementation described below. - - == Object's Color - - Each object to 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 fassion: 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 - paint them as White-B, just switch the meaning of White-A and White-B would - 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, C extension library writer must write a write - barrier when writing a pointer to an object on object's field. - Two different write barrier: - - * mrb_field_write_barrier - * mrb_write_barrier - - == 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 paint them to White. The key idea are still same as - the 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 between "tranditional" 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; - } 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 - - -void* -mrb_realloc_simple(mrb_state *mrb, void *p, size_t len) -{ - void *p2; - - p2 = (mrb->allocf)(mrb, p, len, mrb->ud); - if (!p2 && len > 0 && mrb->heaps) { - mrb_full_gc(mrb); - p2 = (mrb->allocf)(mrb, p, len, mrb->ud); - } - - return p2; -} - - -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_raise(mrb, E_RUNTIME_ERROR, "Out of memory"); - } - } - else { - mrb->out_of_memory = FALSE; - } - - return p2; -} - -void* -mrb_malloc(mrb_state *mrb, size_t len) -{ - return mrb_realloc(mrb, 0, len); -} - -void* -mrb_malloc_simple(mrb_state *mrb, size_t len) -{ - return mrb_realloc_simple(mrb, 0, len); -} - -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_realloc(mrb, 0, size); - - if (p) { - memset(p, 0, size); - } - } - else { - p = NULL; - } - - return p; -} - -void -mrb_free(mrb_state *mrb, void *p) -{ - (mrb->allocf)(mrb, p, 0, mrb->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) -{ - if (mrb->arena_idx >= MRB_ARENA_SIZE) { - /* arena overflow error */ - mrb->arena_idx = MRB_ARENA_SIZE - 4; /* force room in arena */ - mrb_raise(mrb, E_RUNTIME_ERROR, "arena overflow error"); - } - mrb->arena[mrb->arena_idx++] = p; -} - -void -mrb_gc_protect(mrb_state *mrb, mrb_value obj) -{ - if (mrb_special_const_p(obj)) return; - gc_protect(mrb, mrb_basic_ptr(obj)); -} - -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_gc_mark_value(mrb, c->stbase[i]); - } -} - -static void -mark_context(mrb_state *mrb, struct mrb_context *c) -{ - size_t i; - size_t e; - mrb_callinfo *ci; - - /* mark stack */ - mark_context_stack(mrb, c); - - /* mark ensure stack */ - e = (c->ci) ? c->ci->eidx : 0; - for (i=0; i<e; i++) { - mrb_gc_mark(mrb, (struct RBasic*)c->ensure[i]); - } - /* mark closure */ - for (ci = c->cibase; ci <= c->ci; ci++) { - if (!ci) continue; - 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); - } - 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: - 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 (e->cioff < 0) { - int i, len; - - len = (int)e->flags; - 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; - - 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; - } -} - -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: - 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 (e->cioff < 0) { - mrb_free(mrb, e->stack); - e->stack = NULL; - } - } - break; - - case MRB_TT_FIBER: - { - struct mrb_context *c = ((struct RFiber*)obj)->cxt; - - mrb_free_context(mrb, c); - } - break; - - case MRB_TT_ARRAY: - if (obj->flags & MRB_ARY_SHARED) - 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_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, j; - - 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_context(mrb, mrb->root_c); - if (mrb->root_c != mrb->c) { - mark_context(mrb, mrb->c); - } - - /* mark irep pool */ - if (mrb->irep) { - size_t len = mrb->irep_len; - if (len > mrb->irep_capa) len = mrb->irep_capa; - for (i=0; i<len; i++) { - mrb_irep *irep = mrb->irep[i]; - if (!irep) continue; - for (j=0; j<irep->plen; j++) { - mrb_gc_mark_value(mrb, irep->pool[j]); - } - } - } -} - -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: - 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; - - /* 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; - int dead_slot = 1; - int 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 = 0; - } - 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_NONE: - 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_NONE; - 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, ~0); - } 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_NONE) - break; - } - - mrb->gc_threshold = mrb->live + GC_STEP_SIZE; -} - -static void -clear_all_old(mrb_state *mrb) -{ - size_t 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_NONE); - } - - /* 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_NONE); - mrb->is_generational_gc_mode = origin_mode; - - /* The gray objects has already been painted as white */ - mrb->atomic_gray_list = mrb->gray_list = NULL; -} - -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_NONE); - } - else { - incremental_gc_step(mrb); - } - - if (mrb->gc_state == GC_STATE_NONE) { - 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 */ -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_NONE) { - /* finish half baked GC cycle */ - incremental_gc_until(mrb, GC_STATE_NONE); - } - - incremental_gc_until(mrb, GC_STATE_NONE); - 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; -} - -void -mrb_garbage_collect(mrb_state *mrb) -{ - mrb_full_gc(mrb); -} - -int -mrb_gc_arena_save(mrb_state *mrb) -{ - return mrb->arena_idx; -} - -void -mrb_gc_arena_restore(mrb_state *mrb, int idx) -{ - mrb->arena_idx = idx; -} - -/* - * Field write barrier - * Paint obj(Black) -> value(White) to obj(Black) -> value(Gray). - */ - -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_NONE); - - 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. - */ - -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_NONE); - 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) -{ - int 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) -{ - int 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_int enable) -{ - if (is_generational(mrb) && !enable) { - clear_all_old(mrb); - mrb_assert(mrb->gc_state == GC_STATE_NONE); - mrb->gc_full = FALSE; - } - else if (!is_generational(mrb) && enable) { - incremental_gc_until(mrb, GC_STATE_NONE); - 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, 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_cstr(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_cstr(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_cstr(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_cstr(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_cstr(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_NONE); - puts(" in GC_STATE_NONE"); - 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_NONE); - - 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_NONE); - - 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_NONE); - - puts(" in major"); - mrb_assert(is_major_gc(mrb)); - do { - mrb_incremental_gc(mrb); - } while (mrb->gc_state != GC_STATE_NONE); - 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 -#endif Deleted: vendor/mruby-eeac4be/src/hash.c (+0 -1261) 100644 =================================================================== --- vendor/mruby-eeac4be/src/hash.c 2014-06-08 19:01:14 +0900 (3684b3b) +++ /dev/null @@ -1,1261 +0,0 @@ -/* -** 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" - -static inline khint_t -mrb_hash_ht_hash_func(mrb_state *mrb, mrb_value key) -{ - khint_t h = (khint_t)mrb_type(key) << 24; - mrb_value h2; - - h2 = mrb_funcall(mrb, key, "hash", 0, 0); - h ^= h2.value.i; - return h; -} - -static inline khint_t -mrb_hash_ht_hash_equal(mrb_state *mrb, mrb_value a, mrb_value b) -{ - return mrb_eql(mrb, a, b); -} - -KHASH_DECLARE(ht, mrb_value, mrb_value, 1) -KHASH_DEFINE (ht, mrb_value, mrb_value, 1, 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); - - 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, hash->ht); -} - - -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, h->ht, capa); - } - h->iv = 0; - return mrb_obj_value(h); -} - -mrb_value -mrb_hash_new(mrb_state *mrb) -{ - return mrb_hash_new_capa(mrb, 0); -} - -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, h, key); - if (k != kh_end(h)) - return kh_value(h, k); - } - - /* not found */ - if (MRB_RHASH_PROCDEFAULT_P(hash)) { - return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, key); - } - return RHASH_IFNONE(hash); -} - -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, h, key); - if (k != kh_end(h)) - return kh_value(h, k); - } - - /* not found */ - return def; -} - -void -mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val) /* mrb_hash_aset */ -{ - khash_t(ht) *h; - khiter_t k; - - mrb_hash_modify(mrb, hash); - h = RHASH_TBL(hash); - - if (!h) h = RHASH_TBL(hash) = kh_init(ht, mrb); - k = kh_get(ht, h, key); - if (k == kh_end(h)) { - /* expand */ - int ai = mrb_gc_arena_save(mrb); - k = kh_put(ht, h, KEY(key)); - mrb_gc_arena_restore(mrb, ai); - } - - kh_value(h, k) = val; - mrb_write_barrier(mrb, (struct RBasic*)RHASH(hash)); - return; -} - -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, 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_value -mrb_check_hash_type(mrb_state *mrb, mrb_value hash) -{ - return mrb_check_convert_type(mrb, hash, MRB_TT_HASH, "Hash", "to_hash"); -} - -khash_t(ht) * -mrb_hash_tbl(mrb_state *mrb, mrb_value hash) -{ - khash_t(ht) *h = RHASH_TBL(hash); - - if (!h) { - 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_core(mrb_state *mrb, mrb_value hash) -{ - mrb_value block, ifnone; - mrb_value *argv; - int argc; - - mrb_get_args(mrb, "o*", &block, &argv, &argc); - mrb_hash_modify(mrb, hash); - if (mrb_nil_p(block)) { - if (argc > 0) { - if (argc != 1) mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); - ifnone = argv[0]; - } - else { - ifnone = mrb_nil_value(); - } - } - else { - if (argc > 0) { - 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_intern2(mrb, "ifnone", 6), ifnone); - return hash; -} - -/* - * call-seq: - * Hash[ key, value, ... ] -> new_hash - * Hash[ [ [key, value], ... ] ] -> new_hash - * Hash[ object ] -> new_hash - * - * Creates a new hash populated with the given objects. Equivalent to - * the literal <code>{ <i>key</i> => <i>value</i>, ... }</code>. In the first - * form, keys and values occur in pairs, so there must be an even number of arguments. - * The second and third form take a single argument which is either - * an array of key-value pairs or an object convertible to a hash. - * - * Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200} - * Hash[ [ ["a", 100], ["b", 200] ] ] #=> {"a"=>100, "b"=>200} - * Hash["a" => 100, "b" => 200] #=> {"a"=>100, "b"=>200} - */ - -static mrb_value -to_hash(mrb_state *mrb, mrb_value hash) -{ - return mrb_convert_type(mrb, hash, MRB_TT_HASH, "Hash", "to_hash"); -} - -/* - * call-seq: - * Hash.try_convert(obj) -> hash or nil - * - * Try to convert <i>obj</i> into a hash, using to_hash method. - * Returns converted hash or nil if <i>obj</i> cannot be converted - * for any reason. - * - * Hash.try_convert({1=>2}) # => {1=>2} - * Hash.try_convert("1=>2") # => nil - */ - -/* 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 - * - */ -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); -} - -/* - * call-seq: - * hsh.fetch(key [, default] ) -> obj - * hsh.fetch(key) {| key | block } -> obj - * - * Returns a value from the hash for the given key. If the key can't be - * found, there are several options: With no other arguments, it will - * raise an <code>KeyError</code> exception; if <i>default</i> is - * given, then that will be returned; if the optional code block is - * specified, then that will be run and its result returned. - * - * h = { "a" => 100, "b" => 200 } - * h.fetch("a") #=> 100 - * h.fetch("z", "go fish") #=> "go fish" - * h.fetch("z") { |el| "go fish, #{el}"} #=> "go fish, z" - * - * The following example shows that an exception is raised if the key - * is not found and a default value is not supplied. - * - * h = { "a" => 100, "b" => 200 } - * h.fetch("z") - * - * <em>produces:</em> - * - * prog.rb:2:in `fetch': key not found (KeyError) - * from prog.rb:2 - * - */ - -/* 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 *argv; - int argc; - mrb_value key; - - mrb_get_args(mrb, "*", &argv, &argc); - if (MRB_RHASH_PROCDEFAULT_P(hash)) { - if (argc == 0) return mrb_nil_value(); - key = argv[0]; - 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_intern2(mrb, "ifnone", 6), 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_intern2(mrb, "ifnone", 6), ifnone); - RHASH(hash)->flags |= MRB_HASH_PROC_DEFAULT; - - return ifnone; -} - -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; - - if (h) { - k = kh_get(ht, h, key); - if (k != kh_end(h)) { - delVal = kh_value(h, k); - kh_del(ht, h, k); - 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" - * - */ -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) { - if (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); - } -} - -/* - * call-seq: - * hsh.delete_if {| key, value | block } -> hsh - * hsh.delete_if -> an_enumerator - * - * Deletes every key-value pair from <i>hsh</i> for which <i>block</i> - * evaluates to <code>true</code>. - * - * If no block is given, an enumerator is returned instead. - * - * h = { "a" => 100, "b" => 200, "c" => 300 } - * h.delete_if {|key, value| key >= "b" } #=> {"a"=>100} - * - */ - -/* - * call-seq: - * hsh.reject! {| key, value | block } -> hsh or nil - * hsh.reject! -> an_enumerator - * - * Equivalent to <code>Hash#delete_if</code>, but returns - * <code>nil</code> if no changes were made. - */ - -/* - * call-seq: - * hsh.reject {| key, value | block } -> a_hash - * - * Same as <code>Hash#delete_if</code>, but works on (and returns) a - * copy of the <i>hsh</i>. Equivalent to - * <code><i>hsh</i>.dup.delete_if</code>. - * - */ - -/* - * call-seq: - * hsh.select {|key, value| block} -> a_hash - * hsh.select -> an_enumerator - * - * Returns a new hash consisting of entries for which the block returns true. - * - * If no block is given, an enumerator is returned instead. - * - * h = { "a" => 100, "b" => 200, "c" => 300 } - * h.select {|k,v| k > "a"} #=> {"b" => 200, "c" => 300} - * h.select {|k,v| v < 200} #=> {"a" => 100} - */ - -/* - * call-seq: - * hsh.select! {| key, value | block } -> hsh or nil - * hsh.select! -> an_enumerator - * - * Equivalent to <code>Hash#keep_if</code>, but returns - * <code>nil</code> if no changes were made. - */ - -/* - * call-seq: - * hsh.keep_if {| key, value | block } -> hsh - * hsh.keep_if -> an_enumerator - * - * Deletes every key-value pair from <i>hsh</i> for which <i>block</i> - * evaluates to false. - * - * If no block is given, an enumerator is returned instead. - * - */ - -/* 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_value -mrb_hash_clear(mrb_state *mrb, mrb_value hash) -{ - khash_t(ht) *h = RHASH_TBL(hash); - - if (h) kh_clear(ht, 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} - * - */ -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.17 */ -/* 15.2.13.4.23 */ -/* - * call-seq: - * hsh.replace(other_hash) -> hsh - * - * Replaces the contents of <i>hsh</i> with the contents of - * <i>other_hash</i>. - * - * h = { "a" => 100, "b" => 200 } - * h.replace({ "c" => 300, "d" => 400 }) #=> {"c"=>300, "d"=>400} - * - */ - -static mrb_value -mrb_hash_replace(mrb_state *mrb, mrb_value hash) -{ - mrb_value hash2, ifnone; - khash_t(ht) *h2; - khiter_t k; - - mrb_get_args(mrb, "o", &hash2); - hash2 = to_hash(mrb, hash2); - if (mrb_obj_equal(mrb, hash, hash2)) return hash; - mrb_hash_clear(mrb, hash); - - h2 = RHASH_TBL(hash2); - if (h2) { - for (k = kh_begin(h2); k != kh_end(h2); k++) { - if (kh_exist(h2, k)) - mrb_hash_set(mrb, hash, kh_key(h2, k), kh_value(h2, k)); - } - } - - if (MRB_RHASH_PROCDEFAULT_P(hash2)) { - RHASH(hash)->flags |= MRB_HASH_PROC_DEFAULT; - ifnone = RHASH_PROCDEFAULT(hash2); - } - else { - ifnone = RHASH_IFNONE(hash2); - } - mrb_iv_set(mrb, hash, mrb_intern2(mrb, "ifnone", 6), ifnone); - - return hash; -} - -/* 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_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(); -} - -static mrb_value -inspect_hash(mrb_state *mrb, mrb_value hash, int recur) -{ - mrb_value str, str2; - khash_t(ht) *h = RHASH_TBL(hash); - khiter_t k; - - if (recur) return mrb_str_new(mrb, "{...}", 5); - - str = mrb_str_new(mrb, "{", 1); - if (h && kh_size(h) > 0) { - for (k = kh_begin(h); k != kh_end(h); k++) { - int ai; - - if (!kh_exist(h,k)) continue; - - ai = mrb_gc_arena_save(mrb); - - if (RSTRING_LEN(str) > 1) mrb_str_cat(mrb, str, ", ", 2); - - str2 = mrb_inspect(mrb, kh_key(h,k)); - mrb_str_append(mrb, str, str2); - mrb_str_buf_cat(mrb, str, "=>", 2); - str2 = mrb_inspect(mrb, kh_value(h,k)); - mrb_str_append(mrb, str, str2); - - mrb_gc_arena_restore(mrb, ai); - } - } - mrb_str_buf_cat(mrb, str, "}", 1); - - return str; -} - -/* 15.2.13.4.30 (x)*/ -/* - * call-seq: - * hsh.to_s -> string - * hsh.inspect -> string - * - * Return the contents of this hash as a string. - * - * h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300 } - * h.to_s #=> "{\"c\"=>300, \"a\"=>100, \"d\"=>400}" - */ - -static mrb_value -mrb_hash_inspect(mrb_state *mrb, mrb_value hash) -{ - khash_t(ht) *h = RHASH_TBL(hash); - - if (!h || kh_size(h) == 0) - return mrb_str_new(mrb, "{}", 2); - return inspect_hash(mrb, hash, 0); -} - -/* 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_value -mrb_hash_keys(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_value v = kh_key(h,k); - mrb_ary_push(mrb, ary, v); - } - } - 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_value v = kh_value(h,k); - mrb_ary_push(mrb, ary, v); - } - } - return ary; -} - -static mrb_value -mrb_hash_has_keyWithKey(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, h, key); - return mrb_bool_value(k != kh_end(h)); - } - return mrb_false_value(); -} - -/* 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; - - mrb_get_args(mrb, "o", &key); - return mrb_hash_has_keyWithKey(mrb, hash, key); -} - -static mrb_value -mrb_hash_has_valueWithvalue(mrb_state *mrb, mrb_value hash, mrb_value value) -{ - khash_t(ht) *h = RHASH_TBL(hash); - khiter_t k; - - 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), value)) { - return mrb_true_value(); - } - } - } - - 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; - - mrb_get_args(mrb, "o", &val); - return mrb_hash_has_valueWithvalue(mrb, hash, val); -} - -static mrb_value -hash_equal(mrb_state *mrb, mrb_value hash1, mrb_value hash2, int eql) -{ - khash_t(ht) *h1, *h2; - - if (mrb_obj_equal(mrb, hash1, hash2)) return mrb_true_value(); - if (!mrb_hash_p(hash2)) { - if (!mrb_respond_to(mrb, hash2, mrb_intern2(mrb, "to_hash", 7))) { - return mrb_false_value(); - } - if (eql) - return mrb_fixnum_value(mrb_eql(mrb, hash2, hash1)); - else - return mrb_fixnum_value(mrb_equal(mrb, hash2, hash1)); - } - h1 = RHASH_TBL(hash1); - h2 = RHASH_TBL(hash2); - if (!h1) { - return mrb_bool_value(!h2); - } - if (!h2) return mrb_false_value(); - if (kh_size(h1) != kh_size(h2)) return mrb_false_value(); - else { - khiter_t k1, k2; - mrb_value key; - - for (k1 = kh_begin(h1); k1 != kh_end(h1); k1++) { - if (!kh_exist(h1, k1)) continue; - key = kh_key(h1,k1); - k2 = kh_get(ht, h2, key); - if (k2 != kh_end(h2)) { - if (mrb_equal(mrb, kh_value(h1,k1), kh_value(h2,k2))) { - continue; /* next key */ - } - } - return mrb_false_value(); - } - } - return mrb_true_value(); -} - -/* 15.2.13.4.1 */ -/* - * call-seq: - * hsh == other_hash -> true or false - * - * Equality---Two hashes are equal if they each contain the same number - * of keys and if each key-value pair is equal to (according to - * <code>Object#==</code>) the corresponding elements in the other - * hash. - * - * h1 = { "a" => 1, "c" => 2 } - * h2 = { 7 => 35, "c" => 2, "a" => 1 } - * h3 = { "a" => 1, "c" => 2, 7 => 35 } - * h4 = { "a" => 1, "d" => 2, "f" => 35 } - * h1 == h2 #=> false - * h2 == h3 #=> true - * h3 == h4 #=> false - * - */ - -static mrb_value -mrb_hash_equal(mrb_state *mrb, mrb_value hash1) -{ - mrb_value hash2; - - mrb_get_args(mrb, "o", &hash2); - return hash_equal(mrb, hash1, hash2, FALSE); -} - -/* 15.2.13.4.32 (x)*/ -/* - * call-seq: - * hash.eql?(other) -> true or false - * - * Returns <code>true</code> if <i>hash</i> and <i>other</i> are - * both hashes with the same content. - */ - -static mrb_value -mrb_hash_eql(mrb_state *mrb, mrb_value hash1) -{ - mrb_value hash2; - - mrb_get_args(mrb, "o", &hash2); - return hash_equal(mrb, hash1, hash2, TRUE); -} - -/* - * call-seq: - * hsh.merge!(other_hash) -> hsh - * hsh.update(other_hash) -> hsh - * hsh.merge!(other_hash){|key, oldval, newval| block} -> hsh - * hsh.update(other_hash){|key, oldval, newval| block} -> hsh - * - * Adds the contents of <i>other_hash</i> to <i>hsh</i>. If no - * block is specified, entries with duplicate keys are overwritten - * with the values from <i>other_hash</i>, otherwise the value - * of each duplicate key is determined by calling the block with - * the key, its value in <i>hsh</i> and its value in <i>other_hash</i>. - * - * h1 = { "a" => 100, "b" => 200 } - * h2 = { "b" => 254, "c" => 300 } - * h1.merge!(h2) #=> {"a"=>100, "b"=>254, "c"=>300} - * - * h1 = { "a" => 100, "b" => 200 } - * h2 = { "b" => 254, "c" => 300 } - * h1.merge!(h2) { |key, v1, v2| v1 } - * #=> {"a"=>100, "b"=>200, "c"=>300} - */ - -/* 15.2.13.4.22 */ -/* - * call-seq: - * hsh.merge(other_hash) -> new_hash - * hsh.merge(other_hash){|key, oldval, newval| block} -> new_hash - * - * Returns a new hash containing the contents of <i>other_hash</i> and - * the contents of <i>hsh</i>. If no block is specified, the value for - * entries with duplicate keys will be that of <i>other_hash</i>. Otherwise - * the value for each duplicate key is determined by calling the block - * with the key, its value in <i>hsh</i> and its value in <i>other_hash</i>. - * - * h1 = { "a" => 100, "b" => 200 } - * h2 = { "b" => 254, "c" => 300 } - * h1.merge(h2) #=> {"a"=>100, "b"=>254, "c"=>300} - * h1.merge(h2){|key, oldval, newval| newval - oldval} - * #=> {"a"=>100, "b"=>54, "c"=>300} - * h1 #=> {"a"=>100, "b"=>200} - * - */ - -/* - * call-seq: - * hash.assoc(obj) -> an_array or nil - * - * Searches through the hash comparing _obj_ with the key using <code>==</code>. - * Returns the key-value pair (two elements array) or +nil+ - * if no match is found. See <code>Array#assoc</code>. - * - * h = {"colors" => ["red", "blue", "green"], - * "letters" => ["a", "b", "c" ]} - * h.assoc("letters") #=> ["letters", ["a", "b", "c"]] - * h.assoc("foo") #=> nil - */ - -mrb_value -mrb_hash_assoc(mrb_state *mrb, mrb_value hash) -{ - mrb_value key, value, has_key; - - mrb_get_args(mrb, "o", &key); - if (mrb_nil_p(key)) - mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); - - has_key = mrb_hash_has_keyWithKey(mrb, hash, key); - if (mrb_test(has_key)) { - value = mrb_hash_get(mrb, hash, key); - return mrb_assoc_new(mrb, key, value); - } - else { - return mrb_nil_value(); - } -} - -/* - * call-seq: - * hash.rassoc(key) -> an_array or nil - * - * Searches through the hash comparing _obj_ with the value using <code>==</code>. - * Returns the first key-value pair (two-element array) that matches. See - * also <code>Array#rassoc</code>. - * - * a = {1=> "one", 2 => "two", 3 => "three", "ii" => "two"} - * a.rassoc("two") #=> [2, "two"] - * a.rassoc("four") #=> nil - */ - -mrb_value -mrb_hash_rassoc(mrb_state *mrb, mrb_value hash) -{ - mrb_value key, value, has_key; - - mrb_get_args(mrb, "o", &key); - has_key = mrb_hash_has_keyWithKey(mrb, hash, key); - if (mrb_test(has_key)) { - value = mrb_hash_get(mrb, hash, key); - return mrb_assoc_new(mrb, value, key); - } - else { - return mrb_nil_value(); - } -} - -/* - * call-seq: - * hash.flatten -> an_array - * hash.flatten(level) -> an_array - * - * Returns a new array that is a one-dimensional flattening of this - * hash. That is, for every key or value that is an array, extract - * its elements into the new array. Unlike Array#flatten, this - * method does not flatten recursively by default. The optional - * <i>level</i> argument determines the level of recursion to flatten. - * - * a = {1=> "one", 2 => [2,"two"], 3 => "three"} - * a.flatten # => [1, "one", 2, [2, "two"], 3, "three"] - * a.flatten(2) # => [1, "one", 2, 2, "two", 3, "three"] - */ - -/* - * A <code>Hash</code> is a collection of key-value pairs. It is - * similar to an <code>Array</code>, except that indexing is done via - * arbitrary keys of any object type, not an integer index. Hashes enumerate - * their values in the order that the corresponding keys were inserted. - * - * Hashes have a <em>default value</em> that is returned when accessing - * keys that do not exist in the hash. By default, that value is - * <code>nil</code>. - * - */ - -void -mrb_init_hash(mrb_state *mrb) -{ - struct RClass *h; - - h = mrb->hash_class = mrb_define_class(mrb, "Hash", mrb->object_class); - MRB_SET_INSTANCE_TT(h, MRB_TT_HASH); - - mrb_include_module(mrb, h, mrb_class_get(mrb, "Enumerable")); - mrb_define_method(mrb, h, "==", mrb_hash_equal, MRB_ARGS_REQ(1)); /* 15.2.13.4.1 */ - 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, "__init_core", mrb_hash_init_core, MRB_ARGS_ANY()); /* core of 15.2.13.4.16 */ - mrb_define_method(mrb, h, "initialize_copy", mrb_hash_replace, MRB_ARGS_REQ(1)); /* 15.2.13.4.17 */ - 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, "replace", mrb_hash_replace, MRB_ARGS_REQ(1)); /* 15.2.13.4.23 */ - mrb_define_method(mrb, h, "shift", mrb_hash_shift, MRB_ARGS_NONE()); /* 15.2.13.4.24 */ - 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)*/ - mrb_define_method(mrb, h, "inspect", mrb_hash_inspect, MRB_ARGS_NONE()); /* 15.2.13.4.30 (x)*/ - mrb_define_alias(mrb, h, "to_s", "inspect"); /* 15.2.13.4.31 (x)*/ - mrb_define_method(mrb, h, "eql?", mrb_hash_eql, MRB_ARGS_REQ(1)); /* 15.2.13.4.32 (x)*/ -} Deleted: vendor/mruby-eeac4be/src/init.c (+0 -62) 100644 =================================================================== --- vendor/mruby-eeac4be/src/init.c 2014-06-08 19:01:14 +0900 (e97c72d) +++ /dev/null @@ -1,62 +0,0 @@ -/* -** 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_mrblib(mrb_state*); -void mrb_init_mrbgems(mrb_state*); -void mrb_final_mrbgems(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_mrblib(mrb); DONE; -#ifndef DISABLE_GEMS - mrb_init_mrbgems(mrb); DONE; -#endif -} - -void -mrb_final_core(mrb_state *mrb) -{ -#ifndef DISABLE_GEMS - mrb_final_mrbgems(mrb); DONE; -#endif -} Deleted: vendor/mruby-eeac4be/src/kernel.c (+0 -1133) 100644 =================================================================== --- vendor/mruby-eeac4be/src/kernel.c 2014-06-08 19:01:14 +0900 (bd58078) +++ /dev/null @@ -1,1133 +0,0 @@ -/* -** 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 "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; - -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_intern2(mrb, "to_s", 4)); - if (me && 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_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_bool eql_p; - - mrb_get_args(mrb, "o", &arg); - eql_p = mrb_obj_equal(mrb, self, arg); - - return mrb_bool_value(eql_p); -} - -static mrb_value -mrb_obj_not_equal_m(mrb_state *mrb, mrb_value self) -{ - mrb_value arg; - mrb_bool eql_p; - - mrb_get_args(mrb, "o", &arg); - eql_p = mrb_equal(mrb, self, arg); - - return mrb_bool_value(!eql_p); -} - -/* 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_bool equal_p; - - mrb_get_args(mrb, "o", &arg); - equal_p = mrb_equal(mrb, self, arg); - - return mrb_bool_value(equal_p); -} - -/* 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.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" - */ -static mrb_value -mrb_f_send(mrb_state *mrb, mrb_value self) -{ - mrb_sym name; - mrb_value block, *argv; - int argc; - - mrb_get_args(mrb, "n*&", &name, &argv, &argc, &block); - return mrb_funcall_with_block(mrb,self, name, argc, argv, block); -} - -/* 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 = mrb->c->stbase + ci->stackidx + 1; - ci--; - if (ci <= mrb->c->cibase) { - given_p = 0; - } - 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)); -} - -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_intern2(mrb, "__attached__", 12), 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 -init_copy(mrb_state *mrb, mrb_value dest, 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: - 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_value -mrb_obj_clone(mrb_state *mrb, mrb_value self) -{ - struct RObject *p; - mrb_value clone; - - if (mrb_special_const_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_value -mrb_obj_dup(mrb_state *mrb, mrb_value obj) -{ - struct RBasic *p; - mrb_value dup; - - if (mrb_special_const_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, int argc, mrb_value *argv, mrb_value obj) -{ - 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" - */ -mrb_value -mrb_obj_extend_m(mrb_state *mrb, mrb_value self) -{ - mrb_value *argv; - 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_value -mrb_obj_hash(mrb_state *mrb, mrb_value self) -{ - return mrb_fixnum_value(mrb_obj_id(self)); -} - -/* 15.3.1.3.16 */ -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; -} - -mrb_value mrb_yield_internal(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv, mrb_value self, struct RClass *c); - -/* 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 mrb_yield_internal(mrb, b, 0, 0, self, c); -} - -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_bool instance_of_p; - - mrb_get_args(mrb, "o", &arg); - instance_of_p = mrb_obj_is_instance_of(mrb, self, mrb_class_ptr(arg)); - - return mrb_bool_value(instance_of_p); -} - -static void -valid_iv_name(mrb_state *mrb, mrb_sym iv_name_id, const char* s, size_t len) -{ - if (len < 2 || !(s[0] == '@' && s[1] != '@')) { - mrb_name_error(mrb, iv_name_id, "`%S' is not allowed as an instance variable name", mrb_sym2str(mrb, iv_name_id)); - } -} - -static void -check_iv_name(mrb_state *mrb, mrb_sym iv_name_id) -{ - const char *s; - size_t len; - - s = mrb_sym2name_len(mrb, iv_name_id, &len); - valid_iv_name(mrb, iv_name_id, s, len); -} - -static mrb_sym -get_valid_iv_sym(mrb_state *mrb, mrb_value iv_name) -{ - mrb_sym iv_name_id; - - mrb_assert(mrb_symbol_p(iv_name) || mrb_string_p(iv_name)); - - if (mrb_string_p(iv_name)) { - iv_name_id = mrb_intern_cstr(mrb, RSTRING_PTR(iv_name)); - valid_iv_name(mrb, iv_name_id, RSTRING_PTR(iv_name), RSTRING_LEN(iv_name)); - } - else { - iv_name_id = mrb_symbol(iv_name); - check_iv_name(mrb, iv_name_id); - } - - return iv_name_id; -} - -/* 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 - */ -mrb_value -mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self) -{ - mrb_sym mid; - mrb_value sym; - mrb_bool defined_p; - - mrb_get_args(mrb, "o", &sym); - mid = get_valid_iv_sym(mrb, sym); - defined_p = mrb_obj_iv_defined(mrb, mrb_obj_ptr(self), mid); - - return mrb_bool_value(defined_p); -} - -/* 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 - */ -mrb_value -mrb_obj_ivar_get(mrb_state *mrb, mrb_value self) -{ - mrb_sym iv_name_id; - mrb_value iv_name; - - mrb_get_args(mrb, "o", &iv_name); - - iv_name_id = get_valid_iv_sym(mrb, iv_name); - return mrb_iv_get(mrb, self, iv_name_id); -} - -/* 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\">" - */ -mrb_value -mrb_obj_ivar_set(mrb_state *mrb, mrb_value self) -{ - mrb_sym iv_name_id; - mrb_value iv_name, val; - - mrb_get_args(mrb, "oo", &iv_name, &val); - - iv_name_id = get_valid_iv_sym(mrb, iv_name); - mrb_iv_set(mrb, self, iv_name_id, 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 - */ -mrb_value -mrb_obj_is_kind_of_m(mrb_state *mrb, mrb_value self) -{ - mrb_value arg; - mrb_bool kind_of_p; - - mrb_get_args(mrb, "o", &arg); - kind_of_p = mrb_obj_is_kind_of(mrb, self, mrb_class_ptr(arg)); - - return mrb_bool_value(kind_of_p); -} - -static void -method_entry_loop(mrb_state *mrb, struct RClass* klass, mrb_value ary) -{ - 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)) { - mrb_ary_push(mrb, ary, mrb_symbol_value(kh_key(h,i))); - } - } -} - -mrb_value -class_instance_method_list(mrb_state *mrb, mrb_bool recur, struct RClass* klass, int obj) -{ - mrb_value ary; - struct RClass* oldklass; - - ary = mrb_ary_new(mrb); - oldklass = 0; - while (klass && (klass != oldklass)) { - method_entry_loop(mrb, klass, ary); - if ((klass->tt == MRB_TT_ICLASS) || - (klass->tt == MRB_TT_SCLASS)) { - } - else { - if (!recur) break; - } - oldklass = klass; - klass = klass->super; - } - - return ary; -} - -mrb_value -mrb_obj_singleton_methods(mrb_state *mrb, mrb_bool recur, mrb_value obj) -{ - mrb_value ary; - struct RClass* klass; - - klass = mrb_class(mrb, obj); - ary = mrb_ary_new(mrb); - if (klass && (klass->tt == MRB_TT_SCLASS)) { - method_entry_loop(mrb, klass, ary); - klass = klass->super; - } - if (recur) { - while (klass && ((klass->tt == MRB_TT_SCLASS) || (klass->tt == MRB_TT_ICLASS))) { - method_entry_loop(mrb, klass, ary); - klass = klass->super; - } - } - - return ary; -} - -mrb_value -mrb_obj_methods(mrb_state *mrb, mrb_bool recur, mrb_value obj, mrb_method_flag_t flag) -{ - if (recur) - return class_instance_method_list(mrb, recur, mrb_class(mrb, obj), 0); - else - 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 - */ -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>. - */ -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. - */ -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. - */ -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. - */ -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_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_intern2(mrb, "lastpc", 6), 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 - */ -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); - check_iv_name(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. - */ -mrb_value -obj_respond_to(mrb_state *mrb, mrb_value self) -{ - mrb_value *argv; - int argc; - mrb_value mid, priv; - mrb_sym id, rtm_id; - mrb_bool respond_to_p = TRUE; - - mrb_get_args(mrb, "*", &argv, &argc); - mid = argv[0]; - if (argc > 1) priv = argv[1]; - else priv = mrb_nil_value(); - - 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, !mrb_test(priv)); - } - - if (!respond_to_p) { - rtm_id = mrb_intern2(mrb, "respond_to_missing?", 19); - if (basic_obj_respond_to(mrb, self, rtm_id, !mrb_test(priv))) { - return mrb_funcall_argv(mrb, self, rtm_id, argc, argv); - } - } - 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] - */ -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); -} - -void -mrb_init_kernel(mrb_state *mrb) -{ - struct RClass *krn; - - krn = mrb->kernel_module = mrb_define_module(mrb, "Kernel"); - 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 */ -; /* 15.3.1.2.11 */ - mrb_define_class_method(mrb, krn, "raise", mrb_f_raise, MRB_ARGS_ANY()); /* 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, "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, "to_s", mrb_any_to_s, MRB_ARGS_NONE()); /* 15.3.1.3.46 */ - - mrb_include_module(mrb, mrb->object_class, mrb->kernel_module); - mrb_alias_method(mrb, mrb->module_class, mrb_intern2(mrb, "dup", 3), mrb_intern2(mrb, "clone", 5)); -} Deleted: vendor/mruby-eeac4be/src/keywords (+0 -50) 100644 =================================================================== --- vendor/mruby-eeac4be/src/keywords 2014-06-08 19:01:14 +0900 (9cb8660) +++ /dev/null @@ -1,50 +0,0 @@ -%{ -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) -%} - -struct kwtable; -%% -__ENCODING__, {keyword__ENCODING__, keyword__ENCODING__}, EXPR_END -__FILE__, {keyword__FILE__, keyword__FILE__}, EXPR_END -__LINE__, {keyword__LINE__, keyword__LINE__}, EXPR_END -BEGIN, {keyword_BEGIN, keyword_BEGIN}, EXPR_END -END, {keyword_END, keyword_END}, EXPR_END -alias, {keyword_alias, keyword_alias}, EXPR_FNAME -and, {keyword_and, keyword_and}, EXPR_VALUE -begin, {keyword_begin, keyword_begin}, EXPR_BEG -break, {keyword_break, keyword_break}, EXPR_MID -case, {keyword_case, keyword_case}, EXPR_VALUE -class, {keyword_class, keyword_class}, EXPR_CLASS -def, {keyword_def, keyword_def}, EXPR_FNAME -do, {keyword_do, keyword_do}, EXPR_BEG -else, {keyword_else, keyword_else}, EXPR_BEG -elsif, {keyword_elsif, keyword_elsif}, EXPR_VALUE -end, {keyword_end, keyword_end}, EXPR_END -ensure, {keyword_ensure, keyword_ensure}, EXPR_BEG -false, {keyword_false, keyword_false}, EXPR_END -for, {keyword_for, keyword_for}, EXPR_VALUE -if, {keyword_if, modifier_if}, EXPR_VALUE -in, {keyword_in, keyword_in}, EXPR_VALUE -module, {keyword_module, keyword_module}, EXPR_VALUE -next, {keyword_next, keyword_next}, EXPR_MID -nil, {keyword_nil, keyword_nil}, EXPR_END -not, {keyword_not, keyword_not}, EXPR_ARG -or, {keyword_or, keyword_or}, EXPR_VALUE -redo, {keyword_redo, keyword_redo}, EXPR_END -rescue, {keyword_rescue, modifier_rescue}, EXPR_MID -retry, {keyword_retry, keyword_retry}, EXPR_END -return, {keyword_return, keyword_return}, EXPR_MID -self, {keyword_self, keyword_self}, EXPR_END -super, {keyword_super, keyword_super}, EXPR_ARG -then, {keyword_then, keyword_then}, EXPR_BEG -true, {keyword_true, keyword_true}, EXPR_END -undef, {keyword_undef, keyword_undef}, EXPR_FNAME -unless, {keyword_unless, modifier_unless}, EXPR_VALUE -until, {keyword_until, modifier_until}, EXPR_VALUE -when, {keyword_when, keyword_when}, EXPR_VALUE -while, {keyword_while, modifier_while}, EXPR_VALUE -yield, {keyword_yield, keyword_yield}, EXPR_ARG -%% Deleted: vendor/mruby-eeac4be/src/lex.def (+0 -212) 100644 =================================================================== --- vendor/mruby-eeac4be/src/lex.def 2014-06-08 19:01:14 +0900 (ea456a8) +++ /dev/null @@ -1,212 +0,0 @@ -/* 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" - Deleted: vendor/mruby-eeac4be/src/load.c (+0 -765) 100644 =================================================================== --- vendor/mruby-eeac4be/src/load.c 2014-06-08 19:01:14 +0900 (e2f74d5) +++ /dev/null @@ -1,765 +0,0 @@ -/* -** load.c - mruby binary loader -** -** See Copyright Notice in mruby.h -*/ - -#ifndef SIZE_MAX - /* Some versions of VC++ - * has SIZE_MAX in stdint.h - */ -# include <limits.h> -#endif -#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" - -#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 CHAR_BIT != 8 -# error This code assumes CHAR_BIT == 8 -#endif - -static void -irep_free(size_t sirep, mrb_state *mrb) -{ - size_t i; - void *p; - - for (i = sirep; i < mrb->irep_len; i++) { - if (mrb->irep[i]) { - p = mrb->irep[i]->iseq; - if (p) - mrb_free(mrb, p); - - p = mrb->irep[i]->pool; - if (p) - mrb_free(mrb, p); - - p = mrb->irep[i]->syms; - if (p) - mrb_free(mrb, p); - - mrb_free(mrb, mrb->irep[i]); - } - } -} - -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 int -read_rite_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len) -{ - int ret; - size_t i; - const uint8_t *src = bin; - 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); - - // Binary Data Section - // ISEQ BLOCK - irep->ilen = bin_to_uint32(src); - src += sizeof(uint32_t); - if (irep->ilen > 0) { - if (SIZE_ERROR_MUL(sizeof(mrb_code), irep->ilen)) { - ret = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } - irep->iseq = (mrb_code *)mrb_malloc(mrb, sizeof(mrb_code) * irep->ilen); - if (irep->iseq == NULL) { - ret = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } - for (i = 0; i < irep->ilen; i++) { - irep->iseq[i] = bin_to_uint32(src); //iseq - src += sizeof(uint32_t); - } - } - - //POOL BLOCK - plen = bin_to_uint32(src); /* number of pool */ - src += sizeof(uint32_t); - if (plen > 0) { - if (SIZE_ERROR_MUL(sizeof(mrb_value), plen)) { - ret = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } - irep->pool = (mrb_value *)mrb_malloc(mrb, sizeof(mrb_value) * plen); - if (irep->pool == NULL) { - ret = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } - - 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); - s = mrb_str_new(mrb, (char *)src, pool_data_len); - src += pool_data_len; - switch (tt) { //pool data - case MRB_TT_FIXNUM: - irep->pool[i] = mrb_str_to_inum(mrb, s, 10, FALSE); - break; - - case MRB_TT_FLOAT: - irep->pool[i] = mrb_float_value(mrb, mrb_str_to_dbl(mrb, s, FALSE)); - break; - - case MRB_TT_STRING: - irep->pool[i] = s; - break; - - default: - irep->pool[i] = mrb_nil_value(); - break; - } - irep->plen++; - mrb_gc_arena_restore(mrb, ai); - } - } - - //SYMS BLOCK - irep->slen = bin_to_uint32(src); //syms length - src += sizeof(uint32_t); - if (irep->slen > 0) { - if (SIZE_ERROR_MUL(sizeof(mrb_sym), irep->slen)) { - ret = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } - irep->syms = (mrb_sym *)mrb_malloc(mrb, sizeof(mrb_sym) * irep->slen); - if (irep->syms == NULL) { - ret = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } - - 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; - } - - irep->syms[i] = mrb_intern2(mrb, (char *)src, snl); - src += snl + 1; - - mrb_gc_arena_restore(mrb, ai); - } - } - *len = src - bin; - - ret = MRB_DUMP_OK; -error_exit: - return ret; -} - -static int -read_rite_section_irep(mrb_state *mrb, const uint8_t *bin) -{ - int result; - size_t sirep; - uint32_t len; - uint16_t nirep; - uint16_t n; - const struct rite_section_irep_header *header; - - header = (const struct rite_section_irep_header*)bin; - bin += sizeof(struct rite_section_irep_header); - - sirep = mrb->irep_len; - nirep = bin_to_uint16(header->nirep); - - //Read Binary Data Section - for (n = 0; n < nirep; n++) { - result = read_rite_irep_record(mrb, bin, &len); - if (result != MRB_DUMP_OK) - goto error_exit; - bin += len; - } - - result = nirep; -error_exit: - if (result < MRB_DUMP_OK) { - irep_free(sirep, mrb); - } - return result; -} - -static int -read_rite_lineno_record(mrb_state *mrb, const uint8_t *bin, size_t irepno, uint32_t *len) -{ - int ret; - size_t i, fname_len, niseq; - char *fname; - uint16_t *lines; - - ret = MRB_DUMP_OK; - *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)) { - ret = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } - fname = (char *)mrb_malloc(mrb, fname_len + 1); - if (fname == NULL) { - ret = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } - memcpy(fname, bin, fname_len); - fname[fname_len] = '\0'; - bin += fname_len; - *len += fname_len; - - niseq = bin_to_uint32(bin); - bin += sizeof(uint32_t); // niseq - *len += sizeof(uint32_t); - - if (SIZE_ERROR_MUL(niseq, sizeof(uint16_t))) { - ret = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } - lines = (uint16_t *)mrb_malloc(mrb, niseq * sizeof(uint16_t)); - if (lines == NULL) { - ret = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } - for (i = 0; i < niseq; i++) { - lines[i] = bin_to_uint16(bin); - bin += sizeof(uint16_t); // niseq - *len += sizeof(uint16_t); - } - - mrb->irep[irepno]->filename = fname; - mrb->irep[irepno]->lines = lines; - -error_exit: - - return ret; -} - -static int -read_rite_section_lineno(mrb_state *mrb, const uint8_t *bin, size_t sirep) -{ - int result; - size_t i; - uint32_t len; - uint16_t nirep; - uint16_t n; - const struct rite_section_lineno_header *header; - - len = 0; - header = (const struct rite_section_lineno_header*)bin; - bin += sizeof(struct rite_section_lineno_header); - - nirep = bin_to_uint16(header->nirep); - - //Read Binary Data Section - for (n = 0, i = sirep; n < nirep; n++, i++) { - result = read_rite_lineno_record(mrb, bin, i, &len); - if (result != MRB_DUMP_OK) - goto error_exit; - bin += len; - } - - result = sirep + bin_to_uint16(header->sirep); -error_exit: - return result; -} - -static int -read_rite_debug_record(mrb_state *mrb, const uint8_t *start, size_t irepno, uint32_t *len, const mrb_sym *filenames, size_t filenames_len) -{ - const uint8_t *bin = start; - mrb_irep *irep = mrb->irep[irepno]; - size_t record_size; - 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 = 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; - size_t 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 = bin_to_uint8(bin); bin += sizeof(uint8_t); - switch(file->line_type) { - case mrb_debug_line_ary: { - size_t l; - - file->line_ary = (uint16_t *)mrb_malloc(mrb, sizeof(uint16_t) * file->line_entry_count); - for(l = 0; l < file->line_entry_count; ++l) { - file->line_ary[l] = bin_to_uint16(bin); bin += sizeof(uint16_t); - } - } break; - - case mrb_debug_line_flat_map: { - size_t l; - - file->line_flat_map = mrb_malloc(mrb, sizeof(mrb_irep_debug_info_line) * file->line_entry_count); - for(l = 0; l < file->line_entry_count; ++l) { - file->line_flat_map[l].start_pos = bin_to_uint32(bin); bin += sizeof(uint32_t); - file->line_flat_map[l].line = bin_to_uint16(bin); bin += sizeof(uint16_t); - } - } break; - - default: return MRB_DUMP_GENERAL_FAILURE; - } - } - - if((long)record_size != (bin - start)) { - return MRB_DUMP_GENERAL_FAILURE; - } - - *len = bin - start; - - return MRB_DUMP_OK; -} - -static int -read_rite_section_debug(mrb_state *mrb, const uint8_t *start, size_t sirep) -{ - const uint8_t *bin; - struct rite_section_debug_header *header; - uint16_t i; - int result; - uint16_t nirep; - size_t filenames_len; - mrb_sym *filenames; - - bin = start; - header = (struct rite_section_debug_header *)bin; - bin += sizeof(struct rite_section_debug_header); - - nirep = bin_to_uint16(header->nirep); - - filenames_len = bin_to_uint16(bin); - bin += sizeof(uint16_t); - filenames = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym*) * filenames_len); - for(i = 0; i < filenames_len; ++i) { - uint16_t f_len = bin_to_uint16(bin); - bin += sizeof(uint16_t); - filenames[i] = mrb_intern2(mrb, (const char *)bin, f_len); - bin += f_len; - } - - for(i = sirep; i < (sirep + nirep); ++i) { - uint32_t len = 0; - result = read_rite_debug_record(mrb, bin, i, &len, filenames, filenames_len); - if (result != MRB_DUMP_OK) { goto debug_exit; } - bin += len; - } - - if ((bin - start) != bin_to_uint32(header->section_size)) { - return MRB_DUMP_GENERAL_FAILURE; - } - - result = sirep + bin_to_uint16(header->sirep); -debug_exit: - mrb_free(mrb, filenames); - return result; -} - -static int -read_rite_binary_header(const uint8_t *bin, size_t *bin_size, uint16_t *crc) -{ - const struct rite_binary_header *header = (const struct rite_binary_header *)bin; - - 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; - } - - *crc = bin_to_uint16(header->binary_crc); - if (bin_size) { - *bin_size = bin_to_uint32(header->binary_size); - } - - return MRB_DUMP_OK; -} - -int32_t -mrb_read_irep(mrb_state *mrb, const uint8_t *bin) -{ - int result; - int32_t total_nirep = 0; - const struct rite_section_header *section_header; - uint16_t crc; - size_t bin_size = 0; - size_t n; - size_t sirep; - - if ((mrb == NULL) || (bin == NULL)) { - return MRB_DUMP_INVALID_ARGUMENT; - } - - result = read_rite_binary_header(bin, &bin_size, &crc); - if (result != MRB_DUMP_OK) { - return result; - } - - n = offset_crc_body(); - if (crc != calc_crc_16_ccitt(bin + n, bin_size - n, 0)) { - return MRB_DUMP_INVALID_FILE_HEADER; - } - - bin += sizeof(struct rite_binary_header); - sirep = mrb->irep_len; - - 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) { - result = read_rite_section_irep(mrb, bin); - if (result < MRB_DUMP_OK) { - return result; - } - total_nirep += result; - } - else if (memcmp(section_header->section_identify, RITE_SECTION_LINENO_IDENTIFIER, sizeof(section_header->section_identify)) == 0) { - result = read_rite_section_lineno(mrb, bin, sirep); - if (result < MRB_DUMP_OK) { - return result; - } - } - else if (memcmp(section_header->section_identify, RITE_SECTION_DEBUG_IDENTIFIER, sizeof(section_header->section_identify)) == 0) { - result = read_rite_section_debug(mrb, bin, sirep); - if (result < MRB_DUMP_OK) { - return result; - } - } - bin += bin_to_uint32(section_header->section_size); - } while (memcmp(section_header->section_identify, RITE_BINARY_EOF, sizeof(section_header->section_identify)) != 0); - - return sirep; -} - -static void -irep_error(mrb_state *mrb, int n) -{ - static const char msg[] = "irep load error"; - mrb->exc = mrb_obj_ptr(mrb_exc_new(mrb, E_SCRIPT_ERROR, msg, sizeof(msg) - 1)); -} - -mrb_value -mrb_load_irep(mrb_state *mrb, const uint8_t *bin) -{ - int32_t n; - - n = mrb_read_irep(mrb, bin); - if (n < 0) { - irep_error(mrb, n); - return mrb_nil_value(); - } - return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); -} - -#ifdef ENABLE_STDIO - -static int32_t -read_rite_section_lineno_file(mrb_state *mrb, FILE *fp, size_t sirep) -{ - int32_t result; - size_t i; - uint16_t nirep; - uint16_t n; - uint32_t len, buf_size; - uint8_t *buf = NULL; - const size_t record_header_size = 4; - - struct rite_section_lineno_header header; - if (fread(&header, sizeof(struct rite_section_lineno_header), 1, fp) == 0) { - return MRB_DUMP_READ_FAULT; - } - - nirep = bin_to_uint16(header.nirep); - - buf_size = record_header_size; - /* We don't need to check buf_size. As it is enough small. */ - buf = (uint8_t *)mrb_malloc(mrb, buf_size); - if (!buf) { - result = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } - - //Read Binary Data Section - for (n = 0, i = sirep; n < nirep; n++, i++) { - void *ptr; - - if (fread(buf, record_header_size, 1, fp) == 0) { - result = MRB_DUMP_READ_FAULT; - goto error_exit; - } - buf_size = bin_to_uint32(&buf[0]); - if (SIZE_ERROR(buf_size)) { - result = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } - ptr = mrb_realloc(mrb, buf, buf_size); - if (!ptr) { - result = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } - buf = (uint8_t *)ptr; - - if (fread(&buf[record_header_size], buf_size - record_header_size, 1, fp) == 0) { - result = MRB_DUMP_READ_FAULT; - goto error_exit; - } - result = read_rite_lineno_record(mrb, buf, i, &len); - if (result != MRB_DUMP_OK) - goto error_exit; - } - - result = sirep + bin_to_uint16(header.sirep); -error_exit: - if (buf) { - mrb_free(mrb, buf); - } - if (result < MRB_DUMP_OK) { - irep_free(sirep, mrb); - } - return result; -} - -static int32_t -read_rite_section_irep_file(mrb_state *mrb, FILE *fp) -{ - int32_t result; - size_t sirep; - uint16_t nirep; - uint16_t n; - uint32_t len, buf_size; - uint8_t *buf = NULL; - const size_t record_header_size = 1 + 4; - struct rite_section_irep_header header; - - if (fread(&header, sizeof(struct rite_section_irep_header), 1, fp) == 0) { - return MRB_DUMP_READ_FAULT; - } - - sirep = mrb->irep_len; - nirep = bin_to_uint16(header.nirep); - - buf_size = record_header_size; - /* You don't need use SIZE_ERROR as buf_size is enough small. */ - buf = (uint8_t *)mrb_malloc(mrb, buf_size); - if (!buf) { - result = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } - - //Read Binary Data Section - for (n = 0; n < nirep; n++) { - void *ptr; - - if (fread(buf, record_header_size, 1, fp) == 0) { - result = MRB_DUMP_READ_FAULT; - goto error_exit; - } - buf_size = bin_to_uint32(&buf[0]); - if (SIZE_ERROR(buf_size)) { - result = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } - ptr = mrb_realloc(mrb, buf, buf_size); - if (!ptr) { - result = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } - buf = (uint8_t *)ptr; - - if (fread(&buf[record_header_size], buf_size - record_header_size, 1, fp) == 0) { - result = MRB_DUMP_READ_FAULT; - goto error_exit; - } - result = read_rite_irep_record(mrb, buf, &len); - if (result != MRB_DUMP_OK) - goto error_exit; - } - - result = nirep; -error_exit: - if (buf) { - mrb_free(mrb, buf); - } - if (result < MRB_DUMP_OK) { - irep_free(sirep, mrb); - } - return result; -} - -int32_t -mrb_read_irep_file(mrb_state *mrb, FILE* fp) -{ - int result; - int32_t total_nirep = 0; - uint8_t *buf; - uint16_t crc, crcwk = 0; - uint32_t section_size = 0; - size_t nbytes; - size_t sirep; - struct rite_section_header section_header; - long fpos; - size_t block_size = 1 << 14; - const uint8_t block_fallback_count = 4; - int i; - const size_t buf_size = sizeof(struct rite_binary_header); - - if ((mrb == NULL) || (fp == NULL)) { - return MRB_DUMP_INVALID_ARGUMENT; - } - - /* You don't need use SIZE_ERROR as buf_size is enough small. */ - buf = mrb_malloc(mrb, buf_size); - if (!buf) { - return MRB_DUMP_GENERAL_FAILURE; - } - if (fread(buf, buf_size, 1, fp) == 0) { - mrb_free(mrb, buf); - return MRB_DUMP_READ_FAULT; - } - result = read_rite_binary_header(buf, NULL, &crc); - mrb_free(mrb, buf); - if (result != MRB_DUMP_OK) { - return result; - } - - /* verify CRC */ - fpos = ftell(fp); - /* You don't need use SIZE_ERROR as block_size is enough small. */ - for (i = 0; i < block_fallback_count; i++,block_size >>= 1){ - buf = mrb_malloc_simple(mrb, block_size); - if (buf) break; - } - if (!buf) { - return MRB_DUMP_GENERAL_FAILURE; - } - fseek(fp, offset_crc_body(), SEEK_SET); - while ((nbytes = fread(buf, 1, block_size, fp)) > 0) { - crcwk = calc_crc_16_ccitt(buf, nbytes, crcwk); - } - mrb_free(mrb, buf); - if (nbytes == 0 && ferror(fp)) { - return MRB_DUMP_READ_FAULT; - } - if (crcwk != crc) { - return MRB_DUMP_INVALID_FILE_HEADER; - } - fseek(fp, fpos + section_size, SEEK_SET); - sirep = mrb->irep_len; - - // read sections - do { - fpos = ftell(fp); - if (fread(§ion_header, sizeof(struct rite_section_header), 1, fp) == 0) { - return MRB_DUMP_READ_FAULT; - } - section_size = bin_to_uint32(section_header.section_size); - - if (memcmp(section_header.section_identify, RITE_SECTION_IREP_IDENTIFIER, sizeof(section_header.section_identify)) == 0) { - fseek(fp, fpos, SEEK_SET); - result = read_rite_section_irep_file(mrb, fp); - if (result < MRB_DUMP_OK) { - return result; - } - total_nirep += result; - } - else if (memcmp(section_header.section_identify, RITE_SECTION_LINENO_IDENTIFIER, sizeof(section_header.section_identify)) == 0) { - fseek(fp, fpos, SEEK_SET); - result = read_rite_section_lineno_file(mrb, fp, sirep); - if (result < MRB_DUMP_OK) { - return result; - } - } - else if (memcmp(section_header.section_identify, RITE_SECTION_DEBUG_IDENTIFIER, sizeof(section_header.section_identify)) == 0) { - uint8_t* const bin = mrb_malloc(mrb, section_size); - fseek(fp, fpos, SEEK_SET); - if(fread((char*)bin, section_size, 1, fp) != 1) { - mrb_free(mrb, bin); - return MRB_DUMP_READ_FAULT; - } - result = read_rite_section_debug(mrb, bin, sirep); - mrb_free(mrb, bin); - if (result < MRB_DUMP_OK) { - return result; - } - } - - fseek(fp, fpos + section_size, SEEK_SET); - } while (memcmp(section_header.section_identify, RITE_BINARY_EOF, sizeof(section_header.section_identify)) != 0); - - return sirep; -} - -mrb_value -mrb_load_irep_file(mrb_state *mrb, FILE* fp) -{ - int n = mrb_read_irep_file(mrb, fp); - - if (n < 0) { - irep_error(mrb, n); - return mrb_nil_value(); - } - return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); -} -#endif /* ENABLE_STDIO */ Deleted: vendor/mruby-eeac4be/src/mrblib.c (+0 -971) 100644 =================================================================== --- vendor/mruby-eeac4be/src/mrblib.c 2014-06-08 19:01:14 +0900 (68ebb36) +++ /dev/null @@ -1,971 +0,0 @@ -#include "mruby.h" -#include "mruby/irep.h" -#include "mruby/dump.h" -#include "mruby/string.h" -#include "mruby/proc.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 mrblib_irep[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0xca,0x4c,0x00,0x00,0x3b,0x9d,0x4d,0x41, -0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x3b,0x7f,0x30,0x30, -0x30,0x30,0x00,0x91,0x00,0x00,0x00,0x00,0x03,0x2f,0x00,0x01,0x00,0x03,0x00,0x00, -0x00,0x7b,0x00,0x80,0x00,0x05,0x01,0x00,0x00,0x05,0x00,0x80,0x00,0x43,0x00,0x80, -0x00,0xc5,0x00,0x80,0x00,0x05,0x00,0x80,0x40,0x44,0x00,0x80,0x04,0x45,0x00,0x80, -0x00,0x05,0x00,0x80,0x80,0x44,0x00,0x80,0x04,0xc5,0x00,0x80,0x00,0x05,0x01,0x00, -0x00,0x05,0x00,0x80,0x00,0x43,0x00,0x80,0x05,0x45,0x00,0x80,0x00,0x05,0x01,0x00, -0x00,0x05,0x00,0x80,0xc0,0x43,0x00,0x80,0x06,0x45,0x00,0x80,0x00,0x05,0x00,0x80, -0x80,0x44,0x00,0x80,0x0a,0xc5,0x00,0x80,0x00,0x05,0x00,0x80,0x40,0x44,0x00,0x80, -0x0e,0x45,0x00,0x80,0x00,0x05,0x01,0x00,0x00,0x05,0x00,0x81,0x00,0x43,0x00,0x80, -0x20,0x45,0x00,0x80,0x00,0x05,0x01,0x00,0x02,0x91,0x00,0x81,0x80,0x43,0x00,0x80, -0x21,0x45,0x00,0x80,0x00,0x05,0x01,0x00,0x02,0x91,0x00,0x81,0xc0,0x43,0x00,0x80, -0x21,0xc5,0x00,0x80,0x00,0x05,0x01,0x00,0x02,0x91,0x00,0x82,0x00,0x43,0x00,0x80, -0x22,0x45,0x00,0x80,0x00,0x05,0x01,0x00,0x04,0x11,0x00,0x82,0x40,0x43,0x00,0x80, -0x22,0xc5,0x00,0x80,0x00,0x05,0x01,0x00,0x02,0x91,0x00,0x82,0x80,0x43,0x00,0x80, -0x23,0x45,0x00,0x80,0x00,0x05,0x01,0x00,0x02,0x91,0x00,0x82,0xc0,0x43,0x00,0x80, -0x23,0xc5,0x00,0x80,0x00,0x05,0x01,0x00,0x02,0x91,0x00,0x83,0x00,0x43,0x00,0x80, -0x24,0x45,0x00,0x80,0x00,0x05,0x01,0x00,0x06,0x11,0x00,0x83,0x40,0x43,0x00,0x80, -0x25,0xc5,0x00,0x80,0x00,0x05,0x01,0x00,0x02,0x91,0x00,0x83,0x80,0x43,0x00,0x80, -0x26,0x45,0x00,0x80,0x00,0x05,0x01,0x00,0x07,0x11,0x00,0x83,0xc0,0x43,0x00,0x80, -0x26,0xc5,0x00,0x80,0x00,0x05,0x01,0x00,0x08,0x11,0x00,0x84,0x40,0x43,0x00,0x80, -0x27,0x45,0x00,0x80,0x00,0x05,0x01,0x00,0x00,0x05,0x00,0x84,0x80,0x43,0x00,0x80, -0x27,0xc5,0x00,0x80,0x00,0x05,0x00,0x80,0x40,0x44,0x00,0x80,0x33,0x45,0x00,0x80, -0x00,0x05,0x01,0x00,0x00,0x05,0x00,0x84,0x80,0x43,0x00,0x80,0x33,0xc5,0x00,0x80, -0x00,0x05,0x00,0x84,0xc0,0x44,0x00,0x80,0x34,0x45,0x00,0x80,0x00,0x05,0x01,0x00, -0x00,0x05,0x00,0x85,0x00,0x43,0x00,0x80,0x37,0xc5,0x00,0x80,0x00,0x05,0x00,0x80, -0x80,0x44,0x00,0x80,0x3c,0x45,0x00,0x80,0x00,0x05,0x01,0x00,0x00,0x05,0x00,0x85, -0x40,0x43,0x00,0x80,0x3c,0xc5,0x00,0x80,0x00,0x05,0x00,0x84,0xc0,0x44,0x00,0x80, -0x3d,0x45,0x00,0x80,0x00,0x05,0x01,0x00,0x00,0x05,0x00,0x85,0x80,0x43,0x00,0x80, -0x3f,0xc5,0x00,0x80,0x00,0x05,0x00,0x80,0x40,0x44,0x00,0x80,0x40,0xc5,0x00,0x80, -0x00,0x05,0x01,0x00,0x00,0x05,0x00,0x85,0x80,0x43,0x00,0x80,0x41,0x45,0x00,0x80, -0x00,0x05,0x01,0x00,0x00,0x05,0x00,0x85,0xc0,0x43,0x00,0x80,0x41,0xc5,0x00,0x80, -0x00,0x05,0x00,0x80,0x80,0x44,0x00,0x80,0x47,0xc5,0x00,0x80,0x00,0x05,0x01,0x00, -0x00,0x05,0x00,0x85,0xc0,0x43,0x00,0x80,0x48,0x45,0x00,0x00,0x00,0x4a,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x05,0x41,0x72,0x72,0x61,0x79,0x00,0x00,0x0a, -0x45,0x6e,0x75,0x6d,0x65,0x72,0x61,0x62,0x6c,0x65,0x00,0x00,0x0a,0x43,0x6f,0x6d, -0x70,0x61,0x72,0x61,0x62,0x6c,0x65,0x00,0x00,0x06,0x4d,0x6f,0x64,0x75,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,0x04,0x48,0x61,0x73,0x68,0x00,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x00, -0x00,0x07,0x49,0x6e,0x74,0x65,0x67,0x65,0x72,0x00,0x00,0x07,0x4e,0x75,0x6d,0x65, -0x72,0x69,0x63,0x00,0x00,0x05,0x52,0x61,0x6e,0x67,0x65,0x00,0x00,0x06,0x53,0x74, -0x72,0x69,0x6e,0x67,0x00,0x00,0x00,0x00,0xb7,0x00,0x01,0x00,0x04,0x00,0x00,0x00, -0x16,0x00,0x80,0x00,0x48,0x01,0x00,0x02,0xc0,0x00,0x80,0x00,0x46,0x00,0x80,0x00, -0x48,0x01,0x00,0x04,0xc0,0x00,0x80,0x40,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x06, -0xc0,0x00,0x80,0x80,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x01,0x84,0x01,0x80,0x01, -0x04,0x02,0x00,0x00,0x05,0x00,0x81,0x01,0x20,0x00,0x80,0x00,0x48,0x01,0x00,0x0a, -0xc0,0x00,0x81,0x40,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x0c,0xc0,0x00,0x81,0x80, -0x46,0x00,0x80,0x03,0x04,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x07,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,0x06,0x64,0x65,0x6c,0x65,0x74,0x65,0x00,0x00,0x00,0x00,0xfc, -0x00,0x05,0x00,0x08,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0xa6,0x02,0xbf,0xff,0x03, -0x03,0x00,0x00,0x06,0x03,0x00,0x00,0x20,0x03,0x00,0x40,0xaf,0x01,0x01,0x40,0x01, -0x01,0x81,0x80,0x01,0x00,0x40,0x0b,0x17,0x02,0x80,0x00,0x06,0x03,0x00,0x80,0x01, -0x03,0x00,0xc0,0xad,0x01,0x01,0x80,0x01,0x02,0x80,0x80,0xa0,0x02,0x01,0x40,0x01, -0x02,0x81,0x00,0x01,0x02,0xc0,0x00,0x99,0x00,0x40,0x05,0x17,0x02,0x81,0x00,0x01, -0x03,0x00,0x00,0x05,0x02,0x81,0x00,0xb2,0x02,0xc0,0x02,0x19,0x02,0x80,0xc0,0x01, -0x03,0x00,0x00,0x06,0x03,0x00,0x00,0x20,0x02,0x81,0x40,0xb6,0x02,0xc0,0x00,0x99, -0x00,0x40,0x08,0x97,0x02,0x80,0x40,0x01,0x03,0x01,0x00,0x01,0x02,0x81,0x80,0xa0, -0x02,0x80,0x80,0x01,0x03,0x00,0xc0,0x01,0x02,0x81,0xc0,0xb3,0x02,0xc0,0x02,0x19, -0x02,0x80,0xc0,0x01,0x03,0x00,0x00,0x06,0x03,0x00,0x00,0x20,0x02,0x82,0x00,0xb4, -0x02,0xc0,0x02,0x19,0x02,0x80,0x00,0x06,0x02,0x80,0x00,0x20,0x02,0x80,0x40,0xaf, -0x01,0x81,0x40,0x01,0x02,0xbf,0xee,0x18,0x02,0x80,0x00,0x06,0x02,0x80,0x00,0x29, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,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,0x6c,0x00,0x03,0x00,0x05, -0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xa6,0x01,0x3f,0xff,0x83,0x00,0x40,0x03,0x17, -0x01,0x80,0x40,0x01,0x02,0x00,0x80,0x01,0x01,0x80,0x00,0xa0,0x01,0x80,0x80,0x01, -0x01,0x80,0x40,0xad,0x01,0x00,0xc0,0x01,0x01,0x80,0x80,0x01,0x02,0x00,0x00,0x06, -0x02,0x00,0xc0,0x20,0x01,0x80,0x80,0xb3,0x01,0xbf,0xfa,0x98,0x01,0x80,0x00,0x06, -0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,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,0x39,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x06, -0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x06,0x01,0x80,0x03,0x40,0x01,0x00,0x00,0x21, -0x01,0x00,0x00,0x06,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, -0x00,0x0a,0x65,0x61,0x63,0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x00,0x00, -0x52,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x26,0x01,0x80,0x40, -0x15,0x02,0x00,0x00,0x06,0x02,0x80,0x40,0x01,0x02,0x00,0x40,0xa0,0x01,0x80,0x00, -0xa0,0x02,0x00,0x00,0x06,0x02,0x80,0x40,0x01,0x03,0x00,0xc0,0x01,0x02,0x00,0x81, -0x20,0x01,0x80,0x00,0x29,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,0x90,0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x39,0x00,0x20,0x00,0xa6,0x00, -0x40,0x01,0x17,0x00,0x40,0x01,0x17,0x00,0x40,0x01,0x17,0x00,0xbf,0xff,0x83,0x01, -0x00,0x00,0x05,0x02,0x80,0x40,0x01,0x03,0x00,0x00,0x91,0x02,0x80,0x00,0xa0,0x02, -0xc0,0x00,0x99,0x00,0x40,0x02,0x17,0x02,0x80,0x00,0x06,0x03,0x00,0x01,0x91,0x03, -0x80,0x00,0x3d,0x02,0x80,0x81,0x20,0x02,0x80,0x40,0x01,0x03,0x3f,0xff,0x83,0x02, -0x81,0x00,0xb3,0x02,0xc0,0x02,0x19,0x02,0x80,0x00,0x06,0x03,0x00,0x02,0x91,0x03, -0x80,0x00,0xbd,0x02,0x80,0x81,0x20,0x02,0x80,0x00,0x06,0x02,0x81,0x80,0x20,0x02, -0x80,0x40,0x01,0x03,0x3f,0xff,0x83,0x02,0x81,0xc0,0xb5,0x02,0xc0,0x0d,0x19,0x02, -0x80,0x00,0x05,0x03,0x00,0x00,0x06,0x03,0x80,0x40,0x01,0x03,0x82,0x40,0xaf,0x04, -0x01,0x40,0x01,0x03,0x02,0x01,0x20,0x02,0x3f,0xff,0x83,0x00,0x40,0x07,0x17,0x02, -0x80,0xc0,0x01,0x02,0xc0,0x02,0x19,0x02,0x80,0xc0,0x01,0x03,0x01,0x00,0x01,0x02, -0x82,0x80,0xa0,0x00,0x40,0x00,0x97,0x02,0x80,0x80,0x01,0x03,0x00,0x00,0x06,0x03, -0x81,0x00,0x01,0x04,0x01,0x40,0x01,0x03,0x02,0x01,0x20,0x02,0x81,0x00,0x01,0x02, -0x82,0xc0,0xad,0x02,0x01,0x40,0x01,0x02,0x81,0x00,0x01,0x03,0x00,0x40,0x01,0x02, -0x81,0x00,0xb3,0x02,0xbf,0xf7,0x18,0x02,0x80,0x00,0x06,0x02,0x80,0x00,0x29,0x00, -0x00,0x00,0x02,0x10,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,0x10,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,0x8c,0x00,0x05,0x00,0x07,0x00,0x00,0x00,0x16,0x02,0x00,0x00,0xa6,0x00, -0x40,0x02,0x17,0x02,0x80,0x00,0x06,0x03,0x00,0xc0,0x01,0x02,0x80,0x00,0xa0,0x02, -0x00,0x40,0x01,0x02,0x80,0x00,0x06,0x03,0x00,0x40,0x01,0x02,0x80,0x40,0xa0,0x01, -0x81,0x40,0x01,0x02,0xbf,0xfb,0x98,0x02,0x81,0x00,0x01,0x03,0x00,0x00,0x05,0x02, -0x80,0x80,0xb2,0x02,0xc0,0x00,0x99,0x02,0x80,0x80,0x01,0x02,0xc0,0x01,0x99,0x02, -0x80,0x80,0x01,0x02,0x80,0xc0,0x20,0x00,0x40,0x00,0x97,0x02,0x81,0x00,0x01,0x02, -0x80,0x00,0x29,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,0x1c,0x00, -0x01,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x80,0x00,0x05,0x01,0x00,0x00,0x29,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x01,0x00,0x02,0x00, -0x00,0x00,0x02,0x00,0x80,0x00,0x05,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x0b,0x00, -0x80,0x00,0x06,0x01,0x00,0x00,0x91,0x00,0x80,0x00,0xa0,0x00,0x80,0x00,0x06,0x01, -0x00,0x01,0x11,0x00,0x80,0x00,0xa0,0x00,0x80,0x00,0x48,0x01,0x00,0x02,0xc0,0x00, -0x80,0xc0,0x46,0x00,0x80,0x01,0x84,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x04,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,0x43,0x6f,0x6d,0x70, -0x61,0x72,0x61,0x62,0x6c,0x65,0x00,0x00,0x05,0x73,0x6f,0x72,0x74,0x21,0x00,0x00, -0x00,0x00,0x41,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xa6,0x01, -0x00,0x00,0x06,0x01,0x80,0x00,0x06,0x02,0x00,0x40,0x01,0x01,0x80,0x40,0x21,0x01, -0x00,0x00,0xa0,0x01,0x00,0x00,0x29,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,0x7f,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x0e,0x00,0x80,0x00,0x48, -0x01,0x00,0x02,0xc0,0x00,0x80,0x00,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x08,0xc0, -0x00,0x80,0x40,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x0e,0xc0,0x00,0x80,0x80,0x46, -0x00,0x80,0x00,0x48,0x01,0x00,0x10,0xc0,0x00,0x80,0xc0,0x46,0x00,0x80,0x01,0x84, -0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,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,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,0x2f,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x08,0x00,0x26,0x01, -0x80,0x40,0x01,0x02,0x00,0x03,0x40,0x01,0x80,0x00,0x21,0x01,0x80,0x00,0x29,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00, -0x01,0x1e,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x26,0x02,0x00, -0x40,0x01,0x02,0x00,0x00,0x20,0x00,0x81,0x00,0x01,0x02,0x00,0x40,0x01,0x02,0x80, -0x00,0x3d,0x02,0x00,0x40,0xa0,0x02,0x40,0x01,0x98,0x02,0x00,0x40,0x01,0x02,0x80, -0x00,0xbd,0x02,0x00,0x40,0xa0,0x02,0x40,0x01,0x98,0x02,0x00,0x40,0x01,0x02,0x80, -0x01,0x3d,0x02,0x00,0x40,0xa0,0x02,0x40,0x04,0x99,0x02,0x00,0x00,0x06,0x02,0x80, -0x01,0x91,0x03,0x00,0x01,0xbd,0x03,0x80,0x40,0x01,0x03,0x81,0x00,0x20,0x03,0x01, -0xc0,0x3e,0x03,0x80,0x02,0x3d,0x03,0x01,0xc0,0x3e,0x02,0x00,0x81,0x20,0x02,0x00, -0x00,0x3d,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0xac,0x01,0x81,0x00,0x01,0x02,0x00, -0x00,0x06,0x02,0x80,0x40,0x01,0x03,0x00,0x03,0x40,0x02,0x01,0x80,0xa1,0x02,0x00, -0x00,0x29,0x00,0x00,0x00,0x05,0x10,0x00,0x01,0x40,0x10,0x00,0x01,0x3f,0x10,0x00, -0x01,0x24,0x10,0x00,0x00,0x10,0x00,0x2c,0x20,0x69,0x73,0x20,0x6e,0x6f,0x74,0x20, -0x61,0x6c,0x6c,0x6f,0x77,0x65,0x64,0x20,0x61,0x73,0x20,0x61,0x6e,0x20,0x69,0x6e, -0x73,0x74,0x61,0x6e,0x63,0x65,0x20,0x76,0x61,0x72,0x69,0x61,0x62,0x6c,0x65,0x20, -0x6e,0x61,0x6d,0x65,0x00,0x00,0x00,0x07,0x00,0x04,0x74,0x6f,0x5f,0x73,0x00,0x00, -0x08,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x3f,0x00,0x00,0x05,0x72,0x61,0x69,0x73, -0x65,0x00,0x00,0x09,0x4e,0x61,0x6d,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x07, -0x69,0x6e,0x73,0x70,0x65,0x63,0x74,0x00,0x00,0x01,0x2b,0x00,0x00,0x0d,0x64,0x65, -0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x3c, -0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x80,0x00,0x06,0x01,0x00,0xc0,0x15, -0x00,0x80,0x00,0xa0,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, -0x00,0x15,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x76,0x61,0x72,0x69,0x61, -0x62,0x6c,0x65,0x5f,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0x2f,0x00,0x03,0x00,0x05, -0x00,0x00,0x00,0x05,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x02,0x00,0x03,0x40, -0x01,0x80,0x00,0x21,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, -0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x01,0x3f,0x00,0x04,0x00,0x08,0x00, -0x00,0x00,0x27,0x02,0x00,0x00,0x26,0x02,0x00,0x40,0x01,0x02,0x00,0x00,0x20,0x00, -0x81,0x00,0x01,0x02,0x00,0x40,0x01,0x02,0x80,0x00,0x3d,0x02,0x00,0x40,0xa0,0x02, -0x40,0x01,0x98,0x02,0x00,0x40,0x01,0x02,0x80,0x00,0xbd,0x02,0x00,0x40,0xa0,0x02, -0x40,0x01,0x98,0x02,0x00,0x40,0x01,0x02,0x80,0x01,0x3d,0x02,0x00,0x40,0xa0,0x02, -0x40,0x04,0x99,0x02,0x00,0x00,0x06,0x02,0x80,0x01,0x91,0x03,0x00,0x01,0xbd,0x03, -0x80,0x40,0x01,0x03,0x81,0x00,0x20,0x03,0x01,0xc0,0x3e,0x03,0x80,0x02,0x3d,0x03, -0x01,0xc0,0x3e,0x02,0x00,0x81,0x20,0x02,0x00,0x00,0x3d,0x02,0x80,0x40,0x01,0x02, -0x01,0x40,0xac,0x01,0x81,0x00,0x01,0x02,0x00,0x40,0x01,0x02,0x80,0x02,0xbd,0x02, -0x01,0x40,0xac,0x02,0x01,0x80,0x20,0x00,0x81,0x00,0x01,0x02,0x00,0x00,0x06,0x02, -0x80,0x40,0x01,0x03,0x00,0x03,0x40,0x02,0x01,0xc0,0xa1,0x02,0x00,0x00,0x29,0x00, -0x00,0x00,0x06,0x10,0x00,0x01,0x40,0x10,0x00,0x01,0x3f,0x10,0x00,0x01,0x24,0x10, -0x00,0x00,0x10,0x00,0x2c,0x20,0x69,0x73,0x20,0x6e,0x6f,0x74,0x20,0x61,0x6c,0x6c, -0x6f,0x77,0x65,0x64,0x20,0x61,0x73,0x20,0x61,0x6e,0x20,0x69,0x6e,0x73,0x74,0x61, -0x6e,0x63,0x65,0x20,0x76,0x61,0x72,0x69,0x61,0x62,0x6c,0x65,0x20,0x6e,0x61,0x6d, -0x65,0x10,0x00,0x01,0x3d,0x00,0x00,0x00,0x08,0x00,0x04,0x74,0x6f,0x5f,0x73,0x00, -0x00,0x08,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x3f,0x00,0x00,0x05,0x72,0x61,0x69, -0x73,0x65,0x00,0x00,0x09,0x4e,0x61,0x6d,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00, -0x07,0x69,0x6e,0x73,0x70,0x65,0x63,0x74,0x00,0x00,0x01,0x2b,0x00,0x00,0x06,0x69, -0x6e,0x74,0x65,0x72,0x6e,0x00,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d, -0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x44,0x00,0x03,0x00,0x06,0x00,0x00, -0x00,0x06,0x02,0x00,0x00,0x26,0x01,0x80,0x00,0x06,0x02,0x00,0xc0,0x15,0x02,0x80, -0x40,0x01,0x01,0x80,0x01,0x20,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x01,0x00,0x15,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x76,0x61,0x72, -0x69,0x61,0x62,0x6c,0x65,0x5f,0x73,0x65,0x74,0x00,0x00,0x00,0x00,0x60,0x00,0x03, -0x00,0x06,0x00,0x00,0x00,0x0c,0x00,0x08,0x00,0x26,0x01,0x80,0x00,0x06,0x02,0x01, -0x00,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x80,0x3f,0xa0,0x01,0x80, -0x00,0x06,0x02,0x01,0x00,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x80, -0x7f,0xa0,0x01,0x80,0x00,0x29,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,0x36,0x00,0x03, -0x00,0x05,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x26,0x01,0x80,0x00,0x06,0x02,0x00, -0x40,0x01,0x01,0x80,0x00,0xa0,0x01,0x80,0x00,0x29,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,0x86,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x14,0x00,0x80,0x00,0x48, -0x01,0x00,0x02,0xc0,0x00,0x80,0x00,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x04,0xc0, -0x00,0x80,0x40,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x06,0xc0,0x00,0x80,0x80,0x46, -0x00,0x80,0x00,0x48,0x01,0x00,0x08,0xc0,0x00,0x80,0xc0,0x46,0x00,0x80,0x00,0x48, -0x01,0x00,0x0a,0xc0,0x00,0x81,0x00,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x0c,0xc0, -0x00,0x81,0x40,0x46,0x00,0x80,0x02,0x84,0x01,0x00,0x00,0x29,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,0x6d,0x00,0x04,0x00,0x06,0x00,0x00, -0x00,0x12,0x02,0x00,0x00,0x26,0x02,0x00,0x00,0x06,0x02,0x80,0x40,0x01,0x02,0x00, -0x00,0xa0,0x01,0x81,0x00,0x01,0x02,0x00,0xc0,0x01,0x02,0x00,0x40,0x20,0x02,0x40, -0x01,0x19,0x02,0x00,0x00,0x08,0x00,0x40,0x03,0x97,0x02,0x00,0xc0,0x01,0x02,0xbf, -0xff,0x83,0x02,0x00,0x80,0xb3,0x02,0x40,0x01,0x19,0x02,0x00,0x00,0x07,0x00,0x40, -0x00,0x97,0x02,0x00,0x00,0x08,0x02,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x03,0x00,0x03,0x3c,0x3d,0x3e,0x00,0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,0x00, -0x01,0x3c,0x00,0x00,0x00,0x00,0x6e,0x00,0x04,0x00,0x06,0x00,0x00,0x00,0x12,0x02, -0x00,0x00,0x26,0x02,0x00,0x00,0x06,0x02,0x80,0x40,0x01,0x02,0x00,0x00,0xa0,0x01, -0x81,0x00,0x01,0x02,0x00,0xc0,0x01,0x02,0x00,0x40,0x20,0x02,0x40,0x01,0x19,0x02, -0x00,0x00,0x08,0x00,0x40,0x03,0x97,0x02,0x00,0xc0,0x01,0x02,0xbf,0xff,0x83,0x02, -0x00,0x80,0xb4,0x02,0x40,0x01,0x19,0x02,0x00,0x00,0x07,0x00,0x40,0x00,0x97,0x02, -0x00,0x00,0x08,0x02,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00, -0x03,0x3c,0x3d,0x3e,0x00,0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,0x00,0x02,0x3c,0x3d, -0x00,0x00,0x00,0x00,0x53,0x00,0x04,0x00,0x06,0x00,0x00,0x00,0x0d,0x02,0x00,0x00, -0x26,0x02,0x00,0x00,0x06,0x02,0x80,0x40,0x01,0x02,0x00,0x00,0xa0,0x01,0x81,0x00, -0x01,0x02,0x00,0xc0,0x01,0x02,0xbf,0xff,0x83,0x02,0x00,0x40,0xb2,0x02,0x40,0x01, -0x19,0x02,0x00,0x00,0x07,0x00,0x40,0x00,0x97,0x02,0x00,0x00,0x08,0x02,0x00,0x00, -0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x3c,0x3d,0x3e,0x00,0x00, -0x02,0x3d,0x3d,0x00,0x00,0x00,0x00,0x6d,0x00,0x04,0x00,0x06,0x00,0x00,0x00,0x12, -0x02,0x00,0x00,0x26,0x02,0x00,0x00,0x06,0x02,0x80,0x40,0x01,0x02,0x00,0x00,0xa0, -0x01,0x81,0x00,0x01,0x02,0x00,0xc0,0x01,0x02,0x00,0x40,0x20,0x02,0x40,0x01,0x19, -0x02,0x00,0x00,0x08,0x00,0x40,0x03,0x97,0x02,0x00,0xc0,0x01,0x02,0xbf,0xff,0x83, -0x02,0x00,0x80,0xb5,0x02,0x40,0x01,0x19,0x02,0x00,0x00,0x07,0x00,0x40,0x00,0x97, -0x02,0x00,0x00,0x08,0x02,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, -0x00,0x03,0x3c,0x3d,0x3e,0x00,0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,0x00,0x01,0x3e, -0x00,0x00,0x00,0x00,0x6e,0x00,0x04,0x00,0x06,0x00,0x00,0x00,0x12,0x02,0x00,0x00, -0x26,0x02,0x00,0x00,0x06,0x02,0x80,0x40,0x01,0x02,0x00,0x00,0xa0,0x01,0x81,0x00, -0x01,0x02,0x00,0xc0,0x01,0x02,0x00,0x40,0x20,0x02,0x40,0x01,0x19,0x02,0x00,0x00, -0x08,0x00,0x40,0x03,0x97,0x02,0x00,0xc0,0x01,0x02,0xbf,0xff,0x83,0x02,0x00,0x80, -0xb6,0x02,0x40,0x01,0x19,0x02,0x00,0x00,0x07,0x00,0x40,0x00,0x97,0x02,0x00,0x00, -0x08,0x02,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x3c, -0x3d,0x3e,0x00,0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,0x00,0x02,0x3e,0x3d,0x00,0x00, -0x00,0x00,0x50,0x00,0x04,0x00,0x06,0x00,0x00,0x00,0x0d,0x04,0x00,0x00,0x26,0x02, -0x00,0x00,0x06,0x02,0x80,0x40,0x01,0x02,0x00,0x00,0xb3,0x02,0x40,0x01,0x98,0x02, -0x00,0x00,0x06,0x02,0x80,0x80,0x01,0x02,0x00,0x40,0xb5,0x02,0x40,0x01,0x19,0x02, -0x00,0x00,0x08,0x00,0x40,0x00,0x97,0x02,0x00,0x00,0x07,0x02,0x00,0x00,0x29,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x3c,0x00,0x00,0x01,0x3e,0x00,0x00, -0x00,0x02,0x29,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x4f,0x00,0x80,0x00,0x48,0x01, -0x00,0x02,0xc0,0x00,0x80,0x00,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x08,0xc0,0x00, -0x80,0x40,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x0e,0xc0,0x00,0x80,0x80,0x46,0x00, -0x80,0x00,0x48,0x01,0x00,0x12,0xc0,0x00,0x80,0xc0,0x46,0x00,0x80,0x00,0x48,0x01, -0x00,0x16,0xc0,0x00,0x81,0x00,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x1a,0xc0,0x00, -0x81,0x40,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x03,0x04,0x01,0x80,0x01,0x84,0x02, -0x00,0x00,0x05,0x00,0x81,0xc1,0x20,0x00,0x80,0x00,0x48,0x01,0x00,0x1e,0xc0,0x00, -0x82,0x00,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x22,0xc0,0x00,0x82,0x40,0x46,0x00, -0x80,0x00,0x48,0x01,0x00,0x26,0xc0,0x00,0x82,0x80,0x46,0x00,0x80,0x00,0x48,0x01, -0x00,0x2a,0xc0,0x00,0x82,0xc0,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x06,0x04,0x01, -0x80,0x05,0x84,0x02,0x00,0x00,0x05,0x00,0x81,0xc1,0x20,0x00,0x80,0x00,0x48,0x01, -0x00,0x06,0x84,0x01,0x80,0x01,0x04,0x02,0x00,0x00,0x05,0x00,0x81,0xc1,0x20,0x00, -0x80,0x00,0x48,0x01,0x00,0x30,0xc0,0x00,0x83,0x80,0x46,0x00,0x80,0x00,0x48,0x01, -0x00,0x34,0xc0,0x00,0x83,0xc0,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x08,0x04,0x01, -0x80,0x05,0x04,0x02,0x00,0x00,0x05,0x00,0x81,0xc1,0x20,0x00,0x80,0x00,0x48,0x01, -0x00,0x38,0xc0,0x00,0x84,0x40,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x3c,0xc0,0x00, -0x84,0x80,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x09,0x84,0x01,0x80,0x04,0x04,0x02, -0x00,0x00,0x05,0x00,0x81,0xc1,0x20,0x00,0x80,0x00,0x48,0x01,0x00,0x40,0xc0,0x00, -0x85,0x00,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x44,0xc0,0x00,0x85,0x40,0x46,0x00, -0x80,0x00,0x48,0x01,0x00,0x0b,0x04,0x01,0x80,0x02,0x84,0x02,0x00,0x00,0x05,0x00, -0x81,0xc1,0x20,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,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,0x00,0x00,0x4b,0x00,0x03,0x00,0x05, -0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x07,0x01,0x80,0x40,0x01, -0x01,0xc0,0x02,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x03,0x40,0x01,0x80,0x00,0x21, -0x00,0x40,0x01,0x97,0x01,0x80,0x00,0x06,0x02,0x00,0x05,0x40,0x01,0x80,0x00,0x21, -0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61, -0x63,0x68,0x00,0x00,0x00,0x00,0x47,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x0b,0x02, -0x00,0x00,0x26,0x01,0x80,0x40,0x15,0x02,0x00,0x40,0x01,0x01,0x80,0x00,0xa0,0x01, -0xc0,0x01,0x19,0x01,0x80,0x00,0x05,0x00,0x40,0x01,0x97,0x01,0x80,0x00,0x08,0x01, -0x80,0x80,0x16,0x01,0x80,0x40,0x29,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x38,0x00,0x03, -0x00,0x04,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0xc0, -0x01,0x19,0x01,0x80,0x00,0x05,0x00,0x40,0x01,0x97,0x01,0x80,0x00,0x08,0x01,0x80, -0x80,0x16,0x01,0x80,0x40,0x29,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x0c,0x00,0x00, -0x00,0xa6,0x01,0x00,0x00,0x08,0x01,0x80,0x40,0x01,0x01,0xc0,0x02,0x19,0x01,0x80, -0x00,0x06,0x02,0x00,0x03,0x40,0x01,0x80,0x00,0x21,0x00,0x40,0x01,0x97,0x01,0x80, -0x00,0x06,0x02,0x00,0x05,0x40,0x01,0x80,0x00,0x21,0x01,0x00,0x00,0x29,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00, -0x47,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x26,0x01,0x80,0x40, -0x15,0x02,0x00,0x40,0x01,0x01,0x80,0x00,0xa0,0x01,0xc0,0x02,0x19,0x01,0x80,0x00, -0x07,0x01,0x80,0x80,0x16,0x01,0x80,0x40,0x29,0x00,0x40,0x00,0x97,0x01,0x80,0x00, -0x05,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x63, -0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x38,0x00,0x03,0x00,0x04,0x00,0x00,0x00,0x09, -0x02,0x00,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0xc0,0x02,0x19,0x01,0x80,0x00,0x07, -0x01,0x80,0x80,0x16,0x01,0x80,0x40,0x29,0x00,0x40,0x00,0x97,0x01,0x80,0x00,0x05, -0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33, -0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0xa6,0x01,0x00,0xc0,0x37, -0x01,0x80,0x00,0x06,0x02,0x00,0x03,0x40,0x01,0x80,0x00,0x21,0x01,0x00,0x00,0x29, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00, -0x00,0x00,0x3e,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x07,0x02,0x00,0x00,0x26,0x01, -0x80,0x80,0x15,0x02,0x00,0x40,0x15,0x02,0x80,0x40,0x01,0x02,0x00,0x40,0xa0,0x01, -0x80,0x00,0xa0,0x01,0x80,0x00,0x29,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, -0x3f,0x00,0x04,0x00,0x06,0x00,0x00,0x00,0x09,0x00,0x10,0x00,0xa6,0x00,0x40,0x00, -0x97,0x00,0x40,0x00,0x97,0x00,0x80,0x00,0x05,0x01,0x80,0x40,0x01,0x02,0x00,0x00, -0x06,0x02,0x80,0x03,0x40,0x02,0x00,0x00,0x21,0x01,0x80,0x00,0x29,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x43, -0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x0a,0x02,0x00,0x00,0x26,0x01,0x80,0x80,0x15, -0x02,0x00,0x40,0x01,0x01,0x80,0x00,0xa0,0x01,0xc0,0x01,0x99,0x00,0x80,0xc0,0x16, -0x01,0x80,0x40,0x29,0x00,0x40,0x00,0x97,0x01,0x80,0x00,0x05,0x01,0x80,0x00,0x29, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00, -0x00,0x00,0x37,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xa6,0x01, -0x3f,0xff,0x83,0x01,0x80,0x00,0x06,0x02,0x00,0x03,0x40,0x01,0x80,0x00,0x21,0x01, -0x80,0x00,0x06,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00, -0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x43,0x00,0x03,0x00,0x06,0x00,0x00, -0x00,0x09,0x02,0x00,0x00,0x26,0x01,0x80,0x40,0x15,0x02,0x00,0x40,0x01,0x02,0x80, -0x80,0x15,0x01,0x80,0x01,0x20,0x01,0x80,0x80,0x15,0x01,0x80,0x40,0xad,0x01,0x80, -0x80,0x16,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04, -0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0x33,0x00,0x03,0x00, -0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x26,0x01,0x00,0xc0,0x37,0x01,0x80,0x00, -0x06,0x02,0x00,0x03,0x40,0x01,0x80,0x00,0x21,0x01,0x00,0x00,0x29,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x2f, -0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x26,0x01,0x80,0x80,0x15, -0x02,0x00,0x40,0x01,0x01,0x80,0x00,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x01,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x00,0x00,0x33,0x00, -0x03,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0xa6,0x01,0x00,0xc0,0x37,0x01, -0x80,0x00,0x06,0x02,0x00,0x03,0x40,0x01,0x80,0x00,0x21,0x01,0x00,0x00,0x29,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00, -0x00,0x4e,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x26,0x01,0x80, -0x40,0x15,0x02,0x00,0x40,0x01,0x01,0x80,0x00,0xa0,0x01,0xc0,0x02,0x19,0x01,0x80, -0x80,0x15,0x02,0x00,0x40,0x01,0x01,0x80,0x40,0xa0,0x00,0x40,0x00,0x97,0x01,0x80, -0x00,0x05,0x01,0x80,0x00,0x29,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,0x33, -0x00,0x04,0x00,0x06,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0xa6,0x01,0x81,0x00,0x37, -0x02,0x00,0x00,0x06,0x02,0x80,0x03,0x40,0x02,0x00,0x00,0x21,0x01,0x80,0x00,0x29, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00, -0x00,0x00,0x6c,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x26,0x01, -0x80,0x40,0x15,0x02,0x00,0x40,0x01,0x01,0x80,0x00,0xa0,0x01,0xc0,0x05,0x19,0x01, -0x80,0xc0,0x15,0x02,0x00,0x80,0x15,0x02,0x40,0x02,0x19,0x02,0x00,0x80,0x15,0x02, -0x80,0x40,0x01,0x02,0x00,0x80,0xa0,0x00,0x40,0x00,0x97,0x02,0x00,0x40,0x01,0x01, -0x80,0x40,0xa0,0x00,0x40,0x00,0x97,0x01,0x80,0x00,0x05,0x01,0x80,0x00,0x29,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x3d,0x3d,0x3d,0x00,0x00,0x04,0x70, -0x75,0x73,0x68,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x33,0x00, -0x04,0x00,0x06,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x26,0x01,0x80,0x00,0x08,0x02, -0x00,0x00,0x06,0x02,0x80,0x03,0x40,0x02,0x00,0x00,0x21,0x01,0x80,0x00,0x29,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00, -0x00,0x45,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x26,0x01,0x80, -0x40,0x01,0x02,0x00,0x40,0x15,0x01,0x80,0x00,0xb2,0x01,0xc0,0x02,0x19,0x01,0x80, -0x00,0x07,0x01,0x80,0xc0,0x16,0x01,0x80,0x40,0x29,0x00,0x40,0x00,0x97,0x01,0x80, -0x00,0x05,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02, -0x3d,0x3d,0x00,0x00,0x00,0x01,0x12,0x00,0x06,0x00,0x09,0x00,0x00,0x00,0x27,0x00, -0x08,0x00,0xa6,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x03,0xc0,0x00,0x83,0x03, -0x00,0x40,0xb5,0x03,0x40,0x02,0x19,0x03,0x00,0x00,0x06,0x03,0x80,0x01,0x91,0x04, -0x00,0x00,0x3d,0x03,0x00,0x81,0x20,0x03,0x00,0x02,0x11,0x03,0x80,0x40,0x01,0x04, -0x3f,0xff,0x03,0x03,0x81,0x80,0xa0,0x03,0x01,0x40,0xa0,0x03,0x40,0x04,0x19,0x03, -0x00,0x40,0x01,0x03,0xbf,0xff,0x03,0x03,0x01,0x80,0xa0,0x01,0x81,0x80,0x01,0x03, -0x00,0x03,0xc0,0x01,0x01,0x80,0x01,0x03,0x00,0x40,0x01,0x03,0x01,0xc0,0x20,0x03, -0x00,0x40,0x01,0x03,0x02,0x00,0x20,0x03,0x40,0x01,0x99,0x02,0x00,0x00,0x07,0x02, -0x80,0x00,0x05,0x00,0x40,0x02,0x97,0x02,0x00,0x00,0x08,0x03,0x00,0x40,0x01,0x03, -0xbf,0xff,0x83,0x03,0x01,0x80,0xa0,0x02,0x81,0x80,0x01,0x03,0x00,0x00,0x06,0x03, -0x80,0x05,0x40,0x03,0x02,0x40,0x21,0x02,0x80,0x00,0x29,0x00,0x00,0x00,0x01,0x10, -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,0x33,0x00,0x04,0x00,0x07,0x00,0x00,0x00, -0x06,0x04,0x00,0x00,0x26,0x02,0x00,0x40,0x01,0x02,0x80,0xc0,0x15,0x03,0x00,0x80, -0x01,0x02,0x00,0x01,0x20,0x02,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x01,0x00,0x04,0x73,0x65,0x6e,0x64,0x00,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x06, -0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0x26,0x01,0x81,0x00,0x15,0x01,0xc0,0x02,0x99, -0x01,0x80,0x00,0x08,0x01,0x81,0x00,0x16,0x01,0x80,0x40,0x01,0x01,0x81,0x40,0x16, -0x00,0x40,0x02,0x97,0x01,0x80,0x80,0x15,0x02,0x01,0x40,0x15,0x02,0x80,0x40,0x01, -0x01,0x80,0x01,0x20,0x01,0x81,0x40,0x16,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x37,0x00, -0x04,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x07,0x01, -0x80,0x00,0x05,0x02,0x00,0x00,0x06,0x02,0x80,0x03,0x40,0x02,0x00,0x00,0x21,0x01, -0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63, -0x68,0x00,0x00,0x00,0x00,0xa5,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x20,0x02,0x00, -0x00,0x26,0x01,0x80,0x80,0x15,0x01,0xc0,0x02,0x19,0x00,0x80,0xc0,0x16,0x01,0x80, -0x00,0x08,0x01,0x80,0x80,0x16,0x00,0x40,0x0c,0x17,0x01,0x80,0x40,0x15,0x01,0xc0, -0x06,0x19,0x01,0x80,0x40,0x15,0x02,0x00,0x40,0x01,0x02,0x80,0xc0,0x15,0x01,0x80, -0x01,0x20,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xb5,0x01,0xc0,0x01,0x99,0x01,0x80, -0x40,0x01,0x01,0x80,0xc0,0x16,0x00,0x40,0x00,0x97,0x01,0x80,0x00,0x05,0x00,0x40, -0x05,0x17,0x01,0x80,0x40,0x01,0x02,0x00,0xc0,0x15,0x01,0x80,0x80,0xa0,0x02,0x3f, -0xff,0x83,0x01,0x80,0x40,0xb5,0x01,0xc0,0x01,0x99,0x01,0x80,0x40,0x01,0x01,0x80, -0xc0,0x16,0x00,0x40,0x00,0x97,0x01,0x80,0x00,0x05,0x01,0x80,0x00,0x29,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x3e, -0x00,0x00,0x03,0x3c,0x3d,0x3e,0x00,0x00,0x00,0x00,0x37,0x00,0x04,0x00,0x06,0x00, -0x00,0x00,0x07,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x07,0x01,0x80,0x00,0x05,0x02, -0x00,0x00,0x06,0x02,0x80,0x03,0x40,0x02,0x00,0x00,0x21,0x01,0x80,0x00,0x29,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00, -0x00,0xa5,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x26,0x01,0x80, -0x80,0x15,0x01,0xc0,0x02,0x19,0x00,0x80,0xc0,0x16,0x01,0x80,0x00,0x08,0x01,0x80, -0x80,0x16,0x00,0x40,0x0c,0x17,0x01,0x80,0x40,0x15,0x01,0xc0,0x06,0x19,0x01,0x80, -0x40,0x15,0x02,0x00,0x40,0x01,0x02,0x80,0xc0,0x15,0x01,0x80,0x01,0x20,0x02,0x3f, -0xff,0x83,0x01,0x80,0x40,0xb3,0x01,0xc0,0x01,0x99,0x01,0x80,0x40,0x01,0x01,0x80, -0xc0,0x16,0x00,0x40,0x00,0x97,0x01,0x80,0x00,0x05,0x00,0x40,0x05,0x17,0x01,0x80, -0x40,0x01,0x02,0x00,0xc0,0x15,0x01,0x80,0x80,0xa0,0x02,0x3f,0xff,0x83,0x01,0x80, -0x40,0xb3,0x01,0xc0,0x01,0x99,0x01,0x80,0x40,0x01,0x01,0x80,0xc0,0x16,0x00,0x40, -0x00,0x97,0x01,0x80,0x00,0x05,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x3c,0x00,0x00,0x03,0x3c, -0x3d,0x3e,0x00,0x00,0x00,0x00,0x43,0x00,0x04,0x00,0x06,0x00,0x00,0x00,0x0a,0x00, -0x00,0x00,0xa6,0x01,0x01,0x00,0x37,0x01,0x81,0x00,0x37,0x02,0x00,0x00,0x06,0x02, -0x80,0x03,0x40,0x02,0x00,0x00,0x21,0x02,0x00,0x80,0x01,0x02,0x80,0xc0,0x01,0x02, -0x01,0x01,0x37,0x02,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00, -0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x56,0x00,0x03,0x00,0x05,0x00,0x00, -0x00,0x0d,0x02,0x00,0x00,0x26,0x01,0x80,0x40,0x15,0x02,0x00,0x40,0x01,0x01,0x80, -0x00,0xa0,0x01,0xc0,0x02,0x19,0x01,0x80,0x80,0x15,0x02,0x00,0x40,0x01,0x01,0x80, -0x40,0xa0,0x00,0x40,0x01,0x97,0x01,0x80,0xc0,0x15,0x02,0x00,0x40,0x01,0x01,0x80, -0x40,0xa0,0x01,0x80,0x00,0x29,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,0x33, -0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0xa6,0x01,0x00,0xc0,0x37, -0x01,0x80,0x00,0x06,0x02,0x00,0x03,0x40,0x01,0x80,0x00,0x21,0x01,0x00,0x00,0x29, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00, -0x00,0x00,0x4e,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x0b,0x02,0x00,0x00,0x26,0x01, -0x80,0x40,0x15,0x02,0x00,0x40,0x01,0x01,0x80,0x00,0xa0,0x01,0xc0,0x01,0x19,0x01, -0x80,0x00,0x05,0x00,0x40,0x01,0x97,0x01,0x80,0x80,0x15,0x02,0x00,0x40,0x01,0x01, -0x80,0x40,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, -0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x00,0x01, -0x9a,0x00,0x0c,0x00,0x13,0x00,0x00,0x00,0x53,0x0a,0x00,0x00,0xa6,0x06,0x01,0x00, -0x01,0x06,0x81,0x40,0x01,0x06,0x00,0x00,0xb2,0x06,0x40,0x06,0x99,0x06,0x00,0xc0, -0x01,0x06,0xc0,0x00,0x03,0x06,0x00,0x00,0xb2,0x06,0x40,0x03,0x99,0x06,0x00,0x80, -0x01,0x06,0x81,0x00,0x01,0x06,0x00,0x40,0xa0,0x06,0x80,0x40,0x01,0x07,0x01,0x00, -0x01,0x07,0x83,0x00,0x01,0x06,0x80,0x81,0x20,0x06,0x00,0x00,0x05,0x06,0x00,0x00, -0x29,0x06,0x00,0xc0,0x01,0x06,0xbf,0xff,0x83,0x06,0x00,0x00,0xb2,0x06,0x40,0x02, -0x99,0x06,0x00,0x40,0x01,0x06,0x80,0x80,0x01,0x03,0x83,0x00,0x01,0x04,0x03,0x40, -0x01,0x00,0x40,0x02,0x17,0x06,0x00,0x80,0x01,0x06,0x80,0x40,0x01,0x03,0x83,0x00, -0x01,0x04,0x03,0x40,0x01,0x06,0x01,0xc0,0x01,0x06,0x81,0x00,0x01,0x06,0x00,0x40, -0xa0,0x04,0x83,0x00,0x01,0x06,0x01,0x00,0x01,0x06,0x81,0x40,0x01,0x05,0x03,0x00, -0x01,0x05,0x83,0x40,0x01,0x06,0x01,0x00,0x01,0x06,0x00,0xc0,0xad,0x06,0x81,0x40, -0x01,0x07,0x00,0x03,0x40,0x06,0x01,0x00,0xa1,0x06,0x02,0x40,0x01,0x06,0x80,0x40, -0x01,0x07,0x02,0x80,0x01,0x07,0x83,0x00,0x01,0x06,0x80,0x81,0x20,0x06,0x00,0xc0, -0x01,0x06,0x00,0xc0,0xad,0x06,0xc0,0x00,0x83,0x06,0x01,0x40,0xa0,0x01,0x83,0x00, -0x01,0x06,0x02,0x80,0x01,0x06,0x81,0x00,0x01,0x06,0x01,0x80,0xb5,0x06,0x40,0x04, -0x99,0x06,0x00,0x00,0x06,0x06,0x80,0x40,0x01,0x07,0x00,0x80,0x01,0x07,0x80,0xc0, -0x01,0x08,0x01,0x00,0x01,0x08,0x82,0x80,0x01,0x08,0x82,0x00,0xaf,0x09,0x01,0x80, -0x01,0x06,0x01,0xc2,0xa1,0x06,0x02,0x80,0x01,0x06,0x81,0x40,0x01,0x06,0x02,0x40, -0xb3,0x06,0x40,0x05,0x19,0x06,0x00,0x00,0x06,0x06,0x80,0x40,0x01,0x07,0x00,0x80, -0x01,0x07,0x80,0xc0,0x01,0x08,0x02,0x80,0x01,0x08,0x00,0xc0,0xad,0x08,0x81,0x40, -0x01,0x09,0x01,0x80,0x01,0x06,0x01,0xc2,0xa1,0x00,0x40,0x00,0x97,0x06,0x00,0x00, -0x05,0x06,0x00,0x00,0x29,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,0xd8,0x00,0x03,0x00,0x07,0x00, -0x00,0x00,0x28,0x02,0x00,0x00,0x26,0x01,0x81,0x80,0x15,0x01,0xc0,0x03,0x99,0x01, -0x81,0x80,0x15,0x02,0x01,0xc0,0x15,0x02,0x80,0x40,0x01,0x02,0x00,0x40,0xa0,0x02, -0x82,0x40,0x15,0x01,0x80,0x01,0x20,0x00,0x40,0x02,0x97,0x01,0x81,0xc0,0x15,0x02, -0x00,0x40,0x01,0x01,0x80,0x40,0xa0,0x02,0x02,0x40,0x15,0x01,0x80,0x80,0xa0,0x02, -0x3f,0xff,0x83,0x01,0x80,0xc0,0xb5,0x01,0xc0,0x05,0x99,0x01,0x81,0xc0,0x15,0x02, -0x00,0x40,0x01,0x01,0x80,0x40,0xa0,0x02,0x02,0x00,0x15,0x02,0x82,0xc0,0x15,0x03, -0x00,0xc0,0x01,0x02,0x01,0x01,0x20,0x01,0x82,0xc0,0x15,0x01,0x81,0x40,0xaf,0x01, -0x82,0xc0,0x16,0x00,0x40,0x05,0x17,0x01,0x81,0xc0,0x15,0x02,0x00,0x40,0x01,0x01, -0x80,0x40,0xa0,0x02,0x02,0x00,0x15,0x02,0x82,0x80,0x15,0x03,0x00,0xc0,0x01,0x02, -0x01,0x01,0x20,0x01,0x82,0x80,0x15,0x01,0x81,0x80,0xad,0x01,0x82,0x80,0x16,0x01, -0x80,0x00,0x29,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,0xac,0x00,0x03,0x00,0x0a,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xa6,0x01, -0x00,0xc0,0x37,0x01,0x80,0x00,0x06,0x02,0x00,0x03,0x40,0x01,0x80,0x00,0x21,0x01, -0x80,0x80,0x01,0x01,0x80,0x40,0x20,0x01,0xc0,0x00,0x99,0x00,0x40,0x07,0x17,0x01, -0x80,0x00,0x06,0x02,0x00,0x80,0x01,0x02,0x80,0x00,0x42,0x02,0x80,0x01,0x93,0x03, -0x00,0x80,0x01,0x03,0x01,0x40,0x20,0x02,0x81,0x00,0xa0,0x03,0x3f,0xff,0x83,0x03, -0xbf,0xff,0x83,0x04,0x00,0x80,0x01,0x04,0x01,0x40,0x20,0x04,0x01,0x80,0xaf,0x04, -0x80,0x40,0x01,0x01,0x80,0x82,0xa1,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x07,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x06,0x65,0x6d,0x70,0x74, -0x79,0x3f,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,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2d,0x00,0x00,0x00,0x00,0x2f,0x00, -0x03,0x00,0x05,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x26,0x01,0x80,0x80,0x15,0x02, -0x00,0x40,0x01,0x01,0x80,0x00,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x01,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x00,0x00,0x38,0x00,0x01, -0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x80,0x00,0x06,0x00,0x80,0x40,0x47,0x01,0x00, -0x02,0xc0,0x00,0x80,0x00,0x46,0x00,0x80,0x00,0x04,0x01,0x00,0x00,0x29,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x65,0x78,0x63,0x65,0x70,0x74,0x69,0x6f, -0x6e,0x00,0x00,0x00,0x00,0x3a,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x08,0x00,0x08, -0x00,0xa6,0x01,0x80,0x00,0x06,0x02,0x01,0x00,0x37,0x02,0x80,0x40,0x01,0x02,0x01, -0x40,0x38,0x02,0x80,0x80,0x01,0x01,0x80,0x3f,0xa1,0x01,0x80,0x00,0x29,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x00,0x00,0x1c, -0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x80,0x00,0x05,0x01,0x00,0x00,0x29, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x01,0x00,0x02, -0x00,0x00,0x00,0x02,0x00,0x80,0x00,0x05,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x02, -0x00,0x80,0x00,0x05,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x1c,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x80,0x00,0x05, -0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c, -0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x80,0x00,0x05,0x01,0x00,0x00,0x29, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x01,0x00,0x02, -0x00,0x00,0x00,0x02,0x00,0x80,0x00,0x05,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x0b, -0x00,0x80,0x00,0x06,0x01,0x00,0x00,0x84,0x00,0x80,0x00,0xa0,0x00,0x80,0x00,0x48, -0x01,0x00,0x02,0xc0,0x00,0x80,0x80,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x04,0xc0, -0x00,0x80,0xc0,0x46,0x00,0x80,0x01,0x84,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x04,0x00,0x0d,0x61,0x74,0x74,0x72,0x5f,0x61,0x63,0x63,0x65,0x73, -0x73,0x6f,0x72,0x00,0x00,0x04,0x6e,0x61,0x6d,0x65,0x00,0x00,0x03,0x6e,0x65,0x77, -0x00,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00, -0x00,0x59,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x0b,0x00,0x20,0x00,0x26,0x00,0x40, -0x01,0x17,0x00,0x40,0x01,0x17,0x00,0x40,0x01,0x17,0x00,0x80,0x00,0x3d,0x01,0x00, -0x00,0x05,0x02,0x00,0x00,0x06,0x02,0x80,0x40,0x01,0x03,0x00,0x80,0x01,0x02,0x00, -0x01,0x20,0x02,0x00,0x00,0x29,0x00,0x00,0x00,0x01,0x10,0x00,0x09,0x4e,0x61,0x6d, -0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x00,0x01,0x00,0x0a,0x69,0x6e,0x69,0x74, -0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0x00,0x48,0x00,0x04,0x00,0x06,0x00, -0x00,0x00,0x0b,0x00,0x20,0x00,0x26,0x00,0x40,0x01,0x17,0x00,0x40,0x01,0x17,0x00, -0x40,0x01,0x17,0x00,0x80,0x00,0x05,0x01,0x00,0x00,0x05,0x01,0x00,0x00,0x0e,0x02, -0x80,0x40,0x01,0x03,0x00,0x00,0x05,0x02,0x00,0x00,0xa4,0x02,0x00,0x00,0x29,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x05,0x40,0x6e,0x61,0x6d,0x65,0x00,0x00, -0x00,0x00,0x1c,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x80,0x00,0x05,0x01, -0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00, -0x01,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x80,0x00,0x05,0x01,0x00,0x00,0x29,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x01,0x00,0x02,0x00, -0x00,0x00,0x02,0x00,0x80,0x00,0x05,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x02,0x00, -0x80,0x00,0x05,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0xf7,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x80,0x00,0x48,0x01, -0x00,0x02,0xc0,0x00,0x80,0x00,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x04,0xc0,0x00, -0x80,0x40,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x08,0xc0,0x00,0x80,0x80,0x46,0x00, -0x80,0x00,0x48,0x01,0x00,0x0c,0xc0,0x00,0x80,0xc0,0x46,0x00,0x80,0x00,0x48,0x01, -0x00,0x10,0xc0,0x00,0x81,0x00,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x12,0xc0,0x00, -0x81,0x40,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x1a,0xc0,0x00,0x81,0x80,0x46,0x00, -0x80,0x00,0x48,0x01,0x00,0x20,0xc0,0x00,0x81,0xc0,0x46,0x00,0x80,0x00,0x48,0x01, -0x00,0x24,0xc0,0x00,0x82,0x00,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x2a,0xc0,0x00, -0x82,0x40,0x46,0x00,0x80,0x04,0x84,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x0a,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,0x0a,0x69,0x6e,0x69, -0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x05,0x6d,0x65,0x72,0x67,0x65,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,0x00,0x00,0x75,0x00,0x03,0x00,0x05,0x00,0x00, -0x00,0x10,0x02,0x00,0x00,0xa6,0x01,0x80,0x80,0x01,0x01,0xc0,0x02,0x19,0x01,0x80, -0x00,0x06,0x02,0x00,0x40,0x01,0x01,0x80,0x00,0xa0,0x01,0x80,0x40,0x20,0x01,0xc0, -0x02,0x19,0x01,0x80,0x80,0x01,0x02,0x00,0x40,0x01,0x01,0x80,0x80,0xa0,0x00,0x40, -0x01,0x97,0x01,0x80,0x00,0x06,0x02,0x00,0x40,0x01,0x01,0x80,0xc0,0xa0,0x01,0x80, -0x00,0x29,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,0x3e,0x00, -0x02,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x06,0x01, -0x00,0x00,0x20,0x01,0x80,0x03,0x40,0x01,0x00,0x40,0x21,0x01,0x00,0x00,0x06,0x01, -0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x6b,0x65,0x79, -0x73,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x44,0x00,0x03,0x00, -0x07,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x26,0x01,0x80,0x40,0x15,0x02,0x00,0x40, -0x01,0x02,0x80,0x00,0x06,0x03,0x00,0x40,0x01,0x02,0x80,0x40,0xa0,0x02,0x01,0x01, -0x37,0x01,0x80,0x00,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x02,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x00,0x00, -0x3e,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xa6,0x01,0x00,0x00, -0x06,0x01,0x00,0x00,0x20,0x01,0x80,0x03,0x40,0x01,0x00,0x40,0x21,0x01,0x00,0x00, -0x06,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x6b, -0x65,0x79,0x73,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x2f,0x00, -0x03,0x00,0x05,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x26,0x01,0x80,0x40,0x15,0x02, -0x00,0x40,0x01,0x01,0x80,0x00,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x3e,0x00,0x02, -0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x06,0x01,0x00, -0x00,0x20,0x01,0x80,0x03,0x40,0x01,0x00,0x40,0x21,0x01,0x00,0x00,0x06,0x01,0x00, -0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x6b,0x65,0x79,0x73, -0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x3c,0x00,0x03,0x00,0x06, -0x00,0x00,0x00,0x07,0x02,0x00,0x00,0x26,0x01,0x80,0x40,0x15,0x02,0x00,0x00,0x06, -0x02,0x80,0x40,0x01,0x02,0x00,0x40,0xa0,0x01,0x80,0x00,0xa0,0x01,0x80,0x00,0x29, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00, -0x02,0x5b,0x5d,0x00,0x00,0x00,0x00,0x42,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x08, -0x00,0x08,0x00,0xa6,0x01,0x80,0x00,0x06,0x02,0x00,0x80,0x01,0x02,0x01,0x00,0xb7, -0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x80,0x3f,0xa0,0x01,0x80,0x00,0x29, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0b,0x5f,0x5f,0x69,0x6e,0x69,0x74, -0x5f,0x63,0x6f,0x72,0x65,0x00,0x00,0x00,0x00,0xca,0x00,0x04,0x00,0x06,0x00,0x00, -0x00,0x1a,0x02,0x00,0x00,0xa6,0x01,0x81,0x00,0x3f,0x02,0x00,0x40,0x01,0x02,0x80, -0x00,0x84,0x02,0x00,0x00,0xa0,0x02,0x40,0x00,0x99,0x00,0x40,0x01,0x97,0x02,0x00, -0x00,0x06,0x02,0x80,0x00,0x3d,0x02,0x00,0x80,0xa0,0x02,0x00,0x40,0x01,0x02,0x00, -0x40,0x20,0x00,0x81,0x00,0x01,0x02,0x00,0x00,0x06,0x02,0x80,0x03,0x40,0x02,0x00, -0xc0,0x21,0x02,0x00,0x80,0x01,0x02,0x40,0x02,0x19,0x02,0x00,0x40,0x01,0x02,0x80, -0x05,0x40,0x02,0x00,0xc0,0x21,0x00,0x40,0x01,0x97,0x02,0x00,0x40,0x01,0x02,0x80, -0x07,0x40,0x02,0x00,0xc0,0x21,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x01,0x10,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,0x04,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,0x08,0x65,0x61,0x63,0x68,0x5f,0x6b,0x65,0x79,0x00, -0x00,0x00,0x00,0x43,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x26, -0x01,0x80,0x00,0x06,0x02,0x00,0x40,0x01,0x01,0x80,0x00,0xa0,0x02,0x00,0xc0,0x15, -0x02,0x80,0x40,0x01,0x03,0x00,0xc0,0x01,0x02,0x00,0x41,0x20,0x01,0x80,0x00,0x29, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x5b, -0x5d,0x3d,0x00,0x00,0x00,0x00,0x8d,0x00,0x03,0x00,0x08,0x00,0x00,0x00,0x17,0x02, -0x00,0x00,0x26,0x01,0x80,0x00,0x06,0x02,0x00,0x40,0x01,0x01,0x80,0x00,0xa0,0x01, -0xc0,0x05,0x19,0x01,0x80,0x80,0x15,0x02,0x00,0x40,0x01,0x02,0x80,0x00,0x06,0x03, -0x00,0x40,0x01,0x02,0x80,0x80,0xa0,0x03,0x00,0x40,0x15,0x03,0x80,0x40,0x01,0x03, -0x00,0x80,0xa0,0x01,0x80,0x41,0xa0,0x00,0x40,0x01,0x97,0x01,0x80,0x40,0x15,0x02, -0x00,0x40,0x01,0x01,0x80,0x80,0xa0,0x02,0x00,0xc0,0x15,0x02,0x80,0x40,0x01,0x03, -0x00,0xc0,0x01,0x02,0x00,0xc1,0x20,0x01,0x80,0x00,0x29,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,0x43,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x09,0x02,0x00,0x00,0x26, -0x01,0x80,0x40,0x15,0x02,0x00,0x40,0x01,0x01,0x80,0x00,0xa0,0x02,0x00,0xc0,0x15, -0x02,0x80,0x40,0x01,0x03,0x00,0xc0,0x01,0x02,0x00,0x41,0x20,0x01,0x80,0x00,0x29, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x5b, -0x5d,0x3d,0x00,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x11,0x00, -0x00,0x00,0xa6,0x01,0x00,0xc0,0x37,0x01,0x80,0x00,0x06,0x02,0x00,0x03,0x40,0x01, -0x80,0x00,0x21,0x01,0x80,0x80,0x01,0x01,0x80,0x40,0x20,0x02,0x3f,0xff,0x83,0x01, -0x80,0x80,0xb2,0x01,0xc0,0x01,0x19,0x01,0x80,0x00,0x05,0x01,0x80,0x00,0x29,0x01, -0x80,0x80,0x01,0x02,0x00,0x05,0x40,0x01,0x80,0xc0,0x21,0x01,0x80,0x00,0x06,0x01, -0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x65,0x61,0x63, -0x68,0x5f,0x6b,0x65,0x79,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x3d, -0x3d,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x67,0x00,0x04,0x00, -0x07,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x26,0x02,0x00,0x00,0x06,0x02,0x80,0x40, -0x01,0x02,0x00,0x00,0xa0,0x01,0x81,0x00,0x01,0x02,0x00,0x40,0x15,0x02,0x80,0x40, -0x01,0x03,0x00,0xc0,0x01,0x02,0x00,0x41,0x20,0x02,0x40,0x02,0x19,0x02,0x00,0x80, -0x15,0x02,0x80,0x40,0x01,0x02,0x00,0x80,0xa0,0x00,0x40,0x00,0x97,0x02,0x00,0x00, -0x05,0x02,0x00,0x00,0x29,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, -0x00,0x00,0x00,0x31,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x26, -0x01,0x80,0x00,0x06,0x02,0x00,0x40,0x01,0x01,0x80,0x00,0xa0,0x01,0x80,0x00,0x29, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x64,0x65,0x6c,0x65,0x74,0x65, -0x00,0x00,0x00,0x00,0x37,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00, -0xa6,0x01,0x00,0xc0,0x3f,0x01,0x80,0x00,0x06,0x02,0x00,0x03,0x40,0x01,0x80,0x00, -0x21,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x08,0x65, -0x61,0x63,0x68,0x5f,0x6b,0x65,0x79,0x00,0x00,0x00,0x00,0x6e,0x00,0x04,0x00,0x08, -0x00,0x00,0x00,0x12,0x02,0x00,0x00,0x26,0x02,0x00,0x00,0x06,0x02,0x80,0x40,0x01, -0x02,0x00,0x00,0xa0,0x01,0x81,0x00,0x01,0x02,0x00,0x40,0x15,0x02,0x80,0x40,0x01, -0x03,0x00,0xc0,0x01,0x02,0x00,0x41,0x20,0x02,0x40,0x01,0x19,0x02,0x00,0x00,0x05, -0x00,0x40,0x02,0x97,0x02,0x00,0xc0,0x01,0x02,0x80,0x80,0x15,0x03,0x00,0x40,0x01, -0x03,0x81,0x00,0x01,0x02,0x80,0x81,0x20,0x02,0x00,0x00,0x29,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x03,0x00,0x02,0x5b,0x5d,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00, -0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x05,0x00,0x00, -0x00,0x11,0x00,0x00,0x00,0xa6,0x01,0x00,0xc0,0x37,0x01,0x80,0x00,0x06,0x02,0x00, -0x03,0x40,0x01,0x80,0x00,0x21,0x01,0x80,0x80,0x01,0x01,0x80,0x40,0x20,0x02,0x3f, -0xff,0x83,0x01,0x80,0x80,0xb2,0x01,0xc0,0x01,0x19,0x01,0x80,0x00,0x05,0x01,0x80, -0x00,0x29,0x01,0x80,0x80,0x01,0x02,0x00,0x05,0x40,0x01,0x80,0xc0,0x21,0x01,0x80, -0x00,0x06,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08, -0x65,0x61,0x63,0x68,0x5f,0x6b,0x65,0x79,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00, -0x00,0x02,0x3d,0x3d,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x67, -0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x26,0x02,0x00,0x00,0x06, -0x02,0x80,0x40,0x01,0x02,0x00,0x00,0xa0,0x01,0x81,0x00,0x01,0x02,0x00,0x40,0x15, -0x02,0x80,0x40,0x01,0x03,0x00,0xc0,0x01,0x02,0x00,0x41,0x20,0x02,0x40,0x01,0x19, -0x02,0x00,0x00,0x05,0x00,0x40,0x01,0x97,0x02,0x00,0x80,0x15,0x02,0x80,0x40,0x01, -0x02,0x00,0x80,0xa0,0x02,0x00,0x00,0x29,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,0x00,0x00,0x00,0x31,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x05,0x02, -0x00,0x00,0x26,0x01,0x80,0x00,0x06,0x02,0x00,0x40,0x01,0x01,0x80,0x00,0xa0,0x01, -0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x64,0x65,0x6c, -0x65,0x74,0x65,0x00,0x00,0x00,0x00,0x37,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x06, -0x00,0x00,0x00,0xa6,0x01,0x00,0xc0,0x3f,0x01,0x80,0x00,0x06,0x02,0x00,0x03,0x40, -0x01,0x80,0x00,0x21,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, -0x00,0x08,0x65,0x61,0x63,0x68,0x5f,0x6b,0x65,0x79,0x00,0x00,0x00,0x00,0x6e,0x00, -0x04,0x00,0x08,0x00,0x00,0x00,0x12,0x02,0x00,0x00,0x26,0x02,0x00,0x00,0x06,0x02, -0x80,0x40,0x01,0x02,0x00,0x00,0xa0,0x01,0x81,0x00,0x01,0x02,0x00,0x40,0x15,0x02, -0x80,0x40,0x01,0x03,0x00,0xc0,0x01,0x02,0x00,0x41,0x20,0x02,0x40,0x03,0x19,0x02, -0x00,0xc0,0x01,0x02,0x80,0x80,0x15,0x03,0x00,0x40,0x01,0x03,0x81,0x00,0x01,0x02, -0x80,0x81,0x20,0x00,0x40,0x00,0x97,0x02,0x00,0x00,0x05,0x02,0x00,0x00,0x29,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x5b,0x5d,0x00,0x00,0x04,0x63,0x61, -0x6c,0x6c,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0x1c,0x00,0x01,0x00, -0x02,0x00,0x00,0x00,0x02,0x00,0x80,0x00,0x05,0x01,0x00,0x00,0x29,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x01,0x00,0x03,0x00,0x00,0x00, -0x04,0x00,0x80,0x00,0x06,0x01,0x00,0x00,0x91,0x00,0x80,0x00,0xa0,0x01,0x00,0x00, -0x29,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,0x82,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x17,0x00,0x80,0x00,0x06, -0x00,0x80,0x40,0x47,0x01,0x00,0x02,0xc0,0x00,0x80,0x00,0x46,0x00,0x80,0x00,0x48, -0x01,0x00,0x04,0xc0,0x00,0x80,0x00,0x46,0x00,0x80,0x00,0x06,0x00,0x80,0x40,0x47, -0x01,0x00,0x06,0xc0,0x00,0x80,0x40,0x46,0x00,0x80,0x00,0x06,0x00,0x80,0x40,0x47, -0x01,0x00,0x08,0xc0,0x00,0x80,0x80,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x0a,0xc0, -0x00,0x80,0x80,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x0c,0xc0,0x00,0x80,0x40,0x46, -0x00,0x80,0x00,0x84,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, -0x00,0x01,0x60,0x00,0x00,0x04,0x6c,0x6f,0x6f,0x70,0x00,0x00,0x04,0x65,0x76,0x61, -0x6c,0x00,0x00,0x00,0x00,0x68,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x07,0x02,0x00, -0x00,0x26,0x01,0x80,0x00,0x06,0x02,0x00,0x00,0x91,0x02,0x80,0x00,0x3d,0x02,0x00, -0x80,0xa0,0x01,0x80,0x00,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x01,0x10,0x00, -0x11,0x60,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,0x35,0x00,0x03, -0x00,0x05,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x26,0x01,0x80,0x00,0x11,0x02,0x00, -0x40,0x01,0x01,0x80,0x40,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x02,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x00,0x00,0x01,0x60,0x00,0x00, -0x00,0x00,0x3b,0x00,0x02,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x26,0x00, -0x40,0x01,0x17,0x01,0x00,0x00,0x2b,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x07,0x01, -0x3f,0xfe,0x18,0x01,0x00,0x00,0x05,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x6b,0x00,0x03, -0x00,0x06,0x00,0x00,0x00,0x07,0x02,0x00,0x00,0x26,0x01,0x80,0x00,0x06,0x02,0x00, -0x00,0x91,0x02,0x80,0x00,0x3d,0x02,0x00,0x80,0xa0,0x01,0x80,0x00,0xa0,0x01,0x80, -0x00,0x29,0x00,0x00,0x00,0x01,0x10,0x00,0x14,0x65,0x76,0x61,0x6c,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,0x38,0x00,0x03,0x00,0x05,0x00,0x00,0x00, -0x05,0x02,0x00,0x00,0x26,0x01,0x80,0x00,0x11,0x02,0x00,0x40,0x01,0x01,0x80,0x40, -0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x4b, -0x65,0x72,0x6e,0x65,0x6c,0x00,0x00,0x04,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00, -0x3b,0x00,0x02,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x26,0x00,0x40,0x01, -0x17,0x01,0x00,0x00,0x2b,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x07,0x01,0x3f,0xfe, -0x18,0x01,0x00,0x00,0x05,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0xbd,0x00,0x01,0x00,0x02, -0x00,0x00,0x00,0x1a,0x00,0x80,0x00,0x48,0x01,0x00,0x02,0xc0,0x00,0x80,0x00,0x46, -0x00,0x80,0x00,0x48,0x01,0x00,0x04,0xc0,0x00,0x80,0x40,0x46,0x00,0x80,0x00,0x48, -0x01,0x00,0x06,0xc0,0x00,0x80,0x80,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x08,0xc0, -0x00,0x80,0xc0,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x0a,0xc0,0x00,0x81,0x00,0x46, -0x00,0x80,0x00,0x48,0x01,0x00,0x0c,0xc0,0x00,0x81,0x40,0x46,0x00,0x80,0x00,0x48, -0x01,0x00,0x0e,0xc0,0x00,0x81,0x80,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x10,0xc0, -0x00,0x81,0xc0,0x46,0x00,0x80,0x03,0x84,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x08,0x00,0x04,0x63,0x65,0x69,0x6c,0x00,0x00,0x06,0x64,0x6f,0x77, -0x6e,0x74,0x6f,0x00,0x00,0x05,0x66,0x6c,0x6f,0x6f,0x72,0x00,0x00,0x05,0x74,0x69, -0x6d,0x65,0x73,0x00,0x00,0x05,0x72,0x6f,0x75,0x6e,0x64,0x00,0x00,0x08,0x74,0x72, -0x75,0x6e,0x63,0x61,0x74,0x65,0x00,0x00,0x04,0x75,0x70,0x74,0x6f,0x00,0x00,0x04, -0x73,0x74,0x65,0x70,0x00,0x00,0x00,0x00,0x20,0x00,0x02,0x00,0x03,0x00,0x00,0x00, -0x03,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x06,0x01,0x00,0x00,0x29,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x04,0x00,0x06,0x00,0x00,0x00, -0x0f,0x02,0x00,0x00,0xa6,0x01,0x80,0x00,0x06,0x00,0x40,0x03,0x17,0x02,0x00,0x80, -0x01,0x02,0x80,0xc0,0x01,0x02,0x00,0x00,0xa0,0x02,0x00,0xc0,0x01,0x02,0x00,0x40, -0xaf,0x01,0x81,0x00,0x01,0x02,0x00,0xc0,0x01,0x02,0x80,0x40,0x01,0x02,0x00,0x80, -0xb6,0x02,0x3f,0xfb,0x18,0x02,0x00,0x00,0x06,0x02,0x00,0x00,0x29,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x2d,0x00, -0x00,0x02,0x3e,0x3d,0x00,0x00,0x00,0x00,0x20,0x00,0x02,0x00,0x03,0x00,0x00,0x00, -0x03,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x06,0x01,0x00,0x00,0x29,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x03,0x00,0x05,0x00,0x00,0x00, -0x0f,0x00,0x00,0x00,0xa6,0x01,0x3f,0xff,0x83,0x00,0x40,0x03,0x17,0x01,0x80,0x40, -0x01,0x02,0x00,0x80,0x01,0x01,0x80,0x00,0xa0,0x01,0x80,0x80,0x01,0x01,0x80,0x40, -0xad,0x01,0x00,0xc0,0x01,0x01,0x80,0x80,0x01,0x02,0x00,0x00,0x06,0x01,0x80,0x80, -0xb3,0x01,0xbf,0xfb,0x18,0x01,0x80,0x00,0x06,0x01,0x80,0x00,0x29,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x2b,0x00, -0x00,0x01,0x3c,0x00,0x00,0x00,0x00,0x20,0x00,0x02,0x00,0x03,0x00,0x00,0x00,0x03, -0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x06,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x02,0x00,0x03,0x00,0x00,0x00,0x03, -0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x06,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x04,0x00,0x06,0x00,0x00,0x00,0x0f, -0x02,0x00,0x00,0xa6,0x01,0x80,0x00,0x06,0x00,0x40,0x03,0x17,0x02,0x00,0x80,0x01, -0x02,0x80,0xc0,0x01,0x02,0x00,0x00,0xa0,0x02,0x00,0xc0,0x01,0x02,0x00,0x40,0xad, -0x01,0x81,0x00,0x01,0x02,0x00,0xc0,0x01,0x02,0x80,0x40,0x01,0x02,0x00,0x80,0xb4, -0x02,0x3f,0xfb,0x18,0x02,0x00,0x00,0x06,0x02,0x00,0x00,0x29,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x2b,0x00,0x00, -0x02,0x3c,0x3d,0x00,0x00,0x00,0x00,0xaa,0x00,0x05,0x00,0x07,0x00,0x00,0x00,0x1b, -0x02,0x10,0x00,0xa6,0x00,0x40,0x00,0x97,0x00,0x40,0x00,0x97,0x01,0x40,0x00,0x03, -0x02,0x80,0x40,0x01,0x03,0x00,0x00,0x91,0x02,0x80,0x00,0xa0,0x02,0xc0,0x01,0x99, -0x02,0x80,0x00,0x06,0x02,0x80,0x80,0x20,0x00,0x40,0x00,0x97,0x02,0x80,0x00,0x06, -0x02,0x01,0x40,0x01,0x00,0x40,0x03,0x97,0x02,0x80,0xc0,0x01,0x03,0x01,0x00,0x01, -0x02,0x80,0xc0,0xa0,0x02,0x81,0x00,0x01,0x03,0x00,0x80,0x01,0x02,0x81,0x00,0xac, -0x02,0x01,0x40,0x01,0x02,0x81,0x00,0x01,0x03,0x00,0x40,0x01,0x02,0x81,0x40,0xb4, -0x02,0xbf,0xfa,0x98,0x02,0x80,0x00,0x06,0x02,0x80,0x00,0x29,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x06,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,0x1c,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x80,0x00,0x05,0x01,0x00, -0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x01, -0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x80,0x00,0x06,0x01,0x00,0x00,0x91,0x00,0x80, -0x00,0xa0,0x01,0x00,0x00,0x29,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,0x00,0x00,0x00,0x68,0x00,0x01,0x00,0x02,0x00,0x00,0x00, -0x0e,0x00,0x80,0x00,0x48,0x01,0x00,0x02,0xc0,0x00,0x80,0x00,0x46,0x00,0x80,0x00, -0x48,0x01,0x00,0x04,0xc0,0x00,0x80,0x40,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x06, -0xc0,0x00,0x80,0x80,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x08,0xc0,0x00,0x80,0xc0, -0x46,0x00,0x80,0x01,0x84,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x04,0x00,0x05,0x70,0x72,0x69,0x6e,0x74,0x00,0x00,0x04,0x70,0x75,0x74,0x73,0x00, -0x00,0x01,0x70,0x00,0x00,0x06,0x70,0x72,0x69,0x6e,0x74,0x66,0x00,0x00,0x00,0x00, -0x6a,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x08,0x00,0x26,0x01,0x80,0x00, -0x06,0x02,0x00,0x00,0x91,0x02,0x80,0x00,0x3d,0x02,0x00,0x80,0xa0,0x01,0x80,0x00, -0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x01,0x10,0x00,0x13,0x70,0x72,0x69,0x6e, -0x74,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,0x69,0x00,0x03,0x00,0x06,0x00, -0x00,0x00,0x07,0x00,0x08,0x00,0x26,0x01,0x80,0x00,0x06,0x02,0x00,0x00,0x91,0x02, -0x80,0x00,0x3d,0x02,0x00,0x80,0xa0,0x01,0x80,0x00,0xa0,0x01,0x80,0x00,0x29,0x00, -0x00,0x00,0x01,0x10,0x00,0x12,0x70,0x75,0x74,0x73,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,0x66,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x08,0x00,0x26, -0x01,0x80,0x00,0x06,0x02,0x00,0x00,0x91,0x02,0x80,0x00,0x3d,0x02,0x00,0x80,0xa0, -0x01,0x80,0x00,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x01,0x10,0x00,0x0f,0x70, -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,0x6b,0x00,0x03,0x00,0x06,0x00,0x00, -0x00,0x07,0x00,0x08,0x00,0x26,0x01,0x80,0x00,0x06,0x02,0x00,0x00,0x91,0x02,0x80, -0x00,0x3d,0x02,0x00,0x80,0xa0,0x01,0x80,0x00,0xa0,0x01,0x80,0x00,0x29,0x00,0x00, -0x00,0x01,0x10,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,0x2f,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x80,0x00, -0x48,0x01,0x00,0x02,0xc0,0x00,0x80,0x00,0x46,0x00,0x80,0x00,0x04,0x01,0x00,0x00, -0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00, -0x00,0x00,0x01,0x59,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0xa6, -0x02,0x00,0x00,0x06,0x02,0x00,0x00,0x20,0x01,0x01,0x00,0x01,0x02,0x00,0x80,0x01, -0x02,0x80,0x01,0x04,0x02,0x00,0x40,0xa0,0x02,0x40,0x00,0x99,0x00,0x40,0x02,0x17, -0x02,0x00,0x00,0x06,0x02,0x80,0x02,0x11,0x03,0x00,0x00,0x3d,0x02,0x00,0xc1,0x20, -0x02,0x00,0x00,0x06,0x02,0x01,0x40,0x20,0x01,0x81,0x00,0x01,0x02,0x00,0x80,0x01, -0x02,0x80,0xc0,0x01,0x02,0x01,0x80,0xa0,0x02,0xbf,0xff,0x83,0x02,0x01,0xc0,0xb5, -0x02,0x40,0x01,0x19,0x02,0x00,0x00,0x06,0x02,0x00,0x00,0x29,0x00,0x40,0x03,0x17, -0x02,0x00,0x40,0x01,0x02,0x80,0x80,0x01,0x02,0x02,0x00,0xa0,0x02,0x00,0x80,0x01, -0x02,0x00,0x80,0x20,0x01,0x01,0x00,0x01,0x02,0x00,0x80,0x01,0x02,0x80,0xc0,0x01, -0x02,0x01,0x80,0xa0,0x02,0xbf,0xff,0x83,0x02,0x02,0x40,0xb3,0x02,0x3f,0xfa,0x18, -0x02,0x00,0x00,0x06,0x02,0x02,0x80,0x20,0x02,0x02,0xc0,0x20,0x02,0x40,0x02,0x99, -0x02,0x00,0x80,0x01,0x02,0x80,0xc0,0x01,0x02,0x01,0x80,0xa0,0x02,0xbf,0xff,0x83, -0x02,0x03,0x00,0xb2,0x02,0x40,0x01,0x99,0x02,0x00,0x40,0x01,0x02,0x80,0x80,0x01, -0x02,0x02,0x00,0xa0,0x02,0x00,0x00,0x06,0x02,0x00,0x00,0x29,0x00,0x00,0x00,0x01, -0x10,0x00,0x0d,0x63,0x61,0x6e,0x27,0x74,0x20,0x69,0x74,0x65,0x72,0x61,0x74,0x65, -0x00,0x00,0x00,0x0d,0x00,0x05,0x66,0x69,0x72,0x73,0x74,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,0x04,0x6c,0x61,0x73,0x74,0x00,0x00,0x03,0x3c,0x3d, -0x3e,0x00,0x00,0x01,0x3e,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x3c, -0x00,0x00,0x0c,0x65,0x78,0x63,0x6c,0x75,0x64,0x65,0x5f,0x65,0x6e,0x64,0x3f,0x00, -0x00,0x01,0x21,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x00,0x00,0x1c,0x00,0x01,0x00, -0x02,0x00,0x00,0x00,0x02,0x00,0x80,0x00,0x05,0x01,0x00,0x00,0x29,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x01,0x00,0x03,0x00,0x00,0x00, -0x04,0x00,0x80,0x00,0x06,0x01,0x00,0x00,0x91,0x00,0x80,0x00,0xa0,0x01,0x00,0x00, -0x29,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,0xfa,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x23,0x00,0x80,0x00,0x48, -0x01,0x00,0x02,0xc0,0x00,0x80,0x00,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x04,0xc0, -0x00,0x80,0x40,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x06,0xc0,0x00,0x80,0x80,0x46, -0x00,0x80,0x00,0x48,0x01,0x00,0x08,0xc0,0x00,0x80,0xc0,0x46,0x00,0x80,0x00,0x48, -0x01,0x00,0x0a,0xc0,0x00,0x81,0x00,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x0c,0xc0, -0x00,0x81,0x40,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x0e,0xc0,0x00,0x81,0x80,0x46, -0x00,0x80,0x00,0x48,0x01,0x00,0x10,0xc0,0x00,0x81,0xc0,0x46,0x00,0x80,0x00,0x48, -0x01,0x00,0x12,0xc0,0x00,0x82,0x00,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x14,0xc0, -0x00,0x82,0x40,0x46,0x00,0x80,0x00,0x48,0x01,0x00,0x16,0xc0,0x00,0x82,0x80,0x46, -0x00,0x80,0x05,0x04,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b, -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,0xcf,0x00,0x04, -0x00,0x09,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0xa6,0x01,0x3f,0xff,0x83,0x00,0x40, -0x06,0x17,0x02,0x00,0x40,0x01,0x02,0x80,0x00,0x06,0x03,0x00,0x80,0x01,0x03,0x80, -0xc0,0x01,0x03,0x80,0x80,0xad,0x04,0x00,0x80,0x01,0x03,0x80,0xc0,0xae,0x02,0x80, -0x41,0x20,0x02,0x00,0x00,0xa0,0x02,0x00,0xc0,0x01,0x02,0x00,0x80,0xad,0x01,0x01, -0x00,0x01,0x02,0x00,0x00,0x06,0x02,0xc0,0x04,0x83,0x03,0x00,0x80,0x01,0x02,0x01, -0x01,0x20,0x01,0x81,0x00,0x01,0x02,0x3f,0xf7,0x18,0x02,0x00,0x00,0x06,0x02,0x01, -0x40,0x20,0x02,0x80,0x80,0x01,0x02,0x01,0x80,0xb5,0x02,0x40,0x04,0x99,0x02,0x00, -0x40,0x01,0x02,0x80,0x00,0x06,0x03,0x00,0x80,0x01,0x03,0x80,0x00,0x06,0x03,0x81, -0x40,0x20,0x04,0x00,0x80,0x01,0x03,0x80,0xc0,0xae,0x02,0x80,0x41,0x20,0x02,0x00, -0x00,0xa0,0x02,0x00,0x00,0x06,0x02,0x00,0x00,0x29,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,0x17,0x00,0x03,0x00, -0x07,0x00,0x00,0x00,0x2a,0x00,0x08,0x00,0xa6,0x01,0x80,0x40,0x01,0x01,0x80,0x00, -0x20,0x02,0x40,0x00,0x83,0x01,0x80,0x40,0xb2,0x01,0xc0,0x05,0x99,0x01,0x80,0x00, -0x06,0x02,0x00,0x40,0x01,0x02,0xbf,0xff,0x83,0x02,0x00,0xc0,0xa0,0x02,0xbf,0xff, -0x03,0x01,0x80,0x81,0x20,0x02,0x00,0x40,0x01,0x02,0xc0,0x00,0x03,0x02,0x00,0xc0, -0xa0,0x01,0x81,0x00,0xa0,0x00,0x40,0x0c,0x17,0x01,0x80,0x40,0x01,0x01,0x80,0x00, -0x20,0x02,0x40,0x00,0x03,0x01,0x80,0x40,0xb2,0x01,0xc0,0x00,0x99,0x01,0x80,0x80, -0x01,0x01,0xc0,0x06,0x99,0x01,0x80,0x00,0x06,0x02,0x00,0x40,0x01,0x02,0xbf,0xff, -0x83,0x02,0x00,0xc0,0xa0,0x02,0xbf,0xff,0x03,0x01,0x80,0x81,0x20,0x02,0x00,0x80, -0x01,0x02,0x80,0x40,0x01,0x03,0x3f,0xff,0x83,0x02,0x80,0xc0,0xa0,0x02,0x01,0x40, -0xa0,0x01,0x81,0x00,0xa0,0x00,0x40,0x02,0x17,0x01,0x80,0x00,0x06,0x02,0x00,0x03, -0x91,0x02,0x80,0x00,0x3d,0x01,0x81,0x81,0x20,0x01,0x80,0x00,0x29,0x00,0x00,0x00, -0x01,0x10,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,0x76,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x13,0x00,0x08,0x00,0xa6, -0x02,0x00,0x00,0x06,0x02,0x81,0x40,0x37,0x03,0x00,0x40,0x01,0x02,0x81,0x80,0x38, -0x03,0x00,0x80,0x01,0x02,0x00,0x3f,0xa1,0x01,0x81,0x00,0x01,0x02,0x00,0xc0,0x01, -0x02,0x80,0x00,0x06,0x02,0x00,0x40,0xa0,0x02,0x40,0x02,0x99,0x02,0x00,0x00,0x06, -0x02,0x80,0xc0,0x01,0x02,0x00,0x80,0xa0,0x02,0x00,0x00,0x06,0x00,0x40,0x00,0x97, -0x02,0x00,0x00,0x05,0x02,0x00,0x00,0x29,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,0xa0,0x00,0x03,0x00,0x06,0x00,0x00, -0x00,0x0c,0x02,0x00,0x00,0xa6,0x01,0x80,0x00,0x11,0x02,0x00,0x01,0x04,0x01,0x80, -0x40,0xa0,0x01,0xc0,0x01,0x19,0x01,0x80,0x00,0x05,0x00,0x40,0x02,0x17,0x01,0x80, -0x00,0x06,0x02,0x00,0x02,0x11,0x02,0x80,0x00,0x3d,0x01,0x80,0xc1,0x20,0x01,0x80, -0x00,0x29,0x00,0x00,0x00,0x01,0x10,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,0x17,0x00,0x03,0x00,0x07,0x00,0x00, -0x00,0x2a,0x00,0x08,0x00,0xa6,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x40, -0x00,0x83,0x01,0x80,0x40,0xb2,0x01,0xc0,0x05,0x99,0x01,0x80,0x00,0x06,0x02,0x00, -0x40,0x01,0x02,0xbf,0xff,0x83,0x02,0x00,0xc0,0xa0,0x02,0xc0,0x00,0x83,0x01,0x80, -0x81,0x20,0x02,0x00,0x40,0x01,0x02,0xc0,0x00,0x03,0x02,0x00,0xc0,0xa0,0x01,0x81, -0x00,0xa0,0x00,0x40,0x0c,0x17,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x40, -0x00,0x03,0x01,0x80,0x40,0xb2,0x01,0xc0,0x00,0x99,0x01,0x80,0x80,0x01,0x01,0xc0, -0x06,0x99,0x01,0x80,0x00,0x06,0x02,0x00,0x40,0x01,0x02,0xbf,0xff,0x83,0x02,0x00, -0xc0,0xa0,0x02,0xc0,0x00,0x83,0x01,0x80,0x81,0x20,0x02,0x00,0x80,0x01,0x02,0x80, -0x40,0x01,0x03,0x3f,0xff,0x83,0x02,0x80,0xc0,0xa0,0x02,0x01,0x40,0xa0,0x01,0x81, -0x00,0xa0,0x00,0x40,0x02,0x17,0x01,0x80,0x00,0x06,0x02,0x00,0x03,0x91,0x02,0x80, -0x00,0x3d,0x01,0x81,0x81,0x20,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x01,0x10,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, -0x75,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x13,0x00,0x08,0x00,0xa6,0x02,0x00,0x00, -0x06,0x02,0x81,0x40,0x37,0x03,0x00,0x40,0x01,0x02,0x81,0x80,0x38,0x03,0x00,0x80, -0x01,0x02,0x00,0x3f,0xa1,0x01,0x81,0x00,0x01,0x02,0x00,0xc0,0x01,0x02,0x80,0x00, -0x06,0x02,0x00,0x40,0xa0,0x02,0x40,0x02,0x99,0x02,0x00,0x00,0x06,0x02,0x80,0xc0, -0x01,0x02,0x00,0x80,0xa0,0x02,0x00,0x00,0x06,0x00,0x40,0x00,0x97,0x02,0x00,0x00, -0x05,0x02,0x00,0x00,0x29,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,0x77,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x12,0x00,0x00, -0x00,0xa6,0x01,0x3f,0xff,0x83,0x00,0x40,0x04,0x17,0x01,0x80,0x40,0x01,0x02,0x00, -0x00,0x06,0x02,0x80,0x80,0x01,0x02,0x00,0x40,0xa0,0x01,0x80,0x00,0xa0,0x01,0x80, -0x80,0x01,0x01,0x80,0x80,0xad,0x01,0x00,0xc0,0x01,0x01,0x80,0x80,0x01,0x02,0x00, -0x00,0x06,0x02,0x01,0x00,0x20,0x01,0x80,0xc0,0xb3,0x01,0xbf,0xf9,0x98,0x01,0x80, -0x00,0x06,0x01,0x80,0x00,0x29,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,0x8b,0x00,0x04,0x00, -0x07,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0xa6,0x02,0x00,0x00,0x06,0x02,0x00,0x00, -0x20,0x01,0x01,0x00,0x01,0x01,0xbf,0xff,0x83,0x00,0x40,0x04,0x17,0x02,0x00,0x40, -0x01,0x02,0x80,0x80,0x01,0x03,0x00,0xc0,0x01,0x02,0x80,0x80,0xa0,0x02,0x00,0x40, -0xa0,0x02,0x00,0xc0,0x01,0x02,0x00,0xc0,0xad,0x01,0x81,0x00,0x01,0x02,0x00,0xc0, -0x01,0x02,0x80,0x80,0x01,0x02,0x81,0x40,0x20,0x02,0x01,0x00,0xb3,0x02,0x3f,0xf9, -0x98,0x02,0x00,0x00,0x06,0x02,0x00,0x00,0x29,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,0x89,0x00,0x06,0x00,0x0a,0x00,0x00,0x00,0x16, -0x04,0x00,0x00,0x26,0x03,0x00,0x00,0x06,0x03,0xbf,0xff,0x83,0x04,0x00,0x40,0x01, -0x03,0x00,0x01,0x20,0x02,0x01,0x80,0x01,0x03,0x00,0x00,0x06,0x03,0x80,0x40,0x01, -0x03,0x80,0x40,0xad,0x04,0x3f,0xff,0x03,0x03,0x81,0xc0,0x41,0x03,0x00,0x00,0xa0, -0x02,0x81,0x80,0x01,0x03,0x00,0x00,0x06,0x03,0x81,0x00,0x01,0x04,0x00,0x80,0x01, -0x04,0x81,0x40,0x01,0x03,0x81,0xc1,0xb7,0x04,0x00,0x00,0x3d,0x03,0x80,0xc0,0xa0, -0x03,0x00,0x80,0xa0,0x03,0x00,0x00,0x29,0x00,0x00,0x00,0x01,0x10,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, -0x2d,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x05,0x02,0x00,0x00,0x26,0x01,0x80,0x40, -0x01,0x02,0x00,0x00,0x06,0x01,0x80,0x00,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x3d,0x7e,0x00,0x00,0x00,0x00,0x34,0x00,0x03, -0x00,0x06,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0xa6,0x01,0x80,0x40,0x01,0x02,0x00, -0x00,0x06,0x02,0x80,0x80,0x01,0x01,0x80,0x00,0xa1,0x01,0x80,0x00,0x29,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x05,0x6d,0x61,0x74,0x63,0x68,0x00,0x00,0x00, -0x00,0x1c,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x80,0x00,0x05,0x01,0x00, -0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x01, -0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x80,0x00,0x06,0x01,0x00,0x00,0x91,0x00,0x80, -0x00,0xa0,0x01,0x00,0x00,0x29,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,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08, -}; Deleted: vendor/mruby-eeac4be/src/mruby_core.rake (+0 -28) 100644 =================================================================== --- vendor/mruby-eeac4be/src/mruby_core.rake 2014-06-08 19:01:14 +0900 (db33522) +++ /dev/null @@ -1,28 +0,0 @@ -MRuby.each_target do - current_dir = File.dirname(__FILE__).relative_path_from(Dir.pwd) - relative_from_root = File.dirname(__FILE__).relative_path_from(MRUBY_ROOT) - current_build_dir = "#{build_dir}/#{relative_from_root}" - - lex_def = "#{current_dir}/lex.def" - objs = Dir.glob("#{current_dir}/*.c").map { |f| objfile(f.pathmap("#{current_build_dir}/%n")) } - objs += [objfile("#{current_build_dir}/y.tab")] - self.libmruby << objs - - file libfile("#{build_dir}/lib/libmruby_core") => objs do |t| - archiver.run t.name, t.prerequisites - end - - # Parser - file "#{current_build_dir}/y.tab.c" => ["#{current_dir}/parse.y"] do |t| - yacc.run t.name, t.prerequisites.first - end - - file objfile("#{current_build_dir}/y.tab") => ["#{current_build_dir}/y.tab.c", lex_def] do |t| - cc.run t.name, t.prerequisites.first, [], [current_dir] - end - - # Lexical analyzer - file lex_def => "#{current_dir}/keywords" do |t| - gperf.run t.name, t.prerequisites.first - end -end Deleted: vendor/mruby-eeac4be/src/node.h (+0 -117) 100644 =================================================================== --- vendor/mruby-eeac4be/src/node.h 2014-06-08 19:01:14 +0900 (df27c43) +++ /dev/null @@ -1,117 +0,0 @@ -/* -** 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 */ Deleted: vendor/mruby-eeac4be/src/numeric.c (+0 -1420) 100644 =================================================================== --- vendor/mruby-eeac4be/src/numeric.c 2014-06-08 19:01:14 +0900 (c309abf) +++ /dev/null @@ -1,1420 +0,0 @@ -/* -** numeric.c - Numeric, Integer, Float, Fixnum class -** -** See Copyright Notice in mruby.h -*/ - -#include <float.h> -#if defined(__FreeBSD__) && __FreeBSD__ < 4 -# include <floatingpoint.h> -#endif -#ifdef HAVE_IEEEFP_H -# include <ieeefp.h> -#endif -#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 floor(f) floorf(f) -#define fmod(x,y) fmodf(x,y) -#endif - -static 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 -> num - * - * Unary Plus---Returns the receiver's value. - */ - -static mrb_value -num_uplus(mrb_state *mrb, mrb_value num) -{ - return num; -} - -/* - * call-seq: - * -num -> numeric - * - * Unary Minus---Returns the receiver's value, negated. - */ - -static mrb_value -num_uminus(mrb_state *mrb, mrb_value num) -{ - return mrb_float_value(mrb, (mrb_float)0 - mrb_to_flo(mrb, num)); -} - -static mrb_value -fix_uminus(mrb_state *mrb, mrb_value num) -{ - return mrb_fixnum_value(0 - mrb_fixnum(num)); -} - -/* - * 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; - int both_int = FALSE; - mrb_float d; - - mrb_get_args(mrb, "o", &y); - if (mrb_fixnum_p(x) && mrb_fixnum_p(y)) both_int = TRUE; - d = pow(mrb_to_flo(mrb, x), mrb_to_flo(mrb, y)); - if (both_int && FIXABLE(d)) - 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); -} - -/* - * call-seq: - * num.abs -> numeric - * num.magnitude -> numeric - * - * Returns the absolute value of <i>num</i>. - * - * 12.abs #=> 12 - * (-34.56).abs #=> 34.56 - * -34.56.abs #=> 34.56 - */ - -static mrb_value -num_abs(mrb_state *mrb, mrb_value num) -{ - if (mrb_to_flo(mrb, num) < 0) { - return num_uminus(mrb, num); - } - return num; -} - -/******************************************************************** - * - * Document-class: Float - * - * <code>Float</code> objects represent inexact real numbers using - * the native architecture's double-precision floating point - * representation. - */ - -mrb_value -mrb_flo_to_str(mrb_state *mrb, mrb_value flo, int max_digit) -{ - mrb_value result; - mrb_float n; - - if (max_digit > 40) { - mrb_raise(mrb, E_RANGE_ERROR, "Too large max_digit."); - } - else if (!mrb_float_p(flo)) { - mrb_raise(mrb, E_TYPE_ERROR, "non float value"); - } - - n = mrb_float(flo); - - if (isnan(n)) { - result = mrb_str_new(mrb, "NaN", 3); - } - else if (isinf(n)) { - if (n < 0) { - result = mrb_str_new(mrb, "-inf", 4); - } - else { - result = mrb_str_new(mrb, "inf", 3); - } - } - else { - int digit; - int m; - int exp; - int e = 0; - char s[48]; - char *c = &s[0]; - - if (n < 0) { - n = -n; - *(c++) = '-'; - } - - exp = (int)log10(n); - - if ((exp < 0 ? -exp : exp) > max_digit) { - /* exponent representation */ - e = 1; - m = exp; - if (m < 0) { - m -= 1; - } - n = n / pow(10.0, m); - m = 0; - } - else { - /* un-exponent (normal) representation */ - m = exp; - if (m < 0) { - m = 0; - } - } - - /* puts digits */ - while (max_digit >= 0) { - mrb_float weight = pow(10.0, m); - digit = (int)floor(n / weight + FLT_EPSILON); - *(c++) = '0' + digit; - n -= (digit * weight); - max_digit--; - if (m-- == 0) { - *(c++) = '.'; - } - else if (m < -1 && n < FLT_EPSILON) { - break; - } - } - - if (e) { - *(c++) = 'e'; - if (exp > 0) { - *(c++) = '+'; - } - else { - *(c++) = '-'; - exp = -exp; - } - - if (exp >= 100) { - mrb_raise(mrb, E_RANGE_ERROR, "Too large expornent."); - } - - *(c++) = '0' + exp / 10; - *(c++) = '0' + exp % 10; - } - - *c = '\0'; - - result = mrb_str_new(mrb, &s[0], c - &s[0]); - } - - return result; -} - -/* 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) -{ -#ifdef MRB_USE_FLOAT - return mrb_flo_to_str(mrb, flt, 7); -#else - return mrb_flo_to_str(mrb, flt, 14); -#endif -} - -/* 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 = str_to_mrb_float("inf"); - mod = str_to_mrb_float("nan"); - } - else { - mod = fmod(x, y); - if (isinf(x) && !isinf(y) && !isnan(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 fy, mod; - - mrb_get_args(mrb, "o", &y); - - fy = mrb_to_flo(mrb, y); - flodivmod(mrb, mrb_float(x), fy, 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 -num_eql(mrb_state *mrb, mrb_value x) -{ - mrb_value y; - mrb_bool eql_p; - - mrb_get_args(mrb, "o", &y); - if (mrb_type(x) != mrb_type(y)) { - eql_p = 0; - } - else { - eql_p = mrb_equal(mrb, x, y); - } - - return mrb_bool_value(eql_p); -} - -static mrb_value -num_equal(mrb_state *mrb, mrb_value x, mrb_value y) -{ - if (mrb_obj_equal(mrb, x, y)) return mrb_true_value(); - return mrb_funcall(mrb, y, "==", 1, x); -} - -/* 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; - volatile mrb_float a, b; - - mrb_get_args(mrb, "o", &y); - - switch (mrb_type(y)) { - case MRB_TT_FIXNUM: - b = (mrb_float)mrb_fixnum(y); - break; - case MRB_TT_FLOAT: - b = mrb_float(y); - break; - default: - return num_equal(mrb, x, y); - } - a = mrb_float(x); - return mrb_bool_value(a == b); -} - -/* 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) -{ - mrb_float value = mrb_float(num); - mrb_bool finite_p; - - finite_p = !(isinf(value) || isnan(value)); - - return mrb_bool_value(finite_p); -} - -/* 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); - 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) 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); -} - -/* - * 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; -} - -/* 15.2.8.3.21 */ -/* - * call-seq: - * fixnum.next -> integer - * fixnum.succ -> integer - * - * Returns the <code>Integer</code> equal to <i>int</i> + 1. - * - * 1.next #=> 2 - * (-1).next #=> 0 - */ - -static mrb_value -fix_succ(mrb_state *mrb, mrb_value num) -{ - return mrb_fixnum_value(mrb_fixnum(num)+1); -} - -/* 15.2.8.3.19 */ -/* - * call-seq: - * int.next -> integer - * int.succ -> integer - * - * Returns the <code>Integer</code> equal to <i>int</i> + 1. - * - * 1.next #=> 2 - * (-1).next #=> 0 - */ -static mrb_value -int_succ(mrb_state *mrb, mrb_value num) -{ - if (mrb_fixnum_p(num)) return fix_succ(mrb, num); - return mrb_funcall(mrb, num, "+", 1, mrb_fixnum_value(1)); -} - -#define SQRT_INT_MAX ((mrb_int)1<<((sizeof(mrb_int)*CHAR_BIT-1)/2)) -/*tests if N*N would overflow*/ -#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 (a == 0) return x; - if (mrb_fixnum_p(y)) { - mrb_int b, c; - - 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) { - 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.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, b; - - mrb_get_args(mrb, "o", &y); - a = mrb_fixnum(x); - if (mrb_fixnum_p(y) && (b=mrb_fixnum(y)) != 0) { - mrb_int mod; - - if (mrb_fixnum(y) == 0) { - return mrb_float_value(mrb, str_to_mrb_float("nan")); - } - fixdivmod(mrb, a, mrb_fixnum(y), 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, str_to_mrb_float("inf")), - mrb_float_value(mrb, str_to_mrb_float("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); - } -} - -/* 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_bool equal_p; - - mrb_get_args(mrb, "o", &y); - - equal_p = mrb_obj_equal(mrb, x, y) || - (mrb_type(y) == MRB_TT_FLOAT && - (mrb_float)mrb_fixnum(x) == mrb_float(y)); - - return mrb_bool_value(equal_p); -} - -/* 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); - - val = ~val; - 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_int val; - - mrb_get_args(mrb, "o", &y); - - y = bit_coerce(mrb, y); - val = mrb_fixnum(x) & mrb_fixnum(y); - return mrb_fixnum_value(val); -} - -/* 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_int val; - - mrb_get_args(mrb, "o", &y); - - y = bit_coerce(mrb, y); - val = mrb_fixnum(x) | mrb_fixnum(y); - return mrb_fixnum_value(val); -} - -/* 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_int val; - - mrb_get_args(mrb, "o", &y); - - y = bit_coerce(mrb, y); - val = mrb_fixnum(x) ^ mrb_fixnum(y); - return mrb_fixnum_value(val); -} - -#define NUMERIC_SHIFT_WIDTH_MAX (sizeof(mrb_int)*CHAR_BIT-1) - -static mrb_value -lshift(mrb_state *mrb, mrb_int val, size_t width) -{ - if (width > NUMERIC_SHIFT_WIDTH_MAX) { - mrb_raisef(mrb, E_RANGE_ERROR, "width(%S) > (%S:sizeof(mrb_int)*CHAR_BIT-1)", - mrb_fixnum_value(width), - mrb_fixnum_value(NUMERIC_SHIFT_WIDTH_MAX)); - } - val = val << width; - return mrb_fixnum_value(val); -} - -static mrb_value -rshift(mrb_int val, size_t width) -{ - if (width >= NUMERIC_SHIFT_WIDTH_MAX) { - if (val < 0) { - val = -1; - } - else { - val = 0; - } - } - else { - val = val >> width; - } - - return mrb_fixnum_value(val); -} - -static inline void -fix_shift_get_width(mrb_state *mrb, mrb_int *width) -{ - mrb_value y; - - mrb_get_args(mrb, "o", &y); - y = bit_coerce(mrb, y); - *width = mrb_fixnum(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; - mrb_value result; - - fix_shift_get_width(mrb, &width); - - if (width == 0) { - result = x; - } - else { - mrb_int val; - - val = mrb_fixnum(x); - if (width < 0) { - result = rshift(val, -width); - } - else { - result = lshift(mrb, val, width); - } - } - - return result; -} - -/* 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; - mrb_value result; - - fix_shift_get_width(mrb, &width); - - if (width == 0) { - result = x; - } - else { - mrb_int val; - - val = mrb_fixnum(x); - if (width < 0) { - result = lshift(mrb, val, -width); - } - else { - result = rshift(val, width); - } - } - - return result; -} - -/* 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) -{ - mrb_float val; - - val = (mrb_float)mrb_fixnum(num); - - return mrb_float_value(mrb, val); -} - -/* - * 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_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 supress 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 (a == 0) return y; - if (mrb_fixnum_p(y)) { - mrb_int b, c; - - b = mrb_fixnum(y); - c = a + b; - if (((a < 0) ^ (b < 0)) == 0 && (a < 0) != (c < 0)) { - /* integer overflow */ - 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); - c = a - b; - if (((a < 0) ^ (b < 0)) != 0 && (a < 0) != (c < 0)) { - /* integer overflow */ - 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_value -mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, int base) -{ - char buf[sizeof(mrb_int)*CHAR_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 self) -{ - mrb_float x, y; - - x = mrb_float(self); - mrb_get_args(mrb, "f", &y); - - return mrb_float_value(mrb, x + 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); - mrb_include_module(mrb, numeric, mrb_class_get(mrb, "Comparable")); - - mrb_define_method(mrb, numeric, "+@", num_uplus, MRB_ARGS_REQ(1)); /* 15.2.7.4.1 */ - mrb_define_method(mrb, numeric, "-@", num_uminus, MRB_ARGS_REQ(1)); /* 15.2.7.4.2 */ - 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, "abs", num_abs, MRB_ARGS_NONE()); /* 15.2.7.4.3 */ - 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); - 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 = 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_uminus, MRB_ARGS_REQ(1)); /* 15.2.7.4.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?", num_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, "next", int_succ, MRB_ARGS_NONE()); /* 15.2.8.3.19 */ - mrb_define_method(mrb, fixnum, "succ", fix_succ, MRB_ARGS_NONE()); /* 15.2.8.3.21 */ - 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); - 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_NONE()); /* 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, "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()); -} Deleted: vendor/mruby-eeac4be/src/object.c (+0 -593) 100644 =================================================================== --- vendor/mruby-eeac4be/src/object.c 2014-06-08 19:01:14 +0900 (1040a08) +++ /dev/null @@ -1,593 +0,0 @@ -/* -** object.c - Object, NilClass, TrueClass, FalseClass class -** -** See Copyright Notice in mruby.h -*/ - -#include "mruby.h" -#include "mruby/array.h" -#include "mruby/class.h" -#include "mruby/numeric.h" -#include "mruby/string.h" -#include "error.h" - -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 (v1.value.i == v2.value.i); - case MRB_TT_SYMBOL: - return (v1.value.sym == v2.value.sym); - - case MRB_TT_FLOAT: - return (mrb_float(v1) == mrb_float(v2)); - - default: - return (mrb_ptr(v1) == mrb_ptr(v2)); - } -} - -mrb_bool -mrb_obj_equal(mrb_state *mrb, mrb_value v1, mrb_value v2) -{ - /* temporary definition */ - return mrb_obj_eq(mrb, v1, v2); -} - -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(mrb, "nil", 3); -} - -/*********************************************************************** - * 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(mrb, "true", 4); -} - -/* 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(mrb, "false", 5); -} - -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 -convert_type(mrb_state *mrb, mrb_value val, const char *tname, const char *method, int 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", val, mrb_str_new_cstr(mrb, tname)); - return mrb_nil_value(); - } - else { - return mrb_nil_value(); - } - } - return mrb_funcall_argv(mrb, val, m, 0, 0); -} - -mrb_value -mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method) -{ - mrb_value v; - - if (mrb_type(val) == MRB_TT_FIXNUM) return val; - v = convert_type(mrb, val, "Integer", method, FALSE); - if (mrb_nil_p(v) || mrb_type(v) != MRB_TT_FIXNUM) { - return mrb_nil_value(); - } - return v; -} - -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, 1/*Qtrue*/); - 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_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, 0/*Qfalse*/); - 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} -}; - -void -mrb_check_type(mrb_state *mrb, mrb_value x, enum mrb_vtype t) -{ - const struct types *type = builtin_types; - struct RString *s; - 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_type(x) == MRB_TT_FIXNUM) { - etype = "Fixnum"; - } - else if (mrb_type(x) == MRB_TT_SYMBOL) { - etype = "Symbol"; - } - else if (mrb_special_const_p(x)) { - s = mrb_str_ptr(mrb_obj_as_string(mrb, x)); - etype = s->ptr; - } - 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_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_buf_cat(mrb, str, "#<", 2); - mrb_str_cat2(mrb, str, cname); - mrb_str_cat(mrb, str, ":", 1); - mrb_str_concat(mrb, str, mrb_ptr_to_str(mrb, mrb_cptr(obj))); - mrb_str_buf_cat(mrb, str, ">", 1); - - 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_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_raisef(mrb, E_TYPE_ERROR, "can't convert %S to Integer (%S#%S gives %S)", - val, val, mrb_str_new_cstr(mrb, method), v); - } - return v; -} - -mrb_value -mrb_to_int(mrb_state *mrb, mrb_value val) -{ - return mrb_to_integer(mrb, val, "to_int"); -} - -static 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_value -mrb_Integer(mrb_state *mrb, mrb_value val) -{ - return mrb_convert_to_integer(mrb, val, 0); -} - -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_value -mrb_inspect(mrb_state *mrb, mrb_value obj) -{ - return mrb_obj_as_string(mrb, mrb_funcall(mrb, obj, "inspect", 0, 0)); -} - -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)); -} Deleted: vendor/mruby-eeac4be/src/opcode.h (+0 -160) 100644 =================================================================== --- vendor/mruby-eeac4be/src/opcode.h 2014-06-08 19:01:14 +0900 (f876111) +++ /dev/null @@ -1,160 +0,0 @@ -/* -** opcode.h - RiteVM operation codes -** -** See Copyright Notice in mruby.h -*/ - -#ifndef OPCODE_H -#define 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) := Lit(Bx) */ - OP_LOADI,/* A sBx R(A) := sBx */ - OP_LOADSYM,/* A Bx R(A) := Sym(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(Sym(Bx)) */ - OP_SETGLOBAL,/* A Bx setglobal(Sym(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(Sym(Bx)) */ - OP_SETIV,/* A Bx ivset(Sym(Bx),R(A)) */ - OP_GETCV,/* A Bx R(A) := cvget(Sym(Bx)) */ - OP_SETCV,/* A Bx cvset(Sym(Bx),R(A)) */ - OP_GETCONST,/* A Bx R(A) := constget(Sym(Bx)) */ - OP_SETCONST,/* A Bx constset(Sym(Bx),R(A)) */ - OP_GETMCNST,/* A Bx R(A) := R(A)::Sym(B) */ - OP_SETMCNST,/* A Bx R(A+1)::Sym(B) := 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),mSym(B),R(A+1),...,R(A+C)) */ - OP_SENDB,/* A B C R(A) := call(R(A),mSym(B),R(A+1),...,R(A+C),&R(A+C+1))*/ - OP_FSEND,/* A B C R(A) := fcall(R(A),mSym(B),R(A+1),...,R(A+C-1)) */ - OP_CALL,/* A B C R(A) := self.call(R(A),.., R(A+C)) */ - OP_SUPER,/* A B 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 (24=5:5:1:5:5:1:1) */ - OP_KARG,/* A B C R(A) := kdict[mSym(B)]; if C kdict.rm(mSym(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),mSym(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) (mSyms[B]=:+,C=1) */ - OP_ADDI,/* A B C R(A) := R(A)+C (mSyms[B]=:+) */ - OP_SUB,/* A B C R(A) := R(A)-R(A+1) (mSyms[B]=:-,C=1) */ - OP_SUBI,/* A B C R(A) := R(A)-C (mSyms[B]=:-) */ - OP_MUL,/* A B C R(A) := R(A)*R(A+1) (mSyms[B]=:*,C=1) */ - OP_DIV,/* A B C R(A) := R(A)/R(A+1) (mSyms[B]=:/,C=1) */ - OP_EQ,/* A B C R(A) := R(A)==R(A+1) (mSyms[B]=:==,C=1) */ - OP_LT,/* A B C R(A) := R(A)<R(A+1) (mSyms[B]=:<,C=1) */ - OP_LE,/* A B C R(A) := R(A)<=R(A+1) (mSyms[B]=:<=,C=1) */ - OP_GT,/* A B C R(A) := R(A)>R(A+1) (mSyms[B]=:>,C=1) */ - OP_GE,/* A B C R(A) := R(A)>=R(A+1) (mSyms[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],Cm) */ - 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),mSym(B),R(A+1)) */ - OP_MODULE,/* A B R(A) := newmodule(R(A),mSym(B)) */ - OP_EXEC,/* A Bx R(A) := blockexec(R(A),SEQ[Bx]) */ - OP_METHOD,/* A B R(A).newmethod(mSym(B),R(A+1)) */ - OP_SCLASS,/* A B R(A) := R(B).singleton_class */ - OP_TCLASS,/* A R(A) := target_class */ - - OP_DEBUG,/* A print R(A) */ - 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 /* OPCODE_H */ Deleted: vendor/mruby-eeac4be/src/parse.c (+0 -11878) 100644 =================================================================== --- vendor/mruby-eeac4be/src/parse.c 2014-06-08 19:01:14 +0900 (e1e1102) +++ /dev/null @@ -1,11878 +0,0 @@ -/* A Bison parser, made by GNU Bison 2.7.12-4996. */ - -/* Bison implementation for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2013 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.7.12-4996" - -/* Skeleton name. */ -#define YYSKELETON_NAME "yacc.c" - -/* Pure parsers. */ -#define YYPURE 1 - -/* Push parsers. */ -#define YYPUSH 0 - -/* Pull parsers. */ -#define YYPULL 1 - - - - -/* Copy the first part of user declarations. */ -/* Line 371 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 "node.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 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); - -#ifndef isascii -#define isascii(c) (((c) & ~0x7f) == 0) -#endif - -#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 sym(x) ((mrb_sym)(intptr_t)(x)) -#define nsym(x) ((node*)(intptr_t)(x)) - -static inline mrb_sym -intern_gen(parser_state *p, const char *s) -{ - return mrb_intern(p->mrb, s); -} -#define intern(s) intern_gen(p,(s)) - -static inline mrb_sym -intern_gen2(parser_state *p, const char *s, size_t len) -{ - return mrb_intern2(p->mrb, s, len); -} -#define intern2(s,len) intern_gen2(p,(s),(len)) - -static inline mrb_sym -intern_gen_c(parser_state *p, const char c) -{ - return mrb_intern2(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) { - longjmp(p->jmp, 1); - } - 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 int -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 1; - n = n->cdr; - } - l = l->cdr; - } - return 0; -} - -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) -{ - return list4((node*)NODE_CALL, a, nsym(b), c); -} - -// (:fcall self mid args) -static node* -new_fcall(parser_state *p, mrb_sym b, node *c) -{ - return list4((node*)NODE_FCALL, new_self(p), nsym(b), c); -} - -// (: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_intern2(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, char *m) -{ - return new_call(p, recv, intern(m), 0); -} - -// (:call a op b) -static node* -call_bin_op(parser_state *p, node *recv, char *m, node *arg1) -{ - return new_call(p, recv, intern(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; -} - -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_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->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 371 of yacc.c */ -#line 999 "/home/kou/work/c/groonga.central/vendor/mruby/mruby.master/build/host/src/y.tab.c" - -# ifndef YY_NULL -# if defined __cplusplus && 201103L <= __cplusplus -# define YY_NULL nullptr -# else -# define YY_NULL 0 -# endif -# endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - - -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif -#if YYDEBUG -extern int yydebug; -#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_undef = 261, - keyword_begin = 262, - keyword_rescue = 263, - keyword_ensure = 264, - keyword_end = 265, - keyword_if = 266, - keyword_unless = 267, - keyword_then = 268, - keyword_elsif = 269, - keyword_else = 270, - keyword_case = 271, - keyword_when = 272, - keyword_while = 273, - keyword_until = 274, - keyword_for = 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, - tLOWEST = 367, - tUMINUS_NUM = 368, - idNULL = 369, - idRespond_to = 370, - idIFUNC = 371, - idCFUNC = 372, - id_core_set_method_alias = 373, - id_core_set_variable_alias = 374, - id_core_undef_method = 375, - id_core_define_method = 376, - id_core_define_singleton_method = 377, - id_core_set_postexe = 378, - tLAST_TOKEN = 379 - }; -#endif - - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -{ -/* Line 387 of yacc.c */ -#line 942 "src/parse.y" - - node *nd; - mrb_sym id; - int num; - unsigned int stack; - const struct vtable *vars; - - -/* Line 387 of yacc.c */ -#line 1172 "/home/kou/work/c/groonga.central/vendor/mruby/mruby.master/build/host/src/y.tab.c" -} YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -#endif - - -#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 */ - - - -/* Copy the second part of user declarations. */ - -/* Line 390 of yacc.c */ -#line 1199 "/home/kou/work/c/groonga.central/vendor/mruby/mruby.master/build/host/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 - -#ifndef __attribute__ -/* This feature is available in gcc versions 2.5 and later. */ -# if (! defined __GNUC__ || __GNUC__ < 2 \ - || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)) -# define __attribute__(Spec) /* empty */ -# 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 EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ - /* Use EXIT_SUCCESS as a witness for stdlib.h. */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -# 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 EXIT_SUCCESS \ - && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) -# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -# endif -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if ! defined malloc && ! defined EXIT_SUCCESS && (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 EXIT_SUCCESS && (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) - -# define YYCOPY_NEEDED 1 - -/* 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 - -#if defined YYCOPY_NEEDED && YYCOPY_NEEDED -/* Copy COUNT objects from SRC to DST. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(Dst, Src, Count) \ - __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) -# else -# define YYCOPY(Dst, Src, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (Dst)[yyi] = (Src)[yyi]; \ - } \ - while (YYID (0)) -# endif -# endif -#endif /* !YYCOPY_NEEDED */ - -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 3 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 10895 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 151 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 154 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 544 -/* YYNRULES -- Number of states. */ -#define YYNSTATES 956 - -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 379 - -#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, - 150, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 127, 2, 2, 2, 125, 120, 2, - 146, 147, 123, 121, 144, 122, 143, 124, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 115, 149, - 117, 113, 116, 114, 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, 142, 2, 148, 119, 2, 145, 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, 140, 118, 141, 128, 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, 126, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139 -}; - -#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, 803, 808, - 811, 813, 815, 817, 819, 821, 823, 825, 827, 828, - 833, 834, 839, 840, 844, 848, 852, 855, 859, 863, - 865, 870, 874, 876, 881, 885, 888, 890, 893, 894, - 899, 906, 913, 914, 915, 923, 924, 925, 933, 939, - 944, 945, 946, 956, 957, 964, 965, 966, 975, 976, - 982, 983, 990, 991, 992, 1002, 1004, 1006, 1008, 1010, - 1012, 1014, 1016, 1019, 1021, 1023, 1025, 1031, 1033, 1036, - 1038, 1040, 1042, 1046, 1048, 1052, 1054, 1059, 1066, 1070, - 1076, 1079, 1084, 1086, 1090, 1097, 1106, 1111, 1118, 1123, - 1126, 1133, 1136, 1141, 1148, 1151, 1156, 1159, 1164, 1166, - 1168, 1170, 1174, 1176, 1181, 1183, 1188, 1190, 1194, 1196, - 1198, 1203, 1205, 1209, 1213, 1214, 1220, 1223, 1228, 1234, - 1240, 1243, 1248, 1253, 1257, 1261, 1265, 1268, 1270, 1275, - 1276, 1282, 1283, 1289, 1295, 1297, 1299, 1306, 1308, 1310, - 1312, 1314, 1317, 1319, 1322, 1324, 1326, 1328, 1330, 1332, - 1334, 1336, 1339, 1343, 1345, 1348, 1350, 1351, 1356, 1358, - 1361, 1365, 1368, 1372, 1374, 1376, 1378, 1380, 1383, 1385, - 1388, 1391, 1395, 1397, 1402, 1405, 1407, 1409, 1411, 1413, - 1415, 1418, 1421, 1425, 1427, 1429, 1432, 1435, 1437, 1439, - 1441, 1443, 1445, 1447, 1449, 1451, 1453, 1455, 1457, 1459, - 1461, 1463, 1465, 1467, 1468, 1473, 1476, 1480, 1483, 1490, - 1499, 1504, 1511, 1516, 1523, 1526, 1531, 1538, 1541, 1546, - 1549, 1554, 1556, 1557, 1559, 1561, 1563, 1565, 1567, 1569, - 1571, 1575, 1577, 1581, 1585, 1589, 1591, 1595, 1597, 1601, - 1603, 1605, 1608, 1610, 1612, 1614, 1617, 1620, 1622, 1624, - 1625, 1630, 1632, 1635, 1637, 1641, 1645, 1648, 1650, 1652, - 1654, 1656, 1658, 1660, 1662, 1664, 1666, 1668, 1670, 1672, - 1673, 1675, 1676, 1678, 1681, 1684, 1685, 1687, 1689, 1691, - 1693, 1694, 1698, 1700, 1703 -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yytype_int16 yyrhs[] = -{ - 152, 0, -1, -1, 153, 154, -1, 155, 295, -1, - 304, -1, 156, -1, 155, 303, 156, -1, 1, 156, - -1, 161, -1, -1, 46, 157, 140, 154, 141, -1, - 159, 244, 222, 247, -1, 160, 295, -1, 304, -1, - 161, -1, 160, 303, 161, -1, 1, 161, -1, -1, - 45, 182, 162, 182, -1, 6, 183, -1, 161, 40, - 165, -1, 161, 41, 165, -1, 161, 42, 165, -1, - 161, 43, 165, -1, 161, 44, 161, -1, 47, 140, - 159, 141, -1, 163, -1, 171, 113, 166, -1, 266, - 90, 166, -1, 218, 142, 192, 298, 90, 166, -1, - 218, 143, 51, 90, 166, -1, 218, 143, 55, 90, - 166, -1, 218, 88, 55, 90, 166, -1, 218, 88, - 51, 90, 166, -1, 268, 90, 166, -1, 178, 113, - 199, -1, 171, 113, 188, -1, 171, 113, 199, -1, - 164, -1, 178, 113, 166, -1, 178, 113, 163, -1, - 166, -1, 164, 37, 164, -1, 164, 38, 164, -1, - 39, 296, 164, -1, 127, 166, -1, 187, -1, 164, - -1, 170, -1, 167, -1, 237, -1, 237, 294, 292, - 194, -1, -1, 97, 169, 228, 159, 141, -1, 291, - 194, -1, 291, 194, 168, -1, 218, 143, 292, 194, - -1, 218, 143, 292, 194, 168, -1, 218, 88, 292, - 194, -1, 218, 88, 292, 194, 168, -1, 32, 194, - -1, 31, 194, -1, 30, 193, -1, 21, 193, -1, - 22, 193, -1, 173, -1, 92, 172, 297, -1, 173, - -1, 92, 172, 297, -1, 175, -1, 175, 174, -1, - 175, 98, 177, -1, 175, 98, 177, 144, 176, -1, - 175, 98, -1, 175, 98, 144, 176, -1, 98, 177, - -1, 98, 177, 144, 176, -1, 98, -1, 98, 144, - 176, -1, 177, -1, 92, 172, 297, -1, 174, 144, - -1, 175, 174, 144, -1, 174, -1, 175, 174, -1, - 265, -1, 218, 142, 192, 298, -1, 218, 143, 51, - -1, 218, 88, 51, -1, 218, 143, 55, -1, 218, - 88, 55, -1, 89, 55, -1, 268, -1, 265, -1, - 218, 142, 192, 298, -1, 218, 143, 51, -1, 218, - 88, 51, -1, 218, 143, 55, -1, 218, 88, 55, - -1, 89, 55, -1, 268, -1, 51, -1, 55, -1, - 89, 179, -1, 179, -1, 218, 88, 179, -1, 51, - -1, 55, -1, 52, -1, 185, -1, 186, -1, 181, - -1, 261, -1, 182, -1, -1, 183, 144, 184, 182, - -1, 118, -1, 119, -1, 120, -1, 72, -1, 73, - -1, 74, -1, 80, -1, 81, -1, 116, -1, 76, - -1, 117, -1, 77, -1, 75, -1, 86, -1, 87, - -1, 121, -1, 122, -1, 123, -1, 98, -1, 124, - -1, 125, -1, 71, -1, 127, -1, 128, -1, 69, - -1, 70, -1, 84, -1, 85, -1, 145, -1, 48, - -1, 49, -1, 50, -1, 46, -1, 47, -1, 45, - -1, 37, -1, 7, -1, 21, -1, 16, -1, 3, - -1, 5, -1, 26, -1, 15, -1, 14, -1, 10, - -1, 9, -1, 36, -1, 20, -1, 25, -1, 4, - -1, 22, -1, 34, -1, 39, -1, 38, -1, 23, - -1, 8, -1, 24, -1, 30, -1, 33, -1, 32, - -1, 13, -1, 35, -1, 6, -1, 17, -1, 31, - -1, 11, -1, 12, -1, 18, -1, 19, -1, 178, - 113, 187, -1, 178, 113, 187, 44, 187, -1, 266, - 90, 187, -1, 266, 90, 187, 44, 187, -1, 218, - 142, 192, 298, 90, 187, -1, 218, 143, 51, 90, - 187, -1, 218, 143, 55, 90, 187, -1, 218, 88, - 51, 90, 187, -1, 218, 88, 55, 90, 187, -1, - 89, 55, 90, 187, -1, 268, 90, 187, -1, 187, - 82, 187, -1, 187, 83, 187, -1, 187, 121, 187, - -1, 187, 122, 187, -1, 187, 123, 187, -1, 187, - 124, 187, -1, 187, 125, 187, -1, 187, 71, 187, - -1, 126, 58, 71, 187, -1, 126, 59, 71, 187, - -1, 69, 187, -1, 70, 187, -1, 187, 118, 187, - -1, 187, 119, 187, -1, 187, 120, 187, -1, 187, - 72, 187, -1, 187, 116, 187, -1, 187, 76, 187, - -1, 187, 117, 187, -1, 187, 77, 187, -1, 187, - 73, 187, -1, 187, 74, 187, -1, 187, 75, 187, - -1, 187, 80, 187, -1, 187, 81, 187, -1, 127, - 187, -1, 128, 187, -1, 187, 86, 187, -1, 187, - 87, 187, -1, 187, 78, 187, -1, 187, 79, 187, - -1, 187, 114, 187, 296, 115, 187, -1, 200, -1, - 187, -1, 304, -1, 198, 299, -1, 198, 144, 289, - 299, -1, 289, 299, -1, 146, 192, 297, -1, 304, - -1, 190, -1, 304, -1, 193, -1, 198, 144, -1, - 198, 144, 289, 144, -1, 289, 144, -1, 170, -1, - 198, 197, -1, 289, 197, -1, 198, 144, 289, 197, - -1, 196, -1, -1, 195, 193, -1, 99, 188, -1, - 144, 196, -1, 304, -1, 188, -1, 98, 188, -1, - 198, 144, 188, -1, 198, 144, 98, 188, -1, 198, - 144, 188, -1, 198, 144, 98, 188, -1, 98, 188, - -1, 248, -1, 249, -1, 253, -1, 254, -1, 255, - -1, 267, -1, 268, -1, 52, -1, -1, 7, 201, - 158, 10, -1, -1, 93, 164, 202, 297, -1, -1, - 93, 203, 297, -1, 92, 159, 147, -1, 218, 88, - 55, -1, 89, 55, -1, 95, 189, 148, -1, 96, - 288, 141, -1, 30, -1, 31, 146, 193, 297, -1, - 31, 146, 297, -1, 31, -1, 39, 146, 164, 297, - -1, 39, 146, 297, -1, 291, 239, -1, 238, -1, - 238, 239, -1, -1, 100, 204, 233, 234, -1, 11, - 165, 219, 159, 221, 10, -1, 12, 165, 219, 159, - 222, 10, -1, -1, -1, 18, 205, 165, 220, 206, - 159, 10, -1, -1, -1, 19, 207, 165, 220, 208, - 159, 10, -1, 16, 165, 295, 242, 10, -1, 16, - 295, 242, 10, -1, -1, -1, 20, 223, 25, 209, - 165, 220, 210, 159, 10, -1, -1, 3, 180, 269, - 211, 158, 10, -1, -1, -1, 3, 86, 164, 212, - 300, 213, 158, 10, -1, -1, 4, 180, 214, 158, - 10, -1, -1, 5, 181, 215, 271, 158, 10, -1, - -1, -1, 5, 286, 294, 216, 181, 217, 271, 158, - 10, -1, 21, -1, 22, -1, 23, -1, 24, -1, - 200, -1, 300, -1, 13, -1, 300, 13, -1, 300, - -1, 27, -1, 222, -1, 14, 165, 219, 159, 221, - -1, 304, -1, 15, 159, -1, 178, -1, 171, -1, - 274, -1, 92, 226, 297, -1, 224, -1, 225, 144, - 224, -1, 225, -1, 225, 144, 98, 274, -1, 225, - 144, 98, 274, 144, 225, -1, 225, 144, 98, -1, - 225, 144, 98, 144, 225, -1, 98, 274, -1, 98, - 274, 144, 225, -1, 98, -1, 98, 144, 225, -1, - 276, 144, 279, 144, 282, 285, -1, 276, 144, 279, - 144, 282, 144, 276, 285, -1, 276, 144, 279, 285, - -1, 276, 144, 279, 144, 276, 285, -1, 276, 144, - 282, 285, -1, 276, 144, -1, 276, 144, 282, 144, - 276, 285, -1, 276, 285, -1, 279, 144, 282, 285, - -1, 279, 144, 282, 144, 276, 285, -1, 279, 285, - -1, 279, 144, 276, 285, -1, 282, 285, -1, 282, - 144, 276, 285, -1, 284, -1, 304, -1, 229, -1, - 118, 230, 118, -1, 79, -1, 118, 227, 230, 118, - -1, 296, -1, 296, 149, 231, 296, -1, 232, -1, - 231, 144, 232, -1, 51, -1, 273, -1, 146, 272, - 230, 147, -1, 272, -1, 108, 159, 141, -1, 29, - 159, 10, -1, -1, 28, 236, 228, 159, 10, -1, - 170, 235, -1, 237, 294, 292, 191, -1, 237, 294, - 292, 191, 239, -1, 237, 294, 292, 194, 235, -1, - 291, 190, -1, 218, 143, 292, 191, -1, 218, 88, - 292, 190, -1, 218, 88, 293, -1, 218, 143, 190, - -1, 218, 88, 190, -1, 32, 190, -1, 32, -1, - 218, 142, 192, 298, -1, -1, 140, 240, 228, 159, - 141, -1, -1, 26, 241, 228, 159, 10, -1, 17, - 198, 219, 159, 243, -1, 222, -1, 242, -1, 8, - 245, 246, 219, 159, 244, -1, 304, -1, 188, -1, - 199, -1, 304, -1, 91, 178, -1, 304, -1, 9, - 159, -1, 304, -1, 264, -1, 260, -1, 259, -1, - 263, -1, 60, -1, 63, -1, 105, 63, -1, 105, - 250, 63, -1, 251, -1, 250, 251, -1, 65, -1, - -1, 64, 252, 159, 141, -1, 111, -1, 106, 61, - -1, 106, 250, 61, -1, 102, 62, -1, 102, 250, - 62, -1, 109, -1, 304, -1, 257, -1, 258, -1, - 257, 258, -1, 110, -1, 250, 110, -1, 103, 63, - -1, 103, 250, 63, -1, 261, -1, 101, 105, 251, - 63, -1, 101, 262, -1, 181, -1, 54, -1, 53, - -1, 56, -1, 63, -1, 105, 63, -1, 104, 63, - -1, 104, 250, 63, -1, 58, -1, 59, -1, 126, - 58, -1, 126, 59, -1, 51, -1, 54, -1, 53, - -1, 56, -1, 55, -1, 265, -1, 265, -1, 34, - -1, 33, -1, 35, -1, 36, -1, 49, -1, 48, - -1, 66, -1, 67, -1, 300, -1, -1, 117, 270, - 165, 300, -1, 1, 300, -1, 146, 272, 297, -1, - 272, 300, -1, 276, 144, 280, 144, 282, 285, -1, - 276, 144, 280, 144, 282, 144, 276, 285, -1, 276, - 144, 280, 285, -1, 276, 144, 280, 144, 276, 285, - -1, 276, 144, 282, 285, -1, 276, 144, 282, 144, - 276, 285, -1, 276, 285, -1, 280, 144, 282, 285, - -1, 280, 144, 282, 144, 276, 285, -1, 280, 285, - -1, 280, 144, 276, 285, -1, 282, 285, -1, 282, - 144, 276, 285, -1, 284, -1, -1, 55, -1, 54, - -1, 53, -1, 56, -1, 273, -1, 51, -1, 274, - -1, 92, 226, 297, -1, 275, -1, 276, 144, 275, - -1, 51, 113, 188, -1, 51, 113, 218, -1, 278, - -1, 279, 144, 278, -1, 277, -1, 280, 144, 277, - -1, 123, -1, 98, -1, 281, 51, -1, 281, -1, - 120, -1, 99, -1, 283, 51, -1, 144, 284, -1, - 304, -1, 267, -1, -1, 146, 287, 164, 297, -1, - 304, -1, 289, 299, -1, 290, -1, 289, 144, 290, - -1, 188, 91, 188, -1, 57, 188, -1, 51, -1, - 55, -1, 52, -1, 51, -1, 55, -1, 52, -1, - 185, -1, 51, -1, 52, -1, 185, -1, 143, -1, - 88, -1, -1, 303, -1, -1, 301, -1, 296, 147, - -1, 296, 148, -1, -1, 301, -1, 144, -1, 149, - -1, 301, -1, -1, 150, 302, 256, -1, 300, -1, - 303, 149, -1, -1 -}; - -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const yytype_uint16 yyrline[] = -{ - 0, 1100, 1100, 1100, 1110, 1116, 1120, 1124, 1128, 1134, - 1136, 1135, 1147, 1173, 1179, 1183, 1187, 1191, 1197, 1197, - 1201, 1205, 1209, 1213, 1217, 1221, 1225, 1230, 1231, 1235, - 1239, 1243, 1247, 1251, 1256, 1260, 1265, 1269, 1273, 1277, - 1280, 1284, 1291, 1292, 1296, 1300, 1304, 1308, 1311, 1318, - 1319, 1322, 1323, 1327, 1326, 1339, 1343, 1348, 1352, 1357, - 1361, 1366, 1370, 1374, 1378, 1382, 1388, 1392, 1398, 1399, - 1405, 1409, 1413, 1417, 1421, 1425, 1429, 1433, 1437, 1441, - 1447, 1448, 1454, 1458, 1464, 1468, 1474, 1478, 1482, 1486, - 1490, 1494, 1500, 1506, 1513, 1517, 1521, 1525, 1529, 1533, - 1539, 1545, 1552, 1556, 1559, 1563, 1567, 1573, 1574, 1575, - 1576, 1581, 1588, 1589, 1592, 1596, 1596, 1602, 1603, 1604, - 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, - 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, - 1625, 1626, 1627, 1628, 1629, 1630, 1633, 1633, 1633, 1634, - 1634, 1635, 1635, 1635, 1636, 1636, 1636, 1636, 1637, 1637, - 1637, 1638, 1638, 1638, 1639, 1639, 1639, 1639, 1640, 1640, - 1640, 1640, 1641, 1641, 1641, 1641, 1642, 1642, 1642, 1642, - 1643, 1643, 1643, 1643, 1644, 1644, 1647, 1651, 1655, 1659, - 1663, 1667, 1671, 1675, 1679, 1684, 1689, 1694, 1698, 1702, - 1706, 1710, 1714, 1718, 1722, 1726, 1730, 1734, 1738, 1742, - 1746, 1750, 1754, 1758, 1762, 1766, 1770, 1774, 1778, 1782, - 1786, 1790, 1794, 1798, 1802, 1806, 1810, 1814, 1818, 1822, - 1828, 1835, 1836, 1840, 1844, 1850, 1856, 1857, 1860, 1861, - 1862, 1866, 1870, 1876, 1880, 1884, 1888, 1892, 1898, 1898, - 1909, 1915, 1919, 1925, 1929, 1933, 1937, 1943, 1947, 1951, - 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1969, 1968, - 1979, 1979, 1983, 1983, 1987, 1991, 1995, 1999, 2003, 2007, - 2011, 2015, 2019, 2023, 2027, 2031, 2035, 2036, 2042, 2041, - 2054, 2061, 2068, 2068, 2068, 2074, 2074, 2074, 2080, 2086, - 2091, 2093, 2090, 2100, 2099, 2112, 2117, 2111, 2130, 2129, - 2142, 2141, 2154, 2155, 2154, 2168, 2172, 2176, 2180, 2186, - 2193, 2194, 2195, 2198, 2199, 2202, 2203, 2211, 2212, 2218, - 2222, 2225, 2229, 2235, 2239, 2245, 2249, 2253, 2257, 2261, - 2265, 2269, 2273, 2277, 2283, 2287, 2291, 2295, 2299, 2303, - 2307, 2311, 2315, 2319, 2323, 2327, 2331, 2335, 2339, 2345, - 2346, 2353, 2358, 2363, 2370, 2374, 2380, 2381, 2384, 2389, - 2392, 2396, 2402, 2406, 2413, 2412, 2425, 2435, 2439, 2444, - 2451, 2455, 2459, 2463, 2467, 2471, 2475, 2479, 2483, 2490, - 2489, 2500, 2499, 2511, 2519, 2528, 2531, 2538, 2541, 2545, - 2546, 2549, 2553, 2556, 2560, 2563, 2564, 2565, 2566, 2569, - 2570, 2571, 2575, 2581, 2582, 2588, 2593, 2592, 2603, 2609, - 2613, 2619, 2623, 2629, 2632, 2633, 2636, 2637, 2640, 2645, - 2652, 2656, 2663, 2667, 2674, 2681, 2682, 2683, 2684, 2685, - 2689, 2695, 2699, 2705, 2706, 2707, 2711, 2717, 2721, 2725, - 2729, 2733, 2739, 2745, 2749, 2753, 2757, 2761, 2765, 2772, - 2781, 2782, 2785, 2790, 2789, 2798, 2805, 2811, 2817, 2821, - 2825, 2829, 2833, 2837, 2841, 2845, 2849, 2853, 2857, 2861, - 2865, 2869, 2874, 2880, 2885, 2890, 2895, 2902, 2906, 2913, - 2917, 2923, 2927, 2933, 2940, 2947, 2951, 2957, 2961, 2967, - 2968, 2971, 2976, 2983, 2984, 2987, 2994, 2998, 3005, 3010, - 3010, 3035, 3036, 3042, 3046, 3052, 3056, 3062, 3063, 3064, - 3067, 3068, 3069, 3070, 3073, 3074, 3075, 3078, 3079, 3082, - 3083, 3086, 3087, 3090, 3093, 3096, 3097, 3098, 3101, 3102, - 3106, 3105, 3112, 3113, 3117 -}; -#endif - -#if YYDEBUG || YYERROR_VERBOSE || 0 -/* 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_undef", "keyword_begin", "keyword_rescue", - "keyword_ensure", "keyword_end", "keyword_if", "keyword_unless", - "keyword_then", "keyword_elsif", "keyword_else", "keyword_case", - "keyword_when", "keyword_while", "keyword_until", "keyword_for", - "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", "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", - "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", "$@24", "block_call", "method_call", - "brace_block", "$@25", "$@26", "case_body", "cases", "opt_rescue", - "exc_list", "exc_var", "opt_ensure", "literal", "string", "string_rep", - "string_interp", "@27", "xstring", "regexp", "heredoc", - "opt_heredoc_bodies", "heredoc_bodies", "heredoc_body", "words", - "symbol", "basic_symbol", "sym", "symbols", "numeric", "variable", - "var_lhs", "var_ref", "backref", "superclass", "$@28", "f_arglist", - "f_args", "f_bad_arg", "f_norm_arg", "f_arg_item", "f_arg", "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", "$@29", "assoc_list", "assocs", "assoc", "operation", - "operation2", "operation3", "dot_or_colon", "opt_terms", "opt_nl", - "rparen", "rbracket", "trailer", "term", "nl", "$@30", "terms", "none", YY_NULL -}; -#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, 61, 63, 58, 62, 60, 124, 94, - 38, 43, 45, 42, 47, 37, 368, 33, 126, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 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, 151, 153, 152, 154, 155, 155, 155, 155, 156, - 157, 156, 158, 159, 160, 160, 160, 160, 162, 161, - 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, - 163, 163, 164, 164, 164, 164, 164, 164, 165, 166, - 166, 167, 167, 169, 168, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 171, 171, 172, 172, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 174, 174, 175, 175, 176, 176, 177, 177, 177, 177, - 177, 177, 177, 177, 178, 178, 178, 178, 178, 178, - 178, 178, 179, 179, 180, 180, 180, 181, 181, 181, - 181, 181, 182, 182, 183, 184, 183, 185, 185, 185, - 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, - 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, - 185, 185, 185, 185, 185, 185, 186, 186, 186, 186, - 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, - 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, - 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, - 186, 186, 186, 186, 186, 186, 187, 187, 187, 187, - 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, - 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, - 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, - 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, - 188, 189, 189, 189, 189, 190, 191, 191, 192, 192, - 192, 192, 192, 193, 193, 193, 193, 193, 195, 194, - 196, 197, 197, 198, 198, 198, 198, 199, 199, 199, - 200, 200, 200, 200, 200, 200, 200, 200, 201, 200, - 202, 200, 203, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 200, 200, 200, 204, 200, - 200, 200, 205, 206, 200, 207, 208, 200, 200, 200, - 209, 210, 200, 211, 200, 212, 213, 200, 214, 200, - 215, 200, 216, 217, 200, 200, 200, 200, 200, 218, - 219, 219, 219, 220, 220, 221, 221, 222, 222, 223, - 223, 224, 224, 225, 225, 226, 226, 226, 226, 226, - 226, 226, 226, 226, 227, 227, 227, 227, 227, 227, - 227, 227, 227, 227, 227, 227, 227, 227, 227, 228, - 228, 229, 229, 229, 230, 230, 231, 231, 232, 232, - 233, 233, 234, 234, 236, 235, 237, 237, 237, 237, - 238, 238, 238, 238, 238, 238, 238, 238, 238, 240, - 239, 241, 239, 242, 243, 243, 244, 244, 245, 245, - 245, 246, 246, 247, 247, 248, 248, 248, 248, 249, - 249, 249, 249, 250, 250, 251, 252, 251, 251, 253, - 253, 254, 254, 255, 256, 256, 257, 257, 258, 258, - 259, 259, 260, 260, 261, 262, 262, 262, 262, 262, - 262, 263, 263, 264, 264, 264, 264, 265, 265, 265, - 265, 265, 266, 267, 267, 267, 267, 267, 267, 267, - 268, 268, 269, 270, 269, 269, 271, 271, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 273, 273, 273, 273, 274, 274, 275, - 275, 276, 276, 277, 278, 279, 279, 280, 280, 281, - 281, 282, 282, 283, 283, 284, 285, 285, 286, 287, - 286, 288, 288, 289, 289, 290, 290, 291, 291, 291, - 292, 292, 292, 292, 293, 293, 293, 294, 294, 295, - 295, 296, 296, 297, 298, 299, 299, 299, 300, 300, - 302, 301, 303, 303, 304 -}; - -/* 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, 3, 4, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, - 0, 4, 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, 6, 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, - 3, 2, 3, 1, 1, 1, 1, 2, 1, 2, - 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, 3, 3, 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 reduction number in state STATE-NUM. - Performed 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, 0, 268, - 0, 0, 529, 292, 295, 0, 315, 316, 317, 318, - 279, 248, 248, 455, 454, 456, 457, 531, 0, 10, - 0, 459, 458, 447, 519, 449, 448, 451, 450, 443, - 444, 409, 410, 460, 461, 0, 0, 0, 0, 272, - 544, 544, 78, 288, 0, 0, 0, 0, 0, 0, - 423, 0, 0, 0, 3, 529, 6, 9, 27, 39, - 42, 50, 49, 0, 66, 0, 70, 80, 0, 47, - 229, 0, 51, 286, 260, 261, 262, 263, 264, 407, - 406, 432, 408, 405, 453, 0, 265, 266, 248, 5, - 8, 315, 316, 279, 282, 387, 0, 102, 103, 0, - 0, 0, 0, 105, 0, 319, 0, 453, 266, 0, - 308, 156, 166, 157, 179, 153, 172, 162, 161, 182, - 183, 177, 160, 159, 155, 180, 184, 185, 164, 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, 509, 310, 110, 111, 508, 0, 175, - 168, 178, 163, 146, 147, 107, 108, 0, 112, 114, - 20, 113, 0, 0, 48, 0, 0, 0, 453, 0, - 266, 0, 538, 540, 529, 0, 542, 539, 530, 0, - 0, 0, 330, 329, 0, 0, 453, 266, 0, 0, - 0, 0, 243, 230, 253, 64, 247, 544, 544, 513, - 65, 63, 531, 62, 0, 544, 386, 61, 531, 0, - 532, 18, 0, 0, 207, 0, 208, 276, 0, 0, - 0, 529, 15, 531, 68, 14, 270, 531, 0, 535, - 535, 231, 0, 0, 535, 511, 0, 0, 76, 0, - 86, 93, 482, 437, 436, 438, 439, 0, 435, 434, - 421, 416, 415, 418, 0, 413, 430, 0, 441, 0, - 411, 0, 419, 0, 445, 446, 46, 222, 223, 4, - 530, 0, 0, 0, 0, 0, 0, 0, 374, 376, - 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, 544, 0, 528, 527, 0, 391, 389, - 287, 0, 0, 380, 55, 285, 305, 102, 103, 104, - 445, 446, 0, 463, 303, 462, 0, 544, 0, 0, - 0, 482, 312, 0, 115, 0, 544, 276, 321, 0, - 320, 0, 0, 544, 0, 0, 0, 0, 544, 0, - 0, 0, 543, 0, 0, 276, 0, 544, 0, 300, - 516, 254, 250, 0, 0, 244, 252, 0, 245, 531, - 0, 281, 249, 531, 239, 544, 544, 238, 531, 284, - 45, 0, 0, 0, 0, 0, 0, 17, 531, 274, - 13, 530, 67, 531, 273, 277, 537, 232, 536, 537, - 234, 278, 512, 92, 84, 0, 79, 0, 0, 544, - 0, 488, 485, 484, 483, 486, 0, 500, 504, 503, - 499, 482, 0, 371, 487, 489, 491, 544, 497, 544, - 502, 544, 0, 481, 440, 0, 0, 422, 414, 431, - 442, 412, 420, 0, 0, 7, 21, 22, 23, 24, - 25, 43, 44, 544, 0, 28, 37, 0, 38, 531, - 0, 72, 83, 41, 40, 0, 186, 253, 36, 204, - 212, 217, 218, 219, 214, 216, 226, 227, 220, 221, - 197, 198, 224, 225, 531, 213, 215, 209, 210, 211, - 199, 200, 201, 202, 203, 520, 525, 521, 526, 385, - 248, 383, 531, 520, 522, 521, 523, 384, 248, 520, - 521, 248, 544, 544, 29, 188, 35, 196, 53, 56, - 0, 465, 0, 0, 102, 103, 106, 0, 531, 544, - 0, 531, 482, 0, 0, 0, 0, 269, 544, 544, - 397, 544, 322, 186, 524, 521, 531, 520, 521, 544, - 428, 0, 541, 425, 426, 424, 0, 0, 299, 324, - 293, 323, 296, 524, 275, 531, 520, 521, 0, 515, - 0, 255, 251, 544, 514, 280, 533, 235, 240, 242, - 283, 19, 0, 26, 195, 69, 16, 271, 535, 85, - 77, 89, 91, 531, 520, 521, 0, 488, 0, 342, - 333, 335, 531, 331, 531, 0, 0, 289, 0, 474, - 507, 0, 477, 501, 0, 479, 505, 433, 0, 205, - 206, 362, 531, 0, 360, 359, 259, 0, 81, 75, - 0, 0, 0, 0, 0, 0, 382, 59, 0, 388, - 0, 0, 237, 381, 57, 236, 377, 52, 0, 0, - 0, 544, 306, 0, 0, 388, 309, 510, 531, 0, - 467, 313, 116, 398, 399, 544, 400, 0, 544, 327, - 0, 0, 325, 0, 0, 388, 0, 0, 0, 429, - 427, 298, 0, 0, 0, 0, 388, 0, 256, 246, - 544, 11, 233, 87, 493, 531, 0, 340, 0, 490, - 0, 364, 0, 0, 492, 544, 544, 506, 544, 498, - 544, 544, 417, 488, 531, 0, 544, 495, 544, 544, - 358, 0, 0, 257, 73, 187, 0, 34, 193, 33, - 194, 60, 534, 0, 31, 191, 32, 192, 58, 378, - 379, 0, 0, 189, 0, 0, 464, 304, 466, 311, - 482, 0, 0, 402, 328, 0, 12, 404, 0, 290, - 0, 291, 255, 544, 0, 0, 301, 241, 332, 343, - 0, 338, 334, 370, 0, 373, 372, 0, 470, 0, - 472, 0, 478, 0, 475, 480, 0, 0, 361, 349, - 351, 0, 354, 0, 356, 375, 258, 228, 30, 190, - 392, 390, 0, 0, 0, 0, 401, 0, 94, 101, - 0, 403, 0, 394, 395, 393, 294, 297, 0, 0, - 341, 0, 336, 368, 531, 366, 369, 544, 544, 544, - 544, 0, 494, 363, 544, 544, 544, 496, 544, 544, - 54, 307, 0, 100, 0, 544, 0, 544, 544, 0, - 339, 0, 0, 365, 471, 0, 468, 473, 476, 276, - 0, 0, 346, 0, 348, 355, 0, 352, 357, 314, - 524, 99, 531, 520, 521, 396, 326, 302, 337, 367, - 544, 524, 275, 544, 544, 544, 544, 388, 469, 347, - 0, 344, 350, 353, 544, 345 -}; - -/* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int16 yydefgoto[] = -{ - -1, 1, 2, 64, 65, 66, 262, 395, 396, 271, - 272, 441, 68, 69, 215, 70, 71, 579, 711, 72, - 73, 273, 74, 75, 76, 466, 77, 216, 113, 114, - 208, 209, 210, 596, 195, 196, 79, 244, 278, 559, - 703, 433, 434, 253, 254, 246, 425, 435, 518, 80, - 212, 453, 277, 292, 229, 744, 230, 745, 628, 878, - 583, 580, 805, 389, 391, 595, 810, 265, 399, 620, - 731, 732, 235, 660, 661, 662, 774, 683, 684, 760, - 884, 885, 482, 667, 329, 513, 82, 83, 375, 573, - 572, 411, 875, 599, 725, 812, 816, 84, 85, 611, - 305, 496, 86, 87, 88, 612, 613, 614, 89, 90, - 91, 299, 92, 93, 218, 219, 96, 220, 384, 582, - 593, 594, 484, 485, 486, 487, 488, 777, 778, 489, - 490, 491, 492, 767, 669, 198, 390, 283, 436, 249, - 119, 587, 561, 367, 225, 430, 431, 699, 457, 400, - 260, 408, 228, 275 -}; - -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF -745 -static const yytype_int16 yypact[] = -{ - -745, 109, 2594, -745, 7293, 9101, 9428, 5731, 6790, -745, - 8762, 8762, 5204, -745, -745, 9210, 7519, 7519, -745, -745, - 7519, 3298, 2863, -745, -745, -745, -745, -13, 6790, -745, - 1, -745, -745, 5862, 3008, -745, -745, 5993, -745, -745, - -745, -745, -745, -745, -745, 8875, 8875, 94, 4515, 8762, - 7745, 8084, 7061, -745, 6504, 671, 707, 751, 771, 314, - -745, 125, 8988, 8875, -745, 189, -745, 905, -745, 491, - -745, -745, 124, 67, -745, 43, 9319, -745, 99, 2845, - 228, 271, 24, 76, -745, -745, -745, -745, -745, -745, - -745, -745, -745, -745, 392, 86, -745, 436, 63, -745, - -745, -745, -745, -745, 102, 123, 168, 328, 418, 8762, - 104, 4665, 283, -745, 160, -745, 278, -745, -745, 63, - -745, -745, -745, -745, -745, -745, -745, -745, -745, -745, - -745, -745, -745, -745, -745, -745, -745, -745, -745, -745, - -745, -745, -745, -745, -745, -745, -745, -745, 56, 59, - 214, 234, -745, -745, -745, -745, -745, -745, 260, 274, - -745, 292, -745, 295, -745, -745, -745, -745, -745, -745, - -745, -745, -745, -745, -745, -745, -745, -745, -745, -745, - -745, -745, -745, -745, -745, -745, -745, -745, -745, -745, - -745, -745, -745, -745, -745, -745, -745, -745, 24, -745, - -745, -745, -745, -745, -745, -745, -745, 6647, -745, -745, - 93, -745, 3682, 150, 491, 92, 218, 284, 49, 237, - 75, 92, -745, -745, 189, 332, -745, -745, 235, 8762, - 8762, 312, -745, -745, 304, 364, 88, 95, 8875, 8875, - 8875, 8875, -745, 2845, 300, -745, -745, 261, 266, -745, - -745, -745, 5091, -745, 7519, 7519, -745, -745, 5339, 8762, - -745, -745, 279, 4815, -745, 330, 370, 472, 7406, 4515, - 301, 189, 905, 308, 338, -745, 491, 308, 315, 19, - 145, -745, 300, 324, 145, -745, 421, 9537, 334, 354, - 373, 378, 745, -745, -745, -745, -745, 939, -745, -745, - -745, -745, -745, -745, 696, -745, -745, 943, -745, 961, - -745, 971, -745, 388, 409, 415, -745, -745, -745, -745, - 5452, 8762, 8762, 8762, 8762, 7406, 8762, 8762, -745, -745, - 8197, -745, 4515, 7177, 357, 8197, 8875, 8875, 8875, 8875, - 8875, 8875, 8875, 8875, 8875, 8875, 8875, 8875, 8875, 8875, - 8875, 8875, 8875, 8875, 8875, 8875, 8875, 8875, 8875, 8875, - 8875, 8875, 2206, 7519, 9814, -745, -745, 10750, -745, -745, - -745, 8988, 8988, -745, 395, -745, 491, -745, 381, -745, - -745, -745, 189, -745, -745, -745, 9892, 7519, 9970, 3682, - 8762, 875, -745, 441, -745, 503, 523, 91, -745, 3823, - 520, 8875, 10048, 7519, 10126, 8875, 8875, 4095, 802, 332, ... truncated to 1.0MB