Ignore:
Timestamp:
Jan 21, 2018, 12:10:09 AM (6 years ago)
Author:
coas-nagasima
Message:

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

Location:
EcnlProtoTool/trunk/mruby-1.3.0
Files:
28 added
194 edited
1 moved

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/mruby-1.3.0/.cproject

    r279 r331  
    1919                                                <toolChain id="com.renesas.cdt.rz.debug.win32.toolchain.Id.87786683" name="KPIT GNUARM-NONE-EABI Toolchain" superClass="com.renesas.cdt.rz.debug.win32.toolchain.Id">
    2020                                                        <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.PE" id="com.renesas.cdt.rz.debug.win32.targetplatform.Id.1600182357" name="Target Platform" osList="all" superClass="com.renesas.cdt.rz.debug.win32.targetplatform.Id"/>
    21                                                         <builder buildPath="${workspace_loc:/mruby-1.2.0}" id="com.renesas.cdt.rz.debug.win32.builder.Id.1846611762" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Builder" superClass="com.renesas.cdt.rz.debug.win32.builder.Id"/>
     21                                                        <builder buildPath="${workspace_loc:/mruby-1.3.0}" id="com.renesas.cdt.rz.debug.win32.builder.Id.1846611762" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Builder" superClass="com.renesas.cdt.rz.debug.win32.builder.Id"/>
    2222                                                        <tool id="com.renesas.cdt.rz.debug.win32.tool.libgen.Id.1116635171" name="Library Generator" superClass="com.renesas.cdt.rz.debug.win32.tool.libgen.Id">
    2323                                                                <option id="com.renesas.cdt.core.LibraryGenerator.option.ctype.458951408" name="ctype.h : 文字を扱いチェックします" superClass="com.renesas.cdt.core.LibraryGenerator.option.ctype" value="true" valueType="boolean"/>
  • EcnlProtoTool/trunk/mruby-1.3.0/.gitignore

    r270 r331  
    1818/.git
    1919cscope.out
     20tags
    2021/src/y.tab.c
    2122/bin
  • EcnlProtoTool/trunk/mruby-1.3.0/.info

    r279 r331  
    44GCC_STRING=5.2-GNUARM-NONE_v16.01
    55VERSION_IDE=
    6 E2STUDIO_VERSION=5.3.1.002
     6E2STUDIO_VERSION=5.4.0.018
    77ACTIVE_CONFIGURATION=Debug
  • EcnlProtoTool/trunk/mruby-1.3.0/.project

    r279 r331  
    11<?xml version="1.0" encoding="UTF-8"?>
    22<projectDescription>
    3         <name>mruby-1.2.0</name>
     3        <name>mruby-1.3.0</name>
    44        <comment></comment>
    55        <projects>
  • EcnlProtoTool/trunk/mruby-1.3.0/.travis.yml

    r270 r331  
    88      sudo: 9000
    99    - os: osx
    10       osx_image: xcod6.4
     10      osx_image: xcode7.1
    1111
    1212addons:
     
    1717env: MRUBY_CONFIG=travis_config.rb
    1818script: "./minirake all test"
    19 
    20 notifications:
    21   # Update mruby-head installed on Travis CI so other projects can test against it.
    22   webhooks:
    23     urls:
    24       - "https://rubies.travis-ci.org/rebuild/mruby-head"
    25     on_success: always
    26     on_failure: never
  • EcnlProtoTool/trunk/mruby-1.3.0/AUTHORS

    r270 r331  
    3535   Terence Lee
    3636   Zachary Scott
     37   Tomasz DÄ
     38browski
  • EcnlProtoTool/trunk/mruby-1.3.0/MITL

    r270 r331  
    1 Copyright (c) 2015 mruby developers
     1Copyright (c) 2017 mruby developers
    22
    33Permission is hereby granted, free of charge, to any person obtaining a
  • EcnlProtoTool/trunk/mruby-1.3.0/README.md

    r270 r331  
    1818## How to get mruby
    1919
    20 The stable version 1.2.0 of mruby can be downloaded via the following URL: [https://github.com/mruby/mruby/archive/1.2.0.zip](https://github.com/mruby/mruby/archive/1.2.0.zip)
     20The stable version 1.3.0 of mruby can be downloaded via the following URL: [https://github.com/mruby/mruby/archive/1.3.0.zip](https://github.com/mruby/mruby/archive/1.3.0.zip)
    2121
    2222The latest development version of mruby can be downloaded via the following URL: [https://github.com/mruby/mruby/zipball/master](https://github.com/mruby/mruby/zipball/master)
     
    2727    $ git clone https://github.com/mruby/mruby.git
    2828
     29You can also install and compile mruby using [ruby-install](https://github.com/postmodern/ruby-install), [ruby-build](https://github.com/rbenv/ruby-build) or [rvm](https://github.com/rvm/rvm).
     30
    2931## mruby home-page
    3032
     
    3335## Mailing list
    3436
    35 We don't have mailing list, but you can use [GitHub issues](https://github.com/mruby/mruby).
     37We don't have a mailing list, but you can use [GitHub issues](https://github.com/mruby/mruby).
    3638
    3739## How to compile and install (mruby and gems)
     
    5355mruby contains a package manager called *mrbgems*. To create extensions
    5456in C and/or Ruby you should create a *GEM*. For a documentation of how to
    55 use mrbgems consult the file [doc/mrbgems/README.md](doc/mrbgems/README.md). For example code of
     57use mrbgems consult the file [doc/guides/mrbgems.md](doc/guides/mrbgems.md). For example code of
    5658how to use mrbgems look into the folder *examples/mrbgems/*.
    5759
  • EcnlProtoTool/trunk/mruby-1.3.0/Rakefile

    r270 r331  
    2828
    2929load "#{MRUBY_ROOT}/tasks/benchmark.rake"
     30
     31load "#{MRUBY_ROOT}/tasks/gitlab.rake"
    3032
    3133##############################
  • EcnlProtoTool/trunk/mruby-1.3.0/build.bat

    r298 r331  
     1set DIR=%~dp0
     2set PATH=%PATH%;%DIR%\..\tools\bin
    13
    2 call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" x86
     4rem call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" x86
     5call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x86
     6
     7cd /d %DIR%
    38
    49ruby -Eutf-8 ./minirake %1
  • EcnlProtoTool/trunk/mruby-1.3.0/build_config.rb

    r321 r331  
    1717  # end
    1818  # conf.gem 'examples/mrbgems/c_and_ruby_extension_example'
    19   # conf.gem :github => 'masuidrive/mrbgems-example', :checksum_hash => '76518e8aecd131d047378448ac8055fa29d974a9'
    20   # conf.gem :git => 'git@github.com:masuidrive/mrbgems-example.git', :branch => 'master', :options => '-v'
     19  # conf.gem :core => 'mruby-eval'
     20  # conf.gem :mgem => 'mruby-io'
     21  # conf.gem :github => 'iij/mruby-io'
     22  # conf.gem :git => 'git@github.com:iij/mruby-io.git', :branch => 'master', :options => '-v'
    2123
    2224  # include the default GEMs
     
    147149  conf.archiver.command = "arm-none-eabi-ar"
    148150
    149   conf.cc.flags << %w(-MD -MP -mlittle-endian -mcpu=cortex-a9 -mthumb -mthumb-interwork -marm -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard -mno-unaligned-access -fno-strict-aliasing)
     151  conf.cc.flags << %w(-MD -MP -mlittle-endian -mcpu=cortex-a9 -mthumb -mthumb-interwork -marm -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard -mno-unaligned-access -fno-strict-aliasing -nostdinc)
     152  conf.cc.include_paths  << "../musl-1.1.18/include"
     153
     154  conf.linker.flags << %w(-nostdlib)
     155  conf.linker.library_paths << "../musl-1.1.18/lib"
     156  conf.linker.libraries << %w(c gcc)
    150157
    151158  #configuration for low memory environment
     
    160167  conf.gem "#{root}/mrbgems/mruby-string-ext"
    161168  conf.gem '../mrbgems/mruby-onig-regexp'  do |g|
    162     g.cc.include_paths  << "../onigmo-5.15.0/src"
     169    g.cc.include_paths  << "../onigmo-6.1.3/src"
    163170  end
    164171  conf.gem "#{root}/../mrbgems/mruby-blockly"
     172  conf.gem "#{root}/../mrbgems/mruby-digest" do |g|
     173    g.cc.include_paths << "#{g.dir}/../../openssl-1.1.0e/include"
     174  end
     175  conf.gem "#{root}/../mrbgems/mruby-dir"
     176  conf.gem "#{root}/../mrbgems/mruby-env"
     177  conf.gem "#{root}/../mrbgems/mruby-errno"
     178  conf.gem "#{root}/../mrbgems/mruby-iijson"
    165179  conf.gem "#{root}/../mrbgems/mruby-io"
    166   conf.gem "#{root}/../mrbgems/mruby-dir" do |g|
    167     g.cc.defines = %w(__NEWLIB__=2)
    168     g.cc.include_paths << "#{g.dir}/../../musl-1.1.12/include"
    169   end
     180  conf.gem "#{root}/../mrbgems/mruby-ipaddr"
     181  conf.gem "#{root}/../mrbgems/mruby-mock"
    170182  conf.gem "#{root}/../mrbgems/mruby-pack"
    171   conf.gem "#{root}/../mrbgems/mruby-socket" do |g|
    172     g.cc.include_paths << "#{g.dir}/../../musl-1.1.12/include"
     183  conf.gem "#{root}/../mrbgems/mruby-require"
     184  conf.gem "#{root}/../mrbgems/mruby-socket"
     185  conf.gem "#{root}/../mrbgems/mruby-tls-openssl" do |g|
     186    g.cc.include_paths << "#{g.dir}/../../openssl-1.1.0e/include"
    173187  end
    174188  conf.gem "#{root}/../mrbgems/mruby-arduino" do |g|
    175     g.cc.include_paths << "#{g.dir}/../../asp3_dcre/mbed/api"
    176     g.cc.include_paths << "#{g.dir}/../../asp3_dcre/mbed/hal"
    177     g.cc.include_paths << "#{g.dir}/../../asp3_dcre/mbed/targets/cmsis"
    178     g.cc.include_paths << "#{g.dir}/../../asp3_dcre/mbed/targets/cmsis/TARGET_RENESAS/TARGET_RZ_A1H"
    179     g.cc.include_paths << "#{g.dir}/../../asp3_dcre/mbed/targets/cmsis/TARGET_RENESAS/TARGET_RZ_A1H/inc"
    180     g.cc.include_paths << "#{g.dir}/../../asp3_dcre/mbed/targets/cmsis/TARGET_RENESAS/TARGET_RZ_A1H/inc/iodefines"
    181     g.cc.include_paths << "#{g.dir}/../../asp3_dcre/mbed/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H"
    182     g.cc.include_paths << "#{g.dir}/../../asp3_dcre/mbed/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/TARGET_MBED_MBRZA1H"
    183     g.cc.include_paths << "#{g.dir}/../../sample/gr_peach"
    184189    g.cc.include_paths << "#{g.dir}/../../prototool/src"
     190    g.cc.include_paths << "#{g.dir}/../../mbed_api/src"
    185191  end
    186192  conf.gem "#{root}/../mrbgems/mruby-ecnl"
  • EcnlProtoTool/trunk/mruby-1.3.0/examples/mrbgems/ruby_extension_example/mrbgem.rake

    r321 r331  
    1212  # spec.linker.libraries << 'external_lib'
    1313
     14  spec.add_dependency('mruby-print', :core => 'mruby-print')
     15
    1416  # Default build files
    1517  # spec.rbfiles = Dir.glob("#{dir}/mrblib/*.rb")
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mrbconf.h

    r321 r331  
    88#define MRUBYCONF_H
    99
     10#include <limits.h>
     11#include <stdint.h>
     12
     13/* architecture selection: */
     14/* specify -DMRB_32BIT or -DMRB_64BIT to override */
     15#if !defined(MRB_32BIT) && !defined(MRB_64BIT)
     16#if UINT64_MAX == SIZE_MAX
     17#define MRB_64BIT
     18#else
     19#define MRB_32BIT
     20#endif
     21#endif
     22
     23#if defined(MRB_32BIT) && defined(MRB_64BIT)
     24#error Cannot build for 32 and 64 bit architecture at the same time
     25#endif
     26
    1027/* configuration options: */
    1128/* add -DMRB_USE_FLOAT to use float instead of double for floating point numbers */
    1229//#define MRB_USE_FLOAT
    13 #define MRB_USE_FLOAT
    1430
    1531/* add -DMRB_INT16 to use 16bit integer for mrb_int; conflict with MRB_INT64 */
     
    3349/* argv max size in mrb_funcall */
    3450//#define MRB_FUNCALL_ARGC_MAX 16
    35 #define MRB_FUNCALL_ARGC_MAX 8
    3651
    3752/* number of object per heap page */
    3853//#define MRB_HEAP_PAGE_SIZE 1024
    39 #define MRB_HEAP_PAGE_SIZE 64
    4054
    4155/* use segmented list for IV table */
    4256//#define MRB_USE_IV_SEGLIST
    43 #define MRB_USE_IV_SEGLIST
    4457
    4558/* initial size for IV khash; ignored when MRB_USE_IV_SEGLIST is set */
     
    5871/* default size of khash table bucket */
    5972//#define KHASH_DEFAULT_SIZE 32
    60 #define KHASH_DEFAULT_SIZE 8
    6173
    6274/* allocated memory address alignment */
     
    6577/* page size of memory pool */
    6678//#define POOL_PAGE_SIZE 16000
    67 #define POOL_PAGE_SIZE 4096
    6879
    6980/* initial minimum size for string buffer */
    7081//#define MRB_STR_BUF_MIN_SIZE 128
    71 #define MRB_STR_BUF_MIN_SIZE 20
    7282
    7383/* arena size */
     
    7686/* fixed size GC arena */
    7787//#define MRB_GC_FIXED_ARENA
    78 #define MRB_GC_FIXED_ARENA
    7988
    8089/* state atexit stack size */
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby.h

    r321 r331  
    22** mruby - An embeddable Ruby implementation
    33**
    4 ** Copyright (c) mruby developers 2010-2015
     4** Copyright (c) mruby developers 2010-2017
    55**
    66** Permission is hereby granted, free of charge, to any person obtaining
     
    2929#define MRUBY_H
    3030
     31#ifdef __cplusplus
     32#define __STDC_LIMIT_MACROS
     33#define __STDC_CONSTANT_MACROS
     34#define __STDC_FORMAT_MACROS
     35#endif
     36
    3137#include <stdint.h>
    3238#include <stddef.h>
    3339#include <limits.h>
    3440
     41#ifdef __cplusplus
     42#ifndef SIZE_MAX
     43#ifdef __SIZE_MAX__
     44#define SIZE_MAX __SIZE_MAX__
     45#else
     46#define SIZE_MAX std::numeric_limits<size_t>::max()
     47#endif
     48#endif
     49#endif
     50
     51#ifdef MRB_DEBUG
     52#include <assert.h>
     53#define mrb_assert(p) assert(p)
     54#define mrb_assert_int_fit(t1,n,t2,max) assert((n)>=0 && ((sizeof(n)<=sizeof(t2))||(n<=(t1)(max))))
     55#else
     56#define mrb_assert(p) ((void)0)
     57#define mrb_assert_int_fit(t1,n,t2,max) ((void)0)
     58#endif
     59
     60#if __STDC_VERSION__ >= 201112L
     61#define mrb_static_assert(exp, str) _Static_assert(exp, str)
     62#else
     63#define mrb_static_assert(exp, str) mrb_assert(exp)
     64#endif
     65
    3566#include "mrbconf.h"
     67
     68#ifdef MRB_USE_FLOAT
     69#define MRB_FLOAT_EPSILON FLT_EPSILON
     70#else
     71#define MRB_FLOAT_EPSILON DBL_EPSILON
     72#endif
     73
    3674#include "mruby/common.h"
    37 #include "mruby/value.h"
    38 #include "mruby/gc.h"
    39 #include "mruby/version.h"
     75#include <mruby/value.h>
     76#include <mruby/gc.h>
     77#include <mruby/version.h>
    4078
    4179/**
     
    76114  int nregs;
    77115  int ridx;
    78   int eidx;
     116  int epos;
    79117  struct REnv *env;
    80118  mrb_code *pc;                 /* return address */
     
    88126  MRB_FIBER_CREATED = 0,
    89127  MRB_FIBER_RUNNING,
    90   MRB_FIBER_RESUMING,
     128  MRB_FIBER_RESUMED,
    91129  MRB_FIBER_SUSPENDED,
    92130  MRB_FIBER_TRANSFERRED,
     
    106144  int rsize;
    107145  struct RProc **ensure;                  /* ensure handler stack */
    108   int esize;
     146  int esize, eidx;
    109147
    110148  enum mrb_fiber_state status;
     149  mrb_bool vmexec;
    111150  struct RFiber *fib;
    112151};
     
    116155typedef void (*mrb_atexit_func)(struct mrb_state*);
    117156
     157#define MRB_STATE_NO_REGEXP 1
     158#define MRB_STATE_REGEXP    2
     159
    118160typedef struct mrb_state {
    119161  struct mrb_jmpbuf *jmp;
    120162
     163  uint32_t flags;
    121164  mrb_allocf allocf;                      /* memory allocation function */
    122165  void *allocf_ud;                        /* auxiliary data of allocf */
     
    124167  struct mrb_context *c;
    125168  struct mrb_context *root_c;
     169  struct iv_tbl *globals;                 /* global variable table */
    126170
    127171  struct RObject *exc;                    /* exception */
    128   struct iv_tbl *globals;                 /* global variable table */
    129172
    130173  struct RObject *top_self;
     
    158201#endif
    159202
     203#ifdef MRB_BYTECODE_DECODE_OPTION
     204  mrb_code (*bytecode_decoder)(struct mrb_state* mrb, mrb_code code);
     205#endif
     206
    160207  struct RClass *eException_class;
    161208  struct RClass *eStandardError_class;
    162209  struct RObject *nomem_err;              /* pre-allocated NoMemoryError */
     210  struct RObject *stack_err;              /* pre-allocated SysStackError */
     211#ifdef MRB_GC_FIXED_ARENA
     212  struct RObject *arena_err;              /* pre-allocated arena overfow error */
     213#endif
    163214
    164215  void *ud; /* auxiliary data */
     
    182233 *      !!!c
    183234 *      void mrb_example_gem_init(mrb_state* mrb) {
    184  *              struct RClass *example_class;
    185  *              example_class = mrb_define_class(mrb, "Example_Class", mrb->object_class);
     235 *          struct RClass *example_class;
     236 *          example_class = mrb_define_class(mrb, "Example_Class", mrb->object_class);
    186237 *      }
    187238 *
    188239 *      void mrb_example_gem_final(mrb_state* mrb) {
    189  *              //free(TheAnimals);
     240 *          //free(TheAnimals);
    190241 *      }
    191242 *
     
    200251/**
    201252 * Defines a new module.
     253 *
    202254 * @param [mrb_state *] mrb_state* The current mruby state.
    203255 * @param [const char *] char* The name of the module.
     
    209261/**
    210262 * Include a module in another class or module.
    211  * Equivalent to: 
    212  *
    213  *   module B                                                                                                         
    214  *     include A                                                                                                     
    215  *   end 
     263 * Equivalent to:
     264 *
     265 *   module B
     266 *     include A
     267 *   end
    216268 * @param [mrb_state *] mrb_state* The current mruby state.
    217269 * @param [struct RClass *] RClass* A reference to module or a class.
     
    230282 * @param [struct RClass *] RClass* A reference to module or a class.
    231283 * @param [struct RClass *] RClass* A reference to the module to be prepended.
    232  */ 
     284 */
    233285MRB_API void mrb_prepend_module(mrb_state*, struct RClass*, struct RClass*);
    234286
     
    264316 *
    265317 * Example:
    266  *   # Ruby style
    267  *   class Foo
    268  *
    269  *     def Foo.bar
     318 *
     319 *     # Ruby style
     320 *     class Foo
     321 *       def Foo.bar
     322 *       end
    270323 *     end
    271  *
    272  *   end
    273  *   // C style
    274  *   mrb_value bar_method(mrb_state* mrb, mrb_value self){
    275  *
    276  *     return mrb_nil_value();
    277  *
    278  *   }
    279  *   void mrb_example_gem_init(mrb_state* mrb){
    280  *
    281  *     struct RClass *foo;
    282  *
    283  *     foo = mrb_define_class(mrb, "Foo", mrb->object_class);
    284  *
    285  *     mrb_define_class_method(mrb, foo, "bar", bar_method, MRB_ARGS_NONE());
    286  *
    287  *   }
    288  * @param [mrb_state *] mrb_state* The MRuby state reference.
     324 *     // C style
     325 *     mrb_value bar_method(mrb_state* mrb, mrb_value self){
     326 *       return mrb_nil_value();
     327 *     }
     328 *     void mrb_example_gem_init(mrb_state* mrb){
     329 *       struct RClass *foo;
     330 *       foo = mrb_define_class(mrb, "Foo", mrb->object_class);
     331 *       mrb_define_class_method(mrb, foo, "bar", bar_method, MRB_ARGS_NONE());
     332 *     }
     333 * @param [mrb_state *] mrb_state* The MRuby state reference.
    289334 * @param [struct RClass *] RClass* The class where the class method will be defined.
    290335 * @param [const char *] char* The name of the class method being defined.
     
    299344 *
    300345 * Example:
    301  *   # Ruby style
    302  *   module Foo
    303  *                                                                                                     
    304  *     def Foo.bar                                                                                                    *     end
    305  *
    306  *   end                                                                                                             
    307  *   // C style                                                                                                     
    308  *   mrb_value bar_method(mrb_state* mrb, mrb_value self){
    309  *                                                         
    310  *     return mrb_nil_value();                                                                                        *               
    311  *   }                                                                                                               
    312  *   void mrb_example_gem_init(mrb_state* mrb){
    313  *                                                                     
    314  *     struct RClass *foo;
    315  *                                                                                           
    316  *     foo = mrb_define_module(mrb, "Foo");
    317  *                                                       
    318  *     mrb_define_module_function(mrb, foo, "bar", bar_method, MRB_ARGS_NONE());
    319  *
    320  *   }   
     346 *
     347 *        # Ruby style
     348 *        module Foo
     349 *          def Foo.bar
     350 *          end
     351 *        end
     352 *        // C style
     353 *        mrb_value bar_method(mrb_state* mrb, mrb_value self){
     354 *          return mrb_nil_value();
     355 *        }
     356 *        void mrb_example_gem_init(mrb_state* mrb){
     357 *          struct RClass *foo;
     358 *          foo = mrb_define_module(mrb, "Foo");
     359 *          mrb_define_module_function(mrb, foo, "bar", bar_method, MRB_ARGS_NONE());
     360 *        }
    321361 *  @param [mrb_state *] mrb_state* The MRuby state reference.
    322362 *  @param [struct RClass *] RClass* The module where the module function will be defined.
    323363 *  @param [const char *] char* The name of the module function being defined.
    324  *  @param [mrb_func_t] mrb_func_t The function pointer to the module function definition. 
     364 *  @param [mrb_func_t] mrb_func_t The function pointer to the module function definition.
    325365 *  @param [mrb_aspec] mrb_aspec The method parameters declaration.
    326366 */
     
    331371 *
    332372 * Example:
    333  *    # Ruby style
    334  *
    335  *    class ExampleClass
    336  *   
    337  *    AGE = 22
    338  *
    339  *    end
    340  *
    341  *    // C style
    342  *    #include <stdio.h>
    343  *    #include <mruby.h>
    344  *
    345  *    void
    346  *    mrb_example_gem_init(mrb_state* mrb){
    347  *
    348  *      mrb_define_const(mrb, mrb->kernel_module, "AGE", mrb_fixnum_value(22));
    349  *
    350  *    }
    351  *
    352  *    mrb_value
    353  *    mrb_example_gem_final(mrb_state* mrb){
    354  *
    355  *    }
     373 *
     374 *          # Ruby style
     375 *          class ExampleClass
     376 *            AGE = 22
     377 *          end
     378 *          // C style
     379 *          #include <stdio.h>
     380 *          #include <mruby.h>
     381 *
     382 *          void
     383 *          mrb_example_gem_init(mrb_state* mrb){
     384 *            mrb_define_const(mrb, mrb->kernel_module, "AGE", mrb_fixnum_value(22));
     385 *          }
     386 *
     387 *          mrb_value
     388 *          mrb_example_gem_final(mrb_state* mrb){
     389 *          }
    356390 *  @param [mrb_state *] mrb_state* The MRuby state reference.
    357391 *  @param [struct RClass *] RClass* A class or module the constant is defined in.
     
    365399 *
    366400 * Example:
    367  *   # Ruby style
    368  *
    369  *   class ExampleClassA
    370  *
    371  *     def example_method
    372  *       "example"
     401 *
     402 *     # Ruby style
     403 *
     404 *     class ExampleClassA
     405 *       def example_method
     406 *         "example"
     407 *       end
    373408 *     end
    374  *
    375  *   end
    376  *
    377  *   ExampleClassA.new.example_method # => example
    378  *
    379  *   class ExampleClassB < ExampleClassA
    380  *
    381  *     undef_method :example_method
    382  *
    383  *   end
    384  *
    385  *   ExampleClassB.new.example_method # => undefined method 'example_method' for ExampleClassB (NoMethodError)
    386  *
    387  *   // C style
    388  *   #include <stdio.h>
    389  *   #include <mruby.h>
    390  * 
    391  *   mrb_value
    392  *   mrb_example_method(mrb_state *mrb){
    393  *
    394  *     return mrb_str_new_cstr(mrb, "example");
    395  *
    396  *   }
    397  *
    398  *   void
    399  *   mrb_example_gem_init(mrb_state* mrb){
    400  *     struct RClass *example_class_a;
    401  *     struct RClass *example_class_b;
    402  *     struct RClass *example_class_c;
    403  *
    404  *     example_class_a = mrb_define_class(mrb, "ExampleClassA", mrb->object_class);
    405  *
    406  *     mrb_define_method(mrb, example_class_a, "example_method", mrb_example_method, MRB_ARGS_NONE());
    407  *
    408  *     example_class_b = mrb_define_class(mrb, "ExampleClassB", example_class_a);
    409  *
    410  *     example_class_c = mrb_define_class(mrb, "ExampleClassC", example_class_b);
    411  *
    412  *     mrb_undef_method(mrb, example_class_c, "example_method");
    413  *
    414  *   }
    415  *
    416  *   mrb_example_gem_final(mrb_state* mrb){
    417  *
    418  *   }
    419  *
     409 *     ExampleClassA.new.example_method # => example
     410 *
     411 *     class ExampleClassB < ExampleClassA
     412 *       undef_method :example_method
     413 *     end
     414 *
     415 *     ExampleClassB.new.example_method # => undefined method 'example_method' for ExampleClassB (NoMethodError)
     416 *
     417 *     // C style
     418 *     #include <stdio.h>
     419 *     #include <mruby.h>
     420 *
     421 *     mrb_value
     422 *     mrb_example_method(mrb_state *mrb){
     423 *       return mrb_str_new_lit(mrb, "example");
     424 *     }
     425 *
     426 *     void
     427 *     mrb_example_gem_init(mrb_state* mrb){
     428 *       struct RClass *example_class_a;
     429 *       struct RClass *example_class_b;
     430 *       struct RClass *example_class_c;
     431 *
     432 *       example_class_a = mrb_define_class(mrb, "ExampleClassA", mrb->object_class);
     433 *       mrb_define_method(mrb, example_class_a, "example_method", mrb_example_method, MRB_ARGS_NONE());
     434 *       example_class_b = mrb_define_class(mrb, "ExampleClassB", example_class_a);
     435 *       example_class_c = mrb_define_class(mrb, "ExampleClassC", example_class_b);
     436 *       mrb_undef_method(mrb, example_class_c, "example_method");
     437 *     }
     438 *
     439 *     mrb_example_gem_final(mrb_state* mrb){
     440 *     }
    420441 * @param [mrb_state*] mrb_state* The mruby state reference.
    421442 * @param [struct RClass*] RClass* A class the method will be undefined from.
     
    426447/**
    427448 * Undefine a class method.
    428  *
    429449 * Example:
    430  *   # Ruby style
    431  *
    432  *   class ExampleClass
    433  *     def self.example_method
    434  *       "example"
    435  *     end
    436  *
    437  *   end
    438  *
    439  *   ExampleClass.example_method
    440  *   
    441  *   // C style
    442  *   #include <stdio.h>
    443  *   #include <mruby.h>
    444  *
    445  *   mrb_value
    446  *   mrb_example_method(mrb_state *mrb){
    447  *
    448  *     return mrb_str_new_cstr(mrb, "example");
    449  *     
    450  *   }
    451  *
    452  *   void
    453  *   mrb_example_gem_init(mrb_state* mrb){
    454  *
    455  *     struct RClass *example_class;
    456  *     
    457  *     example_class = mrb_define_class(mrb, "ExampleClass", mrb->object_class);
    458  *
    459  *     mrb_define_class_method(mrb, example_class, "example_method", mrb_example_method, MRB_ARGS_NONE());
    460  *
    461  *     mrb_undef_class_method(mrb, example_class, "example_method");
    462  *
    463  *   }
    464  *
    465  *   void
    466  *   mrb_example_gem_final(mrb_state* mrb){
    467  *
    468  *   }
     450 *
     451 *      # Ruby style
     452 *      class ExampleClass
     453 *        def self.example_method
     454 *          "example"
     455 *        end
     456 *      end
     457 *
     458 *     ExampleClass.example_method
     459 *
     460 *     // C style
     461 *     #include <stdio.h>
     462 *     #include <mruby.h>
     463 *
     464 *     mrb_value
     465 *     mrb_example_method(mrb_state *mrb){
     466 *       return mrb_str_new_lit(mrb, "example");
     467 *     }
     468 *
     469 *     void
     470 *     mrb_example_gem_init(mrb_state* mrb){
     471 *       struct RClass *example_class;
     472 *       example_class = mrb_define_class(mrb, "ExampleClass", mrb->object_class);
     473 *       mrb_define_class_method(mrb, example_class, "example_method", mrb_example_method, MRB_ARGS_NONE());
     474 *       mrb_undef_class_method(mrb, example_class, "example_method");
     475 *      }
     476 *
     477 *      void
     478 *      mrb_example_gem_final(mrb_state* mrb){
     479 *      }
    469480 * @param [mrb_state*] mrb_state* The mruby state reference.
    470481 * @param [RClass*] RClass* A class the class method will be undefined from.
     
    478489 * Example:
    479490 *
    480  *   # Ruby style
    481  *   class ExampleClass
    482  *   end
    483  *
    484  *   p ExampleClass # => #<ExampleClass:0x9958588>
    485  *   // C style
    486  *   #include <stdio.h>
    487  *   #include <mruby.h>
    488  *
    489  *   void
    490  *   mrb_example_gem_init(mrb_state* mrb) {
    491  *     struct RClass *example_class;
    492  *     mrb_value obj;
    493  *
    494  *     example_class = mrb_define_class(mrb, "ExampleClass", mrb->object_class); # => class ExampleClass; end
    495  *     obj = mrb_obj_new(mrb, example_class, 0, NULL); # => ExampleClass.new
    496  *     mrb_p(mrb, obj); // => Kernel#p
    497  *   } 
     491 *     # Ruby style
     492 *     class ExampleClass
     493 *     end
     494 *
     495 *     p ExampleClass # => #<ExampleClass:0x9958588>
     496 *     // C style
     497 *     #include <stdio.h>
     498 *     #include <mruby.h>
     499 *
     500 *     void
     501 *     mrb_example_gem_init(mrb_state* mrb) {
     502 *       struct RClass *example_class;
     503 *       mrb_value obj;
     504 *       example_class = mrb_define_class(mrb, "ExampleClass", mrb->object_class); # => class ExampleClass; end
     505 *       obj = mrb_obj_new(mrb, example_class, 0, NULL); # => ExampleClass.new
     506 *       mrb_p(mrb, obj); // => Kernel#p
     507 *      }
    498508 * @param [mrb_state*] mrb The current mruby state.
    499509 * @param [RClass*] c Reference to the class of the new object.
     
    517527 * Example:
    518528 *
    519  *   void
    520  *   mrb_example_gem_init(mrb_state* mrb) {
    521  *      struct RClass *example_class;
    522  *      mrb_value obj;
    523  *
    524  *      example_class = mrb_class_new(mrb, mrb->object_class);
    525  *      obj = mrb_obj_new(mrb, example_class, 0, NULL); // => #<#<Class:0x9a945b8>:0x9a94588>
    526  *      mrb_p(mrb, obj); // => Kernel#p
    527  *   }
     529 *      void
     530 *      mrb_example_gem_init(mrb_state* mrb) {
     531 *        struct RClass *example_class;
     532 *
     533 *        mrb_value obj;
     534 *        example_class = mrb_class_new(mrb, mrb->object_class);
     535 *        obj = mrb_obj_new(mrb, example_class, 0, NULL); // => #<#<Class:0x9a945b8>:0x9a94588>
     536 *        mrb_p(mrb, obj); // => Kernel#p
     537 *       }
    528538 *
    529539 * @param [mrb_state*] mrb The current mruby state.
     
    537547 *
    538548 * Example:
    539  *   void
    540  *   mrb_example_gem_init(mrb_state* mrb) {
    541  *      struct RClass *example_module;
    542  *
    543  *      example_module = mrb_module_new(mrb);
    544  *   }
     549 *      void
     550 *      mrb_example_gem_init(mrb_state* mrb) {
     551 *        struct RClass *example_module;
     552 *
     553 *        example_module = mrb_module_new(mrb);
     554 *      }
    545555 *
    546556 * @param [mrb_state*] mrb The current mruby state.
     
    553563 *
    554564 * Example:
    555  *   void
    556  *   mrb_example_gem_init(mrb_state* mrb) {
    557  *      struct RClass *example_class;
    558  *      mrb_bool cd;
    559  *
    560  *      example_class = mrb_define_class(mrb, "ExampleClass", mrb->object_class);
    561  *      cd = mrb_class_defined(mrb, "ExampleClass");
    562  *     
    563  *      // If mrb_class_defined returns 1 then puts "True"
    564  *      // If mrb_class_defined returns 0 then puts "False"
    565  *      if (cd == 1){
    566  *        puts("True");
     565 *     void
     566 *     mrb_example_gem_init(mrb_state* mrb) {
     567 *       struct RClass *example_class;
     568 *       mrb_bool cd;
     569 *
     570 *       example_class = mrb_define_class(mrb, "ExampleClass", mrb->object_class);
     571 *       cd = mrb_class_defined(mrb, "ExampleClass");
     572 *
     573 *       // If mrb_class_defined returns 1 then puts "True"
     574 *       // If mrb_class_defined returns 0 then puts "False"
     575 *       if (cd == 1){
     576 *         puts("True");
     577 *       }
     578 *       else {
     579 *         puts("False");
     580 *       }
    567581 *      }
    568  *      else {
    569  *        puts("False");
    570  *      }
    571  *   }
    572582 *
    573583 * @param [mrb_state*] mrb The current mruby state.
     
    584594*/
    585595MRB_API struct RClass * mrb_class_get(mrb_state *mrb, const char *name);
     596
     597/**
     598 * Gets a exception class.
     599 * @param [mrb_state*] mrb The current mruby state.
     600 * @param [const char *] name The name of the class.
     601 * @return [struct RClass *] A reference to the class.
     602*/
     603MRB_API struct RClass * mrb_exc_get(mrb_state *mrb, const char *name);
     604
     605/**
     606 * Returns an mrb_bool. True if inner class was defined, and false if the inner class was not defined.
     607 *
     608 * Example:
     609 *     void
     610 *     mrb_example_gem_init(mrb_state* mrb) {
     611 *       struct RClass *example_outer, *example_inner;
     612 *       mrb_bool cd;
     613 *
     614 *       example_outer = mrb_define_module(mrb, "ExampleOuter");
     615 *
     616 *       example_inner = mrb_define_class_under(mrb, example_outer, "ExampleInner", mrb->object_class);
     617 *       cd = mrb_class_defined_under(mrb, example_outer, "ExampleInner");
     618 *
     619 *       // If mrb_class_defined_under returns 1 then puts "True"
     620 *       // If mrb_class_defined_under returns 0 then puts "False"
     621 *       if (cd == 1){
     622 *         puts("True");
     623 *       }
     624 *       else {
     625 *         puts("False");
     626 *       }
     627 *      }
     628 *
     629 * @param [mrb_state*] mrb The current mruby state.
     630 * @param [struct RClass *] outer The name of the outer class.
     631 * @param [const char *] name A string representing the name of the inner class.
     632 * @return [mrb_bool] A boolean value.
     633 */
     634MRB_API mrb_bool mrb_class_defined_under(mrb_state *mrb, struct RClass *outer, const char *name);
    586635
    587636/**
     
    616665 *
    617666 * Equivalent to:
    618  *   Object#dup   
     667 *   Object#dup
    619668 * @param [mrb_state*] mrb The current mruby state.
    620669 * @param [mrb_value] obj Object to be duplicate.
     
    628677 * class it returns true, it returns false otherwise.
    629678 *
    630  * Example:
    631  *   # Ruby style
    632  *   class ExampleClass
    633  *      def example_method
     679 *      Example:
     680 *      # Ruby style
     681 *      class ExampleClass
     682 *        def example_method
     683 *        end
    634684 *      end
    635  *   end
    636  *
    637  *   ExampleClass.new.respond_to?(:example_method) # => true
    638  *
    639  *   // C style
    640  *   void
    641  *   mrb_example_gem_init(mrb_state* mrb) {
    642  *      struct RClass *example_class;
    643  *      mrb_sym mid;
    644  *      mrb_bool obj_resp;
    645  *
    646  *      example_class = mrb_define_class(mrb, "ExampleClass", mrb->object_class);
    647  *      mrb_define_method(mrb, example_class, "example_method", exampleMethod, MRB_ARGS_NONE());
    648  *      mid = mrb_intern_str(mrb, mrb_str_new_cstr(mrb, "example_method" ));
    649  *      obj_resp = mrb_obj_respond_to(mrb, example_class, mid); // => 1(true in Ruby world)
    650  *     
    651  *      // If mrb_obj_respond_to returns 1 then puts "True"
    652  *      // If mrb_obj_respond_to returns 0 then puts "False"
    653  *      if (obj_resp == 1) {
    654  *        puts("True");
     685 *
     686 *      ExampleClass.new.respond_to?(:example_method) # => true
     687 *
     688 *      // C style
     689 *      void
     690 *      mrb_example_gem_init(mrb_state* mrb) {
     691 *        struct RClass *example_class;
     692 *        mrb_sym mid;
     693 *        mrb_bool obj_resp;
     694 *
     695 *        example_class = mrb_define_class(mrb, "ExampleClass", mrb->object_class);
     696 *        mrb_define_method(mrb, example_class, "example_method", exampleMethod, MRB_ARGS_NONE());
     697 *        mid = mrb_intern_str(mrb, mrb_str_new_lit(mrb, "example_method" ));
     698 *        obj_resp = mrb_obj_respond_to(mrb, example_class, mid); // => 1(true in Ruby world)
     699 *
     700 *        // If mrb_obj_respond_to returns 1 then puts "True"
     701 *        // If mrb_obj_respond_to returns 0 then puts "False"
     702 *        if (obj_resp == 1) {
     703 *          puts("True");
     704 *        }
     705 *        else if (obj_resp == 0) {
     706 *          puts("False");
     707 *        }
    655708 *      }
    656  *      else if (obj_resp == 0) {
    657  *        puts("False");
    658  *      }
    659  *   }
    660709 *
    661710 * @param [mrb_state*] mrb The current mruby state.
     
    795844/**
    796845 * Call existing ruby functions.
     846 *
     847 *      #include <stdio.h>
     848 *      #include <mruby.h>
     849 *      #include "mruby/compile.h"
     850 *
     851 *      int
     852 *      main()
     853 *      {
     854 *        mrb_int i = 99;
     855 *        mrb_state *mrb = mrb_open();
     856 *
     857 *        if (!mrb) { }
     858 *        FILE *fp = fopen("test.rb","r");
     859 *        mrb_value obj = mrb_load_file(mrb,fp);
     860 *        mrb_funcall(mrb, obj, "method_name", 1, mrb_fixnum_value(i));
     861 *        fclose(fp);
     862 *        mrb_close(mrb);
     863 *       }
     864 * @param [mrb_state*] mrb_state* The current mruby state.
     865 * @param [mrb_value] mrb_value A reference to an mruby value.
     866 * @param [const char*] const char* The name of the method.
     867 * @param [mrb_int] mrb_int The number of arguments the method has.
     868 * @param [...] ... Variadic values(not type safe!).
     869 * @return [mrb_value] mrb_value mruby function value.
    797870 */
    798871MRB_API mrb_value mrb_funcall(mrb_state*, mrb_value, const char*, mrb_int,...);
     872/**
     873 * Call existing ruby functions. This is basically the type safe version of mrb_funcall.
     874 *
     875 *      #include <stdio.h>
     876 *      #include <mruby.h>
     877 *      #include "mruby/compile.h"
     878 *      int
     879 *      main()
     880 *      {
     881 *        mrb_int i = 99;
     882 *        mrb_state *mrb = mrb_open();
     883 *
     884 *        if (!mrb) { }
     885 *        mrb_sym m_sym = mrb_intern_lit(mrb, "method_name"); // Symbol for method.
     886 *
     887 *        FILE *fp = fopen("test.rb","r");
     888 *        mrb_value obj = mrb_load_file(mrb,fp);
     889 *        mrb_funcall_argv(mrb, obj, m_sym, 1, &obj); // Calling ruby function from test.rb.
     890 *        fclose(fp);
     891 *        mrb_close(mrb);
     892 *       }
     893 * @param [mrb_state*] mrb_state* The current mruby state.
     894 * @param [mrb_value] mrb_value A reference to an mruby value.
     895 * @param [mrb_sym] mrb_sym The symbol representing the method.
     896 * @param [mrb_int] mrb_int The number of arguments the method has.
     897 * @param [const mrb_value*] mrb_value* Pointer to the object.
     898 * @return [mrb_value] mrb_value mruby function value.
     899 * @see mrb_funcall
     900 */
    799901MRB_API mrb_value mrb_funcall_argv(mrb_state*, mrb_value, mrb_sym, mrb_int, const mrb_value*);
     902/**
     903 * Call existing ruby functions with a block.
     904 */
    800905MRB_API mrb_value mrb_funcall_with_block(mrb_state*, mrb_value, mrb_sym, mrb_int, const mrb_value*, mrb_value);
     906/**
     907 * Create a symbol
     908 *
     909 *     # Ruby style:
     910 *     :pizza # => :pizza
     911 *
     912 *     // C style:
     913 *     mrb_sym m_sym = mrb_intern_lit(mrb, "pizza"); //  => :pizza
     914 * @param [mrb_state*] mrb_state* The current mruby state.
     915 * @param [const char*] const char* The name of the method.
     916 * @return [mrb_sym] mrb_sym A symbol.
     917 */
    801918MRB_API mrb_sym mrb_intern_cstr(mrb_state*,const char*);
    802919MRB_API mrb_sym mrb_intern(mrb_state*,const char*,size_t);
     
    8921009MRB_API mrb_value mrb_top_self(mrb_state *);
    8931010MRB_API mrb_value mrb_run(mrb_state*, struct RProc*, mrb_value);
    894 MRB_API mrb_value mrb_toplevel_run(mrb_state*, struct RProc*);
    895 MRB_API mrb_value mrb_context_run(mrb_state*, struct RProc*, mrb_value, unsigned int);
     1011MRB_API mrb_value mrb_top_run(mrb_state*, struct RProc*, mrb_value, unsigned int);
     1012MRB_API mrb_value mrb_vm_run(mrb_state*, struct RProc*, mrb_value, unsigned int);
     1013MRB_API mrb_value mrb_vm_exec(mrb_state*, struct RProc*, mrb_code*);
     1014/* compatibility macros */
     1015#define mrb_toplevel_run_keep(m,p,k) mrb_top_run((m),(p),mrb_top_self(m),(k))
     1016#define mrb_toplevel_run(m,p) mrb_toplevel_run_keep((m),(p),0)
     1017#define mrb_context_run(m,p,s,k) mrb_vm_run((m),(p),(s),(k))
    8961018
    8971019MRB_API void mrb_p(mrb_state*, mrb_value);
     
    9651087   + exception objects obtained from those macros are local to mrb
    9661088*/
    967 #define E_RUNTIME_ERROR             (mrb_class_get(mrb, "RuntimeError"))
    968 #define E_TYPE_ERROR                (mrb_class_get(mrb, "TypeError"))
    969 #define E_ARGUMENT_ERROR            (mrb_class_get(mrb, "ArgumentError"))
    970 #define E_INDEX_ERROR               (mrb_class_get(mrb, "IndexError"))
    971 #define E_RANGE_ERROR               (mrb_class_get(mrb, "RangeError"))
    972 #define E_NAME_ERROR                (mrb_class_get(mrb, "NameError"))
    973 #define E_NOMETHOD_ERROR            (mrb_class_get(mrb, "NoMethodError"))
    974 #define E_SCRIPT_ERROR              (mrb_class_get(mrb, "ScriptError"))
    975 #define E_SYNTAX_ERROR              (mrb_class_get(mrb, "SyntaxError"))
    976 #define E_LOCALJUMP_ERROR           (mrb_class_get(mrb, "LocalJumpError"))
    977 #define E_REGEXP_ERROR              (mrb_class_get(mrb, "RegexpError"))
    978 #define E_SYSSTACK_ERROR            (mrb_class_get(mrb, "SystemStackError"))
    979 
    980 #define E_NOTIMP_ERROR              (mrb_class_get(mrb, "NotImplementedError"))
    981 #define E_FLOATDOMAIN_ERROR         (mrb_class_get(mrb, "FloatDomainError"))
    982 
    983 #define E_KEY_ERROR                 (mrb_class_get(mrb, "KeyError"))
     1089#define E_RUNTIME_ERROR             (mrb_exc_get(mrb, "RuntimeError"))
     1090#define E_TYPE_ERROR                (mrb_exc_get(mrb, "TypeError"))
     1091#define E_ARGUMENT_ERROR            (mrb_exc_get(mrb, "ArgumentError"))
     1092#define E_INDEX_ERROR               (mrb_exc_get(mrb, "IndexError"))
     1093#define E_RANGE_ERROR               (mrb_exc_get(mrb, "RangeError"))
     1094#define E_NAME_ERROR                (mrb_exc_get(mrb, "NameError"))
     1095#define E_NOMETHOD_ERROR            (mrb_exc_get(mrb, "NoMethodError"))
     1096#define E_SCRIPT_ERROR              (mrb_exc_get(mrb, "ScriptError"))
     1097#define E_SYNTAX_ERROR              (mrb_exc_get(mrb, "SyntaxError"))
     1098#define E_LOCALJUMP_ERROR           (mrb_exc_get(mrb, "LocalJumpError"))
     1099#define E_REGEXP_ERROR              (mrb_exc_get(mrb, "RegexpError"))
     1100
     1101#define E_NOTIMP_ERROR              (mrb_exc_get(mrb, "NotImplementedError"))
     1102#define E_FLOATDOMAIN_ERROR         (mrb_exc_get(mrb, "FloatDomainError"))
     1103
     1104#define E_KEY_ERROR                 (mrb_exc_get(mrb, "KeyError"))
    9841105
    9851106MRB_API mrb_value mrb_yield(mrb_state *mrb, mrb_value b, mrb_value arg);
    9861107MRB_API mrb_value mrb_yield_argv(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value *argv);
    9871108MRB_API mrb_value mrb_yield_with_class(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value *argv, mrb_value self, struct RClass *c);
     1109
     1110/* continue execution to the proc */
     1111/* this function should always be called as the last function of a method */
     1112/* e.g. return mrb_yield_cont(mrb, proc, self, argc, argv); */
     1113mrb_value mrb_yield_cont(mrb_state *mrb, mrb_value b, mrb_value self, mrb_int argc, const mrb_value *argv);
    9881114
    9891115/* mrb_gc_protect() leaves the object in the arena */
     
    10131139MRB_API mrb_bool mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid);
    10141140MRB_API mrb_bool mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c);
     1141MRB_API mrb_bool mrb_func_basic_p(mrb_state *mrb, mrb_value obj, mrb_sym mid, mrb_func_t func);
    10151142
    10161143
     
    10341161 * @mrbgem mruby-fiber
    10351162 */
    1036 #define E_FIBER_ERROR (mrb_class_get(mrb, "FiberError"))
     1163#define E_FIBER_ERROR (mrb_exc_get(mrb, "FiberError"))
    10371164
    10381165/* memory pool implementation */
     
    10501177MRB_API void mrb_show_copyright(mrb_state *mrb);
    10511178
    1052 #ifdef MRB_DEBUG
    1053 #include <assert.h>
    1054 #define mrb_assert(p) assert(p)
    1055 #define mrb_assert_int_fit(t1,n,t2,max) assert((n)>=0 && ((sizeof(n)<=sizeof(t2))||(n<=(t1)(max))))
    1056 #else
    1057 #define mrb_assert(p) ((void)0)
    1058 #define mrb_assert_int_fit(t1,n,t2,max) ((void)0)
    1059 #endif
    1060 
    1061 #if __STDC_VERSION__ >= 201112L
    1062 #define mrb_static_assert(exp, str) _Static_assert(exp, str)
    1063 #else
    1064 #define mrb_static_assert(exp, str) mrb_assert(exp)
    1065 #endif
    1066 
    10671179MRB_API mrb_value mrb_format(mrb_state *mrb, const char *format, ...);
    10681180
     1181#if 0
     1182/* memcpy and memset does not work with gdb reverse-next on my box */
     1183/* use naive memcpy and memset instead */
     1184#undef memcpy
     1185#undef memset
     1186static inline void*
     1187mrbmemcpy(void *dst, const void *src, size_t n)
     1188{
     1189  char *d = dst;
     1190  const char *s = src;
     1191  while (n--)
     1192    *d++ = *s++;
     1193  return d;
     1194}
     1195#define memcpy(a,b,c) mrbmemcpy(a,b,c)
     1196
     1197static inline void*
     1198mrbmemset(void *s, int c, size_t n)
     1199{
     1200  char *t = s;
     1201  while (n--)
     1202    *t++ = c;
     1203  return s;
     1204}
     1205#define memset(a,b,c) mrbmemset(a,b,c)
     1206#endif
     1207
    10691208MRB_END_DECL
    10701209
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/array.h

    r321 r331  
    88#define MRUBY_ARRAY_H
    99
    10 #include "mruby/common.h"
     10#include "common.h"
    1111
    1212/*
     
    5555 *
    5656 * @param mrb The mruby state reference.
    57  * @return The initialized array
     57 * @return The initialized array.
    5858 */
    5959MRB_API mrb_value mrb_ary_new(mrb_state *mrb);
    6060
     61/*
     62 * Initializes a new array with initial values
     63 *
     64 * Equivalent to:
     65 *
     66 *      Array[value1, value2, ...]
     67 *
     68 * @param mrb The mruby state reference.
     69 * @param size The numer of values.
     70 * @param vals The actual values.
     71 * @return The initialized array.
     72 */
    6173MRB_API mrb_value mrb_ary_new_from_values(mrb_state *mrb, mrb_int size, const mrb_value *vals);
     74
     75/*
     76 * Initializes a new array with two initial values
     77 *
     78 * Equivalent to:
     79 *
     80 *      Array[car, cdr]
     81 *
     82 * @param mrb The mruby state reference.
     83 * @param car The first value.
     84 * @param cdr The second value.
     85 * @return The initialized array.
     86 */
    6287MRB_API mrb_value mrb_assoc_new(mrb_state *mrb, mrb_value car, mrb_value cdr);
    63 MRB_API void mrb_ary_concat(mrb_state*, mrb_value, mrb_value);
    64 MRB_API mrb_value mrb_ary_splat(mrb_state*, mrb_value);
     88
     89/*
     90 * Concatenate two arrays. The target array will be modified
     91 *
     92 * Equivalent to:
     93 *      ary.concat(other)
     94 *
     95 * @param mrb The mruby state reference.
     96 * @param self The target array.
     97 * @param other The array that will be concatenated to self.
     98 */
     99MRB_API void mrb_ary_concat(mrb_state *mrb, mrb_value self, mrb_value other);
     100
     101/*
     102 * Create an array from the input. It tries calling to_a on the
     103 * value. If value does not respond to that, it creates a new
     104 * array with just this value.
     105 *
     106 * @param mrb The mruby state reference.
     107 * @param value The value to change into an array.
     108 * @return An array representation of value.
     109 */
     110MRB_API mrb_value mrb_ary_splat(mrb_state *mrb, mrb_value value);
    65111
    66112/*
     
    85131 *
    86132 * @param mrb The mruby state reference.
    87  * @param ary The array from which the value will be poped.
    88  * @return The poped value.
     133 * @param ary The array from which the value will be popped.
     134 * @return The popped value.
    89135 */
    90136MRB_API mrb_value mrb_ary_pop(mrb_state *mrb, mrb_value ary);
     
    118164MRB_API void mrb_ary_set(mrb_state *mrb, mrb_value ary, mrb_int n, mrb_value val);
    119165
    120 MRB_API void mrb_ary_replace(mrb_state *mrb, mrb_value a, mrb_value b);
     166/*
     167 * Replace the array with another array
     168 *
     169 * Equivalent to:
     170 *
     171 *      ary.replace(other)
     172 *
     173 * @param mrb The mruby state reference
     174 * @param self The target array.
     175 * @param other The array to replace it with.
     176 */
     177MRB_API void mrb_ary_replace(mrb_state *mrb, mrb_value self, mrb_value other);
    121178MRB_API mrb_value mrb_check_array_type(mrb_state *mrb, mrb_value self);
     179
     180/*
     181 * Unshift an element into an array
     182 *
     183 * Equivalent to:
     184 *
     185 *     ary.unshift(item)
     186 *
     187 * @param mrb The mruby state reference.
     188 * @param self The target array.
     189 * @param item The item to unshift.
     190 */
    122191MRB_API mrb_value mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item);
    123192MRB_API mrb_value mrb_ary_entry(mrb_value ary, mrb_int offset);
     193
     194/*
     195 * Shifts the first element from the array.
     196 *
     197 * Equivalent to:
     198 *
     199 *      ary.shift
     200 *
     201 * @param mrb The mruby state reference.
     202 * @param self The array from which the value will be shifted.
     203 * @return The shifted value.
     204 */
    124205MRB_API mrb_value mrb_ary_shift(mrb_state *mrb, mrb_value self);
     206
     207/*
     208 * Removes all elements from this array
     209 *
     210 * Equivalent to:
     211 *
     212 *      ary.clear
     213 *
     214 * @param mrb The mruby state reference.
     215 * @param self The target array.
     216 * @return self
     217 */
    125218MRB_API mrb_value mrb_ary_clear(mrb_state *mrb, mrb_value self);
     219
     220/*
     221 * Join the array elements together in a string
     222 *
     223 * Equivalent to:
     224 *
     225 *      ary.join(sep="")
     226 *
     227 * @param mrb The mruby state reference.
     228 * @param ary The target array
     229 * @param sep The separater, can be NULL
     230 */
    126231MRB_API mrb_value mrb_ary_join(mrb_state *mrb, mrb_value ary, mrb_value sep);
    127 MRB_API mrb_value mrb_ary_resize(mrb_state *mrb, mrb_value ary, mrb_int len);
     232
     233/*
     234 * Update the capacity of the array
     235 *
     236 * @param mrb The mruby state reference.
     237 * @param ary The target array.
     238 * @param new_len The new capacity of the array
     239 */
     240MRB_API mrb_value mrb_ary_resize(mrb_state *mrb, mrb_value ary, mrb_int new_len);
    128241
    129242static inline mrb_int
     
    135248}
    136249
     250static inline mrb_value
     251ary_elt(mrb_value ary, mrb_int offset)
     252{
     253  if (offset < 0 || RARRAY_LEN(ary) <= offset) {
     254    return mrb_nil_value();
     255  }
     256  return RARRAY_PTR(ary)[offset];
     257}
     258
    137259MRB_END_DECL
    138260
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/boxing_nan.h

    r321 r331  
    5454
    5555#define mrb_tt(o)       ((enum mrb_vtype)(((o).value.ttt & 0xfc000)>>14)-1)
    56 #define mrb_type(o)     ((uint32_t)0xfff00000 < (o).value.ttt ? mrb_tt(o) : MRB_TT_FLOAT)
     56#define mrb_type(o)     (enum mrb_vtype)((uint32_t)0xfff00000 < (o).value.ttt ? mrb_tt(o) : MRB_TT_FLOAT)
    5757#define mrb_ptr(o)      ((void*)((((uintptr_t)0x3fffffffffff)&((uintptr_t)((o).value.p)))<<2))
    5858#define mrb_float(o)    (o).f
     
    6161#define mrb_symbol(o)   (o).value.sym
    6262
     63#ifdef MRB_64BIT
     64#define BOXNAN_SHIFT_LONG_POINTER(v) (((uintptr_t)(v)>>34)&0x3fff)
     65#else
     66#define BOXNAN_SHIFT_LONG_POINTER(v) 0
     67#endif
     68
    6369#define BOXNAN_SET_VALUE(o, tt, attr, v) do {\
    64   switch (tt) {\
    65   case MRB_TT_FALSE:\
    66   case MRB_TT_TRUE:\
    67   case MRB_TT_UNDEF:\
    68   case MRB_TT_FIXNUM:\
    69   case MRB_TT_SYMBOL: (o).attr = (v); break;\
    70   default: (o).value.i = 0; (o).value.p = (void*)((uintptr_t)(o).value.p | (((uintptr_t)(v))>>2)); break;\
    71   }\
    72   (o).value.ttt = (0xfff00000|(((tt)+1)<<14));\
     70  (o).attr = (v);\
     71  (o).value.ttt = 0xfff00000 | (((tt)+1)<<14);\
     72} while (0)
     73
     74#define BOXNAN_SET_OBJ_VALUE(o, tt, v) do {\
     75  (o).value.p = (void*)((uintptr_t)(v)>>2);\
     76  (o).value.ttt = (0xfff00000|(((tt)+1)<<14)|BOXNAN_SHIFT_LONG_POINTER(v));\
    7377} while (0)
    7478
     
    7781    (r).value.ttt = 0x7ff80000; \
    7882    (r).value.i = 0; \
    79   } else { \
     83  } \
     84  else { \
    8085    (r).f = v; \
    8186  }} while(0)
     
    8792#define SET_INT_VALUE(r,n) BOXNAN_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n))
    8893#define SET_SYM_VALUE(r,v) BOXNAN_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v))
    89 #define SET_OBJ_VALUE(r,v) BOXNAN_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v))
    90 #define SET_CPTR_VALUE(mrb,r,v) BOXNAN_SET_VALUE(r, MRB_TT_CPTR, value.p, v)
     94#define SET_OBJ_VALUE(r,v) BOXNAN_SET_OBJ_VALUE(r, (((struct RObject*)(v))->tt), (v))
     95#define SET_CPTR_VALUE(mrb,r,v) BOXNAN_SET_OBJ_VALUE(r, MRB_TT_CPTR, v)
    9196#define SET_UNDEF_VALUE(r) BOXNAN_SET_VALUE(r, MRB_TT_UNDEF, value.i, 0)
    9297
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/boxing_word.h

    r321 r331  
    1010#if defined(MRB_INT16)
    1111# error MRB_INT16 is too small for MRB_WORD_BOXING.
     12#endif
     13
     14#if defined(MRB_INT64) && !defined(MRB_64BIT)
     15#error MRB_INT64 cannot be used with MRB_WORD_BOXING in 32-bit mode.
    1216#endif
    1317
     
    6367#define mrb_cptr(o)    (o).value.vp->p
    6468#define mrb_float(o)   (o).value.fp->f
    65 #define mrb_fixnum(o)  (o).value.i
     69#define mrb_fixnum(o)  ((mrb_int)(o).value.i)
    6670#define mrb_symbol(o)  (o).value.sym
    6771
     
    9296#define mrb_nil_p(o)  ((o).w == MRB_Qnil)
    9397
    94 #define BOXWORD_SET_VALUE(o, ttt, attr, v) do {\
     98#define BOXWORD_SET_VALUE(o, ttt, attr, v) do { \
    9599  switch (ttt) {\
    96100  case MRB_TT_FALSE:  (o).w = (v) ? MRB_Qfalse : MRB_Qnil; break;\
    97101  case MRB_TT_TRUE:   (o).w = MRB_Qtrue; break;\
    98102  case MRB_TT_UNDEF:  (o).w = MRB_Qundef; break;\
    99   case MRB_TT_FIXNUM: (o).value.i_flag = MRB_FIXNUM_FLAG; (o).attr = (v); break;\
    100   case MRB_TT_SYMBOL: (o).value.sym_flag = MRB_SYMBOL_FLAG; (o).attr = (v); break;\
     103  case MRB_TT_FIXNUM: (o).w = 0;(o).value.i_flag = MRB_FIXNUM_FLAG; (o).attr = (v); break;\
     104  case MRB_TT_SYMBOL: (o).w = 0;(o).value.sym_flag = MRB_SYMBOL_FLAG; (o).attr = (v); break;\
    101105  default:            (o).w = 0; (o).attr = (v); if ((o).value.bp) (o).value.bp->tt = ttt; break;\
    102106  }\
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/class.h

    r321 r331  
    88#define MRUBY_CLASS_H
    99
    10 #include "mruby/common.h"
     10#include "common.h"
    1111
    1212/**
     
    5252}
    5353
    54 // TODO: figure out where to put user flags
     54/* TODO: figure out where to put user flags */
     55#define MRB_FLAG_IS_FROZEN (1 << 18)
    5556#define MRB_FLAG_IS_PREPENDED (1 << 19)
    5657#define MRB_FLAG_IS_ORIGIN (1 << 20)
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/common.h

    r321 r331  
    11/*
    2 ** mruby/common.h - mruby common platform definitions
     2**"common.h - mruby common platform definition"
    33**
    44** See Copyright Notice in mruby.h
     
    1010
    1111#ifdef __cplusplus
     12#ifdef MRB_ENABLE_CXX_ABI
     13#define MRB_BEGIN_DECL
     14#define MRB_END_DECL
     15#else
    1216# define MRB_BEGIN_DECL extern "C" {
    1317# define MRB_END_DECL   }
     18#endif
    1419#else
    1520/** Start declarations in C mode */
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/compile.h

    r321 r331  
    88#define MRUBY_COMPILE_H
    99
    10 #include "mruby/common.h"
     10#include "common.h"
    1111
    1212/**
     
    1515MRB_BEGIN_DECL
    1616
    17 #include "mruby.h"
     17#include <mruby.h>
    1818
    1919struct mrb_jmpbuf;
     
    4040MRB_API const char *mrbc_filename(mrb_state *mrb, mrbc_context *c, const char *s);
    4141MRB_API void mrbc_partial_hook(mrb_state *mrb, mrbc_context *c, int (*partial_hook)(struct mrb_parser_state*), void*data);
    42 
    43 MRB_API mrb_value mrb_toplevel_run_keep(mrb_state*, struct RProc*, unsigned int);
    4442
    4543/* AST node structure */
     
    105103};
    106104
    107 #define MRB_PARSER_BUF_SIZE 1024
     105#define MRB_PARSER_TOKBUF_MAX 65536
     106#define MRB_PARSER_TOKBUF_SIZE 256
    108107
    109108/* parser structure */
     
    133132
    134133  mrb_ast_node *pb;
    135   char buf[MRB_PARSER_BUF_SIZE];
    136   int bidx;
     134  char *tokbuf;
     135  char buf[MRB_PARSER_TOKBUF_SIZE];
     136  int tidx;
     137  int tsiz;
    137138
    138139  mrb_ast_node *all_heredocs;   /* list of mrb_parser_heredoc_info* */
     
    163164MRB_API void mrb_parser_free(struct mrb_parser_state*);
    164165MRB_API void mrb_parser_parse(struct mrb_parser_state*,mrbc_context*);
     166MRB_API double mrb_float_read(const char*, char**);
    165167
    166168MRB_API void mrb_parser_set_filename(struct mrb_parser_state*, char const*);
     
    174176MRB_API struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,int,mrbc_context*);
    175177MRB_API struct RProc* mrb_generate_code(mrb_state*, struct mrb_parser_state*);
     178MRB_API mrb_value mrb_load_exec(mrb_state *mrb, struct mrb_parser_state *p, mrbc_context *c);
    176179
    177180/* program load functions */
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/data.h

    r321 r331  
    88#define MRUBY_DATA_H
    99
    10 #include "mruby/common.h"
     10#include "common.h"
    1111
    1212/**
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/debug.h

    r321 r331  
    88#define MRUBY_DEBUG_H
    99
    10 #include "mruby/common.h"
     10#include "common.h"
    1111
    1212/**
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/dump.h

    r321 r331  
    88#define MRUBY_DUMP_H
    99
    10 #include "mruby.h"
    11 #include "mruby/irep.h"
    12 #include "mruby/common.h"
     10#include <mruby.h>
     11#include <mruby/irep.h>
     12#include "common.h"
    1313
    1414/**
     
    5353#define RITE_BINARY_IDENT              "RITE"
    5454#define RITE_BINARY_IDENT_LIL          "ETIR"
    55 #define RITE_BINARY_FORMAT_VER         "0003"
     55#define RITE_BINARY_FORMAT_VER         "0004"
    5656#define RITE_COMPILER_NAME             "MATZ"
    5757#define RITE_COMPILER_VERSION          "0000"
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/error.h

    r321 r331  
    88#define MRUBY_ERROR_H
    99
    10 #include "mruby/common.h"
     10#include "common.h"
    1111
    1212/**
     
    3232/* declaration for fail method */
    3333MRB_API mrb_value mrb_f_raise(mrb_state*, mrb_value);
     34
     35struct RBreak {
     36  MRB_OBJECT_HEADER;
     37  struct iv_tbl *iv;
     38  struct RProc *proc;
     39  mrb_value val;
     40};
    3441
    3542/**
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/gc.h

    r321 r331  
    88#define MRUBY_GC_H
    99
    10 #include "mruby/common.h"
     10#include "common.h"
    1111
    1212/**
     
    1818struct mrb_state;
    1919
    20 typedef void (mrb_each_object_callback)(struct mrb_state *mrb, struct RBasic *obj, void *data);
     20#define MRB_EACH_OBJ_OK 0
     21#define MRB_EACH_OBJ_BREAK 1
     22typedef int (mrb_each_object_callback)(struct mrb_state *mrb, struct RBasic *obj, void *data);
    2123void mrb_objspace_each_objects(struct mrb_state *mrb, mrb_each_object_callback *callback, void *data);
    2224MRB_API void mrb_free_context(struct mrb_state *mrb, struct mrb_context *c);
     
    6365  int interval_ratio;
    6466  int step_ratio;
     67  mrb_bool iterating     :1;
    6568  mrb_bool disabled      :1;
    6669  mrb_bool full          :1;
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/hash.h

    r321 r331  
    88#define MRUBY_HASH_H
    99
    10 #include "mruby/common.h"
     10#include "common.h"
     11#include <mruby/khash.h>
    1112
    1213/**
     
    2425#define mrb_hash_value(p)  mrb_obj_value((void*)(p))
    2526
    26 MRB_API mrb_value mrb_hash_new_capa(mrb_state*, int);
     27MRB_API mrb_value mrb_hash_new_capa(mrb_state*, mrb_int);
    2728
    2829/*
    2930 * Initializes a new hash.
     31 *
     32 * Equivalent to:
     33 *
     34 *      Hash.new
     35 *
     36 * @param mrb The mruby state reference.
     37 * @return The initialized hash.
    3038 */
    3139MRB_API mrb_value mrb_hash_new(mrb_state *mrb);
     
    3341/*
    3442 * Sets a keys and values to hashes.
     43 *
     44 * Equivalent to:
     45 *
     46 *      hash[key] = val
     47 *
     48 * @param mrb The mruby state reference.
     49 * @param hash The target hash.
     50 * @param key The key to set.
     51 * @param val The value to set.
     52 * @return The value.
    3553 */
    3654MRB_API void mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val);
    3755
    3856/*
    39  * Gets a value from a key.
     57 * Gets a value from a key. If the key is not found, the default of the
     58 * hash is used.
     59 *
     60 * Equivalent to:
     61 *
     62 *     hash[key]
     63 *
     64 * @param mrb The mruby state reference.
     65 * @param hash The target hash.
     66 * @param key The key to get.
     67 * @return The found value.
    4068 */
    4169MRB_API mrb_value mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key);
    4270
     71/*
     72 * Gets a value from a key. If the key is not found, the default parameter is
     73 * used.
     74 *
     75 * Equivalent to:
     76 *
     77 *     hash.hash_key?(key) ? hash[key] : def
     78 *
     79 * @param mrb The mruby state reference.
     80 * @param hash The target hash.
     81 * @param key The key to get.
     82 * @param def The default value.
     83 * @return The found value.
     84 */
    4385MRB_API mrb_value mrb_hash_fetch(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value def);
    4486
    4587/*
    4688 * Deletes hash key and value pair.
     89 *
     90 * Equivalent to:
     91 *
     92 *     hash.delete(key)
     93 *
     94 * @param mrb The mruby state reference.
     95 * @param hash The target hash.
     96 * @param key The key to delete.
     97 * @return The deleted value.
    4798 */
    4899MRB_API mrb_value mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key);
     
    50101/*
    51102 * Gets an array of keys.
     103 *
     104 * Equivalent to:
     105 *
     106 *     hash.keys
     107 *
     108 * @param mrb The mruby state reference.
     109 * @param hash The target hash.
     110 * @return An array with the keys of the hash.
    52111 */
    53112MRB_API mrb_value mrb_hash_keys(mrb_state *mrb, mrb_value hash);
    54113MRB_API mrb_value mrb_check_hash_type(mrb_state *mrb, mrb_value hash);
     114
     115/*
     116 * Check if the hash is empty
     117 *
     118 * Equivalent to:
     119 *
     120 *     hash.empty?
     121 *
     122 * @param mrb The mruby state reference.
     123 * @param self The target hash.
     124 * @return True if the hash is empty, false otherwise.
     125 */
    55126MRB_API mrb_value mrb_hash_empty_p(mrb_state *mrb, mrb_value self);
    56127
    57128/*
     129 * Gets an array of values.
     130 *
     131 * Equivalent to:
     132 *
     133 *     hash.values
     134 *
     135 * @param mrb The mruby state reference.
     136 * @param hash The target hash.
     137 * @return An array with the values of the hash.
     138 */
     139MRB_API mrb_value mrb_hash_values(mrb_state *mrb, mrb_value hash);
     140
     141/*
    58142 * Clears the hash.
     143 *
     144 * Equivalent to:
     145 *
     146 *     hash.clear
     147 *
     148 * @param mrb The mruby state reference.
     149 * @param hash The target hash.
     150 * @return The hash
    59151 */
    60152MRB_API mrb_value mrb_hash_clear(mrb_state *mrb, mrb_value hash);
     153
     154/* declaration of struct kh_ht */
     155/* be careful when you touch the internal */
     156typedef struct {
     157  mrb_value v;
     158  mrb_int n;
     159} mrb_hash_value;
     160
     161KHASH_DECLARE(ht, mrb_value, mrb_hash_value, TRUE)
    61162
    62163/* RHASH_TBL allocates st_table if not available. */
     
    67168MRB_API struct kh_ht * mrb_hash_tbl(mrb_state *mrb, mrb_value hash);
    68169
    69 #define MRB_HASH_PROC_DEFAULT 256
     170#define MRB_HASH_DEFAULT      1
     171#define MRB_HASH_PROC_DEFAULT 2
     172#define MRB_RHASH_DEFAULT_P(h) (RHASH(h)->flags & MRB_HASH_DEFAULT)
    70173#define MRB_RHASH_PROCDEFAULT_P(h) (RHASH(h)->flags & MRB_HASH_PROC_DEFAULT)
    71174
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/irep.h

    r321 r331  
    88#define MRUBY_IREP_H
    99
    10 #include "mruby/common.h"
    11 #include "mruby/compile.h"
     10#include "common.h"
     11#include <mruby/compile.h>
    1212
    1313/**
     
    4040  struct mrb_locals *lv;
    4141  /* debug info */
     42  mrb_bool own_filename;
    4243  const char *filename;
    4344  uint16_t *lines;
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/khash.h

    r321 r331  
    1010#include <string.h>
    1111
    12 #include "mruby.h"
    13 #include "mruby/common.h"
     12#include <mruby.h>
     13#include "common.h"
    1414
    1515/**
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/numeric.h

    r321 r331  
    88#define MRUBY_NUMERIC_H
    99
    10 #include "mruby/common.h"
     10#include "common.h"
    1111
    1212/**
     
    2121#define FIXABLE(f) (POSFIXABLE(f) && NEGFIXABLE(f))
    2222
     23#ifdef MRB_INT64
     24#define FIXABLE_FLOAT(f) FIXABLE((mrb_int)(f))
     25#else
     26#define FIXABLE_FLOAT(f) FIXABLE(f)
     27#endif
     28
    2329MRB_API mrb_value mrb_flo_to_fixnum(mrb_state *mrb, mrb_value val);
    2430MRB_API mrb_value mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, int base);
     
    3238mrb_value mrb_num_div(mrb_state *mrb, mrb_value x, mrb_value y);
    3339
     40#ifndef __has_builtin
     41  #define __has_builtin(x) 0
     42#endif
     43
     44#if (defined(__GNUC__) && __GNUC__ >= 5) ||   \
     45    (__has_builtin(__builtin_add_overflow) && \
     46     __has_builtin(__builtin_sub_overflow) && \
     47     __has_builtin(__builtin_mul_overflow))
     48# define MRB_HAVE_TYPE_GENERIC_CHECKED_ARITHMETIC_BUILTINS
     49#endif
     50
     51/*
     52// Clang 3.8 and 3.9 have problem compiling mruby in 32-bit mode, when MRB_INT64 is set
     53// because of missing __mulodi4 and similar functions in its runtime. We need to use custom
     54// implementation for them.
     55*/
     56#ifdef MRB_HAVE_TYPE_GENERIC_CHECKED_ARITHMETIC_BUILTINS
     57#if defined(__clang__) && (__clang_major__ == 3) && (__clang_minor__ >= 8) && \
     58    defined(MRB_32BIT) && defined(MRB_INT64)
     59#undef MRB_HAVE_TYPE_GENERIC_CHECKED_ARITHMETIC_BUILTINS
     60#endif
     61#endif
     62
     63#ifdef MRB_HAVE_TYPE_GENERIC_CHECKED_ARITHMETIC_BUILTINS
     64
     65#ifndef MRB_WORD_BOXING
     66# define WBCHK(x) 0
     67#else
     68# define WBCHK(x) !FIXABLE(x)
     69#endif
     70
     71static inline mrb_bool
     72mrb_int_add_overflow(mrb_int augend, mrb_int addend, mrb_int *sum)
     73{
     74  return __builtin_add_overflow(augend, addend, sum) || WBCHK(*sum);
     75}
     76
     77static inline mrb_bool
     78mrb_int_sub_overflow(mrb_int minuend, mrb_int subtrahend, mrb_int *difference)
     79{
     80  return __builtin_sub_overflow(minuend, subtrahend, difference) || WBCHK(*difference);
     81}
     82
     83static inline mrb_bool
     84mrb_int_mul_overflow(mrb_int multiplier, mrb_int multiplicand, mrb_int *product)
     85{
     86  return __builtin_mul_overflow(multiplier, multiplicand, product) || WBCHK(*product);
     87}
     88
     89#undef WBCHK
     90
     91#else
     92
    3493#define MRB_UINT_MAKE2(n) uint ## n ## _t
    3594#define MRB_UINT_MAKE(n) MRB_UINT_MAKE2(n)
     
    3796
    3897#define MRB_INT_OVERFLOW_MASK ((mrb_uint)1 << (MRB_INT_BIT - 1 - MRB_FIXNUM_SHIFT))
    39 
    40 /* Idea from Potion: https://github.com/perl11/potion (MIT) */
    41 #if (defined(__clang__) && ((__clang_major__ > 3) || (__clang_major__ == 3 && __clang_minor__ >= 4))) \
    42     || (defined(__GNUC__) && __GNUC__ >= 5)
    43 
    44 static inline mrb_bool
    45 mrb_int_add_overflow(mrb_int augend, mrb_int addend, mrb_int *sum)
    46 {
    47   mrb_bool of;
    48 
    49 #ifdef MRB_INT64
    50   long long val;
    51   of = __builtin_saddll_overflow(augend, addend, &val) ||
    52 #else
    53   int val;
    54   of = __builtin_sadd_overflow(augend, addend, &val) ||
    55 #endif
    56   (val > MRB_INT_MAX) || (val < MRB_INT_MIN);
    57 
    58   *sum = (mrb_int) val;
    59   return of;
    60 }
    61 
    62 static inline mrb_bool
    63 mrb_int_sub_overflow(mrb_int minuend, mrb_int subtrahend, mrb_int *difference)
    64 {
    65   mrb_bool of;
    66 
    67 #ifdef MRB_INT64
    68   long long val;
    69   of = __builtin_ssubll_overflow(minuend, subtrahend, &val) ||
    70 #else
    71   int val;
    72   of = __builtin_ssub_overflow(minuend, subtrahend, &val) ||
    73 #endif
    74   (val > MRB_INT_MAX) || (val < MRB_INT_MIN);
    75 
    76   *difference = (mrb_int) val;
    77   return of;
    78 }
    79 #else
    8098
    8199static inline mrb_bool
     
    99117}
    100118
     119static inline mrb_bool
     120mrb_int_mul_overflow(mrb_int multiplier, mrb_int multiplicand, mrb_int *product)
     121{
     122#if MRB_INT_BIT == 32
     123  int64_t n = (int64_t)multiplier * multiplicand;
     124  *product = (mrb_int)n;
     125  return !FIXABLE(n);
     126#else
     127  if (multiplier > 0) {
     128    if (multiplicand > 0) {
     129      if (multiplier > MRB_INT_MAX / multiplicand) return TRUE;
     130    }
     131    else {
     132      if (multiplicand < MRB_INT_MAX / multiplier) return TRUE;
     133    }
     134  }
     135  else {
     136    if (multiplicand > 0) {
     137      if (multiplier < MRB_INT_MAX / multiplicand) return TRUE;
     138    }
     139    else {
     140      if (multiplier != 0 && multiplicand < MRB_INT_MAX / multiplier) return TRUE;
     141    }
     142  }
     143  *product = multiplier * multiplicand;
     144  return FALSE;
    101145#endif
     146}
    102147
    103148#undef MRB_INT_OVERFLOW_MASK
     
    106151#undef MRB_UINT_MAKE2
    107152
     153#endif
     154
    108155MRB_END_DECL
    109156
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/object.h

    r321 r331  
    2323#define mrb_basic_ptr(v) ((struct RBasic*)(mrb_ptr(v)))
    2424
     25#define MRB_FROZEN_P(o) ((o)->flags & MRB_FLAG_IS_FROZEN)
     26#define MRB_SET_FROZEN_FLAG(o) ((o)->flags |= MRB_FLAG_IS_FROZEN)
     27#define MRB_UNSET_FROZEN_FLAG(o) ((o)->flags &= ~MRB_FLAG_IS_FROZEN)
     28
    2529struct RObject {
    2630  MRB_OBJECT_HEADER;
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/opcode.h

    r321 r331  
    8383  OP_JMPNOT,/*    A sBx   if !R(A) pc+=sBx                                */
    8484  OP_ONERR,/*     sBx     rescue_push(pc+sBx)                             */
    85   OP_RESCUE,/*    A       clear(exc); R(A) := exception (ignore when A=0) */
     85  OP_RESCUE,/*    A B C   if A (if C exc=R(A) else R(A) := exc);
     86                          if B R(B) := exc.isa?(R(B)); clear(exc)         */
    8687  OP_POPERR,/*    A       A.times{rescue_pop()}                           */
    8788  OP_RAISE,/*     A       raise(R(A))                                     */
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/proc.h

    r321 r331  
    88#define MRUBY_PROC_H
    99
    10 #include "mruby/common.h"
    11 #include "mruby/irep.h"
     10#include "common.h"
     11#include <mruby/irep.h>
    1212
    1313/**
     
    1919  MRB_OBJECT_HEADER;
    2020  mrb_value *stack;
    21   mrb_sym mid;
    2221  ptrdiff_t cioff;
     22  union {
     23    mrb_sym mid;
     24    struct mrb_context *c;
     25  } cxt;
    2326};
    2427
     
    2730#define MRB_ENV_UNSHARE_STACK(e) ((e)->cioff = -1)
    2831#define MRB_ENV_STACK_SHARED_P(e) ((e)->cioff >= 0)
     32
     33MRB_API void mrb_env_unshare(mrb_state*, struct REnv*);
    2934
    3035struct RProc {
     
    5156#define MRB_PROC_STRICT 256
    5257#define MRB_PROC_STRICT_P(p) (((p)->flags & MRB_PROC_STRICT) != 0)
     58#define MRB_PROC_ORPHAN 512
     59#define MRB_PROC_ORPHAN_P(p) (((p)->flags & MRB_PROC_ORPHAN) != 0)
    5360
    5461#define mrb_proc_ptr(v)    ((struct RProc*)(mrb_ptr(v)))
     
    6976#define mrb_cfunc_env_get(mrb, idx) mrb_proc_cfunc_env_get(mrb, idx)
    7077
    71 #include "mruby/khash.h"
     78#include <mruby/khash.h>
    7279KHASH_DECLARE(mt, mrb_sym, struct RProc*, TRUE)
    7380
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/range.h

    r321 r331  
    88#define MRUBY_RANGE_H
    99
    10 #include "mruby/common.h"
     10#include "common.h"
    1111
    1212/**
     
    2626};
    2727
    28 #define mrb_range_ptr(v)    ((struct RRange*)(mrb_ptr(v)))
     28MRB_API struct RRange* mrb_range_ptr(mrb_state *mrb, mrb_value v);
     29#define mrb_range_raw_ptr(v) ((struct RRange*)mrb_ptr(v))
    2930#define mrb_range_value(p)  mrb_obj_value((void*)(p))
    3031
     
    4142MRB_API mrb_value mrb_range_new(mrb_state *mrb, mrb_value start, mrb_value end, mrb_bool exclude);
    4243
    43 MRB_API mrb_bool mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len);
     44MRB_API mrb_int mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len, mrb_bool trunc);
    4445mrb_value mrb_get_values_at(mrb_state *mrb, mrb_value obj, mrb_int olen, mrb_int argc, const mrb_value *argv, mrb_value (*func)(mrb_state*, mrb_value, mrb_int));
    4546
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/re.h

    r321 r331  
    88#define MRUBY_RE_H
    99
    10 #ifdef __cplusplus
    11 extern "C" {
    12 #endif
     10MRB_BEGIN_DECL
    1311
    1412#define REGEXP_CLASS          "Regexp"
    1513
    16 #ifdef __cplusplus
    17 }
    18 #endif
     14MRB_END_DECL
    1915
    2016#endif  /* RE_H */
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/string.h

    r321 r331  
    88#define MRUBY_STRING_H
    99
    10 #include "mruby/common.h"
     10#include "common.h"
    1111
    1212/**
     
    4545  if (RSTR_EMBED_P(s)) {\
    4646    RSTR_SET_EMBED_LEN((s),(n));\
    47   } else {\
     47  }\
     48  else {\
    4849    s->as.heap.len = (mrb_int)(n);\
    4950  }\
     
    6364#define RSTR_UNSET_NOFREE_FLAG(s) ((s)->flags &= ~MRB_STR_NOFREE)
    6465
    65 #define RSTR_FROZEN_P(s) ((s)->flags & MRB_STR_FROZEN)
    66 #define RSTR_SET_FROZEN_FLAG(s) ((s)->flags |= MRB_STR_FROZEN)
    67 #define RSTR_UNSET_FROZEN_FLAG(s) ((s)->flags &= ~MRB_STR_FROZEN)
    68 
    6966/*
    7067 * Returns a pointer from a Ruby string
     
    7370#define RSTRING(s)           mrb_str_ptr(s)
    7471#define RSTRING_PTR(s)       RSTR_PTR(RSTRING(s))
    75 #define RSTRING_EMBED_LEN(s) RSTR_ENBED_LEN(RSTRING(s))
     72#define RSTRING_EMBED_LEN(s) RSTR_EMBED_LEN(RSTRING(s))
    7673#define RSTRING_LEN(s)       RSTR_LEN(RSTRING(s))
    7774#define RSTRING_CAPA(s)      RSTR_CAPA(RSTRING(s))
    7875#define RSTRING_END(s)       (RSTRING_PTR(s) + RSTRING_LEN(s))
    79 mrb_int mrb_str_strlen(mrb_state*, struct RString*);
     76MRB_API mrb_int mrb_str_strlen(mrb_state*, struct RString*);
    8077
    8178#define MRB_STR_SHARED    1
    8279#define MRB_STR_NOFREE    2
    83 #define MRB_STR_FROZEN    4
    84 #define MRB_STR_EMBED     8
    85 #define MRB_STR_EMBED_LEN_MASK 0x1f0
    86 #define MRB_STR_EMBED_LEN_SHIFT 4
     80#define MRB_STR_NO_UTF    8
     81#define MRB_STR_EMBED    16
     82#define MRB_STR_EMBED_LEN_MASK 0x3e0
     83#define MRB_STR_EMBED_LEN_SHIFT 5
    8784
    8885void mrb_gc_free_str(mrb_state*, struct RString*);
    8986MRB_API void mrb_str_modify(mrb_state*, struct RString*);
     87/*
     88 * Appends self to other. Returns self as a concatnated string.
     89 *
     90 *
     91 *  Example:
     92 *
     93 *     !!!c
     94 *     int
     95 *     main(int argc,
     96 *          char **argv)
     97 *     {
     98 *       // Variable declarations.
     99 *       mrb_value str1;
     100 *       mrb_value str2;
     101 *
     102 *       mrb_state *mrb = mrb_open();
     103 *       if (!mrb)
     104 *       {
     105 *          // handle error
     106 *       }
     107 *
     108 *       // Creates new Ruby strings.
     109 *       str1 = mrb_str_new_lit(mrb, "abc");
     110 *       str2 = mrb_str_new_lit(mrb, "def");
     111 *
     112 *       // Concatnates str2 to str1.
     113 *       mrb_str_concat(mrb, str1, str2);
     114 *
     115 *      // Prints new Concatnated Ruby string.
     116 *      mrb_p(mrb, str1);
     117 *
     118 *      mrb_close(mrb);
     119 *      return 0;
     120 *    }
     121 *
     122 *
     123 *  Result:
     124 *
     125 *     => "abcdef"
     126 *
     127 * @param [mrb_state] mrb The current mruby state.
     128 * @param [mrb_value] self String to concatenate.
     129 * @param [mrb_value] other String to append to self.
     130 * @return [mrb_value] Returns a new String appending other to self.
     131 */
    90132MRB_API void mrb_str_concat(mrb_state*, mrb_value, mrb_value);
    91133
    92134/*
    93135 * Adds two strings together.
     136 *
     137 *
     138 *  Example:
     139 *
     140 *     !!!c
     141 *     int
     142 *     main(int argc,
     143 *          char **argv)
     144 *     {
     145 *       // Variable declarations.
     146 *       mrb_value a;
     147 *       mrb_value b;
     148 *       mrb_value c;
     149 *
     150 *       mrb_state *mrb = mrb_open();
     151 *       if (!mrb)
     152 *       {
     153 *          // handle error
     154 *       }
     155 *
     156 *       // Creates two Ruby strings from the passed in C strings.
     157 *       a = mrb_str_new_lit(mrb, "abc");
     158 *       b = mrb_str_new_lit(mrb, "def");
     159 *
     160 *       // Prints both C strings.
     161 *       mrb_p(mrb, a);
     162 *       mrb_p(mrb, b);
     163 *
     164 *       // Concatnates both Ruby strings.
     165 *       c = mrb_str_plus(mrb, a, b);
     166 *
     167 *      // Prints new Concatnated Ruby string.
     168 *      mrb_p(mrb, c);
     169 *
     170 *      mrb_close(mrb);
     171 *      return 0;
     172 *    }
     173 *
     174 *
     175 *  Result:
     176 *
     177 *     => "abc"  # First string
     178 *     => "def"  # Second string
     179 *     => "abcdef" # First & Second concatnated.
     180 *
     181 * @param [mrb_state] mrb The current mruby state.
     182 * @param [mrb_value] a First string to concatenate.
     183 * @param [mrb_value] b Second string to concatenate.
     184 * @return [mrb_value] Returns a new String containing a concatenated to b.
    94185 */
    95186MRB_API mrb_value mrb_str_plus(mrb_state*, mrb_value, mrb_value);
     
    97188/*
    98189 * Converts pointer into a Ruby string.
     190 *
     191 * @param [mrb_state] mrb The current mruby state.
     192 * @param [void*] p The pointer to convert to Ruby string.
     193 * @return [mrb_value] Returns a new Ruby String.
    99194 */
    100195MRB_API mrb_value mrb_ptr_to_str(mrb_state *, void*);
     
    102197/*
    103198 * Returns an object as a Ruby string.
     199 *
     200 * @param [mrb_state] mrb The current mruby state.
     201 * @param [mrb_value] obj An object to return as a Ruby string.
     202 * @return [mrb_value] An object as a Ruby string.
    104203 */
    105204MRB_API mrb_value mrb_obj_as_string(mrb_state *mrb, mrb_value obj);
    106205
    107206/*
    108  * Resizes the string's length.
     207 * Resizes the string's length. Returns the amount of characters
     208 * in the specified by len.
     209 *
     210 * Example:
     211 *
     212 *     !!!c
     213 *     int
     214 *     main(int argc,
     215 *          char **argv)
     216 *     {
     217 *         // Variable declaration.
     218 *         mrb_value str;
     219 *
     220 *         mrb_state *mrb = mrb_open();
     221 *         if (!mrb)
     222 *         {
     223 *            // handle error
     224 *         }
     225 *         // Creates a new string.
     226 *         str = mrb_str_new_lit(mrb, "Hello, world!");
     227 *         // Returns 5 characters of
     228 *         mrb_str_resize(mrb, str, 5);
     229 *         mrb_p(mrb, str);
     230 *
     231 *         mrb_close(mrb);
     232 *         return 0;
     233 *      }
     234 *
     235 * Result:
     236 *
     237 *     => "Hello"
     238 *
     239 * @param [mrb_state] mrb The current mruby state.
     240 * @param [mrb_value] str The Ruby string to resize.
     241 * @param [mrb_value] len The length.
     242 * @return [mrb_value] An object as a Ruby string.
    109243 */
    110244MRB_API mrb_value mrb_str_resize(mrb_state *mrb, mrb_value str, mrb_int len);
     
    112246/*
    113247 * Returns a sub string.
     248 *
     249 *  Example:
     250 *
     251 *     !!!c
     252 *     int
     253 *     main(int argc,
     254 *     char const **argv)
     255 *     {
     256 *       // Variable declarations.
     257 *       mrb_value str1;
     258 *       mrb_value str2;
     259 *
     260 *       mrb_state *mrb = mrb_open();
     261 *       if (!mrb)
     262 *       {
     263 *         // handle error
     264 *       }
     265 *       // Creates new string.
     266 *       str1 = mrb_str_new_lit(mrb, "Hello, world!");
     267 *       // Returns a sub-string within the range of 0..2
     268 *       str2 = mrb_str_substr(mrb, str1, 0, 2);
     269 *
     270 *       // Prints sub-string.
     271 *       mrb_p(mrb, str2);
     272 *
     273 *       mrb_close(mrb);
     274 *       return 0;
     275 *     }
     276 *
     277 *  Result:
     278 *
     279 *     => "He"
     280 *
     281 * @param [mrb_state] mrb The current mruby state.
     282 * @param [mrb_value] str Ruby string.
     283 * @param [mrb_int] beg The beginning point of the sub-string.
     284 * @param [mrb_int] len The end point of the sub-string.
     285 * @return [mrb_value] An object as a Ruby sub-string.
    114286 */
    115287MRB_API mrb_value mrb_str_substr(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len);
     
    117289/*
    118290 * Returns a Ruby string type.
     291 *
     292 *
     293 * @param [mrb_state] mrb The current mruby state.
     294 * @param [mrb_value] str Ruby string.
     295 * @return [mrb_value] A Ruby string.
    119296 */
    120297MRB_API mrb_value mrb_string_type(mrb_state *mrb, mrb_value str);
     
    124301
    125302MRB_API const char *mrb_string_value_cstr(mrb_state *mrb, mrb_value *ptr);
    126 MRB_API const char *mrb_string_value_ptr(mrb_state *mrb, mrb_value ptr);
     303MRB_API const char *mrb_string_value_ptr(mrb_state *mrb, mrb_value str);
     304/*
     305 * Returns the length of the Ruby string.
     306 *
     307 *
     308 * @param [mrb_state] mrb The current mruby state.
     309 * @param [mrb_value] str Ruby string.
     310 * @return [mrb_int] The length of the passed in Ruby string.
     311 */
     312MRB_API mrb_int mrb_string_value_len(mrb_state *mrb, mrb_value str);
    127313
    128314/*
    129315 * Duplicates a string object.
     316 *
     317 *
     318 * @param [mrb_state] mrb The current mruby state.
     319 * @param [mrb_value] str Ruby string.
     320 * @return [mrb_value] Duplicated Ruby string.
    130321 */
    131322MRB_API mrb_value mrb_str_dup(mrb_state *mrb, mrb_value str);
    132323
    133324/*
    134  * Returns a symbol from a passed in string.
     325 * Returns a symbol from a passed in Ruby string.
     326 *
     327 * @param [mrb_state] mrb The current mruby state.
     328 * @param [mrb_value] self Ruby string.
     329 * @return [mrb_value] A symbol.
    135330 */
    136331MRB_API mrb_value mrb_str_intern(mrb_state *mrb, mrb_value self);
     
    146341/*
    147342 * Returns true if the strings match and false if the strings don't match.
     343 *
     344 * @param [mrb_state] mrb The current mruby state.
     345 * @param [mrb_value] str1 Ruby string to compare.
     346 * @param [mrb_value] str2 Ruby string to compare.
     347 * @return [mrb_value] boolean value.
    148348 */
    149349MRB_API mrb_bool mrb_str_equal(mrb_state *mrb, mrb_value str1, mrb_value str2);
     
    152352 * Returns a concated string comprised of a Ruby string and a C string.
    153353 *
     354 * @param [mrb_state] mrb The current mruby state.
     355 * @param [mrb_value] str Ruby string.
     356 * @param [const char *] ptr A C string.
     357 * @param [size_t] len length of C string.
     358 * @return [mrb_value] A Ruby string.
    154359 * @see mrb_str_cat_cstr
    155360 */
     
    159364 * Returns a concated string comprised of a Ruby string and a C string.
    160365 *
     366 * @param [mrb_state] mrb The current mruby state.
     367 * @param [mrb_value] str Ruby string.
     368 * @param [const char *] ptr A C string.
     369 * @return [mrb_value] A Ruby string.
    161370 * @see mrb_str_cat
    162371 */
     
    176385
    177386/*
    178  * Returns a C string from a Ruby string.
     387 * Returns a newly allocated C string from a Ruby string.
     388 * This is an utility function to pass a Ruby string to C library functions.
     389 *
     390 * - Returned string does not contain any NUL characters (but terminator).
     391 * - It raises an ArgumentError exception if Ruby string contains
     392 *   NUL characters.
     393 * - Retured string will be freed automatically on next GC.
     394 * - Caller can modify returned string without affecting Ruby string
     395 *   (e.g. it can be used for mkstemp(3)).
     396 *
     397 * @param [mrb_state *] mrb The current mruby state.
     398 * @param [mrb_value] str Ruby string. Must be an instance of String.
     399 * @return [char *] A newly allocated C string.
    179400 */
    180401MRB_API char *mrb_str_to_cstr(mrb_state *mrb, mrb_value str);
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/throw.h

    r321 r331  
    88#define MRB_THROW_H
    99
    10 #ifdef MRB_ENABLE_CXX_EXCEPTION
     10#if defined(MRB_ENABLE_CXX_ABI)
     11# if !defined(__cplusplus)
     12#  error Trying to use C++ exception handling in C code
     13# endif
     14#endif
     15
     16#if defined(MRB_ENABLE_CXX_EXCEPTION) && defined(__cplusplus)
    1117
    1218#define MRB_TRY(buf) do { try {
     
    2127#include <setjmp.h>
    2228
    23 #define MRB_TRY(buf) do { if (setjmp((buf)->impl) == 0) {
     29#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
     30#define MRB_SETJMP _setjmp
     31#define MRB_LONGJMP _longjmp
     32#else
     33#define MRB_SETJMP setjmp
     34#define MRB_LONGJMP longjmp
     35#endif
     36
     37#define MRB_TRY(buf) do { if (MRB_SETJMP((buf)->impl) == 0) {
    2438#define MRB_CATCH(buf) } else {
    2539#define MRB_END_EXC(buf) } } while(0)
    2640
    27 #define MRB_THROW(buf) longjmp((buf)->impl, 1);
     41#define MRB_THROW(buf) MRB_LONGJMP((buf)->impl, 1);
    2842#define mrb_jmpbuf_impl jmp_buf
    2943
     
    3347  mrb_jmpbuf_impl impl;
    3448
    35 #ifdef MRB_ENABLE_CXX_EXCEPTION
     49#if defined(MRB_ENABLE_CXX_EXCEPTION) && defined(__cplusplus)
    3650  static mrb_int jmpbuf_id;
    3751  mrb_jmpbuf() : impl(jmpbuf_id++) {}
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/value.h

    r321 r331  
    88#define MRUBY_VALUE_H
    99
    10 #include "mruby/common.h"
     10#include "common.h"
    1111
    1212/**
     
    2121#if defined(MRB_INT16) && defined(MRB_INT64)
    2222# error "You can't define MRB_INT16 and MRB_INT64 at the same time."
     23#endif
     24
     25#if defined _MSC_VER && _MSC_VER < 1800
     26# define PRIo64 "llo"
     27# define PRId64 "lld"
     28# define PRIx64 "llx"
     29# define PRIo16 "ho"
     30# define PRId16 "hd"
     31# define PRIx16 "hx"
     32# define PRIo32 "o"
     33# define PRId32 "d"
     34# define PRIx32 "x"
     35#else
     36# include <inttypes.h>
    2337#endif
    2438
     
    2842# define MRB_INT_MIN (INT64_MIN>>MRB_FIXNUM_SHIFT)
    2943# define MRB_INT_MAX (INT64_MAX>>MRB_FIXNUM_SHIFT)
     44# define MRB_PRIo PRIo64
     45# define MRB_PRId PRId64
     46# define MRB_PRIx PRIx64
    3047#elif defined(MRB_INT16)
    3148  typedef int16_t mrb_int;
     
    3350# define MRB_INT_MIN (INT16_MIN>>MRB_FIXNUM_SHIFT)
    3451# define MRB_INT_MAX (INT16_MAX>>MRB_FIXNUM_SHIFT)
     52# define MRB_PRIo PRIo16
     53# define MRB_PRId PRId16
     54# define MRB_PRIx PRIx16
    3555#else
    3656  typedef int32_t mrb_int;
     
    3858# define MRB_INT_MIN (INT32_MIN>>MRB_FIXNUM_SHIFT)
    3959# define MRB_INT_MAX (INT32_MAX>>MRB_FIXNUM_SHIFT)
    40 #endif
    41 
     60# define MRB_PRIo PRIo32
     61# define MRB_PRId PRId32
     62# define MRB_PRIx PRIx32
     63#endif
     64
     65
     66MRB_API double mrb_float_read(const char*, char**);
    4267#ifdef MRB_USE_FLOAT
    4368  typedef float mrb_float;
    44 # define str_to_mrb_float(buf) strtof(buf, NULL)
    4569#else
    4670  typedef double mrb_float;
    47 # define str_to_mrb_float(buf) strtod(buf, NULL)
    4871#endif
    4972
     
    6386#  define isinf(n) (!_finite(n) && !_isnan(n))
    6487#  define signbit(n) (_copysign(1.0, (n)) < 0.0)
    65 #  define strtof (float)strtod
    6688static const unsigned int IEEE754_INFINITY_BITS_SINGLE = 0x7F800000;
    6789#  define INFINITY (*(float *)&IEEE754_INFINITY_BITS_SINGLE)
     
    94116  MRB_TT_DATA,        /*  21 */
    95117  MRB_TT_FIBER,       /*  22 */
    96   MRB_TT_MAXDEFINE    /*  23 */
     118  MRB_TT_ISTRUCT,     /*  23 */
     119  MRB_TT_BREAK,       /*  24 */
     120  MRB_TT_MAXDEFINE    /*  25 */
    97121};
    98122
    99 #include "mruby/object.h"
     123#include <mruby/object.h>
    100124
    101125#ifdef MRB_DOCUMENTATION_BLOCK
     
    188212  mrb_value v;
    189213  SET_OBJ_VALUE(v, (struct RBasic*)p);
     214  mrb_assert(p == mrb_ptr(v));
     215  mrb_assert(((struct RBasic*)p)->tt == mrb_type(v));
    190216  return v;
    191217}
     
    242268
    243269#ifdef MRB_USE_ETEXT_EDATA
     270#if (defined(__APPLE__) && defined(__MACH__))
     271#include <mach-o/getsect.h>
     272static inline mrb_bool
     273mrb_ro_data_p(const char *p)
     274{
     275  return (const char*)get_etext() < p && p < (const char*)get_edata();
     276}
     277#else
    244278extern char _etext[];
    245279#ifdef MRB_NO_INIT_ARRAY_START
     
    260294}
    261295#endif
     296#endif
    262297#else
    263298# define mrb_ro_data_p(p) FALSE
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/variable.h

    r321 r331  
    88#define MRUBY_VARIABLE_H
    99
    10 #include "mruby/common.h"
     10#include "common.h"
    1111
    1212/**
     
    5555MRB_API void mrb_iv_copy(mrb_state *mrb, mrb_value dst, mrb_value src);
    5656MRB_API mrb_bool mrb_const_defined_at(mrb_state *mrb, mrb_value mod, mrb_sym id);
     57
     58/**
     59 * Get a global variable. Will return nil if the var does not exist
     60 *
     61 * Example:
     62 *
     63 *     !!!ruby
     64 *     # Ruby style
     65 *     var = $value
     66 *
     67 *     !!!c
     68 *     // C style
     69 *     mrb_sym sym = mrb_intern_lit(mrb, "$value");
     70 *     mrb_value var = mrb_gv_get(mrb, sym);
     71 *
     72 * @param mrb The mruby state reference
     73 * @param sym The name of the global variable
     74 * @return The value of that global variable. May be nil
     75 */
    5776MRB_API mrb_value mrb_gv_get(mrb_state *mrb, mrb_sym sym);
     77
     78/**
     79 * Set a global variable
     80 *
     81 * Example:
     82 *
     83 *     !!!ruby
     84 *     # Ruby style
     85 *     $value = "foo"
     86 *
     87 *     !!!c
     88 *     // C style
     89 *     mrb_sym sym = mrb_intern_lit(mrb, "$value");
     90 *     mrb_gv_set(mrb, sym, mrb_str_new_lit("foo"));
     91 *
     92 * @param mrb The mruby state reference
     93 * @param sym The name of the global variable
     94 * @param val The value of the global variable
     95 */
    5896MRB_API void mrb_gv_set(mrb_state *mrb, mrb_sym sym, mrb_value val);
     97
     98/**
     99 * Remove a global variable.
     100 *
     101 * Example:
     102 *
     103 *     !!!ruby
     104 *     # Ruby style
     105 *     $value = nil
     106 *
     107 *     !!!c
     108 *     // C style
     109 *     mrb_sym sym = mrb_intern_lit(mrb, "$value");
     110 *     mrb_gv_remove(mrb, sym);
     111 *
     112 * @param mrb The mruby state reference
     113 * @param sym The name of the global variable
     114 * @param val The value of the global variable
     115 */
    59116MRB_API void mrb_gv_remove(mrb_state *mrb, mrb_sym sym);
     117
    60118MRB_API mrb_value mrb_cv_get(mrb_state *mrb, mrb_value mod, mrb_sym sym);
    61119MRB_API void mrb_mod_cv_set(mrb_state *mrb, struct RClass * c, mrb_sym sym, mrb_value v);
  • EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/version.h

    r321 r331  
    88#define MRUBY_VERSION_H
    99
    10 #include "mruby/common.h"
     10#include "common.h"
    1111
    1212/**
     
    4343 * Minor release version number.
    4444 */
    45 #define MRUBY_RELEASE_MINOR 2
     45#define MRUBY_RELEASE_MINOR 3
    4646
    4747/*
     
    6363 * Release year.
    6464 */
    65 #define MRUBY_RELEASE_YEAR 2015
     65#define MRUBY_RELEASE_YEAR 2017
    6666
    6767/*
    6868 * Release month.
    6969 */
    70 #define MRUBY_RELEASE_MONTH 11
     70#define MRUBY_RELEASE_MONTH 7
    7171
    7272/*
    7373 * Release day.
    7474 */
    75 #define MRUBY_RELEASE_DAY 17
     75#define MRUBY_RELEASE_DAY 4
    7676
    7777/*
  • EcnlProtoTool/trunk/mruby-1.3.0/minirake

    r299 r331  
    114114    # their time stamp.  Other tasks can be more sophisticated.
    115115    def timestamp
    116       prerequisites = @prerequisites.collect{ |n| n.is_a?(Proc) ? n.call(name) : n }.flatten
    117       prerequisites.collect { |n| Task[n].timestamp }.max || Time.now
     116      Time.now
    118117    end
    119118
     
    241240    # Time stamp for file task.
    242241    def timestamp
     242      return Time.at(0) unless File.exist?(name)
    243243      stat = File::stat(name.to_s)
    244244      stat.directory? ? Time.at(0) : stat.mtime
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/default.gembox

    r270 r331  
    5454  conf.gem :core => "mruby-enumerator"
    5555
    56   # Use Enumerable::Lazy class (require mruby-enumerator)
     56  # Use Enumerator::Lazy class (require mruby-enumerator)
    5757  conf.gem :core => "mruby-enum-lazy"
    5858
     
    7272  conf.gem :core => "mruby-kernel-ext"
    7373
     74  # Use class/module extension
     75  conf.gem :core => "mruby-class-ext"
     76
    7477  # Use mruby-compiler to build other mrbgems
    7578  conf.gem :core => "mruby-compiler"
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-array-ext/mrblib/array.rb

    r321 r331  
    11class Array
     2  ##
     3  # call-seq:
     4  #    Array.try_convert(obj) -> array or nil
     5  #
     6  # Tries to convert +obj+ into an array, using +to_ary+ method.
     7  # converted array or +nil+ if +obj+ cannot be converted for any reason.
     8  # This method can be used to check if an argument is an array.
     9  #
     10  #    Array.try_convert([1])   #=> [1]
     11  #    Array.try_convert("1")   #=> nil
     12  #
     13  #    if tmp = Array.try_convert(arg)
     14  #      # the argument is an array
     15  #    elsif tmp = String.try_convert(arg)
     16  #      # the argument is a string
     17  #    end
     18  #
     19  def self.try_convert(obj)
     20    if obj.respond_to?(:to_ary)
     21      obj.to_ary
     22    else
     23      nil
     24    end
     25  end
     26
    227  ##
    328  # call-seq:
     
    251276  #
    252277  #  Alternatively, if a block is given it will only be executed when an
    253   #  invalid +index+ is referenced.  Negative values of +index+ count from the
    254   #  end of the array.
     278  #  invalid +index+ is referenced.
     279  #
     280  #  Negative values of +index+ count from the end of the array.
    255281  #
    256282  #     a = [ 11, 22, 33, 44 ]
     
    710736    nil
    711737  end
     738
     739  ##
     740  #  call-seq:
     741  #     ary.to_ary -> ary
     742  #
     743  #  Returns +self+.
     744  #
     745  def to_ary
     746    self
     747  end
     748
     749  ##
     750  # call-seq:
     751  #   ary.dig(idx, ...)                 -> object
     752  #
     753  # Extracts the nested value specified by the sequence of <i>idx</i>
     754  # objects by calling +dig+ at each step, returning +nil+ if any
     755  # intermediate step is +nil+.
     756  #
     757  def dig(idx,*args)
     758    n = self[idx]
     759    if args.size > 0
     760      n&.dig(*args)
     761    else
     762      n
     763    end
     764  end
    712765end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-array-ext/src/array.c

    r321 r331  
    1 #include "mruby.h"
    2 #include "mruby/value.h"
    3 #include "mruby/array.h"
    4 #include "mruby/range.h"
    5 #include "mruby/hash.h"
     1#include <mruby.h>
     2#include <mruby/value.h>
     3#include <mruby/array.h>
     4#include <mruby/range.h>
     5#include <mruby/hash.h>
    66
    77/*
     
    132132    if (mrb_nil_p(v)) {
    133133      mrb_raisef(mrb, E_TYPE_ERROR, "wrong element type %S at %S (expected array)",
    134         mrb_str_new_cstr(mrb,  mrb_obj_classname(mrb, RARRAY_PTR(ary)[i])),
     134        mrb_str_new_cstr(mrb,  mrb_obj_classname(mrb, ary_elt(ary, i))),
    135135        mrb_fixnum_value(i)
    136136      );
     
    150150}
    151151
     152/*
     153 *  call-seq:
     154 *     ary.slice!(index)         -> obj or nil
     155 *     ary.slice!(start, length) -> new_ary or nil
     156 *     ary.slice!(range)         -> new_ary or nil
     157 *
     158 *  Deletes the element(s) given by an +index+ (optionally up to +length+
     159 *  elements) or by a +range+.
     160 *
     161 *  Returns the deleted object (or objects), or +nil+ if the +index+ is out of
     162 *  range.
     163 *
     164 *     a = [ "a", "b", "c" ]
     165 *     a.slice!(1)     #=> "b"
     166 *     a               #=> ["a", "c"]
     167 *     a.slice!(-1)    #=> "c"
     168 *     a               #=> ["a"]
     169 *     a.slice!(100)   #=> nil
     170 *     a               #=> ["a"]
     171 */
     172
     173static mrb_value
     174mrb_ary_slice_bang(mrb_state *mrb, mrb_value self)
     175{
     176  struct RArray *a = mrb_ary_ptr(self);
     177  mrb_int i, j, k, len;
     178  mrb_value index;
     179  mrb_value val;
     180  mrb_value *ptr;
     181  mrb_value ary;
     182
     183  mrb_ary_modify(mrb, a);
     184
     185  if (mrb_get_args(mrb, "o|i", &index, &len) == 1) {
     186    switch (mrb_type(index)) {
     187    case MRB_TT_RANGE:
     188      if (mrb_range_beg_len(mrb, index, &i, &len, a->len, TRUE) == 1) {
     189        goto delete_pos_len;
     190      }
     191      else {
     192        return mrb_nil_value();
     193      }
     194    case MRB_TT_FIXNUM:
     195      val = mrb_funcall(mrb, self, "delete_at", 1, index);
     196      return val;
     197    default:
     198      val = mrb_funcall(mrb, self, "delete_at", 1, index);
     199      return val;
     200    }
     201  }
     202
     203  i = mrb_fixnum(index);
     204 delete_pos_len:
     205  if (i < 0) i += a->len;
     206  if (i < 0 || a->len < i) return mrb_nil_value();
     207  if (len < 0) return mrb_nil_value();
     208  if (a->len == i) return mrb_ary_new(mrb);
     209  if (len > a->len - i) len = a->len - i;
     210
     211  ary = mrb_ary_new_capa(mrb, len);
     212
     213  for (j = i, k = 0; k < len; ++j, ++k) {
     214    mrb_ary_push(mrb, ary, a->ptr[j]);
     215  }
     216
     217  ptr = a->ptr + i;
     218  for (j = i; j < a->len - len; ++j) {
     219    *ptr = *(ptr+len);
     220    ++ptr;
     221  }
     222
     223  mrb_ary_resize(mrb, self, a->len - len);
     224  return ary;
     225}
     226
    152227void
    153228mrb_mruby_array_ext_gem_init(mrb_state* mrb)
     
    160235  mrb_define_method(mrb, a, "values_at", mrb_ary_values_at, MRB_ARGS_ANY());
    161236  mrb_define_method(mrb, a, "to_h",   mrb_ary_to_h, MRB_ARGS_REQ(0));
     237  mrb_define_method(mrb, a, "slice!", mrb_ary_slice_bang,   MRB_ARGS_ANY());
    162238}
    163239
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-array-ext/test/array.rb

    r321 r331  
    11##
    22# Array(Ext) Test
     3
     4assert("Array.try_convert") do
     5  assert_nil Array.try_convert(0)
     6  assert_nil Array.try_convert(nil)
     7  assert_equal [], Array.try_convert([])
     8  assert_equal [1,2,3], Array.try_convert([1,2,3])
     9end
    310
    411assert("Array#assoc") do
     
    295302end
    296303
     304assert('Array#to_h (Modified)') do
     305  class A
     306    def to_ary
     307      $a.clear
     308      nil
     309    end
     310  end
     311  $a = [A.new]
     312  assert_raise(TypeError) { $a.to_h }
     313end
     314
    297315assert("Array#index (block)") do
    298316  assert_nil (1..10).to_a.index { |i| i % 5 == 0 and i % 7 == 0 }
    299317  assert_equal 34, (1..100).to_a.index { |i| i % 5 == 0 and i % 7 == 0 }
    300318end
     319
     320assert("Array#to_ary") do
     321  assert_equal [], [].to_ary
     322  assert_equal [1,2,3], [1,2,3].to_ary
     323end
     324
     325assert("Array#dig") do
     326  h = [[[1]], 0]
     327  assert_equal(1, h.dig(0, 0, 0))
     328  assert_nil(h.dig(2, 0))
     329  assert_raise(TypeError) {h.dig(:a)}
     330end
     331
     332assert("Array#slice!") do
     333  a = [1, 2, 3]
     334  b = a.slice!(0)
     335  c = [1, 2, 3, 4, 5]
     336  d = c.slice!(0, 2)
     337  e = [1, 2, 3, 4, 5]
     338  f = e.slice!(1..3)
     339  g = [1, 2, 3]
     340  h = g.slice!(-1)
     341  i = [1, 2, 3]
     342  j = i.slice!(0, -1)
     343
     344  assert_equal(a, [2, 3])
     345  assert_equal(b, 1)
     346  assert_equal(c, [3, 4, 5])
     347  assert_equal(d, [1, 2])
     348  assert_equal(e, [1, 5])
     349  assert_equal(f, [2, 3, 4])
     350  assert_equal(g, [1, 2])
     351  assert_equal(h, 3)
     352  assert_equal(i, [1, 2, 3])
     353  assert_equal(j, nil)
     354end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/bintest/mrdb.rb

    r321 r331  
    1515    # compile
    1616    `./bin/mrbc -g -o "#{bin.path}" "#{script.path}"`
    17    
     17
    1818    # add mrdb quit
    1919    testcase << {:cmd=>"quit"}
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/bintest/print.rb

    r321 r331  
    1414    # compile
    1515    `./bin/mrbc -g -o "#{bin.path}" "#{script.path}"`
    16    
     16
    1717    # add mrdb quit
    1818    testcase << {:cmd=>"quit"}
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c

    r321 r331  
    55
    66#include <string.h>
    7 #include "mruby.h"
    8 #include "mruby/irep.h"
     7#include <mruby.h>
     8#include <mruby/irep.h>
    99#include "mrdb.h"
    10 #include "mruby/debug.h"
    11 #include "mruby/opcode.h"
    12 #include "mruby/class.h"
    13 #include "mruby/proc.h"
    14 #include "mruby/variable.h"
     10#include <mruby/debug.h>
     11#include <mruby/opcode.h>
     12#include <mruby/class.h>
     13#include <mruby/proc.h>
     14#include <mruby/variable.h>
    1515#include "mrdberror.h"
    1616#include "apibreak.h"
     
    2121
    2222static uint16_t
    23 check_lineno( mrb_irep_debug_info_file *info_file, uint16_t lineno )
     23check_lineno(mrb_irep_debug_info_file *info_file, uint16_t lineno)
    2424{
    2525  uint32_t count = info_file->line_entry_count;
    2626  uint16_t l_idx;
    2727
    28   if( info_file->line_type == mrb_debug_line_ary ) {
     28  if (info_file->line_type == mrb_debug_line_ary) {
    2929    for (l_idx = 0; l_idx < count; ++l_idx) {
    30       if(lineno == info_file->lines.ary[l_idx]) {
     30      if (lineno == info_file->lines.ary[l_idx]) {
    3131        return lineno;
    3232      }
    3333    }
    34   } else {
     34  }
     35  else {
    3536    for (l_idx = 0; l_idx < count; ++l_idx) {
    36       if(lineno == info_file->lines.flat_map[l_idx].line) {
     37      if (lineno == info_file->lines.flat_map[l_idx].line) {
    3738        return lineno;
    3839      }
     
    4445
    4546static int32_t
    46 get_break_index( mrb_debug_context *dbg, int32_t bpno )
     47get_break_index(mrb_debug_context *dbg, uint32_t bpno)
    4748{
    4849  uint32_t i;
     
    5152
    5253  for(i = 0 ; i < dbg->bpnum; i++) {
    53     if(dbg->bp[i].bpno == bpno) {
     54    if (dbg->bp[i].bpno == bpno) {
    5455      hit = TRUE;
    5556      index = i;
     
    5859  }
    5960
    60   if(hit == FALSE) {
     61  if (hit == FALSE) {
    6162    return MRB_DEBUG_BREAK_INVALID_NO;
    6263  }
     
    6667
    6768static void
    68 free_breakpoint( mrb_state *mrb, mrb_debug_breakpoint *bp )
     69free_breakpoint(mrb_state *mrb, mrb_debug_breakpoint *bp)
    6970{
    7071  switch(bp->type) {
     
    7475    case MRB_DEBUG_BPTYPE_METHOD:
    7576      mrb_free(mrb, (void*)bp->point.methodpoint.method_name);
    76       if(bp->point.methodpoint.class_name != NULL) {
     77      if (bp->point.methodpoint.class_name != NULL) {
    7778        mrb_free(mrb, (void*)bp->point.methodpoint.class_name);
    7879      }
     
    8485
    8586static uint16_t
    86 check_file_lineno( struct mrb_irep *irep, const char *file, uint16_t lineno )
     87check_file_lineno(struct mrb_irep *irep, const char *file, uint16_t lineno)
    8788{
    8889  mrb_irep_debug_info_file *info_file;
     
    9495  for (f_idx = 0; f_idx < irep->debug_info->flen; ++f_idx) {
    9596    info_file = irep->debug_info->files[f_idx];
    96     if(!strcmp(info_file->filename, file)) {
     97    if (!strcmp(info_file->filename, file)) {
    9798      result = MRB_DEBUG_BP_FILE_OK;
    9899
    99       fix_lineno = check_lineno( info_file, lineno );
    100       if(fix_lineno != 0) {
     100      fix_lineno = check_lineno(info_file, lineno);
     101      if (fix_lineno != 0) {
    101102        return result | MRB_DEBUG_BP_LINENO_OK;
    102103      }
    103104    }
    104     for ( i=0; i < irep->rlen; ++i ) {
     105    for (i=0; i < irep->rlen; ++i) {
    105106      result  |= check_file_lineno(irep->reps[i], file, lineno);
    106       if(result == (MRB_DEBUG_BP_FILE_OK | MRB_DEBUG_BP_LINENO_OK)) {
     107      if (result == (MRB_DEBUG_BP_FILE_OK | MRB_DEBUG_BP_LINENO_OK)) {
    107108        return result;
    108109      }
     
    113114
    114115static const char*
    115 get_class_name( mrb_state *mrb, struct RClass *class_obj )
     116get_class_name(mrb_state *mrb, struct RClass *class_obj)
    116117{
    117118  struct RClass *outer;
     
    124125
    125126static int32_t
    126 compare_break_method( mrb_state *mrb, mrb_debug_breakpoint *bp, struct RClass *class_obj, mrb_sym method_sym, mrb_bool* isCfunc )
     127compare_break_method(mrb_state *mrb, mrb_debug_breakpoint *bp, struct RClass *class_obj, mrb_sym method_sym, mrb_bool* isCfunc)
    127128{
    128129  const char* class_name;
     
    138139
    139140  method_p = &bp->point.methodpoint;
    140   if(strcmp(method_p->method_name, method_name) == 0) {
     141  if (strcmp(method_p->method_name, method_name) == 0) {
    141142    class_name = get_class_name(mrb, class_obj);
    142     if(class_name == NULL) {
    143       if(method_p->class_name == NULL) {
     143    if (class_name == NULL) {
     144      if (method_p->class_name == NULL) {
    144145        return bp->bpno;
    145146      }
    146147    }
    147     else if(method_p->class_name != NULL) {
     148    else if (method_p->class_name != NULL) {
    148149      m = mrb_method_search_vm(mrb, &class_obj, method_sym);
    149       if(m == NULL) {
     150      if (m == NULL) {
    150151        return MRB_DEBUG_OK;
    151152      }
    152       if(MRB_PROC_CFUNC_P(m)) {
     153      if (MRB_PROC_CFUNC_P(m)) {
    153154        *isCfunc = TRUE;
    154155      }
    155156
    156157      is_defined = mrb_class_defined(mrb, method_p->class_name);
    157       if(is_defined == FALSE) {
     158      if (is_defined == FALSE) {
    158159        return MRB_DEBUG_OK;
    159160      }
     
    162163      ssym = mrb_symbol(mrb_check_intern_cstr(mrb, method_p->method_name));
    163164      m = mrb_method_search_vm(mrb, &sc, ssym);
    164       if(m == NULL) {
     165      if (m == NULL) {
    165166        return MRB_DEBUG_OK;
    166167      }
     
    168169      class_name = get_class_name(mrb, class_obj);
    169170      sn = get_class_name(mrb, sc);
    170       if(strcmp(sn, class_name) == 0) {
     171      if (strcmp(sn, class_name) == 0) {
    171172        return bp->bpno;
    172173      }
     
    177178
    178179int32_t
    179 mrb_debug_set_break_line( mrb_state *mrb, mrb_debug_context *dbg, const char *file, uint16_t lineno)
     180mrb_debug_set_break_line(mrb_state *mrb, mrb_debug_context *dbg, const char *file, uint16_t lineno)
    180181{
    181182  int32_t index;
     
    183184  uint16_t result;
    184185
    185   if((mrb == NULL)||(dbg == NULL)||(file == NULL)) {
    186     return MRB_DEBUG_INVALID_ARGUMENT;
    187   }
    188 
    189   if(dbg->bpnum >= MAX_BREAKPOINT) {
     186  if ((mrb == NULL)||(dbg == NULL)||(file == NULL)) {
     187    return MRB_DEBUG_INVALID_ARGUMENT;
     188  }
     189
     190  if (dbg->bpnum >= MAX_BREAKPOINT) {
    190191    return MRB_DEBUG_BREAK_NUM_OVER;
    191192  }
    192193
    193   if(dbg->next_bpno > MAX_BREAKPOINTNO) {
     194  if (dbg->next_bpno > MAX_BREAKPOINTNO) {
    194195    return MRB_DEBUG_BREAK_NO_OVER;
    195196  }
    196197
    197198  /* file and lineno check (line type mrb_debug_line_ary only.) */
    198   result = check_file_lineno( dbg->root_irep, file, lineno );
    199   if(result == 0) {
     199  result = check_file_lineno(dbg->root_irep, file, lineno);
     200  if (result == 0) {
    200201    return MRB_DEBUG_BREAK_INVALID_FILE;
    201   }else if(result == MRB_DEBUG_BP_FILE_OK) {
     202  }
     203  else if (result == MRB_DEBUG_BP_FILE_OK) {
    202204    return MRB_DEBUG_BREAK_INVALID_LINENO;
    203   } 
     205  }
    204206
    205207  set_file = mrb_malloc(mrb, strlen(file) + 1);
     
    221223
    222224int32_t
    223 mrb_debug_set_break_method( mrb_state *mrb, mrb_debug_context *dbg, const char *class_name, const char *method_name )
     225mrb_debug_set_break_method(mrb_state *mrb, mrb_debug_context *dbg, const char *class_name, const char *method_name)
    224226{
    225227  int32_t index;
     
    227229  char* set_method;
    228230
    229   if((mrb == NULL) || (dbg == NULL) || (method_name == NULL)) {
    230     return MRB_DEBUG_INVALID_ARGUMENT;
    231   }
    232 
    233   if(dbg->bpnum >= MAX_BREAKPOINT) {
     231  if ((mrb == NULL) || (dbg == NULL) || (method_name == NULL)) {
     232    return MRB_DEBUG_INVALID_ARGUMENT;
     233  }
     234
     235  if (dbg->bpnum >= MAX_BREAKPOINT) {
    234236    return MRB_DEBUG_BREAK_NUM_OVER;
    235237  }
    236238
    237   if(dbg->next_bpno > MAX_BREAKPOINTNO) {
     239  if (dbg->next_bpno > MAX_BREAKPOINTNO) {
    238240    return MRB_DEBUG_BREAK_NO_OVER;
    239241  }
    240242
    241   if(class_name != NULL) {
     243  if (class_name != NULL) {
    242244    set_class = mrb_malloc(mrb, strlen(class_name) + 1);
    243245    strncpy(set_class, class_name, strlen(class_name) + 1);
     
    264266
    265267int32_t
    266 mrb_debug_get_breaknum( mrb_state *mrb, mrb_debug_context *dbg )
    267 {
    268   if((mrb == NULL) || (dbg == NULL)) {
     268mrb_debug_get_breaknum(mrb_state *mrb, mrb_debug_context *dbg)
     269{
     270  if ((mrb == NULL) || (dbg == NULL)) {
    269271    return MRB_DEBUG_INVALID_ARGUMENT;
    270272  }
     
    273275}
    274276
    275 int32_t 
    276 mrb_debug_get_break_all( mrb_state *mrb, mrb_debug_context *dbg, uint32_t size, mrb_debug_breakpoint *bp )
     277int32_t
     278mrb_debug_get_break_all(mrb_state *mrb, mrb_debug_context *dbg, uint32_t size, mrb_debug_breakpoint *bp)
    277279{
    278280  uint32_t get_size = 0;
    279281
    280   if((mrb == NULL) || (dbg == NULL) || (bp == NULL)) {
    281     return MRB_DEBUG_INVALID_ARGUMENT;
    282   }
    283 
    284   if(dbg->bpnum >= size) {
     282  if ((mrb == NULL) || (dbg == NULL) || (bp == NULL)) {
     283    return MRB_DEBUG_INVALID_ARGUMENT;
     284  }
     285
     286  if (dbg->bpnum >= size) {
    285287    get_size = size;
    286288  }
     
    295297
    296298int32_t
    297 mrb_debug_get_break( mrb_state *mrb, mrb_debug_context *dbg, uint32_t bpno, mrb_debug_breakpoint *bp )
    298 {
    299   uint32_t index;
    300 
    301   if((mrb == NULL) || (dbg == NULL) || (bp == NULL)) {
     299mrb_debug_get_break(mrb_state *mrb, mrb_debug_context *dbg, uint32_t bpno, mrb_debug_breakpoint *bp)
     300{
     301  int32_t index;
     302
     303  if ((mrb == NULL) || (dbg == NULL) || (bp == NULL)) {
    302304    return MRB_DEBUG_INVALID_ARGUMENT;
    303305  }
    304306
    305307  index = get_break_index(dbg, bpno);
    306   if(index == MRB_DEBUG_BREAK_INVALID_NO) {
     308  if (index == MRB_DEBUG_BREAK_INVALID_NO) {
    307309    return MRB_DEBUG_BREAK_INVALID_NO;
    308310  }
     
    316318}
    317319
    318 int32_t 
    319 mrb_debug_delete_break( mrb_state *mrb, mrb_debug_context *dbg, uint32_t bpno )
     320int32_t
     321mrb_debug_delete_break(mrb_state *mrb, mrb_debug_context *dbg, uint32_t bpno)
    320322{
    321323  uint32_t i;
    322324  int32_t index;
    323325
    324   if((mrb == NULL) ||(dbg == NULL)) {
     326  if ((mrb == NULL) ||(dbg == NULL)) {
    325327    return MRB_DEBUG_INVALID_ARGUMENT;
    326328  }
    327329
    328330  index = get_break_index(dbg, bpno);
    329   if(index == MRB_DEBUG_BREAK_INVALID_NO) {
     331  if (index == MRB_DEBUG_BREAK_INVALID_NO) {
    330332    return MRB_DEBUG_BREAK_INVALID_NO;
    331333  }
     
    334336
    335337  for(i = index ; i < dbg->bpnum; i++) {
    336     if((i + 1) == dbg->bpnum) {
     338    if ((i + 1) == dbg->bpnum) {
    337339      memset(&dbg->bp[i], 0, sizeof(mrb_debug_breakpoint));
    338340    }
     
    347349}
    348350
    349 int32_t 
    350 mrb_debug_delete_break_all( mrb_state *mrb, mrb_debug_context *dbg )
    351 {
    352   uint32_t i;
    353 
    354   if((mrb == NULL) || (dbg == NULL)) {
     351int32_t
     352mrb_debug_delete_break_all(mrb_state *mrb, mrb_debug_context *dbg)
     353{
     354  uint32_t i;
     355
     356  if ((mrb == NULL) || (dbg == NULL)) {
    355357    return MRB_DEBUG_INVALID_ARGUMENT;
    356358  }
     
    365367}
    366368
    367 int32_t 
    368 mrb_debug_enable_break( mrb_state *mrb, mrb_debug_context *dbg, uint32_t bpno )
     369int32_t
     370mrb_debug_enable_break(mrb_state *mrb, mrb_debug_context *dbg, uint32_t bpno)
    369371{
    370372  int32_t index = 0;
    371373
    372   if((mrb == NULL) || (dbg == NULL)) {
     374  if ((mrb == NULL) || (dbg == NULL)) {
    373375    return MRB_DEBUG_INVALID_ARGUMENT;
    374376  }
    375377
    376378  index = get_break_index(dbg, bpno);
    377   if(index == MRB_DEBUG_BREAK_INVALID_NO) {
     379  if (index == MRB_DEBUG_BREAK_INVALID_NO) {
    378380    return MRB_DEBUG_BREAK_INVALID_NO;
    379381  }
     
    385387
    386388int32_t
    387 mrb_debug_enable_break_all( mrb_state *mrb, mrb_debug_context *dbg )
    388 {
    389   uint32_t i;
    390 
    391   if((mrb == NULL) || (dbg == NULL)) {
     389mrb_debug_enable_break_all(mrb_state *mrb, mrb_debug_context *dbg)
     390{
     391  uint32_t i;
     392
     393  if ((mrb == NULL) || (dbg == NULL)) {
    392394    return MRB_DEBUG_INVALID_ARGUMENT;
    393395  }
     
    400402}
    401403
    402 int32_t 
    403 mrb_debug_disable_break( mrb_state *mrb, mrb_debug_context *dbg, uint32_t bpno )
     404int32_t
     405mrb_debug_disable_break(mrb_state *mrb, mrb_debug_context *dbg, uint32_t bpno)
    404406{
    405407  int32_t index = 0;
    406408
    407   if((mrb == NULL) || (dbg == NULL)) {
     409  if ((mrb == NULL) || (dbg == NULL)) {
    408410    return MRB_DEBUG_INVALID_ARGUMENT;
    409411  }
    410412
    411413  index = get_break_index(dbg, bpno);
    412   if(index == MRB_DEBUG_BREAK_INVALID_NO) {
     414  if (index == MRB_DEBUG_BREAK_INVALID_NO) {
    413415    return MRB_DEBUG_BREAK_INVALID_NO;
    414416  }
     
    419421}
    420422
    421 int32_t 
    422 mrb_debug_disable_break_all( mrb_state *mrb, mrb_debug_context *dbg )
    423 {
    424   uint32_t i;
    425 
    426   if((mrb == NULL) || (dbg == NULL)) {
     423int32_t
     424mrb_debug_disable_break_all(mrb_state *mrb, mrb_debug_context *dbg)
     425{
     426  uint32_t i;
     427
     428  if ((mrb == NULL) || (dbg == NULL)) {
    427429    return MRB_DEBUG_INVALID_ARGUMENT;
    428430  }
     
    436438
    437439static mrb_bool
    438 check_start_pc_for_line( mrb_irep *irep, mrb_code *pc, uint16_t line )
    439 {
    440   if( pc > irep->iseq ) {
    441     if( line == mrb_debug_get_line(irep, (uint32_t)(pc - irep->iseq - 1))) {
     440check_start_pc_for_line(mrb_irep *irep, mrb_code *pc, uint16_t line)
     441{
     442  if (pc > irep->iseq) {
     443    if (line == mrb_debug_get_line(irep, (uint32_t)(pc - irep->iseq - 1))) {
    442444      return FALSE;
    443445    }
     
    447449
    448450int32_t
    449 mrb_debug_check_breakpoint_line( mrb_state *mrb, mrb_debug_context *dbg, const char *file, uint16_t line )
     451mrb_debug_check_breakpoint_line(mrb_state *mrb, mrb_debug_context *dbg, const char *file, uint16_t line)
    450452{
    451453  mrb_debug_breakpoint *bp;
    452454  mrb_debug_linepoint *line_p;
    453   int i;
    454 
    455   if((mrb == NULL) || (dbg == NULL) || (file == NULL) || (line <= 0)) {
    456     return MRB_DEBUG_INVALID_ARGUMENT;
    457   }
    458 
    459   if(!check_start_pc_for_line(dbg->irep, dbg->pc, line)) {
     455  uint32_t i;
     456
     457  if ((mrb == NULL) || (dbg == NULL) || (file == NULL) || (line <= 0)) {
     458    return MRB_DEBUG_INVALID_ARGUMENT;
     459  }
     460
     461  if (!check_start_pc_for_line(dbg->irep, dbg->pc, line)) {
    460462    return MRB_DEBUG_OK;
    461463  }
     
    465467    switch (bp->type) {
    466468      case MRB_DEBUG_BPTYPE_LINE:
    467         if(bp->enable == TRUE) {
     469        if (bp->enable == TRUE) {
    468470          line_p = &bp->point.linepoint;
    469           if((strcmp(line_p->file, file) == 0) && (line_p->lineno == line)) {
     471          if ((strcmp(line_p->file, file) == 0) && (line_p->lineno == line)) {
    470472            return bp->bpno;
    471473          }
     
    484486
    485487
    486 int32_t 
    487 mrb_debug_check_breakpoint_method( mrb_state *mrb, mrb_debug_context *dbg, struct RClass *class_obj, mrb_sym method_sym, mrb_bool* isCfunc )
     488int32_t
     489mrb_debug_check_breakpoint_method(mrb_state *mrb, mrb_debug_context *dbg, struct RClass *class_obj, mrb_sym method_sym, mrb_bool* isCfunc)
    488490{
    489491  mrb_debug_breakpoint *bp;
    490492  int32_t bpno;
    491   int i;
    492 
    493   if((mrb == NULL) || (dbg == NULL) || (class_obj == NULL)) {
     493  uint32_t i;
     494
     495  if ((mrb == NULL) || (dbg == NULL) || (class_obj == NULL)) {
    494496    return MRB_DEBUG_INVALID_ARGUMENT;
    495497  }
     
    497499  bp = dbg->bp;
    498500  for(i=0; i<dbg->bpnum; i++) {
    499     if(bp->type == MRB_DEBUG_BPTYPE_METHOD) {
    500       if(bp->enable == TRUE) {
     501    if (bp->type == MRB_DEBUG_BPTYPE_METHOD) {
     502      if (bp->enable == TRUE) {
    501503        bpno = compare_break_method(mrb, bp, class_obj, method_sym, isCfunc);
    502         if(bpno > 0) {
     504        if (bpno > 0) {
    503505          return bpno;
    504506        }
    505507      }
    506508    }
    507     else if(bp->type == MRB_DEBUG_BPTYPE_NONE) {
     509    else if (bp->type == MRB_DEBUG_BPTYPE_NONE) {
    508510      break;
    509511    }
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.h

    r321 r331  
    77#define APIBREAK_H_
    88
    9 #include "mruby.h"
     9#include <mruby.h>
    1010#include "mrdb.h"
    1111
    12 int32_t mrb_debug_set_break_line( mrb_state *, mrb_debug_context *, const char *, uint16_t );
    13 int32_t mrb_debug_set_break_method( mrb_state *, mrb_debug_context *, const char *, const char * );
    14 int32_t mrb_debug_get_breaknum( mrb_state *, mrb_debug_context * );
    15 int32_t mrb_debug_get_break_all( mrb_state *, mrb_debug_context *, uint32_t, mrb_debug_breakpoint bp[]);
    16 int32_t mrb_debug_get_break( mrb_state *, mrb_debug_context *, uint32_t, mrb_debug_breakpoint * );
    17 int32_t mrb_debug_delete_break( mrb_state *, mrb_debug_context *, uint32_t );
    18 int32_t mrb_debug_delete_break_all( mrb_state *, mrb_debug_context * );
    19 int32_t mrb_debug_enable_break( mrb_state *, mrb_debug_context *, uint32_t );
    20 int32_t mrb_debug_enable_break_all( mrb_state *, mrb_debug_context * );
    21 int32_t mrb_debug_disable_break( mrb_state *, mrb_debug_context *, uint32_t );
    22 int32_t mrb_debug_disable_break_all( mrb_state *, mrb_debug_context * );
    23 int32_t mrb_debug_check_breakpoint_line( mrb_state *, mrb_debug_context *, const char *, uint16_t );
    24 int32_t mrb_debug_check_breakpoint_method( mrb_state *, mrb_debug_context *, struct RClass *, mrb_sym, mrb_bool* );
     12int32_t mrb_debug_set_break_line(mrb_state *, mrb_debug_context *, const char *, uint16_t);
     13int32_t mrb_debug_set_break_method(mrb_state *, mrb_debug_context *, const char *, const char *);
     14int32_t mrb_debug_get_breaknum(mrb_state *, mrb_debug_context *);
     15int32_t mrb_debug_get_break_all(mrb_state *, mrb_debug_context *, uint32_t, mrb_debug_breakpoint bp[]);
     16int32_t mrb_debug_get_break(mrb_state *, mrb_debug_context *, uint32_t, mrb_debug_breakpoint *);
     17int32_t mrb_debug_delete_break(mrb_state *, mrb_debug_context *, uint32_t);
     18int32_t mrb_debug_delete_break_all(mrb_state *, mrb_debug_context *);
     19int32_t mrb_debug_enable_break(mrb_state *, mrb_debug_context *, uint32_t);
     20int32_t mrb_debug_enable_break_all(mrb_state *, mrb_debug_context *);
     21int32_t mrb_debug_disable_break(mrb_state *, mrb_debug_context *, uint32_t);
     22int32_t mrb_debug_disable_break_all(mrb_state *, mrb_debug_context *);
     23int32_t mrb_debug_check_breakpoint_line(mrb_state *, mrb_debug_context *, const char *, uint16_t);
     24int32_t mrb_debug_check_breakpoint_method(mrb_state *, mrb_debug_context *, struct RClass *, mrb_sym, mrb_bool*);
    2525
    2626#endif /* APIBREAK_H_ */
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c

    r321 r331  
    1010#include "mrdberror.h"
    1111#include "apilist.h"
    12 #include "mruby/compile.h"
    13 #include "mruby/irep.h"
    14 #include "mruby/debug.h"
     12#include <mruby/compile.h>
     13#include <mruby/irep.h>
     14#include <mruby/debug.h>
    1515
    1616#define LINE_BUF_SIZE MAX_COMMAND_LINE
     
    7272
    7373  p = strrchr(path, '/');
    74   len = p != NULL ? p - path : strlen(path);
     74  len = p != NULL ? (size_t)(p - path) : strlen(path);
    7575
    7676  dir = mrb_malloc(mrb, len + 1);
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.h

    r321 r331  
    66#define APILIST_H_
    77
    8 #include "mruby.h"
     8#include <mruby.h>
    99#include "mrdb.h"
    1010
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c

    r321 r331  
    66#include <string.h>
    77#include "mrdb.h"
    8 #include "mruby/value.h"
    9 #include "mruby/class.h"
    10 #include "mruby/compile.h"
    11 #include "mruby/error.h"
    12 #include "mruby/numeric.h"
    13 #include "mruby/string.h"
     8#include <mruby/value.h>
     9#include <mruby/class.h>
     10#include <mruby/compile.h>
     11#include <mruby/error.h>
     12#include <mruby/numeric.h>
     13#include <mruby/string.h>
    1414#include "apiprint.h"
    1515
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h

    r321 r331  
    66#define APIPRINT_H_
    77
    8 #include "mruby.h"
     8#include <mruby.h>
    99#include "mrdb.h"
    1010
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/cmdbreak.c

    r321 r331  
    66#include <ctype.h>
    77#include <string.h>
    8 #include "mruby.h"
    9 #include "mruby/dump.h"
    10 #include "mruby/debug.h"
    11 #include "mruby/string.h"
     8#include <mruby.h>
     9#include <mruby/dump.h>
     10#include <mruby/debug.h>
     11#include <mruby/string.h>
    1212#include "mrdb.h"
    1313#include "mrdberror.h"
     
    7171  uint32_t l;
    7272
    73   if((*ps == '0')||(strlen(ps) >= BPNO_LETTER_NUM)) {
     73  if ((*ps == '0')||(strlen(ps) >= BPNO_LETTER_NUM)) {
    7474    return 0;
    7575  }
    7676
    77   while( !(ISBLANK(*ps)||ISCNTRL(*ps)) ) {
    78     if(!ISDIGIT(*ps)) {
     77  while (!(ISBLANK(*ps)||ISCNTRL(*ps))) {
     78    if (!ISDIGIT(*ps)) {
    7979      return 0;
    8080    }
     
    9191  int32_t ret = MRB_DEBUG_OK;
    9292
    93   if(mrdb->wcnt == 1) {
     93  if (mrdb->wcnt == 1) {
    9494    ret = func(mrb, mrdb->dbg);
    9595    print_api_common_error(ret);
     
    110110    ps = mrdb->words[i];
    111111    bpno = parse_breakpoint_no(ps);
    112     if(bpno == 0) {
     112    if (bpno == 0) {
    113113      printf(BREAK_ERR_MSG_INVALIDBPNO, ps);
    114114      break;
    115115    }
    116116    ret = func(mrb, mrdb->dbg, (uint32_t)bpno);
    117     if(ret == MRB_DEBUG_BREAK_INVALID_NO) {
     117    if (ret == MRB_DEBUG_BREAK_INVALID_NO) {
    118118      printf(BREAK_ERR_MSG_NOBPNO, bpno);
    119119    }
    120     else if(ret != MRB_DEBUG_OK) {
     120    else if (ret != MRB_DEBUG_OK) {
    121121      print_api_common_error(ret);
    122122    }
     
    129129  char* ps = args;
    130130
    131   if(ISBLANK(*ps)||ISCNTRL(*ps)) {
     131  if (ISBLANK(*ps)||ISCNTRL(*ps)) {
    132132    puts(BREAK_ERR_MSG_BLANK);
    133133    return MRB_DEBUG_BPTYPE_NONE;
    134134  }
    135135
    136   if(!ISDIGIT(*ps)) {
     136  if (!ISDIGIT(*ps)) {
    137137    return MRB_DEBUG_BPTYPE_METHOD;
    138138  }
    139139
    140   while( !(ISBLANK(*ps)||ISCNTRL(*ps)) ) {
    141     if(!ISDIGIT(*ps)) {
     140  while (!(ISBLANK(*ps)||ISCNTRL(*ps))) {
     141    if (!ISDIGIT(*ps)) {
    142142      printf(BREAK_ERR_MSG_INVALIDSTR, args);
    143143      return MRB_DEBUG_BPTYPE_NONE;
     
    146146  }
    147147
    148   if((*args == '0')||(strlen(args) >= LINENO_MAX_DIGIT)) {
     148  if ((*args == '0')||(strlen(args) >= LINENO_MAX_DIGIT)) {
    149149    puts(BREAK_ERR_MSG_RANGEOVER);
    150150    return MRB_DEBUG_BPTYPE_NONE;
     
    159159  const char* enable_letter[] = {BREAK_INFO_MSG_DISABLE, BREAK_INFO_MSG_ENABLE};
    160160
    161   if(bp->type == MRB_DEBUG_BPTYPE_LINE) {
     161  if (bp->type == MRB_DEBUG_BPTYPE_LINE) {
    162162    printf(BREAK_INFO_MSG_LINEBREAK,
    163163      bp->bpno, enable_letter[bp->enable], bp->point.linepoint.file, bp->point.linepoint.lineno);
    164164  }
    165165  else {
    166     if(bp->point.methodpoint.class_name == NULL) {
     166    if (bp->point.methodpoint.class_name == NULL) {
    167167      printf(BREAK_INFO_MSG_METHODBREAK_NOCLASS,
    168168        bp->bpno, enable_letter[bp->enable], bp->point.methodpoint.method_name);
     
    184184
    185185  bpnum = mrb_debug_get_breaknum(mrb, mrdb->dbg);
    186   if(bpnum < 0) {
     186  if (bpnum < 0) {
    187187    print_api_common_error(bpnum);
    188188    return;
    189189  }
    190   else if(bpnum == 0) {
     190  else if (bpnum == 0) {
    191191    puts(BREAK_ERR_MSG_NOBPNO_INFOALL);
    192192    return;
     
    195195
    196196  ret = mrb_debug_get_break_all(mrb, mrdb->dbg, (uint32_t)bpnum, bp_list);
    197   if(ret < 0) {
     197  if (ret < 0) {
    198198    print_api_common_error(ret);
    199199    return;
     
    220220    ps = mrdb->words[i];
    221221    bpno = parse_breakpoint_no(ps);
    222     if(bpno == 0) {
     222    if (bpno == 0) {
    223223      puts(BREAK_ERR_MSG_INVALIDBPNO_INFO);
    224224      break;
     
    226226
    227227    ret = mrb_debug_get_break(mrb, mrdb->dbg, bpno, &bp);
    228     if(ret == MRB_DEBUG_BREAK_INVALID_NO) {
     228    if (ret == MRB_DEBUG_BREAK_INVALID_NO) {
    229229      printf(BREAK_ERR_MSG_NOBPNO_INFO, bpno);
    230230      break;
    231231    }
    232     else if(ret != MRB_DEBUG_OK) {
     232    else if (ret != MRB_DEBUG_OK) {
    233233      print_api_common_error(ret);
    234234      break;
    235235    }
    236     else if(isFirst == TRUE) {
     236    else if (isFirst == TRUE) {
    237237      isFirst = FALSE;
    238238      puts(BREAK_INFO_MSG_HEADER);
     
    251251  uint32_t l;
    252252
    253   if(mrdb->wcnt <= 1) {
     253  if (mrdb->wcnt <= 1) {
    254254    puts(BREAK_ERR_MSG_BLANK);
    255255    return MRB_DEBUG_BPTYPE_NONE;
     
    257257
    258258  args = mrdb->words[1];
    259   if((body = strrchr(args, ':')) == NULL) {
     259  if ((body = strrchr(args, ':')) == NULL) {
    260260    body = args;
    261261    type = check_bptype(body);
    262   } else {
    263     if(body == args) {
     262  }
     263  else {
     264    if (body == args) {
    264265      printf(BREAK_ERR_MSG_INVALIDSTR, args);
    265266      return MRB_DEBUG_BPTYPE_NONE;
     
    272273    case MRB_DEBUG_BPTYPE_LINE:
    273274      STRTOUL(l, body);
    274       if( l <= 65535 ) {
     275      if (l <= 65535) {
    275276        *line = l;
    276277        *file = (body == args)? mrb_debug_get_filename(dbg->irep, (uint32_t)(dbg->pc - dbg->irep->iseq)): args;
    277       } else {
     278      }
     279      else {
    278280        puts(BREAK_ERR_MSG_RANGEOVER);
    279281        type = MRB_DEBUG_BPTYPE_NONE;
     
    281283      break;
    282284    case MRB_DEBUG_BPTYPE_METHOD:
    283       if(body == args) {
     285      if (body == args) {
    284286        /* method only */
    285         if( ISUPPER(*body)||ISLOWER(*body)||(*body == '_') ) {
     287        if (ISUPPER(*body)||ISLOWER(*body)||(*body == '_')) {
    286288          *method = body;
    287289          *cname = NULL;
    288         } else {
     290        }
     291        else {
    289292          printf(BREAK_ERR_MSG_INVALIDMETHOD, args);
    290293          type = MRB_DEBUG_BPTYPE_NONE;
    291294        }
    292       } else {
    293         if( ISUPPER(*args) ) {
     295      }
     296      else {
     297        if (ISUPPER(*args)) {
    294298          switch(*body) {
    295299            case '@': case '$': case '?': case '.': case ',': case ':':
     
    303307            break;
    304308          }
    305         } else {
     309        }
     310        else {
    306311          printf(BREAK_ERR_MSG_INVALIDCLASS, args);
    307312          type = MRB_DEBUG_BPTYPE_NONE;
     
    344349    if (type == MRB_DEBUG_BPTYPE_LINE) {
    345350      printf(BREAK_SET_MSG_LINE, ret, file, line);
    346     } else if ((type == MRB_DEBUG_BPTYPE_METHOD)&&(cname == NULL)) {
     351    }
     352    else if ((type == MRB_DEBUG_BPTYPE_METHOD)&&(cname == NULL)) {
    347353      printf(BREAK_SET_MSG_METHOD, ret, method);
    348     } else {
     354    }
     355    else {
    349356      printf(BREAK_SET_MSG_CLASS_METHOD, ret, cname, method);
    350357    }
    351   } else {
     358  }
     359  else {
    352360    switch (ret) {
    353361      case MRB_DEBUG_BREAK_INVALID_LINENO:
     
    380388dbgcmd_info_break(mrb_state *mrb, mrdb_state *mrdb)
    381389{
    382   if(mrdb->wcnt == 2) {
     390  if (mrdb->wcnt == 2) {
    383391    info_break_all(mrb, mrdb);
    384392  }
     
    396404
    397405  ret = exe_set_command_all(mrb, mrdb, mrb_debug_delete_break_all);
    398   if(ret != TRUE) {
     406  if (ret != TRUE) {
    399407    exe_set_command_select(mrb, mrdb, mrb_debug_delete_break);
    400408  }
     
    409417
    410418  ret = exe_set_command_all(mrb, mrdb, mrb_debug_enable_break_all);
    411   if(ret != TRUE) {
     419  if (ret != TRUE) {
    412420    exe_set_command_select(mrb, mrdb, mrb_debug_enable_break);
    413421  }
     
    422430
    423431  ret = exe_set_command_all(mrb, mrdb, mrb_debug_disable_break_all);
    424   if(ret != TRUE) {
     432  if (ret != TRUE) {
    425433    exe_set_command_select(mrb, mrdb, mrb_debug_disable_break);
    426434  }
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c

    r321 r331  
    99
    1010#include "apilist.h"
    11 #include "mruby/compile.h"
     11#include <mruby/compile.h>
    1212
    1313typedef struct help_msg {
     
    334334    return FALSE;
    335335  }
    336   if((lbracket = strchr(pattern, '[')) == NULL) {
     336  if ((lbracket = strchr(pattern, '[')) == NULL) {
    337337    return !strcmp(pattern, cmd);
    338338  }
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c

    r321 r331  
    66#include <string.h>
    77#include "mrdb.h"
    8 #include "mruby/value.h"
    9 #include "mruby/class.h"
    10 #include "mruby/compile.h"
    11 #include "mruby/error.h"
    12 #include "mruby/numeric.h"
    13 #include "mruby/string.h"
     8#include <mruby/value.h>
     9#include <mruby/class.h>
     10#include <mruby/compile.h>
     11#include <mruby/error.h>
     12#include <mruby/numeric.h>
     13#include <mruby/string.h>
    1414#include "apiprint.h"
    1515
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/cmdrun.c

    r321 r331  
    44*/
    55
    6 #include "mruby/opcode.h"
     6#include <mruby/opcode.h>
    77#include "mrdb.h"
    88
     
    1212  mrb_debug_context *dbg = mrdb->dbg;
    1313
    14   if( dbg->xm == DBG_INIT ){
     14  if (dbg->xm == DBG_INIT){
    1515    dbg->xm = DBG_RUN;
    16   } else {
     16  }
     17  else {
    1718    dbg->xm = DBG_QUIT;
    18     if( dbg->xphase == DBG_PHASE_RUNNING ){
     19    if (dbg->xphase == DBG_PHASE_RUNNING){
    1920      struct RClass *exc;
    2021      puts("Start it from the beginning.");
     
    2324    }
    2425  }
    25  
     26
    2627  return DBGST_RESTART;
    2728}
     
    3334  int ccnt = 1;
    3435
    35   if( mrdb->wcnt > 1 ){
     36  if (mrdb->wcnt > 1){
    3637    sscanf(mrdb->words[1], "%d", &ccnt);
    3738  }
    3839  dbg->ccnt = (uint16_t)(ccnt > 0 ? ccnt : 1);  /* count of continue */
    3940
    40   if( dbg->xphase == DBG_PHASE_AFTER_RUN ){
     41  if (dbg->xphase == DBG_PHASE_AFTER_RUN){
    4142    puts("The program is not running.");
    4243    dbg->xm = DBG_QUIT;
    43   } else {
     44  }
     45  else {
    4446    dbg->xm = DBG_RUN;
    4547  }
     
    5355  return DBGST_CONTINUE;
    5456}
     57
     58dbgcmd_state
     59dbgcmd_next(mrb_state *mrb, mrdb_state *mrdb)
     60{
     61  mrdb->dbg->xm = DBG_NEXT;
     62  mrdb->dbg->prvci = mrb->c->ci;
     63  return DBGST_CONTINUE;
     64}
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c

    r321 r331  
    99#include <ctype.h>
    1010
    11 #include "mruby.h"
    12 #include "mruby/dump.h"
    13 #include "mruby/debug.h"
    14 #include "mruby/class.h"
    15 #include "mruby/opcode.h"
    16 #include "mruby/variable.h"
     11#include <mruby.h>
     12#include <mruby/dump.h>
     13#include <mruby/debug.h>
     14#include <mruby/class.h>
     15#include <mruby/opcode.h>
     16#include <mruby/variable.h>
    1717
    1818#include "mrdb.h"
     
    5858  {"run",       NULL,           1, 0, 0, DBGCMD_RUN,            dbgcmd_run},             /* r[un] */
    5959  {"step",      NULL,           1, 0, 1, DBGCMD_STEP,           dbgcmd_step},            /* s[tep] */
     60  {"next",      NULL,           1, 0, 1, DBGCMD_NEXT,           dbgcmd_next},            /* n[ext] */
    6061  {NULL}
    6162};
     
    406407
    407408  ret = mrb_debug_get_break(mrb, mrdb->dbg, mrdb->dbg->stopped_bpno, &bp);
    408   if(ret == 0) {
     409  if (ret == 0) {
    409410    switch(bp.type) {
    410411      case MRB_DEBUG_BPTYPE_LINE:
     
    416417        method_name = bp.point.methodpoint.method_name;
    417418        class_name = bp.point.methodpoint.class_name;
    418         if(class_name == NULL) {
     419        if (class_name == NULL) {
    419420          printf("Breakpoint %d, %s\n", bp.bpno, method_name);
    420421        }
     
    422423          printf("Breakpoint %d, %s:%s\n", bp.bpno, class_name, method_name);
    423424        }
    424         if(mrdb->dbg->isCfunc) {
     425        if (mrdb->dbg->isCfunc) {
    425426          printf("Stopped before calling the C function.\n");
    426427        }
     
    445446  char* file = mrb_debug_get_source(mrb, mrdb, mrdb->srcpath, mrdb->dbg->prvfile);
    446447  uint16_t lineno = mrdb->dbg->prvline;
    447   if(file != NULL) {
     448  if (file != NULL) {
    448449    mrb_debug_list(mrb, mrdb->dbg, file, lineno, lineno);
    449450    mrb_free(mrb, file);
     
    531532      break;
    532533  }
    533   if(sym != 0) {
     534  if (sym != 0) {
    534535    dbg->method_bpno = mrb_debug_check_breakpoint_method(mrb, dbg, c, sym, &isCfunc);
    535     if(isCfunc) {
     536    if (isCfunc) {
    536537      bpno = dbg->method_bpno;
    537538      dbg->method_bpno = 0;
     
    557558  dbg->regs = regs;
    558559
    559   if(dbg->xphase == DBG_PHASE_RESTART) {
     560  if (dbg->xphase == DBG_PHASE_RESTART) {
    560561    dbg->root_irep = irep;
    561562    dbg->prvfile = NULL;
    562563    dbg->prvline = 0;
     564    dbg->prvci = NULL;
    563565    dbg->xm = DBG_RUN;
    564566    dbg->xphase = DBG_PHASE_RUNNING;
     
    570572  switch (dbg->xm) {
    571573  case DBG_STEP:
    572   case DBG_NEXT:  // temporary
    573574    if (!file || (dbg->prvfile == file && dbg->prvline == line)) {
    574575      return;
     
    576577    dbg->method_bpno = 0;
    577578    dbg->bm = BRK_STEP;
     579    break;
     580
     581  case DBG_NEXT:
     582    if (!file || (dbg->prvfile == file && dbg->prvline == line)) {
     583      return;
     584    }
     585    if ((intptr_t)(dbg->prvci) < (intptr_t)(mrb->c->ci)) {
     586      return;
     587    }
     588    dbg->prvci = NULL;
     589    dbg->method_bpno = 0;
     590    dbg->bm = BRK_NEXT;
    578591    break;
    579592
     
    611624  dbg->prvline = line;
    612625
    613   if(dbg->bm == BRK_BREAK && --dbg->ccnt > 0) {
     626  if (dbg->bm == BRK_BREAK && --dbg->ccnt > 0) {
    614627    return;
    615628  }
     
    634647    st = cmd->func(mrb, mrdb);
    635648
    636     if( (st == DBGST_CONTINUE) || (st == DBGST_RESTART) ) break;
     649    if ((st == DBGST_CONTINUE) || (st == DBGST_RESTART)) break;
    637650  }
    638651  return dbg->xm;
     
    671684  mrdb->srcpath = args.srcpath;
    672685
    673   if(mrdb->dbg->xm == DBG_QUIT) {
     686  if (mrdb->dbg->xm == DBG_QUIT) {
    674687    mrdb->dbg->xphase = DBG_PHASE_RESTART;
    675688  }
     
    679692  mrdb->dbg->xm = DBG_INIT;
    680693  mrdb->dbg->ccnt = 1;
    681  
     694
    682695  /* setup hook functions */
    683696  mrb->code_fetch_hook = mrb_code_fetch_hook;
     
    726739    }
    727740  }
    728  
     741
    729742  mrdb->dbg->prvfile = "-";
    730743  mrdb->dbg->prvline = 0;
    731  
     744
    732745  while (1) {
    733746    cmd = get_and_parse_command(mrb, mrdb);
    734747    mrb_assert(cmd);
    735    
     748
    736749    if (cmd->id == DBGCMD_QUIT) {
    737750      break;
    738751    }
    739    
    740     if( cmd->func(mrb, mrdb) == DBGST_RESTART ) goto l_restart;
    741   }
    742  
     752
     753    if ( cmd->func(mrb, mrdb) == DBGST_RESTART ) goto l_restart;
     754  }
     755
    743756  cleanup(mrb, &args);
    744757
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h

    r321 r331  
    77#define MRDB_H
    88
    9 #include "mruby.h"
     9#include <mruby.h>
    1010
    1111#include "mrdbconf.h"
     
    110110  const char *prvfile;
    111111  int32_t prvline;
     112  mrb_callinfo *prvci;
    112113
    113114  mrdb_exemode xm;
     
    147148dbgcmd_state dbgcmd_continue(mrb_state*, mrdb_state*);
    148149dbgcmd_state dbgcmd_step(mrb_state*, mrdb_state*);
     150dbgcmd_state dbgcmd_next(mrb_state*, mrdb_state*);
    149151/* cmdbreak.c */
    150152dbgcmd_state dbgcmd_break(mrb_state*, mrdb_state*);
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c

    r321 r331  
    1111#include <stdio.h>
    1212#include <ctype.h>
     13
     14#include <signal.h>
     15#include <setjmp.h>
    1316
    1417#ifdef ENABLE_READLINE
     
    3033#endif
    3134
    32 #include "mruby.h"
    33 #include "mruby/array.h"
    34 #include "mruby/proc.h"
    35 #include "mruby/compile.h"
    36 #include "mruby/string.h"
     35#ifndef _WIN32
     36#define MIRB_SIGSETJMP(env) sigsetjmp(env, 1)
     37#define MIRB_SIGLONGJMP(env, val) siglongjmp(env, val)
     38#define SIGJMP_BUF sigjmp_buf
     39#else
     40#define MIRB_SIGSETJMP(env) setjmp(env)
     41#define MIRB_SIGLONGJMP(env, val) longjmp(env, val)
     42#define SIGJMP_BUF jmp_buf
     43#endif
     44
     45#include <mruby.h>
     46#include <mruby/array.h>
     47#include <mruby/proc.h>
     48#include <mruby/compile.h>
     49#include <mruby/string.h>
    3750
    3851#ifdef ENABLE_READLINE
     
    195208
    196209struct _args {
     210  FILE *rfp;
    197211  mrb_bool verbose      : 1;
    198212  int argc;
     
    252266    }
    253267  }
     268
     269  if (args->rfp == NULL) {
     270    if (*argv != NULL) {
     271      args->rfp = fopen(argv[0], "r");
     272      if (args->rfp == NULL) {
     273        printf("Cannot open program file. (%s)\n", *argv);
     274        return EXIT_FAILURE;
     275      }
     276      argc--; argv++;
     277    }
     278  }
     279  args->argv = (char **)mrb_realloc(mrb, args->argv, sizeof(char*) * (argc + 1));
     280  memcpy(args->argv, argv, (argc+1) * sizeof(char*));
     281  args->argc = argc;
     282
    254283  return EXIT_SUCCESS;
    255284}
     
    258287cleanup(mrb_state *mrb, struct _args *args)
    259288{
     289  if (args->rfp)
     290    fclose(args->rfp);
     291  mrb_free(mrb, args->argv);
    260292  mrb_close(mrb);
    261293}
     
    308340}
    309341
     342
     343#ifndef ENABLE_READLINE
     344volatile sig_atomic_t input_canceled = 0;
     345void
     346ctrl_c_handler(int signo)
     347{
     348  input_canceled = 1;
     349}
     350#else
     351SIGJMP_BUF ctrl_c_buf;
     352void
     353ctrl_c_handler(int signo)
     354{
     355  MIRB_SIGLONGJMP(ctrl_c_buf, 1);
     356}
     357#endif
     358
    310359int
    311360main(int argc, char **argv)
    312361{
    313   char ruby_code[1024] = { 0 };
     362  char ruby_code[4096] = { 0 };
    314363  char last_code_line[1024] = { 0 };
    315364#ifndef ENABLE_READLINE
    316365  int last_char;
    317   int char_index;
     366  size_t char_index;
    318367#else
    319368  char *history_path;
     369  char* line;
    320370#endif
    321371  mrbc_context *cxt;
     
    324374  mrb_value result;
    325375  struct _args args;
     376  mrb_value ARGV;
    326377  int n;
     378  int i;
    327379  mrb_bool code_block_open = FALSE;
    328380  int ai;
     
    335387    return EXIT_FAILURE;
    336388  }
    337   mrb_define_global_const(mrb, "ARGV", mrb_ary_new_capa(mrb, 0));
    338389
    339390  n = parse_args(mrb, argc, argv, &args);
     
    343394    return n;
    344395  }
     396
     397  ARGV = mrb_ary_new_capa(mrb, args.argc);
     398  for (i = 0; i < args.argc; i++) {
     399    char* utf8 = mrb_utf8_from_locale(args.argv[i], -1);
     400    if (utf8) {
     401      mrb_ary_push(mrb, ARGV, mrb_str_new_cstr(mrb, utf8));
     402      mrb_utf8_free(utf8);
     403    }
     404  }
     405  mrb_define_global_const(mrb, "ARGV", ARGV);
    345406
    346407#ifdef ENABLE_READLINE
     
    369430    char *utf8;
    370431
     432    if (args.rfp) {
     433      if (fgets(last_code_line, sizeof(last_code_line)-1, args.rfp) != NULL)
     434        goto done;
     435      break;
     436    }
     437
    371438#ifndef ENABLE_READLINE
    372439    print_cmdline(code_block_open);
    373440
     441    signal(SIGINT, ctrl_c_handler);
    374442    char_index = 0;
    375443    while ((last_char = getchar()) != '\n') {
    376444      if (last_char == EOF) break;
    377       if (char_index > sizeof(last_code_line)-2) {
     445      if (char_index >= sizeof(last_code_line)-2) {
    378446        fputs("input string too long\n", stderr);
    379447        continue;
    380448      }
    381449      last_code_line[char_index++] = last_char;
     450    }
     451    signal(SIGINT, SIG_DFL);
     452    if (input_canceled) {
     453      ruby_code[0] = '\0';
     454      last_code_line[0] = '\0';
     455      code_block_open = FALSE;
     456      puts("^C");
     457      input_canceled = 0;
     458      continue;
    382459    }
    383460    if (last_char == EOF) {
     
    389466    last_code_line[char_index] = '\0';
    390467#else
    391     char* line = MIRB_READLINE(code_block_open ? "* " : "> ");
     468    if (MIRB_SIGSETJMP(ctrl_c_buf) == 0) {
     469      ;
     470    }
     471    else {
     472      ruby_code[0] = '\0';
     473      last_code_line[0] = '\0';
     474      code_block_open = FALSE;
     475      puts("^C");
     476    }
     477    signal(SIGINT, ctrl_c_handler);
     478    line = MIRB_READLINE(code_block_open ? "* " : "> ");
     479    signal(SIGINT, SIG_DFL);
     480
    392481    if (line == NULL) {
    393482      printf("\n");
     
    403492    free(line);
    404493#endif
     494
     495done:
    405496
    406497    if (code_block_open) {
     
    454545          mrb_codedump_all(mrb, proc);
    455546        }
    456         /* pass a proc for evaulation */
     547        /* pass a proc for evaluation */
    457548        /* evaluate the bytecode */
    458         result = mrb_context_run(mrb,
     549        result = mrb_vm_run(mrb,
    459550            proc,
    460551            mrb_top_self(mrb),
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c

    r321 r331  
    22#include <stdlib.h>
    33#include <string.h>
    4 #include "mruby.h"
    5 #include "mruby/compile.h"
    6 #include "mruby/dump.h"
    7 #include "mruby/proc.h"
     4#include <mruby.h>
     5#include <mruby/compile.h>
     6#include <mruby/dump.h>
     7#include <mruby/proc.h>
    88
    99#define RITEBIN_EXT ".mrb"
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-mruby-config/mrbgem.rake

    r321 r331  
    2424    config = Hash[open("#{build_dir}/lib/libmruby.flags.mak").read.split("\n").map {|x| a = x.split(/\s*=\s*/, 2); [a[0], a[1].gsub('\\"', '"') ]}]
    2525    IO.write(t.name, File.open(t.name) {|f|
    26       f.read.gsub (/echo (MRUBY_CFLAGS|MRUBY_LIBS|MRUBY_LDFLAGS_BEFORE_LIBS|MRUBY_LDFLAGS)/) {|x| config[$1].empty? ? '' : "echo #{config[$1]}"}
     26      f.read.gsub (/echo (MRUBY_CFLAGS|MRUBY_LIBS|MRUBY_LDFLAGS_BEFORE_LIBS|MRUBY_LDFLAGS|MRUBY_LIBMRUBY_PATH)/) {|x| config[$1].empty? ? '' : "echo #{config[$1]}"}
    2727    })
    2828    FileUtils.chmod(0755, t.name)
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-mruby-config/mruby-config

    r270 r331  
    77    --ldflags-before-libs) echo MRUBY_LDFLAGS_BEFORE_LIBS;;
    88    --libs) echo MRUBY_LIBS;;
     9    --libmruby-path) echo MRUBY_LIBMRUBY_PATH;;
    910    --help) echo "Usage: mruby-config [switches]"
    1011            echo "  switches:"
    1112            echo "  --cflags                    print flags passed to compiler"
    1213            echo "  --ldflags                   print flags passed to linker"
    13             echo "  --ldflags-before-libs       print flags passwd to linker before linked libraries"
     14            echo "  --ldflags-before-libs       print flags passed to linker before linked libraries"
    1415            echo "  --libs                      print linked libraries"
     16            echo "  --libmruby-path             print libmruby path"
    1517            exit 0;;
    1618  esac
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-mruby-config/mruby-config.bat

    r270 r331  
    88if "%0" equ "--ldflags-before-libs" goto ldflagsbeforelibs
    99if "%0" equ "--libs" goto libs
     10if "%0" equ "--libmruby-path" goto libmrubypath
    1011if "%0" equ "--help" goto showhelp
    1112echo Invalid Option
     
    2829goto top
    2930
     31:libmrubypath
     32echo MRUBY_LIBMRUBY_PATH
     33goto top
     34
    3035:showhelp
    3136echo Usage: mruby-config [switches]
     
    3338echo   --cflags                   print flags passed to compiler
    3439echo   --ldflags                  print flags passed to linker
    35 echo   --ldflags-before-libs      print flags passwd to linker before linked libraries
     40echo   --ldflags-before-libs      print flags passed to linker before linked libraries
    3641echo   --libs                     print linked libraries
     42echo   --libmruby-path            print libmruby path
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-mruby/bintest/mruby.rb

    r321 r331  
    33assert('regression for #1564') do
    44  o = `#{cmd('mruby')} -e #{shellquote('<<')} 2>&1`
    5   assert_equal o, "-e:1:2: syntax error, unexpected tLSHFT\n"
     5  assert_include o, "-e:1:2: syntax error"
    66  o = `#{cmd('mruby')} -e #{shellquote('<<-')} 2>&1`
    7   assert_equal o, "-e:1:3: syntax error, unexpected tLSHFT\n"
     7  assert_include o, "-e:1:3: syntax error"
    88end
    99
     
    4545  assert_equal "\"test\"\n\"fin\"\n", `#{cmd('mruby')} #{script.path}`
    4646end
     47
     48assert('garbage collecting built-in classes') do
     49  script = Tempfile.new('test.rb')
     50
     51  script.write <<RUBY
     52NilClass = nil
     53GC.start
     54Array.dup
     55print nil.class.to_s
     56RUBY
     57  script.flush
     58  assert_equal "NilClass", `#{cmd('mruby')} #{script.path}`
     59  assert_equal 0, $?.exitstatus
     60end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-mruby/mrbgem.rake

    r321 r331  
    55  spec.bins = %w(mruby)
    66  spec.add_dependency('mruby-compiler', :core => 'mruby-compiler')
     7  spec.add_dependency('mruby-error', :core => 'mruby-error')
     8
     9  if build.cxx_exception_enabled?
     10    @objs << build.compile_as_cxx("#{spec.dir}/tools/mruby/mruby.c", "#{spec.build_dir}/tools/mruby/mruby.cxx")
     11    @objs.delete_if { |v| v == objfile("#{spec.build_dir}/tools/mruby/mruby") }
     12  end
    713end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c

    r321 r331  
    22#include <stdlib.h>
    33#include <string.h>
    4 #include "mruby.h"
    5 #include "mruby/array.h"
    6 #include "mruby/compile.h"
    7 #include "mruby/dump.h"
    8 #include "mruby/variable.h"
     4#include <mruby.h>
     5#include <mruby/array.h>
     6#include <mruby/compile.h>
     7#include <mruby/dump.h>
     8#include <mruby/variable.h>
    99
    1010#ifdef MRB_DISABLE_STDIO
     
    189189    return n;
    190190  }
    191 
    192   ARGV = mrb_ary_new_capa(mrb, args.argc);
    193   for (i = 0; i < args.argc; i++) {
    194     char* utf8 = mrb_utf8_from_locale(args.argv[i], -1);
    195     if (utf8) {
    196       mrb_ary_push(mrb, ARGV, mrb_str_new_cstr(mrb, utf8));
     191  else {
     192    int ai = mrb_gc_arena_save(mrb);
     193    ARGV = mrb_ary_new_capa(mrb, args.argc);
     194    for (i = 0; i < args.argc; i++) {
     195      char* utf8 = mrb_utf8_from_locale(args.argv[i], -1);
     196      if (utf8) {
     197        mrb_ary_push(mrb, ARGV, mrb_str_new_cstr(mrb, utf8));
     198        mrb_utf8_free(utf8);
     199      }
     200    }
     201    mrb_define_global_const(mrb, "ARGV", ARGV);
     202
     203    c = mrbc_context_new(mrb);
     204    if (args.verbose)
     205      c->dump_result = TRUE;
     206    if (args.check_syntax)
     207      c->no_exec = TRUE;
     208
     209    /* Set $0 */
     210    zero_sym = mrb_intern_lit(mrb, "$0");
     211    if (args.rfp) {
     212      const char *cmdline;
     213      cmdline = args.cmdline ? args.cmdline : "-";
     214      mrbc_filename(mrb, c, cmdline);
     215      mrb_gv_set(mrb, zero_sym, mrb_str_new_cstr(mrb, cmdline));
     216    }
     217    else {
     218      mrbc_filename(mrb, c, "-e");
     219      mrb_gv_set(mrb, zero_sym, mrb_str_new_lit(mrb, "-e"));
     220    }
     221
     222    /* Load program */
     223    if (args.mrbfile) {
     224      v = mrb_load_irep_file_cxt(mrb, args.rfp, c);
     225    }
     226    else if (args.rfp) {
     227      v = mrb_load_file_cxt(mrb, args.rfp, c);
     228    }
     229    else {
     230      char* utf8 = mrb_utf8_from_locale(args.cmdline, -1);
     231      if (!utf8) abort();
     232      v = mrb_load_string_cxt(mrb, utf8, c);
    197233      mrb_utf8_free(utf8);
    198234    }
    199   }
    200   mrb_define_global_const(mrb, "ARGV", ARGV);
    201 
    202   c = mrbc_context_new(mrb);
    203   if (args.verbose)
    204     c->dump_result = TRUE;
    205   if (args.check_syntax)
    206     c->no_exec = TRUE;
    207 
    208   /* Set $0 */
    209   zero_sym = mrb_intern_lit(mrb, "$0");
    210   if (args.rfp) {
    211     const char *cmdline;
    212     cmdline = args.cmdline ? args.cmdline : "-";
    213     mrbc_filename(mrb, c, cmdline);
    214     mrb_gv_set(mrb, zero_sym, mrb_str_new_cstr(mrb, cmdline));
    215   }
    216   else {
    217     mrbc_filename(mrb, c, "-e");
    218     mrb_gv_set(mrb, zero_sym, mrb_str_new_lit(mrb, "-e"));
    219   }
    220 
    221   /* Load program */
    222   if (args.mrbfile) {
    223     v = mrb_load_irep_file_cxt(mrb, args.rfp, c);
    224   }
    225   else if (args.rfp) {
    226     v = mrb_load_file_cxt(mrb, args.rfp, c);
    227   }
    228   else {
    229     char* utf8 = mrb_utf8_from_locale(args.cmdline, -1);
    230     if (!utf8) abort();
    231     v = mrb_load_string_cxt(mrb, utf8, c);
    232     mrb_utf8_free(utf8);
    233   }
    234 
    235   mrbc_context_free(mrb, c);
    236   if (mrb->exc) {
    237     if (!mrb_undef_p(v)) {
    238       mrb_print_error(mrb);
    239     }
    240     n = -1;
    241   }
    242   else if (args.check_syntax) {
    243     printf("Syntax OK\n");
     235
     236    mrb_gc_arena_restore(mrb, ai);
     237    mrbc_context_free(mrb, c);
     238    if (mrb->exc) {
     239      if (mrb_undef_p(v)) {
     240        mrb_p(mrb, mrb_obj_value(mrb->exc));
     241      }
     242      else {
     243        mrb_print_error(mrb);
     244      }
     245      n = -1;
     246    }
     247    else if (args.check_syntax) {
     248      printf("Syntax OK\n");
     249    }
    244250  }
    245251  cleanup(mrb, &args);
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c

    r321 r331  
    22#include <stdlib.h>
    33#include <string.h>
    4 #include "mruby.h"
    5 #include "mruby/irep.h"
    6 #include "mruby/dump.h"
     4#include <mruby.h>
     5#include <mruby/irep.h>
     6#include <mruby/dump.h>
    77
    88struct strip_args {
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-compiler/bintest/mrbc.rb

    r321 r331  
    1111  assert_equal 0, $?.exitstatus
    1212end
     13
     14assert('parsing function with void argument') do
     15  a, out = Tempfile.new('a.rb'), Tempfile.new('out.mrb')
     16  a.write('f ()')
     17  a.flush
     18  result = `#{cmd('mrbc')} -c -o #{out.path} #{a.path} 2>&1`
     19  assert_equal "#{cmd('mrbc')}:#{a.path}:Syntax OK", result.chomp
     20  assert_equal 0, $?.exitstatus
     21end
     22
     23assert('embedded document with invalid terminator') do
     24  a, out = Tempfile.new('a.rb'), Tempfile.new('out.mrb')
     25  a.write("=begin\n=endx\n")
     26  a.flush
     27  result = `#{cmd('mrbc')} -c -o #{out.path} #{a.path} 2>&1`
     28  assert_equal "#{a.path}:3:0: embedded document meets end of file", result.chomp
     29  assert_equal 1, $?.exitstatus
     30end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-compiler/core/codegen.c

    r321 r331  
    99#include <stdlib.h>
    1010#include <string.h>
    11 #include "mruby.h"
    12 #include "mruby/compile.h"
    13 #include "mruby/proc.h"
    14 #include "mruby/numeric.h"
    15 #include "mruby/string.h"
    16 #include "mruby/debug.h"
     11#include <mruby.h>
     12#include <mruby/compile.h>
     13#include <mruby/proc.h>
     14#include <mruby/numeric.h>
     15#include <mruby/string.h>
     16#include <mruby/debug.h>
    1717#include "node.h"
    18 #include "mruby/opcode.h"
    19 #include "mruby/re.h"
    20 #include "mruby/throw.h"
     18#include <mruby/opcode.h>
     19#include <mruby/re.h>
     20#include <mruby/throw.h>
     21
     22#ifndef MRB_CODEGEN_LEVEL_MAX
     23#define MRB_CODEGEN_LEVEL_MAX 1024
     24#endif
    2125
    2226typedef mrb_ast_node node;
     
    7478  uint16_t filename_index;
    7579  parser_state* parser;
     80
     81  int rlev;                     /* recursion levels */
    7682} codegen_scope;
    7783
     
    94100  while (s->prev) {
    95101    codegen_scope *tmp = s->prev;
     102    mrb_free(s->mrb, s->iseq);
    96103    mrb_pool_close(s->mpool);
    97104    s = tmp;
    98105  }
    99 #ifndef MBB_DISABLE_STDIO
     106#ifndef MRB_DISABLE_STDIO
    100107  if (s->filename && s->lineno) {
    101108    fprintf(stderr, "codegen error:%s:%d: %s\n", s->filename, s->lineno, message);
     
    340347        }
    341348      }
     349      if (c0 == OP_LOADNIL) {
     350        if (GETARG_B(i) == GETARG_A(i0)) {
     351          s->pc--;
     352          return 0;
     353        }
     354      }
    342355      break;
    343356    case OP_JMPIF:
     
    381394    scope_error(s);
    382395    break;
     396  }
     397  if (diff > MAXARG_sBx) {
     398    codegen_error(s, "too distant jump address");
    383399  }
    384400  s->iseq[pc] = MKOP_AsBx(c, GETARG_A(i), diff);
     
    495511}
    496512
    497 static inline int
     513/* method symbols should be fit in 9 bits */
     514#define MAXMSYMLEN 512
     515/* maximum symbol numbers */
     516#define MAXSYMLEN 65536
     517
     518static int
    498519new_msym(codegen_scope *s, mrb_sym sym)
    499520{
     
    503524
    504525  len = s->irep->slen;
    505   if (len > 256) len = 256;
     526  if (len > MAXMSYMLEN) len = MAXMSYMLEN;
    506527  for (i=0; i<len; i++) {
    507528    if (s->irep->syms[i] == sym) return i;
    508529    if (s->irep->syms[i] == 0) break;
    509530  }
    510   if (i == 256) {
    511     codegen_error(s, "too many symbols (max 256)");
     531  if (i == MAXMSYMLEN) {
     532    codegen_error(s, "too many symbols (max " MRB_STRINGIZE(MAXMSYMLEN) ")");
    512533  }
    513534  s->irep->syms[i] = sym;
     
    516537}
    517538
    518 static inline int
     539static int
    519540new_sym(codegen_scope *s, mrb_sym sym)
    520541{
     
    524545    if (s->irep->syms[i] == sym) return i;
    525546  }
    526   if (s->irep->slen > 125 && s->irep->slen < 256) {
    527     s->irep->syms = (mrb_sym *)codegen_realloc(s, s->irep->syms, sizeof(mrb_sym)*65536);
    528     for (i = 0; i < 256 - s->irep->slen; i++) {
     547  if (s->irep->slen == MAXSYMLEN) {
     548    codegen_error(s, "too many symbols (max " MRB_STRINGIZE(MAXSYMLEN) ")");
     549  }
     550
     551  if (s->irep->slen > MAXMSYMLEN/2 && s->scapa == MAXMSYMLEN) {
     552    s->scapa = MAXSYMLEN;
     553    s->irep->syms = (mrb_sym *)codegen_realloc(s, s->irep->syms, sizeof(mrb_sym)*MAXSYMLEN);
     554    for (i = s->irep->slen; i < MAXMSYMLEN; i++) {
    529555      static const mrb_sym mrb_sym_zero = { 0 };
    530       s->irep->syms[i + s->irep->slen] = mrb_sym_zero;
    531     }
    532     s->irep->slen = 256;
     556      s->irep->syms[i] = mrb_sym_zero;
     557    }
     558    s->irep->slen = MAXMSYMLEN;
    533559  }
    534560  s->irep->syms[s->irep->slen] = sym;
     
    583609  push();                       /* push for a block parameter */
    584610
    585   lp = loop_push(s, LOOP_FOR);
    586   lp->pc1 = new_label(s);
    587 
    588611  /* generate loop variable */
    589612  n2 = tree->car;
     
    595618    gen_vmassignment(s, n2, 1, VAL);
    596619  }
     620  /* construct loop */
     621  lp = loop_push(s, LOOP_FOR);
     622  lp->pc2 = new_label(s);
     623
     624  /* loop body */
    597625  codegen(s, tree->cdr->cdr->car, VAL);
    598626  pop();
     
    645673    ba = tree->car->cdr->cdr->cdr->cdr ? 1 : 0;
    646674
     675    if (ma > 0x1f || oa > 0x1f || pa > 0x1f || ka > 0x1f) {
     676      codegen_error(s, "too many formal arguments");
     677    }
    647678    a = ((mrb_aspec)(ma & 0x1f) << 18)
    648679      | ((mrb_aspec)(oa & 0x1f) << 13)
     
    765796}
    766797
     798#define CALL_MAXARGS 127
     799
    767800static int
    768 gen_values(codegen_scope *s, node *t, int val)
     801gen_values(codegen_scope *s, node *t, int val, int extra)
    769802{
    770803  int n = 0;
     
    773806  while (t) {
    774807    is_splat = (intptr_t)t->car->car == NODE_SPLAT; /* splat mode */
    775     if (n >= 127 || is_splat) {
     808    if (
     809      n+extra >= CALL_MAXARGS - 1 /* need to subtract one because vm.c expects an array if n == CALL_MAXARGS */
     810      || is_splat) {
    776811      if (val) {
    777         pop_n(n);
    778         genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n));
    779         push();
    780         codegen(s, t->car, VAL);
    781         pop(); pop();
    782         if (is_splat) {
    783           genop(s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1));
     812        if (is_splat && n == 0 && (intptr_t)t->car->cdr->car == NODE_ARRAY) {
     813          codegen(s, t->car->cdr, VAL);
     814          pop();
    784815        }
    785816        else {
    786           genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
     817          pop_n(n);
     818          genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n));
     819          push();
     820          codegen(s, t->car, VAL);
     821          pop(); pop();
     822          if (is_splat) {
     823            genop(s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1));
     824          }
     825          else {
     826            genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
     827          }
    787828        }
    788829        t = t->cdr;
     
    801842      }
    802843      else {
    803         codegen(s, t->car->cdr, NOVAL);
    804         t = t->cdr;
    805844        while (t) {
    806845          codegen(s, t->car, NOVAL);
     
    818857}
    819858
    820 #define CALL_MAXARGS 127
    821 
    822859static void
    823 gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val)
     860gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe)
    824861{
    825862  mrb_sym sym = name ? name : sym(tree->cdr->car);
    826   int idx;
     863  int idx, skip = 0;
    827864  int n = 0, noop = 0, sendv = 0, blk = 0;
    828865
    829866  codegen(s, tree->car, VAL); /* receiver */
     867  if (safe) {
     868    int recv = cursp()-1;
     869    genop(s, MKOP_A(OP_LOADNIL, cursp()));
     870    push();
     871    genop(s, MKOP_AB(OP_MOVE, cursp(), recv));
     872    push(); pop();              /* space for a block */
     873    pop();
     874    idx = new_msym(s, mrb_intern_lit(s->mrb, "=="));
     875    genop(s, MKOP_ABC(OP_EQ, cursp(), idx, 1));
     876    skip = genop(s, MKOP_AsBx(OP_JMPIF, cursp(), 0));
     877  }
    830878  idx = new_msym(s, sym);
    831879  tree = tree->cdr->cdr->car;
    832880  if (tree) {
    833     n = gen_values(s, tree->car, VAL);
     881    n = gen_values(s, tree->car, VAL, sp?1:0);
    834882    if (n < 0) {
    835883      n = noop = sendv = 1;
     
    863911    const char *symname = mrb_sym2name_len(s->mrb, sym, &symlen);
    864912
    865     if (!noop && symlen == 1 && symname[0] == '+')  {
     913    if (!noop && symlen == 1 && symname[0] == '+' && n == 1)  {
    866914      genop_peep(s, MKOP_ABC(OP_ADD, cursp(), idx, n), val);
    867915    }
    868     else if (!noop && symlen == 1 && symname[0] == '-')  {
     916    else if (!noop && symlen == 1 && symname[0] == '-' && n == 1)  {
    869917      genop_peep(s, MKOP_ABC(OP_SUB, cursp(), idx, n), val);
    870918    }
    871     else if (!noop && symlen == 1 && symname[0] == '*')  {
     919    else if (!noop && symlen == 1 && symname[0] == '*' && n == 1)  {
    872920      genop(s, MKOP_ABC(OP_MUL, cursp(), idx, n));
    873921    }
    874     else if (!noop && symlen == 1 && symname[0] == '/')  {
     922    else if (!noop && symlen == 1 && symname[0] == '/' && n == 1)  {
    875923      genop(s, MKOP_ABC(OP_DIV, cursp(), idx, n));
    876924    }
    877     else if (!noop && symlen == 1 && symname[0] == '<')  {
     925    else if (!noop && symlen == 1 && symname[0] == '<' && n == 1)  {
    878926      genop(s, MKOP_ABC(OP_LT, cursp(), idx, n));
    879927    }
    880     else if (!noop && symlen == 2 && symname[0] == '<' && symname[1] == '=')  {
     928    else if (!noop && symlen == 2 && symname[0] == '<' && symname[1] == '=' && n == 1)  {
    881929      genop(s, MKOP_ABC(OP_LE, cursp(), idx, n));
    882930    }
    883     else if (!noop && symlen == 1 && symname[0] == '>')  {
     931    else if (!noop && symlen == 1 && symname[0] == '>' && n == 1)  {
    884932      genop(s, MKOP_ABC(OP_GT, cursp(), idx, n));
    885933    }
    886     else if (!noop && symlen == 2 && symname[0] == '>' && symname[1] == '=')  {
     934    else if (!noop && symlen == 2 && symname[0] == '>' && symname[1] == '=' && n == 1)  {
    887935      genop(s, MKOP_ABC(OP_GE, cursp(), idx, n));
    888936    }
    889     else if (!noop && symlen == 2 && symname[0] == '=' && symname[1] == '=')  {
     937    else if (!noop && symlen == 2 && symname[0] == '=' && symname[1] == '=' && n == 1)  {
    890938      genop(s, MKOP_ABC(OP_EQ, cursp(), idx, n));
    891939    }
     
    900948    }
    901949  }
     950  if (safe) {
     951    dispatch(s, skip);
     952  }
    902953  if (val) {
    903954    push();
     
    912963
    913964  tree = tree->cdr;
    914   switch ((intptr_t)type) {
     965  switch (type) {
    915966  case NODE_GVAR:
    916967    idx = new_sym(s, sym(tree));
     
    9621013
    9631014  case NODE_CALL:
     1015  case NODE_SCALL:
    9641016    push();
    965     gen_call(s, tree, attrsym(s, sym(tree->cdr->car)), sp, NOVAL);
     1017    gen_call(s, tree, attrsym(s, sym(tree->cdr->car)), sp, NOVAL,
     1018             type == NODE_SCALL);
    9661019    pop();
    9671020    if (val) {
     
    9801033  default:
    9811034#ifndef MRB_DISABLE_STDIO
    982     printf("unknown lhs %d\n", type);
     1035    fprintf(stderr, "unknown lhs %d\n", type);
    9831036#endif
    9841037    break;
     
    10331086      }
    10341087    }
    1035     push();
     1088    if (!val) {
     1089      push();
     1090    }
    10361091  }
    10371092}
     
    11761231
    11771232static void
     1233gen_retval(codegen_scope *s, node *tree)
     1234{
     1235  if ((intptr_t)tree->car == NODE_SPLAT) {
     1236    genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), 0));
     1237    push();
     1238    codegen(s, tree, VAL);
     1239    pop(); pop();
     1240    genop(s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1));
     1241  }
     1242  else {
     1243    codegen(s, tree, VAL);
     1244    pop();
     1245  }
     1246}
     1247
     1248static void
    11781249codegen(codegen_scope *s, node *tree, int val)
    11791250{
    11801251  int nt;
    1181 
    1182   if (!tree) return;
    1183 
     1252  int rlev = s->rlev;
     1253
     1254  if (!tree) {
     1255    if (val) {
     1256      genop(s, MKOP_A(OP_LOADNIL, cursp()));
     1257      push();
     1258    }
     1259    return;
     1260  }
     1261
     1262  s->rlev++;
     1263  if (s->rlev > MRB_CODEGEN_LEVEL_MAX) {
     1264    codegen_error(s, "too complex expression");
     1265  }
    11841266  if (s->irep && s->filename_index != tree->filename_index) {
    11851267    s->irep->filename = mrb_parser_get_filename(s->parser, s->filename_index);
     
    12101292      struct loopinfo *lp;
    12111293
     1294      if (tree->car == NULL) goto exit;
    12121295      onerr = genop(s, MKOP_Bx(OP_ONERR, 0));
    12131296      lp = loop_push(s, LOOP_BEGIN);
    12141297      lp->pc1 = onerr;
    1215       if (tree->car) {
    1216         codegen(s, tree->car, val);
    1217         if (val) pop();
    1218       }
     1298      codegen(s, tree->car, VAL);
     1299      pop();
    12191300      lp->type = LOOP_RESCUE;
    12201301      noexc = genop(s, MKOP_Bx(OP_JMP, 0));
     
    12271308        int exc = cursp();
    12281309
    1229         genop(s, MKOP_A(OP_RESCUE, exc));
     1310        genop(s, MKOP_ABC(OP_RESCUE, exc, 0, 0));
    12301311        push();
    12311312        while (n2) {
     
    12361317          pos2 = 0;
    12371318          do {
    1238             if (n4) {
     1319            if (n4 && n4->car && (intptr_t)n4->car->car == NODE_SPLAT) {
    12391320              codegen(s, n4->car, VAL);
    1240             }
    1241             else {
    1242               genop(s, MKOP_ABx(OP_GETCONST, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "StandardError"))));
    1243               push();
    1244             }
    1245             genop(s, MKOP_AB(OP_MOVE, cursp(), exc));
    1246             pop();
    1247             if (n4 && n4->car && (intptr_t)n4->car->car == NODE_SPLAT) {
     1321              genop(s, MKOP_AB(OP_MOVE, cursp(), exc));
     1322              pop();
    12481323              genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__case_eqq")), 1));
    12491324            }
    12501325            else {
    1251               genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "===")), 1));
     1326              if (n4) {
     1327                codegen(s, n4->car, VAL);
     1328              }
     1329              else {
     1330                genop(s, MKOP_ABx(OP_GETCONST, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "StandardError"))));
     1331                push();
     1332              }
     1333              pop();
     1334              genop(s, MKOP_ABC(OP_RESCUE, exc, cursp(), 1));
    12521335            }
    12531336            tmp = genop(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2));
     
    12941377
    12951378  case NODE_ENSURE:
    1296     {
     1379    if (!tree->cdr || !tree->cdr->cdr ||
     1380        ((intptr_t)tree->cdr->cdr->car == NODE_BEGIN &&
     1381         tree->cdr->cdr->cdr)) {
    12971382      int idx;
    12981383      int epush = s->pc;
     
    13061391      genop_peep(s, MKOP_A(OP_EPOP, 1), NOVAL);
    13071392    }
     1393    else {                      /* empty ensure ignored */
     1394      codegen(s, tree->car, val);
     1395    }
    13081396    break;
    13091397
    13101398  case NODE_LAMBDA:
    1311     {
     1399    if (val) {
    13121400      int idx = lambda_body(s, tree, 1);
    13131401
     
    13181406
    13191407  case NODE_BLOCK:
    1320     {
     1408    if (val) {
    13211409      int idx = lambda_body(s, tree, 1);
    13221410
     
    13311419      node *e = tree->cdr->cdr->car;
    13321420
     1421      if (!tree->car) {
     1422        codegen(s, e, val);
     1423        goto exit;
     1424      }
    13331425      switch ((intptr_t)tree->car->car) {
    13341426      case NODE_TRUE:
     
    13361428      case NODE_STR:
    13371429        codegen(s, tree->cdr->car, val);
    1338         return;
     1430        goto exit;
    13391431      case NODE_FALSE:
    13401432      case NODE_NIL:
    13411433        codegen(s, e, val);
    1342         return;
     1434        goto exit;
    13431435      }
    13441436      codegen(s, tree->car, VAL);
     
    13471439
    13481440      codegen(s, tree->cdr->car, val);
    1349       if (val && !(tree->cdr->car)) {
    1350         genop(s, MKOP_A(OP_LOADNIL, cursp()));
    1351         push();
    1352       }
    13531441      if (e) {
    13541442        if (val) pop();
     
    14851573        if (pos3) dispatch_linked(s, pos3);
    14861574        if (head) pop();
    1487         genop(s, MKOP_AB(OP_MOVE, cursp(), pos));
     1575        if (cursp() != pos) {
     1576          genop(s, MKOP_AB(OP_MOVE, cursp(), pos));
     1577        }
    14881578        push();
    14891579      }
     
    15051595  case NODE_FCALL:
    15061596  case NODE_CALL:
    1507     gen_call(s, tree, 0, 0, val);
     1597    gen_call(s, tree, 0, 0, val, 0);
     1598    break;
     1599  case NODE_SCALL:
     1600    gen_call(s, tree, 0, 0, val, 1);
    15081601    break;
    15091602
     
    15531646      int n;
    15541647
    1555       n = gen_values(s, tree, val);
     1648      n = gen_values(s, tree, val, 0);
    15561649      if (n >= 0) {
    15571650        if (val) {
     
    16021695
    16031696  case NODE_SPLAT:
    1604     codegen(s, tree, VAL);
     1697    codegen(s, tree, val);
    16051698    break;
    16061699
     
    16171710      int rhs = cursp();
    16181711
    1619       if ((intptr_t)t->car == NODE_ARRAY && nosplat(t->cdr)) {
     1712      if ((intptr_t)t->car == NODE_ARRAY && t->cdr && nosplat(t->cdr)) {
    16201713        /* fixed rhs */
    16211714        t = t->cdr;
     
    16301723          n = 0;
    16311724          while (t) {
    1632             gen_assignment(s, t->car, rhs+n, NOVAL);
    1633             n++;
     1725            if (n < len) {
     1726              gen_assignment(s, t->car, rhs+n, NOVAL);
     1727              n++;
     1728            }
     1729            else {
     1730              genop(s, MKOP_A(OP_LOADNIL, rhs+n));
     1731              gen_assignment(s, t->car, rhs+n, NOVAL);
     1732            }
    16341733            t = t->cdr;
    16351734          }
     
    16881787      mrb_int len;
    16891788      const char *name = mrb_sym2name_len(s->mrb, sym, &len);
    1690       int idx;
    1691 
    1692       codegen(s, tree->car, VAL);
     1789      int idx, callargs = -1, vsp = -1;
     1790
     1791      if ((len == 2 && name[0] == '|' && name[1] == '|') &&
     1792          ((intptr_t)tree->car->car == NODE_CONST ||
     1793           (intptr_t)tree->car->car == NODE_CVAR)) {
     1794        int onerr, noexc, exc;
     1795        struct loopinfo *lp;
     1796
     1797        onerr = genop(s, MKOP_Bx(OP_ONERR, 0));
     1798        lp = loop_push(s, LOOP_BEGIN);
     1799        lp->pc1 = onerr;
     1800        exc = cursp();
     1801        codegen(s, tree->car, VAL);
     1802        lp->type = LOOP_RESCUE;
     1803        genop(s, MKOP_A(OP_POPERR, 1));
     1804        noexc = genop(s, MKOP_Bx(OP_JMP, 0));
     1805        dispatch(s, onerr);
     1806        genop(s, MKOP_ABC(OP_RESCUE, exc, 0, 0));
     1807        genop(s, MKOP_A(OP_LOADF, exc));
     1808        dispatch(s, noexc);
     1809        loop_pop(s, NOVAL);
     1810      }
     1811      else if ((intptr_t)tree->car->car == NODE_CALL) {
     1812        node *n = tree->car->cdr;
     1813
     1814        if (val) {
     1815          vsp = cursp();
     1816          push();
     1817        }
     1818        codegen(s, n->car, VAL);   /* receiver */
     1819        idx = new_msym(s, sym(n->cdr->car));
     1820        if (n->cdr->cdr->car) {
     1821          int base = cursp()-1;
     1822          int nargs = gen_values(s, n->cdr->cdr->car->car, VAL, 1);
     1823
     1824          /* copy receiver and arguments */
     1825          if (nargs >= 0) {
     1826            int i;
     1827
     1828            genop(s, MKOP_AB(OP_MOVE, cursp(), base));
     1829            for (i=0; i<nargs; i++) {
     1830              genop(s, MKOP_AB(OP_MOVE, cursp()+i+1, base+i+1));
     1831            }
     1832            push_n(nargs+1);
     1833            pop_n(nargs+1);
     1834            callargs = nargs;
     1835          }
     1836          else {
     1837            /* varargs */
     1838            push();
     1839            genop(s, MKOP_AB(OP_MOVE, cursp(), base));
     1840            genop(s, MKOP_AB(OP_MOVE, cursp()+1, base+1));
     1841            callargs = CALL_MAXARGS;
     1842          }
     1843          genop(s, MKOP_ABC(OP_SEND, cursp(), idx, callargs));
     1844        }
     1845        else {
     1846          genop(s, MKOP_AB(OP_MOVE, cursp(), cursp()-1));
     1847          genop(s, MKOP_ABC(OP_SEND, cursp(), idx, 0));
     1848          callargs = 0;
     1849        }
     1850        push();
     1851      }
     1852      else {
     1853        codegen(s, tree->car, VAL);
     1854      }
    16931855      if (len == 2 &&
    16941856          ((name[0] == '|' && name[1] == '|') ||
     
    16971859
    16981860        pop();
    1699         pos = genop_peep(s, MKOP_AsBx(name[0] == '|' ? OP_JMPIF : OP_JMPNOT, cursp(), 0), NOVAL);
     1861        if (val) {
     1862          if (vsp >= 0) {
     1863            genop(s, MKOP_AB(OP_MOVE, vsp, cursp()));
     1864          }
     1865          pos = genop(s, MKOP_AsBx(name[0]=='|'?OP_JMPIF:OP_JMPNOT, cursp(), 0));
     1866        }
     1867        else {
     1868          pos = genop_peep(s, MKOP_AsBx(name[0]=='|'?OP_JMPIF:OP_JMPNOT, cursp(), 0), NOVAL);
     1869        }
    17001870        codegen(s, tree->cdr->cdr->car, VAL);
    17011871        pop();
    1702         gen_assignment(s, tree->car, cursp(), val);
     1872        if (val && vsp >= 0) {
     1873          genop(s, MKOP_AB(OP_MOVE, vsp, cursp()));
     1874        }
     1875        if ((intptr_t)tree->car->car == NODE_CALL) {
     1876          mrb_sym m = sym(tree->car->cdr->cdr->car);
     1877          mrb_sym m2 = attrsym(s, m);
     1878
     1879          idx = new_msym(s, m2);
     1880          pop();
     1881          if (callargs == CALL_MAXARGS) {
     1882            genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
     1883            pop();
     1884            genop(s, MKOP_ABC(OP_SEND, cursp(), idx, callargs));
     1885          }
     1886          else {
     1887            pop_n(callargs);
     1888            genop(s, MKOP_ABC(OP_SEND, cursp(), idx, callargs+1));
     1889          }
     1890        }
     1891        else {
     1892          gen_assignment(s, tree->car, cursp(), val);
     1893        }
    17031894        dispatch(s, pos);
    1704         break;
     1895        goto exit;
    17051896      }
    17061897      codegen(s, tree->cdr->cdr->car, VAL);
     
    17361927        genop(s, MKOP_ABC(OP_SEND, cursp(), idx, 1));
    17371928      }
    1738     }
    1739     gen_assignment(s, tree->car, cursp(), val);
     1929      if (callargs < 0) {
     1930        gen_assignment(s, tree->car, cursp(), val);
     1931      }
     1932      else {
     1933        if (val && vsp >= 0) {
     1934          genop(s, MKOP_AB(OP_MOVE, vsp, cursp()));
     1935        }
     1936        if (callargs == CALL_MAXARGS) {
     1937          pop();
     1938          genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
     1939        }
     1940        else {
     1941          pop_n(callargs);
     1942          callargs++;
     1943        }
     1944        pop();
     1945        idx = new_msym(s, attrsym(s,sym(tree->car->cdr->cdr->car)));
     1946        genop(s, MKOP_ABC(OP_SEND, cursp(), idx, callargs));
     1947      }
     1948    }
    17401949    break;
    17411950
    17421951  case NODE_SUPER:
    17431952    {
     1953      codegen_scope *s2 = s;
     1954      int lv = 0;
    17441955      int n = 0, noop = 0, sendv = 0;
    17451956
    17461957      push();        /* room for receiver */
     1958      while (!s2->mscope) {
     1959        lv++;
     1960        s2 = s2->prev;
     1961        if (!s2) break;
     1962      }
     1963      genop(s, MKOP_ABx(OP_ARGARY, cursp(), (lv & 0xf)));
     1964      push(); push();         /* ARGARY pushes two values */
     1965      pop(); pop();
    17471966      if (tree) {
    17481967        node *args = tree->car;
    17491968        if (args) {
    1750           n = gen_values(s, args, VAL);
     1969          n = gen_values(s, args, VAL, 0);
    17511970          if (n < 0) {
    17521971            n = noop = sendv = 1;
     
    17962015  case NODE_RETURN:
    17972016    if (tree) {
    1798       codegen(s, tree, VAL);
    1799       pop();
     2017      gen_retval(s, tree);
    18002018    }
    18012019    else {
     
    18232041      }
    18242042      if (s2) ainfo = s2->ainfo;
    1825       genop(s, MKOP_ABx(OP_BLKPUSH, cursp(), (ainfo<<4)|(lv & 0xf)));
    18262043      push();
    18272044      if (tree) {
    1828         n = gen_values(s, tree, VAL);
     2045        n = gen_values(s, tree, VAL, 0);
    18292046        if (n < 0) {
    18302047          n = sendv = 1;
     
    18332050      }
    18342051      pop_n(n+1);
     2052      genop(s, MKOP_ABx(OP_BLKPUSH, cursp(), (ainfo<<4)|(lv & 0xf)));
    18352053      if (sendv) n = CALL_MAXARGS;
    18362054      genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "call")), n));
     
    18692087
    18702088  case NODE_REDO:
    1871     if (!s->loop) {
     2089    if (!s->loop || s->loop->type == LOOP_BEGIN || s->loop->type == LOOP_RESCUE) {
    18722090      raise_error(s, "unexpected redo");
    18732091    }
     
    18782096      genop(s, MKOP_sBx(OP_JMP, s->loop->pc2 - s->pc));
    18792097    }
     2098    if (val) push();
    18802099    break;
    18812100
     
    19122131        }
    19132132      }
     2133      if (val) push();
    19142134    }
    19152135    break;
     
    19842204  case NODE_BACK_REF:
    19852205    if (val) {
    1986       char buf[2] = { '$' };
     2206      char buf[3];
     2207      int sym;
     2208
     2209      buf[0] = '$';
     2210      buf[1] = (char)(intptr_t)tree;
     2211      buf[2] = 0;
     2212      sym = new_sym(s, mrb_intern_cstr(s->mrb, buf));
     2213      genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym));
     2214      push();
     2215    }
     2216    break;
     2217
     2218  case NODE_NTH_REF:
     2219    if (val) {
     2220      mrb_state *mrb = s->mrb;
    19872221      mrb_value str;
    19882222      int sym;
    19892223
    1990       buf[1] = (char)(intptr_t)tree;
    1991       str = mrb_str_new(s->mrb, buf, 2);
    1992       sym = new_sym(s, mrb_intern_str(s->mrb, str));
    1993       genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym));
    1994       push();
    1995     }
    1996     break;
    1997 
    1998   case NODE_NTH_REF:
    1999     if (val) {
    2000       int sym;
    2001       mrb_state *mrb = s->mrb;
    2002       mrb_value fix = mrb_fixnum_value((intptr_t)tree);
    2003       mrb_value str = mrb_str_buf_new(mrb, 4);
    2004 
    2005       mrb_str_cat_lit(mrb, str, "$");
    2006       mrb_str_cat_str(mrb, str, mrb_fixnum_to_str(mrb, fix, 10));
     2224      str = mrb_format(mrb, "$%S", mrb_fixnum_value((mrb_int)(intptr_t)tree));
    20072225      sym = new_sym(s, mrb_intern_str(mrb, str));
    20082226      genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym));
     
    20512269    if (val) {
    20522270      char *p = (char*)tree;
    2053       mrb_float f = str_to_mrb_float(p);
     2271      mrb_float f = mrb_float_read(p, NULL);
    20542272      int off = new_lit(s, mrb_float_value(s->mrb, f));
    20552273
     
    20652283      switch (nt) {
    20662284      case NODE_FLOAT:
    2067         {
     2285        if (val) {
    20682286          char *p = (char*)tree;
    2069           mrb_float f = str_to_mrb_float(p);
     2287          mrb_float f = mrb_float_read(p, NULL);
    20702288          int off = new_lit(s, mrb_float_value(s->mrb, -f));
    20712289
     
    20762294
    20772295      case NODE_INT:
    2078         {
     2296        if (val) {
    20792297          char *p = (char*)tree->car;
    20802298          int base = (intptr_t)tree->cdr->car;
     
    21052323
    21062324      default:
    2107         {
     2325        if (val) {
    21082326          int sym = new_msym(s, mrb_intern_lit(s->mrb, "-"));
    21092327
     
    21132331          pop(); pop();
    21142332          genop(s, MKOP_ABC(OP_SUB, cursp(), sym, 2));
     2333        }
     2334        else {
     2335          codegen(s, tree, NOVAL);
    21152336        }
    21162337        break;
     
    21392360      node *n = tree;
    21402361
    2141       if (!n) break;
     2362      if (!n) {
     2363        genop(s, MKOP_A(OP_LOADNIL, cursp()));
     2364        push();
     2365        break;
     2366      }
    21422367      codegen(s, n->car, VAL);
    21432368      n = n->cdr;
     
    21762401      int sym = new_sym(s, mrb_intern_lit(s->mrb, "Kernel"));
    21772402
    2178       if (val == NOVAL) { push(); }
    2179       genop(s, MKOP_A(OP_OCLASS, cursp()));
    2180       genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
     2403      genop(s, MKOP_A(OP_LOADSELF, cursp()));
    21812404      push();
    21822405      codegen(s, tree->car, VAL);
     
    21932416        n = n->cdr;
    21942417      }
    2195       pop();
    2196       pop();
     2418      push();                   /* for block */
     2419      pop_n(3);
    21972420      sym = new_sym(s, mrb_intern_lit(s->mrb, "`"));
    21982421      genop(s, MKOP_ABC(OP_SEND, cursp(), sym, 1));
    2199       if (val == NOVAL) { pop(); }
    2200       else { push(); }
     2422      if (val) push();
    22012423      mrb_gc_arena_restore(s->mrb, ai);
    22022424    }
     
    22082430      size_t len = (intptr_t)tree->cdr;
    22092431      int ai = mrb_gc_arena_save(s->mrb);
    2210       int sym = new_sym(s, mrb_intern_lit(s->mrb, "Kernel"));
    22112432      int off = new_lit(s, mrb_str_new(s->mrb, p, len));
    2212 
    2213       if (val == NOVAL) { push(); }
    2214       genop(s, MKOP_A(OP_OCLASS, cursp()));
    2215       genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
     2433      int sym;
     2434
     2435      genop(s, MKOP_A(OP_LOADSELF, cursp()));
    22162436      push();
    22172437      genop(s, MKOP_ABx(OP_STRING, cursp(), off));
    2218       pop();
     2438      push(); push();
     2439      pop_n(3);
    22192440      sym = new_sym(s, mrb_intern_lit(s->mrb, "`"));
    22202441      genop(s, MKOP_ABC(OP_SEND, cursp(), sym, 1));
    2221       if (val == NOVAL) { pop(); }
    2222       else { push(); }
     2442      if (val) push();
    22232443      mrb_gc_arena_restore(s->mrb, ai);
    22242444    }
     
    22442464          off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
    22452465          genop(s, MKOP_ABx(OP_STRING, cursp(), off));
    2246         } else {
     2466        }
     2467        else {
    22472468          genop(s, MKOP_A(OP_LOADNIL, cursp()));
    22482469        }
     
    22952516        genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);
    22962517      }
    2297       if (n->cdr) {
    2298         char *p2 = (char*)n->cdr;
     2518      if (n->cdr->car) {
     2519        char *p2 = (char*)n->cdr->car;
    22992520
    23002521        push();
     
    23022523        genop(s, MKOP_ABx(OP_STRING, cursp(), off));
    23032524        argc++;
    2304         pop();
    2305       }
    2306       pop();
     2525      }
     2526      if (n->cdr->cdr) {
     2527        char *p2 = (char*)n->cdr->cdr;
     2528
     2529        push();
     2530        off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
     2531        genop(s, MKOP_ABx(OP_STRING, cursp(), off));
     2532        argc++;
     2533      }
     2534      pop_n(argc);
    23072535      sym = new_sym(s, mrb_intern_lit(s->mrb, "compile"));
    23082536      genop(s, MKOP_ABC(OP_SEND, cursp(), sym, argc));
     
    23792607      push();
    23802608      genop(s, MKOP_A(OP_LOADNIL, cursp()));
    2381       pop_n(3);
     2609      push();
     2610      pop_n(4);
    23822611      genop(s, MKOP_ABC(OP_SEND, cursp(), c, 2));
    23832612      if (val) {
     
    23962625      push();
    23972626      while (t) {
    2398         int symbol = new_msym(s, sym(t->car));
     2627        int symbol;
     2628        if (num >= CALL_MAXARGS - 1) {
     2629          pop_n(num);
     2630          genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), num));
     2631          while (t) {
     2632            symbol = new_msym(s, sym(t->car));
     2633            push();
     2634            genop(s, MKOP_ABx(OP_LOADSYM, cursp(), symbol));
     2635            pop();
     2636            genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
     2637            t = t->cdr;
     2638          }
     2639          num = CALL_MAXARGS;
     2640          break;
     2641        }
     2642        symbol = new_msym(s, sym(t->car));
    23992643        genop(s, MKOP_ABx(OP_LOADSYM, cursp(), symbol));
    24002644        push();
     
    24022646        num++;
    24032647      }
    2404       pop_n(num + 1);
     2648      pop();
     2649      if (num < CALL_MAXARGS) {
     2650        pop_n(num);
     2651      }
    24052652      genop(s, MKOP_ABC(OP_SEND, cursp(), undef, num));
    24062653      if (val) {
     
    25292776    break;
    25302777  }
     2778 exit:
     2779  s->rlev = rlev;
    25312780}
    25322781
     
    25702819  p->icapa = 1024;
    25712820  p->iseq = (mrb_code*)mrb_malloc(mrb, sizeof(mrb_code)*p->icapa);
    2572   p->irep->iseq = p->iseq;
     2821  p->irep->iseq = NULL;
    25732822
    25742823  p->pcapa = 32;
     
    25762825  p->irep->plen = 0;
    25772826
    2578   p->scapa = 256;
     2827  p->scapa = MAXMSYMLEN;
    25792828  p->irep->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*p->scapa);
    25802829  p->irep->slen = 0;
     
    26202869  p->filename_index = prev->filename_index;
    26212870
     2871  p->rlev = prev->rlev+1;
     2872
    26222873  return p;
    26232874}
     
    26462897  irep->reps = (mrb_irep**)codegen_realloc(s, irep->reps, sizeof(mrb_irep*)*irep->rlen);
    26472898  if (s->filename) {
    2648     s->irep->filename = mrb_parser_get_filename(s->parser, s->filename_index);
    2649     mrb_debug_info_append_file(mrb, s->irep, s->debug_start_pos, s->pc);
     2899    irep->filename = mrb_parser_get_filename(s->parser, s->filename_index);
     2900    mrb_debug_info_append_file(mrb, irep, s->debug_start_pos, s->pc);
    26502901
    26512902    fname_len = strlen(s->filename);
     
    26542905    fname[fname_len] = '\0';
    26552906    irep->filename = fname;
     2907    irep->own_filename = TRUE;
    26562908  }
    26572909
     
    26892941
    26902942    if (tree) {
    2691       codegen(s, tree, VAL);
    2692       pop();
     2943      gen_retval(s, tree);
    26932944    }
    26942945
     
    27022953    }
    27032954    if (!loop) {
    2704       codegen_error(s, "unexpected break");
     2955      raise_error(s, "unexpected break");
     2956      return;
    27052957    }
    27062958
     
    27182970    }
    27192971    else {
     2972      if (!tree) {
     2973        genop(s, MKOP_A(OP_LOADNIL, cursp()));
     2974      }
    27202975      genop(s, MKOP_AB(OP_RETURN, cursp(), OP_R_BREAK));
    27212976    }
     
    27262981loop_pop(codegen_scope *s, int val)
    27272982{
     2983  dispatch_linked(s, s->loop->pc3);
    27282984  if (val) {
    27292985    genop(s, MKOP_A(OP_LOADNIL, cursp()));
    27302986  }
    2731   dispatch_linked(s, s->loop->pc3);
    27322987  s->loop = s->loop->prev;
    27332988  if (val) push();
     
    27392994  codegen_scope *scope = scope_new(mrb, 0, 0);
    27402995  struct RProc *proc;
     2996  struct mrb_jmpbuf *prev_jmp = mrb->jmp;
    27412997
    27422998  if (!scope) {
     
    27493005
    27503006  MRB_TRY(&scope->jmp) {
     3007    mrb->jmp = &scope->jmp;
    27513008    /* prepare irep */
    27523009    codegen(scope, p->tree, NOVAL);
     
    27543011    mrb_irep_decref(mrb, scope->irep);
    27553012    mrb_pool_close(scope->mpool);
     3013    proc->c = NULL;
     3014    mrb->jmp = prev_jmp;
    27563015    return proc;
    27573016  }
    27583017  MRB_CATCH(&scope->jmp) {
    2759     if (scope->filename == scope->irep->filename) {
    2760       scope->irep->filename = NULL;
    2761     }
    27623018    mrb_irep_decref(mrb, scope->irep);
    27633019    mrb_pool_close(scope->mpool);
     3020    mrb->jmp = prev_jmp;
    27643021    return NULL;
    27653022  }
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-compiler/core/lex.def

    • Property svn:keywords deleted
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-compiler/core/node.h

    r321 r331  
    55*/
    66
    7 #ifndef NODE_H
    8 #define NODE_H
     7#ifndef MRUBY_COMPILER_NODE_H
     8#define MRUBY_COMPILER_NODE_H
    99
    1010enum node_type {
     
    3939  NODE_OP_ASGN,
    4040  NODE_CALL,
     41  NODE_SCALL,
    4142  NODE_FCALL,
    4243  NODE_VCALL,
     
    115116};
    116117
    117 #endif  /* NODE_H */
     118#endif  /* MRUBY_COMPILER_NODE_H */
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-compiler/core/parse.y

    r270 r331  
    2323#include <stdlib.h>
    2424#include <string.h>
    25 #include "mruby.h"
    26 #include "mruby/compile.h"
    27 #include "mruby/proc.h"
    28 #include "mruby/error.h"
     25#include <mruby.h>
     26#include <mruby/compile.h>
     27#include <mruby/proc.h>
     28#include <mruby/error.h>
     29#include <mruby/throw.h>
    2930#include "node.h"
    30 #include "mruby/throw.h"
    3131
    3232#define YYLEX_PARAM p
     
    4242static void yywarning(parser_state *p, const char *s);
    4343static void backref_error(parser_state *p, node *n);
     44static void void_expr_error(parser_state *p, node *n);
    4445static void tokadd(parser_state *p, int32_t c);
    4546
     
    7374#define sym(x) ((mrb_sym)(intptr_t)(x))
    7475#define nsym(x) ((node*)(intptr_t)(x))
     76#define nint(x) ((node*)(intptr_t)(x))
     77#define intn(x) ((int)(intptr_t)(x))
    7578
    7679static inline mrb_sym
     
    309312}
    310313
     314static node*
     315new_mod_rescue(parser_state *p, node *body, node *resq)
     316{
     317  return new_rescue(p, body, list1(list3(0, 0, resq)), 0);
     318}
     319
    311320/* (:ensure body ensure) */
    312321static node*
     
    348357new_if(parser_state *p, node *a, node *b, node *c)
    349358{
     359  void_expr_error(p, a);
    350360  return list4((node*)NODE_IF, a, b, c);
    351361}
     
    355365new_unless(parser_state *p, node *a, node *b, node *c)
    356366{
     367  void_expr_error(p, a);
    357368  return list4((node*)NODE_IF, a, c, b);
    358369}
     
    362373new_while(parser_state *p, node *a, node *b)
    363374{
     375  void_expr_error(p, a);
    364376  return cons((node*)NODE_WHILE, cons(a, b));
    365377}
     
    369381new_until(parser_state *p, node *a, node *b)
    370382{
     383  void_expr_error(p, a);
    371384  return cons((node*)NODE_UNTIL, cons(a, b));
    372385}
     
    376389new_for(parser_state *p, node *v, node *o, node *b)
    377390{
     391  void_expr_error(p, o);
    378392  return list4((node*)NODE_FOR, v, o, b);
    379393}
     
    386400  node *n2 = n;
    387401
     402  void_expr_error(p, a);
    388403  while (n2->cdr) {
    389404    n2 = n2->cdr;
     
    409424/* (:call a b c) */
    410425static node*
    411 new_call(parser_state *p, node *a, mrb_sym b, node *c)
    412 {
    413   node *n = list4((node*)NODE_CALL, a, nsym(b), c);
     426new_call(parser_state *p, node *a, mrb_sym b, node *c, int pass)
     427{
     428  node *n = list4(nint(pass?NODE_CALL:NODE_SCALL), a, nsym(b), c);
     429  void_expr_error(p, a);
    414430  NODE_LINENO(n, a);
    415431  return n;
     
    507523new_colon2(parser_state *p, node *b, mrb_sym c)
    508524{
     525  void_expr_error(p, b);
    509526  return cons((node*)NODE_COLON2, cons(b, nsym(c)));
    510527}
     
    614631new_class(parser_state *p, node *c, node *s, node *b)
    615632{
     633  void_expr_error(p, s);
    616634  return list4((node*)NODE_CLASS, c, s, cons(locals_node(p), b));
    617635}
     
    621639new_sclass(parser_state *p, node *o, node *b)
    622640{
     641  void_expr_error(p, o);
    623642  return list3((node*)NODE_SCLASS, o, cons(locals_node(p), b));
    624643}
     
    642661new_sdef(parser_state *p, node *o, mrb_sym m, node *a, node *b)
    643662{
     663  void_expr_error(p, o);
    644664  return list6((node*)NODE_SDEF, o, nsym(m), locals_node(p), a, b);
    645665}
     
    694714new_asgn(parser_state *p, node *a, node *b)
    695715{
     716  void_expr_error(p, b);
    696717  return cons((node*)NODE_ASGN, cons(a, b));
    697718}
     
    701722new_masgn(parser_state *p, node *a, node *b)
    702723{
     724  void_expr_error(p, b);
    703725  return cons((node*)NODE_MASGN, cons(a, b));
    704726}
     
    708730new_op_asgn(parser_state *p, node *a, mrb_sym op, node *b)
    709731{
     732  void_expr_error(p, b);
    710733  return list4((node*)NODE_OP_ASGN, a, nsym(op), b);
    711734}
     
    715738new_int(parser_state *p, const char *s, int base)
    716739{
    717   return list3((node*)NODE_INT, (node*)strdup(s), (node*)(intptr_t)base);
     740  return list3((node*)NODE_INT, (node*)strdup(s), nint(base));
    718741}
    719742
     
    729752new_str(parser_state *p, const char *s, int len)
    730753{
    731   return cons((node*)NODE_STR, cons((node*)strndup(s, len), (node*)(intptr_t)len));
     754  return cons((node*)NODE_STR, cons((node*)strndup(s, len), nint(len)));
    732755}
    733756
     
    743766new_xstr(parser_state *p, const char *s, int len)
    744767{
    745   return cons((node*)NODE_XSTR, cons((node*)strndup(s, len), (node*)(intptr_t)len));
     768  return cons((node*)NODE_XSTR, cons((node*)strndup(s, len), nint(len)));
    746769}
    747770
     
    760783}
    761784
    762 /* (:str . (a . a)) */
     785/* (:regx . (s . (opt . enc))) */
    763786static node*
    764787new_regx(parser_state *p, const char *p1, const char* p2, const char* p3)
     
    767790}
    768791
    769 /* (:dregx . a) */
     792/* (:dregx . (a . b)) */
    770793static node*
    771794new_dregx(parser_state *p, node *a, node *b)
     
    778801new_back_ref(parser_state *p, int n)
    779802{
    780   return cons((node*)NODE_BACK_REF, (node*)(intptr_t)n);
     803  return cons((node*)NODE_BACK_REF, nint(n));
    781804}
    782805
     
    785808new_nth_ref(parser_state *p, int n)
    786809{
    787   return cons((node*)NODE_NTH_REF, (node*)(intptr_t)n);
     810  return cons((node*)NODE_NTH_REF, nint(n));
    788811}
    789812
     
    827850call_uni_op(parser_state *p, node *recv, const char *m)
    828851{
    829   return new_call(p, recv, intern_cstr(m), 0);
     852  void_expr_error(p, recv);
     853  return new_call(p, recv, intern_cstr(m), 0, 1);
    830854}
    831855
     
    834858call_bin_op(parser_state *p, node *recv, const char *m, node *arg1)
    835859{
    836   return new_call(p, recv, intern_cstr(m), list1(list1(arg1)));
     860  return new_call(p, recv, intern_cstr(m), list1(list1(arg1)), 1);
    837861}
    838862
     
    853877  node *n;
    854878
    855   if (a->car == (node*)NODE_SUPER ||
    856       a->car == (node*)NODE_ZSUPER) {
     879  switch ((enum node_type)intn(a->car)) {
     880  case NODE_SUPER:
     881  case NODE_ZSUPER:
    857882    if (!a->cdr) a->cdr = cons(0, b);
    858883    else {
    859884      args_with_block(p, a->cdr, b);
    860885    }
    861   }
    862   else {
     886    break;
     887  case NODE_CALL:
     888  case NODE_FCALL:
     889  case NODE_SCALL:
    863890    n = a->cdr->cdr->cdr;
    864891    if (!n->car) n->car = cons(0, b);
     
    866893      args_with_block(p, n->car, b);
    867894    }
     895    break;
     896  default:
     897    break;
    868898  }
    869899}
     
    895925assignable(parser_state *p, node *lhs)
    896926{
    897   if ((int)(intptr_t)lhs->car == NODE_LVAR) {
     927  if (intn(lhs->car) == NODE_LVAR) {
    898928    local_add(p, sym(lhs->cdr));
    899929  }
     
    905935  node *n;
    906936
    907   if ((int)(intptr_t)lhs->car == NODE_LVAR) {
     937  if (intn(lhs->car) == NODE_LVAR) {
    908938    if (!local_var_p(p, sym(lhs->cdr))) {
    909939      n = new_fcall(p, sym(lhs->cdr), 0);
     
    921951new_strterm(parser_state *p, string_type type, int term, int paren)
    922952{
    923   return cons((node*)(intptr_t)type, cons((node*)0, cons((node*)(intptr_t)paren, (node*)(intptr_t)term)));
     953  return cons(nint(type), cons((node*)0, cons(nint(paren), nint(term))));
    924954}
    925955
     
    10021032  else {
    10031033    /* next heredoc */
    1004     p->lex_strterm->car = (node*)(intptr_t)parsing_heredoc_inf(p)->type;
    1005   }
    1006 }
    1007 #define is_strterm_type(p,str_func) ((int)(intptr_t)((p)->lex_strterm->car) & (str_func))
     1034    p->lex_strterm->car = nint(parsing_heredoc_inf(p)->type);
     1035  }
     1036}
     1037#define is_strterm_type(p,str_func) (intn((p)->lex_strterm->car) & (str_func))
    10081038
    10091039/* xxx ----------------------------- */
     
    10771107%token <id>  tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tLABEL
    10781108%token <nd>  tINTEGER tFLOAT tCHAR tXSTRING tREGEXP
    1079 %token <nd>  tSTRING tSTRING_PART tSTRING_MID
     1109%token <nd>  tSTRING tSTRING_PART tSTRING_MID tLABEL_END
    10801110%token <nd>  tNTH_REF tBACK_REF
    10811111%token <num> tREGEXP_END
     
    10851115%type <nd> top_compstmt top_stmts top_stmt
    10861116%type <nd> bodystmt compstmt stmts stmt expr arg primary command command_call method_call
    1087 %type <nd> expr_value arg_value primary_value
     1117%type <nd> expr_value arg_rhs primary_value
    10881118%type <nd> if_tail opt_else case_body cases opt_rescue exc_list exc_var opt_ensure
    10891119%type <nd> args call_args opt_call_args
    10901120%type <nd> paren_args opt_paren_args variable
    10911121%type <nd> command_args aref_args opt_block_arg block_arg var_ref var_lhs
    1092 %type <nd> command_asgn mrhs superclass block_call block_command
     1122%type <nd> command_asgn command_rhs mrhs superclass block_call block_command
    10931123%type <nd> f_block_optarg f_block_opt
    10941124%type <nd> f_arglist f_args f_arg f_arg_item f_optarg f_marg f_marg_list f_margs
     
    11011131%type <id> cname fname op f_rest_arg f_block_arg opt_f_block_arg f_norm_arg f_opt_asgn
    11021132%type <nd> heredoc words symbols
     1133%type <num> call_op call_op2     /* 0:'&.', 1:'.', 2:'::' */
    11031134
    11041135%token tUPLUS             /* unary+ */
     
    11291160%token tAMPER             /* & */
    11301161%token tLAMBDA            /* -> */
     1162%token tANDDOT            /* &. */
    11311163%token tSYMBEG tREGEXP_BEG tWORDS_BEG tSYMBOLS_BEG
    11321164%token tSTRING_BEG tXSTRING_BEG tSTRING_DVAR tLAMBEG
     
    12921324                | stmt modifier_rescue stmt
    12931325                    {
    1294                       $$ = new_rescue(p, $1, list1(list3(0, 0, $3)), 0);
     1326                      $$ = new_mod_rescue(p, $1, $3);
    12951327                    }
    12961328                | keyword_END '{' compstmt '}'
    12971329                    {
    1298                       yyerror(p, "END not suported");
     1330                      yyerror(p, "END not supported");
    12991331                      $$ = new_postexe(p, $3);
    13001332                    }
     
    13041336                      $$ = new_masgn(p, $1, $3);
    13051337                    }
    1306                 | var_lhs tOP_ASGN command_call
     1338                | lhs '=' mrhs
     1339                    {
     1340                      $$ = new_asgn(p, $1, new_array(p, $3));
     1341                    }
     1342                | mlhs '=' arg
     1343                    {
     1344                      $$ = new_masgn(p, $1, $3);
     1345                    }
     1346                | mlhs '=' mrhs
     1347                    {
     1348                      $$ = new_masgn(p, $1, new_array(p, $3));
     1349                    }
     1350                | expr
     1351                ;
     1352
     1353command_asgn    : lhs '=' command_rhs
     1354                    {
     1355                      $$ = new_asgn(p, $1, $3);
     1356                    }
     1357                | var_lhs tOP_ASGN command_rhs
    13071358                    {
    13081359                      $$ = new_op_asgn(p, $1, $2, $3);
    13091360                    }
    1310                 | primary_value '[' opt_call_args rbracket tOP_ASGN command_call
    1311                     {
    1312                       $$ = new_op_asgn(p, new_call(p, $1, intern("[]",2), $3), $5, $6);
    1313                     }
    1314                 | primary_value '.' tIDENTIFIER tOP_ASGN command_call
    1315                     {
    1316                       $$ = new_op_asgn(p, new_call(p, $1, $3, 0), $4, $5);
    1317                     }
    1318                 | primary_value '.' tCONSTANT tOP_ASGN command_call
    1319                     {
    1320                       $$ = new_op_asgn(p, new_call(p, $1, $3, 0), $4, $5);
     1361                | primary_value '[' opt_call_args rbracket tOP_ASGN command_rhs
     1362                    {
     1363                      $$ = new_op_asgn(p, new_call(p, $1, intern("[]",2), $3, '.'), $5, $6);
     1364                    }
     1365                | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs
     1366                    {
     1367                      $$ = new_op_asgn(p, new_call(p, $1, $3, 0, $2), $4, $5);
     1368                    }
     1369                | primary_value call_op tCONSTANT tOP_ASGN command_rhs
     1370                    {
     1371                      $$ = new_op_asgn(p, new_call(p, $1, $3, 0, $2), $4, $5);
    13211372                    }
    13221373                | primary_value tCOLON2 tCONSTANT tOP_ASGN command_call
     
    13251376                      $$ = 0;
    13261377                    }
    1327                 | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
    1328                     {
    1329                       $$ = new_op_asgn(p, new_call(p, $1, $3, 0), $4, $5);
    1330                     }
    1331                 | backref tOP_ASGN command_call
     1378                | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs
     1379                    {
     1380                      $$ = new_op_asgn(p, new_call(p, $1, $3, 0, tCOLON2), $4, $5);
     1381                    }
     1382                | backref tOP_ASGN command_rhs
    13321383                    {
    13331384                      backref_error(p, $1);
    13341385                      $$ = new_begin(p, 0);
    13351386                    }
    1336                 | lhs '=' mrhs
    1337                     {
    1338                       $$ = new_asgn(p, $1, new_array(p, $3));
    1339                     }
    1340                 | mlhs '=' arg_value
    1341                     {
    1342                       $$ = new_masgn(p, $1, $3);
    1343                     }
    1344                 | mlhs '=' mrhs
    1345                     {
    1346                       $$ = new_masgn(p, $1, new_array(p, $3));
    1347                     }
    1348                 | expr
    1349                 ;
    1350 
    1351 command_asgn    : lhs '=' command_call
    1352                     {
    1353                       $$ = new_asgn(p, $1, $3);
    1354                     }
    1355                 | lhs '=' command_asgn
    1356                     {
    1357                       $$ = new_asgn(p, $1, $3);
    1358                     }
     1387                ;
     1388
     1389command_rhs     : command_call   %prec tOP_ASGN
     1390                | command_call modifier_rescue stmt
     1391                    {
     1392                      $$ = new_mod_rescue(p, $1, $3);
     1393                    }
     1394                | command_asgn
    13591395                ;
    13601396
     
    13831419                    {
    13841420                      if (!$1) $$ = new_nil(p);
    1385                       else $$ = $1;
     1421                      else {
     1422                        $$ = $1;
     1423                      }
    13861424                    }
    13871425                ;
     
    13921430
    13931431block_command   : block_call
    1394                 | block_call dot_or_colon operation2 command_args
     1432                | block_call call_op2 operation2 command_args
     1433                    {
     1434                      $$ = new_call(p, $1, $3, $4, $2);
     1435                    }
    13951436                ;
    13961437
     
    14171458                      $$ = new_fcall(p, $1, $2);
    14181459                    }
    1419                 | primary_value '.' operation2 command_args     %prec tLOWEST
    1420                     {
    1421                       $$ = new_call(p, $1, $3, $4);
    1422                     }
    1423                 | primary_value '.' operation2 command_args cmd_brace_block
     1460                | primary_value call_op operation2 command_args     %prec tLOWEST
     1461                    {
     1462                      $$ = new_call(p, $1, $3, $4, $2);
     1463                    }
     1464                | primary_value call_op operation2 command_args cmd_brace_block
    14241465                    {
    14251466                      args_with_block(p, $4, $5);
    1426                       $$ = new_call(p, $1, $3, $4);
     1467                      $$ = new_call(p, $1, $3, $4, $2);
    14271468                   }
    14281469                | primary_value tCOLON2 operation2 command_args %prec tLOWEST
    14291470                    {
    1430                       $$ = new_call(p, $1, $3, $4);
     1471                      $$ = new_call(p, $1, $3, $4, tCOLON2);
    14311472                    }
    14321473                | primary_value tCOLON2 operation2 command_args cmd_brace_block
    14331474                    {
    14341475                      args_with_block(p, $4, $5);
    1435                       $$ = new_call(p, $1, $3, $4);
     1476                      $$ = new_call(p, $1, $3, $4, tCOLON2);
    14361477                    }
    14371478                | keyword_super command_args
     
    15491590                | primary_value '[' opt_call_args rbracket
    15501591                    {
    1551                       $$ = new_call(p, $1, intern("[]",2), $3);
    1552                     }
    1553                 | primary_value '.' tIDENTIFIER
    1554                     {
    1555                       $$ = new_call(p, $1, $3, 0);
     1592                      $$ = new_call(p, $1, intern("[]",2), $3, '.');
     1593                    }
     1594                | primary_value call_op tIDENTIFIER
     1595                    {
     1596                      $$ = new_call(p, $1, $3, 0, $2);
    15561597                    }
    15571598                | primary_value tCOLON2 tIDENTIFIER
    15581599                    {
    1559                       $$ = new_call(p, $1, $3, 0);
    1560                     }
    1561                 | primary_value '.' tCONSTANT
    1562                     {
    1563                       $$ = new_call(p, $1, $3, 0);
     1600                      $$ = new_call(p, $1, $3, 0, tCOLON2);
     1601                    }
     1602                | primary_value call_op tCONSTANT
     1603                    {
     1604                      $$ = new_call(p, $1, $3, 0, $2);
    15641605                    }
    15651606                | primary_value tCOLON2 tCONSTANT
     
    15881629                | primary_value '[' opt_call_args rbracket
    15891630                    {
    1590                       $$ = new_call(p, $1, intern("[]",2), $3);
    1591                     }
    1592                 | primary_value '.' tIDENTIFIER
    1593                     {
    1594                       $$ = new_call(p, $1, $3, 0);
     1631                      $$ = new_call(p, $1, intern("[]",2), $3, '.');
     1632                    }
     1633                | primary_value call_op tIDENTIFIER
     1634                    {
     1635                      $$ = new_call(p, $1, $3, 0, $2);
    15951636                    }
    15961637                | primary_value tCOLON2 tIDENTIFIER
    15971638                    {
    1598                       $$ = new_call(p, $1, $3, 0);
    1599                     }
    1600                 | primary_value '.' tCONSTANT
    1601                     {
    1602                       $$ = new_call(p, $1, $3, 0);
     1639                      $$ = new_call(p, $1, $3, 0, tCOLON2);
     1640                    }
     1641                | primary_value call_op tCONSTANT
     1642                    {
     1643                      $$ = new_call(p, $1, $3, 0, $2);
    16031644                    }
    16041645                | primary_value tCOLON2 tCONSTANT
     
    16381679                | primary_value tCOLON2 cname
    16391680                    {
     1681                      void_expr_error(p, $1);
    16401682                      $$ = cons($1, nsym($3));
    16411683                    }
     
    17161758                ;
    17171759
    1718 arg             : lhs '=' arg
     1760arg             : lhs '=' arg_rhs
    17191761                    {
    17201762                      $$ = new_asgn(p, $1, $3);
    17211763                    }
    1722                 | lhs '=' arg modifier_rescue arg
    1723                     {
    1724                       $$ = new_asgn(p, $1, new_rescue(p, $3, list1(list3(0, 0, $5)), 0));
    1725                     }
    1726                 | var_lhs tOP_ASGN arg
     1764                | var_lhs tOP_ASGN arg_rhs
    17271765                    {
    17281766                      $$ = new_op_asgn(p, $1, $2, $3);
    17291767                    }
    1730                 | var_lhs tOP_ASGN arg modifier_rescue arg
    1731                     {
    1732                       $$ = new_op_asgn(p, $1, $2, new_rescue(p, $3, list1(list3(0, 0, $5)), 0));
    1733                     }
    1734                 | primary_value '[' opt_call_args rbracket tOP_ASGN arg
    1735                     {
    1736                       $$ = new_op_asgn(p, new_call(p, $1, intern("[]",2), $3), $5, $6);
    1737                     }
    1738                 | primary_value '.' tIDENTIFIER tOP_ASGN arg
    1739                     {
    1740                       $$ = new_op_asgn(p, new_call(p, $1, $3, 0), $4, $5);
    1741                     }
    1742                 | primary_value '.' tCONSTANT tOP_ASGN arg
    1743                     {
    1744                       $$ = new_op_asgn(p, new_call(p, $1, $3, 0), $4, $5);
    1745                     }
    1746                 | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg
    1747                     {
    1748                       $$ = new_op_asgn(p, new_call(p, $1, $3, 0), $4, $5);
    1749                     }
    1750                 | primary_value tCOLON2 tCONSTANT tOP_ASGN arg
     1768                | primary_value '[' opt_call_args rbracket tOP_ASGN arg_rhs
     1769                    {
     1770                      $$ = new_op_asgn(p, new_call(p, $1, intern("[]",2), $3, '.'), $5, $6);
     1771                    }
     1772                | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs
     1773                    {
     1774                      $$ = new_op_asgn(p, new_call(p, $1, $3, 0, $2), $4, $5);
     1775                    }
     1776                | primary_value call_op tCONSTANT tOP_ASGN arg_rhs
     1777                    {
     1778                      $$ = new_op_asgn(p, new_call(p, $1, $3, 0, $2), $4, $5);
     1779                    }
     1780                | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs
     1781                    {
     1782                      $$ = new_op_asgn(p, new_call(p, $1, $3, 0, tCOLON2), $4, $5);
     1783                    }
     1784                | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs
    17511785                    {
    17521786                      yyerror(p, "constant re-assignment");
    17531787                      $$ = new_begin(p, 0);
    17541788                    }
    1755                 | tCOLON3 tCONSTANT tOP_ASGN arg
     1789                | tCOLON3 tCONSTANT tOP_ASGN arg_rhs
    17561790                    {
    17571791                      yyerror(p, "constant re-assignment");
    17581792                      $$ = new_begin(p, 0);
    17591793                    }
    1760                 | backref tOP_ASGN arg
     1794                | backref tOP_ASGN arg_rhs
    17611795                    {
    17621796                      backref_error(p, $1);
     
    18971931                ;
    18981932
    1899 arg_value       : arg
    1900                     {
    1901                       $$ = $1;
    1902                       if (!$$) $$ = new_nil(p);
    1903                     }
    1904                 ;
    1905 
    19061933aref_args       : none
    19071934                | args trailer
     
    19101937                      NODE_LINENO($$, $1);
    19111938                    }
    1912                 | args ',' assocs trailer
     1939                | args comma assocs trailer
    19131940                    {
    19141941                      $$ = push($1, new_hash(p, $3));
     
    19181945                      $$ = cons(new_hash(p, $1), 0);
    19191946                      NODE_LINENO($$, $1);
     1947                    }
     1948                ;
     1949
     1950arg_rhs         : arg %prec tOP_ASGN
     1951                    {
     1952                      $$ = $1;
     1953                    }
     1954                | arg modifier_rescue arg
     1955                    {
     1956                      void_expr_error(p, $1);
     1957                      void_expr_error(p, $3);
     1958                      $$ = new_mod_rescue(p, $1, $3);
    19201959                    }
    19211960                ;
     
    19381977                      NODE_LINENO($$, $1);
    19391978                    }
    1940                 | args ',' assocs ','
     1979                | args comma assocs ','
    19411980                    {
    19421981                      $$ = cons(push($1, new_hash(p, $3)), 0);
     
    19521991call_args       : command
    19531992                    {
     1993                      void_expr_error(p, $1);
    19541994                      $$ = cons(list1($1), 0);
    19551995                      NODE_LINENO($$, $1);
     
    19652005                      NODE_LINENO($$, $1);
    19662006                    }
    1967                 | args ',' assocs opt_block_arg
     2007                | args comma assocs opt_block_arg
    19682008                    {
    19692009                      $$ = cons(push($1, new_hash(p, $3)), $4);
     
    19882028                ;
    19892029
    1990 block_arg       : tAMPER arg_value
     2030block_arg       : tAMPER arg
    19912031                    {
    19922032                      $$ = new_block_arg(p, $2);
     
    19942034                ;
    19952035
    1996 opt_block_arg   : ',' block_arg
     2036opt_block_arg   : comma block_arg
    19972037                    {
    19982038                      $$ = $2;
     
    20042044                ;
    20052045
    2006 args            : arg_value
    2007                     {
     2046comma           : ','
     2047                | ','  heredoc_bodies
     2048                ;
     2049
     2050args            : arg
     2051                    {
     2052                      void_expr_error(p, $1);
    20082053                      $$ = cons($1, 0);
    20092054                      NODE_LINENO($$, $1);
    20102055                    }
    2011                 | tSTAR arg_value
    2012                     {
     2056                | tSTAR arg
     2057                    {
     2058                      void_expr_error(p, $2);
    20132059                      $$ = cons(new_splat(p, $2), 0);
    20142060                      NODE_LINENO($$, $2);
    20152061                    }
    2016                 | args ',' arg_value
    2017                     {
     2062                | args comma arg
     2063                    {
     2064                      void_expr_error(p, $3);
    20182065                      $$ = push($1, $3);
    20192066                    }
    2020                 | args ',' tSTAR arg_value
    2021                     {
     2067                | args comma tSTAR arg
     2068                    {
     2069                      void_expr_error(p, $4);
    20222070                      $$ = push($1, new_splat(p, $4));
    20232071                    }
    2024                 | args ',' heredoc_bodies arg_value
    2025                     {
    2026                       $$ = push($1, $4);
    2027                     }
    2028                 | args ',' heredoc_bodies tSTAR arg_value
    2029                     {
    2030                       $$ = push($1, new_splat(p, $5));
    2031                     }
    2032                 ;
    2033 
    2034 mrhs            : args ',' arg_value
    2035                     {
     2072                ;
     2073
     2074mrhs            : args comma arg
     2075                    {
     2076                      void_expr_error(p, $3);
    20362077                      $$ = push($1, $3);
    20372078                    }
    2038                 | args ',' tSTAR arg_value
    2039                     {
     2079                | args comma tSTAR arg
     2080                    {
     2081                      void_expr_error(p, $4);
    20402082                      $$ = push($1, new_splat(p, $4));
    20412083                    }
    2042                 | tSTAR arg_value
    2043                     {
     2084                | tSTAR arg
     2085                    {
     2086                      void_expr_error(p, $2);
    20442087                      $$ = list1(new_splat(p, $2));
    20452088                    }
     
    20732116                      p->cmdarg_stack = 0;
    20742117                    }
    2075                   expr {p->lstate = EXPR_ENDARG;} rparen
     2118                  stmt {p->lstate = EXPR_ENDARG;} rparen
    20762119                    {
    20772120                      p->cmdarg_stack = $<stack>2;
     
    20802123                | tLPAREN_ARG {p->lstate = EXPR_ENDARG;} rparen
    20812124                    {
    2082                       $$ = 0;
     2125                      $$ = new_nil(p);
    20832126                    }
    20842127                | tLPAREN compstmt ')'
     
    21082151                      $$ = new_return(p, 0);
    21092152                    }
    2110                 | keyword_yield '(' call_args rparen
    2111                     {
    2112                       $$ = new_yield(p, $3);
    2113                     }
    2114                 | keyword_yield '(' rparen
    2115                     {
    2116                       $$ = new_yield(p, 0);
    2117                     }
    2118                 | keyword_yield
    2119                     {
    2120                       $$ = new_yield(p, 0);
     2153                | keyword_yield opt_paren_args
     2154                    {
     2155                      $$ = new_yield(p, $2);
    21212156                    }
    21222157                | keyword_not '(' expr rparen
     
    22292264                  term
    22302265                    {
    2231                       $<nd>$ = cons(local_switch(p), (node*)(intptr_t)p->in_single);
     2266                      $<nd>$ = cons(local_switch(p), nint(p->in_single));
    22322267                      p->in_single = 0;
    22332268                    }
     
    22392274                      local_resume(p, $<nd>6->car);
    22402275                      p->in_def = $<num>4;
    2241                       p->in_single = (int)(intptr_t)$<nd>6->cdr;
     2276                      p->in_single = intn($<nd>6->cdr);
    22422277                    }
    22432278                | keyword_module
     
    24332468                | f_arg ','
    24342469                    {
    2435                       $$ = new_args(p, $1, 0, 1, 0, 0);
     2470                      $$ = new_args(p, $1, 0, 0, 0, 0);
    24362471                    }
    24372472                | f_arg ',' f_rest_arg ',' f_arg opt_f_block_arg
     
    25612596                      $$ = $1;
    25622597                    }
    2563                 | block_call dot_or_colon operation2 opt_paren_args
    2564                     {
    2565                       $$ = new_call(p, $1, $3, $4);
    2566                     }
    2567                 | block_call dot_or_colon operation2 opt_paren_args brace_block
    2568                     {
    2569                       $$ = new_call(p, $1, $3, $4);
     2598                | block_call call_op2 operation2 opt_paren_args
     2599                    {
     2600                      $$ = new_call(p, $1, $3, $4, $2);
     2601                    }
     2602                | block_call call_op2 operation2 opt_paren_args brace_block
     2603                    {
     2604                      $$ = new_call(p, $1, $3, $4, $2);
    25702605                      call_with_block(p, $$, $5);
    25712606                    }
    2572                 | block_call dot_or_colon operation2 command_args do_block
    2573                     {
    2574                       $$ = new_call(p, $1, $3, $4);
     2607                | block_call call_op2 operation2 command_args do_block
     2608                    {
     2609                      $$ = new_call(p, $1, $3, $4, $2);
    25752610                      call_with_block(p, $$, $5);
    25762611                    }
     
    25812616                      $$ = new_fcall(p, $1, $2);
    25822617                    }
    2583                 | primary_value '.' operation2 opt_paren_args
    2584                     {
    2585                       $$ = new_call(p, $1, $3, $4);
     2618                | primary_value call_op operation2 opt_paren_args
     2619                    {
     2620                      $$ = new_call(p, $1, $3, $4, $2);
    25862621                    }
    25872622                | primary_value tCOLON2 operation2 paren_args
    25882623                    {
    2589                       $$ = new_call(p, $1, $3, $4);
     2624                      $$ = new_call(p, $1, $3, $4, tCOLON2);
    25902625                    }
    25912626                | primary_value tCOLON2 operation3
    25922627                    {
    2593                       $$ = new_call(p, $1, $3, 0);
    2594                     }
    2595                 | primary_value '.' paren_args
    2596                     {
    2597                       $$ = new_call(p, $1, intern("call",4), $3);
     2628                      $$ = new_call(p, $1, $3, 0, tCOLON2);
     2629                    }
     2630                | primary_value call_op paren_args
     2631                    {
     2632                      $$ = new_call(p, $1, intern("call",4), $3, $2);
    25982633                    }
    25992634                | primary_value tCOLON2 paren_args
    26002635                    {
    2601                       $$ = new_call(p, $1, intern("call",4), $3);
     2636                      $$ = new_call(p, $1, intern("call",4), $3, tCOLON2);
    26022637                    }
    26032638                | keyword_super paren_args
     
    26112646                | primary_value '[' opt_call_args rbracket
    26122647                    {
    2613                       $$ = new_call(p, $1, intern("[]",2), $3);
     2648                      $$ = new_call(p, $1, intern("[]",2), $3, '.');
    26142649                    }
    26152650                ;
     
    26712706                ;
    26722707
    2673 exc_list        : arg_value
     2708exc_list        : arg
    26742709                    {
    26752710                        $$ = list1($1);
     
    27662801                ;
    27672802
    2768 opt_heredoc_bodies : /* none */
    2769                    | heredoc_bodies
    2770                    ;
    2771 
    27722803heredoc_bodies  : heredoc_body
    27732804                | heredoc_bodies heredoc_body
     
    28252856                      $$ = new_sym(p, $1);
    28262857                    }
    2827                 | tSYMBEG tSTRING_BEG string_interp tSTRING
     2858                | tSYMBEG tSTRING_BEG string_rep tSTRING
    28282859                    {
    28292860                      p->lstate = EXPR_END;
     
    29252956                | keyword__FILE__
    29262957                    {
    2927                       if (!p->filename) {
    2928                         p->filename = "(null)";
     2958                      const char *fn = p->filename;
     2959                      if (!fn) {
     2960                        fn = "(null)";
    29292961                      }
    2930                       $$ = new_str(p, p->filename, strlen(p->filename));
     2962                      $$ = new_str(p, fn, strlen(fn));
    29312963                    }
    29322964                | keyword__LINE__
     
    29552987                    {
    29562988                      $$ = $3;
    2957                     } /* 
     2989                    } /*
    29582990                | error term
    29592991                    {
     
    30983130                ;
    30993131
    3100 f_opt           : f_opt_asgn arg_value
    3101                     {
     3132f_opt           : f_opt_asgn arg
     3133                    {
     3134                      void_expr_error(p, $2);
    31023135                      $$ = cons(nsym($1), $2);
    31033136                    }
     
    31063139f_block_opt     : f_opt_asgn primary_value
    31073140                    {
     3141                      void_expr_error(p, $2);
    31083142                      $$ = cons(nsym($1), $2);
    31093143                    }
     
    31793213                      }
    31803214                      else {
    3181                         switch ((enum node_type)(int)(intptr_t)$3->car) {
     3215                        switch ((enum node_type)intn($3->car)) {
    31823216                        case NODE_STR:
    31833217                        case NODE_DSTR:
     
    32163250                ;
    32173251
    3218 assoc           : arg_value tASSOC arg_value
    3219                     {
     3252assoc           : arg tASSOC arg
     3253                    {
     3254                      void_expr_error(p, $1);
     3255                      void_expr_error(p, $3);
    32203256                      $$ = cons($1, $3);
    32213257                    }
    3222                 | tLABEL arg_value
    3223                     {
     3258                | tLABEL arg
     3259                    {
     3260                      void_expr_error(p, $2);
    32243261                      $$ = cons(new_sym(p, $1), $2);
     3262                    }
     3263                | tLABEL_END arg
     3264                    {
     3265                      void_expr_error(p, $2);
     3266                      $$ = cons(new_sym(p, new_strsym(p, $1)), $2);
     3267                    }
     3268                | tSTRING_BEG tLABEL_END arg
     3269                    {
     3270                      void_expr_error(p, $3);
     3271                      $$ = cons(new_sym(p, new_strsym(p, $2)), $3);
     3272                    }
     3273                | tSTRING_BEG string_rep tLABEL_END arg
     3274                    {
     3275                      void_expr_error(p, $4);
     3276                      $$ = cons(new_dsym(p, push($2, $3)), $4);
    32253277                    }
    32263278                ;
     
    32463298                ;
    32473299
     3300call_op         : '.'
     3301                    {
     3302                      $$ = '.';
     3303                    }
     3304                | tANDDOT
     3305                    {
     3306                      $$ = 0;
     3307                    }
     3308                ;
     3309
     3310call_op2        : call_op
     3311                | tCOLON2
     3312                    {
     3313                      $$ = tCOLON2;
     3314                    }
     3315                ;
     3316
    32483317opt_terms       : /* none */
    32493318                | terms
     
    32623331trailer         : /* none */
    32633332                | nl
    3264                 | ','
     3333                | comma
    32653334                ;
    32663335
    32673336term            : ';' {yyerrok;}
    32683337                | nl
     3338                | heredoc_body
    32693339                ;
    32703340
     
    32743344                      p->column = 0;
    32753345                    }
    3276                   opt_heredoc_bodies
     3346                ;
    32773347
    32783348terms           : term
    3279                 | terms ';' {yyerrok;}
     3349                | terms term
    32803350                ;
    32813351
     
    32863356                ;
    32873357%%
    3288 #define yylval  (*((YYSTYPE*)(p->ylval)))
     3358#define pylval  (*((YYSTYPE*)(p->ylval)))
    32893359
    32903360static void
     
    33743444
    33753445  if (c == NODE_NTH_REF) {
    3376     yyerror_i(p, "can't set variable $%d", (int)(intptr_t)n->cdr);
     3446    yyerror_i(p, "can't set variable $%" MRB_PRId, (mrb_int)(intptr_t)n->cdr);
    33773447  }
    33783448  else if (c == NODE_BACK_REF) {
     
    33813451  else {
    33823452    mrb_bug(p->mrb, "Internal error in backref_error() : n=>car == %S", mrb_fixnum_value(c));
     3453  }
     3454}
     3455
     3456static void
     3457void_expr_error(parser_state *p, node *n)
     3458{
     3459  int c;
     3460
     3461  if (n == NULL) return;
     3462  c = (int)(intptr_t)n->car;
     3463  switch (c) {
     3464  case NODE_BREAK:
     3465  case NODE_RETURN:
     3466  case NODE_NEXT:
     3467  case NODE_REDO:
     3468  case NODE_RETRY:
     3469    yyerror(p, "void value expression");
     3470    break;
     3471  case NODE_AND:
     3472  case NODE_OR:
     3473    void_expr_error(p, n->cdr->car);
     3474    void_expr_error(p, n->cdr->cdr);
     3475    break;
     3476  case NODE_BEGIN:
     3477    if (n->cdr) {
     3478      while (n->cdr) {
     3479        n = n->cdr;
     3480      }
     3481      void_expr_error(p, n->car);
     3482    }
     3483    break;
     3484  default:
     3485    break;
    33833486  }
    33843487}
     
    34693572    c0 = nextc(p);
    34703573    if (c0 == -1) return c0;    /* do not skip partial EOF */
     3574    if (c0 >= 0) --p->column;
    34713575    list = push(list, (node*)(intptr_t)c0);
    34723576  } while(n--);
     
    35173621    for (;;) {
    35183622      c = nextc(p);
    3519       if (c < 0) return c;
     3623      if (c < 0) return FALSE;
    35203624      if (c == '\n') {
    35213625        p->lineno++;
     
    35473651newtok(parser_state *p)
    35483652{
    3549   p->bidx = 0;
     3653  if (p->tokbuf != p->buf) {
     3654    mrb_free(p->mrb, p->tokbuf);
     3655    p->tokbuf = p->buf;
     3656    p->tsiz = MRB_PARSER_TOKBUF_SIZE;
     3657  }
     3658  p->tidx = 0;
    35503659  return p->column - 1;
    35513660}
     
    35553664{
    35563665  char utf8[4];
    3557   unsigned len;
     3666  int i, len;
    35583667
    35593668  /* mrb_assert(-0x10FFFF <= c && c <= 0xFF); */
     
    35893698    }
    35903699  }
    3591   if (p->bidx+len <= MRB_PARSER_BUF_SIZE) {
    3592     unsigned i;
    3593     for (i = 0; i < len; i++) {
    3594       p->buf[p->bidx++] = utf8[i];
    3595     }
     3700  if (p->tidx+len >= p->tsiz) {
     3701    if (p->tsiz >= MRB_PARSER_TOKBUF_MAX) {
     3702      p->tidx += len;
     3703      return;
     3704    }
     3705    p->tsiz *= 2;
     3706    if (p->tokbuf == p->buf) {
     3707      p->tokbuf = (char*)mrb_malloc(p->mrb, p->tsiz);
     3708      memcpy(p->tokbuf, p->buf, MRB_PARSER_TOKBUF_SIZE);
     3709    }
     3710    else {
     3711      p->tokbuf = (char*)mrb_realloc(p->mrb, p->tokbuf, p->tsiz);
     3712    }
     3713  }
     3714  for (i = 0; i < len; i++) {
     3715    p->tokbuf[p->tidx++] = utf8[i];
    35963716  }
    35973717}
     
    36003720toklast(parser_state *p)
    36013721{
    3602   return p->buf[p->bidx-1];
     3722  return p->tokbuf[p->tidx-1];
    36033723}
    36043724
     
    36063726tokfix(parser_state *p)
    36073727{
    3608   int i = p->bidx, imax = MRB_PARSER_BUF_SIZE - 1;
    3609 
    3610   if (i > imax) {
    3611     i = imax;
     3728  if (p->tidx >= MRB_PARSER_TOKBUF_MAX) {
     3729    p->tidx = MRB_PARSER_TOKBUF_MAX-1;
    36123730    yyerror(p, "string too long (truncated)");
    36133731  }
    3614   p->buf[i] = '\0';
     3732  p->tokbuf[p->tidx] = '\0';
    36153733}
    36163734
     
    36183736tok(parser_state *p)
    36193737{
    3620   return p->buf;
     3738  return p->tokbuf;
    36213739}
    36223740
     
    36243742toklen(parser_state *p)
    36253743{
    3626   return p->bidx;
     3744  return p->tidx;
    36273745}
    36283746
     
    36673785
    36683786  return retval;
     3787}
     3788
     3789static int32_t
     3790read_escape_unicode(parser_state *p, int limit)
     3791{
     3792  int32_t c;
     3793  int buf[9];
     3794  int i;
     3795
     3796  /* Look for opening brace */
     3797  i = 0;
     3798  buf[0] = nextc(p);
     3799  if (buf[0] < 0) goto eof;
     3800  if (ISXDIGIT(buf[0])) {
     3801    /* \uxxxx form */
     3802    for (i=1; i<limit; i++) {
     3803      buf[i] = nextc(p);
     3804      if (buf[i] < 0) goto eof;
     3805      if (!ISXDIGIT(buf[i])) {
     3806        pushback(p, buf[i]);
     3807        break;
     3808      }
     3809    }
     3810  }
     3811  else {
     3812    pushback(p, buf[0]);
     3813  }
     3814  c = scan_hex(buf, i, &i);
     3815  if (i == 0) {
     3816  eof:
     3817    yyerror(p, "Invalid escape character syntax");
     3818    return -1;
     3819  }
     3820  if (c < 0 || c > 0x10FFFF || (c & 0xFFFFF800) == 0xD800) {
     3821    yyerror(p, "Invalid Unicode code point");
     3822    return -1;
     3823  }
     3824  return c;
    36693825}
    36703826
     
    37413897
    37423898  case 'u':     /* Unicode */
    3743   {
    3744     int buf[9];
    3745     int i;
    3746 
    3747     /* Look for opening brace */
    3748     i = 0;
    3749     buf[0] = nextc(p);
    3750     if (buf[0] < 0) goto eof;
    3751     if (buf[0] == '{') {
     3899    if (peek(p, '{')) {
    37523900      /* \u{xxxxxxxx} form */
    3753       for (i=0; i<9; i++) {
    3754         buf[i] = nextc(p);
    3755         if (buf[i] < 0) goto eof;
    3756         if (buf[i] == '}') {
    3757           break;
    3758         }
    3759         else if (!ISXDIGIT(buf[i])) {
    3760           yyerror(p, "Invalid escape character syntax");
    3761           pushback(p, buf[i]);
    3762           return 0;
    3763         }
    3764       }
    3765     }
    3766     else if (ISXDIGIT(buf[0])) {
    3767       /* \uxxxx form */
    3768       for (i=1; i<4; i++) {
    3769         buf[i] = nextc(p);
    3770         if (buf[i] < 0) goto eof;
    3771         if (!ISXDIGIT(buf[i])) {
    3772           pushback(p, buf[i]);
    3773           break;
    3774         }
    3775       }
     3901      nextc(p);
     3902      c = read_escape_unicode(p, 8);
     3903      if (c < 0) return 0;
     3904      if (nextc(p) != '}') goto eof;
    37763905    }
    37773906    else {
    3778       pushback(p, buf[0]);
    3779     }
    3780     c = scan_hex(buf, i, &i);
    3781     if (i == 0) {
    3782       yyerror(p, "Invalid escape character syntax");
    3783       return 0;
    3784     }
    3785     if (c < 0 || c > 0x10FFFF || (c & 0xFFFFF800) == 0xD800) {
    3786       yyerror(p, "Invalid Unicode code point");
    3787       return 0;
    3788     }
    3789   }
     3907      c = read_escape_unicode(p, 4);
     3908      if (c < 0) return 0;
     3909    }
    37903910  return -c;
    37913911
     
    38453965  int end = (intptr_t)p->lex_strterm->cdr->cdr->cdr;
    38463966  parser_heredoc_info *hinf = (type & STR_FUNC_HEREDOC) ? parsing_heredoc_inf(p) : NULL;
    3847 
     3967  int cmd_state = p->cmd_start;
     3968
     3969  if (beg == 0) beg = -3;       /* should never happen */
     3970  if (end == 0) end = -3;
    38483971  newtok(p);
    38493972  while ((c = nextc(p)) != end || nest_level != 0) {
     
    38673990        }
    38683991        if ((len-1 == hinf->term_len) && (strncmp(s, hinf->term, len-1) == 0)) {
    3869           return tHEREDOC_END;
     3992          if (c < 0) {
     3993            p->parsing_heredoc = NULL;
     3994          }
     3995          else {
     3996            return tHEREDOC_END;
     3997          }
    38703998        }
    38713999      }
     
    38764004        return 0;
    38774005      }
    3878       yylval.nd = new_str(p, tok(p), toklen(p));
     4006      pylval.nd = new_str(p, tok(p), toklen(p));
    38794007      return tHD_STRING_MID;
    38804008    }
     
    39084036          tokadd(p, c);
    39094037        }
     4038        else if (c == 'u' && peek(p, '{')) {
     4039          /* \u{xxxx xxxx xxxx} form */
     4040          nextc(p);
     4041          while (1) {
     4042            do c = nextc(p); while (ISSPACE(c));
     4043            if (c == '}') break;
     4044            pushback(p, c);
     4045            c = read_escape_unicode(p, 8);
     4046            if (c < 0) break;
     4047            tokadd(p, -c);
     4048          }
     4049          if (hinf)
     4050            hinf->line_head = FALSE;
     4051        }
    39104052        else {
    39114053          pushback(p, c);
     
    39354077        p->lstate = EXPR_BEG;
    39364078        p->cmd_start = TRUE;
    3937         yylval.nd = new_str(p, tok(p), toklen(p));
     4079        pylval.nd = new_str(p, tok(p), toklen(p));
    39384080        if (hinf) {
    39394081          hinf->line_head = FALSE;
     
    39654107        pushback(p, c);
    39664108        tokfix(p);
    3967         yylval.nd = new_str(p, tok(p), toklen(p));
     4109        pylval.nd = new_str(p, tok(p), toklen(p));
    39684110        return tSTRING_MID;
    39694111      }
     4112    }
     4113    if (c == '\n') {
     4114      p->lineno++;
     4115      p->column = 0;
    39704116    }
    39714117    tokadd(p, c);
     
    39774123
    39784124  if (type & STR_FUNC_XQUOTE) {
    3979     yylval.nd = new_xstr(p, tok(p), toklen(p));
     4125    pylval.nd = new_xstr(p, tok(p), toklen(p));
    39804126    return tXSTRING;
    39814127  }
     
    40194165    if (flag > flags) {
    40204166      dup = strndup(flags, (size_t)(flag - flags));
    4021     } else {
     4167    }
     4168    else {
    40224169      dup = NULL;
    40234170    }
    40244171    if (enc) {
    40254172      encp = strndup(&enc, 1);
    4026     } else {
     4173    }
     4174    else {
    40274175      encp = NULL;
    40284176    }
    4029     yylval.nd = new_regx(p, s, dup, encp);
     4177    pylval.nd = new_regx(p, s, dup, encp);
    40304178
    40314179    return tREGEXP;
    40324180  }
    4033 
    4034   yylval.nd = new_str(p, tok(p), toklen(p));
     4181  pylval.nd = new_str(p, tok(p), toklen(p));
     4182  if (IS_LABEL_POSSIBLE()) {
     4183    if (IS_LABEL_SUFFIX(0)) {
     4184      p->lstate = EXPR_BEG;
     4185      nextc(p);
     4186      return tLABEL_END;
     4187    }
     4188  }
     4189
    40354190  return tSTRING;
    40364191}
     
    41024257  p->lstate = EXPR_END;
    41034258
    4104   yylval.nd = newnode;
     4259  pylval.nd = newnode;
    41054260  return tHEREDOC_BEG;
    41064261}
     
    42064361    if ((c = nextc(p)) == '*') {
    42074362      if ((c = nextc(p)) == '=') {
    4208         yylval.id = intern("**",2);
     4363        pylval.id = intern("**",2);
    42094364        p->lstate = EXPR_BEG;
    42104365        return tOP_ASGN;
     
    42154370    else {
    42164371      if (c == '=') {
    4217         yylval.id = intern_c('*');
     4372        pylval.id = intern_c('*');
    42184373        p->lstate = EXPR_BEG;
    42194374        return tOP_ASGN;
     
    43314486    if (c == '<') {
    43324487      if ((c = nextc(p)) == '=') {
    4333         yylval.id = intern("<<",2);
     4488        pylval.id = intern("<<",2);
    43344489        p->lstate = EXPR_BEG;
    43354490        return tOP_ASGN;
     
    43534508    if (c == '>') {
    43544509      if ((c = nextc(p)) == '=') {
    4355         yylval.id = intern(">>",2);
     4510        pylval.id = intern(">>",2);
    43564511        p->lstate = EXPR_BEG;
    43574512        return tOP_ASGN;
     
    44504605    }
    44514606    tokfix(p);
    4452     yylval.nd = new_str(p, tok(p), toklen(p));
     4607    pylval.nd = new_str(p, tok(p), toklen(p));
    44534608    p->lstate = EXPR_END;
    44544609    return tCHAR;
     
    44584613      p->lstate = EXPR_BEG;
    44594614      if ((c = nextc(p)) == '=') {
    4460         yylval.id = intern("&&",2);
     4615        pylval.id = intern("&&",2);
    44614616        p->lstate = EXPR_BEG;
    44624617        return tOP_ASGN;
     
    44654620      return tANDOP;
    44664621    }
     4622    else if (c == '.') {
     4623      p->lstate = EXPR_DOT;
     4624      return tANDDOT;
     4625    }
    44674626    else if (c == '=') {
    4468       yylval.id = intern_c('&');
     4627      pylval.id = intern_c('&');
    44694628      p->lstate = EXPR_BEG;
    44704629      return tOP_ASGN;
     
    44934652      p->lstate = EXPR_BEG;
    44944653      if ((c = nextc(p)) == '=') {
    4495         yylval.id = intern("||",2);
     4654        pylval.id = intern("||",2);
    44964655        p->lstate = EXPR_BEG;
    44974656        return tOP_ASGN;
     
    45014660    }
    45024661    if (c == '=') {
    4503       yylval.id = intern_c('|');
     4662      pylval.id = intern_c('|');
    45044663      p->lstate = EXPR_BEG;
    45054664      return tOP_ASGN;
     
    45254684    }
    45264685    if (c == '=') {
    4527       yylval.id = intern_c('+');
     4686      pylval.id = intern_c('+');
    45284687      p->lstate = EXPR_BEG;
    45294688      return tOP_ASGN;
     
    45534712    }
    45544713    if (c == '=') {
    4555       yylval.id = intern_c('-');
     4714      pylval.id = intern_c('-');
    45564715      p->lstate = EXPR_BEG;
    45574716      return tOP_ASGN;
     
    46274786        }
    46284787        else if (nondigit) goto trailing_uc;
    4629         yylval.nd = new_int(p, tok(p), 16);
     4788        pylval.nd = new_int(p, tok(p), 16);
    46304789        return tINTEGER;
    46314790      }
     
    46514810        }
    46524811        else if (nondigit) goto trailing_uc;
    4653         yylval.nd = new_int(p, tok(p), 2);
     4812        pylval.nd = new_int(p, tok(p), 2);
    46544813        return tINTEGER;
    46554814      }
     
    46754834        }
    46764835        else if (nondigit) goto trailing_uc;
    4677         yylval.nd = new_int(p, tok(p), 10);
     4836        pylval.nd = new_int(p, tok(p), 10);
    46784837        return tINTEGER;
    46794838      }
     
    47084867          tokfix(p);
    47094868          if (nondigit) goto trailing_uc;
    4710           yylval.nd = new_int(p, tok(p), 8);
     4869          pylval.nd = new_int(p, tok(p), 8);
    47114870          return tINTEGER;
    47124871        }
     
    47254884      else {
    47264885        pushback(p, c);
    4727         yylval.nd = new_int(p, "0", 10);
     4886        pylval.nd = new_int(p, "0", 10);
    47284887        return tINTEGER;
    47294888      }
     
    48014960
    48024961      errno = 0;
    4803       d = strtod(tok(p), &endp);
     4962      d = mrb_float_read(tok(p), &endp);
    48044963      if (d == 0 && endp == tok(p)) {
    48054964        yywarning_s(p, "corrupted float value %s", tok(p));
     
    48094968        errno = 0;
    48104969      }
    4811       yylval.nd = new_float(p, tok(p));
     4970      pylval.nd = new_float(p, tok(p));
    48124971      return tFLOAT;
    48134972    }
    4814     yylval.nd = new_int(p, tok(p), 10);
     4973    pylval.nd = new_int(p, tok(p), 10);
    48154974    return tINTEGER;
    48164975  }
     
    48545013    }
    48555014    if ((c = nextc(p)) == '=') {
    4856       yylval.id = intern_c('/');
     5015      pylval.id = intern_c('/');
    48575016      p->lstate = EXPR_BEG;
    48585017      return tOP_ASGN;
     
    48735032  case '^':
    48745033    if ((c = nextc(p)) == '=') {
    4875       yylval.id = intern_c('^');
     5034      pylval.id = intern_c('^');
    48765035      p->lstate = EXPR_BEG;
    48775036      return tOP_ASGN;
     
    50475206    }
    50485207    if ((c = nextc(p)) == '=') {
    5049       yylval.id = intern_c('%');
     5208      pylval.id = intern_c('%');
    50505209      p->lstate = EXPR_BEG;
    50515210      return tOP_ASGN;
     
    51015260      tokadd(p, c);
    51025261      tokfix(p);
    5103       yylval.id = intern_cstr(tok(p));
     5262      pylval.id = intern_cstr(tok(p));
    51045263      return tGVAR;
    51055264
     
    51115270      gvar:
    51125271      tokfix(p);
    5113       yylval.id = intern_cstr(tok(p));
     5272      pylval.id = intern_cstr(tok(p));
    51145273      return tGVAR;
    51155274
     
    51235282        goto gvar;
    51245283      }
    5125       yylval.nd = new_back_ref(p, c);
     5284      pylval.nd = new_back_ref(p, c);
    51265285      return tBACK_REF;
    51275286
     
    51425301          return 0;
    51435302        }
    5144         yylval.nd = new_nth_ref(p, (int)n);
     5303        pylval.nd = new_nth_ref(p, (int)n);
    51455304      }
    51465305      return tNTH_REF;
     
    51665325      }
    51675326      if (c < 0) {
    5168         if (p->bidx == 1) {
     5327        if (p->tidx == 1) {
    51695328          yyerror(p, "incomplete instance variable syntax");
    51705329        }
     
    51755334      }
    51765335      else if (isdigit(c)) {
    5177         if (p->bidx == 1) {
     5336        if (p->tidx == 1) {
    51785337          yyerror_i(p, "'@%c' is not allowed as an instance variable name", c);
    51795338        }
     
    52705429          nextc(p);
    52715430          tokfix(p);
    5272           yylval.id = intern_cstr(tok(p));
     5431          pylval.id = intern_cstr(tok(p));
    52735432          return tLABEL;
    52745433        }
     
    52815440        if (kw) {
    52825441          enum mrb_lex_state_enum state = p->lstate;
    5283           yylval.num = p->lineno;
     5442          pylval.num = p->lineno;
    52845443          p->lstate = kw->state;
    52855444          if (state == EXPR_FNAME) {
    5286             yylval.id = intern_cstr(kw->name);
     5445            pylval.id = intern_cstr(kw->name);
    52875446            return kw->id[0];
    52885447          }
     
    53315490      mrb_sym ident = intern_cstr(tok(p));
    53325491
    5333       yylval.id = ident;
     5492      pylval.id = ident;
    53345493#if 0
    53355494      if (last_state != EXPR_DOT && islower(tok(p)[0]) && lvar_defined(ident)) {
     
    53965555mrb_parser_parse(parser_state *p, mrbc_context *c)
    53975556{
    5398   struct mrb_jmpbuf buf;
    5399   p->jmp = &buf;
     5557  struct mrb_jmpbuf buf1;
     5558  p->jmp = &buf1;
    54005559
    54015560  MRB_TRY(p->jmp) {
     5561    int n;
    54025562
    54035563    p->cmd_start = TRUE;
     
    54075567
    54085568    parser_init_cxt(p, c);
    5409     yyparse(p);
     5569
     5570    if (p->mrb->jmp) {
     5571      n = yyparse(p);
     5572    }
     5573    else {
     5574      struct mrb_jmpbuf buf2;
     5575
     5576      p->mrb->jmp = &buf2;
     5577      MRB_TRY(p->mrb->jmp) {
     5578        n = yyparse(p);
     5579      }
     5580      MRB_CATCH(p->mrb->jmp) {
     5581        p->nerr++;
     5582      }
     5583      MRB_END_EXC(p->mrb->jmp);
     5584      p->mrb->jmp = 0;
     5585    }
     5586    if (n != 0 || p->nerr > 0) {
     5587      p->tree = 0;
     5588      return;
     5589    }
    54105590    if (!p->tree) {
    54115591      p->tree = new_nil(p);
     
    54155595      mrb_parser_dump(p->mrb, p->tree, 0);
    54165596    }
    5417 
    54185597  }
    54195598  MRB_CATCH(p->jmp) {
     
    54435622
    54445623  p->s = p->send = NULL;
    5445 #ifndef MRB_DISBLE_STDIO
     5624#ifndef MRB_DISABLE_STDIO
    54465625  p->f = NULL;
    54475626#endif
     
    54565635  yydebug = 1;
    54575636#endif
     5637  p->tsiz = MRB_PARSER_TOKBUF_SIZE;
     5638  p->tokbuf = p->buf;
    54585639
    54595640  p->lex_strterm = NULL;
     
    54705651MRB_API void
    54715652mrb_parser_free(parser_state *p) {
     5653  if (p->tokbuf != p->buf) {
     5654    mrb_free(p->mrb, p->tokbuf);
     5655  }
    54725656  mrb_pool_close(p->pool);
    54735657}
     
    54825666mrbc_context_free(mrb_state *mrb, mrbc_context *cxt)
    54835667{
     5668  mrb_free(mrb, cxt->filename);
    54845669  mrb_free(mrb, cxt->syms);
    54855670  mrb_free(mrb, cxt);
     
    54915676  if (s) {
    54925677    int len = strlen(s);
    5493     char *p = (char *)mrb_alloca(mrb, len + 1);
     5678    char *p = (char *)mrb_malloc(mrb, len + 1);
    54945679
    54955680    memcpy(p, s, len + 1);
     5681    if (c->filename) {
     5682      mrb_free(mrb, c->filename);
     5683    }
    54965684    c->filename = p;
    54975685  }
     
    55785766}
    55795767
    5580 static mrb_value
    5581 load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
     5768MRB_API mrb_value
     5769mrb_load_exec(mrb_state *mrb, struct mrb_parser_state *p, mrbc_context *c)
    55825770{
    55835771  struct RClass *target = mrb->object_class;
     
    56015789    }
    56025790    else {
    5603       mrb->exc = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, E_SYNTAX_ERROR, "syntax error"));
     5791      if (mrb->exc == NULL) {
     5792        mrb->exc = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, E_SYNTAX_ERROR, "syntax error"));
     5793      }
    56045794      mrb_parser_free(p);
    56055795      return mrb_undef_value();
     
    56095799  mrb_parser_free(p);
    56105800  if (proc == NULL) {
    5611     mrb->exc = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, E_SCRIPT_ERROR, "codegen error"));
     5801    if (mrb->exc == NULL) {
     5802      mrb->exc = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, E_SCRIPT_ERROR, "codegen error"));
     5803    }
    56125804    return mrb_undef_value();
    56135805  }
     
    56295821    mrb->c->ci->target_class = target;
    56305822  }
    5631   v = mrb_toplevel_run_keep(mrb, proc, keep);
     5823  v = mrb_top_run(mrb, proc, mrb_top_self(mrb), keep);
    56325824  if (mrb->exc) return mrb_nil_value();
    56335825  return v;
     
    56385830mrb_load_file_cxt(mrb_state *mrb, FILE *f, mrbc_context *c)
    56395831{
    5640   return load_exec(mrb, mrb_parse_file(mrb, f, c), c);
     5832  return mrb_load_exec(mrb, mrb_parse_file(mrb, f, c), c);
    56415833}
    56425834
     
    56515843mrb_load_nstring_cxt(mrb_state *mrb, const char *s, int len, mrbc_context *c)
    56525844{
    5653   return load_exec(mrb, mrb_parse_nstring(mrb, s, len, c), c);
     5845  return mrb_load_exec(mrb, mrb_parse_nstring(mrb, s, len, c), c);
    56545846}
    56555847
     
    58055997        dump_recur(mrb, n->car, offset+2);
    58065998      }
    5807       n = n->cdr;
    5808       if (n) {
     5999      if (n->cdr) {
    58096000        dump_prefix(n, offset+1);
    5810         printf("blk=&%s\n", mrb_sym2name(mrb, sym(n)));
     6001        printf("blk=&%s\n", mrb_sym2name(mrb, sym(n->cdr)));
    58116002      }
    58126003    }
     
    59466137  case NODE_FCALL:
    59476138  case NODE_CALL:
    5948     printf("NODE_CALL:\n");
     6139  case NODE_SCALL:
     6140    switch (nodetype) {
     6141    case NODE_FCALL:
     6142      printf("NODE_FCALL:\n"); break;
     6143    case NODE_CALL:
     6144      printf("NODE_CALL(.):\n"); break;
     6145    case NODE_SCALL:
     6146      printf("NODE_SCALL(&.):\n"); break;
     6147    default:
     6148      break;
     6149    }
    59496150    mrb_parser_dump(mrb, tree->car, offset+1);
    59506151    dump_prefix(tree, offset+1);
     
    61546355
    61556356  case NODE_NTH_REF:
    6156     printf("NODE_NTH_REF: $%d\n", (int)(intptr_t)tree);
     6357    printf("NODE_NTH_REF: $%" MRB_PRId "\n", (mrb_int)(intptr_t)tree);
    61576358    break;
    61586359
     
    62066407    dump_prefix(tree, offset);
    62076408    printf("tail: %s\n", (char*)tree->cdr->cdr->car);
    6208     dump_prefix(tree, offset);
    6209     printf("opt: %s\n", (char*)tree->cdr->cdr->cdr);
     6409    if (tree->cdr->cdr->cdr->car) {
     6410      dump_prefix(tree, offset);
     6411      printf("opt: %s\n", (char*)tree->cdr->cdr->cdr->car);
     6412    }
     6413    if (tree->cdr->cdr->cdr->cdr) {
     6414      dump_prefix(tree, offset);
     6415      printf("enc: %s\n", (char*)tree->cdr->cdr->cdr->cdr);
     6416    }
    62106417    break;
    62116418
    62126419  case NODE_SYM:
    6213     printf("NODE_SYM :%s\n", mrb_sym2name(mrb, sym(tree)));
     6420    printf("NODE_SYM :%s (%d)\n", mrb_sym2name(mrb, sym(tree)),
     6421           (int)(intptr_t)tree);
    62146422    break;
    62156423
     
    64256633
    64266634  case NODE_HEREDOC:
    6427     printf("NODE_HEREDOC:\n");
    6428     mrb_parser_dump(mrb, ((parser_heredoc_info*)tree)->doc, offset+1);
     6635    printf("NODE_HEREDOC (<<%s):\n", ((parser_heredoc_info*)tree)->term);
     6636    dump_recur(mrb, ((parser_heredoc_info*)tree)->doc, offset+1);
    64296637    break;
    64306638
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-compiler/mrbgem.rake

    r321 r331  
    99  lex_def = "#{current_dir}/core/lex.def"
    1010  core_objs = Dir.glob("#{current_dir}/core/*.c").map { |f|
    11     next nil if build.cxx_abi_enabled? and f =~ /(codegen).c$/
     11    next nil if build.cxx_exception_enabled? and f =~ /(codegen).c$/
    1212    objfile(f.pathmap("#{current_build_dir}/core/%n"))
    1313  }.compact
    1414
    15   if build.cxx_abi_enabled?
     15  if build.cxx_exception_enabled?
    1616    core_objs <<
    1717      build.compile_as_cxx("#{current_build_dir}/core/y.tab.c", "#{current_build_dir}/core/y.tab.cxx",
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-enum-ext/mrblib/enum.rb

    r321 r331  
    5959  def take(n)
    6060    raise TypeError, "no implicit conversion of #{n.class} into Integer" unless n.respond_to?(:to_int)
    61     raise ArgumentError, "attempt to take negative size" if n < 0
    62 
    63     n = n.to_int
    64     ary = []
    65     self.each do |*val|
    66       break if ary.size >= n
     61    i = n.to_int
     62    raise ArgumentError, "attempt to take negative size" if i < 0
     63    ary = []
     64    return ary if i == 0
     65    self.each do |*val|
    6766      ary << val.__svalue
     67      i -= 1
     68      break if i == 0
    6869    end
    6970    ary
     
    124125      block.call(ary.dup) if ary.size == n
    125126    end
     127    nil
    126128  end
    127129
     
    154156    end
    155157    block.call(ary) unless ary.empty?
     158    nil
    156159  end
    157160
     
    215218  # If the enumerable is empty, the first form returns <code>nil</code>, and the
    216219  # second form returns an empty array.
    217   def first(n=NONE)
    218     if n == NONE
     220  def first(*args)
     221    case args.length
     222    when 0
    219223      self.each do |*val|
    220224        return val.__svalue
    221225      end
    222226      return nil
     227    when 1
     228      n = args[0]
     229      raise TypeError, "no implicit conversion of #{n.class} into Integer" unless n.respond_to?(:to_int)
     230      i = n.to_int
     231      raise ArgumentError, "attempt to take negative size" if i < 0
     232      ary = []
     233      return ary if i == 0
     234      self.each do |*val|
     235        ary << val.__svalue
     236        i -= 1
     237        break if i == 0
     238      end
     239      ary
    223240    else
    224       a = []
    225       i = 0
    226       self.each do |*val|
    227         break if n<=i
    228         a.push val.__svalue
    229         i += 1
    230       end
    231       a
     241      raise ArgumentError, "wrong number of arguments (given #{args.length}, expected 0..1)"
    232242    end
    233243  end
     
    385395        first = false
    386396      else
     397        val = val.__svalue
    387398        if block
    388           max = val.__svalue if block.call(*val, max) > 0
    389           min = val.__svalue if block.call(*val, min) < 0
     399          max = val if block.call(val, max) > 0
     400          min = val if block.call(val, min) < 0
    390401        else
    391           val = val.__svalue
    392402          max = val if (val <=> max) > 0
    393403          min = val if (val <=> min) < 0
     
    574584  #
    575585
    576   def cycle(n=nil, &block)
    577     return to_enum(:cycle, n) if !block && n.nil?
    578 
    579     ary = []
    580     if n.nil?
    581       self.each do|*val|
    582         ary.push val
    583         block.call(*val)
    584       end
    585       loop do
    586         ary.each do|e|
    587           block.call(*e)
    588         end
    589       end
     586  def cycle(nv = nil, &block)
     587    return to_enum(:cycle, nv) unless block
     588
     589    n = nil
     590
     591    if nv.nil?
     592      n = -1
    590593    else
    591       raise TypeError, "no implicit conversion of #{n.class} into Integer" unless n.respond_to?(:to_int)
    592 
    593       n = n.to_int
    594       self.each do|*val|
    595         ary.push val
    596       end
    597       count = 0
    598       while count < n
    599         ary.each do|e|
    600           block.call(*e)
    601         end
    602         count += 1
    603       end
    604     end
     594      unless nv.respond_to?(:to_int)
     595        raise TypeError, "no implicit conversion of #{nv.class} into Integer"
     596      end
     597      n = nv.to_int
     598      unless n.kind_of?(Integer)
     599        raise TypeError, "no implicit conversion of #{nv.class} into Integer"
     600      end
     601      return nil if n <= 0
     602    end
     603
     604    ary = []
     605    each do |*i|
     606      ary.push(i)
     607      yield(*i)
     608    end
     609    return nil if ary.empty?
     610
     611    while n < 0 || 0 < (n -= 1)
     612      ary.each do |i|
     613        yield(*i)
     614      end
     615    end
     616
     617    nil
    605618  end
    606619
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-enum-ext/test/enum.rb

    r321 r331  
    2626assert("Enumerable#each_cons") do
    2727  a = []
    28   (1..5).each_cons(3){|e| a << e}
     28  b = (1..5).each_cons(3){|e| a << e}
    2929  assert_equal [[1, 2, 3], [2, 3, 4], [3, 4, 5]], a
     30  assert_equal nil, b
    3031end
    3132
    3233assert("Enumerable#each_slice") do
    3334  a = []
    34   (1..10).each_slice(3){|e| a << e}
     35  b = (1..10).each_slice(3){|e| a << e}
    3536  assert_equal [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]], a
     37  assert_equal nil, b
    3638end
    3739
     
    129131  assert_equal ["a", "b", "c", "a", "b", "c"], a
    130132  assert_raise(TypeError) { ["a", "b", "c"].cycle("a") { |v| a << v } }
     133
     134  empty = Class.new do
     135    include Enumerable
     136    def each
     137    end
     138  end
     139  assert_nil empty.new.cycle { break :nope }
    131140end
    132141
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-enum-lazy/mrbgem.rake

    r321 r331  
    22  spec.license = 'MIT'
    33  spec.author  = 'mruby developers'
    4   spec.summary = 'Enumerable::Lazy class'
     4  spec.summary = 'Enumerator::Lazy class'
    55  spec.add_dependency('mruby-enumerator', :core => 'mruby-enumerator')
    66  spec.add_dependency('mruby-enum-ext', :core => 'mruby-enum-ext')
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-enum-lazy/mrblib/lazy.rb

    r321 r331  
    33  # = Enumerable#lazy implementation
    44  #
    5   # Enumerable#lazy returns an instance of Enumerable::Lazy.
     5  # Enumerable#lazy returns an instance of Enumerator::Lazy.
    66  # You can use it just like as normal Enumerable object,
    77  # except these methods act as 'lazy':
     
    1717  #   - zip
    1818  def lazy
    19     Lazy.new(self)
     19    Enumerator::Lazy.new(self)
    2020  end
     21end
    2122
     23class Enumerator
    2224  # == Acknowledgements
    2325  #
     
    4042      }
    4143    end
     44
     45    def to_enum(meth=:each, *args, &block)
     46      lz = Lazy.new(self, &block)
     47      lz.obj = self
     48      lz.meth = meth
     49      lz.args = args
     50      lz
     51    end
     52    alias enum_for to_enum
    4253
    4354    def map(&block)
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-enum-lazy/test/lazy.rb

    r321 r331  
    1 assert("Enumerable::Lazy") do
     1assert("Enumerator::Lazy") do
    22  a = [1, 2]
    3   assert_equal Enumerable::Lazy, a.lazy.class
     3  assert_equal Enumerator::Lazy, a.lazy.class
    44end
    55
    6 assert("Enumerable::Lazy laziness") do
     6assert("Enumerator::Lazy laziness") do
    77  a = Object.new
    88  def a.each
     
    4141end
    4242
    43 assert("Enumerable::Lazy#zip with cycle") do
     43assert("Enumrator::Lazy#to_enum") do
     44  lazy_enum = (0..Float::INFINITY).lazy.to_enum(:each_slice, 2)
     45  assert_kind_of Enumerator::Lazy, lazy_enum
     46  assert_equal [0*1, 2*3, 4*5, 6*7], lazy_enum.map { |a| a.first * a.last }.first(4)
     47end
     48
     49assert("Enumerator::Lazy#zip with cycle") do
    4450  e1 = [1, 2, 3].cycle
    4551  e2 = [:a, :b].cycle
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-enumerator/mrblib/enumerator.rb

    r321 r331  
    154154  def with_index(offset=0)
    155155    return to_enum :with_index, offset unless block_given?
    156     raise TypeError, "no implicit conversion of #{offset.class} into Integer" unless offset.respond_to?(:to_int)
    157 
    158     n = offset.to_int - 1
    159     enumerator_block_call do |i|
     156    offset = if offset.nil?
     157      0
     158    elsif offset.respond_to?(:to_int)
     159      offset.to_int
     160    else
     161      raise TypeError, "no implicit conversion of #{offset.class} into Integer"
     162    end
     163
     164    n = offset - 1
     165    enumerator_block_call do |*i|
    160166      n += 1
    161       yield [i,n]
     167      yield i.__svalue, n
    162168    end
    163169  end
     
    172178  # If no block is given, a new Enumerator is returned that includes the index.
    173179  #
    174   def each_with_index
    175     with_index
     180  def each_with_index(&block)
     181    with_index(0, &block)
    176182  end
    177183
     
    517523  # just for internal
    518524  class Generator
     525    include Enumerable
    519526    def initialize(&block)
    520527      raise TypeError, "wrong argument type #{self.class} (expected Proc)" unless block.kind_of? Proc
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-enumerator/test/enumerator.rb

    r321 r331  
    5151  assert_equal([[1,0],[2,1],[3,2]], @obj.to_enum(:foo, 1, 2, 3).with_index.to_a)
    5252  assert_equal([[1,5],[2,6],[3,7]], @obj.to_enum(:foo, 1, 2, 3).with_index(5).to_a)
     53  a = []
     54  @obj.to_enum(:foo, 1, 2, 3).with_index(10).with_index(20) { |*i| a << i }
     55  assert_equal [[[1, 10], 20], [[2, 11], 21], [[3, 12], 22]], a
    5356end
    5457
     
    6164assert 'Enumerator#with_index string offset' do
    6265  assert_raise(TypeError){ @obj.to_enum(:foo, 1, 2, 3).with_index('1').to_a }
     66end
     67
     68assert 'Enumerator#each_with_index' do
     69  assert_equal([[1,0],[2,1],[3,2]], @obj.to_enum(:foo, 1, 2, 3).each_with_index.to_a)
     70  a = []
     71  @obj.to_enum(:foo, 1, 2, 3).each_with_index {|*i| a << i}
     72  assert_equal([[1, 0], [2, 1], [3, 2]], a)
    6373end
    6474
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-error/mrbgem.rake

    r321 r331  
    44  spec.summary = 'extensional error handling'
    55
    6   if build.cxx_abi_enabled?
     6  if build.cxx_exception_enabled?
    77    @objs << build.compile_as_cxx("#{spec.dir}/src/exception.c", "#{spec.build_dir}/src/exception.cxx")
    88    @objs.delete_if { |v| v == objfile("#{spec.build_dir}/src/exception") }
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-error/src/exception.c

    r321 r331  
    1 #include "mruby.h"
    2 #include "mruby/throw.h"
    3 #include "mruby/error.h"
     1#include <mruby.h>
     2#include <mruby/throw.h>
     3#include <mruby/error.h>
    44
    55MRB_API mrb_value
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-error/test/exception.c

    r321 r331  
    1 #include "mruby.h"
    2 #include "mruby/error.h"
    3 #include "mruby/array.h"
     1#include <mruby.h>
     2#include <mruby/error.h>
     3#include <mruby/array.h>
    44
    55static mrb_value
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-error/test/exception.rb

    r321 r331  
    66  # failure in protect returns [exception, true]
    77  result = ExceptionTest.mrb_protect { raise 'test' }
    8   assert_kind_of RuntimeError, result[0]   
     8  assert_kind_of RuntimeError, result[0]
    99  assert_true result[1]
    1010end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-eval/src/eval.c

    r321 r331  
    1 #include "mruby.h"
    2 #include "mruby/class.h"
    3 #include "mruby/compile.h"
    4 #include "mruby/irep.h"
    5 #include "mruby/proc.h"
    6 #include "mruby/opcode.h"
     1#include <mruby.h>
     2#include <mruby/class.h>
     3#include <mruby/compile.h>
     4#include <mruby/irep.h>
     5#include <mruby/proc.h>
     6#include <mruby/opcode.h>
     7#include <mruby/error.h>
     8
     9mrb_value mrb_exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p);
     10mrb_value mrb_obj_instance_eval(mrb_state *mrb, mrb_value self);
    711
    812static struct mrb_irep *
     
    2731
    2832  if (!e) return NULL;
     33  if (!MRB_ENV_STACK_SHARED_P(e)) return NULL;
     34  c = e->cxt.c;
    2935  proc = c->cibase[e->cioff].proc;
    3036
     
    127133      }
    128134      break;
    129     }
    130   }
    131 }
     135
     136    case OP_STOP:
     137      if (mrb->c->ci->acc >= 0) {
     138        irep->iseq[i] = MKOP_AB(OP_RETURN, irep->nlocals, OP_R_NORMAL);
     139      }
     140      break;
     141    }
     142  }
     143}
     144
     145void mrb_codedump_all(mrb_state*, struct RProc*);
    132146
    133147static struct RProc*
    134 create_proc_from_string(mrb_state *mrb, char *s, int len, mrb_value binding, char *file, mrb_int line)
     148create_proc_from_string(mrb_state *mrb, char *s, int len, mrb_value binding, const char *file, mrb_int line)
    135149{
    136150  mrbc_context *cxt;
     
    146160  cxt = mrbc_context_new(mrb);
    147161  cxt->lineno = line;
    148   if (file) {
    149     mrbc_filename(mrb, cxt, file);
    150   }
     162
     163  mrbc_filename(mrb, cxt, file ? file : "(eval)");
    151164  cxt->capture_errors = TRUE;
    152165  cxt->no_optimize = TRUE;
     
    161174  if (0 < p->nerr) {
    162175    /* parse error */
    163     char buf[256];
    164     int n;
    165     n = snprintf(buf, sizeof(buf), "line %d: %s\n", p->error_buffer[0].lineno, p->error_buffer[0].message);
     176    mrb_value str;
     177
     178    if (file) {
     179      str = mrb_format(mrb, " file %S line %S: %S",
     180                       mrb_str_new_cstr(mrb, file),
     181                       mrb_fixnum_value(p->error_buffer[0].lineno),
     182                       mrb_str_new_cstr(mrb, p->error_buffer[0].message));
     183    }
     184    else {
     185      str = mrb_format(mrb, " line %S: %S",
     186                       mrb_fixnum_value(p->error_buffer[0].lineno),
     187                       mrb_str_new_cstr(mrb, p->error_buffer[0].message));
     188    }
    166189    mrb_parser_free(p);
    167190    mrbc_context_free(mrb, cxt);
    168     mrb_exc_raise(mrb, mrb_exc_new(mrb, E_SYNTAX_ERROR, buf, n));
     191    mrb_exc_raise(mrb, mrb_exc_new_str(mrb, E_SYNTAX_ERROR, str));
    169192  }
    170193
     
    182205  if (!e) e = c->ci[-1].env;
    183206  e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, (struct RClass*)e);
    184   e->mid = c->ci[-1].mid;
    185   e->cioff = c->ci - c->cibase - 1;
     207  e->cxt.c = c;
     208  e->cioff = c->ci - c->cibase;
    186209  e->stack = c->ci->stackent;
    187   MRB_SET_ENV_STACK_LEN(e, c->ci[-1].proc->body.irep->nlocals);
    188   c->ci->env = e;
     210  MRB_SET_ENV_STACK_LEN(e, c->ci->proc->body.irep->nlocals);
     211  c->ci->target_class = proc->target_class;
     212  c->ci->env = 0;
    189213  proc->env = e;
    190214  patch_irep(mrb, proc->body.irep, 0);
     
    194218
    195219  return proc;
     220}
     221
     222static mrb_value
     223exec_irep(mrb_state *mrb, mrb_value self, struct RProc *proc)
     224{
     225  if (mrb->c->ci->acc < 0) {
     226    mrb_value ret = mrb_top_run(mrb, proc, mrb->c->stack[0], 0);
     227    if (mrb->exc) {
     228      mrb_exc_raise(mrb, mrb_obj_value(mrb->exc));
     229    }
     230    return ret;
     231  }
     232  return mrb_exec_irep(mrb, self, proc);
    196233}
    197234
     
    204241  char *file = NULL;
    205242  mrb_int line = 1;
    206   mrb_value ret;
    207243  struct RProc *proc;
    208244
     
    210246
    211247  proc = create_proc_from_string(mrb, s, len, binding, file, line);
    212   ret = mrb_toplevel_run(mrb, proc);
    213   if (mrb->exc) {
    214     mrb_exc_raise(mrb, mrb_obj_value(mrb->exc));
    215   }
    216 
    217   return ret;
    218 }
    219 
    220 mrb_value mrb_obj_instance_eval(mrb_state *mrb, mrb_value self);
    221 
    222 #define CI_ACC_SKIP    -1
     248  mrb_assert(!MRB_PROC_CFUNC_P(proc));
     249  return exec_irep(mrb, self, proc);
     250}
    223251
    224252static mrb_value
    225253f_instance_eval(mrb_state *mrb, mrb_value self)
    226254{
    227   struct mrb_context *c = mrb->c;
    228255  mrb_value b;
    229256  mrb_int argc; mrb_value *argv;
     
    237264    mrb_int line = 1;
    238265    mrb_value cv;
     266    struct RProc *proc;
    239267
    240268    mrb_get_args(mrb, "s|zi", &s, &len, &file, &line);
    241     c->ci->acc = CI_ACC_SKIP;
    242269    cv = mrb_singleton_class(mrb, self);
    243     c->ci->target_class = mrb_class_ptr(cv);
    244     return mrb_run(mrb, create_proc_from_string(mrb, s, len, mrb_nil_value(), file, line), self);
     270    proc = create_proc_from_string(mrb, s, len, mrb_nil_value(), file, line);
     271    proc->target_class = mrb_class_ptr(cv);
     272    mrb->c->ci->env = NULL;
     273    mrb_assert(!MRB_PROC_CFUNC_P(proc));
     274    return exec_irep(mrb, self, proc);
    245275  }
    246276  else {
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-eval/test/eval.rb

    r321 r331  
    6565  assert_equal('test') { obj.instance_eval('@test') }
    6666  assert_equal('test') { obj.instance_eval { @test } }
     67  o = Object.new
     68  assert_equal ['', o, o], o.instance_eval("[''].each { |s| break [s, o, self] }")
    6769end
    6870
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-exit/src/mruby-exit.c

    r321 r331  
    11#include <stdlib.h>
    2 #include "mruby.h"
     2#include <mruby.h>
    33
    44static mrb_value
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-fiber/src/fiber.c

    r321 r331  
    1 #include "mruby.h"
    2 #include "mruby/array.h"
    3 #include "mruby/class.h"
    4 #include "mruby/proc.h"
     1#include <mruby.h>
     2#include <mruby/array.h>
     3#include <mruby/class.h>
     4#include <mruby/proc.h>
    55
    66#define fiber_ptr(o) ((struct RFiber*)mrb_ptr(o))
     
    88#define FIBER_STACK_INIT_SIZE 64
    99#define FIBER_CI_INIT_SIZE 8
     10#define CI_ACC_RESUMED -3
    1011
    1112/*
     
    7475  mrb_get_args(mrb, "&", &blk);
    7576
     77  if (f->cxt) {
     78    mrb_raise(mrb, E_RUNTIME_ERROR, "cannot initialize twice");
     79  }
    7680  if (mrb_nil_p(blk)) {
    7781    mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Fiber object without a block");
     
    8286  }
    8387
    84   f->cxt = (struct mrb_context*)mrb_malloc(mrb, sizeof(struct mrb_context));
    85   *f->cxt = mrb_context_zero;
    86   c = f->cxt;
     88  c = (struct mrb_context*)mrb_malloc(mrb, sizeof(struct mrb_context));
     89  *c = mrb_context_zero;
     90  f->cxt = c;
    8791
    8892  /* initialize VM stack */
     
    156160#define MARK_CONTEXT_MODIFY(c) (c)->ci->target_class = NULL
    157161
    158 static mrb_value
    159 fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mrb_bool resume)
    160 {
    161   struct mrb_context *c = fiber_check(mrb, self);
     162static void
     163fiber_check_cfunc(mrb_state *mrb, struct mrb_context *c)
     164{
    162165  mrb_callinfo *ci;
    163166
     
    167170    }
    168171  }
     172}
     173
     174static void
     175fiber_switch_context(mrb_state *mrb, struct mrb_context *c)
     176{
     177  if (mrb->c->fib) {
     178    mrb_write_barrier(mrb, (struct RBasic*)mrb->c->fib);
     179  }
     180  c->status = MRB_FIBER_RUNNING;
     181  mrb->c = c;
     182}
     183
     184static mrb_value
     185fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mrb_bool resume, mrb_bool vmexec)
     186{
     187  struct mrb_context *c = fiber_check(mrb, self);
     188  struct mrb_context *old_c = mrb->c;
     189  mrb_value value;
     190
     191  fiber_check_cfunc(mrb, c);
    169192  if (resume && c->status == MRB_FIBER_TRANSFERRED) {
    170193    mrb_raise(mrb, E_FIBER_ERROR, "resuming transferred fiber");
    171194  }
    172   if (c->status == MRB_FIBER_RUNNING || c->status == MRB_FIBER_RESUMING) {
    173     mrb_raise(mrb, E_FIBER_ERROR, "double resume");
     195  if (c->status == MRB_FIBER_RUNNING || c->status == MRB_FIBER_RESUMED) {
     196    mrb_raise(mrb, E_FIBER_ERROR, "double resume (fib)");
    174197  }
    175198  if (c->status == MRB_FIBER_TERMINATED) {
    176199    mrb_raise(mrb, E_FIBER_ERROR, "resuming dead fiber");
    177200  }
    178   mrb->c->status = resume ? MRB_FIBER_RESUMING : MRB_FIBER_TRANSFERRED;
     201  mrb->c->status = resume ? MRB_FIBER_RESUMED : MRB_FIBER_TRANSFERRED;
    179202  c->prev = resume ? mrb->c : (c->prev ? c->prev : mrb->root_c);
    180203  if (c->status == MRB_FIBER_CREATED) {
    181     mrb_value *b = c->stack+1;
    182     mrb_value *e = b + len;
    183 
     204    mrb_value *b, *e;
     205
     206    if (len >= c->stend - c->stack) {
     207      mrb_raise(mrb, E_FIBER_ERROR, "too many arguments to fiber");
     208    }
     209    b = c->stack+1;
     210    e = b + len;
    184211    while (b<e) {
    185212      *b++ = *a++;
    186213    }
    187214    c->cibase->argc = len;
    188     if (c->prev->fib)
    189       mrb_field_write_barrier(mrb, (struct RBasic*)c->fib, (struct RBasic*)c->prev->fib);
    190     mrb_write_barrier(mrb, (struct RBasic*)c->fib);
    191     c->status = MRB_FIBER_RUNNING;
    192     mrb->c = c;
    193 
     215    value = c->stack[0] = c->ci->proc->env->stack[0];
     216  }
     217  else {
     218    value = fiber_result(mrb, a, len);
     219  }
     220  fiber_switch_context(mrb, c);
     221
     222  if (vmexec) {
     223    c->vmexec = TRUE;
     224    value = mrb_vm_exec(mrb, c->ci[-1].proc, c->ci->pc);
     225    mrb->c = old_c;
     226  }
     227  else {
    194228    MARK_CONTEXT_MODIFY(c);
    195     return c->ci->proc->env->stack[0];
    196   }
    197   MARK_CONTEXT_MODIFY(c);
    198   if (c->prev->fib)
    199     mrb_field_write_barrier(mrb, (struct RBasic*)c->fib, (struct RBasic*)c->prev->fib);
    200   mrb_write_barrier(mrb, (struct RBasic*)c->fib);
    201   c->status = MRB_FIBER_RUNNING;
    202   mrb->c = c;
    203   return fiber_result(mrb, a, len);
     229  }
     230  return value;
    204231}
    205232
     
    224251  mrb_value *a;
    225252  mrb_int len;
     253  mrb_bool vmexec = FALSE;
    226254
    227255  mrb_get_args(mrb, "*", &a, &len);
    228   return fiber_switch(mrb, self, len, a, TRUE);
     256  if (mrb->c->ci->acc < 0) {
     257    vmexec = TRUE;
     258  }
     259  return fiber_switch(mrb, self, len, a, TRUE, vmexec);
    229260}
    230261
     
    233264mrb_fiber_resume(mrb_state *mrb, mrb_value fib, mrb_int len, const mrb_value *a)
    234265{
    235   return fiber_switch(mrb, fib, len, a, TRUE);
     266  return fiber_switch(mrb, fib, len, a, TRUE, TRUE);
    236267}
    237268
     
    281312  mrb_int len;
    282313
     314  fiber_check_cfunc(mrb, mrb->c);
    283315  mrb_get_args(mrb, "*", &a, &len);
    284316
    285317  if (c == mrb->root_c) {
    286318    mrb->c->status = MRB_FIBER_TRANSFERRED;
    287     mrb->c = c;
    288     c->status = MRB_FIBER_RUNNING;
     319    fiber_switch_context(mrb, c);
    289320    MARK_CONTEXT_MODIFY(c);
    290     mrb_write_barrier(mrb, (struct RBasic*)c->fib);
    291321    return fiber_result(mrb, a, len);
    292322  }
     
    296326  }
    297327
    298   return fiber_switch(mrb, self, len, a, FALSE);
     328  return fiber_switch(mrb, self, len, a, FALSE, FALSE);
    299329}
    300330
     
    305335{
    306336  struct mrb_context *c = mrb->c;
    307   mrb_callinfo *ci;
    308 
    309   for (ci = c->ci; ci >= c->cibase; ci--) {
    310     if (ci->acc < 0) {
    311       mrb_raise(mrb, E_FIBER_ERROR, "can't cross C function boundary");
    312     }
    313   }
     337
    314338  if (!c->prev) {
    315339    mrb_raise(mrb, E_FIBER_ERROR, "can't yield from root fiber");
    316340  }
    317341
     342  fiber_check_cfunc(mrb, c);
    318343  c->prev->status = MRB_FIBER_RUNNING;
    319344  c->status = MRB_FIBER_SUSPENDED;
    320   mrb->c = c->prev;
     345  fiber_switch_context(mrb, c->prev);
    321346  c->prev = NULL;
     347  if (c->vmexec) {
     348    c->vmexec = FALSE;
     349    mrb->c->ci->acc = CI_ACC_RESUMED;
     350  }
    322351  MARK_CONTEXT_MODIFY(mrb->c);
    323   mrb_write_barrier(mrb, (struct RBasic*)c->fib);
    324352  return fiber_result(mrb, a, len);
    325353}
     
    333361 *  processing at this point when <code>resume</code> is called next.
    334362 *  Any arguments passed to the next <code>resume</code> will be the
    335  *  value that this <code>Fiber.yield</code> expression evaluates to.
     363 *
     364 *  mruby limitation: Fiber resume/yield cannot cross C function boundary.
     365 *  thus you cannot yield from #initialize which is called by mrb_funcall().
    336366 */
    337367static mrb_value
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-hash-ext/mrblib/hash.rb

    r321 r331  
    2929      o = object[0]
    3030      if o.respond_to?(:to_hash)
    31         h = Hash.new
     31        h = self.new
    3232        object[0].to_hash.each { |k, v| h[k] = v }
    3333        return h
    3434      elsif o.respond_to?(:to_a)
    35         h = Hash.new
     35        h = self.new
    3636        o.to_a.each do |i|
    3737          raise ArgumentError, "wrong element type #{i.class} (expected array)" unless i.respond_to?(:to_a)
     
    5454      raise ArgumentError, 'odd number of arguments for Hash'
    5555    end
    56     h = Hash.new
     56    h = self.new
    5757    0.step(length - 2, 2) do |i|
    5858      h[object[i]] = object[i + 1]
    5959    end
    6060    h
     61  end
     62
     63  ##
     64  # call-seq:
     65  #     Hash.try_convert(obj) -> hash or nil
     66  #
     67  # Try to convert <i>obj</i> into a hash, using to_hash method.
     68  # Returns converted hash or nil if <i>obj</i> cannot be converted
     69  # for any reason.
     70  #
     71  #     Hash.try_convert({1=>2})   # => {1=>2}
     72  #     Hash.try_convert("1=>2")   # => nil
     73  #
     74  def self.try_convert(obj)
     75    if obj.respond_to?(:to_hash)
     76      obj.to_hash
     77    else
     78      nil
     79    end
    6180  end
    6281
     
    193212
    194213  def invert
    195     h = Hash.new
     214    h = self.class.new
    196215    self.each {|k, v| h[v] = k }
    197216    h
     
    347366    }
    348367  end
     368
     369  ##
     370  # call-seq:
     371  #   hsh.dig(key,...)                 -> object
     372  #
     373  # Extracts the nested value specified by the sequence of <i>key</i>
     374  # objects by calling +dig+ at each step, returning +nil+ if any
     375  # intermediate step is +nil+.
     376  #
     377  def dig(idx,*args)
     378    n = self[idx]
     379    if args.size > 0
     380      n&.dig(*args)
     381    else
     382      n
     383    end
     384  end
    349385end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-hash-ext/src/hash-ext.c

    r321 r331  
    55*/
    66
    7 #include "mruby.h"
    8 #include "mruby/array.h"
    9 #include "mruby/hash.h"
     7#include <mruby.h>
     8#include <mruby/array.h>
     9#include <mruby/hash.h>
    1010
    1111/*
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-hash-ext/test/hash.rb

    r321 r331  
    3838    Hash['d_key']
    3939  end
     40end
     41
     42assert('Hash.[] for sub class') do
     43  sub_hash_class = Class.new(Hash)
     44  sub_hash = sub_hash_class[]
     45  assert_equal(sub_hash_class, sub_hash.class)
     46end
     47
     48assert('Hash.try_convert') do
     49  assert_nil Hash.try_convert(nil)
     50  assert_nil Hash.try_convert("{1=>2}")
     51  assert_equal({1=>2}, Hash.try_convert({1=>2}))
    4052end
    4153
     
    138150end
    139151
     152assert("Hash#invert with sub class") do
     153  sub_hash_class = Class.new(Hash)
     154  sub_hash = sub_hash_class.new
     155  assert_equal(sub_hash_class, sub_hash.invert.class)
     156end
     157
    140158assert("Hash#keep_if") do
    141159  h = { 1 => 2, 3 => 4, 5 => 6 }
     
    231249  assert_false(h2 > h2)
    232250end
     251
     252assert("Hash#dig") do
     253  h = {a:{b:{c:1}}}
     254  assert_equal(1, h.dig(:a, :b, :c))
     255  assert_nil(h.dig(:d))
     256end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-kernel-ext/src/kernel.c

    r321 r331  
    1 #include "mruby.h"
    2 #include "mruby/error.h"
    3 #include "mruby/array.h"
    4 #include "mruby/hash.h"
     1#include <mruby.h>
     2#include <mruby/error.h>
     3#include <mruby/array.h>
     4#include <mruby/hash.h>
     5#include <mruby/range.h>
     6
     7static mrb_value
     8mrb_f_caller(mrb_state *mrb, mrb_value self)
     9{
     10  mrb_value bt, v, length;
     11  mrb_int bt_len, argc, lev, n;
     12
     13  bt = mrb_get_backtrace(mrb);
     14  bt_len = RARRAY_LEN(bt);
     15  argc = mrb_get_args(mrb, "|oo", &v, &length);
     16
     17  switch (argc) {
     18    case 0:
     19      lev = 1;
     20      n = bt_len - lev;
     21      break;
     22    case 1:
     23      if (mrb_type(v) == MRB_TT_RANGE) {
     24        mrb_int beg, len;
     25        if (mrb_range_beg_len(mrb, v, &beg, &len, bt_len, TRUE) == 1) {
     26          lev = beg;
     27          n = len;
     28        }
     29        else {
     30          return mrb_nil_value();
     31        }
     32      }
     33      else {
     34        v = mrb_to_int(mrb, v);
     35        lev = mrb_fixnum(v);
     36        if (lev < 0) {
     37          mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative level (%S)", v);
     38        }
     39        n = bt_len - lev;
     40      }
     41      break;
     42    case 2:
     43      lev = mrb_fixnum(mrb_to_int(mrb, v));
     44      n = mrb_fixnum(mrb_to_int(mrb, length));
     45      if (lev < 0) {
     46        mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative level (%S)", v);
     47      }
     48      if (n < 0) {
     49        mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative size (%S)", length);
     50      }
     51      break;
     52    default:
     53      lev = n = 0;
     54      break;
     55  }
     56
     57  if (n == 0) {
     58    return mrb_ary_new(mrb);
     59  }
     60
     61  return mrb_funcall(mrb, bt, "[]", 2, mrb_fixnum_value(lev), mrb_fixnum_value(n));
     62}
    563
    664/*
     
    62120 *
    63121 *  Returns <i>arg</i> converted to a float. Numeric types are converted
    64  *  directly, the rest are converted using <i>arg</i>.to_f. 
     122 *  directly, the rest are converted using <i>arg</i>.to_f.
    65123 *
    66124 *     Float(1)           #=> 1.0
     
    171229
    172230  mrb_define_module_function(mrb, krn, "fail", mrb_f_raise, MRB_ARGS_OPT(2));
     231  mrb_define_module_function(mrb, krn, "caller", mrb_f_caller, MRB_ARGS_OPT(2));
    173232  mrb_define_method(mrb, krn, "__method__", mrb_f_method, MRB_ARGS_NONE());
    174233  mrb_define_module_function(mrb, krn, "Integer", mrb_f_integer, MRB_ARGS_ANY());
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-kernel-ext/test/kernel.rb

    r321 r331  
    22  assert_raise(RuntimeError) { fail }
    33  assert_raise(RuntimeError) { Kernel.fail }
     4end
     5
     6assert('Kernel.caller, Kernel#caller') do
     7  skip "backtrace isn't available" if caller(0).empty?
     8
     9  caller_lineno = __LINE__ + 3
     10  c = Class.new do
     11    def foo(*args)
     12      caller(*args)
     13    end
     14
     15    def bar(*args)
     16      foo(*args)
     17    end
     18
     19    def baz(*args)
     20      bar(*args)
     21    end
     22  end
     23  assert_equal "kernel.rb:#{caller_lineno}:in foo", c.new.baz(0)[0][-19..-1]
     24  assert_equal "bar", c.new.baz[0][-3..-1]
     25  assert_equal "foo", c.new.baz(0)[0][-3..-1]
     26  assert_equal "bar", c.new.baz(1)[0][-3..-1]
     27  assert_equal "baz", c.new.baz(2)[0][-3..-1]
     28  assert_equal ["foo", "bar"], c.new.baz(0, 2).map { |i| i[-3..-1] }
     29  assert_equal ["bar", "baz"], c.new.baz(1..2).map { |i| i[-3..-1] }
     30  assert_nil c.new.baz(10..20)
     31  assert_raise(ArgumentError) { c.new.baz(-1) }
     32  assert_raise(ArgumentError) { c.new.baz(-1, 1) }
     33  assert_raise(ArgumentError) { c.new.baz(1, -1) }
     34  assert_raise(TypeError) { c.new.baz(nil) }
    435end
    536
     
    2354  assert_equal(930, Integer("0930", 10))
    2455  assert_equal(7, Integer("111", 2))
     56  assert_equal(0, Integer("0"))
     57  assert_equal(0, Integer("00000"))
    2558  assert_raise(TypeError) { Integer(nil) }
    2659end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-math/src/math.c

    r321 r331  
    55*/
    66
    7 #include "mruby.h"
    8 #include "mruby/array.h"
     7#include <mruby.h>
     8#include <mruby/array.h>
    99
    1010#include <math.h>
     
    2020
    2121/* math functions not provided by Microsoft Visual C++ 2012 or older */
    22 #if defined _MSC_VER && _MSC_VER < 1800
     22#if defined _MSC_VER && _MSC_VER <= 1700
    2323
    2424#include <float.h>
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-numeric-ext/mrblib/numeric_ext.rb

    r321 r331  
    33    self.divmod(other)[0]
    44  end
     5
     6  def zero?
     7    self == 0
     8  end
     9
     10  def nonzero?
     11    if self == 0
     12      nil
     13    else
     14      self
     15    end
     16  end
    517end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-numeric-ext/src/numeric_ext.c

    r321 r331  
    11#include <limits.h>
    2 #include "mruby.h"
     2#include <mruby.h>
    33
    44static mrb_value
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-numeric-ext/test/numeric.rb

    r321 r331  
    1717  assert_float 52, 365.2425.div(7)
    1818end
     19
     20assert('Integer#zero?') do
     21  assert_equal true, 0.zero?
     22  assert_equal false, 1.zero?
     23end
     24
     25assert('Integer#nonzero?') do
     26  assert_equal nil, 0.nonzero?
     27  assert_equal 1000, 1000.nonzero?
     28end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-object-ext/src/object.c

    r321 r331  
    1 #include "mruby.h"
    2 #include "mruby/array.h"
    3 #include "mruby/class.h"
     1#include <mruby.h>
     2#include <mruby/array.h>
     3#include <mruby/class.h>
     4#include <mruby/proc.h>
    45
    56/*
     
    6364mrb_obj_instance_exec(mrb_state *mrb, mrb_value self)
    6465{
    65   mrb_value *argv;
     66  const mrb_value *argv;
    6667  mrb_int argc;
    6768  mrb_value blk;
    6869  struct RClass *c;
     70  mrb_value args;
    6971
    7072  mrb_get_args(mrb, "*&", &argv, &argc, &blk);
     
    8486    break;
    8587  }
    86 
    87   return mrb_yield_with_class(mrb, blk, argc, argv, self, c);
     88  args = mrb_ary_new_from_values(mrb, argc, argv);
     89  argv = RARRAY_PTR(args);
     90  mrb->c->ci->target_class = c;
     91  return mrb_yield_cont(mrb, blk, self, argc, argv);
    8892}
    8993
     
    97101  mrb_define_method(mrb, n, "to_i", nil_to_i,       MRB_ARGS_NONE());
    98102
    99   mrb_define_method(mrb, mrb->object_class, "instance_exec", mrb_obj_instance_exec, MRB_ARGS_ANY() | MRB_ARGS_BLOCK());
     103  mrb_define_method(mrb, mrb->kernel_module, "instance_exec", mrb_obj_instance_exec, MRB_ARGS_ANY() | MRB_ARGS_BLOCK());
    100104}
    101105
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-object-ext/test/object.rb

    r321 r331  
    2424  assert_equal(:tap_ok, Class.new {def m; tap{return :tap_ok}; end}.new.m)
    2525end
     26
     27assert('instance_exec on primitives with class and module definition') do
     28  begin
     29    class A
     30      1.instance_exec do
     31        class B
     32        end
     33      end
     34    end
     35
     36    assert_kind_of Class, A::B
     37  ensure
     38    Object.remove_const :A
     39  end
     40
     41  begin
     42    class A
     43      1.instance_exec do
     44        module B
     45        end
     46      end
     47    end
     48
     49    assert_kind_of Module, A::B
     50  ensure
     51    Object.remove_const :A
     52  end
     53end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-objectspace/src/mruby_objectspace.c

    r321 r331  
    1 #include "mruby.h"
    2 #include "mruby/gc.h"
    3 #include "mruby/hash.h"
    4 #include "mruby/class.h"
     1#include <mruby.h>
     2#include <mruby/gc.h>
     3#include <mruby/hash.h>
     4#include <mruby/class.h>
    55
    66struct os_count_struct {
     
    1010};
    1111
    12 static void
     12static int
    1313os_count_object_type(mrb_state *mrb, struct RBasic *obj, void *data)
    1414{
     
    2424    obj_count->counts[obj->tt]++;
    2525  }
     26  return MRB_EACH_OBJ_OK;
    2627}
    2728
     
    5051{
    5152  struct os_count_struct obj_count = { 0 };
    52   enum mrb_vtype i;
     53  mrb_int i;
    5354  mrb_value hash;
    5455
     
    110111};
    111112
    112 static void
     113static int
    113114os_each_object_cb(mrb_state *mrb, struct RBasic *obj, void *ud)
    114115{
     
    117118  /* filter dead objects */
    118119  if (mrb_object_dead_p(mrb, obj)) {
    119     return;
     120    return MRB_EACH_OBJ_OK;
    120121  }
    121122
     
    124125  case MRB_TT_ENV:
    125126  case MRB_TT_ICLASS:
    126     return;
     127    return MRB_EACH_OBJ_OK;
    127128  default:
    128129    break;
     
    130131
    131132  /* filter half baked (or internal) objects */
    132   if (!obj->c) return;
     133  if (!obj->c) return MRB_EACH_OBJ_OK;
    133134
    134135  /* filter class kind if target module defined */
    135136  if (d->target_module && !mrb_obj_is_kind_of(mrb, mrb_obj_value(obj), d->target_module)) {
    136     return;
     137    return MRB_EACH_OBJ_OK;
    137138  }
    138139
    139140  mrb_yield(mrb, d->block, mrb_obj_value(obj));
    140141  ++d->count;
     142  return MRB_EACH_OBJ_OK;
    141143}
    142144
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-print/src/print.c

    r321 r331  
    1 #include "mruby.h"
    2 #include "mruby/string.h"
     1#include <mruby.h>
     2#include <mruby/string.h>
    33#include <stdio.h>
    44#include <string.h>
    55#include <stdlib.h>
    6 #if defined(__MINGW32__) || defined(__MINGW64__)
     6#if defined(_WIN32)
    77# include <windows.h>
    88# include <io.h>
     9#ifdef _MSC_VER
     10# define isatty(x) _isatty(x)
     11# define fileno(x) _fileno(x)
     12#endif
    913#endif
    1014
     
    1317{
    1418  if (mrb_string_p(obj)) {
    15 #if defined(__MINGW32__) || defined(__MINGW64__)
     19#if defined(_WIN32)
    1620    if (isatty(fileno(stdout))) {
    1721      DWORD written;
     
    1923      char* utf8 = RSTRING_PTR(obj);
    2024      int wlen = MultiByteToWideChar(CP_UTF8, 0, utf8, mlen, NULL, 0);
    21       wchar_t* utf16 = mrb_malloc(mrb, (wlen+1) * sizeof(wchar_t));
     25      wchar_t* utf16 = (wchar_t*)mrb_malloc(mrb, (wlen+1) * sizeof(wchar_t));
    2226      if (utf16 == NULL) return;
    2327      if (MultiByteToWideChar(CP_UTF8, 0, utf8, mlen, utf16, wlen) > 0) {
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-proc-ext/src/proc.c

    r321 r331  
    1 #include "mruby.h"
    2 #include "mruby/proc.h"
    3 #include "mruby/opcode.h"
    4 #include "mruby/array.h"
    5 #include "mruby/string.h"
    6 #include "mruby/debug.h"
     1#include <mruby.h>
     2#include <mruby/proc.h>
     3#include <mruby/opcode.h>
     4#include <mruby/array.h>
     5#include <mruby/string.h>
     6#include <mruby/debug.h>
    77
    88static mrb_value
     
    5353    line = mrb_debug_get_line(irep, 0);
    5454    if (line != -1) {
    55       mrb_str_append(mrb, str, mrb_fixnum_value(line));
     55      str = mrb_format(mrb, "%S:%S", str, mrb_fixnum_value(line));
    5656    }
    5757    else {
     
    108108  const struct mrb_irep *irep = proc->body.irep;
    109109  mrb_aspec aspec;
    110   mrb_value parameters;
     110  mrb_value sname, parameters;
    111111  int i, j;
    112112
    113113  if (MRB_PROC_CFUNC_P(proc)) {
    114114    // TODO cfunc aspec is not implemented yet
     115    return mrb_ary_new(mrb);
     116  }
     117  if (!irep) {
    115118    return mrb_ary_new(mrb);
    116119  }
     
    135138
    136139  parameters = mrb_ary_new_capa(mrb, irep->nlocals-1);
     140
    137141  for (i = 0, p = parameters_list; p->name; p++) {
    138     mrb_value sname = mrb_symbol_value(mrb_intern_cstr(mrb, p->name));
     142    if (p->size <= 0) continue;
     143    sname = mrb_symbol_value(mrb_intern_cstr(mrb, p->name));
    139144    for (j = 0; j < p->size; i++, j++) {
    140       mrb_assert(i < (irep->nlocals-1));
    141       mrb_ary_push(mrb, parameters, mrb_assoc_new(mrb,
    142         sname,
    143         mrb_symbol_value(irep->lv[i].name)
    144       ));
     145      mrb_value a = mrb_ary_new(mrb);
     146      mrb_ary_push(mrb, a, sname);
     147      if (irep->lv[i].name) {
     148        mrb_ary_push(mrb, a, mrb_symbol_value(irep->lv[i].name));
     149      }
     150      mrb_ary_push(mrb, parameters, a);
    145151    }
    146152  }
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-proc-ext/test/proc.c

    r321 r331  
    1 #include "mruby.h"
    2 #include "mruby/proc.h"
    3 #include "mruby/class.h"
     1#include <mruby.h>
     2#include <mruby/proc.h>
     3#include <mruby/class.h>
    44
    55static mrb_value
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-proc-ext/test/proc.rb

    r321 r331  
    5454  assert_equal([[:opt, :a]], lambda {|a=nil|}.parameters)
    5555  assert_equal([[:req, :a]], ->(a){}.parameters)
     56  assert_equal([[:rest]], lambda { |*| }.parameters)
    5657  assert_equal([[:rest, :a]], Proc.new {|*a|}.parameters)
    5758  assert_equal([[:opt, :a], [:opt, :b], [:opt, :c], [:opt, :d], [:rest, :e], [:opt, :f], [:opt, :g], [:block, :h]], Proc.new {|a,b,c=:c,d=:d,*e,f,g,&h|}.parameters)
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-random/src/mt19937ar.c

    r321 r331  
    22** mt19937ar.c - MT Random functions
    33**
    4 ** See Copyright Notice in mruby.h
     4** Copyright (C) 1997 - 2016, Makoto Matsumoto and Takuji Nishimura,
     5** All rights reserved.
     6**
     7** Permission is hereby granted, free of charge, to any person obtaining
     8** a copy of this software and associated documentation files (the
     9** "Software"), to deal in the Software without restriction, including
     10** without limitation the rights to use, copy, modify, merge, publish,
     11** distribute, sublicense, and/or sell copies of the Software, and to
     12** permit persons to whom the Software is furnished to do so, subject to
     13** the following conditions:
     14**
     15** The above copyright notice and this permission notice shall be
     16** included in all copies or substantial portions of the Software.
     17**
     18** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     19** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     20** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
     21** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
     22** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     23** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     24** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     25**
     26** [ MIT license: http://www.opensource.org/licenses/mit-license.php ]
     27**
     28** Any feedback is very welcome.
     29** http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
     30** email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space)
     31**
     32** This version is modified by mruby developers. If you see any problem,
     33** contact us first at https://github.com/mruby/mruby/issues
    534*/
    635
    7 #include "mruby.h"
     36#include <mruby.h>
    837#include "mt19937ar.h"
    938
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-random/src/mt19937ar.h

    r321 r331  
    22** mt19937ar.h - MT Random functions
    33**
    4 ** See Copyright Notice in mruby.h
     4** Copyright (C) 1997 - 2016, Makoto Matsumoto and Takuji Nishimura,
     5** All rights reserved.
     6**
     7** Permission is hereby granted, free of charge, to any person obtaining
     8** a copy of this software and associated documentation files (the
     9** "Software"), to deal in the Software without restriction, including
     10** without limitation the rights to use, copy, modify, merge, publish,
     11** distribute, sublicense, and/or sell copies of the Software, and to
     12** permit persons to whom the Software is furnished to do so, subject to
     13** the following conditions:
     14**
     15** The above copyright notice and this permission notice shall be
     16** included in all copies or substantial portions of the Software.
     17**
     18** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     19** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     20** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
     21** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
     22** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     23** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     24** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     25**
     26** [ MIT license: http://www.opensource.org/licenses/mit-license.php ]
     27**
     28** Any feedback is very welcome.
     29** http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
     30** email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space)
     31**
     32** This version is modified by mruby developers. If you see any problem,
     33** contact us first at https://github.com/mruby/mruby/issues
    534*/
    635
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-random/src/random.c

    r321 r331  
    55*/
    66
    7 #include "mruby.h"
    8 #include "mruby/variable.h"
    9 #include "mruby/class.h"
    10 #include "mruby/data.h"
    11 #include "mruby/array.h"
     7#include <mruby.h>
     8#include <mruby/variable.h>
     9#include <mruby/class.h>
     10#include <mruby/data.h>
     11#include <mruby/array.h>
    1212#include "mt19937ar.h"
    1313
     
    8080
    8181  if (!mrb_nil_p(arg)) {
    82     if (!mrb_fixnum_p(arg)) {
     82    arg = mrb_check_convert_type(mrb, arg, MRB_TT_FIXNUM, "Fixnum", "to_int");
     83    if (mrb_nil_p(arg)) {
    8384      mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument type");
    8485    }
    85     arg = mrb_check_convert_type(mrb, arg, MRB_TT_FIXNUM, "Fixnum", "to_int");
    8686    if (mrb_fixnum(arg) < 0) {
    8787      arg = mrb_fixnum_value(0 - mrb_fixnum(arg));
     
    125125  mt_state *t;
    126126
     127  seed = get_opt(mrb);
     128
    127129  /* avoid memory leaks */
    128130  t = (mt_state*)DATA_PTR(self);
     
    135137  t->mti = N + 1;
    136138
    137   seed = get_opt(mrb);
    138139  seed = mrb_random_mt_srand(mrb, t, seed);
    139140  if (mrb_nil_p(seed)) {
     
    267268  mrb_bool given;
    268269  mt_state *random = NULL;
    269   mrb_int len = RARRAY_LEN(ary);
     270  mrb_int len;
    270271
    271272  mrb_get_args(mrb, "|i?d", &n, &given, &random, &mt_state_type);
     
    275276  mrb_random_rand_seed(mrb, random);
    276277  mt_rand(random);
     278  len = RARRAY_LEN(ary);
    277279  if (!given) {                 /* pick one element */
    278280    switch (len) {
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-random/src/random.h

    r321 r331  
    55*/
    66
    7 #ifndef RANDOM_H
    8 #define RANDOM_H
     7#ifndef MRUBY_RANDOM_H
     8#define MRUBY_RANDOM_H
    99
    1010void mrb_mruby_random_gem_init(mrb_state *mrb);
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-random/test/random.rb

    r321 r331  
    7575  ary1 != [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] and 10.times { |x| ary1.include? x } and ary1 == ary2
    7676end
     77
     78assert('Array#sample checks input length after reading arguments') do
     79  $ary = [1, 2, 3]
     80  class ArrayChange
     81    def to_i
     82      $ary << 4
     83      4
     84    end
     85  end
     86
     87  assert_equal [1, 2, 3, 4], $ary.sample(ArrayChange.new).sort
     88end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-range-ext/src/range.c

    r321 r331  
    1 #include "mruby.h"
    2 #include "mruby/range.h"
     1#include <mruby.h>
     2#include <mruby/range.h>
    33#include <math.h>
     4#include <float.h>
    45
    56static mrb_bool
     
    4445{
    4546  mrb_value val;
    46   struct RRange *r = mrb_range_ptr(range);
     47  struct RRange *r = mrb_range_ptr(mrb, range);
    4748  mrb_value beg, end;
    4849
     
    6869/*
    6970 *  call-seq:
    70  *     rng.first    -> obj
    71  *     rng.first(n) -> an_array
    72  *
    73  *  Returns the first object in the range, or an array of the first +n+
    74  *  elements.
    75  *
    76  *    (10..20).first     #=> 10
    77  *    (10..20).first(3)  #=> [10, 11, 12]
    78  */
    79 static mrb_value
    80 mrb_range_first(mrb_state *mrb, mrb_value range)
    81 {
    82   mrb_int num;
    83   mrb_value array;
    84   struct RRange *r = mrb_range_ptr(range);
    85 
    86   if (mrb_get_args(mrb, "|i", &num) == 0) {
    87     return r->edges->beg;
    88   }
    89 
    90   array = mrb_funcall(mrb, range, "to_a", 0);
    91   return mrb_funcall(mrb, array, "first", 1, mrb_fixnum_value(num));
    92 }
    93 
    94 /*
    95  *  call-seq:
    9671 *     rng.last    -> obj
    9772 *     rng.last(n) -> an_array
     
    11388  mrb_value num;
    11489  mrb_value array;
    115   struct RRange *r = mrb_range_ptr(range);
     90  struct RRange *r = mrb_range_ptr(mrb, range);
    11691
    11792  if (mrb_get_args(mrb, "|o", &num) == 0) {
     
    137112mrb_range_size(mrb_state *mrb, mrb_value range)
    138113{
    139   struct RRange *r = mrb_range_ptr(range);
     114  struct RRange *r = mrb_range_ptr(mrb, range);
    140115  mrb_value beg, end;
    141   double beg_f, end_f;
     116  mrb_float beg_f, end_f;
    142117  mrb_bool num_p = TRUE;
     118  mrb_bool excl;
    143119
    144120  beg = r->edges->beg;
    145121  end = r->edges->end;
     122  excl = r->excl;
    146123  if (mrb_fixnum_p(beg)) {
    147     beg_f = (double)mrb_fixnum(beg);
     124    beg_f = (mrb_float)mrb_fixnum(beg);
    148125  }
    149126  else if (mrb_float_p(beg)) {
     
    154131  }
    155132  if (mrb_fixnum_p(end)) {
    156     end_f = (double)mrb_fixnum(end);
     133    end_f = (mrb_float)mrb_fixnum(end);
    157134  }
    158135  else if (mrb_float_p(end)) {
     
    163140  }
    164141  if (num_p) {
    165     double f;
     142    mrb_float n = end_f - beg_f;
     143    mrb_float err = (fabs(beg_f) + fabs(end_f) + fabs(end_f-beg_f)) * MRB_FLOAT_EPSILON;
    166144
    167     if (beg_f > end_f) return mrb_fixnum_value(0);
    168     f = end_f - beg_f;
    169     if (!r->excl) {
    170       return mrb_fixnum_value((mrb_int)ceil(f + 1));
     145    if (err>0.5) err=0.5;
     146    if (excl) {
     147      if (n<=0) return mrb_fixnum_value(0);
     148      if (n<1)
     149        n = 0;
     150      else
     151        n = floor(n - err);
    171152    }
    172     return mrb_fixnum_value((mrb_int)ceil(f));
     153    else {
     154      if (n<0) return mrb_fixnum_value(0);
     155      n = floor(n + err);
     156    }
     157    if (isinf(n+1))
     158      return mrb_float_value(mrb, INFINITY);
     159    return mrb_fixnum_value((mrb_int)n+1);
    173160  }
    174161  return mrb_nil_value();
     
    181168
    182169  mrb_define_method(mrb, s, "cover?", mrb_range_cover, MRB_ARGS_REQ(1));
    183   mrb_define_method(mrb, s, "first",  mrb_range_first, MRB_ARGS_OPT(1));
    184170  mrb_define_method(mrb, s, "last",   mrb_range_last,  MRB_ARGS_OPT(1));
    185171  mrb_define_method(mrb, s, "size",   mrb_range_size,  MRB_ARGS_NONE());
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-range-ext/test/range.rb

    r321 r331  
    1111  assert_equal 10, (10..20).first
    1212  assert_equal [10, 11, 12], (10..20).first(3)
     13  assert_equal [0, 1, 2], (0..Float::INFINITY).first(3)
    1314end
    1415
     
    2627  assert_equal 5, (1...6.0).size
    2728  assert_equal 5, (1.1...6).size
     29  assert_equal 15, (1.0..15.9).size
     30  assert_equal Float::INFINITY, (0..Float::INFINITY).size
    2831  assert_nil ('a'..'z').size
    2932end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-sprintf/src/kernel.c

    r321 r331  
    55*/
    66
    7 #include "mruby.h"
     7#include <mruby.h>
    88
    99mrb_value mrb_f_sprintf(mrb_state *mrb, mrb_value obj); /* in sprintf.c */
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-sprintf/src/sprintf.c

    r321 r331  
    55*/
    66
    7 #include "mruby.h"
     7#include <mruby.h>
    88
    99#include <limits.h>
    1010#include <stdio.h>
    1111#include <string.h>
    12 #include "mruby/string.h"
    13 #include "mruby/hash.h"
    14 #include "mruby/numeric.h"
     12#include <mruby/string.h>
     13#include <mruby/hash.h>
     14#include <mruby/numeric.h>
    1515#include <math.h>
    1616#include <ctype.h>
     
    1818#define BIT_DIGITS(N)   (((N)*146)/485 + 1)  /* log2(10) =~ 146/485 */
    1919#define BITSPERDIG MRB_INT_BIT
    20 #define EXTENDSIGN(n, l) (((~0 << (n)) >> (((n)*(l)) % BITSPERDIG)) & ~(~0 << (n)))
     20#define EXTENDSIGN(n, l) (((~0U << (n)) >> (((n)*(l)) % BITSPERDIG)) & ~(~0U << (n)))
    2121
    2222mrb_value mrb_str_format(mrb_state *, int, const mrb_value *, mrb_value);
     
    7272mrb_fix2binstr(mrb_state *mrb, mrb_value x, int base)
    7373{
    74   char buf[64], *b = buf + sizeof buf;
     74  char buf[66], *b = buf + sizeof buf;
    7575  mrb_int num = mrb_fixnum(x);
    7676  uint64_t val = (uint64_t)num;
     
    8080    mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix %S", mrb_fixnum_value(base));
    8181  }
    82 
    83   if (val >= (1 << 10))
    84     val &= 0x3ff;
    85 
    8682  if (val == 0) {
    8783    return mrb_str_new_lit(mrb, "0");
     
    121117#define CHECK(l) do {\
    122118/*  int cr = ENC_CODERANGE(result);*/\
    123   while (blen + (l) >= bsiz) {\
     119  while ((l) >= bsiz - blen) {\
    124120    bsiz*=2;\
     121    if (bsiz < 0) mrb_raise(mrb, E_ARGUMENT_ERROR, "too big specifier"); \
    125122  }\
    126123  mrb_str_resize(mrb, result, bsiz);\
     
    141138} while (0)
    142139
    143 #define GETARG() (!mrb_undef_p(nextvalue) ? nextvalue : \
    144   posarg == -1 ? \
    145   (mrb_raisef(mrb, E_ARGUMENT_ERROR, "unnumbered(%S) mixed with numbered", mrb_fixnum_value(nextarg)), mrb_undef_value()) : \
    146   posarg == -2 ? \
    147   (mrb_raisef(mrb, E_ARGUMENT_ERROR, "unnumbered(%S) mixed with named", mrb_fixnum_value(nextarg)), mrb_undef_value()) : \
     140static void
     141check_next_arg(mrb_state *mrb, int posarg, int nextarg)
     142{
     143  switch (posarg) {
     144  case -1:
     145    mrb_raisef(mrb, E_ARGUMENT_ERROR, "unnumbered(%S) mixed with numbered", mrb_fixnum_value(nextarg));
     146    break;
     147  case -2:
     148    mrb_raisef(mrb, E_ARGUMENT_ERROR, "unnumbered(%S) mixed with named", mrb_fixnum_value(nextarg));
     149    break;
     150  default:
     151    break;
     152  }
     153}
     154
     155static void
     156check_pos_arg(mrb_state *mrb, int posarg, int n)
     157{
     158  if (posarg > 0) {
     159    mrb_raisef(mrb, E_ARGUMENT_ERROR, "numbered(%S) after unnumbered(%S)",
     160               mrb_fixnum_value(n), mrb_fixnum_value(posarg));
     161  }
     162  if (posarg == -2) {
     163    mrb_raisef(mrb, E_ARGUMENT_ERROR, "numbered(%S) after named", mrb_fixnum_value(n));
     164  }
     165  if (n < 1) {
     166    mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid index - %S$", mrb_fixnum_value(n));
     167  }
     168}
     169
     170static void
     171check_name_arg(mrb_state *mrb, int posarg, const char *name, int len)
     172{
     173  if (posarg > 0) {
     174    mrb_raisef(mrb, E_ARGUMENT_ERROR, "named%S after unnumbered(%S)",
     175               mrb_str_new(mrb, (name), (len)), mrb_fixnum_value(posarg));
     176  }
     177  if (posarg == -1) {
     178    mrb_raisef(mrb, E_ARGUMENT_ERROR, "named%S after numbered", mrb_str_new(mrb, (name), (len)));
     179  }
     180}
     181
     182#define GETNEXTARG() (\
     183  check_next_arg(mrb, posarg, nextarg),\
    148184  (posarg = nextarg++, GETNTHARG(posarg)))
    149185
    150 #define GETPOSARG(n) (posarg > 0 ? \
    151   (mrb_raisef(mrb, E_ARGUMENT_ERROR, "numbered(%S) after unnumbered(%S)", mrb_fixnum_value(n), mrb_fixnum_value(posarg)), mrb_undef_value()) : \
    152   posarg == -2 ? \
    153   (mrb_raisef(mrb, E_ARGUMENT_ERROR, "numbered(%S) after named", mrb_fixnum_value(n)), mrb_undef_value()) : \
    154   ((n < 1) ? \
    155   (mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid index - %S$", mrb_fixnum_value(n)), mrb_undef_value()) : \
    156   (posarg = -1, GETNTHARG(n))))
     186#define GETARG() (!mrb_undef_p(nextvalue) ? nextvalue : GETNEXTARG())
     187
     188#define GETPOSARG(n) (\
     189  check_pos_arg(mrb, posarg, n),\
     190  (posarg = -1, GETNTHARG(n)))
    157191
    158192#define GETNTHARG(nth) \
    159193  ((nth >= argc) ? (mrb_raise(mrb, E_ARGUMENT_ERROR, "too few arguments"), mrb_undef_value()) : argv[nth])
    160194
    161 #define GETNAMEARG(id, name, len) ( \
    162   posarg > 0 ? \
    163   (mrb_raisef(mrb, E_ARGUMENT_ERROR, "named%S after unnumbered(%S)", mrb_str_new(mrb, (name), (len)), mrb_fixnum_value(posarg)), mrb_undef_value()) : \
    164   posarg == -1 ? \
    165   (mrb_raisef(mrb, E_ARGUMENT_ERROR, "named%S after numbered", mrb_str_new(mrb, (name), (len))), mrb_undef_value()) :    \
     195#define GETNAMEARG(id, name, len) (\
     196  check_name_arg(mrb, posarg, name, len),\
    166197  (posarg = -2, mrb_hash_fetch(mrb, get_hash(mrb, &hash, argc, argv), id, mrb_undef_value())))
    167198
     
    187218  } \
    188219  else { \
    189     tmp_v = GETARG(); \
     220    tmp_v = GETNEXTARG(); \
    190221    p = t; \
    191222  } \
    192   num = mrb_fixnum(tmp_v); \
     223  num = mrb_int(mrb, tmp_v); \
    193224} while (0)
    194225
     
    536567
    537568    for (t = p; t < end && *t != '%'; t++) ;
     569    if (t + 1 == end) ++t;
    538570    PUSH(p, t - p);
    539571    if (t >= end)
     
    680712          mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid character");
    681713        }
     714        mrb_check_type(mrb, tmp, MRB_TT_STRING);
    682715        c = RSTRING_PTR(tmp);
    683716        n = RSTRING_LEN(tmp);
    684717        if (!(flags & FWIDTH)) {
    685           CHECK(n);
    686           memcpy(buf+blen, c, n);
    687           blen += n;
     718          PUSH(c, n);
    688719        }
    689720        else if ((flags & FMINUS)) {
    690           CHECK(n);
    691           memcpy(buf+blen, c, n);
    692           blen += n;
    693           FILL(' ', width-1);
     721          PUSH(c, n);
     722          if (width>0) FILL(' ', width-1);
    694723        }
    695724        else {
    696           FILL(' ', width-1);
    697           CHECK(n);
    698           memcpy(buf+blen, c, n);
    699           blen += n;
     725          if (width>0) FILL(' ', width-1);
     726          PUSH(c, n);
    700727        }
    701728      }
     
    717744          RSTRING(result)->flags &= ~MRB_STR_EMBED_LEN_MASK;
    718745          RSTRING(result)->flags |= tmp_n << MRB_STR_EMBED_LEN_SHIFT;
    719         } else {
     746        }
     747        else {
    720748          RSTRING(result)->as.heap.len = blen;
    721749        }
     
    734762            width -= (int)slen;
    735763            if (!(flags&FMINUS)) {
    736               CHECK(width);
    737               while (width--) {
    738                 buf[blen++] = ' ';
    739               }
     764              FILL(' ', width);
    740765            }
    741             CHECK(len);
    742             memcpy(&buf[blen], RSTRING_PTR(str), len);
    743             blen += len;
     766            PUSH(RSTRING_PTR(str), len);
    744767            if (flags&FMINUS) {
    745               CHECK(width);
    746               while (width--) {
    747                 buf[blen++] = ' ';
    748               }
     768              FILL(' ', width);
    749769            }
    750770            break;
     
    764784      case 'u': {
    765785        mrb_value val = GETARG();
    766         char fbuf[32], nbuf[64], *s;
     786        char nbuf[68], *s;
    767787        const char *prefix = NULL;
    768788        int sign = 0, dots = 0;
    769789        char sc = 0;
    770         mrb_int v = 0, org_v = 0;
     790        mrb_int v = 0;
    771791        int base;
    772792        mrb_int len;
     
    775795          case 'd':
    776796          case 'i':
    777           case 'u':
    778797            sign = 1; break;
    779           case 'o':
    780           case 'x':
    781           case 'X':
    782           case 'b':
    783           case 'B':
    784             if (flags&(FPLUS|FSPACE)) sign = 1;
    785             break;
    786798          default:
    787799            break;
     
    801813        switch (mrb_type(val)) {
    802814          case MRB_TT_FLOAT:
    803             if (FIXABLE(mrb_float(val))) {
    804               val = mrb_fixnum_value((mrb_int)mrb_float(val));
    805               goto bin_retry;
    806             }
    807815            val = mrb_flo_to_fixnum(mrb, val);
    808816            if (mrb_fixnum_p(val)) goto bin_retry;
     
    836844
    837845        if (base == 2) {
    838           org_v = v;
    839846          if (v < 0 && !sign) {
    840847            val = mrb_fix2binstr(mrb, mrb_fixnum_value(v), base);
     
    844851            val = mrb_fixnum_to_str(mrb, mrb_fixnum_value(v), base);
    845852          }
    846           v = mrb_fixnum(mrb_str_to_inum(mrb, val, 10, FALSE));
    847853        }
    848854        if (sign) {
    849           char c = *p;
    850           if (c == 'i') c = 'd'; /* %d and %i are identical */
    851           if (base == 2) c = 'd';
    852           if (v < 0) {
    853             v = -v;
    854             sc = '-';
    855             width--;
    856           }
    857           else if (flags & FPLUS) {
    858             sc = '+';
    859             width--;
    860           }
    861           else if (flags & FSPACE) {
    862             sc = ' ';
    863             width--;
    864           }
    865           snprintf(fbuf, sizeof(fbuf), "%%l%c", c);
    866           snprintf(nbuf, sizeof(nbuf), fbuf, v);
     855          if (v > 0) {
     856            if (flags & FPLUS) {
     857              sc = '+';
     858              width--;
     859            }
     860            else if (flags & FSPACE) {
     861              sc = ' ';
     862              width--;
     863            }
     864          }
     865          switch (base) {
     866          case 2:
     867            strncpy(nbuf, RSTRING_PTR(val), sizeof(nbuf));
     868            break;
     869          case 8:
     870            snprintf(nbuf, sizeof(nbuf), "%" MRB_PRIo, v);
     871            break;
     872          case 10:
     873            snprintf(nbuf, sizeof(nbuf), "%" MRB_PRId, v);
     874            break;
     875          case 16:
     876            snprintf(nbuf, sizeof(nbuf), "%" MRB_PRIx, v);
     877            break;
     878          }
    867879          s = nbuf;
    868880        }
    869881        else {
    870           char c = *p;
    871           if (c == 'X') c = 'x';
    872           if (base == 2) c = 'd';
    873882          s = nbuf;
    874           if (v < 0) {
     883          if (base != 10 && v < 0) {
    875884            dots = 1;
    876885          }
    877           snprintf(fbuf, sizeof(fbuf), "%%l%c", c);
    878           snprintf(++s, sizeof(nbuf) - 1, fbuf, v);
     886          switch (base) {
     887          case 2:
     888            strncpy(++s, RSTRING_PTR(val), sizeof(nbuf)-1);
     889            break;
     890          case 8:
     891            snprintf(++s, sizeof(nbuf)-1, "%" MRB_PRIo, v);
     892            break;
     893          case 10:
     894            snprintf(++s, sizeof(nbuf)-1, "%" MRB_PRId, v);
     895            break;
     896          case 16:
     897            snprintf(++s, sizeof(nbuf)-1, "%" MRB_PRIx, v);
     898            break;
     899          }
    879900          if (v < 0) {
    880901            char d;
     
    950971        }
    951972
    952         if (!(flags&FMINUS)) {
    953           CHECK(width);
    954           while (width-- > 0) {
    955             buf[blen++] = ' ';
    956           }
     973        if (!(flags&FMINUS) && width > 0) {
     974          FILL(' ', width);
    957975        }
    958976
     
    963981          PUSH(prefix, plen);
    964982        }
    965         CHECK(prec - len);
    966983        if (dots) PUSH("..", 2);
    967984
    968         if (v < 0 || (base == 2 && org_v < 0)) {
    969           char c = sign_bits(base, p);
    970           while (len < prec--) {
    971             buf[blen++] = c;
    972           }
    973         }
    974         else if ((flags & (FMINUS|FPREC)) != FMINUS) {
    975           char c = '0';
    976           while (len < prec--) {
    977             buf[blen++] = c;
    978           }
    979         }
    980 
     985        if (prec > len) {
     986          CHECK(prec - len);
     987          if (v < 0) {
     988            char c = sign_bits(base, p);
     989            FILL(c, prec - len);
     990          }
     991          else if ((flags & (FMINUS|FPREC)) != FMINUS) {
     992            char c = '0';
     993            FILL(c, prec - len);
     994          }
     995        }
    981996        PUSH(s, len);
    982         CHECK(width);
    983         while (width-- > 0) {
    984           buf[blen++] = ' ';
     997        if (width > 0) {
     998          FILL(' ', width);
    985999        }
    9861000      }
     
    10031017          const char *expr;
    10041018          const int elen = 3;
     1019          char sign = '\0';
    10051020
    10061021          if (isnan(fval)) {
     
    10111026          }
    10121027          need = elen;
    1013           if ((!isnan(fval) && fval < 0.0) || (flags & FPLUS))
    1014             need++;
     1028          if (!isnan(fval) && fval < 0.0)
     1029            sign = '-';
     1030          else if (flags & (FPLUS|FSPACE))
     1031            sign = (flags & FPLUS) ? '+' : ' ';
     1032          if (sign)
     1033            ++need;
    10151034          if ((flags & FWIDTH) && need < width)
    10161035            need = width;
    10171036
    1018           CHECK(need + 1);
    1019           snprintf(&buf[blen], need + 1, "%*s", need, "");
     1037          if (need < 0) {
     1038            mrb_raise(mrb, E_ARGUMENT_ERROR, "width too big");
     1039          }
     1040          FILL(' ', need);
    10201041          if (flags & FMINUS) {
    1021             if (!isnan(fval) && fval < 0.0)
    1022               buf[blen++] = '-';
    1023             else if (flags & FPLUS)
    1024               buf[blen++] = '+';
    1025             else if (flags & FSPACE)
    1026               blen++;
    1027             memcpy(&buf[blen], expr, elen);
     1042            if (sign)
     1043              buf[blen - need--] = sign;
     1044            memcpy(&buf[blen - need], expr, elen);
    10281045          }
    10291046          else {
    1030             if (!isnan(fval) && fval < 0.0)
    1031               buf[blen + need - elen - 1] = '-';
    1032             else if (flags & FPLUS)
    1033               buf[blen + need - elen - 1] = '+';
    1034             else if ((flags & FSPACE) && need > width)
    1035               blen++;
    1036             memcpy(&buf[blen + need - elen], expr, elen);
    1037           }
    1038           blen += strlen(&buf[blen]);
     1047            if (sign)
     1048              buf[blen - elen - 1] = sign;
     1049            memcpy(&buf[blen - elen], expr, elen);
     1050          }
    10391051          break;
    10401052        }
     
    10521064          need = width;
    10531065        need += 20;
     1066        if (need <= 0) {
     1067          mrb_raise(mrb, E_ARGUMENT_ERROR,
     1068                    (width > prec ? "width too big" : "prec too big"));
     1069        }
    10541070
    10551071        CHECK(need);
    10561072        n = snprintf(&buf[blen], need, fbuf, fval);
     1073        if (n < 0) {
     1074          mrb_raise(mrb, E_RUNTIME_ERROR, "formatting error");
     1075        }
    10571076        blen += n;
    10581077      }
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-sprintf/test/sprintf.rb

    r321 r331  
    66  assert_equal "1 one 1.0", "%d %s %3.1f" % [ 1, "one", 1.01 ]
    77  assert_equal "123 < 456", "%{num} < %<str>s" % { num: 123, str: "456" }
     8  assert_equal 15, ("%b" % (1<<14)).size
    89end
     10
     11assert('String#% with inf') do
     12  inf = Float::INFINITY
     13
     14  assert_equal "Inf", "%f" % inf
     15  assert_equal "Inf", "%2f" % inf
     16  assert_equal "Inf", "%3f" % inf
     17  assert_equal " Inf", "%4f" % inf
     18  assert_equal "  Inf", "%5f" % inf
     19
     20  assert_equal "+Inf", "%+f" % inf
     21  assert_equal "+Inf", "%+2f" % inf
     22  assert_equal "+Inf", "%+3f" % inf
     23  assert_equal "+Inf", "%+4f" % inf
     24  assert_equal " +Inf", "%+5f" % inf
     25
     26  assert_equal "Inf", "%-f" % inf
     27  assert_equal "Inf", "%-2f" % inf
     28  assert_equal "Inf", "%-3f" % inf
     29  assert_equal "Inf ", "%-4f" % inf
     30  assert_equal "Inf  ", "%-5f" % inf
     31
     32  assert_equal " Inf", "% f" % inf
     33  assert_equal " Inf", "% 2f" % inf
     34  assert_equal " Inf", "% 3f" % inf
     35  assert_equal " Inf", "% 4f" % inf
     36  assert_equal "  Inf", "% 5f" % inf
     37end
     38
     39assert('String#% with nan') do
     40  nan = Float::NAN
     41
     42  assert_equal "NaN", "%f" % nan
     43  assert_equal "NaN", "%2f" % nan
     44  assert_equal "NaN", "%3f" % nan
     45  assert_equal " NaN", "%4f" % nan
     46  assert_equal "  NaN", "%5f" % nan
     47
     48  assert_equal "+NaN", "%+f" % nan
     49  assert_equal "+NaN", "%+2f" % nan
     50  assert_equal "+NaN", "%+3f" % nan
     51  assert_equal "+NaN", "%+4f" % nan
     52  assert_equal " +NaN", "%+5f" % nan
     53
     54  assert_equal "NaN", "%-f" % nan
     55  assert_equal "NaN", "%-2f" % nan
     56  assert_equal "NaN", "%-3f" % nan
     57  assert_equal "NaN ", "%-4f" % nan
     58  assert_equal "NaN  ", "%-5f" % nan
     59
     60  assert_equal " NaN", "% f" % nan
     61  assert_equal " NaN", "% 2f" % nan
     62  assert_equal " NaN", "% 3f" % nan
     63  assert_equal " NaN", "% 4f" % nan
     64  assert_equal "  NaN", "% 5f" % nan
     65end
     66
     67assert("String#% with invalid chr") do
     68  begin
     69    class Fixnum
     70      alias_method :chr_, :chr if method_defined?(:chr)
     71
     72      def chr
     73        nil
     74      end
     75    end
     76
     77    assert_raise TypeError do
     78      "%c" % 0
     79    end
     80  ensure
     81    class Fixnum
     82      if method_defined?(:chr_)
     83        alias_method :chr, :chr_
     84        remove_method :chr_
     85      end
     86    end
     87  end
     88end
     89
     90assert("String#% %b") do
     91  assert_equal("..10115", "%0b5" % -5)
     92end
     93
     94assert("String#% invalid format") do
     95  assert_raise ArgumentError do
     96    "%?" % ""
     97  end
     98end
     99
     100assert("String#% invalid format shared substring") do
     101  fmt = ("x"*30+"%!")[0...-1]
     102  assert_equal fmt, sprintf(fmt, "")
     103end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-string-ext/mrbgem.rake

    r321 r331  
    33  spec.author  = 'mruby developers'
    44  spec.summary = 'String class extension'
     5  spec.add_test_dependency 'mruby-enumerator', core: 'mruby-enumerator'
    56end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-string-ext/mrblib/string.rb

    r321 r331  
    11class String
     2
     3  ##
     4  #  call-seq:
     5  #     String.try_convert(obj) -> string or nil
     6  #
     7  # Try to convert <i>obj</i> into a String, using to_str method.
     8  # Returns converted string or nil if <i>obj</i> cannot be converted
     9  # for any reason.
     10  #
     11  #     String.try_convert("str")     #=> "str"
     12  #     String.try_convert(/re/)      #=> nil
     13  #
     14  def self.try_convert(obj)
     15    if obj.respond_to?(:to_str)
     16      obj.to_str
     17    else
     18      nil
     19    end
     20  end
    221
    322  ##
     
    2746    a = 0
    2847    z = self.size - 1
    29     a += 1 while " \f\n\r\t\v".include?(self[a]) and a <= z
     48    a += 1 while a <= z and " \f\n\r\t\v".include?(self[a])
    3049    (z >= 0) ? self[a..z] : ""
    3150  end
     
    4463    a = 0
    4564    z = self.size - 1
    46     z -= 1 while " \f\n\r\t\v\0".include?(self[z]) and a <= z
     65    z -= 1 while a <= z and " \f\n\r\t\v\0".include?(self[z])
    4766    (z >= 0) ? self[a..z] : ""
    4867  end
     
    6079    a = 0
    6180    z = self.size - 1
    62     a += 1 while " \f\n\r\t\v".include?(self[a]) and a <= z
    63     z -= 1 while " \f\n\r\t\v\0".include?(self[z]) and a <= z
     81    a += 1 while a <= z and " \f\n\r\t\v".include?(self[a])
     82    z -= 1 while a <= z and " \f\n\r\t\v\0".include?(self[z])
    6483    (z >= 0) ? self[a..z] : ""
    6584  end
     
    7796  #
    7897  def lstrip!
     98    raise RuntimeError, "can't modify frozen String" if frozen?
    7999    s = self.lstrip
    80100    (s == self) ? nil : self.replace(s)
     
    93113  #
    94114  def rstrip!
     115    raise RuntimeError, "can't modify frozen String" if frozen?
    95116    s = self.rstrip
    96117    (s == self) ? nil : self.replace(s)
     
    105126  #
    106127  def strip!
     128    raise RuntimeError, "can't modify frozen String" if frozen?
    107129    s = self.strip
    108130    (s == self) ? nil : self.replace(s)
     
    165187  #
    166188  def slice!(arg1, arg2=nil)
     189    raise RuntimeError, "can't modify frozen String" if frozen?
    167190    raise "wrong number of arguments (for 1..2)" if arg1.nil? && arg2.nil?
    168191
     
    189212        idx = arg1
    190213        idx += self.size if arg1 < 0
    191         validated = true if idx >=0 && arg1 < self.size   
     214        validated = true if idx >=0 && arg1 < self.size
    192215      end
    193216      if validated
     
    236259  #
    237260  def insert(idx, str)
    238     pos = idx.to_i
    239     pos += self.size + 1 if pos < 0
    240 
    241     raise IndexError, "index #{idx.to_i} out of string" if pos < 0 || pos > self.size
    242 
    243     return self + str if pos == -1
    244     return str + self if pos == 0
    245     return self[0..pos - 1] + str + self[pos..-1]
     261    if idx == -1
     262      return self << str
     263    elsif idx < 0
     264      idx += 1
     265    end
     266    self[idx, 0] = str
     267    self
    246268  end
    247269
     
    258280  #     "hello".ljust(20, '1234')   #=> "hello123412341234123"
    259281  def ljust(idx, padstr = ' ')
    260     if idx <= self.size
    261       return self
    262     end
    263     newstr = self.dup
    264     newstr << padstr
    265     while newstr.size <= idx
    266       newstr << padstr
    267     end
    268     return newstr.slice(0,idx)
    269   end
    270 
    271   #     str.upto(other_str, exclusive=false) {|s| block }   -> str
    272   #     str.upto(other_str, exclusive=false)                -> an_enumerator
    273   #
    274   #  Iterates through successive values, starting at <i>str</i> and
    275   #  ending at <i>other_str</i> inclusive, passing each value in turn to
    276   #  the block. The <code>String#succ</code> method is used to generate
    277   #  each value.  If optional second argument exclusive is omitted or is false,
    278   #  the last value will be included; otherwise it will be excluded.
    279   #
    280   #  If no block is given, an enumerator is returned instead.
    281   #
    282   #     "a8".upto("b6") {|s| print s, ' ' }
    283   #     for s in "a8".."b6"
    284   #       print s, ' '
    285   #     end
    286   #
    287   #  <em>produces:</em>
    288   #
    289   #     a8 a9 b0 b1 b2 b3 b4 b5 b6
    290   #     a8 a9 b0 b1 b2 b3 b4 b5 b6
    291   #
    292   #  If <i>str</i> and <i>other_str</i> contains only ascii numeric characters,
    293   #  both are recognized as decimal numbers. In addition, the width of
    294   #  string (e.g. leading zeros) is handled appropriately.
    295   #
    296   #     "9".upto("11").to_a   #=> ["9", "10", "11"]
    297   #     "25".upto("5").to_a   #=> []
    298   #     "07".upto("11").to_a  #=> ["07", "08", "09", "10", "11"]
    299   #
    300   def upto(other_str, excl=false, &block)
    301     return to_enum :upto, other_str, excl unless block
    302 
    303     str = self
    304     n = self.<=>other_str
    305     return self if n > 0 || (self == other_str && excl)
    306     while true
    307       block.call(str)
    308       return self if !excl && str == other_str
    309       str = str.succ
    310       return self if excl && str == other_str
    311     end
     282    raise ArgumentError, 'zero width padding' if padstr == ''
     283    return self if idx <= self.size
     284    pad_repetitions = (idx / padstr.length).ceil
     285    padding = (padstr * pad_repetitions)[0...(idx - self.length)]
     286    self + padding
     287  end
     288
     289  ##
     290  #  call-seq:
     291  #     str.rjust(integer, padstr=' ')   -> new_str
     292  #
     293  #  If <i>integer</i> is greater than the length of <i>str</i>, returns a new
     294  #  <code>String</code> of length <i>integer</i> with <i>str</i> right justified
     295  #  and padded with <i>padstr</i>; otherwise, returns <i>str</i>.
     296  #
     297  #     "hello".rjust(4)            #=> "hello"
     298  #     "hello".rjust(20)           #=> "               hello"
     299  #     "hello".rjust(20, '1234')   #=> "123412341234123hello"
     300  def rjust(idx, padstr = ' ')
     301    raise ArgumentError, 'zero width padding' if padstr == ''
     302    return self if idx <= self.size
     303    pad_repetitions = (idx / padstr.length).ceil
     304    padding = (padstr * pad_repetitions)[0...(idx - self.length)]
     305    padding + self
    312306  end
    313307
    314308  def chars(&block)
    315309    if block_given?
    316       self.split('').map do |i|
     310      self.split('').each do |i|
    317311        block.call(i)
    318312      end
     
    322316    end
    323317  end
    324   alias each_char chars
     318
     319  def each_char(&block)
     320    return to_enum :each_char unless block
     321
     322    split('').each do |i|
     323      block.call(i)
     324    end
     325    self
     326  end
    325327
    326328  def codepoints(&block)
     
    328330
    329331    if block_given?
    330       self.split('').map do|x|
     332      self.split('').each do|x|
    331333        block.call(x.ord)
    332334      end
     
    337339  end
    338340  alias each_codepoint codepoints
     341
     342  ##
     343  # call-seq:
     344  #    str.prepend(other_str)  -> str
     345  #
     346  # Prepend---Prepend the given string to <i>str</i>.
     347  #
     348  #    a = "world"
     349  #    a.prepend("hello ") #=> "hello world"
     350  #    a                   #=> "hello world"
     351  def prepend(arg)
     352    self[0, 0] = arg
     353    self
     354  end
    339355end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-string-ext/src/string.c

    r321 r331  
    11#include <string.h>
    2 #include "mruby.h"
    3 #include "mruby/array.h"
    4 #include "mruby/class.h"
    5 #include "mruby/string.h"
    6 #include "mruby/range.h"
     2#include <mruby.h>
     3#include <mruby/array.h>
     4#include <mruby/class.h>
     5#include <mruby/string.h>
     6#include <mruby/range.h>
    77
    88static mrb_value
     
    2424{
    2525  mrb_int pos, byte;
    26   long len = RSTRING_LEN(str);
     26  long len;
    2727
    2828  mrb_get_args(mrb, "ii", &pos, &byte);
    2929
     30  len = RSTRING_LEN(str);
    3031  if (pos < -len || len <= pos)
    3132    mrb_raisef(mrb, E_INDEX_ERROR, "index %S is out of array", mrb_fixnum_value(pos));
     
    5657
    5758      len = RSTRING_LEN(str);
    58       if (mrb_range_beg_len(mrb, a1, &beg, &len, len)) {
     59      switch (mrb_range_beg_len(mrb, a1, &beg, &len, len, TRUE)) {
     60      case 0:                   /* not range */
     61        break;
     62      case 1:                   /* range */
    5963        return mrb_str_substr(mrb, str, beg, len);
     64      case 2:                   /* out of range */
     65        mrb_raisef(mrb, E_RANGE_ERROR, "%S out of range", a1);
     66        break;
    6067      }
    6168      return mrb_nil_value();
     
    128135}
    129136
     137static mrb_value mrb_fixnum_chr(mrb_state *mrb, mrb_value num);
     138
    130139/*
    131140 *  call-seq:
     
    147156{
    148157  mrb_value str;
    149   mrb_get_args(mrb, "S", &str);
     158
     159  mrb_get_args(mrb, "o", &str);
     160  if (mrb_fixnum_p(str))
     161    str = mrb_fixnum_chr(mrb, str);
     162  else
     163    str = mrb_string_type(mrb, str);
    150164  mrb_str_concat(mrb, self, str);
    151165  return self;
     
    308322  mrb_int len;
    309323  mrb_value arg;
    310   char *p = RSTRING_PTR(self), *t;
    311   char *e = p + RSTRING_LEN(self);
     324  char *b = RSTRING_PTR(self);
     325  char *p = b, *t;
     326  char *e = b + RSTRING_LEN(self);
    312327
    313328  mrb_get_args(mrb, "&", &blk);
    314329
    315330  result = mrb_ary_new(mrb);
    316 
     331  ai = mrb_gc_arena_save(mrb);
    317332  if (!mrb_nil_p(blk)) {
    318333    while (p < e) {
     
    323338      arg = mrb_str_new(mrb, t, len);
    324339      mrb_yield_argv(mrb, blk, 1, &arg);
     340      mrb_gc_arena_restore(mrb, ai);
     341      if (b != RSTRING_PTR(self)) {
     342        ptrdiff_t diff = p - b;
     343        b = RSTRING_PTR(self);
     344        p = b + diff;
     345      }
     346      e = b + RSTRING_LEN(self);
    325347    }
    326348    return self;
    327349  }
    328350  while (p < e) {
    329     ai = mrb_gc_arena_save(mrb);
    330351    t = p;
    331352    while (p < e && *p != '\n') p++;
     
    354375  const char *prepend;
    355376  struct RString *s = mrb_str_ptr(self);
    356   size_t l;
     377  mrb_int l;
    357378
    358379  if (RSTRING_LEN(self) == 0)
     
    374395    e = p + l - 1;
    375396    result = mrb_str_new_lit(mrb, "");
    376   } else {
     397  }
     398  else {
    377399    // find leading letter of the ascii/number
    378400    b = e;
     
    392414        mrb_str_cat_lit(mrb, result, "\x01");
    393415        (*e) = 0;
    394       } else
     416      }
     417      else
    395418        (*e)++;
    396419      break;
     
    400423      if (e == b) prepend = "1";
    401424      *e = '0';
    402     } else if (*e == 'z') {
     425    }
     426    else if (*e == 'z') {
    403427      if (e == b) prepend = "a";
    404428      *e = 'a';
    405     } else if (*e == 'Z') {
     429    }
     430    else if (*e == 'Z') {
    406431      if (e == b) prepend = "A";
    407432      *e = 'A';
    408     } else {
     433    }
     434    else {
    409435      (*e)++;
    410436      break;
     
    428454  mrb_str_succ_bang(mrb, str);
    429455  return str;
    430 }
    431 
    432 /*
    433  *  call-seq:
    434  *     str.prepend(other_str)  -> str
    435  *
    436  *  Prepend---Prepend the given string to <i>str</i>.
    437  *
    438  *     a = "world"
    439  *     a.prepend("hello ") #=> "hello world"
    440  *     a                   #=> "hello world"
    441  */
    442 static mrb_value
    443 mrb_str_prepend(mrb_state *mrb, mrb_value self)
    444 {
    445   struct RString *s1 = mrb_str_ptr(self), *s2, *temp_s;
    446   mrb_int len;
    447   mrb_value other, temp_str;
    448 
    449   mrb_get_args(mrb, "S", &other);
    450 
    451   mrb_str_modify(mrb, s1);
    452   if (!mrb_string_p(other)) {
    453     other = mrb_str_to_str(mrb, other);
    454   }
    455   s2 = mrb_str_ptr(other);
    456   len = RSTR_LEN(s1) + RSTR_LEN(s2);
    457   temp_str = mrb_str_new(mrb, NULL, RSTR_LEN(s1));
    458   temp_s = mrb_str_ptr(temp_str);
    459   memcpy(RSTR_PTR(temp_s), RSTR_PTR(s1), RSTR_LEN(s1));
    460   if (RSTRING_CAPA(self) < len) {
    461     mrb_str_resize(mrb, self, len);
    462   }
    463   memcpy(RSTR_PTR(s1), RSTR_PTR(s2), RSTR_LEN(s2));
    464   memcpy(RSTR_PTR(s1) + RSTR_LEN(s2), RSTR_PTR(temp_s), RSTR_LEN(temp_s));
    465   RSTR_SET_LEN(s1, len);
    466   RSTR_PTR(s1)[len] = '\0';
    467   return self;
    468456}
    469457
     
    530518  if (RSTRING_LEN(str) == 0)
    531519    mrb_raise(mrb, E_ARGUMENT_ERROR, "empty string");
    532   return mrb_fixnum_value(RSTRING_PTR(str)[0]);
     520  return mrb_fixnum_value((unsigned char)RSTRING_PTR(str)[0]);
    533521}
    534522#endif
     523
     524static mrb_bool
     525all_digits_p(const char *s, mrb_int len)
     526{
     527  while (len-- > 0) {
     528    if (!ISDIGIT(*s)) return FALSE;
     529    s++;
     530  }
     531  return TRUE;
     532}
     533
     534/*
     535 *  call-seq:
     536 *     str.upto(other_str, exclusive=false) {|s| block }   -> str
     537 *     str.upto(other_str, exclusive=false)                -> an_enumerator
     538 *
     539 *  Iterates through successive values, starting at <i>str</i> and
     540 *  ending at <i>other_str</i> inclusive, passing each value in turn to
     541 *  the block. The <code>String#succ</code> method is used to generate
     542 *  each value.  If optional second argument exclusive is omitted or is false,
     543 *  the last value will be included; otherwise it will be excluded.
     544 *
     545 *  If no block is given, an enumerator is returned instead.
     546 *
     547 *     "a8".upto("b6") {|s| print s, ' ' }
     548 *     for s in "a8".."b6"
     549 *       print s, ' '
     550 *     end
     551 *
     552 *  <em>produces:</em>
     553 *
     554 *     a8 a9 b0 b1 b2 b3 b4 b5 b6
     555 *     a8 a9 b0 b1 b2 b3 b4 b5 b6
     556 *
     557 *  If <i>str</i> and <i>other_str</i> contains only ascii numeric characters,
     558 *  both are recognized as decimal numbers. In addition, the width of
     559 *  string (e.g. leading zeros) is handled appropriately.
     560 *
     561 *     "9".upto("11").to_a   #=> ["9", "10", "11"]
     562 *     "25".upto("5").to_a   #=> []
     563 *     "07".upto("11").to_a  #=> ["07", "08", "09", "10", "11"]
     564 */
     565static mrb_value
     566mrb_str_upto(mrb_state *mrb, mrb_value beg)
     567{
     568  mrb_value end;
     569  mrb_value exclusive = mrb_false_value();
     570  mrb_value block = mrb_nil_value();
     571  mrb_value current, after_end;
     572  mrb_int n;
     573  mrb_bool excl;
     574
     575  mrb_get_args(mrb, "o|o&", &end, &exclusive, &block);
     576
     577  if (mrb_nil_p(block)) {
     578    return mrb_funcall(mrb, beg, "to_enum", 3, mrb_symbol_value(mrb_intern_lit(mrb, "upto")), end, exclusive);
     579  }
     580  end = mrb_string_type(mrb, end);
     581  excl = mrb_test(exclusive);
     582
     583  /* single character */
     584  if (RSTRING_LEN(beg) == 1 && RSTRING_LEN(end) == 1 &&
     585  ISASCII(RSTRING_PTR(beg)[0]) && ISASCII(RSTRING_PTR(end)[0])) {
     586    char c = RSTRING_PTR(beg)[0];
     587    char e = RSTRING_PTR(end)[0];
     588    int ai = mrb_gc_arena_save(mrb);
     589
     590    if (c > e || (excl && c == e)) return beg;
     591    for (;;) {
     592      mrb_yield(mrb, block, mrb_str_new(mrb, &c, 1));
     593      mrb_gc_arena_restore(mrb, ai);
     594      if (!excl && c == e) break;
     595      c++;
     596      if (excl && c == e) break;
     597    }
     598    return beg;
     599  }
     600  /* both edges are all digits */
     601  if (ISDIGIT(RSTRING_PTR(beg)[0]) && ISDIGIT(RSTRING_PTR(end)[0]) &&
     602      all_digits_p(RSTRING_PTR(beg), RSTRING_LEN(beg)) &&
     603      all_digits_p(RSTRING_PTR(end), RSTRING_LEN(end))) {
     604    int ai = mrb_gc_arena_save(mrb);
     605    mrb_int min_width = RSTRING_LEN(beg);
     606    mrb_int max_width = RSTRING_LEN(end);
     607    mrb_int bi = mrb_int(mrb, mrb_str_to_inum(mrb, beg, 10, FALSE));
     608    mrb_int ei = mrb_int(mrb, mrb_str_to_inum(mrb, end, 10, FALSE));
     609    mrb_value str = mrb_str_new(mrb, NULL, max_width);
     610    char *buf = RSTRING_PTR(str);
     611
     612    while (bi <= ei) {
     613      if (excl && bi == ei) break;
     614      snprintf(buf, max_width+1, "%.*" MRB_PRId, (int)min_width, bi);
     615      mrb_yield(mrb, block, mrb_str_new(mrb, buf, strlen(buf)));
     616      mrb_gc_arena_restore(mrb, ai);
     617      bi++;
     618    }
     619
     620    return beg;
     621  }
     622  /* normal case */
     623  n = mrb_int(mrb, mrb_funcall(mrb, beg, "<=>", 1, end));
     624  if (n > 0 || (excl && n == 0)) return beg;
     625
     626  after_end = mrb_funcall(mrb, end, "succ", 0);
     627  current = mrb_str_dup(mrb, beg);
     628  while (!mrb_str_equal(mrb, current, after_end)) {
     629    int ai = mrb_gc_arena_save(mrb);
     630    mrb_value next = mrb_nil_value();
     631    if (excl || !mrb_str_equal(mrb, current, end))
     632      next = mrb_funcall(mrb, current, "succ", 0);
     633    mrb_yield(mrb, block, current);
     634    if (mrb_nil_p(next)) break;
     635    current = mrb_str_to_str(mrb, next);
     636    if (excl && mrb_str_equal(mrb, current, end)) break;
     637    if (RSTRING_LEN(current) > RSTRING_LEN(end) || RSTRING_LEN(current) == 0)
     638      break;
     639    mrb_gc_arena_restore(mrb, ai);
     640  }
     641
     642  return beg;
     643}
    535644
    536645void
     
    555664  mrb_define_method(mrb, s, "succ",            mrb_str_succ,            MRB_ARGS_NONE());
    556665  mrb_define_method(mrb, s, "succ!",           mrb_str_succ_bang,       MRB_ARGS_NONE());
    557   mrb_define_method(mrb, s, "prepend",         mrb_str_prepend,         MRB_ARGS_REQ(1));
    558666  mrb_alias_method(mrb, s, mrb_intern_lit(mrb, "next"), mrb_intern_lit(mrb, "succ"));
    559667  mrb_alias_method(mrb, s, mrb_intern_lit(mrb, "next!"), mrb_intern_lit(mrb, "succ!"));
    560668  mrb_define_method(mrb, s, "ord", mrb_str_ord, MRB_ARGS_NONE());
     669  mrb_define_method(mrb, s, "upto", mrb_str_upto, MRB_ARGS_ANY());
    561670
    562671  mrb_define_method(mrb, mrb->fixnum_class, "chr", mrb_fixnum_chr, MRB_ARGS_NONE());
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-string-ext/test/string.rb

    r321 r331  
    33
    44UTF8STRING = ("\343\201\202".size == 1)
     5
     6assert('String.try_convert') do
     7  assert_nil String.try_convert(nil)
     8  assert_nil String.try_convert(:foo)
     9  assert_equal "", String.try_convert("")
     10  assert_equal "1,2,3", String.try_convert("1,2,3")
     11end
    512
    613assert('String#getbyte') do
     
    2229  assert_equal(h, str1.getbyte(0))
    2330  assert_equal("Hello", str1)
     31end
     32
     33assert("String#setbyte raises IndexError if arg conversion resizes String") do
     34  $s = "01234\n"
     35  class Tmp
     36      def to_i
     37          $s.chomp! ''
     38          95
     39      end
     40  end
     41  tmp = Tmp.new
     42  assert_raise(IndexError) { $s.setbyte(5, tmp) }
    2443end
    2544
     
    104123
    105124assert('String#concat') do
    106   s = "Hello "
    107   s.concat "World!"
    108   t = "Hello "
    109   t << "World!"
    110   assert_equal "Hello World!", t
    111   assert_equal "Hello World!", s
     125  assert_equal "Hello World!", "Hello " << "World" << 33
     126  assert_equal "Hello World!", "Hello ".concat("World").concat(33)
     127
     128  o = Object.new
     129  def o.to_str
     130    "to_str"
     131  end
     132  assert_equal "hi to_str", "hi " << o
     133
     134  assert_raise(TypeError) { "".concat(Object.new) }
    112135end
    113136
     
    400423  assert_raise(IndexError) { "abcd".insert(5, 'X') }
    401424  assert_raise(IndexError) { "abcd".insert(-6, 'X') }
     425
     426  a = "abcd"
     427  a.insert(0, 'X')
     428  assert_equal "Xabcd", a
    402429end
    403430
     
    411438  assert_equal "hello", "hello".ljust(4)
    412439  assert_equal "hello               ", "hello".ljust(20)
     440  assert_equal 20, "hello".ljust(20).length
    413441  assert_equal "hello123412341234123", "hello".ljust(20, '1234')
    414442  assert_equal "hello", "hello".ljust(-3)
    415443end
    416444
     445assert('String#rjust') do
     446  assert_equal "hello", "hello".rjust(4)
     447  assert_equal "               hello", "hello".rjust(20)
     448  assert_equal 20, "hello".rjust(20).length
     449  assert_equal "123412341234123hello", "hello".rjust(20, '1234')
     450  assert_equal "hello", "hello".rjust(-3)
     451end
     452
     453if UTF8STRING
     454  assert('String#ljust with UTF8') do
     455    assert_equal "helloん              ", "helloん".ljust(20)
     456    assert_equal "helloó                            ", "helloó".ljust(34)
     457    assert_equal 34, "helloó".ljust(34).length
     458    assert_equal "helloんんんんんんんんんんんんんん", "hello".ljust(19, 'ん')
     459    assert_equal "helloんんんんんんんんんんんんんんん", "hello".ljust(20, 'ん')
     460  end
     461
     462  assert('String#rjust with UTF8') do
     463    assert_equal "              helloん", "helloん".rjust(20)
     464    assert_equal "                            helloó", "helloó".rjust(34)
     465    # assert_equal 34, "helloó".rjust(34).length
     466    assert_equal "んんんんんんんんんんんんんんhello", "hello".rjust(19, 'ん')
     467    assert_equal "んんんんんんんんんんんんんんんhello", "hello".rjust(20, 'ん')
     468  end
     469
     470  assert('UTF8 byte counting') do
     471    ret = '                                  '
     472    ret[-6..-1] = "helloó"
     473    assert_equal 34, ret.length
     474  end
     475end
     476
     477assert('String#ljust should not change string') do
     478  a = "hello"
     479  a.ljust(20)
     480  assert_equal "hello", a
     481end
     482
     483assert('String#rjust should not change string') do
     484  a = "hello"
     485  a.rjust(20)
     486  assert_equal "hello", a
     487end
     488
     489assert('String#ljust should raise on zero width padding') do
     490  assert_raise(ArgumentError) { "foo".ljust(10, '') }
     491end
     492
     493assert('String#rjust should raise on zero width padding') do
     494  assert_raise(ArgumentError) { "foo".rjust(10, '') }
     495end
     496
    417497assert('String#upto') do
     498  assert_equal %w(a8 a9 b0 b1 b2 b3 b4 b5 b6), "a8".upto("b6").to_a
     499  assert_equal ["9", "10", "11"], "9".upto("11").to_a
     500  assert_equal [], "25".upto("5").to_a
     501  assert_equal ["07", "08", "09", "10", "11"], "07".upto("11").to_a
     502
     503if UTF8STRING
     504  assert_equal ["あ", "ぃ", "い", "ぅ", "う", "ぇ", "え", "ぉ", "お"], "あ".upto("お").to_a
     505end
     506
     507  assert_equal ["9", ":", ";", "<", "=", ">", "?", "@", "A"], "9".upto("A").to_a
     508
    418509  a     = "aa"
    419510  start = "aa"
     
    475566  })
    476567  assert_equal(2, count)
     568
     569  assert_raise(TypeError) { "a".upto(:c) {} }
    477570end
    478571
     
    480573  got = "hello!".split('').map {|x| x.ord}
    481574  expect = [104, 101, 108, 108, 111, 33]
     575  unless UTF8STRING
     576    got << "\xff".ord
     577    expect << 0xff
     578  end
    482579  assert_equal expect, got
    483580end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-struct/mrblib/struct.rb

    r321 r331  
    8383    alias to_s inspect
    8484  end
     85
     86  ##
     87  # call-seq:
     88  #   hsh.dig(key,...)                 -> object
     89  #
     90  # Extracts the nested value specified by the sequence of <i>key</i>
     91  # objects by calling +dig+ at each step, returning +nil+ if any
     92  # intermediate step is +nil+.
     93  #
     94  def dig(idx,*args)
     95    n = self[idx]
     96    if args.size > 0
     97      n&.dig(*args)
     98    else
     99      n
     100    end
     101  end
    85102end
    86103
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-struct/src/struct.c

    r321 r331  
    66
    77#include <string.h>
    8 #include "mruby.h"
    9 #include "mruby/array.h"
    10 #include "mruby/string.h"
    11 #include "mruby/class.h"
    12 #include "mruby/variable.h"
    13 #include "mruby/hash.h"
    14 #include "mruby/range.h"
     8#include <mruby.h>
     9#include <mruby/array.h>
     10#include <mruby/string.h>
     11#include <mruby/class.h>
     12#include <mruby/variable.h>
     13#include <mruby/hash.h>
     14#include <mruby/range.h>
    1515
    1616#define RSTRUCT_LEN(st) mrb_ary_ptr(st)->len
     
    6262  }
    6363  if (RSTRUCT_LEN(s) != RARRAY_LEN(members)) {
    64     mrb_raisef(mrb, E_TYPE_ERROR,
    65                "struct size differs (%S required %S given)",
    66                mrb_fixnum_value(RARRAY_LEN(members)), mrb_fixnum_value(RSTRUCT_LEN(s)));
     64    if (RSTRUCT_LEN(s) == 0) {  /* probably uninitialized */
     65      mrb_ary_resize(mrb, s, RARRAY_LEN(members));
     66    }
     67    else {
     68      mrb_raisef(mrb, E_TYPE_ERROR,
     69                 "struct size differs (%S required %S given)",
     70                 mrb_fixnum_value(RARRAY_LEN(members)), mrb_fixnum_value(RSTRUCT_LEN(s)));
     71    }
    6772  }
    6873  return members;
     
    8085}
    8186
     87static void
     88mrb_struct_modify(mrb_state *mrb, mrb_value strct)
     89{
     90  if (MRB_FROZEN_P(mrb_basic_ptr(strct))) {
     91    mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen struct");
     92  }
     93
     94  mrb_write_barrier(mrb, mrb_basic_ptr(strct));
     95}
     96
    8297/* 15.2.18.4.6  */
    8398/*
     
    99114}
    100115
    101 static mrb_value
    102 mrb_struct_getmember(mrb_state *mrb, mrb_value obj, mrb_sym id)
    103 {
    104   mrb_value members, slot, *ptr;
    105   const mrb_value *ptr_members;
    106   mrb_int i, len;
    107 
    108   ptr = RSTRUCT_PTR(obj);
    109   members = struct_members(mrb, obj);
    110   ptr_members = RARRAY_PTR(members);
    111   slot = mrb_symbol_value(id);
    112   len = RARRAY_LEN(members);
    113   for (i=0; i<len; i++) {
    114     if (mrb_obj_equal(mrb, ptr_members[i], slot)) {
    115       return ptr[i];
    116     }
    117   }
    118   mrb_raisef(mrb, E_INDEX_ERROR, "'%S' is not a struct member", mrb_sym2str(mrb, id));
    119   return mrb_nil_value();       /* not reached */
    120 }
     116static mrb_value struct_aref_sym(mrb_state *mrb, mrb_value obj, mrb_sym id);
    121117
    122118static mrb_value
    123119mrb_struct_ref(mrb_state *mrb, mrb_value obj)
    124120{
    125   return mrb_struct_getmember(mrb, obj, mrb->c->ci->mid);
    126 }
    127 
    128 static mrb_value mrb_struct_ref0(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[0];}
    129 static mrb_value mrb_struct_ref1(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[1];}
    130 static mrb_value mrb_struct_ref2(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[2];}
    131 static mrb_value mrb_struct_ref3(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[3];}
    132 static mrb_value mrb_struct_ref4(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[4];}
    133 static mrb_value mrb_struct_ref5(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[5];}
    134 static mrb_value mrb_struct_ref6(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[6];}
    135 static mrb_value mrb_struct_ref7(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[7];}
    136 static mrb_value mrb_struct_ref8(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[8];}
    137 static mrb_value mrb_struct_ref9(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[9];}
    138 
    139 #define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
    140 #define N_REF_FUNC numberof(ref_func)
    141 
    142 static const mrb_func_t ref_func[] = {
    143   mrb_struct_ref0,
    144   mrb_struct_ref1,
    145   mrb_struct_ref2,
    146   mrb_struct_ref3,
    147   mrb_struct_ref4,
    148   mrb_struct_ref5,
    149   mrb_struct_ref6,
    150   mrb_struct_ref7,
    151   mrb_struct_ref8,
    152   mrb_struct_ref9,
    153 };
     121  return struct_aref_sym(mrb, obj, mrb->c->ci->mid);
     122}
    154123
    155124static mrb_sym
     
    172141}
    173142
    174 static mrb_value
    175 mrb_struct_set(mrb_state *mrb, mrb_value obj, mrb_value val)
    176 {
     143static mrb_value mrb_struct_aset_sym(mrb_state *mrb, mrb_value s, mrb_sym id, mrb_value val);
     144
     145static mrb_value
     146mrb_struct_set_m(mrb_state *mrb, mrb_value obj)
     147{
     148  mrb_value val;
     149
    177150  const char *name;
    178   mrb_int i, len, slen;
     151  mrb_int slen;
    179152  mrb_sym mid;
    180   mrb_value members, slot, *ptr;
    181   const mrb_value *ptr_members;
     153
     154  mrb_get_args(mrb, "o", &val);
    182155
    183156  /* get base id */
     
    185158  mid = mrb_intern(mrb, name, slen-1); /* omit last "=" */
    186159
    187   members = struct_members(mrb, obj);
    188   ptr_members = RARRAY_PTR(members);
    189   len = RARRAY_LEN(members);
    190   ptr = RSTRUCT_PTR(obj);
    191   for (i=0; i<len; i++) {
    192     slot = ptr_members[i];
    193     if (mrb_symbol(slot) == mid) {
    194       return ptr[i] = val;
    195     }
    196   }
    197   mrb_raisef(mrb, E_INDEX_ERROR, "'%S' is not a struct member", mrb_sym2str(mrb, mid));
    198   return mrb_nil_value();       /* not reached */
    199 }
    200 
    201 static mrb_value
    202 mrb_struct_set_m(mrb_state *mrb, mrb_value obj)
    203 {
    204   mrb_value val;
    205 
    206   mrb_get_args(mrb, "o", &val);
    207   return mrb_struct_set(mrb, obj, val);
     160  return mrb_struct_aset_sym(mrb, obj, mid, val);
    208161}
    209162
     
    235188
    236189    if (is_local_id(mrb, name) || is_const_id(mrb, name)) {
    237       if (i < N_REF_FUNC) {
    238         mrb_define_method_id(mrb, c, id, ref_func[i], MRB_ARGS_NONE());
    239       }
    240       else {
    241         mrb_define_method_id(mrb, c, id, mrb_struct_ref, MRB_ARGS_NONE());
    242       }
     190      mrb_define_method_id(mrb, c, id, mrb_struct_ref, MRB_ARGS_NONE());
    243191      mrb_define_method_id(mrb, c, mrb_id_attrset(mrb, id), mrb_struct_set_m, MRB_ARGS_REQ(1));
    244192      mrb_gc_arena_restore(mrb, ai);
     
    266214    if (mrb_const_defined_at(mrb, mrb_obj_value(klass), id)) {
    267215      mrb_warn(mrb, "redefining constant Struct::%S", name);
    268       /* ?rb_mod_remove_const(klass, mrb_sym2name(mrb, id)); */
     216      mrb_const_remove(mrb, mrb_obj_value(klass), id);
    269217    }
    270218    c = mrb_define_class_under(mrb, klass, RSTRING_PTR(name), klass);
     
    336284  else {
    337285    if (argc > 0) name = argv[0];
    338     if (argc > 1) rest = argv[1];
    339     if (mrb_array_p(rest)) {
    340       if (!mrb_nil_p(name) && mrb_symbol_p(name)) {
    341         /* 1stArgument:symbol -> name=nil rest=argv[0]-[n] */
    342         mrb_ary_unshift(mrb, rest, name);
    343         name = mrb_nil_value();
    344       }
    345     }
    346     else {
    347       pargv = &argv[1];
    348       argcnt = argc-1;
    349       if (!mrb_nil_p(name) && mrb_symbol_p(name)) {
    350         /* 1stArgument:symbol -> name=nil rest=argv[0]-[n] */
    351         name = mrb_nil_value();
    352         pargv = &argv[0];
    353         argcnt++;
    354       }
    355       rest = mrb_ary_new_from_values(mrb, argcnt, pargv);
    356     }
     286    pargv = &argv[1];
     287    argcnt = argc-1;
     288    if (!mrb_nil_p(name) && mrb_symbol_p(name)) {
     289      /* 1stArgument:symbol -> name=nil rest=argv[0]-[n] */
     290      name = mrb_nil_value();
     291      pargv = &argv[0];
     292      argcnt++;
     293    }
     294    rest = mrb_ary_new_from_values(mrb, argcnt, pargv);
    357295    for (i=0; i<RARRAY_LEN(rest); i++) {
    358296      id = mrb_obj_to_sym(mrb, RARRAY_PTR(rest)[i]);
     
    360298    }
    361299  }
    362   st = make_struct(mrb, name, rest, struct_class(mrb));
     300  st = make_struct(mrb, name, rest, mrb_class_ptr(klass));
    363301  if (!mrb_nil_p(b)) {
    364     mrb_yield_with_class(mrb, b, 1, &st, st, mrb_class_ptr(klass));
     302    mrb_yield_with_class(mrb, b, 1, &st, st, mrb_class_ptr(st));
    365303  }
    366304
     
    419357{
    420358  mrb_value s;
    421   mrb_int i, len;
    422359
    423360  mrb_get_args(mrb, "o", &s);
     
    430367    mrb_raise(mrb, E_TYPE_ERROR, "corrupted struct");
    431368  }
    432   if (RSTRUCT_LEN(copy) != RSTRUCT_LEN(s)) {
    433     mrb_raise(mrb, E_TYPE_ERROR, "struct size mismatch");
    434   }
    435   len = RSTRUCT_LEN(copy);
    436   for (i = 0; i < len; i++) {
    437     mrb_ary_set(mrb, copy, i, RSTRUCT_PTR(s)[i]);
    438   }
     369  mrb_ary_replace(mrb, copy, s);
    439370  return copy;
    440371}
    441372
    442373static mrb_value
    443 struct_aref_sym(mrb_state *mrb, mrb_value s, mrb_sym id)
    444 {
    445   mrb_value *ptr, members;
     374struct_aref_sym(mrb_state *mrb, mrb_value obj, mrb_sym id)
     375{
     376  mrb_value members, *ptr;
    446377  const mrb_value *ptr_members;
    447378  mrb_int i, len;
    448379
    449   ptr = RSTRUCT_PTR(s);
    450   members = struct_members(mrb, s);
     380  members = struct_members(mrb, obj);
    451381  ptr_members = RARRAY_PTR(members);
    452382  len = RARRAY_LEN(members);
     383  ptr = RSTRUCT_PTR(obj);
    453384  for (i=0; i<len; i++) {
    454     if (mrb_symbol(ptr_members[i]) == id) {
     385    mrb_value slot = ptr_members[i];
     386    if (mrb_symbol_p(slot) && mrb_symbol(slot) == id) {
    455387      return ptr[i];
    456388    }
    457389  }
    458   mrb_raisef(mrb, E_INDEX_ERROR, "no member '%S' in struct", mrb_sym2str(mrb, id));
     390  mrb_raisef(mrb, E_INDEX_ERROR, "'%S' is not a struct member", mrb_sym2str(mrb, id));
    459391  return mrb_nil_value();       /* not reached */
    460392}
     
    504436
    505437    if (mrb_nil_p(sym)) {
    506       mrb_raisef(mrb, E_INDEX_ERROR, "no member '%S' in struct", idx);
     438      mrb_name_error(mrb, mrb_intern_str(mrb, idx), "no member '%S' in struct", idx);
    507439    }
    508440    idx = sym;
     
    523455  members = struct_members(mrb, s);
    524456  len = RARRAY_LEN(members);
    525   if (RSTRUCT_LEN(s) != len) {
    526     mrb_raisef(mrb, E_TYPE_ERROR,
    527                "struct size differs (%S required %S given)",
    528                mrb_fixnum_value(len), mrb_fixnum_value(RSTRUCT_LEN(s)));
    529   }
    530457  ptr = RSTRUCT_PTR(s);
    531458  ptr_members = RARRAY_PTR(members);
    532459  for (i=0; i<len; i++) {
    533460    if (mrb_symbol(ptr_members[i]) == id) {
     461      mrb_struct_modify(mrb, s);
    534462      ptr[i] = val;
    535463      return val;
    536464    }
    537465  }
    538   mrb_raisef(mrb, E_INDEX_ERROR, "no member '%S' in struct", mrb_sym2str(mrb, id));
     466  mrb_name_error(mrb, id, "no member '%S' in struct", mrb_sym2str(mrb, id));
    539467  return val;                   /* not reach */
    540468}
     
    575503
    576504    if (mrb_nil_p(sym)) {
    577       mrb_raisef(mrb, E_INDEX_ERROR, "no member '%S' in struct", idx);
     505      mrb_name_error(mrb, mrb_intern_str(mrb, idx), "no member '%S' in struct", idx);
    578506    }
    579507    idx = sym;
     
    595523               mrb_fixnum_value(i), mrb_fixnum_value(RSTRUCT_LEN(s)));
    596524  }
     525  mrb_struct_modify(mrb, s);
    597526  return RSTRUCT_PTR(s)[i] = val;
    598527}
     
    720649  mrb_int i;
    721650
    722   members = struct_s_members(mrb, mrb_class(mrb, self));
     651  members = struct_members(mrb, self);
    723652  ret = mrb_hash_new_capa(mrb, RARRAY_LEN(members));
    724653
     
    761690  struct RClass *st;
    762691  st = mrb_define_class(mrb, "Struct",  mrb->object_class);
     692  MRB_SET_INSTANCE_TT(st, MRB_TT_ARRAY);
    763693
    764694  mrb_define_class_method(mrb, st, "new",             mrb_struct_s_def,       MRB_ARGS_ANY());  /* 15.2.18.3.1  */
     
    777707  mrb_define_method(mrb, st,        "values",         mrb_struct_to_a,        MRB_ARGS_NONE());
    778708  mrb_define_method(mrb, st,        "to_h",           mrb_struct_to_h,        MRB_ARGS_NONE());
    779   mrb_define_method(mrb, st,        "values_at",      mrb_struct_values_at,   MRB_ARGS_NONE());
     709  mrb_define_method(mrb, st,        "values_at",      mrb_struct_values_at,   MRB_ARGS_ANY());
    780710}
    781711
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-struct/test/struct.rb

    r321 r331  
    33
    44assert('Struct', '15.2.18') do
    5   Struct.class == Class
     5  assert_equal Class, Struct.class
    66end
    77
    88assert('Struct.new', '15.2.18.3.1') do
    99  c = Struct.new(:m1, :m2)
    10   c.superclass == Struct and
    11     c.members == [:m1,:m2]
     10  assert_equal Struct, c.superclass
     11  assert_equal [:m1, :m2], c.members
    1212end
    1313
     
    1515assert('Struct.new', '15.2.18.3.1') do
    1616  c = Struct.new()
    17   c.superclass == Struct and c.members == []
     17  assert_equal Struct, c.superclass
     18  assert_equal [], c.members
    1819end
    1920
     
    2223  cc1 = c.new(1,2)
    2324  cc2 = c.new(1,2)
    24   cc1 == cc2
     25  assert_true cc1 == cc2
     26
     27  Struct.new(:m1, :m2) { def foo; end }
     28  assert_raise(NoMethodError) { Struct.new(:m1).new.foo }
    2529end
    2630
     
    2832  c = Struct.new(:m1, :m2)
    2933  cc = c.new(1,2)
    30   cc[:m1] == 1 and cc["m2"] == 2
     34  assert_equal 1, cc[:m1]
     35  assert_equal 2, cc["m2"]
     36  assert_equal 1, cc[0]
     37  assert_equal 2, cc[-1]
     38  assert_raise(TypeError) { cc[[]] }
     39  assert_raise(IndexError) { cc[2] }
     40  assert_raise(NameError) { cc['tama'] }
    3141end
    3242
     
    3545  cc = c.new(1,2)
    3646  cc[:m1] = 3
    37   cc[:m1] == 3
     47  assert_equal 3, cc[:m1]
    3848  cc["m2"] = 3
    3949  assert_equal 3, cc["m2"]
     50  cc[0] = 4
     51  assert_equal 4, cc[0]
     52  cc[-1] = 5
     53  assert_equal 5, cc[-1]
    4054  assert_raise(TypeError) { cc[[]] = 3 }
     55  assert_raise(IndexError) { cc[2] = 7 }
     56  assert_raise(NameError) { cc['pochi'] = 8 }
    4157end
    4258
     
    4864    a << x
    4965  }
    50   a[0] == 1 and a[1] == 2
     66  assert_equal [1, 2], a
    5167end
    5268
     
    5874    a << [k,v]
    5975  }
    60   a[0] == [:m1, 1] and a[1] == [:m2, 2]
     76  assert_equal [[:m1, 1], [:m2, 2]], a
    6177end
    6278
    6379assert('Struct#members', '15.2.18.4.6') do
    6480  c = Struct.new(:m1, :m2)
    65   cc = c.new(1,2)
    66   cc.members == [:m1,:m2]
     81  assert_equal [:m1, :m2], c.new(1,2).members
    6782end
    6883
    6984assert('Struct#select', '15.2.18.4.7') do
    7085  c = Struct.new(:m1, :m2)
    71   cc = c.new(1,2)
    72   cc.select{|v| v % 2 == 0} == [2]
     86  assert_equal([2]) { c.new(1,2).select{|v| v % 2 == 0} }
    7387end
    7488
     
    101115end
    102116
     117assert('struct dup') do
     118  c = Struct.new(:m1, :m2, :m3, :m4, :m5)
     119  cc = c.new(1,2,3,4,5)
     120  assert_nothing_raised {
     121    assert_equal(cc, cc.dup)
     122  }
     123end
     124
    103125assert('struct inspect') do
    104126  c = Struct.new(:m1, :m2, :m3, :m4, :m5)
     
    130152  assert_raise(IndexError) { a.values_at 2 }
    131153end
     154
     155assert("Struct#dig") do
     156  a = Struct.new(:blue, :purple).new('aki', Struct.new(:red).new(1))
     157  assert_equal 'aki', a.dig(:blue)
     158  assert_equal 1, a.dig(:purple, :red)
     159  assert_equal 1, a.dig(1, 0)
     160end
     161
     162assert("Struct.new removes existing constant") do
     163  skip "redefining Struct with same name cause warnings"
     164  begin
     165    assert_not_equal Struct.new("Test", :a), Struct.new("Test", :a, :b)
     166  ensure
     167    Struct.remove_const :Test
     168  end
     169end
     170
     171assert("Struct#initialize_copy requires struct to be the same type") do
     172  begin
     173    Struct.new("Test", :a)
     174    a = Struct::Test.new("a")
     175    Struct.remove_const :Test
     176    Struct.new("Test", :a, :b)
     177    assert_raise(TypeError) do
     178      a.initialize_copy(Struct::Test.new("a", "b"))
     179    end
     180  ensure
     181    Struct.remove_const :Test
     182  end
     183end
     184
     185assert("Struct.new does not allow array") do
     186  assert_raise(TypeError) do
     187    Struct.new("Test", [:a])
     188  end
     189end
     190
     191assert("Struct.new generates subclass of Struct") do
     192  begin
     193    original_struct = Struct
     194    Struct = String
     195    assert_equal original_struct, original_struct.new.superclass
     196  ensure
     197    Struct = original_struct
     198  end
     199end
     200
     201assert 'Struct#freeze' do
     202  c = Struct.new :m
     203
     204  o = c.new
     205  o.m = :test
     206  assert_equal :test, o.m
     207
     208  o.freeze
     209  assert_raise(RuntimeError) { o.m = :modify }
     210  assert_raise(RuntimeError) { o[:m] = :modify }
     211  assert_equal :test, o.m
     212end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-symbol-ext/src/symbol.c

    r321 r331  
    1 #include "mruby.h"
    2 #include "mruby/khash.h"
    3 #include "mruby/array.h"
     1#include <mruby.h>
     2#include <mruby/khash.h>
     3#include <mruby/array.h>
    44
    55typedef struct symbol_name {
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-test/driver.c

    r321 r331  
    1111#include <string.h>
    1212
    13 #include "mruby.h"
    14 #include "mruby/proc.h"
    15 #include "mruby/data.h"
    16 #include "mruby/compile.h"
    17 #include "mruby/string.h"
    18 #include "mruby/variable.h"
    19 #include "mruby/array.h"
     13#include <mruby.h>
     14#include <mruby/proc.h>
     15#include <mruby/data.h>
     16#include <mruby/compile.h>
     17#include <mruby/string.h>
     18#include <mruby/variable.h>
     19#include <mruby/array.h>
    2020
    2121void
     
    9595  mrb_define_const(mrb, mrbtest, "FIXNUM_BIT", mrb_fixnum_value(MRB_INT_BIT));
    9696
     97#ifdef MRB_USE_FLOAT
     98  mrb_define_const(mrb, mrbtest, "FLOAT_TOLERANCE", mrb_float_value(mrb, 1e-6));
     99#else
     100  mrb_define_const(mrb, mrbtest, "FLOAT_TOLERANCE", mrb_float_value(mrb, 1e-12));
     101#endif
     102
    97103  if (verbose) {
    98104    mrb_gv_set(mrb, mrb_intern_lit(mrb, "$mrbtest_verbose"), mrb_true_value());
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-test/init_mrbtest.c

    r321 r331  
    11#include <stdlib.h>
    2 #include "mruby.h"
    3 #include "mruby/irep.h"
    4 #include "mruby/variable.h"
     2#include <mruby.h>
     3#include <mruby/irep.h>
     4#include <mruby/variable.h>
    55
    66extern const uint8_t mrbtest_assert_irep[];
    7 extern const uint8_t mrbtest_irep[];
    87
    98void mrbgemtest_init(mrb_state* mrb);
     
    2524  mrb_init_test_driver(core_test, mrb_test(mrb_gv_get(mrb, mrb_intern_lit(mrb, "$mrbtest_verbose"))));
    2625  mrb_load_irep(core_test, mrbtest_assert_irep);
    27   mrb_load_irep(core_test, mrbtest_irep);
    2826  mrb_t_pass_result(mrb, core_test);
    2927
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-test/mrbgem.rake

    r321 r331  
    77  spec.add_dependency('mruby-compiler', :core => 'mruby-compiler')
    88
     9  spec.test_rbfiles = Dir.glob("#{MRUBY_ROOT}/test/t/*.rb")
     10
    911  clib = "#{build_dir}/mrbtest.c"
    1012  mlib = clib.ext(exts.object)
    11   mrbs = Dir.glob("#{MRUBY_ROOT}/test/t/*.rb")
    1213  exec = exefile("#{build.build_dir}/bin/mrbtest")
    1314
     
    2728
    2829  file assert_lib => assert_c
    29   file assert_c => [build.mrbcfile, assert_rb] do |t|
     30  file assert_c => assert_rb do |t|
    3031    open(t.name, 'w') do |f|
    3132      mrbc.run f, assert_rb, 'mrbtest_assert_irep'
     
    4142
    4243    file test_rbobj => g.test_rbireps
    43     file g.test_rbireps => [g.test_rbfiles].flatten + [File.join(g.dir, 'mrbgem.rake'), g.build.mrbcfile, "#{MRUBY_ROOT}/tasks/mrbgem_spec.rake"] do |t|
     44    file g.test_rbireps => [g.test_rbfiles].flatten do |t|
    4445      FileUtils.mkdir_p File.dirname(t.name)
    4546      open(t.name, 'w') do |f|
     
    146147
    147148  init = "#{spec.dir}/init_mrbtest.c"
     149
     150  # store the last gem selection and make the re-build
     151  # of the test gem depending on a change to the gem
     152  # selection
     153  active_gems = "#{build_dir}/active_gems.lst"
     154  FileUtils.mkdir_p File.dirname(active_gems)
     155  open(active_gems, 'w+') do |f|
     156    build.gems.each do |g|
     157      f.puts g.name
     158    end
     159  end
     160  file clib => active_gems
     161
    148162  file mlib => clib
    149   file clib => [build.mrbcfile, init] + mrbs do |t|
     163  file clib => init do |t|
    150164    _pp "GEN", "*.rb", "#{clib.relative_path}"
    151165    FileUtils.mkdir_p File.dirname(clib)
     
    161175      f.puts %Q[]
    162176      f.puts IO.read(init)
    163       mrbc.run f, mrbs, 'mrbtest_irep'
    164177      build.gems.each do |g|
    165178        f.puts %Q[void GENERATED_TMP_mrb_#{g.funcname}_gem_test(mrb_state *mrb);]
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-time/src/time.c

    r321 r331  
    66
    77#include <math.h>
     8#include <time.h>
     9#include <mruby.h>
     10#include <mruby/class.h>
     11#include <mruby/data.h>
     12
     13#ifndef DISABLE_STDIO
    814#include <stdio.h>
    9 #include <time.h>
    10 #include "mruby.h"
    11 #include "mruby/class.h"
    12 #include "mruby/data.h"
     15#else
     16#include <string.h>
     17#endif
     18
     19#define NDIV(x,y) (-(-((x)+1)/(y))-1)
     20
     21#if _MSC_VER < 1800
     22double round(double x) {
     23  if (x >= 0.0) {
     24    return (double)((int)(x + 0.5));
     25  }
     26  else {
     27    return (double)((int)(x - 0.5));
     28  }
     29}
     30#endif
    1331
    1432#if !defined(__MINGW64__) && defined(_WIN32)
     
    4260#endif
    4361#endif
     62
     63/* asctime(3) */
     64/* mruby usually use its own implementation of struct tm to string conversion */
     65/* except when DISABLE_STDIO is set. In that case, it uses asctime() or asctime_r(). */
     66/* By default mruby tries to use asctime_r() which is reentrant. */
     67/* Undef following macro on platforms that does not have asctime_r(). */
     68/* #define NO_ASCTIME_R */
    4469
    4570/* timegm(3) */
     
    154179};
    155180
     181#ifndef DISABLE_STDIO
    156182static const char mon_names[12][4] = {
    157183  "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
     
    161187  "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
    162188};
     189#endif
    163190
    164191struct mrb_time {
     
    174201seconds setting. Returns self on success, NULL of failure. */
    175202static struct mrb_time*
    176 mrb_time_update_datetime(struct mrb_time *self)
     203time_update_datetime(mrb_state *mrb, struct mrb_time *self)
    177204{
    178205  struct tm *aid;
     
    184211    aid = localtime_r(&self->sec, &self->datetime);
    185212  }
    186   if (!aid) return NULL;
     213  if (!aid) {
     214    mrb_raisef(mrb, E_ARGUMENT_ERROR, "%S out of Time range", mrb_float_value(mrb, (mrb_float)self->sec));
     215    /* not reached */
     216    return NULL;
     217  }
    187218#ifdef NO_GMTIME_R
    188219  self->datetime = *aid; /* copy data */
     
    198229}
    199230
     231void mrb_check_num_exact(mrb_state *mrb, mrb_float num);
    200232
    201233/* Allocates a mrb_time object and initializes it. */
     
    204236{
    205237  struct mrb_time *tm;
    206 
    207   tm = (struct mrb_time *)mrb_malloc(mrb, sizeof(struct mrb_time));
     238  time_t tsec = 0;
     239
     240  mrb_check_num_exact(mrb, (mrb_float)sec);
     241  mrb_check_num_exact(mrb, (mrb_float)usec);
     242
    208243  if (sizeof(time_t) == 4 && (sec > (double)INT32_MAX || (double)INT32_MIN > sec)) {
    209244    goto out_of_range;
     
    212247    goto out_of_range;
    213248  }
    214   tm->sec  = (time_t)sec;
    215   if ((sec > 0 && tm->sec < 0) || (sec < 0 && (double)tm->sec > sec)) {
     249  tsec  = (time_t)sec;
     250  if ((sec > 0 && tsec < 0) || (sec < 0 && (double)tsec > sec)) {
    216251  out_of_range:
    217252    mrb_raisef(mrb, E_ARGUMENT_ERROR, "%S out of Time range", mrb_float_value(mrb, sec));
    218253  }
     254  tm = (struct mrb_time *)mrb_malloc(mrb, sizeof(struct mrb_time));
     255  tm->sec  = tsec;
    219256  tm->usec = (time_t)llround((sec - tm->sec) * 1.0e6 + usec);
    220   while (tm->usec < 0) {
    221     tm->sec--;
    222     tm->usec += 1000000;
    223   }
    224   while (tm->usec >= 1000000) {
    225     tm->sec++;
    226     tm->usec -= 1000000;
     257  if (tm->usec < 0) {
     258    long sec2 = (long)NDIV(usec,1000000); /* negative div */
     259    tm->usec -= sec2 * 1000000;
     260    tm->sec += sec2;
     261  }
     262  else if (tm->usec >= 1000000) {
     263    long sec2 = (long)(usec / 1000000);
     264    tm->usec -= sec2 * 1000000;
     265    tm->sec += sec2;
    227266  }
    228267  tm->timezone = timezone;
    229   mrb_time_update_datetime(tm);
     268  time_update_datetime(mrb, tm);
    230269
    231270  return tm;
     
    279318#endif
    280319  tm->timezone = MRB_TIMEZONE_LOCAL;
    281   mrb_time_update_datetime(tm);
     320  time_update_datetime(mrb, tm);
    282321
    283322  return tm;
     
    317356  nowtime.tm_sec   = (int)asec;
    318357  nowtime.tm_isdst = -1;
     358
     359  if (nowtime.tm_mon  < 0 || nowtime.tm_mon  > 11
     360      || nowtime.tm_mday < 1 || nowtime.tm_mday > 31
     361      || nowtime.tm_hour < 0 || nowtime.tm_hour > 24
     362      || (nowtime.tm_hour == 24 && (nowtime.tm_min > 0 || nowtime.tm_sec > 0))
     363      || nowtime.tm_min  < 0 || nowtime.tm_min  > 59
     364      || nowtime.tm_sec  < 0 || nowtime.tm_sec  > 60)
     365    mrb_raise(mrb, E_RUNTIME_ERROR, "argument out of range");
     366
    319367  if (timezone == MRB_TIMEZONE_UTC) {
    320368    nowsecs = timegm(&nowtime);
     
    357405}
    358406
     407static struct mrb_time*
     408time_get_ptr(mrb_state *mrb, mrb_value time)
     409{
     410  struct mrb_time *tm;
     411
     412  tm = DATA_GET_PTR(mrb, time, &mrb_time_type, struct mrb_time);
     413  if (!tm) {
     414    mrb_raise(mrb, E_ARGUMENT_ERROR, "uninitialized time");
     415  }
     416  return tm;
     417}
    359418
    360419static mrb_value
     
    366425
    367426  mrb_get_args(mrb, "o", &other);
    368   tm1 = DATA_CHECK_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     427  tm1 = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
    369428  tm2 = DATA_CHECK_GET_PTR(mrb, other, &mrb_time_type, struct mrb_time);
    370429  eq_p = tm1 && tm2 && tm1->sec == tm2->sec && tm1->usec == tm2->usec;
     
    380439
    381440  mrb_get_args(mrb, "o", &other);
    382   tm1 = DATA_CHECK_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     441  tm1 = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
    383442  tm2 = DATA_CHECK_GET_PTR(mrb, other, &mrb_time_type, struct mrb_time);
    384443  if (!tm1 || !tm2) return mrb_nil_value();
     
    406465
    407466  mrb_get_args(mrb, "f", &f);
    408   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     467  tm = time_get_ptr(mrb, self);
    409468  return mrb_time_make(mrb, mrb_obj_class(mrb, self), (double)tm->sec+f, (double)tm->usec, tm->timezone);
    410469}
     
    418477
    419478  mrb_get_args(mrb, "o", &other);
    420   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
    421 
     479  tm = time_get_ptr(mrb, self);
    422480  tm2 = DATA_CHECK_GET_PTR(mrb, other, &mrb_time_type, struct mrb_time);
    423481  if (tm2) {
     
    439497  struct mrb_time *tm;
    440498
    441   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     499  tm = time_get_ptr(mrb, self);
    442500  return mrb_fixnum_value(tm->datetime.tm_wday);
    443501}
     
    450508  struct mrb_time *tm;
    451509
    452   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     510  tm = time_get_ptr(mrb, self);
    453511  return mrb_fixnum_value(tm->datetime.tm_yday + 1);
    454512}
     
    461519  struct mrb_time *tm;
    462520
    463   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     521  tm = time_get_ptr(mrb, self);
    464522  return mrb_fixnum_value(tm->datetime.tm_year + 1900);
    465523}
     
    472530  struct mrb_time *tm;
    473531
    474   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     532  tm = time_get_ptr(mrb, self);
    475533  if (tm->timezone <= MRB_TIMEZONE_NONE) return mrb_nil_value();
    476534  if (tm->timezone >= MRB_TIMEZONE_LAST) return mrb_nil_value();
     
    485543mrb_time_asctime(mrb_state *mrb, mrb_value self)
    486544{
    487   struct mrb_time *tm;
    488   struct tm *d;
     545  struct mrb_time *tm = time_get_ptr(mrb, self);
     546  struct tm *d = &tm->datetime;
     547  int len;
     548
     549#if defined(DISABLE_STDIO)
     550  char *s;
     551# ifdef NO_ASCTIME_R
     552  s = asctime(d);
     553# else
     554  char buf[32];
     555  s = asctime_r(d, buf);
     556# endif
     557  len = strlen(s)-1;            /* truncate the last newline */
     558#else
    489559  char buf[256];
    490   int len;
    491 
    492   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
    493   d = &tm->datetime;
     560
    494561  len = snprintf(buf, sizeof(buf), "%s %s %02d %02d:%02d:%02d %s%d",
    495562    wday_names[d->tm_wday], mon_names[d->tm_mon], d->tm_mday,
     
    497564    tm->timezone == MRB_TIMEZONE_UTC ? "UTC " : "",
    498565    d->tm_year + 1900);
     566#endif
    499567  return mrb_str_new(mrb, buf, len);
    500568}
     
    507575  struct mrb_time *tm;
    508576
    509   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
    510   if (!tm) return mrb_nil_value();
     577  tm = time_get_ptr(mrb, self);
    511578  return mrb_fixnum_value(tm->datetime.tm_mday);
    512579}
     
    520587  struct mrb_time *tm;
    521588
    522   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     589  tm = time_get_ptr(mrb, self);
    523590  return mrb_bool_value(tm->datetime.tm_isdst);
    524591}
     
    532599  struct mrb_time *tm, *tm2;
    533600
    534   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     601  tm = time_get_ptr(mrb, self);
    535602  tm2 = (struct mrb_time *)mrb_malloc(mrb, sizeof(*tm));
    536603  *tm2 = *tm;
    537604  tm2->timezone = MRB_TIMEZONE_UTC;
    538   mrb_time_update_datetime(tm2);
     605  time_update_datetime(mrb, tm2);
    539606  return mrb_time_wrap(mrb, mrb_obj_class(mrb, self), tm2);
    540607}
     
    547614  struct mrb_time *tm, *tm2;
    548615
    549   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     616  tm = time_get_ptr(mrb, self);
    550617  tm2 = (struct mrb_time *)mrb_malloc(mrb, sizeof(*tm));
    551618  *tm2 = *tm;
    552619  tm2->timezone = MRB_TIMEZONE_LOCAL;
    553   mrb_time_update_datetime(tm2);
     620  time_update_datetime(mrb, tm2);
    554621  return mrb_time_wrap(mrb, mrb_obj_class(mrb, self), tm2);
    555622}
     
    562629  struct mrb_time *tm;
    563630
    564   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     631  tm = time_get_ptr(mrb, self);
    565632  return mrb_fixnum_value(tm->datetime.tm_hour);
    566633}
     
    576643  struct mrb_time *tm;
    577644
     645  n = mrb_get_args(mrb, "|iiiiiii",
     646       &ayear, &amonth, &aday, &ahour, &amin, &asec, &ausec);
    578647  tm = (struct mrb_time*)DATA_PTR(self);
    579648  if (tm) {
     
    582651  mrb_data_init(self, NULL, &mrb_time_type);
    583652
    584   n = mrb_get_args(mrb, "|iiiiiii",
    585        &ayear, &amonth, &aday, &ahour, &amin, &asec, &ausec);
    586653  if (n == 0) {
    587654    tm = current_mrb_time(mrb);
     
    600667{
    601668  mrb_value src;
     669  struct mrb_time *t1, *t2;
    602670
    603671  mrb_get_args(mrb, "o", &src);
     
    606674    mrb_raise(mrb, E_TYPE_ERROR, "wrong argument class");
    607675  }
    608   if (!DATA_PTR(copy)) {
    609     mrb_data_init(copy, mrb_malloc(mrb, sizeof(struct mrb_time)), &mrb_time_type);
    610   }
    611   *(struct mrb_time *)DATA_PTR(copy) = *(struct mrb_time *)DATA_PTR(src);
     676  t1 = (struct mrb_time *)DATA_PTR(copy);
     677  t2 = (struct mrb_time *)DATA_PTR(src);
     678  if (!t2) {
     679    mrb_raise(mrb, E_ARGUMENT_ERROR, "uninitialized time");
     680  }
     681  if (!t1) {
     682    t1 = (struct mrb_time *)mrb_malloc(mrb, sizeof(struct mrb_time));
     683    mrb_data_init(copy, t1, &mrb_time_type);
     684  }
     685  *t1 = *t2;
    612686  return copy;
    613687}
     
    620694  struct mrb_time *tm;
    621695
    622   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     696  tm = time_get_ptr(mrb, self);
    623697  tm->timezone = MRB_TIMEZONE_LOCAL;
    624   mrb_time_update_datetime(tm);
     698  time_update_datetime(mrb, tm);
    625699  return self;
    626700}
     
    633707  struct mrb_time *tm;
    634708
    635   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     709  tm = time_get_ptr(mrb, self);
    636710  return mrb_fixnum_value(tm->datetime.tm_mday);
    637711}
     
    644718  struct mrb_time *tm;
    645719
    646   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     720  tm = time_get_ptr(mrb, self);
    647721  return mrb_fixnum_value(tm->datetime.tm_min);
    648722}
     
    655729  struct mrb_time *tm;
    656730
    657   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     731  tm = time_get_ptr(mrb, self);
    658732  return mrb_fixnum_value(tm->datetime.tm_mon + 1);
    659733}
     
    666740  struct mrb_time *tm;
    667741
    668   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     742  tm = time_get_ptr(mrb, self);
    669743  return mrb_fixnum_value(tm->datetime.tm_sec);
    670744}
     
    678752  struct mrb_time *tm;
    679753
    680   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     754  tm = time_get_ptr(mrb, self);
    681755  return mrb_float_value(mrb, (mrb_float)tm->sec + (mrb_float)tm->usec/1.0e6);
    682756}
     
    689763  struct mrb_time *tm;
    690764
    691   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     765  tm = time_get_ptr(mrb, self);
    692766  if (tm->sec > MRB_INT_MAX || tm->sec < MRB_INT_MIN) {
    693767    return mrb_float_value(mrb, (mrb_float)tm->sec);
     
    703777  struct mrb_time *tm;
    704778
    705   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     779  tm = time_get_ptr(mrb, self);
    706780  if (tm->usec > MRB_INT_MAX || tm->usec < MRB_INT_MIN) {
    707781    return mrb_float_value(mrb, (mrb_float)tm->usec);
     
    717791  struct mrb_time *tm;
    718792
    719   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     793  tm = time_get_ptr(mrb, self);
    720794  tm->timezone = MRB_TIMEZONE_UTC;
    721   mrb_time_update_datetime(tm);
     795  time_update_datetime(mrb, tm);
    722796  return self;
    723797}
     
    730804  struct mrb_time *tm;
    731805
    732   tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
     806  tm = time_get_ptr(mrb, self);
    733807  return mrb_bool_value(tm->timezone == MRB_TIMEZONE_UTC);
    734808}
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-time/test/time.rb

    r321 r331  
    1111
    1212assert('Time.at', '15.2.19.6.1') do
    13   Time.at(1300000000.0)
     13  assert_kind_of(Time, Time.at(1300000000.0))
     14
     15  assert_raise(FloatDomainError) { Time.at(Float::NAN) }
     16  assert_raise(FloatDomainError) { Time.at(Float::INFINITY) }
     17  assert_raise(FloatDomainError) { Time.at(-Float::INFINITY) }
     18  assert_raise(FloatDomainError) { Time.at(0, Float::NAN) }
     19  assert_raise(FloatDomainError) { Time.at(0, Float::INFINITY) }
     20  assert_raise(FloatDomainError) { Time.at(0, -Float::INFINITY) }
    1421end
    1522
     
    3845  t2 = t1.+(60)
    3946
    40   t2.utc.asctime == "Sun Mar 13 07:07:40 UTC 2011"
     47  assert_equal(t2.utc.asctime, "Sun Mar 13 07:07:40 UTC 2011")
     48
     49  assert_raise(FloatDomainError) { Time.at(0) + Float::NAN }
     50  assert_raise(FloatDomainError) { Time.at(0) + Float::INFINITY }
     51  assert_raise(FloatDomainError) { Time.at(0) + -Float::INFINITY }
    4152end
    4253
     
    4556  t2 = t1.-(60)
    4657
    47   t2.utc.asctime == "Sun Mar 13 07:05:40 UTC 2011"
     58  assert_equal(t2.utc.asctime, "Sun Mar 13 07:05:40 UTC 2011")
     59
     60  assert_raise(FloatDomainError) { Time.at(0) - Float::NAN }
     61  assert_raise(FloatDomainError) { Time.at(0) - Float::INFINITY }
     62  assert_raise(FloatDomainError) { Time.at(0) - -Float::INFINITY }
    4863end
    4964
  • EcnlProtoTool/trunk/mruby-1.3.0/mrblib/array.rb

    r321 r331  
    1313    return to_enum :each unless block_given?
    1414
    15     idx, length = -1, self.length-1
    16     while idx < length and length <= self.length and length = self.length-1
    17       elm = self[idx += 1]
    18       unless elm
    19         if elm.nil? and length >= self.length
    20           break
    21         end
    22       end
    23       block.call(elm)
     15    idx = 0
     16    while idx < length
     17      block.call(self[idx])
     18      idx += 1
    2419    end
    2520    self
  • EcnlProtoTool/trunk/mruby-1.3.0/mrblib/enum.rb

    r321 r331  
    384384    i = 0
    385385    self.each do |e|
    386       n = e.hash << (i % 16)
     386      n = (e.hash & (0x7fffffff >> (i % 16))) << (i % 16)
    387387      h ^= n
    388388      i += 1
  • EcnlProtoTool/trunk/mruby-1.3.0/mrblib/hash.rb

    r321 r331  
    155155  # ISO 15.2.13.4.23
    156156  def replace(hash)
     157    raise TypeError, "can't convert argument into Hash" unless hash.respond_to?(:to_hash)
    157158    self.clear
    158159    hash = hash.to_hash
     
    201202  end
    202203  ##
    203   # Return the contents of this hash as a string. 
     204  # Return the contents of this hash as a string.
    204205 #
    205206  # ISO 15.2.13.4.30 (x)
  • EcnlProtoTool/trunk/mruby-1.3.0/mrblib/init_mrblib.c

    r321 r331  
    1 #include "mruby.h"
    2 #include "mruby/irep.h"
     1#include <mruby.h>
     2#include <mruby/irep.h>
    33
    44extern const uint8_t mrblib_irep[];
  • EcnlProtoTool/trunk/mruby-1.3.0/mrblib/numeric.rb

    r321 r331  
    101101  # incremented by +step+ (default 1).
    102102  #
    103   def step(num, step = 1, &block)
     103  def step(num=nil, step=1, &block)
    104104    raise ArgumentError, "step can't be 0" if step == 0
    105105    return to_enum(:step, num, step) unless block_given?
    106106
    107107    i = if num.kind_of? Float then self.to_f else self end
     108    if num == nil
     109      while true
     110        block.call(i)
     111        i+=step
     112      end
     113      return self
     114    end
    108115    if step > 0
    109116      while i <= num
     
    161168# ISO 15.2.9
    162169class Float
    163   include Integral
    164170  # mruby special - since mruby integers may be upgraded to floats,
    165171  # floats should be compatible to integers.
    166   def >> other
    167     n = self.to_i
    168     other = other.to_i
    169     if other < 0
    170       n << -other
    171     else
    172       other.times { n /= 2 }
    173       if n.abs < 1
    174         if n >= 0
    175           0
    176         else
    177           -1
    178         end
    179       else
    180         n.to_i
    181       end
    182     end
    183   end
    184   def << other
    185     n = self.to_i
    186     other = other.to_i
    187     if other < 0
    188       n >> -other
    189     else
    190       other.times { n *= 2 }
    191       n
    192     end
    193   end
     172  include Integral
    194173end
  • EcnlProtoTool/trunk/mruby-1.3.0/mrblib/range.rb

    r321 r331  
    2727    end
    2828
     29    if val.kind_of?(String) && last.kind_of?(String) # fixnums are special
     30      if val.respond_to? :upto
     31        return val.upto(last, exclude_end?, &block)
     32      else
     33        str_each = true
     34      end
     35    end
     36
    2937    raise TypeError, "can't iterate" unless val.respond_to? :succ
    3038
     
    3442      block.call(val)
    3543      val = val.succ
     44      if str_each
     45        break if val.size > last.size
     46      end
    3647    end
    3748
  • EcnlProtoTool/trunk/mruby-1.3.0/mrblib/string.rb

    r321 r331  
    1010  #
    1111  # ISO 15.2.10.5.15
    12   def each_line(&block)
     12  def each_line(rs = "\n", &block)
     13    return to_enum(:each_line, rs, &block) unless block
     14    return block.call(self) if rs.nil?
     15    rs = rs.to_str
    1316    offset = 0
    14     while pos = self.index("\n", offset)
    15       block.call(self[offset, pos + 1 - offset])
    16       offset = pos + 1
    17     end
    18     block.call(self[offset, self.size - offset]) if self.size > offset
     17    rs_len = rs.length
     18    this = dup
     19    while pos = this.index(rs, offset)
     20      block.call(this[offset, pos + rs_len - offset])
     21      offset = pos + rs_len
     22    end
     23    block.call(this[offset, this.size - offset]) if this.size > offset
    1924    self
    2025  end
     
    3540          when "'"
    3641            post
     42          when "1", "2", "3", "4", "5", "6", "7", "8", "9"
     43            ""
    3744          else
    3845            self[j, 2]
     
    5259  # ISO 15.2.10.5.18
    5360  def gsub(*args, &block)
    54     if args.size == 2
    55       s = ""
    56       i = 0
    57       while j = index(args[0], i)
    58         seplen = args[0].length
    59         k = j + seplen
    60         pre = self[0, j]
    61         post = self[k, length-k]
    62         s += self[i, j-i] + args[1].__sub_replace(pre, args[0], post)
    63         i = k
    64       end
    65       s + self[i, length-i]
    66     elsif args.size == 1 && block
    67       split(args[0], -1).join(block.call(args[0]))
    68     else
    69       raise ArgumentError, "wrong number of arguments"
    70     end
     61    return to_enum(:gsub, *args) if args.length == 1 && !block
     62    raise ArgumentError, "wrong number of arguments" unless (1..2).include?(args.length)
     63
     64    pattern, replace = *args
     65    plen = pattern.length
     66    if args.length == 2 && block
     67      block = nil
     68    end
     69    if !replace.nil? || !block
     70      replace = replace.to_str
     71    end
     72    offset = 0
     73    result = []
     74    while found = index(pattern, offset)
     75      result << self[offset, found - offset]
     76      offset = found + plen
     77      result << if block
     78        block.call(pattern).to_s
     79      else
     80        replace.__sub_replace(self[0, found], pattern, self[offset..-1] || "")
     81      end
     82      if plen == 0
     83        result << self[offset, 1]
     84        offset += 1
     85      end
     86    end
     87    result << self[offset..-1] if offset < length
     88    result.join
    7189  end
    7290
     
    7997  # ISO 15.2.10.5.19
    8098  def gsub!(*args, &block)
     99    raise RuntimeError, "can't modify frozen String" if frozen?
     100    return to_enum(:gsub!, *args) if args.length == 1 && !block
    81101    str = self.gsub(*args, &block)
    82102    return nil if str == self
     
    105125  # ISO 15.2.10.5.36
    106126  def sub(*args, &block)
    107     if args.size == 2
    108       pre, post = split(args[0], 2)
    109       return self unless post # The sub target wasn't found in the string
    110       pre + args[1].__sub_replace(pre, args[0], post) + post
    111     elsif args.size == 1 && block
    112       split(args[0], 2).join(block.call(args[0]))
     127    unless (1..2).include?(args.length)
     128      raise ArgumentError, "wrong number of arguments (given #{args.length}, expected 2)"
     129    end
     130
     131    pattern, replace = *args
     132    pattern = pattern.to_str
     133    if args.length == 2 && block
     134      block = nil
     135    end
     136    if !block
     137      replace = replace.to_str
     138    end
     139    result = []
     140    this = dup
     141    found = index(pattern)
     142    return this unless found
     143    result << this[0, found]
     144    offset = found + pattern.length
     145    result << if block
     146      block.call(pattern).to_s
    113147    else
    114       raise ArgumentError, "wrong number of arguments"
    115     end
     148      replace.__sub_replace(this[0, found], pattern, this[offset..-1] || "")
     149    end
     150    result << this[offset..-1] if offset < length
     151    result.join
    116152  end
    117153
     
    124160  # ISO 15.2.10.5.37
    125161  def sub!(*args, &block)
     162    raise RuntimeError, "can't modify frozen String" if frozen?
    126163    str = self.sub(*args, &block)
    127164    return nil if str == self
     
    160197    if anum == 2
    161198      pos, value = args
    162       if pos.kind_of? String
     199      case pos
     200      when String
    163201        posnum = self.index(pos)
    164202        if posnum
     
    166204          a = self[(posnum + pos.length)..-1]
    167205          self.replace([b, value, a].join(''))
    168           return value
    169206        else
    170207          raise IndexError, "string not matched"
    171208        end
     209      when Range
     210        head = pos.begin
     211        tail = pos.end
     212        tail += self.length if tail < 0
     213        unless pos.exclude_end?
     214          tail += 1
     215        end
     216        return self[head, tail-head]=value
    172217      else
    173218        pos += self.length if pos < 0
     
    178223        a = self[pos + 1..-1]
    179224        self.replace([b, value, a].join(''))
    180         return value
    181       end
     225      end
     226      return value
    182227    elsif anum == 3
    183228      pos, len, value = args
  • EcnlProtoTool/trunk/mruby-1.3.0/src/array.c

    r321 r331  
    55*/
    66
    7 #include "mruby.h"
    8 #include "mruby/array.h"
    9 #include "mruby/class.h"
    10 #include "mruby/string.h"
    11 #include "mruby/range.h"
     7#include <mruby.h>
     8#include <mruby/array.h>
     9#include <mruby/class.h>
     10#include <mruby/string.h>
     11#include <mruby/range.h>
    1212#include "value_array.h"
    1313
     
    1717#define ARY_MAX_SIZE ((ARY_C_MAX_SIZE < (size_t)MRB_INT_MAX) ? (mrb_int)ARY_C_MAX_SIZE : MRB_INT_MAX-1)
    1818
    19 static inline mrb_value
    20 ary_elt(mrb_value ary, mrb_int offset)
    21 {
    22   if (offset < 0 || RARRAY_LEN(ary) <= offset) {
    23     return mrb_nil_value();
    24   }
    25   return RARRAY_PTR(ary)[offset];
    26 }
    27 
    2819static struct RArray*
    2920ary_new_capa(mrb_state *mrb, mrb_int capa)
    3021{
    3122  struct RArray *a;
    32   mrb_int blen;
     23  size_t blen;
    3324
    3425  if (capa > ARY_MAX_SIZE) {
     
    3627  }
    3728  blen = capa * sizeof(mrb_value);
    38   if (blen < capa) {
    39     mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big");
    40   }
    4129
    4230  a = (struct RArray*)mrb_obj_alloc(mrb, MRB_TT_ARRAY, mrb->array_class);
     
    121109ary_modify(mrb_state *mrb, struct RArray *a)
    122110{
     111  if (MRB_FROZEN_P(a)) {
     112    mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen array");
     113  }
     114
    123115  if (ARY_SHARED_P(a)) {
    124116    mrb_shared_array *shared = a->aux.shared;
     
    179171
    180172  if (len > ARY_MAX_SIZE) {
     173  size_error:
    181174    mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big");
    182175  }
     
    186179  }
    187180  while (capa < len) {
    188     capa *= 2;
    189   }
    190 
    191   if (capa > ARY_MAX_SIZE) capa = ARY_MAX_SIZE; /* len <= capa <= ARY_MAX_SIZE */
     181    if (capa <= ARY_MAX_SIZE / 2) {
     182      capa *= 2;
     183    }
     184    else {
     185      capa = len;
     186    }
     187  }
     188  if (capa < len || capa > ARY_MAX_SIZE) {
     189    goto size_error;
     190  }
    192191
    193192  if (capa > a->aux.capa) {
     
    244243
    245244static mrb_value
    246 mrb_ary_s_create(mrb_state *mrb, mrb_value self)
    247 {
     245mrb_ary_s_create(mrb_state *mrb, mrb_value klass)
     246{
     247  mrb_value ary;
    248248  mrb_value *vals;
    249249  mrb_int len;
     250  struct RArray *a;
    250251
    251252  mrb_get_args(mrb, "*", &vals, &len);
    252 
    253   return mrb_ary_new_from_values(mrb, len, vals);
     253  ary = mrb_ary_new_from_values(mrb, len, vals);
     254  a = mrb_ary_ptr(ary);
     255  a->c = mrb_class_ptr(klass);
     256
     257  return ary;
    254258}
    255259
    256260static void
    257 ary_concat(mrb_state *mrb, struct RArray *a, mrb_value *ptr, mrb_int blen)
    258 {
    259   mrb_int len = a->len + blen;
     261ary_concat(mrb_state *mrb, struct RArray *a, struct RArray *a2)
     262{
     263  mrb_int len;
     264
     265  if (a2->len > ARY_MAX_SIZE - a->len) {
     266    mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big");
     267  }
     268  len = a->len + a2->len;
    260269
    261270  ary_modify(mrb, a);
    262   if (a->aux.capa < len) ary_expand_capa(mrb, a, len);
    263   array_copy(a->ptr+a->len, ptr, blen);
     271  if (a->aux.capa < len) {
     272    ary_expand_capa(mrb, a, len);
     273  }
     274  array_copy(a->ptr+a->len, a2->ptr, a2->len);
    264275  mrb_write_barrier(mrb, (struct RBasic*)a);
    265276  a->len = len;
     
    271282  struct RArray *a2 = mrb_ary_ptr(other);
    272283
    273   ary_concat(mrb, mrb_ary_ptr(self), a2->ptr, a2->len);
     284  ary_concat(mrb, mrb_ary_ptr(self), a2);
    274285}
    275286
     
    277288mrb_ary_concat_m(mrb_state *mrb, mrb_value self)
    278289{
    279   mrb_value *ptr;
    280   mrb_int blen;
    281 
    282   mrb_get_args(mrb, "a", &ptr, &blen);
    283   ary_concat(mrb, mrb_ary_ptr(self), ptr, blen);
     290  mrb_value ary;
     291
     292  mrb_get_args(mrb, "A", &ary);
     293  mrb_ary_concat(mrb, self, ary);
    284294  return self;
    285295}
     
    319329mrb_ary_replace(mrb_state *mrb, mrb_value self, mrb_value other)
    320330{
     331  struct RArray *a1 = mrb_ary_ptr(self);
    321332  struct RArray *a2 = mrb_ary_ptr(other);
    322333
    323   ary_replace(mrb, mrb_ary_ptr(self), a2->ptr, a2->len);
     334  if (a1 != a2) {
     335    ary_replace(mrb, a1, a2->ptr, a2->len);
     336  }
    324337}
    325338
     
    433446  struct RArray *a = mrb_ary_ptr(ary);
    434447
     448  ary_modify(mrb, a);
    435449  if (a->len == 0) return mrb_nil_value();
    436450  return a->ptr[--a->len];
     
    445459  mrb_value val;
    446460
     461  ary_modify(mrb, a);
    447462  if (a->len == 0) return mrb_nil_value();
    448463  if (ARY_SHARED_P(a)) {
     
    507522
    508523  mrb_get_args(mrb, "*", &vals, &len);
     524  if (len > ARY_MAX_SIZE - a->len) {
     525    mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big");
     526  }
    509527  if (ARY_SHARED_P(a)
    510528      && a->aux.shared->refcnt == 1 /* shared only referenced from this array */
     
    564582}
    565583
     584static struct RArray*
     585ary_dup(mrb_state *mrb, struct RArray *a)
     586{
     587  struct RArray *d = ary_new_capa(mrb, a->len);
     588
     589  ary_replace(mrb, d, a->ptr, a->len);
     590  return d;
     591}
     592
    566593MRB_API mrb_value
    567594mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_value rpl)
    568595{
    569596  struct RArray *a = mrb_ary_ptr(ary);
    570   mrb_int tail, size;
    571597  const mrb_value *argv;
    572   mrb_int i, argc;
     598  mrb_int argc;
     599  mrb_int tail;
    573600
    574601  ary_modify(mrb, a);
     
    584611    }
    585612  }
    586   if (a->len < len || a->len < head + len) {
     613  tail = head + len;
     614  if (a->len < len || a->len < tail) {
    587615    len = a->len - head;
    588616  }
    589   tail = head + len;
    590617
    591618  /* size check */
     
    593620    argc = RARRAY_LEN(rpl);
    594621    argv = RARRAY_PTR(rpl);
     622    if (argv == a->ptr) {
     623      struct RArray *r;
     624
     625      if (argc > 32767) {
     626        mrb_raise(mrb, E_ARGUMENT_ERROR, "too big recursive splice");
     627      }
     628      r = ary_dup(mrb, a);
     629      argv = r->ptr;
     630    }
    595631  }
    596632  else {
     
    598634    argv = &rpl;
    599635  }
    600   size = head + argc;
    601 
    602   if (tail < a->len) size += a->len - tail;
    603   if (size > a->aux.capa)
    604     ary_expand_capa(mrb, a, size);
    605 
    606   if (head > a->len) {
     636  if (head >= a->len) {
     637    if (head > ARY_MAX_SIZE - argc) {
     638      mrb_raisef(mrb, E_INDEX_ERROR, "index %S too big", mrb_fixnum_value(head));
     639    }
     640    len = head + argc;
     641    if (len > a->aux.capa) {
     642      ary_expand_capa(mrb, a, head + argc);
     643    }
    607644    ary_fill_with_nil(a->ptr + a->len, head - a->len);
    608   }
    609   else if (head < a->len) {
    610     value_move(a->ptr + head + argc, a->ptr + tail, a->len - tail);
    611   }
    612 
    613   for (i = 0; i < argc; i++) {
    614     *(a->ptr + head + i) = *(argv + i);
    615     mrb_field_write_barrier_value(mrb, (struct RBasic*)a, argv[i]);
    616   }
    617 
    618   a->len = size;
    619 
     645    if (argc > 0) {
     646      array_copy(a->ptr + head, argv, argc);
     647    }
     648    a->len = len;
     649  }
     650  else {
     651    mrb_int alen;
     652
     653    if (a->len - len > ARY_MAX_SIZE - argc) {
     654      mrb_raisef(mrb, E_INDEX_ERROR, "index %S too big", mrb_fixnum_value(a->len + argc - len));
     655    }
     656    alen = a->len + argc - len;
     657    if (alen > a->aux.capa) {
     658      ary_expand_capa(mrb, a, alen);
     659    }
     660
     661    if (len != argc) {
     662      tail = head + len;
     663      value_move(a->ptr + head + argc, a->ptr + tail, a->len - tail);
     664      a->len = alen;
     665    }
     666    if (argc > 0) {
     667      value_move(a->ptr + head, argv, argc);
     668    }
     669  }
     670  mrb_write_barrier(mrb, (struct RBasic*)a);
    620671  return ary;
    621672}
     
    703754      /* a[n..m] */
    704755    case MRB_TT_RANGE:
    705       if (mrb_range_beg_len(mrb, index, &i, &len, a->len)) {
     756      if (mrb_range_beg_len(mrb, index, &i, &len, a->len, TRUE) == 1) {
    706757        return ary_subseq(mrb, a, i, len);
    707758      }
     
    767818  mrb_int i, len;
    768819
     820  mrb_ary_modify(mrb, mrb_ary_ptr(self));
    769821  if (mrb_get_args(mrb, "oo|o", &v1, &v2, &v3) == 2) {
    770     switch (mrb_type(v1)) {
    771822    /* a[n..m] = v */
    772     case MRB_TT_RANGE:
    773       if (mrb_range_beg_len(mrb, v1, &i, &len, RARRAY_LEN(self))) {
    774         mrb_ary_splice(mrb, self, i, len, v2);
    775       }
     823    switch (mrb_range_beg_len(mrb, v1, &i, &len, RARRAY_LEN(self), FALSE)) {
     824    case 0:                   /* not range */
     825      mrb_ary_set(mrb, self, aget_index(mrb, v1), v2);
    776826      break;
    777     /* a[n] = v */
    778     case MRB_TT_FIXNUM:
    779       mrb_ary_set(mrb, self, mrb_fixnum(v1), v2);
     827    case 1:                   /* range */
     828      mrb_ary_splice(mrb, self, i, len, v2);
    780829      break;
    781     default:
    782       mrb_ary_set(mrb, self, aget_index(mrb, v1), v2);
     830    case 2:                   /* out of range */
     831      mrb_raisef(mrb, E_RANGE_ERROR, "%S out of range", v1);
    783832      break;
    784833    }
     
    878927{
    879928  mrb_value obj;
    880   mrb_int i;
     929  mrb_int i, len;
    881930
    882931  mrb_get_args(mrb, "o", &obj);
     
    885934      return mrb_fixnum_value(i);
    886935    }
     936    if (i > (len = RARRAY_LEN(self))) {
     937      i = len;
     938    }
    887939  }
    888940  return mrb_nil_value();
     
    892944mrb_ary_splat(mrb_state *mrb, mrb_value v)
    893945{
     946  mrb_value a, recv_class;
     947
    894948  if (mrb_array_p(v)) {
    895949    return v;
    896950  }
    897   if (mrb_respond_to(mrb, v, mrb_intern_lit(mrb, "to_a"))) {
    898     return mrb_funcall(mrb, v, "to_a", 0);
     951
     952  if (!mrb_respond_to(mrb, v, mrb_intern_lit(mrb, "to_a"))) {
     953    return mrb_ary_new_from_values(mrb, 1, &v);
     954  }
     955
     956  a = mrb_funcall(mrb, v, "to_a", 0);
     957  if (mrb_array_p(a)) {
     958    return a;
     959  }
     960  else if (mrb_nil_p(a)) {
     961    return mrb_ary_new_from_values(mrb, 1, &v);
    899962  }
    900963  else {
    901     return mrb_ary_new_from_values(mrb, 1, &v);
     964    recv_class = mrb_obj_value(mrb_obj_class(mrb, v));
     965    mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S to Array (%S#to_a gives %S)",
     966      recv_class,
     967      recv_class,
     968      mrb_obj_value(mrb_obj_class(mrb, a))
     969    );
     970    /* not reached */
     971    return mrb_undef_value();
    902972  }
    903973}
     
    916986  struct RArray *a = mrb_ary_ptr(self);
    917987
     988  ary_modify(mrb, a);
    918989  if (ARY_SHARED_P(a)) {
    919990    mrb_ary_decref(mrb, a->aux.shared);
     
    9881059
    9891060    default:
    990       tmp = mrb_check_string_type(mrb, val);
    991       if (!mrb_nil_p(tmp)) {
    992         val = tmp;
    993         goto str_join;
    994       }
    995       tmp = mrb_check_convert_type(mrb, val, MRB_TT_ARRAY, "Array", "to_ary");
    996       if (!mrb_nil_p(tmp)) {
    997         val = tmp;
    998         goto ary_join;
     1061      if (!mrb_immediate_p(val)) {
     1062        tmp = mrb_check_string_type(mrb, val);
     1063        if (!mrb_nil_p(tmp)) {
     1064          val = tmp;
     1065          goto str_join;
     1066        }
     1067        tmp = mrb_check_convert_type(mrb, val, MRB_TT_ARRAY, "Array", "to_ary");
     1068        if (!mrb_nil_p(tmp)) {
     1069          val = tmp;
     1070          goto ary_join;
     1071        }
    9991072      }
    10001073      val = mrb_obj_as_string(mrb, val);
     
    10111084mrb_ary_join(mrb_state *mrb, mrb_value ary, mrb_value sep)
    10121085{
    1013   sep = mrb_obj_as_string(mrb, sep);
     1086  if (!mrb_nil_p(sep)) {
     1087    sep = mrb_obj_as_string(mrb, sep);
     1088  }
    10141089  return join_ary(mrb, ary, sep, mrb_ary_new(mrb));
    10151090}
     
    10911166  mrb_define_method(mrb, a, "pop",             mrb_ary_pop,          MRB_ARGS_NONE()); /* 15.2.12.5.21 */
    10921167  mrb_define_method(mrb, a, "push",            mrb_ary_push_m,       MRB_ARGS_ANY());  /* 15.2.12.5.22 */
     1168  mrb_define_method(mrb, a, "append",          mrb_ary_push_m,       MRB_ARGS_ANY());
    10931169  mrb_define_method(mrb, a, "replace",         mrb_ary_replace_m,    MRB_ARGS_REQ(1)); /* 15.2.12.5.23 */
    10941170  mrb_define_method(mrb, a, "reverse",         mrb_ary_reverse,      MRB_ARGS_NONE()); /* 15.2.12.5.24 */
     
    10991175  mrb_define_method(mrb, a, "slice",           mrb_ary_aget,         MRB_ARGS_ANY());  /* 15.2.12.5.29 */
    11001176  mrb_define_method(mrb, a, "unshift",         mrb_ary_unshift_m,    MRB_ARGS_ANY());  /* 15.2.12.5.30 */
     1177  mrb_define_method(mrb, a, "prepend",         mrb_ary_unshift_m,    MRB_ARGS_ANY());
    11011178
    11021179  mrb_define_method(mrb, a, "__ary_eq",        mrb_ary_eq,           MRB_ARGS_REQ(1));
  • EcnlProtoTool/trunk/mruby-1.3.0/src/backtrace.c

    r321 r331  
    55*/
    66
    7 #include "mruby.h"
    8 #include "mruby/variable.h"
    9 #include "mruby/proc.h"
    10 #include "mruby/array.h"
    11 #include "mruby/string.h"
    12 #include "mruby/class.h"
    13 #include "mruby/debug.h"
    14 #include "mruby/error.h"
    15 #include "mruby/numeric.h"
     7#include <mruby.h>
     8#include <mruby/variable.h>
     9#include <mruby/proc.h>
     10#include <mruby/array.h>
     11#include <mruby/string.h>
     12#include <mruby/class.h>
     13#include <mruby/debug.h>
     14#include <mruby/error.h>
     15#include <mruby/numeric.h>
     16#include <mruby/data.h>
    1617
    1718struct backtrace_location {
    18   int i;
    1919  int lineno;
    2020  const char *filename;
    21   const char *method;
    22   const char *sep;
    23   const char *class_name;
     21  mrb_sym method_id;
    2422};
    2523
    26 typedef void (*output_stream_func)(mrb_state*, struct backtrace_location*, void*);
    27 
    28 #ifndef MRB_DISABLE_STDIO
    29 
    30 struct print_backtrace_args {
    31   FILE *stream;
    32   int tracehead;
    33 };
    34 
    35 static void
    36 print_backtrace_i(mrb_state *mrb, struct backtrace_location *loc, void *data)
    37 {
    38   struct print_backtrace_args *args;
    39 
    40   args = (struct print_backtrace_args*)data;
    41 
    42   if (args->tracehead) {
    43     fprintf(args->stream, "trace:\n");
    44     args->tracehead = FALSE;
    45   }
    46 
    47   fprintf(args->stream, "\t[%d] %s:%d", loc->i, loc->filename, loc->lineno);
    48 
    49   if (loc->method) {
    50     if (loc->class_name) {
    51       fprintf(args->stream, ":in %s%s%s", loc->class_name, loc->sep, loc->method);
    52     }
    53     else {
    54       fprintf(args->stream, ":in %s", loc->method);
    55     }
    56   }
    57 
    58   fprintf(args->stream, "\n");
    59 }
    60 
    61 #endif
    62 
    63 static void
    64 get_backtrace_i(mrb_state *mrb, struct backtrace_location *loc, void *data)
    65 {
    66   mrb_value ary, str;
    67   int ai;
    68 
    69   ai = mrb_gc_arena_save(mrb);
    70   ary = mrb_obj_value((struct RArray*)data);
    71 
    72   str = mrb_str_new_cstr(mrb, loc->filename);
    73   mrb_str_cat_lit(mrb, str, ":");
    74   mrb_str_concat(mrb, str, mrb_fixnum_to_str(mrb, mrb_fixnum_value(loc->lineno), 10));
    75 
    76   if (loc->method) {
    77     mrb_str_cat_lit(mrb, str, ":in ");
    78 
    79     if (loc->class_name) {
    80       mrb_str_cat_cstr(mrb, str, loc->class_name);
    81       mrb_str_cat_cstr(mrb, str, loc->sep);
    82     }
    83 
    84     mrb_str_cat_cstr(mrb, str, loc->method);
    85   }
    86 
    87   mrb_ary_push(mrb, ary, str);
    88   mrb_gc_arena_restore(mrb, ai);
    89 }
    90 
    91 static void
    92 output_backtrace(mrb_state *mrb, mrb_int ciidx, mrb_code *pc0, output_stream_func func, void *data)
    93 {
    94   int i;
     24typedef void (*each_backtrace_func)(mrb_state*, int i, struct backtrace_location*, void*);
     25
     26static const mrb_data_type bt_type = { "Backtrace", mrb_free };
     27
     28static void
     29each_backtrace(mrb_state *mrb, mrb_int ciidx, mrb_code *pc0, each_backtrace_func func, void *data)
     30{
     31  int i, j;
    9532
    9633  if (ciidx >= mrb->c->ciend - mrb->c->cibase)
    9734    ciidx = 10; /* ciidx is broken... */
    9835
    99   for (i = ciidx; i >= 0; i--) {
     36  for (i=ciidx, j=0; i >= 0; i--,j++) {
    10037    struct backtrace_location loc;
    10138    mrb_callinfo *ci;
     
    10946
    11047    irep = ci->proc->body.irep;
     48    if (!irep) continue;
    11149
    11250    if (mrb->c->cibase[i].err) {
     
    12462    if (loc.lineno == -1) continue;
    12563
    126     if (ci->target_class == ci->proc->target_class) {
    127       loc.sep = ".";
    128     }
    129     else {
    130       loc.sep = "#";
    131     }
    132 
    13364    if (!loc.filename) {
    13465      loc.filename = "(unknown)";
    13566    }
    13667
    137     loc.method = mrb_sym2name(mrb, ci->mid);
    138     loc.class_name = mrb_class_name(mrb, ci->proc->target_class);
    139     loc.i = i;
    140     func(mrb, &loc, data);
    141   }
    142 }
    143 
    144 static void
    145 exc_output_backtrace(mrb_state *mrb, struct RObject *exc, output_stream_func func, void *stream)
    146 {
    147   mrb_value lastpc;
    148   mrb_code *code;
    149 
    150   lastpc = mrb_obj_iv_get(mrb, exc, mrb_intern_lit(mrb, "lastpc"));
    151   if (mrb_nil_p(lastpc)) {
    152     code = NULL;
    153   } else {
    154     code = (mrb_code*)mrb_cptr(lastpc);
    155   }
    156 
    157   output_backtrace(mrb, mrb_fixnum(mrb_obj_iv_get(mrb, exc, mrb_intern_lit(mrb, "ciidx"))),
    158                    code, func, stream);
    159 }
    160 
    161 /* mrb_print_backtrace/mrb_get_backtrace:
    162 
    163    function to retrieve backtrace information from the exception.
    164    note that if you call method after the exception, call stack will be
    165    overwritten.  So invoke these functions just after detecting exceptions.
     68    loc.method_id = ci->mid;
     69    func(mrb, j, &loc, data);
     70  }
     71}
     72
     73#ifndef MRB_DISABLE_STDIO
     74
     75static void
     76print_backtrace(mrb_state *mrb, mrb_value backtrace)
     77{
     78  int i, n;
     79  FILE *stream = stderr;
     80
     81  if (!mrb_array_p(backtrace)) return;
     82  fprintf(stream, "trace:\n");
     83
     84  n = RARRAY_LEN(backtrace);
     85  for (i=0; n--; i++) {
     86    mrb_value entry = RARRAY_PTR(backtrace)[n];
     87
     88    if (mrb_string_p(entry)) {
     89      fprintf(stream, "\t[%d] %.*s\n", i, (int)RSTRING_LEN(entry), RSTRING_PTR(entry));
     90    }
     91  }
     92}
     93
     94static void
     95print_packed_backtrace(mrb_state *mrb, mrb_value packed)
     96{
     97  FILE *stream = stderr;
     98  struct backtrace_location *bt;
     99  int n, i;
     100
     101  bt = (struct backtrace_location*)mrb_data_check_get_ptr(mrb, packed, &bt_type);
     102  if (bt == NULL) {
     103    mrb_raise(mrb, E_RUNTIME_ERROR, "broken backtrace");
     104  }
     105  n = (mrb_int)RDATA(packed)->flags;
     106
     107  fprintf(stream, "trace:\n");
     108  for (i = 0; n--; i++) {
     109    int ai = mrb_gc_arena_save(mrb);
     110    struct backtrace_location *entry = &bt[n];
     111    if (entry->filename == NULL) continue;
     112    fprintf(stream, "\t[%d] %s:%d", (int)i, entry->filename, entry->lineno);
     113    if (entry->method_id != 0) {
     114      const char *method_name;
     115
     116      method_name = mrb_sym2name(mrb, entry->method_id);
     117      fprintf(stream, ":in %s", method_name);
     118      mrb_gc_arena_restore(mrb, ai);
     119    }
     120    fprintf(stream, "\n");
     121  }
     122}
     123
     124/* mrb_print_backtrace
     125
     126   function to retrieve backtrace information from the last exception.
    166127*/
    167 
    168 #ifndef MRB_DISABLE_STDIO
    169128
    170129MRB_API void
    171130mrb_print_backtrace(mrb_state *mrb)
    172131{
    173   struct print_backtrace_args args;
    174 
    175   if (!mrb->exc || mrb_obj_is_kind_of(mrb, mrb_obj_value(mrb->exc), E_SYSSTACK_ERROR)) {
     132  mrb_value backtrace;
     133
     134  if (!mrb->exc) {
    176135    return;
    177136  }
    178137
    179   args.stream = stderr;
    180   args.tracehead = TRUE;
    181   exc_output_backtrace(mrb, mrb->exc, print_backtrace_i, (void*)&args);
    182 }
    183 
     138  backtrace = mrb_obj_iv_get(mrb, mrb->exc, mrb_intern_lit(mrb, "backtrace"));
     139  if (mrb_nil_p(backtrace)) return;
     140  if (mrb_array_p(backtrace)) {
     141    print_backtrace(mrb, backtrace);
     142  }
     143  else {
     144    print_packed_backtrace(mrb, backtrace);
     145  }
     146}
    184147#else
    185148
     
    191154#endif
    192155
     156static void
     157pack_backtrace_i(mrb_state *mrb,
     158                 int i,
     159                 struct backtrace_location *loc,
     160                 void *data)
     161{
     162  struct backtrace_location *entry = (struct backtrace_location*)data;
     163
     164  entry[i] = *loc;
     165}
     166
     167static mrb_value
     168packed_backtrace(mrb_state *mrb)
     169{
     170  struct RData *backtrace;
     171  ptrdiff_t ciidx = mrb->c->ci - mrb->c->cibase;
     172  mrb_int len = (ciidx+1)*sizeof(struct backtrace_location);
     173  void *ptr;
     174
     175  ptr = mrb_malloc(mrb, len);
     176  memset(ptr, 0, len);
     177  backtrace = mrb_data_object_alloc(mrb, NULL, ptr, &bt_type);
     178  backtrace->flags = (unsigned int)ciidx+1;
     179  each_backtrace(mrb, ciidx, mrb->c->ci->pc, pack_backtrace_i, ptr);
     180  return mrb_obj_value(backtrace);
     181}
     182
     183void
     184mrb_keep_backtrace(mrb_state *mrb, mrb_value exc)
     185{
     186  mrb_value backtrace;
     187  int ai = mrb_gc_arena_save(mrb);
     188
     189  backtrace = packed_backtrace(mrb);
     190  mrb_iv_set(mrb, exc, mrb_intern_lit(mrb, "backtrace"), backtrace);
     191  mrb_gc_arena_restore(mrb, ai);
     192}
     193
     194mrb_value
     195mrb_unpack_backtrace(mrb_state *mrb, mrb_value backtrace)
     196{
     197  struct backtrace_location *bt;
     198  mrb_int n, i;
     199
     200  if (mrb_nil_p(backtrace)) return mrb_ary_new_capa(mrb, 0);
     201  if (mrb_array_p(backtrace)) return backtrace;
     202  bt = (struct backtrace_location*)mrb_data_check_get_ptr(mrb, backtrace, &bt_type);
     203  if (bt == NULL) {
     204    mrb_raise(mrb, E_RUNTIME_ERROR, "broken backtrace");
     205  }
     206  n = (mrb_int)RDATA(backtrace)->flags;
     207  backtrace = mrb_ary_new_capa(mrb, n);
     208  for (i = 0; i < n; i++) {
     209    int ai = mrb_gc_arena_save(mrb);
     210    struct backtrace_location *entry = &bt[i];
     211    mrb_value btline;
     212
     213    if (entry->filename == NULL) continue;
     214    btline = mrb_format(mrb, "%S:%S",
     215                              mrb_str_new_cstr(mrb, entry->filename),
     216                              mrb_fixnum_value(entry->lineno));
     217    if (entry->method_id != 0) {
     218      mrb_str_cat_lit(mrb, btline, ":in ");
     219      mrb_str_cat_cstr(mrb, btline, mrb_sym2name(mrb, entry->method_id));
     220    }
     221    mrb_ary_push(mrb, backtrace, btline);
     222    mrb_gc_arena_restore(mrb, ai);
     223  }
     224
     225  return backtrace;
     226}
     227
    193228MRB_API mrb_value
    194 mrb_exc_backtrace(mrb_state *mrb, mrb_value self)
    195 {
    196   mrb_value ary;
    197 
    198   ary = mrb_ary_new(mrb);
    199   exc_output_backtrace(mrb, mrb_obj_ptr(self), get_backtrace_i, (void*)mrb_ary_ptr(ary));
    200 
    201   return ary;
     229mrb_exc_backtrace(mrb_state *mrb, mrb_value exc)
     230{
     231  mrb_sym attr_name;
     232  mrb_value backtrace;
     233
     234  attr_name = mrb_intern_lit(mrb, "backtrace");
     235  backtrace = mrb_iv_get(mrb, exc, attr_name);
     236  if (mrb_nil_p(backtrace) || mrb_array_p(backtrace)) {
     237    return backtrace;
     238  }
     239  backtrace = mrb_unpack_backtrace(mrb, backtrace);
     240  mrb_iv_set(mrb, exc, attr_name, backtrace);
     241  return backtrace;
    202242}
    203243
     
    205245mrb_get_backtrace(mrb_state *mrb)
    206246{
    207   mrb_value ary;
    208   mrb_callinfo *ci = mrb->c->ci;
    209   mrb_code *pc = ci->pc;
    210   mrb_int ciidx = (mrb_int)(ci - mrb->c->cibase - 1);
    211 
    212   if (ciidx < 0) ciidx = 0;
    213   ary = mrb_ary_new(mrb);
    214   output_backtrace(mrb, ciidx, pc, get_backtrace_i, (void*)mrb_ary_ptr(ary));
    215 
    216   return ary;
    217 }
     247  return mrb_unpack_backtrace(mrb, packed_backtrace(mrb));
     248}
  • EcnlProtoTool/trunk/mruby-1.3.0/src/class.c

    r321 r331  
    66
    77#include <stdarg.h>
    8 #include "mruby.h"
    9 #include "mruby/array.h"
    10 #include "mruby/class.h"
    11 #include "mruby/numeric.h"
    12 #include "mruby/proc.h"
    13 #include "mruby/string.h"
    14 #include "mruby/variable.h"
    15 #include "mruby/error.h"
    16 #include "mruby/data.h"
     8#include <mruby.h>
     9#include <mruby/array.h>
     10#include <mruby/class.h>
     11#include <mruby/numeric.h>
     12#include <mruby/proc.h>
     13#include <mruby/string.h>
     14#include <mruby/variable.h>
     15#include <mruby/error.h>
     16#include <mruby/data.h>
     17#include <mruby/istruct.h>
    1718
    1819KHASH_DEFINE(mt, mrb_sym, struct RProc*, TRUE, kh_int_hash_func, kh_int_hash_equal)
     
    9798  else {
    9899    sc->super = o->c;
     100    prepare_singleton_class(mrb, (struct RBasic*)sc);
    99101  }
    100102  o->c = sc;
     
    122124}
    123125
    124 MRB_API struct RClass*
    125 mrb_class_outer_module(mrb_state *mrb, struct RClass *c)
    126 {
    127   mrb_value outer;
    128 
    129   outer = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__"));
    130   if (mrb_nil_p(outer)) return NULL;
    131   return mrb_class_ptr(outer);
    132 }
    133 
    134 static void
    135 check_if_class_or_module(mrb_state *mrb, mrb_value obj)
     126static mrb_bool
     127class_ptr_p(mrb_value obj)
    136128{
    137129  switch (mrb_type(obj)) {
     
    139131  case MRB_TT_SCLASS:
    140132  case MRB_TT_MODULE:
    141     return;
     133    return TRUE;
    142134  default:
     135    return FALSE;
     136  }
     137}
     138
     139MRB_API struct RClass*
     140mrb_class_outer_module(mrb_state *mrb, struct RClass *c)
     141{
     142  mrb_value outer;
     143  struct RClass *cls;
     144
     145  outer = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__"));
     146  if (mrb_nil_p(outer)) return NULL;
     147  cls = mrb_class_ptr(outer);
     148  if (cls->tt == MRB_TT_SCLASS)
     149  {
     150    mrb_value klass;
     151    klass = mrb_obj_iv_get(mrb, (struct RObject *)cls,
     152                           mrb_intern_lit(mrb, "__attached__"));
     153    if (class_ptr_p(klass)) {
     154      cls = mrb_class_ptr(klass);
     155    }
     156  }
     157  return cls;
     158}
     159
     160static void
     161check_if_class_or_module(mrb_state *mrb, mrb_value obj)
     162{
     163  if (!class_ptr_p(obj)) {
    143164    mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a class/module", mrb_inspect(mrb, obj));
    144165  }
     
    175196{
    176197  check_if_class_or_module(mrb, outer);
     198  if (mrb_const_defined_at(mrb, outer, id)) {
     199    mrb_value old = mrb_const_get(mrb, outer, id);
     200
     201    if (mrb_type(old) != MRB_TT_MODULE) {
     202      mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a module", mrb_inspect(mrb, old));
     203    }
     204    return mrb_class_ptr(old);
     205  }
    177206  return define_module(mrb, id, mrb_class_ptr(outer));
    178207}
     
    232261}
    233262
     263static mrb_value mrb_bob_init(mrb_state *mrb, mrb_value cv);
     264
    234265static void
    235266mrb_class_inherited(mrb_state *mrb, struct RClass *super, struct RClass *klass)
    236267{
     268  mrb_value s;
     269  mrb_sym mid;
     270
    237271  if (!super)
    238272    super = mrb->object_class;
    239   mrb_funcall(mrb, mrb_obj_value(super), "inherited", 1, mrb_obj_value(klass));
     273  s = mrb_obj_value(super);
     274  mid = mrb_intern_lit(mrb, "inherited");
     275  if (!mrb_func_basic_p(mrb, s, mid, mrb_bob_init)) {
     276    mrb_value c = mrb_obj_value(klass);
     277    mrb_funcall_argv(mrb, mrb_obj_value(super), mid, 1, &c);
     278  }
    240279}
    241280
     
    248287  if (!mrb_nil_p(super)) {
    249288    if (mrb_type(super) != MRB_TT_CLASS) {
    250       mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%S given)", super);
     289      mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%S given)",
     290                 mrb_inspect(mrb, super));
    251291    }
    252292    s = mrb_class_ptr(super);
     
    256296  }
    257297  check_if_class_or_module(mrb, outer);
     298  if (mrb_const_defined_at(mrb, outer, id)) {
     299    mrb_value old = mrb_const_get(mrb, outer, id);
     300
     301    if (mrb_type(old) != MRB_TT_CLASS) {
     302      mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a class", mrb_inspect(mrb, old));
     303    }
     304    c = mrb_class_ptr(old);
     305    if (s) {
     306      /* check super class */
     307      if (mrb_class_real(c->super) != s) {
     308        mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for class %S", old);
     309      }
     310    }
     311    return c;
     312  }
    258313  c = define_class(mrb, id, s, mrb_class_ptr(outer));
    259314  mrb_class_inherited(mrb, mrb_class_real(c->super), c);
     
    272327}
    273328
     329MRB_API mrb_bool
     330mrb_class_defined_under(mrb_state *mrb, struct RClass *outer, const char *name)
     331{
     332  mrb_value sym = mrb_check_intern_cstr(mrb, name);
     333  if (mrb_nil_p(sym)) {
     334    return FALSE;
     335  }
     336  return mrb_const_defined_at(mrb, mrb_obj_value(outer), mrb_symbol(sym));
     337}
     338
    274339MRB_API struct RClass *
    275340mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name)
     
    282347{
    283348  return mrb_class_get_under(mrb, mrb->object_class, name);
     349}
     350
     351MRB_API struct RClass *
     352mrb_exc_get(mrb_state *mrb, const char *name)
     353{
     354  struct RClass *exc, *e;
     355  mrb_value c = mrb_const_get(mrb, mrb_obj_value(mrb->object_class),
     356                              mrb_intern_cstr(mrb, name));
     357
     358  if (mrb_type(c) != MRB_TT_CLASS) {
     359    mrb_raise(mrb, mrb->eException_class, "exception corrupted");
     360  }
     361  exc = e = mrb_class_ptr(c);
     362
     363  while (e) {
     364    if (e == mrb->eException_class)
     365      return exc;
     366    e = e->super;
     367  }
     368  return mrb->eException_class;
    284369}
    285370
     
    337422  h = c->mt;
    338423
     424  if (MRB_FROZEN_P(c)) {
     425    if (c->tt == MRB_TT_MODULE)
     426      mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen module");
     427    else
     428      mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen class");
     429  }
    339430  if (!h) h = c->mt = kh_init(mt, mrb);
    340431  k = kh_put(mt, mrb, h, mid);
    341432  kh_value(h, k) = p;
    342433  if (p) {
     434    p->c = NULL;
    343435    mrb_field_write_barrier(mrb, (struct RBasic *)c, (struct RBasic *)p);
    344436  }
     
    430522    mrb_value obj = mrb_funcall(mrb, ss, "inspect", 0);
    431523    mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", obj);
     524    /* not reached */
     525    return 0;
    432526  }
    433527}
     
    457551    n:      Symbol         [mrb_sym]
    458552    d:      Data           [void*,mrb_data_type const] 2nd argument will be used to check data type so it won't be modified
     553    I:      Inline struct  [void*]
    459554    &:      Block          [mrb_value]
    460555    *:      rest argument  [mrb_value*,mrb_int]   Receive the rest of the arguments as an array.
     
    467562  char c;
    468563  int i = 0;
    469   mrb_value *sp = mrb->c->stack + 1;
    470564  va_list ap;
    471565  int argc = mrb->c->ci->argc;
     566  int arg_i = 0;
     567  mrb_bool array_argv;
    472568  mrb_bool opt = FALSE;
    473569  mrb_bool given = TRUE;
     
    478574
    479575    argc = a->len;
    480     sp = a->ptr;
    481   }
     576    array_argv = TRUE;
     577  }
     578  else {
     579    array_argv = FALSE;
     580  }
     581
     582#define ARGV \
     583  (array_argv ? mrb_ary_ptr(mrb->c->stack[1])->ptr : (mrb->c->stack + 1))
     584
    482585  while ((c = *format++)) {
    483586    switch (c) {
     
    503606        p = va_arg(ap, mrb_value*);
    504607        if (i < argc) {
    505           *p = *sp++;
     608          *p = ARGV[arg_i++];
    506609          i++;
    507610        }
     
    516619          mrb_value ss;
    517620
    518           ss = *sp++;
    519           switch (mrb_type(ss)) {
    520           case MRB_TT_CLASS:
    521           case MRB_TT_MODULE:
    522           case MRB_TT_SCLASS:
    523             break;
    524           default:
     621          ss = ARGV[arg_i++];
     622          if (!class_ptr_p(ss)) {
    525623            mrb_raisef(mrb, E_TYPE_ERROR, "%S is not class/module", ss);
    526             break;
    527624          }
    528625          *p = ss;
     
    538635        if (*format == '!') {
    539636          format++;
    540           if (i < argc && mrb_nil_p(*sp)) {
    541             *p = *sp++;
     637          if (i < argc && mrb_nil_p(ARGV[arg_i])) {
     638            *p = ARGV[arg_i++];
    542639            i++;
    543640            break;
     
    545642        }
    546643        if (i < argc) {
    547           *p = to_str(mrb, *sp++);
     644          *p = to_str(mrb, ARGV[arg_i++]);
    548645          i++;
    549646        }
     
    557654        if (*format == '!') {
    558655          format++;
    559           if (i < argc && mrb_nil_p(*sp)) {
    560             *p = *sp++;
     656          if (i < argc && mrb_nil_p(ARGV[arg_i])) {
     657            *p = ARGV[arg_i++];
    561658            i++;
    562659            break;
     
    564661        }
    565662        if (i < argc) {
    566           *p = to_ary(mrb, *sp++);
     663          *p = to_ary(mrb, ARGV[arg_i++]);
    567664          i++;
    568665        }
     
    576673        if (*format == '!') {
    577674          format++;
    578           if (i < argc && mrb_nil_p(*sp)) {
    579             *p = *sp++;
     675          if (i < argc && mrb_nil_p(ARGV[arg_i])) {
     676            *p = ARGV[arg_i++];
    580677            i++;
    581678            break;
     
    583680        }
    584681        if (i < argc) {
    585           *p = to_hash(mrb, *sp++);
     682          *p = to_hash(mrb, ARGV[arg_i++]);
    586683          i++;
    587684        }
     
    598695        if (*format == '!') {
    599696          format++;
    600           if (i < argc && mrb_nil_p(*sp)) {
     697          if (i < argc && mrb_nil_p(ARGV[arg_i])) {
    601698            *ps = NULL;
    602699            *pl = 0;
    603             i++;
     700            i++; arg_i++;
    604701            break;
    605702          }
    606703        }
    607704        if (i < argc) {
    608           ss = to_str(mrb, *sp++);
     705          ss = to_str(mrb, ARGV[arg_i++]);
    609706          *ps = RSTRING_PTR(ss);
    610707          *pl = RSTRING_LEN(ss);
     
    621718        if (*format == '!') {
    622719          format++;
    623           if (i < argc && mrb_nil_p(*sp)) {
     720          if (i < argc && mrb_nil_p(ARGV[arg_i])) {
    624721            *ps = NULL;
    625             i++; sp++;
     722            i++; arg_i++;
    626723            break;
    627724          }
    628725        }
    629726        if (i < argc) {
    630           ss = to_str(mrb, *sp++);
     727          ss = to_str(mrb, ARGV[arg_i++]);
    631728          *ps = mrb_string_value_cstr(mrb, &ss);
    632729          i++;
     
    645742        if (*format == '!') {
    646743          format++;
    647           if (i < argc && mrb_nil_p(*sp)) {
     744          if (i < argc && mrb_nil_p(ARGV[arg_i])) {
    648745            *pb = 0;
    649746            *pl = 0;
    650             i++; sp++;
     747            i++; arg_i++;
    651748            break;
    652749          }
    653750        }
    654751        if (i < argc) {
    655           aa = to_ary(mrb, *sp++);
     752          aa = to_ary(mrb, ARGV[arg_i++]);
    656753          a = mrb_ary_ptr(aa);
    657754          *pb = a->ptr;
     
    661758      }
    662759      break;
     760    case 'I':
     761      {
     762        void* *p;
     763        mrb_value ss;
     764
     765        p = va_arg(ap, void**);
     766        if (i < argc) {
     767          ss = ARGV[arg_i];
     768          if (mrb_type(ss) != MRB_TT_ISTRUCT)
     769          {
     770            mrb_raisef(mrb, E_TYPE_ERROR, "%S is not inline struct", ss);
     771          }
     772          *p = mrb_istruct_ptr(ss);
     773          arg_i++;
     774          i++;
     775        }
     776      }
     777      break;
    663778    case 'f':
    664779      {
     
    667782        p = va_arg(ap, mrb_float*);
    668783        if (i < argc) {
    669           *p = mrb_to_flo(mrb, *sp);
    670           sp++;
     784          *p = mrb_to_flo(mrb, ARGV[arg_i]);
     785          arg_i++;
    671786          i++;
    672787        }
     
    679794        p = va_arg(ap, mrb_int*);
    680795        if (i < argc) {
    681           switch (mrb_type(*sp)) {
     796          switch (mrb_type(ARGV[arg_i])) {
    682797            case MRB_TT_FIXNUM:
    683               *p = mrb_fixnum(*sp);
     798              *p = mrb_fixnum(ARGV[arg_i]);
    684799              break;
    685800            case MRB_TT_FLOAT:
    686801              {
    687                 mrb_float f = mrb_float(*sp);
    688 
    689                 if (!FIXABLE(f)) {
     802                mrb_float f = mrb_float(ARGV[arg_i]);
     803
     804                if (!FIXABLE_FLOAT(f)) {
    690805                  mrb_raise(mrb, E_RANGE_ERROR, "float too big for int");
    691806                }
     
    697812              break;
    698813            default:
    699               *p = mrb_fixnum(mrb_Integer(mrb, *sp));
     814              *p = mrb_fixnum(mrb_Integer(mrb, ARGV[arg_i]));
    700815              break;
    701816          }
    702           sp++;
     817          arg_i++;
    703818          i++;
    704819        }
     
    710825
    711826        if (i < argc) {
    712           mrb_value b = *sp++;
     827          mrb_value b = ARGV[arg_i++];
    713828          *boolp = mrb_test(b);
    714829          i++;
     
    724839          mrb_value ss;
    725840
    726           ss = *sp++;
     841          ss = ARGV[arg_i++];
    727842          *symp = to_sym(mrb, ss);
    728843          i++;
     
    739854        if (*format == '!') {
    740855          format++;
    741           if (i < argc && mrb_nil_p(*sp)) {
     856          if (i < argc && mrb_nil_p(ARGV[arg_i])) {
    742857            *datap = 0;
    743             i++; sp++;
     858            i++; arg_i++;
    744859            break;
    745860          }
    746861        }
    747862        if (i < argc) {
    748           *datap = mrb_data_get_ptr(mrb, *sp++, type);
     863          *datap = mrb_data_get_ptr(mrb, ARGV[arg_i++], type);
    749864          ++i;
    750865        }
     
    788903          *pl = argc-i;
    789904          if (*pl > 0) {
    790             *var = sp;
     905            *var = ARGV + arg_i;
    791906          }
    792907          i = argc;
    793           sp += *pl;
     908          arg_i += *pl;
    794909        }
    795910        else {
     
    804919    }
    805920  }
     921
     922#undef ARGV
     923
    806924  if (!c && argc > i) {
    807925    mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
     
    831949boot_initmod(mrb_state *mrb, struct RClass *mod)
    832950{
    833   mod->mt = kh_init(mt, mrb);
     951  if (!mod->mt) {
     952    mod->mt = kh_init(mt, mrb);
     953  }
    834954}
    835955
     
    847967  if (m->tt == MRB_TT_ICLASS) {
    848968    ic->c = m->c;
    849   } else {
     969  }
     970  else {
    850971    ic->c = m;
    851972  }
     
    873994        if (p->mt == m->mt) {
    874995          if (!superclass_seen) {
    875             ins_pos = p; // move insert point
     996            ins_pos = p; /* move insert point */
    876997          }
    877998          goto skip;
     
    9371058
    9381059static mrb_value
    939 mrb_mod_prepend(mrb_state *mrb, mrb_value klass)
    940 {
    941   mrb_value *argv;
    942   mrb_int argc, i;
    943 
    944   mrb_get_args(mrb, "*", &argv, &argc);
    945   for (i=0; i<argc; i++) {
    946     mrb_check_type(mrb, argv[i], MRB_TT_MODULE);
    947   }
    948   while (argc--) {
    949     mrb_funcall(mrb, argv[argc], "prepend_features", 1, klass);
    950     mrb_funcall(mrb, argv[argc], "prepended", 1, klass);
    951   }
    952 
    953   return klass;
    954 }
    955 
    956 static mrb_value
    9571060mrb_mod_append_features(mrb_state *mrb, mrb_value mod)
    9581061{
     
    9631066  mrb_include_module(mrb, mrb_class_ptr(klass), mrb_class_ptr(mod));
    9641067  return mod;
    965 }
    966 
    967 static mrb_value
    968 mrb_mod_include(mrb_state *mrb, mrb_value klass)
    969 {
    970   mrb_value *argv;
    971   mrb_int argc, i;
    972 
    973   mrb_get_args(mrb, "*", &argv, &argc);
    974   for (i=0; i<argc; i++) {
    975     mrb_check_type(mrb, argv[i], MRB_TT_MODULE);
    976   }
    977   while (argc--) {
    978     mrb_funcall(mrb, argv[argc], "append_features", 1, klass);
    979     mrb_funcall(mrb, argv[argc], "included", 1, klass);
    980   }
    981 
    982   return klass;
    9831068}
    9841069
     
    10761161  mrb_value b;
    10771162  struct RClass *m = mrb_class_ptr(mod);
    1078   boot_initmod(mrb, m); // bootstrap a newly initialized module
     1163  boot_initmod(mrb, m); /* bootstrap a newly initialized module */
    10791164  mrb_get_args(mrb, "|&", &b);
    10801165  if (!mrb_nil_p(b)) {
     
    11561241  obj = mrb_basic_ptr(v);
    11571242  prepare_singleton_class(mrb, obj);
    1158   if (mrb->c && mrb->c->ci && mrb->c->ci->target_class) {
    1159     mrb_obj_iv_set(mrb, (struct RObject*)obj->c, mrb_intern_lit(mrb, "__outer__"),
    1160                    mrb_obj_value(mrb->c->ci->target_class));
    1161   }
    11621243  return mrb_obj_value(obj->c);
    11631244}
     
    13201401
    13211402  if (ttype == 0) ttype = MRB_TT_OBJECT;
     1403  if (ttype <= MRB_TT_CPTR) {
     1404    mrb_raisef(mrb, E_TYPE_ERROR, "can't create instance of %S", cv);
     1405  }
    13221406  o = (struct RObject*)mrb_obj_alloc(mrb, ttype, c);
    13231407  return mrb_obj_value(o);
     
    13541438{
    13551439  mrb_value obj;
     1440  mrb_sym mid;
    13561441
    13571442  obj = mrb_instance_alloc(mrb, mrb_obj_value(c));
    1358   mrb_funcall_argv(mrb, obj, mrb_intern_lit(mrb, "initialize"), argc, argv);
    1359 
     1443  mid = mrb_intern_lit(mrb, "initialize");
     1444  if (!mrb_func_basic_p(mrb, obj, mid, mrb_bob_init)) {
     1445    mrb_funcall_argv(mrb, obj, mid, argc, argv);
     1446  }
    13601447  return obj;
    13611448}
     
    13791466  mrb_value super, blk;
    13801467  mrb_value new_class;
     1468  mrb_sym mid;
    13811469
    13821470  n = mrb_get_args(mrb, "|C&", &super, &blk);
     
    13851473  }
    13861474  new_class = mrb_obj_value(mrb_class_new(mrb, mrb_class_ptr(super)));
    1387   mrb_funcall_with_block(mrb, new_class, mrb_intern_lit(mrb, "initialize"), n, &super, blk);
     1475  mid = mrb_intern_lit(mrb, "initialize");
     1476  if (!mrb_func_basic_p(mrb, new_class, mid, mrb_bob_init)) {
     1477    mrb_funcall_with_block(mrb, new_class, mid, n, &super, blk);
     1478  }
    13881479  mrb_class_inherited(mrb, mrb_class_ptr(super), mrb_class_ptr(new_class));
    13891480  return new_class;
     
    14161507}
    14171508
    1418 void
    1419 mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value self, mrb_value args)
    1420 {
    1421   mrb_sym inspect;
    1422   mrb_value repr;
    1423 
    1424   inspect = mrb_intern_lit(mrb, "inspect");
    1425   if (mrb->c->ci > mrb->c->cibase && mrb->c->ci[-1].mid == inspect) {
    1426     /* method missing in inspect; avoid recursion */
    1427     repr = mrb_any_to_s(mrb, self);
    1428   }
    1429   else if (mrb_respond_to(mrb, self, inspect) && mrb->c->ci - mrb->c->cibase < 64) {
    1430     repr = mrb_funcall_argv(mrb, self, inspect, 0, 0);
    1431     if (mrb_string_p(repr) && RSTRING_LEN(repr) > 64) {
    1432       repr = mrb_any_to_s(mrb, self);
    1433     }
    1434   }
    1435   else {
    1436     repr = mrb_any_to_s(mrb, self);
    1437   }
    1438 
    1439   mrb_no_method_error(mrb, name, args, "undefined method '%S' for %S",
    1440                       mrb_sym2str(mrb, name), repr);
    1441 }
    1442 
    1443 /* 15.3.1.3.30 */
     1509/* 15.3.1.3.1  */
     1510/* 15.3.1.3.10 */
     1511/* 15.3.1.3.11 */
    14441512/*
    14451513 *  call-seq:
    1446  *     obj.method_missing(symbol [, *args] )   -> result
    1447  *
    1448  *  Invoked by Ruby when <i>obj</i> is sent a message it cannot handle.
    1449  *  <i>symbol</i> is the symbol for the method called, and <i>args</i>
    1450  *  are any arguments that were passed to it. By default, the interpreter
    1451  *  raises an error when this method is called. However, it is possible
    1452  *  to override the method to provide more dynamic behavior.
    1453  *  If it is decided that a particular method should not be handled, then
    1454  *  <i>super</i> should be called, so that ancestors can pick up the
    1455  *  missing method.
    1456  *  The example below creates
    1457  *  a class <code>Roman</code>, which responds to methods with names
    1458  *  consisting of roman numerals, returning the corresponding integer
    1459  *  values.
    1460  *
    1461  *     class Roman
    1462  *       def romanToInt(str)
    1463  *         # ...
    1464  *       end
    1465  *       def method_missing(methId)
    1466  *         str = methId.id2name
    1467  *         romanToInt(str)
    1468  *       end
    1469  *     end
    1470  *
    1471  *     r = Roman.new
    1472  *     r.iv      #=> 4
    1473  *     r.xxiii   #=> 23
    1474  *     r.mm      #=> 2000
     1514 *     obj == other        -> true or false
     1515 *     obj.equal?(other)   -> true or false
     1516 *     obj.eql?(other)     -> true or false
     1517 *
     1518 *  Equality---At the <code>Object</code> level, <code>==</code> returns
     1519 *  <code>true</code> only if <i>obj</i> and <i>other</i> are the
     1520 *  same object. Typically, this method is overridden in descendant
     1521 *  classes to provide class-specific meaning.
     1522 *
     1523 *  Unlike <code>==</code>, the <code>equal?</code> method should never be
     1524 *  overridden by subclasses: it is used to determine object identity
     1525 *  (that is, <code>a.equal?(b)</code> iff <code>a</code> is the same
     1526 *  object as <code>b</code>).
     1527 *
     1528 *  The <code>eql?</code> method returns <code>true</code> if
     1529 *  <i>obj</i> and <i>anObject</i> have the same value. Used by
     1530 *  <code>Hash</code> to test members for equality.  For objects of
     1531 *  class <code>Object</code>, <code>eql?</code> is synonymous with
     1532 *  <code>==</code>. Subclasses normally continue this tradition, but
     1533 *  there are exceptions. <code>Numeric</code> types, for example,
     1534 *  perform type conversion across <code>==</code>, but not across
     1535 *  <code>eql?</code>, so:
     1536 *
     1537 *     1 == 1.0     #=> true
     1538 *     1.eql? 1.0   #=> false
    14751539 */
    1476 static mrb_value
    1477 mrb_bob_missing(mrb_state *mrb, mrb_value mod)
    1478 {
    1479   mrb_sym name;
    1480   mrb_value *a;
    1481   mrb_int alen;
    1482 
    1483   mrb_get_args(mrb, "n*", &name, &a, &alen);
    1484   mrb_method_missing(mrb, name, mod, mrb_ary_new_from_values(mrb, alen, a));
    1485   /* not reached */
    1486   return mrb_nil_value();
     1540mrb_value
     1541mrb_obj_equal_m(mrb_state *mrb, mrb_value self)
     1542{
     1543  mrb_value arg;
     1544
     1545  mrb_get_args(mrb, "o", &arg);
     1546  return mrb_bool_value(mrb_obj_equal(mrb, self, arg));
     1547}
     1548
     1549static mrb_value
     1550mrb_obj_not_equal_m(mrb_state *mrb, mrb_value self)
     1551{
     1552  mrb_value arg;
     1553
     1554  mrb_get_args(mrb, "o", &arg);
     1555  return mrb_bool_value(!mrb_equal(mrb, self, arg));
    14871556}
    14881557
     
    15331602      return mrb_nil_value();
    15341603    }
    1535     else if (outer && outer != mrb->object_class) {
     1604    else if (outer && outer != c && outer != mrb->object_class) {
    15361605      mrb_value base = mrb_class_path(mrb, outer);
    15371606      path = mrb_str_buf_new(mrb, 0);
     
    15521621      path = mrb_str_new(mrb, name, len);
    15531622    }
    1554     mrb_obj_iv_set(mrb, (struct RObject*)c, classpath, path);
    1555   }
    1556   return path;
     1623    if (!MRB_FROZEN_P(c)) {
     1624      mrb_obj_iv_set(mrb, (struct RObject*)c, classpath, path);
     1625    }
     1626  }
     1627  return mrb_str_dup(mrb, path);
    15571628}
    15581629
     
    16991770    str = mrb_str_new_lit(mrb, "#<Class:");
    17001771
    1701     switch (mrb_type(v)) {
    1702       case MRB_TT_CLASS:
    1703       case MRB_TT_MODULE:
    1704       case MRB_TT_SCLASS:
    1705         mrb_str_cat_str(mrb, str, mrb_inspect(mrb, v));
    1706         break;
    1707       default:
    1708         mrb_str_cat_str(mrb, str, mrb_any_to_s(mrb, v));
    1709         break;
     1772    if (class_ptr_p(v)) {
     1773      mrb_str_cat_str(mrb, str, mrb_inspect(mrb, v));
     1774    }
     1775    else {
     1776      mrb_str_cat_str(mrb, str, mrb_any_to_s(mrb, v));
    17101777    }
    17111778    return mrb_str_cat_lit(mrb, str, ">");
     
    17861853  mrb_get_args(mrb, "*", &argv, &argc);
    17871854  while (argc--) {
    1788     undef_method(mrb, c, mrb_symbol(*argv));
     1855    undef_method(mrb, c, to_sym(mrb, *argv));
    17891856    argv++;
    17901857  }
     
    17981865  struct RProc *p;
    17991866  mrb_sym mid;
     1867  mrb_value proc = mrb_undef_value();
    18001868  mrb_value blk;
    18011869
    1802   mrb_get_args(mrb, "n&", &mid, &blk);
     1870  mrb_get_args(mrb, "n|o&", &mid, &proc, &blk);
     1871  switch (mrb_type(proc)) {
     1872    case MRB_TT_PROC:
     1873      blk = proc;
     1874      break;
     1875    case MRB_TT_UNDEF:
     1876      /* ignored */
     1877      break;
     1878    default:
     1879      mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %S (expected Proc)", mrb_obj_value(mrb_obj_class(mrb, proc)));
     1880      break;
     1881  }
    18031882  if (mrb_nil_p(blk)) {
    18041883    mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
     
    20282107  mrb_get_args(mrb, "*", &argv, &argc);
    20292108  while (argc--) {
    2030     remove_method(mrb, mod, mrb_symbol(*argv));
     2109    remove_method(mrb, mod, to_sym(mrb, *argv));
    20312110    argv++;
    20322111  }
     
    21592238
    21602239  mrb_get_args(mrb, "*", &argv, &argc);
    2161   if(argc == 0) {
     2240  if (argc == 0) {
    21622241    /* set MODFUNC SCOPE if implemented */
    21632242    return mod;
     
    21822261  return mod;
    21832262}
     2263
     2264/* implementation of __id__ */
     2265mrb_value mrb_obj_id_m(mrb_state *mrb, mrb_value self);
     2266/* implementation of instance_eval */
     2267mrb_value mrb_obj_instance_eval(mrb_state*, mrb_value);
    21842268
    21852269void
     
    22222306  mrb_define_method(mrb, bob, "initialize",              mrb_bob_init,             MRB_ARGS_NONE());
    22232307  mrb_define_method(mrb, bob, "!",                       mrb_bob_not,              MRB_ARGS_NONE());
    2224   mrb_define_method(mrb, bob, "method_missing",          mrb_bob_missing,          MRB_ARGS_ANY());  /* 15.3.1.3.30 */
     2308  mrb_define_method(mrb, bob, "==",                      mrb_obj_equal_m,          MRB_ARGS_REQ(1)); /* 15.3.1.3.1  */
     2309  mrb_define_method(mrb, bob, "!=",                      mrb_obj_not_equal_m,      MRB_ARGS_REQ(1));
     2310  mrb_define_method(mrb, bob, "__id__",                  mrb_obj_id_m,             MRB_ARGS_NONE()); /* 15.3.1.3.3  */
     2311  mrb_define_method(mrb, bob, "__send__",                mrb_f_send,               MRB_ARGS_ANY());  /* 15.3.1.3.4  */
     2312  mrb_define_method(mrb, bob, "instance_eval",           mrb_obj_instance_eval,    MRB_ARGS_ANY());  /* 15.3.1.3.18 */
    22252313
    22262314  mrb_define_class_method(mrb, cls, "new",               mrb_class_new_class,      MRB_ARGS_OPT(1));
     
    22362324  mrb_define_method(mrb, mod, "extend_object",           mrb_mod_extend_object,    MRB_ARGS_REQ(1)); /* 15.2.2.4.25 */
    22372325  mrb_define_method(mrb, mod, "extended",                mrb_bob_init,             MRB_ARGS_REQ(1)); /* 15.2.2.4.26 */
    2238   mrb_define_method(mrb, mod, "prepend",                 mrb_mod_prepend,          MRB_ARGS_ANY());
    22392326  mrb_define_method(mrb, mod, "prepended",               mrb_bob_init,             MRB_ARGS_REQ(1));
    22402327  mrb_define_method(mrb, mod, "prepend_features",        mrb_mod_prepend_features, MRB_ARGS_REQ(1));
    2241   mrb_define_method(mrb, mod, "include",                 mrb_mod_include,          MRB_ARGS_ANY());  /* 15.2.2.4.27 */
    22422328  mrb_define_method(mrb, mod, "include?",                mrb_mod_include_p,        MRB_ARGS_REQ(1)); /* 15.2.2.4.28 */
    22432329  mrb_define_method(mrb, mod, "append_features",         mrb_mod_append_features,  MRB_ARGS_REQ(1)); /* 15.2.2.4.10 */
     
    22692355  mrb_define_method(mrb, mod, "remove_const",            mrb_mod_remove_const,     MRB_ARGS_REQ(1)); /* 15.2.2.4.40 */
    22702356  mrb_define_method(mrb, mod, "const_missing",           mrb_mod_const_missing,    MRB_ARGS_REQ(1));
    2271   mrb_define_method(mrb, mod, "define_method",           mod_define_method,        MRB_ARGS_REQ(1));
     2357  mrb_define_method(mrb, mod, "define_method",           mod_define_method,        MRB_ARGS_ARG(1,1));
    22722358  mrb_define_method(mrb, mod, "class_variables",         mrb_mod_class_variables,  MRB_ARGS_NONE()); /* 15.2.2.4.19 */
    22732359  mrb_define_method(mrb, mod, "===",                     mrb_mod_eqq,              MRB_ARGS_REQ(1));
  • EcnlProtoTool/trunk/mruby-1.3.0/src/codedump.c

    r321 r331  
    1 #include "mruby.h"
    2 #include "mruby/irep.h"
    3 #include "mruby/debug.h"
    4 #include "mruby/opcode.h"
    5 #include "mruby/string.h"
    6 #include "mruby/proc.h"
     1#include <mruby.h>
     2#include <mruby/irep.h>
     3#include <mruby/debug.h>
     4#include <mruby/opcode.h>
     5#include <mruby/string.h>
     6#include <mruby/proc.h>
    77
    88#ifndef MRB_DISABLE_STDIO
     
    240240      switch (GETARG_B(c)) {
    241241      case OP_R_NORMAL:
     242        printf("\tnormal\t"); break;
    242243      case OP_R_RETURN:
    243244        printf("\treturn\t"); break;
     
    246247      default:
    247248        printf("\tbroken\t"); break;
    248         break;
    249249      }
    250250      print_lv(mrb, irep, c, RA);
     
    260260
    261261    case OP_LAMBDA:
    262       printf("OP_LAMBDA\tR%d\tI(%+d)\t%d", GETARG_A(c), GETARG_b(c)+1, GETARG_c(c));
     262      printf("OP_LAMBDA\tR%d\tI(%+d)\t", GETARG_A(c), GETARG_b(c)+1);
     263      switch (GETARG_c(c)) {
     264      case OP_L_METHOD:
     265        printf("method"); break;
     266      case OP_L_BLOCK:
     267        printf("block"); break;
     268      case OP_L_LAMBDA:
     269        printf("lambda"); break;
     270      }
    263271      print_lv(mrb, irep, c, RA);
    264272      break;
     
    324332      break;
    325333    case OP_EQ:
    326       printf("OP_EQ\tR%d\t:%s\t%d\n", GETARG_A(c),
     334      printf("OP_EQ\t\tR%d\t:%s\t%d\n", GETARG_A(c),
    327335             mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
    328336             GETARG_C(c));
     
    410418      break;
    411419    case OP_RESCUE:
    412       printf("OP_RESCUE\tR%d\t\t", GETARG_A(c));
    413       print_lv(mrb, irep, c, RA);
     420      {
     421        int a = GETARG_A(c);
     422        int b = GETARG_B(c);
     423        int cnt = GETARG_C(c);
     424
     425        if (b == 0) {
     426          printf("OP_RESCUE\tR%d\t\t%s", a, cnt ? "cont" : "");
     427          print_lv(mrb, irep, c, RA);
     428          break;
     429        }
     430        else {
     431          printf("OP_RESCUE\tR%d\tR%d\t%s", a, b, cnt ? "cont" : "");
     432          print_lv(mrb, irep, c, RAB);
     433          break;
     434        }
     435      }
    414436      break;
    415437    case OP_RAISE:
     
    418440      break;
    419441    case OP_POPERR:
    420       printf("OP_POPERR\t%d\t\t", GETARG_A(c));
    421       print_lv(mrb, irep, c, RA);
     442      printf("OP_POPERR\t%d\t\t\n", GETARG_A(c));
    422443      break;
    423444    case OP_EPOP:
  • EcnlProtoTool/trunk/mruby-1.3.0/src/compar.c

    r321 r331  
    55*/
    66
    7 #include "mruby.h"
     7#include <mruby.h>
    88
    99void
  • EcnlProtoTool/trunk/mruby-1.3.0/src/debug.c

    r321 r331  
    11#include <string.h>
    2 #include "mruby.h"
    3 #include "mruby/irep.h"
    4 #include "mruby/debug.h"
     2#include <mruby.h>
     3#include <mruby/irep.h>
     4#include <mruby/debug.h>
    55
    66static mrb_irep_debug_info_file *
     
    2020      ret = it + 1;
    2121      count -= step + 1;
    22     } else { count = step; }
     22    }
     23    else { count = step; }
    2324  }
    2425
     
    8788              ret = it + 1;
    8889              count -= step + 1;
    89             } else { count = step; }
     90            }
     91            else { count = step; }
    9092          }
    9193
  • EcnlProtoTool/trunk/mruby-1.3.0/src/dump.c

    r321 r331  
    77#include <string.h>
    88#include <limits.h>
    9 #include "mruby/dump.h"
    10 #include "mruby/string.h"
    11 #include "mruby/irep.h"
    12 #include "mruby/numeric.h"
    13 #include "mruby/debug.h"
     9#include <mruby/dump.h>
     10#include <mruby/string.h>
     11#include <mruby/irep.h>
     12#include <mruby/numeric.h>
     13#include <mruby/debug.h>
    1414
    1515#define FLAG_BYTEORDER_NATIVE 2
     
    5555  uint8_t *cur = buf;
    5656
    57   cur += uint32_to_bin(get_irep_record_size_1(mrb, irep), cur);  /* record size */
     57  cur += uint32_to_bin((uint32_t)get_irep_record_size_1(mrb, irep), cur);  /* record size */
    5858  cur += uint16_to_bin((uint16_t)irep->nlocals, cur);  /* number of local variable */
    5959  cur += uint16_to_bin((uint16_t)irep->nregs, cur);  /* number of register variable */
     
    408408  if (irep->filename) {
    409409    filename_len = strlen(irep->filename);
    410   } else {
     410  }
     411  else {
    411412    filename_len = 0;
    412413  }
     
    10601061    }
    10611062    if (fprintf(fp,
     1063          "extern const uint8_t %s[];\n"
    10621064          "const uint8_t\n"
    10631065          "#if defined __GNUC__\n"
     
    10671069          "#endif\n"
    10681070          "%s[] = {",
     1071          initname,
    10691072          (uint16_t)MRB_DUMP_ALIGNMENT, (uint16_t)MRB_DUMP_ALIGNMENT, initname) < 0) {
    10701073      mrb_free(mrb, bin);
  • EcnlProtoTool/trunk/mruby-1.3.0/src/enum.c

    r321 r331  
    55*/
    66
    7 #include "mruby.h"
     7#include <mruby.h>
    88
    99void
  • EcnlProtoTool/trunk/mruby-1.3.0/src/error.c

    r321 r331  
    88#include <stdarg.h>
    99#include <stdlib.h>
    10 #include "mruby.h"
    11 #include "mruby/array.h"
    12 #include "mruby/irep.h"
    13 #include "mruby/proc.h"
    14 #include "mruby/string.h"
    15 #include "mruby/variable.h"
    16 #include "mruby/debug.h"
    17 #include "mruby/error.h"
    18 #include "mruby/class.h"
    19 #include "mruby/throw.h"
     10#include <mruby.h>
     11#include <mruby/array.h>
     12#include <mruby/irep.h>
     13#include <mruby/proc.h>
     14#include <mruby/string.h>
     15#include <mruby/variable.h>
     16#include <mruby/debug.h>
     17#include <mruby/error.h>
     18#include <mruby/class.h>
     19#include <mruby/throw.h>
    2020
    2121MRB_API mrb_value
     
    4545{
    4646  mrb_value mesg;
    47 
    48   if (mrb_get_args(mrb, "|o", &mesg) == 1) {
     47  mrb_int argc;
     48  mrb_value *argv;
     49
     50  if (mrb_get_args(mrb, "|o*", &mesg, &argv, &argc) >= 1) {
    4951    mrb_iv_set(mrb, exc, mrb_intern_lit(mrb, "mesg"), mesg);
    5052  }
     
    6163 *  return the receiver. Otherwise, create a new
    6264 *  exception object of the same class as the receiver, but with a
    63  *  message equal to <code>string.to_str</code>.
     65 *  message equal to <code>string</code>.
    6466 *
    6567 */
     
    110112 *
    111113 * Returns the result of invoking <code>exception.to_s</code>.
    112  * Normally this returns the exception's message or name. By
    113  * supplying a to_str method, exceptions are agreeing to
    114  * be used where Strings are expected.
     114 * Normally this returns the exception's message or name.
    115115 */
    116116
     
    136136  mrb_value str, mesg, file, line;
    137137  mrb_bool append_mesg;
     138  const char *cname;
    138139
    139140  mesg = mrb_attr_get(mrb, exc, mrb_intern_lit(mrb, "mesg"));
     
    147148  }
    148149
    149   if (!mrb_nil_p(file) && !mrb_nil_p(line)) {
    150     str = mrb_str_dup(mrb, file);
    151     mrb_str_cat_lit(mrb, str, ":");
    152     mrb_str_append(mrb, str, line);
    153     mrb_str_cat_lit(mrb, str, ": ");
     150  cname = mrb_obj_classname(mrb, exc);
     151  str = mrb_str_new_cstr(mrb, cname);
     152  if (mrb_string_p(file) && mrb_fixnum_p(line)) {
    154153    if (append_mesg) {
    155       mrb_str_cat_str(mrb, str, mesg);
    156       mrb_str_cat_lit(mrb, str, " (");
    157     }
    158     mrb_str_cat_cstr(mrb, str, mrb_obj_classname(mrb, exc));
    159     if (append_mesg) {
    160       mrb_str_cat_lit(mrb, str, ")");
    161     }
     154      str = mrb_format(mrb, "%S:%S:%S (%S)", file, line, mesg, str);
     155    }
     156    else {
     157      str = mrb_format(mrb, "%S:%S:%S", file, line, str);
     158    }
     159  }
     160  else if (append_mesg) {
     161    str = mrb_format(mrb, "%S:%S", str, mesg);
     162  }
     163  return str;
     164}
     165
     166void mrb_keep_backtrace(mrb_state *mrb, mrb_value exc);
     167
     168static void
     169set_backtrace(mrb_state *mrb, mrb_value exc, mrb_value backtrace)
     170{
     171  if (!mrb_array_p(backtrace)) {
     172  type_err:
     173    mrb_raise(mrb, E_TYPE_ERROR, "backtrace must be Array of String");
    162174  }
    163175  else {
    164     const char *cname = mrb_obj_classname(mrb, exc);
    165     str = mrb_str_new_cstr(mrb, cname);
    166     mrb_str_cat_lit(mrb, str, ": ");
    167     if (append_mesg) {
    168       mrb_str_cat_str(mrb, str, mesg);
    169     }
    170     else {
    171       mrb_str_cat_cstr(mrb, str, cname);
    172     }
    173   }
    174   return str;
    175 }
    176 
     176    const mrb_value *p = RARRAY_PTR(backtrace);
     177    const mrb_value *pend = p + RARRAY_LEN(backtrace);
     178
     179    while (p < pend) {
     180      if (!mrb_string_p(*p)) goto type_err;
     181      p++;
     182    }
     183  }
     184  mrb_iv_set(mrb, exc, mrb_intern_lit(mrb, "backtrace"), backtrace);
     185}
     186
     187static mrb_value
     188exc_set_backtrace(mrb_state *mrb, mrb_value exc)
     189{
     190  mrb_value backtrace;
     191
     192  mrb_get_args(mrb, "o", &backtrace);
     193  set_backtrace(mrb, exc, backtrace);
     194  return backtrace;
     195}
    177196
    178197static void
     
    182201  mrb_code *pc = ci->pc;
    183202
    184   mrb_obj_iv_set(mrb, exc, mrb_intern_lit(mrb, "ciidx"), mrb_fixnum_value((mrb_int)(ci - mrb->c->cibase)));
    185203  while (ci >= mrb->c->cibase) {
    186204    mrb_code *err = ci->err;
     
    203221}
    204222
     223void
     224mrb_exc_set(mrb_state *mrb, mrb_value exc)
     225{
     226  if (mrb_nil_p(exc)) {
     227    mrb->exc = 0;
     228  }
     229  else {
     230    mrb->exc = mrb_obj_ptr(exc);
     231    if (!mrb->gc.out_of_memory) {
     232      exc_debug_info(mrb, mrb->exc);
     233      mrb_keep_backtrace(mrb, exc);
     234    }
     235  }
     236}
     237
    205238MRB_API mrb_noreturn void
    206239mrb_exc_raise(mrb_state *mrb, mrb_value exc)
    207240{
    208   mrb->exc = mrb_obj_ptr(exc);
    209   if (!mrb->gc.out_of_memory) {
    210     exc_debug_info(mrb, mrb->exc);
    211   }
     241  if (!mrb_obj_is_kind_of(mrb, exc, mrb->eException_class)) {
     242    mrb_raise(mrb, E_TYPE_ERROR, "exception object expected");
     243  }
     244  mrb_exc_set(mrb, exc);
    212245  if (!mrb->jmp) {
    213246    mrb_p(mrb, exc);
     
    220253mrb_raise(mrb_state *mrb, struct RClass *c, const char *msg)
    221254{
    222   mrb_value mesg;
    223   mesg = mrb_str_new_cstr(mrb, msg);
    224   mrb_exc_raise(mrb, mrb_exc_new_str(mrb, c, mesg));
     255  mrb_exc_raise(mrb, mrb_exc_new_str(mrb, c, mrb_str_new_cstr(mrb, msg)));
    225256}
    226257
     
    232263  ptrdiff_t size;
    233264  mrb_value ary = mrb_ary_new_capa(mrb, 4);
     265  int ai = mrb_gc_arena_save(mrb);
    234266
    235267  while (*p) {
     
    255287      }
    256288    }
     289    mrb_gc_arena_restore(mrb, ai);
    257290  }
    258291  if (b == format) {
     
    261294  else {
    262295    size = p - b;
    263     mrb_ary_push(mrb, ary, mrb_str_new(mrb, b, size));
    264     return mrb_ary_join(mrb, ary, mrb_str_new(mrb, NULL, 0));
     296    if (size > 0) {
     297      mrb_ary_push(mrb, ary, mrb_str_new(mrb, b, size));
     298      mrb_gc_arena_restore(mrb, ai);
     299    }
     300    return mrb_ary_join(mrb, ary, mrb_nil_value());
    265301  }
    266302}
     
    279315}
    280316
     317static mrb_noreturn void
     318raise_va(mrb_state *mrb, struct RClass *c, const char *fmt, va_list ap, int argc, mrb_value *argv)
     319{
     320  mrb_value mesg;
     321
     322  mesg = mrb_vformat(mrb, fmt, ap);
     323  if (argv == NULL) {
     324    argv = &mesg;
     325  }
     326  else {
     327    argv[0] = mesg;
     328  }
     329  mrb_exc_raise(mrb, mrb_obj_new(mrb, c, argc+1, argv));
     330}
     331
    281332MRB_API mrb_noreturn void
    282333mrb_raisef(mrb_state *mrb, struct RClass *c, const char *fmt, ...)
    283334{
    284335  va_list args;
    285   mrb_value mesg;
    286336
    287337  va_start(args, fmt);
    288   mesg = mrb_vformat(mrb, fmt, args);
     338  raise_va(mrb, c, fmt, args, 0, NULL);
    289339  va_end(args);
    290   mrb_exc_raise(mrb, mrb_exc_new_str(mrb, c, mesg));
    291340}
    292341
     
    294343mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...)
    295344{
    296   mrb_value exc;
    297345  mrb_value argv[2];
    298346  va_list args;
    299347
    300348  va_start(args, fmt);
    301   argv[0] = mrb_vformat(mrb, fmt, args);
     349  argv[1] = mrb_symbol_value(id);
     350  raise_va(mrb, E_NAME_ERROR, fmt, args, 1, argv);
    302351  va_end(args);
    303 
    304   argv[1] = mrb_symbol_value(id);
    305   exc = mrb_obj_new(mrb, E_NAME_ERROR, 2, argv);
    306   mrb_exc_raise(mrb, exc);
    307352}
    308353
     
    338383}
    339384
    340 static void
    341 set_backtrace(mrb_state *mrb, mrb_value info, mrb_value bt)
    342 {
    343   mrb_funcall(mrb, info, "set_backtrace", 1, bt);
    344 }
    345 
    346 static mrb_value
    347 make_exception(mrb_state *mrb, int argc, const mrb_value *argv, mrb_bool isstr)
     385MRB_API mrb_value
     386mrb_make_exception(mrb_state *mrb, int argc, const mrb_value *argv)
    348387{
    349388  mrb_value mesg;
     
    357396      if (mrb_nil_p(argv[0]))
    358397        break;
    359       if (isstr) {
    360         mesg = mrb_check_string_type(mrb, argv[0]);
    361         if (!mrb_nil_p(mesg)) {
    362           mesg = mrb_exc_new_str(mrb, E_RUNTIME_ERROR, mesg);
    363           break;
    364         }
     398      if (mrb_string_p(argv[0])) {
     399        mesg = mrb_exc_new_str(mrb, E_RUNTIME_ERROR, argv[0]);
     400        break;
    365401      }
    366402      n = 0;
     
    389425  if (argc > 0) {
    390426    if (!mrb_obj_is_kind_of(mrb, mesg, mrb->eException_class))
    391       mrb_raise(mrb, E_TYPE_ERROR, "exception object expected");
     427      mrb_raise(mrb, mrb->eException_class, "exception object expected");
    392428    if (argc > 2)
    393         set_backtrace(mrb, mesg, argv[2]);
     429      set_backtrace(mrb, mesg, argv[2]);
    394430  }
    395431
    396432  return mesg;
    397 }
    398 
    399 MRB_API mrb_value
    400 mrb_make_exception(mrb_state *mrb, int argc, const mrb_value *argv)
    401 {
    402   return make_exception(mrb, argc, argv, TRUE);
    403433}
    404434
     
    428458{
    429459  mrb_value exc;
     460  mrb_value argv[3];
    430461  va_list ap;
    431462
    432463  va_start(ap, fmt);
    433   exc = mrb_funcall(mrb, mrb_obj_value(E_NOMETHOD_ERROR), "new", 3,
    434                     mrb_vformat(mrb, fmt, ap), mrb_symbol_value(id), args);
     464  argv[0] = mrb_vformat(mrb, fmt, ap);
     465  argv[1] = mrb_symbol_value(id);
     466  argv[2] = args;
    435467  va_end(ap);
     468  exc = mrb_obj_new(mrb, E_NOMETHOD_ERROR, 3, argv);
    436469  mrb_exc_raise(mrb, exc);
    437470}
     
    440473mrb_init_exception(mrb_state *mrb)
    441474{
    442   struct RClass *exception, *runtime_error, *script_error;
     475  struct RClass *exception, *script_error, *stack_error, *nomem_error;
    443476
    444477  mrb->eException_class = exception = mrb_define_class(mrb, "Exception", mrb->object_class); /* 15.2.22 */
     
    451484  mrb_define_method(mrb, exception, "inspect",         exc_inspect,       MRB_ARGS_NONE());
    452485  mrb_define_method(mrb, exception, "backtrace",       mrb_exc_backtrace, MRB_ARGS_NONE());
     486  mrb_define_method(mrb, exception, "set_backtrace",   exc_set_backtrace, MRB_ARGS_REQ(1));
    453487
    454488  mrb->eStandardError_class = mrb_define_class(mrb, "StandardError", mrb->eException_class); /* 15.2.23 */
    455   runtime_error = mrb_define_class(mrb, "RuntimeError", mrb->eStandardError_class);          /* 15.2.28 */
    456   mrb->nomem_err = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, runtime_error, "Out of memory"));
     489  mrb_define_class(mrb, "RuntimeError", mrb->eStandardError_class);          /* 15.2.28 */
    457490  script_error = mrb_define_class(mrb, "ScriptError", mrb->eException_class);                /* 15.2.37 */
    458491  mrb_define_class(mrb, "SyntaxError", script_error);                                        /* 15.2.38 */
    459   mrb_define_class(mrb, "SystemStackError", exception);
    460 }
     492  stack_error = mrb_define_class(mrb, "SystemStackError", exception);
     493  mrb->stack_err = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, stack_error, "stack level too deep"));
     494
     495  nomem_error = mrb_define_class(mrb, "NoMemoryError", exception);
     496  mrb->nomem_err = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, nomem_error, "Out of memory"));
     497#ifdef MRB_GC_FIXED_ARENA
     498  mrb->arena_err = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, nomem_error, "arena overflow error"));
     499#endif
     500}
  • EcnlProtoTool/trunk/mruby-1.3.0/src/error.h

    r321 r331  
    11/* this header file is to be removed soon.
    22   added for compatibility purpose (1.0.0) */
    3 #include "mruby/error.h"
     3#include <mruby/error.h>
  • EcnlProtoTool/trunk/mruby-1.3.0/src/etc.c

    r321 r331  
    55*/
    66
    7 #include "mruby.h"
    8 #include "mruby/string.h"
    9 #include "mruby/data.h"
    10 #include "mruby/class.h"
    11 #include "mruby/re.h"
    12 #include "mruby/irep.h"
     7#include <mruby.h>
     8#include <mruby/string.h>
     9#include <mruby/data.h>
     10#include <mruby/class.h>
     11#include <mruby/re.h>
     12#include <mruby/irep.h>
    1313
    1414MRB_API struct RData*
     
    140140  case MRB_TT_FILE:
    141141  case MRB_TT_DATA:
     142  case MRB_TT_ISTRUCT:
    142143  default:
    143144    return MakeID(mrb_ptr(obj));
     
    180181mrb_regexp_p(mrb_state *mrb, mrb_value v)
    181182{
    182   return mrb_class_defined(mrb, REGEXP_CLASS) && mrb_obj_is_kind_of(mrb, v, mrb_class_get(mrb, REGEXP_CLASS));
     183  if (mrb->flags & MRB_STATE_NO_REGEXP) {
     184    return FALSE;
     185  }
     186  if ((mrb->flags & MRB_STATE_REGEXP) || mrb_class_defined(mrb, REGEXP_CLASS)) {
     187    mrb->flags |= MRB_STATE_REGEXP;
     188    return mrb_obj_is_kind_of(mrb, v, mrb_class_get(mrb, REGEXP_CLASS));
     189  }
     190  else {
     191    mrb->flags |= MRB_STATE_REGEXP;
     192    mrb->flags |= MRB_STATE_NO_REGEXP;
     193  }
     194  return FALSE;
    183195}
    184196
  • EcnlProtoTool/trunk/mruby-1.3.0/src/fmt_fp.c

    r321 r331  
    3434#include <ctype.h>
    3535
    36 #include "mruby.h"
    37 #include "mruby/string.h"
     36#include <mruby.h>
     37#include <mruby/string.h>
    3838
    3939struct fmt_args {
     
    157157    s=buf;
    158158    do {
    159       int x=y;
     159      int x=(int)y;
    160160      *s++=xdigits[x]|(t&32);
    161161      y=16*(y-x);
     
    185185
    186186  do {
    187     *z = y;
     187    *z = (uint32_t)y;
    188188    y = 1000000000*(y-*z++);
    189189  } while (y);
     
    195195      uint64_t x = ((uint64_t)*d<<sh)+carry;
    196196      *d = x % 1000000000;
    197       carry = x / 1000000000;
     197      carry = (uint32_t)(x / 1000000000);
    198198    }
    199199    if (carry) *--a = carry;
     
    254254  }
    255255  for (; z>a && !z[-1]; z--);
    256  
     256
    257257  if ((t|32)=='g') {
    258258    if (!p) p++;
     
    355355  default:
    356356    return -1;
    357   } 
     357  }
    358358}
    359359
  • EcnlProtoTool/trunk/mruby-1.3.0/src/gc.c

    r321 r331  
    77#include <string.h>
    88#include <stdlib.h>
    9 #include "mruby.h"
    10 #include "mruby/array.h"
    11 #include "mruby/class.h"
    12 #include "mruby/data.h"
    13 #include "mruby/hash.h"
    14 #include "mruby/proc.h"
    15 #include "mruby/range.h"
    16 #include "mruby/string.h"
    17 #include "mruby/variable.h"
    18 #include "mruby/gc.h"
    19 #include "mruby/error.h"
     9#include <mruby.h>
     10#include <mruby/array.h>
     11#include <mruby/class.h>
     12#include <mruby/data.h>
     13#include <mruby/hash.h>
     14#include <mruby/proc.h>
     15#include <mruby/range.h>
     16#include <mruby/string.h>
     17#include <mruby/variable.h>
     18#include <mruby/gc.h>
     19#include <mruby/error.h>
     20#include <mruby/throw.h>
    2021
    2122/*
     
    6667  mruby implementer and C extension library writer must insert a write
    6768  barrier when updating a reference from a field of an object.
    68   When updating a reference from a field of object A to object B, 
     69  When updating a reference from a field of object A to object B,
    6970  two different types of write barrier are available:
    7071
     
    110111    struct RData data;
    111112    struct RProc proc;
     113    struct REnv env;
    112114    struct RException exc;
     115    struct RBreak brk;
    113116#ifdef MRB_WORD_BOXING
    114117    struct RFloat floatv;
     
    138141  fprintf(stderr, "gc_invoke: %19.3f\n", gettimeofday_time() - program_invoke_time);\
    139142  fprintf(stderr, "is_generational: %d\n", is_generational(gc));\
    140   fprintf(stderr, "is_major_gc: %d\n", is_major_gc(mrb));\
     143  fprintf(stderr, "is_major_gc: %d\n", is_major_gc(gc));\
    141144} while(0)
    142145
     
    214217
    215218  p2 = mrb_realloc_simple(mrb, p, len);
    216   if (!p2 && len) {
     219  if (len == 0) return p2;
     220  if (p2 == NULL) {
    217221    if (mrb->gc.out_of_memory) {
     222      mrb_exc_raise(mrb, mrb_obj_value(mrb->nomem_err));
    218223      /* mrb_panic(mrb); */
    219224    }
     
    367372}
    368373
    369 static void obj_free(mrb_state *mrb, struct RBasic *obj);
     374static void obj_free(mrb_state *mrb, struct RBasic *obj, int end);
    370375
    371376void
     
    381386    for (p = objects(tmp), e=p+MRB_HEAP_PAGE_SIZE; p<e; p++) {
    382387      if (p->as.free.tt != MRB_TT_FREE)
    383         obj_free(mrb, &p->as.basic);
     388        obj_free(mrb, &p->as.basic, TRUE);
    384389    }
    385390    mrb_free(mrb, tmp);
     
    403408    /* arena overflow error */
    404409    gc->arena_idx = MRB_GC_ARENA_SIZE - 4; /* force room in arena */
    405     mrb_raise(mrb, E_RUNTIME_ERROR, "arena overflow error");
     410    mrb_exc_raise(mrb, mrb_obj_value(mrb->arena_err));
    406411  }
    407412#else
     
    429434   Register your object when it's exported to C world,
    430435   without reference from Ruby world, e.g. callback
    431    arguments.  Don't forget to remove the obejct using
     436   arguments.  Don't forget to remove the object using
    432437   mrb_gc_unregister, otherwise your object will leak.
    433438*/
     
    453458  mrb_value table = mrb_gv_get(mrb, root);
    454459  struct RArray *a;
    455   mrb_int i, j;
     460  mrb_int i;
    456461
    457462  if (mrb_nil_p(table)) return;
     
    462467  a = mrb_ary_ptr(table);
    463468  mrb_ary_modify(mrb, a);
    464   for (i=j=0; i<a->len; i++) {
    465     if (!mrb_obj_eq(mrb, a->ptr[i], obj)) {
    466       a->ptr[j++] = a->ptr[i];
    467     }
    468   }
    469   a->len = j;
     469  for (i = 0; i < a->len; i++) {
     470    if (mrb_obj_eq(mrb, a->ptr[i], obj)) {
     471      a->len--;
     472      memmove(&a->ptr[i], &a->ptr[i + 1], (a->len - i) * sizeof(a->ptr[i]));
     473      break;
     474    }
     475  }
    470476}
    471477
     
    476482  static const RVALUE RVALUE_zero = { { { MRB_TT_FALSE } } };
    477483  mrb_gc *gc = &mrb->gc;
     484
     485  if (cls) {
     486    enum mrb_vtype tt;
     487
     488    switch (cls->tt) {
     489    case MRB_TT_CLASS:
     490    case MRB_TT_SCLASS:
     491    case MRB_TT_MODULE:
     492    case MRB_TT_ENV:
     493      break;
     494    default:
     495      mrb_raise(mrb, E_TYPE_ERROR, "allocation failure");
     496    }
     497    tt = MRB_INSTANCE_TT(cls);
     498    if (tt != MRB_TT_FALSE &&
     499        ttype != MRB_TT_SCLASS &&
     500        ttype != MRB_TT_ICLASS &&
     501        ttype != MRB_TT_ENV &&
     502        ttype != tt) {
     503      mrb_raisef(mrb, E_TYPE_ERROR, "allocation failure of %S", mrb_obj_value(cls));
     504    }
     505  }
    478506
    479507#ifdef MRB_GC_STRESS
     
    520548  size_t i;
    521549  size_t e;
    522 
     550  mrb_value nil;
     551  int nregs;
     552
     553  if (c->stack == NULL) return;
    523554  e = c->stack - c->stbase;
    524   if (c->ci) e += c->ci->nregs;
     555  if (c->ci) {
     556    nregs = c->ci->argc + 2;
     557    if (c->ci->nregs > nregs)
     558      nregs = c->ci->nregs;
     559    e += nregs;
     560  }
    525561  if (c->stbase + e > c->stend) e = c->stend - c->stbase;
    526562  for (i=0; i<e; i++) {
     
    528564
    529565    if (!mrb_immediate_p(v)) {
    530       if (mrb_basic_ptr(v)->tt == MRB_TT_FREE) {
    531         c->stbase[i] = mrb_nil_value();
    532       }
    533       else {
    534         mrb_gc_mark(mrb, mrb_basic_ptr(v));
    535       }
    536     }
     566      mrb_gc_mark(mrb, mrb_basic_ptr(v));
     567    }
     568  }
     569  e = c->stend - c->stbase;
     570  nil = mrb_nil_value();
     571  for (; i<e; i++) {
     572    c->stbase[i] = nil;
    537573  }
    538574}
     
    541577mark_context(mrb_state *mrb, struct mrb_context *c)
    542578{
    543   int i, e = 0;
     579  int i;
    544580  mrb_callinfo *ci;
    545581
    546   /* mark stack */
     582  /* mark VM stack */
    547583  mark_context_stack(mrb, c);
    548584
    549   /* mark VM stack */
     585  /* mark call stack */
    550586  if (c->cibase) {
    551587    for (ci = c->cibase; ci <= c->ci; ci++) {
    552       if (ci->eidx > e) {
    553         e = ci->eidx;
    554       }
    555588      mrb_gc_mark(mrb, (struct RBasic*)ci->env);
    556589      mrb_gc_mark(mrb, (struct RBasic*)ci->proc);
     
    559592  }
    560593  /* mark ensure stack */
    561   for (i=0; i<e; i++) {
     594  for (i=0; i<c->esize; i++) {
     595    if (c->ensure[i] == NULL) break;
    562596    mrb_gc_mark(mrb, (struct RBasic*)c->ensure[i]);
    563597  }
    564598  /* mark fibers */
    565   if (c->prev && c->prev->fib) {
    566     mrb_gc_mark(mrb, (struct RBasic*)c->prev->fib);
     599  mrb_gc_mark(mrb, (struct RBasic*)c->fib);
     600  if (c->prev) {
     601    mark_context(mrb, c->prev);
    567602  }
    568603}
     
    614649    {
    615650      struct REnv *e = (struct REnv*)obj;
    616 
    617       if (!MRB_ENV_STACK_SHARED_P(e)) {
    618         mrb_int i, len;
    619 
    620         len = MRB_ENV_STACK_LEN(e);
    621         for (i=0; i<len; i++) {
    622           mrb_gc_mark_value(mrb, e->stack[i]);
     651      mrb_int i, len;
     652
     653      if (MRB_ENV_STACK_SHARED_P(e)) {
     654        if (e->cxt.c->fib) {
     655          mrb_gc_mark(mrb, (struct RBasic*)e->cxt.c->fib);
    623656        }
     657        break;
     658      }
     659      len = MRB_ENV_STACK_LEN(e);
     660      for (i=0; i<len; i++) {
     661        mrb_gc_mark_value(mrb, e->stack[i]);
    624662      }
    625663    }
     
    679717
    680718static void
    681 obj_free(mrb_state *mrb, struct RBasic *obj)
    682 {
    683   DEBUG(printf("obj_free(%p,tt=%d)\n",obj,obj->tt));
     719obj_free(mrb_state *mrb, struct RBasic *obj, int end)
     720{
     721  DEBUG(fprintf(stderr, "obj_free(%p,tt=%d)\n",obj,obj->tt));
    684722  switch (obj->tt) {
    685723    /* immediate - no mark */
     
    698736
    699737  case MRB_TT_OBJECT:
     738    mrb_gc_free_iv(mrb, (struct RObject*)obj);
     739    break;
     740
    700741  case MRB_TT_EXCEPTION:
    701742    mrb_gc_free_iv(mrb, (struct RObject*)obj);
     
    716757      struct REnv *e = (struct REnv*)obj;
    717758
    718       if (!MRB_ENV_STACK_SHARED_P(e)) {
    719         mrb_free(mrb, e->stack);
    720         e->stack = NULL;
     759      if (MRB_ENV_STACK_SHARED_P(e)) {
     760        /* cannot be freed */
     761        return;
    721762      }
     763      mrb_free(mrb, e->stack);
     764      e->stack = NULL;
    722765    }
    723766    break;
     
    727770      struct mrb_context *c = ((struct RFiber*)obj)->cxt;
    728771
    729       if (c != mrb->root_c)
     772      if (!end && c && c != mrb->root_c) {
     773        mrb_callinfo *ci = c->ci;
     774        mrb_callinfo *ce = c->cibase;
     775
     776        while (ce <= ci) {
     777          struct REnv *e = ci->env;
     778          if (e && !is_dead(&mrb->gc, e) &&
     779              e->tt == MRB_TT_ENV && MRB_ENV_STACK_SHARED_P(e)) {
     780            mrb_env_unshare(mrb, e);
     781          }
     782          ci--;
     783        }
    730784        mrb_free_context(mrb, c);
     785      }
    731786    }
    732787    break;
     
    781836root_scan_phase(mrb_state *mrb, mrb_gc *gc)
    782837{
    783   size_t i, e;
     838  int i, e;
    784839
    785840  if (!is_minor_gc(gc)) {
     
    795850  /* mark class hierarchy */
    796851  mrb_gc_mark(mrb, (struct RBasic*)mrb->object_class);
     852
     853  /* mark built-in classes */
     854  mrb_gc_mark(mrb, (struct RBasic*)mrb->class_class);
     855  mrb_gc_mark(mrb, (struct RBasic*)mrb->module_class);
     856  mrb_gc_mark(mrb, (struct RBasic*)mrb->proc_class);
     857  mrb_gc_mark(mrb, (struct RBasic*)mrb->string_class);
     858  mrb_gc_mark(mrb, (struct RBasic*)mrb->array_class);
     859  mrb_gc_mark(mrb, (struct RBasic*)mrb->hash_class);
     860
     861  mrb_gc_mark(mrb, (struct RBasic*)mrb->float_class);
     862  mrb_gc_mark(mrb, (struct RBasic*)mrb->fixnum_class);
     863  mrb_gc_mark(mrb, (struct RBasic*)mrb->true_class);
     864  mrb_gc_mark(mrb, (struct RBasic*)mrb->false_class);
     865  mrb_gc_mark(mrb, (struct RBasic*)mrb->nil_class);
     866  mrb_gc_mark(mrb, (struct RBasic*)mrb->symbol_class);
     867  mrb_gc_mark(mrb, (struct RBasic*)mrb->kernel_module);
     868
     869  mrb_gc_mark(mrb, (struct RBasic*)mrb->eException_class);
     870  mrb_gc_mark(mrb, (struct RBasic*)mrb->eStandardError_class);
     871
    797872  /* mark top_self */
    798873  mrb_gc_mark(mrb, (struct RBasic*)mrb->top_self);
     
    801876  /* mark pre-allocated exception */
    802877  mrb_gc_mark(mrb, (struct RBasic*)mrb->nomem_err);
    803 
    804   mark_context(mrb, mrb->root_c);
    805   if (mrb->root_c->fib) {
    806     mrb_gc_mark(mrb, (struct RBasic*)mrb->root_c->fib);
    807   }
     878  mrb_gc_mark(mrb, (struct RBasic*)mrb->stack_err);
     879#ifdef MRB_GC_FIXED_ARENA
     880  mrb_gc_mark(mrb, (struct RBasic*)mrb->arena_err);
     881#endif
     882
     883  mark_context(mrb, mrb->c);
    808884  if (mrb->root_c != mrb->c) {
    809     mark_context(mrb, mrb->c);
     885    mark_context(mrb, mrb->root_c);
    810886  }
    811887}
     
    859935
    860936      /* mark ensure stack */
    861       children += (c->ci) ? c->ci->eidx : 0;
     937      children += c->eidx;
    862938
    863939      /* mark closure */
     
    920996final_marking_phase(mrb_state *mrb, mrb_gc *gc)
    921997{
    922   mark_context_stack(mrb, mrb->root_c);
     998  int i, e;
     999
     1000  /* mark arena */
     1001  for (i=0,e=gc->arena_idx; i<e; i++) {
     1002    mrb_gc_mark(mrb, gc->arena[i]);
     1003  }
     1004  mrb_gc_mark_gv(mrb);
     1005  mark_context(mrb, mrb->c);
     1006  mark_context(mrb, mrb->root_c);
     1007  mrb_gc_mark(mrb, (struct RBasic*)mrb->exc);
    9231008  gc_mark_gray_list(mrb, gc);
    9241009  mrb_assert(gc->gray_list == NULL);
     
    9581043      if (is_dead(gc, &p->as.basic)) {
    9591044        if (p->as.basic.tt != MRB_TT_FREE) {
    960           obj_free(mrb, &p->as.basic);
    961           p->as.free.next = page->freelist;
    962           page->freelist = (struct RBasic*)p;
    963           freed++;
     1045          obj_free(mrb, &p->as.basic, FALSE);
     1046          if (p->as.basic.tt == MRB_TT_FREE) {
     1047            p->as.free.next = page->freelist;
     1048            page->freelist = (struct RBasic*)p;
     1049            freed++;
     1050          }
     1051          else {
     1052            dead_slot = FALSE;
     1053          }
    9641054        }
    9651055      }
     
    9671057        if (!is_generational(gc))
    9681058          paint_partial_white(gc, &p->as.basic); /* next gc target */
    969         dead_slot = 0;
     1059        dead_slot = FALSE;
    9701060      }
    9711061      p++;
     
    10801170  mrb_gc *gc = &mrb->gc;
    10811171
    1082   if (gc->disabled) return;
     1172  if (gc->disabled || gc->iterating) return;
    10831173
    10841174  GC_INVOKE_TIME_REPORT("mrb_incremental_gc()");
     
    11201210  mrb_gc *gc = &mrb->gc;
    11211211
    1122   if (gc->disabled) return;
     1212  if (gc->disabled || gc->iterating) return;
    11231213
    11241214  GC_INVOKE_TIME_REPORT("mrb_full_gc()");
     
    13571447change_gen_gc_mode(mrb_state *mrb, mrb_gc *gc, mrb_bool enable)
    13581448{
     1449  if (gc->disabled || gc->iterating) {
     1450    mrb_raise(mrb, E_RUNTIME_ERROR, "generational mode changed when GC disabled");
     1451    return;
     1452  }
    13591453  if (is_generational(gc) && !enable) {
    13601454    clear_all_old(mrb, gc);
     
    14081502gc_each_objects(mrb_state *mrb, mrb_gc *gc, mrb_each_object_callback *callback, void *data)
    14091503{
    1410   mrb_heap_page* page = gc->heaps;
    1411 
     1504  mrb_heap_page* page;
     1505
     1506  page = gc->heaps;
    14121507  while (page != NULL) {
    1413     RVALUE *p, *pend;
     1508    RVALUE *p;
     1509    int i;
    14141510
    14151511    p = objects(page);
    1416     pend = p + MRB_HEAP_PAGE_SIZE;
    1417     for (;p < pend; p++) {
    1418       (*callback)(mrb, &p->as.basic, data);
    1419     }
    1420 
     1512    for (i=0; i < MRB_HEAP_PAGE_SIZE; i++) {
     1513      if ((*callback)(mrb, &p[i].as.basic, data) == MRB_EACH_OBJ_BREAK)
     1514        return;
     1515    }
    14211516    page = page->next;
    14221517  }
     
    14261521mrb_objspace_each_objects(mrb_state *mrb, mrb_each_object_callback *callback, void *data)
    14271522{
    1428   gc_each_objects(mrb, &mrb->gc, callback, data);
     1523  mrb_bool iterating = mrb->gc.iterating;
     1524
     1525  mrb->gc.iterating = TRUE;
     1526  if (iterating) {
     1527    gc_each_objects(mrb, &mrb->gc, callback, data);
     1528  }
     1529  else {
     1530    struct mrb_jmpbuf *prev_jmp = mrb->jmp;
     1531    struct mrb_jmpbuf c_jmp;
     1532
     1533    MRB_TRY(&c_jmp) {
     1534      mrb->jmp = &c_jmp;
     1535      gc_each_objects(mrb, &mrb->gc, callback, data);
     1536      mrb->jmp = prev_jmp;
     1537      mrb->gc.iterating = iterating;
     1538   } MRB_CATCH(&c_jmp) {
     1539      mrb->gc.iterating = iterating;
     1540      mrb->jmp = prev_jmp;
     1541      MRB_THROW(prev_jmp);
     1542    } MRB_END_EXC(&c_jmp);
     1543  }
    14291544}
    14301545
  • EcnlProtoTool/trunk/mruby-1.3.0/src/hash.c

    r321 r331  
    55*/
    66
    7 #include "mruby.h"
    8 #include "mruby/array.h"
    9 #include "mruby/class.h"
    10 #include "mruby/hash.h"
    11 #include "mruby/khash.h"
    12 #include "mruby/string.h"
    13 #include "mruby/variable.h"
     7#include <mruby.h>
     8#include <mruby/array.h>
     9#include <mruby/class.h>
     10#include <mruby/hash.h>
     11#include <mruby/khash.h>
     12#include <mruby/string.h>
     13#include <mruby/variable.h>
    1414
    1515/* a function to get hash value of a float number */
     
    9292}
    9393
    94 typedef struct {
    95   mrb_value v;
    96   mrb_int n;
    97 } mrb_hash_value;
    98 
    99 KHASH_DECLARE(ht, mrb_value, mrb_hash_value, TRUE)
    10094KHASH_DEFINE (ht, mrb_value, mrb_hash_value, TRUE, mrb_hash_ht_hash_func, mrb_hash_ht_hash_equal)
    10195
     
    10599mrb_hash_ht_key(mrb_state *mrb, mrb_value key)
    106100{
    107   if (mrb_string_p(key) && !RSTR_FROZEN_P(mrb_str_ptr(key))) {
     101  if (mrb_string_p(key) && !MRB_FROZEN_P(mrb_str_ptr(key))) {
    108102    key = mrb_str_dup(mrb, key);
    109     RSTR_SET_FROZEN_FLAG(mrb_str_ptr(key));
     103    MRB_SET_FROZEN_FLAG(mrb_str_ptr(key));
    110104  }
    111105  return key;
     
    147141
    148142MRB_API mrb_value
    149 mrb_hash_new_capa(mrb_state *mrb, int capa)
     143mrb_hash_new_capa(mrb_state *mrb, mrb_int capa)
    150144{
    151145  struct RHash *h;
     
    166160}
    167161
     162static mrb_value mrb_hash_default(mrb_state *mrb, mrb_value hash);
     163static mrb_value hash_default(mrb_state *mrb, mrb_value hash, mrb_value key);
     164
    168165MRB_API mrb_value
    169166mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key)
     
    171168  khash_t(ht) *h = RHASH_TBL(hash);
    172169  khiter_t k;
     170  mrb_sym mid;
    173171
    174172  if (h) {
     
    178176  }
    179177
    180   /* not found */
    181   if (MRB_RHASH_PROCDEFAULT_P(hash)) {
    182     return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, key);
    183   }
    184   return RHASH_IFNONE(hash);
     178  mid = mrb_intern_lit(mrb, "default");
     179  if (mrb_func_basic_p(mrb, hash, mid, mrb_hash_default)) {
     180    return hash_default(mrb, hash, key);
     181  }
     182  /* xxx mrb_funcall_tailcall(mrb, hash, "default", 1, key); */
     183  return mrb_funcall_argv(mrb, hash, mid, 1, &key);
    185184}
    186185
     
    234233  khash_t(ht) *h, *ret_h;
    235234  khiter_t k, ret_k;
     235  mrb_value ifnone, vret;
    236236
    237237  h = RHASH_TBL(hash);
     
    239239  ret->ht = kh_init(ht, mrb);
    240240
    241   if (kh_size(h) > 0) {
     241  if (h && kh_size(h) > 0) {
    242242    ret_h = ret->ht;
    243243
     
    247247        ret_k = kh_put(ht, mrb, ret_h, KEY(kh_key(h, k)));
    248248        mrb_gc_arena_restore(mrb, ai);
    249         kh_val(ret_h, ret_k) = kh_val(h, k);
     249        kh_val(ret_h, ret_k).v = kh_val(h, k).v;
     250        kh_val(ret_h, ret_k).n = kh_size(ret_h)-1;
    250251      }
    251252    }
    252253  }
    253254
    254   return mrb_obj_value(ret);
     255  if (MRB_RHASH_DEFAULT_P(hash)) {
     256    ret->flags |= MRB_HASH_DEFAULT;
     257  }
     258  if (MRB_RHASH_PROCDEFAULT_P(hash)) {
     259    ret->flags |= MRB_HASH_PROC_DEFAULT;
     260  }
     261  vret = mrb_obj_value(ret);
     262  ifnone = RHASH_IFNONE(hash);
     263  if (!mrb_nil_p(ifnone)) {
     264      mrb_iv_set(mrb, vret, mrb_intern_lit(mrb, "ifnone"), ifnone);
     265  }
     266  return vret;
    255267}
    256268
     
    275287mrb_hash_modify(mrb_state *mrb, mrb_value hash)
    276288{
     289  if (MRB_FROZEN_P(mrb_hash_ptr(hash))) {
     290    mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen hash");
     291  }
    277292  mrb_hash_tbl(mrb, hash);
    278293}
     
    330345    ifnone = block;
    331346  }
    332   mrb_iv_set(mrb, hash, mrb_intern_lit(mrb, "ifnone"), ifnone);
     347  if (!mrb_nil_p(ifnone)) {
     348    RHASH(hash)->flags |= MRB_HASH_DEFAULT;
     349    mrb_iv_set(mrb, hash, mrb_intern_lit(mrb, "ifnone"), ifnone);
     350  }
    333351  return hash;
    334352}
     
    357375}
    358376
     377static mrb_value
     378hash_default(mrb_state *mrb, mrb_value hash, mrb_value key)
     379{
     380  if (MRB_RHASH_DEFAULT_P(hash)) {
     381    if (MRB_RHASH_PROCDEFAULT_P(hash)) {
     382      return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, key);
     383    }
     384    else {
     385      return RHASH_IFNONE(hash);
     386    }
     387  }
     388  return mrb_nil_value();
     389}
     390
    359391/* 15.2.13.4.5  */
    360392/*
     
    386418
    387419  mrb_get_args(mrb, "|o?", &key, &given);
    388   if (MRB_RHASH_PROCDEFAULT_P(hash)) {
    389     if (!given) return mrb_nil_value();
    390     return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, key);
    391   }
    392   else {
    393     return RHASH_IFNONE(hash);
    394   }
     420  if (MRB_RHASH_DEFAULT_P(hash)) {
     421    if (MRB_RHASH_PROCDEFAULT_P(hash)) {
     422      if (!given) return mrb_nil_value();
     423      return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, key);
     424    }
     425    else {
     426      return RHASH_IFNONE(hash);
     427    }
     428  }
     429  return mrb_nil_value();
    395430}
    396431
     
    424459  mrb_hash_modify(mrb, hash);
    425460  mrb_iv_set(mrb, hash, mrb_intern_lit(mrb, "ifnone"), ifnone);
    426   RHASH(hash)->flags &= ~(MRB_HASH_PROC_DEFAULT);
    427 
     461  RHASH(hash)->flags &= ~MRB_HASH_PROC_DEFAULT;
     462  if (!mrb_nil_p(ifnone)) {
     463    RHASH(hash)->flags |= MRB_HASH_DEFAULT;
     464  }
     465  else {
     466    RHASH(hash)->flags &= ~MRB_HASH_DEFAULT;
     467  }
    428468  return ifnone;
    429469}
     
    475515  mrb_hash_modify(mrb, hash);
    476516  mrb_iv_set(mrb, hash, mrb_intern_lit(mrb, "ifnone"), ifnone);
    477   RHASH(hash)->flags |= MRB_HASH_PROC_DEFAULT;
     517  if (!mrb_nil_p(ifnone)) {
     518    RHASH(hash)->flags |= MRB_HASH_PROC_DEFAULT;
     519    RHASH(hash)->flags |= MRB_HASH_DEFAULT;
     520  }
     521  else {
     522    RHASH(hash)->flags &= ~MRB_HASH_DEFAULT;
     523    RHASH(hash)->flags &= ~MRB_HASH_PROC_DEFAULT;
     524  }
    478525
    479526  return ifnone;
     
    530577
    531578  mrb_get_args(mrb, "o", &key);
     579  mrb_hash_modify(mrb, self);
    532580  return mrb_hash_delete_key(mrb, self, key);
    533581}
     
    568616  }
    569617
    570   if (MRB_RHASH_PROCDEFAULT_P(hash)) {
    571     return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, mrb_nil_value());
    572   }
    573   else {
    574     return RHASH_IFNONE(hash);
    575   }
     618  if (MRB_RHASH_DEFAULT_P(hash)) {
     619    if (MRB_RHASH_PROCDEFAULT_P(hash)) {
     620      return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, mrb_nil_value());
     621    }
     622    else {
     623      return RHASH_IFNONE(hash);
     624    }
     625  }
     626  return mrb_nil_value();
    576627}
    577628
     
    593644  khash_t(ht) *h = RHASH_TBL(hash);
    594645
     646  mrb_hash_modify(mrb, hash);
    595647  if (h) kh_clear(ht, mrb, h);
    596648  return hash;
     
    700752  khash_t(ht) *h = RHASH_TBL(hash);
    701753  khiter_t k;
     754  mrb_int end;
    702755  mrb_value ary;
    703756  mrb_value *p;
     
    705758  if (!h || kh_size(h) == 0) return mrb_ary_new(mrb);
    706759  ary = mrb_ary_new_capa(mrb, kh_size(h));
    707   mrb_ary_set(mrb, ary, kh_size(h)-1, mrb_nil_value());
     760  end = kh_size(h)-1;
     761  mrb_ary_set(mrb, ary, end, mrb_nil_value());
    708762  p = mrb_ary_ptr(ary)->ptr;
    709763  for (k = kh_begin(h); k != kh_end(h); k++) {
     
    712766      mrb_hash_value hv = kh_value(h, k);
    713767
    714       p[hv.n] = kv;
     768      if (hv.n <= end) {
     769        p[hv.n] = kv;
     770      }
     771      else {
     772        p[end] = kv;
     773      }
    715774    }
    716775  }
     
    731790 */
    732791
    733 static mrb_value
     792MRB_API mrb_value
    734793mrb_hash_values(mrb_state *mrb, mrb_value hash)
    735794{
  • EcnlProtoTool/trunk/mruby-1.3.0/src/init.c

    r321 r331  
    55*/
    66
    7 #include "mruby.h"
     7#include <mruby.h>
    88
    99void mrb_init_symtbl(mrb_state*);
     
    1414void mrb_init_enumerable(mrb_state*);
    1515void mrb_init_symbol(mrb_state*);
     16void mrb_init_string(mrb_state*);
    1617void mrb_init_exception(mrb_state*);
    1718void mrb_init_proc(mrb_state*);
    18 void mrb_init_string(mrb_state*);
    1919void mrb_init_array(mrb_state*);
    2020void mrb_init_hash(mrb_state*);
     
    3939
    4040  mrb_init_symbol(mrb); DONE;
     41  mrb_init_string(mrb); DONE;
    4142  mrb_init_exception(mrb); DONE;
    4243  mrb_init_proc(mrb); DONE;
    43   mrb_init_string(mrb); DONE;
    4444  mrb_init_array(mrb); DONE;
    4545  mrb_init_hash(mrb); DONE;
  • EcnlProtoTool/trunk/mruby-1.3.0/src/kernel.c

    r321 r331  
    55*/
    66
    7 #include "mruby.h"
    8 #include "mruby/array.h"
    9 #include "mruby/class.h"
    10 #include "mruby/proc.h"
    11 #include "mruby/string.h"
    12 #include "mruby/variable.h"
    13 #include "mruby/error.h"
     7#include <mruby.h>
     8#include <mruby/array.h>
     9#include <mruby/hash.h>
     10#include <mruby/class.h>
     11#include <mruby/proc.h>
     12#include <mruby/string.h>
     13#include <mruby/variable.h>
     14#include <mruby/error.h>
     15#include <mruby/istruct.h>
    1416
    1517typedef enum {
     
    2729} mrb_method_flag_t;
    2830
     31MRB_API mrb_bool
     32mrb_func_basic_p(mrb_state *mrb, mrb_value obj, mrb_sym mid, mrb_func_t func)
     33{
     34  struct RProc *me = mrb_method_search(mrb, mrb_class(mrb, obj), mid);
     35  if (MRB_PROC_CFUNC_P(me) && (me->body.func == func))
     36    return TRUE;
     37  return FALSE;
     38}
     39
    2940static mrb_bool
    3041mrb_obj_basic_to_s_p(mrb_state *mrb, mrb_value obj)
    3142{
    32   struct RProc *me = mrb_method_search(mrb, mrb_class(mrb, obj), mrb_intern_lit(mrb, "to_s"));
    33   if (MRB_PROC_CFUNC_P(me) && (me->body.func == mrb_any_to_s))
    34     return TRUE;
    35   return FALSE;
     43  return mrb_func_basic_p(mrb, obj, mrb_intern_lit(mrb, "to_s"), mrb_any_to_s);
    3644}
    3745
     
    5765  }
    5866  return mrb_any_to_s(mrb, obj);
    59 }
    60 
    61 /* 15.3.1.3.1  */
    62 /* 15.3.1.3.10 */
    63 /* 15.3.1.3.11 */
    64 /*
    65  *  call-seq:
    66  *     obj == other        -> true or false
    67  *     obj.equal?(other)   -> true or false
    68  *     obj.eql?(other)     -> true or false
    69  *
    70  *  Equality---At the <code>Object</code> level, <code>==</code> returns
    71  *  <code>true</code> only if <i>obj</i> and <i>other</i> are the
    72  *  same object. Typically, this method is overridden in descendant
    73  *  classes to provide class-specific meaning.
    74  *
    75  *  Unlike <code>==</code>, the <code>equal?</code> method should never be
    76  *  overridden by subclasses: it is used to determine object identity
    77  *  (that is, <code>a.equal?(b)</code> iff <code>a</code> is the same
    78  *  object as <code>b</code>).
    79  *
    80  *  The <code>eql?</code> method returns <code>true</code> if
    81  *  <i>obj</i> and <i>anObject</i> have the same value. Used by
    82  *  <code>Hash</code> to test members for equality.  For objects of
    83  *  class <code>Object</code>, <code>eql?</code> is synonymous with
    84  *  <code>==</code>. Subclasses normally continue this tradition, but
    85  *  there are exceptions. <code>Numeric</code> types, for example,
    86  *  perform type conversion across <code>==</code>, but not across
    87  *  <code>eql?</code>, so:
    88  *
    89  *     1 == 1.0     #=> true
    90  *     1.eql? 1.0   #=> false
    91  */
    92 static mrb_value
    93 mrb_obj_equal_m(mrb_state *mrb, mrb_value self)
    94 {
    95   mrb_value arg;
    96 
    97   mrb_get_args(mrb, "o", &arg);
    98   return mrb_bool_value(mrb_obj_equal(mrb, self, arg));
    99 }
    100 
    101 static mrb_value
    102 mrb_obj_not_equal_m(mrb_state *mrb, mrb_value self)
    103 {
    104   mrb_value arg;
    105 
    106   mrb_get_args(mrb, "o", &arg);
    107   return mrb_bool_value(!mrb_equal(mrb, self, arg));
    10867}
    10968
     
    143102 *  <code>name</code>. Replaces the deprecated <code>Object#id</code>.
    144103 */
    145 static mrb_value
     104mrb_value
    146105mrb_obj_id_m(mrb_state *mrb, mrb_value self)
    147106{
     
    178137  mrb_callinfo *ci = mrb->c->ci;
    179138  mrb_value *bp;
    180   mrb_bool given_p;
    181139
    182140  bp = ci->stackent + 1;
    183141  ci--;
    184142  if (ci <= mrb->c->cibase) {
    185     given_p = FALSE;
    186   }
    187   else {
    188     /* block_given? called within block; check upper scope */
    189     if (ci->proc->env) {
    190       struct REnv *e = ci->proc->env;
    191       mrb_value *sp;
    192 
    193       while (e->c) {
    194         e = (struct REnv*)e->c;
    195       }
    196       sp = e->stack;
    197       if (sp) {
    198         /* top-level does not have block slot (alway false) */
    199         if (sp == mrb->c->stbase)
    200           return mrb_false_value();
    201         ci = mrb->c->cibase + e->cioff;
    202         bp = ci[1].stackent + 1;
    203       }
    204     }
    205     if (ci->argc > 0) {
    206       bp += ci->argc;
    207     }
    208     given_p = !mrb_nil_p(*bp);
    209   }
    210 
    211   return mrb_bool_value(given_p);
     143    return mrb_false_value();
     144  }
     145  /* block_given? called within block; check upper scope */
     146  if (ci->proc->env) {
     147    struct REnv *e = ci->proc->env;
     148
     149    while (e->c) {
     150      e = (struct REnv*)e->c;
     151    }
     152    /* top-level does not have block slot (always false) */
     153    if (e->stack == mrb->c->stbase)
     154      return mrb_false_value();
     155    if (e->stack && e->cioff < 0) {
     156      /* use saved block arg position */
     157      bp = &e->stack[-e->cioff];
     158      ci = 0;                 /* no callinfo available */
     159    }
     160    else {
     161      ci = e->cxt.c->cibase + e->cioff;
     162      bp = ci[1].stackent + 1;
     163    }
     164  }
     165  if (ci && ci->argc > 0) {
     166    bp += ci->argc;
     167  }
     168  if (mrb_nil_p(*bp))
     169    return mrb_false_value();
     170  return mrb_true_value();
    212171}
    213172
     
    241200    struct RClass *clone = (struct RClass*)mrb_obj_alloc(mrb, klass->tt, mrb->class_class);
    242201
    243     if ((mrb_type(obj) == MRB_TT_CLASS) || (mrb_type(obj) == MRB_TT_SCLASS)) {
    244       clone->c = clone;
    245     }
    246     else {
     202    switch (mrb_type(obj)) {
     203    case MRB_TT_CLASS:
     204    case MRB_TT_SCLASS:
     205      break;
     206    default:
    247207      clone->c = mrb_singleton_class_clone(mrb, mrb_obj_value(klass));
     208      break;
    248209    }
    249210    clone->super = klass->super;
     
    283244    c1->super->flags |= MRB_FLAG_IS_ORIGIN;
    284245  }
    285   dc->mt = kh_copy(mt, mrb, sc->mt);
     246  if (sc->mt) {
     247    dc->mt = kh_copy(mt, mrb, sc->mt);
     248  }
     249  else {
     250    dc->mt = kh_init(mt, mrb);
     251  }
    286252  dc->super = sc->super;
     253  MRB_SET_INSTANCE_TT(dc, MRB_INSTANCE_TT(sc));
    287254}
    288255
     
    302269      mrb_iv_copy(mrb, dest, obj);
    303270      break;
     271    case MRB_TT_ISTRUCT:
     272      mrb_istruct_copy(dest, obj);
     273      break;
    304274
    305275    default:
     
    441411  mrb_value *argv;
    442412  mrb_int argc;
     413  mrb_value args;
    443414
    444415  mrb_get_args(mrb, "*", &argv, &argc);
     416  args = mrb_ary_new_from_values(mrb, argc, argv);
     417  argv = (mrb_value*)RARRAY_PTR(args);
    445418  return mrb_obj_extend(mrb, argc, argv, self);
     419}
     420
     421static mrb_value
     422mrb_obj_freeze(mrb_state *mrb, mrb_value self)
     423{
     424  struct RBasic *b;
     425
     426  switch (mrb_type(self)) {
     427    case MRB_TT_FALSE:
     428    case MRB_TT_TRUE:
     429    case MRB_TT_FIXNUM:
     430    case MRB_TT_SYMBOL:
     431    case MRB_TT_FLOAT:
     432      return self;
     433    default:
     434      break;
     435  }
     436
     437  b = mrb_basic_ptr(self);
     438  if (!MRB_FROZEN_P(b)) {
     439    MRB_SET_FROZEN_FLAG(b);
     440  }
     441  return self;
     442}
     443
     444static mrb_value
     445mrb_obj_frozen(mrb_state *mrb, mrb_value self)
     446{
     447  struct RBasic *b;
     448
     449  switch (mrb_type(self)) {
     450    case MRB_TT_FALSE:
     451    case MRB_TT_TRUE:
     452    case MRB_TT_FIXNUM:
     453    case MRB_TT_SYMBOL:
     454    case MRB_TT_FLOAT:
     455      return mrb_true_value();
     456    default:
     457      break;
     458  }
     459
     460  b = mrb_basic_ptr(self);
     461  if (!MRB_FROZEN_P(b)) {
     462    return mrb_false_value();
     463  }
     464  return mrb_true_value();
    446465}
    447466
     
    477496}
    478497
    479 
    480 /* implementation of instance_eval */
    481 mrb_value mrb_obj_instance_eval(mrb_state*, mrb_value);
    482498
    483499MRB_API mrb_bool
     
    723739mrb_obj_methods(mrb_state *mrb, mrb_bool recur, mrb_value obj, mrb_method_flag_t flag)
    724740{
    725   if (recur)
    726     return mrb_class_instance_method_list(mrb, recur, mrb_class(mrb, obj), 0);
    727   return mrb_obj_singleton_methods(mrb, recur, obj);
     741  return mrb_class_instance_method_list(mrb, recur, mrb_class(mrb, obj), 0);
    728742}
    729743/* 15.3.1.3.31 */
     
    853867    break;
    854868  case 1:
    855     a[1] = mrb_check_string_type(mrb, a[0]);
    856     if (!mrb_nil_p(a[1])) {
     869    if (mrb_string_p(a[0])) {
     870      a[1] = a[0];
    857871      argc = 2;
    858872      a[0] = mrb_obj_value(E_RUNTIME_ERROR);
     
    861875  default:
    862876    exc = mrb_make_exception(mrb, argc, a);
    863     mrb_obj_iv_set(mrb, mrb_obj_ptr(exc), mrb_intern_lit(mrb, "lastpc"), mrb_cptr_value(mrb, mrb->c->ci->pc));
    864877    mrb_exc_raise(mrb, exc);
    865878    break;
     
    905918}
    906919
     920void
     921mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value self, mrb_value args)
     922{
     923  mrb_sym inspect;
     924  mrb_value repr;
     925
     926  inspect = mrb_intern_lit(mrb, "inspect");
     927  if (mrb->c->ci > mrb->c->cibase && mrb->c->ci[-1].mid == inspect) {
     928    /* method missing in inspect; avoid recursion */
     929    repr = mrb_any_to_s(mrb, self);
     930  }
     931  else if (mrb_respond_to(mrb, self, inspect) && mrb->c->ci - mrb->c->cibase < 16) {
     932    repr = mrb_funcall_argv(mrb, self, inspect, 0, 0);
     933    if (mrb_string_p(repr) && RSTRING_LEN(repr) > 64) {
     934      repr = mrb_any_to_s(mrb, self);
     935    }
     936  }
     937  else {
     938    repr = mrb_any_to_s(mrb, self);
     939  }
     940
     941  mrb_no_method_error(mrb, name, args, "undefined method '%S' for %S",
     942                      mrb_sym2str(mrb, name), repr);
     943}
     944
     945/* 15.3.1.3.30 */
     946/*
     947 *  call-seq:
     948 *     obj.method_missing(symbol [, *args] )   -> result
     949 *
     950 *  Invoked by Ruby when <i>obj</i> is sent a message it cannot handle.
     951 *  <i>symbol</i> is the symbol for the method called, and <i>args</i>
     952 *  are any arguments that were passed to it. By default, the interpreter
     953 *  raises an error when this method is called. However, it is possible
     954 *  to override the method to provide more dynamic behavior.
     955 *  If it is decided that a particular method should not be handled, then
     956 *  <i>super</i> should be called, so that ancestors can pick up the
     957 *  missing method.
     958 *  The example below creates
     959 *  a class <code>Roman</code>, which responds to methods with names
     960 *  consisting of roman numerals, returning the corresponding integer
     961 *  values.
     962 *
     963 *     class Roman
     964 *       def romanToInt(str)
     965 *         # ...
     966 *       end
     967 *       def method_missing(methId)
     968 *         str = methId.id2name
     969 *         romanToInt(str)
     970 *       end
     971 *     end
     972 *
     973 *     r = Roman.new
     974 *     r.iv      #=> 4
     975 *     r.xxiii   #=> 23
     976 *     r.mm      #=> 2000
     977 */
     978#ifdef MRB_DEFAULT_METHOD_MISSING
     979static mrb_value
     980mrb_obj_missing(mrb_state *mrb, mrb_value mod)
     981{
     982  mrb_sym name;
     983  mrb_value *a;
     984  mrb_int alen;
     985
     986  mrb_get_args(mrb, "n*", &name, &a, &alen);
     987  mrb_method_missing(mrb, name, mod, mrb_ary_new_from_values(mrb, alen, a));
     988  /* not reached */
     989  return mrb_nil_value();
     990}
     991#endif
     992
    907993static inline mrb_bool
    908994basic_obj_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym id, int pub)
     
    9401026  else {
    9411027    mrb_value tmp;
    942     if (!mrb_string_p(mid)) {
     1028    if (mrb_string_p(mid)) {
     1029      tmp = mrb_check_intern_str(mrb, mid);
     1030    }
     1031    else {
    9431032      tmp = mrb_check_string_type(mrb, mid);
    9441033      if (mrb_nil_p(tmp)) {
     
    9461035        mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", tmp);
    9471036      }
    948     }
    949     tmp = mrb_check_intern_str(mrb, mid);
     1037      tmp = mrb_check_intern_str(mrb, tmp);
     1038    }
    9501039    if (mrb_nil_p(tmp)) {
    9511040      respond_to_p = FALSE;
     
    9631052    rtm_id = mrb_intern_lit(mrb, "respond_to_missing?");
    9641053    if (basic_obj_respond_to(mrb, self, rtm_id, !priv)) {
    965       mrb_value args[2];
     1054      mrb_value args[2], v;
    9661055      args[0] = mid;
    9671056      args[1] = mrb_bool_value(priv);
    968       return mrb_funcall_argv(mrb, self, rtm_id, 2, args);
     1057      v = mrb_funcall_argv(mrb, self, rtm_id, 2, args);
     1058      return mrb_bool_value(mrb_bool(v));
    9691059    }
    9701060  }
     
    10511141mrb_local_variables(mrb_state *mrb, mrb_value self)
    10521142{
    1053   mrb_value ret;
    10541143  struct RProc *proc;
     1144  mrb_value vars;
    10551145  struct mrb_irep *irep;
    10561146  size_t i;
     
    10661156    return mrb_ary_new(mrb);
    10671157  }
    1068   ret = mrb_ary_new_capa(mrb, irep->nlocals - 1);
     1158  vars = mrb_hash_new(mrb);
    10691159  for (i = 0; i + 1 < irep->nlocals; ++i) {
    10701160    if (irep->lv[i].name) {
    1071       mrb_ary_push(mrb, ret, mrb_symbol_value(irep->lv[i].name));
     1161      mrb_hash_set(mrb, vars, mrb_symbol_value(irep->lv[i].name), mrb_true_value());
    10721162    }
    10731163  }
     
    10761166
    10771167    while (e) {
    1078       if (!MRB_PROC_CFUNC_P(mrb->c->cibase[e->cioff].proc)) {
    1079         irep = mrb->c->cibase[e->cioff].proc->body.irep;
     1168      if (MRB_ENV_STACK_SHARED_P(e) &&
     1169          !MRB_PROC_CFUNC_P(e->cxt.c->cibase[e->cioff].proc)) {
     1170        irep = e->cxt.c->cibase[e->cioff].proc->body.irep;
    10801171        if (irep->lv) {
    10811172          for (i = 0; i + 1 < irep->nlocals; ++i) {
    10821173            if (irep->lv[i].name) {
    1083               mrb_ary_push(mrb, ret, mrb_symbol_value(irep->lv[i].name));
     1174              mrb_hash_set(mrb, vars, mrb_symbol_value(irep->lv[i].name), mrb_true_value());
    10841175            }
    10851176          }
     
    10901181  }
    10911182
    1092   return ret;
    1093 }
    1094 
     1183  return mrb_hash_keys(mrb, vars);
     1184}
     1185
     1186mrb_value mrb_obj_equal_m(mrb_state *mrb, mrb_value);
    10951187void
    10961188mrb_init_kernel(mrb_state *mrb)
     
    11081200  mrb_define_method(mrb, krn, "singleton_class",            mrb_singleton_class,             MRB_ARGS_NONE());
    11091201
    1110   mrb_define_method(mrb, krn, "==",                         mrb_obj_equal_m,                 MRB_ARGS_REQ(1));    /* 15.3.1.3.1  */
    1111   mrb_define_method(mrb, krn, "!=",                         mrb_obj_not_equal_m,             MRB_ARGS_REQ(1));
    11121202  mrb_define_method(mrb, krn, "===",                        mrb_equal_m,                     MRB_ARGS_REQ(1));    /* 15.3.1.3.2  */
    1113   mrb_define_method(mrb, krn, "__id__",                     mrb_obj_id_m,                    MRB_ARGS_NONE());    /* 15.3.1.3.3  */
    1114   mrb_define_method(mrb, krn, "__send__",                   mrb_f_send,                      MRB_ARGS_ANY());     /* 15.3.1.3.4  */
    11151203  mrb_define_method(mrb, krn, "block_given?",               mrb_f_block_given_p_m,           MRB_ARGS_NONE());    /* 15.3.1.3.6  */
    11161204  mrb_define_method(mrb, krn, "class",                      mrb_obj_class_m,                 MRB_ARGS_NONE());    /* 15.3.1.3.7  */
     
    11201208  mrb_define_method(mrb, krn, "equal?",                     mrb_obj_equal_m,                 MRB_ARGS_REQ(1));    /* 15.3.1.3.11 */
    11211209  mrb_define_method(mrb, krn, "extend",                     mrb_obj_extend_m,                MRB_ARGS_ANY());     /* 15.3.1.3.13 */
     1210  mrb_define_method(mrb, krn, "freeze",                     mrb_obj_freeze,                  MRB_ARGS_NONE());
     1211  mrb_define_method(mrb, krn, "frozen?",                    mrb_obj_frozen,                  MRB_ARGS_NONE());
    11221212  mrb_define_method(mrb, krn, "global_variables",           mrb_f_global_variables,          MRB_ARGS_NONE());    /* 15.3.1.3.14 */
    11231213  mrb_define_method(mrb, krn, "hash",                       mrb_obj_hash,                    MRB_ARGS_NONE());    /* 15.3.1.3.15 */
    11241214  mrb_define_method(mrb, krn, "initialize_copy",            mrb_obj_init_copy,               MRB_ARGS_REQ(1));    /* 15.3.1.3.16 */
    11251215  mrb_define_method(mrb, krn, "inspect",                    mrb_obj_inspect,                 MRB_ARGS_NONE());    /* 15.3.1.3.17 */
    1126   mrb_define_method(mrb, krn, "instance_eval",              mrb_obj_instance_eval,           MRB_ARGS_ANY());     /* 15.3.1.3.18 */
    11271216  mrb_define_method(mrb, krn, "instance_of?",               obj_is_instance_of,              MRB_ARGS_REQ(1));    /* 15.3.1.3.19 */
    11281217  mrb_define_method(mrb, krn, "instance_variable_defined?", mrb_obj_ivar_defined,            MRB_ARGS_REQ(1));    /* 15.3.1.3.20 */
     
    11341223  mrb_define_method(mrb, krn, "kind_of?",                   mrb_obj_is_kind_of_m,            MRB_ARGS_REQ(1));    /* 15.3.1.3.26 */
    11351224  mrb_define_method(mrb, krn, "local_variables",            mrb_local_variables,             MRB_ARGS_NONE());    /* 15.3.1.3.28 */
     1225#ifdef MRB_DEFAULT_METHOD_MISSING
     1226  mrb_define_method(mrb, krn, "method_missing",             mrb_obj_missing,                 MRB_ARGS_ANY());     /* 15.3.1.3.30 */
     1227#endif
    11361228  mrb_define_method(mrb, krn, "methods",                    mrb_obj_methods_m,               MRB_ARGS_OPT(1));    /* 15.3.1.3.31 */
    11371229  mrb_define_method(mrb, krn, "nil?",                       mrb_false,                       MRB_ARGS_NONE());    /* 15.3.1.3.32 */
  • EcnlProtoTool/trunk/mruby-1.3.0/src/load.c

    r321 r331  
    88#include <stdlib.h>
    99#include <string.h>
    10 #include "mruby/dump.h"
    11 #include "mruby/irep.h"
    12 #include "mruby/proc.h"
    13 #include "mruby/string.h"
    14 #include "mruby/debug.h"
    15 #include "mruby/error.h"
     10#include <mruby/dump.h>
     11#include <mruby/irep.h>
     12#include <mruby/proc.h>
     13#include <mruby/string.h>
     14#include <mruby/debug.h>
     15#include <mruby/error.h>
    1616
    1717#if SIZE_MAX < UINT32_MAX
     
    524524    if (bigendian_p())
    525525      *flags |= FLAG_BYTEORDER_NATIVE;
    526     else 
     526    else
    527527      *flags |= FLAG_BYTEORDER_BIG;
    528528  }
     
    545545}
    546546
    547 MRB_API mrb_irep*
     547static mrb_irep*
    548548read_irep(mrb_state *mrb, const uint8_t *bin, uint8_t flags)
    549549{
     
    603603}
    604604
    605 MRB_API mrb_irep*
     605mrb_irep*
    606606mrb_read_irep(mrb_state *mrb, const uint8_t *bin)
    607607{
     
    615615}
    616616
     617void mrb_exc_set(mrb_state *mrb, mrb_value exc);
     618
    617619static void
    618620irep_error(mrb_state *mrb)
    619621{
    620   mrb->exc = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, E_SCRIPT_ERROR, "irep load error"));
     622  mrb_exc_set(mrb, mrb_exc_new_str_lit(mrb, E_SCRIPT_ERROR, "irep load error"));
    621623}
    622624
     
    634636  mrb_irep_decref(mrb, irep);
    635637  if (c && c->no_exec) return mrb_obj_value(proc);
    636   return mrb_toplevel_run(mrb, proc);
     638  return mrb_top_run(mrb, proc, mrb_top_self(mrb), 0);
    637639}
    638640
     
    645647#ifndef MRB_DISABLE_STDIO
    646648
    647 MRB_API mrb_irep*
     649mrb_irep*
    648650mrb_read_irep_file(mrb_state *mrb, FILE* fp)
    649651{
     
    696698  if (c && c->dump_result) mrb_codedump_all(mrb, proc);
    697699  if (c && c->no_exec) return mrb_obj_value(proc);
    698   val = mrb_toplevel_run(mrb, proc);
     700  val = mrb_top_run(mrb, proc, mrb_top_self(mrb), 0);
    699701  return val;
    700702}
  • EcnlProtoTool/trunk/mruby-1.3.0/src/mruby_core.rake

    r321 r331  
    55
    66  objs = Dir.glob("#{current_dir}/*.c").map { |f|
    7     next nil if cxx_abi_enabled? and f =~ /(error|vm).c$/
     7    next nil if cxx_exception_enabled? and f =~ /(error|vm).c$/
    88    objfile(f.pathmap("#{current_build_dir}/%n"))
    99  }.compact
    1010
    11   if cxx_abi_enabled?
     11  if cxx_exception_enabled?
    1212    objs += %w(vm error).map { |v| compile_as_cxx "#{current_dir}/#{v}.c", "#{current_build_dir}/#{v}.cxx" }
    1313  end
  • EcnlProtoTool/trunk/mruby-1.3.0/src/numeric.c

    r321 r331  
    1010#include <stdlib.h>
    1111
    12 #include "mruby.h"
    13 #include "mruby/array.h"
    14 #include "mruby/numeric.h"
    15 #include "mruby/string.h"
     12#include <mruby.h>
     13#include <mruby/array.h>
     14#include <mruby/numeric.h>
     15#include <mruby/string.h>
     16#include <mruby/class.h>
    1617
    1718#ifdef MRB_USE_FLOAT
     19#define trunc(f) truncf(f)
    1820#define floor(f) floorf(f)
    1921#define ceil(f) ceilf(f)
     
    5153{
    5254  mrb_value y;
    53   mrb_float d, yv;
    54 
    55   mrb_get_args(mrb, "o", &y);
    56   yv = mrb_to_flo(mrb, y);
    57   d = pow(mrb_to_flo(mrb, x), yv);
    58   if (mrb_fixnum_p(x) && mrb_fixnum_p(y) && FIXABLE(d) && yv > 0 &&
    59       (d < 0 || (d > 0 && (mrb_int)d > 0)))
    60     return mrb_fixnum_value((mrb_int)d);
     55  mrb_float d;
     56
     57  mrb_get_args(mrb, "o", &y);
     58  if (mrb_fixnum_p(x) && mrb_fixnum_p(y)) {
     59    /* try ipow() */
     60    mrb_int base = mrb_fixnum(x);
     61    mrb_int exp = mrb_fixnum(y);
     62    mrb_int result = 1;
     63
     64    if (exp < 0) goto float_pow;
     65    for (;;) {
     66      if (exp & 1) {
     67        if (mrb_int_mul_overflow(result, base, &result)) {
     68          goto float_pow;
     69        }
     70      }
     71      exp >>= 1;
     72      if (exp == 0) break;
     73      if (mrb_int_mul_overflow(base, base, &base)) {
     74        goto float_pow;
     75      }
     76    }
     77    return mrb_fixnum_value(result);
     78  }
     79 float_pow:
     80  d = pow(mrb_to_flo(mrb, x), mrb_to_flo(mrb, y));
    6181  return mrb_float_value(mrb, d);
    6282}
     
    272292}
    273293
     294static int64_t
     295value_int64(mrb_state *mrb, mrb_value x)
     296{
     297  switch (mrb_type(x)) {
     298  case MRB_TT_FIXNUM:
     299    return (int64_t)mrb_fixnum(x);
     300    break;
     301  case MRB_TT_FLOAT:
     302    return (int64_t)mrb_float(x);
     303  default:
     304    mrb_raise(mrb, E_TYPE_ERROR, "cannot convert to Integer");
     305    break;
     306  }
     307  /* not reached */
     308  return 0;
     309}
     310
     311static mrb_value
     312int64_value(mrb_state *mrb, int64_t v)
     313{
     314  if (FIXABLE(v)) {
     315    return mrb_fixnum_value((mrb_int)v);
     316  }
     317  return mrb_float_value(mrb, (mrb_float)v);
     318}
     319
     320static mrb_value
     321flo_rev(mrb_state *mrb, mrb_value x)
     322{
     323  int64_t v1;
     324  mrb_get_args(mrb, "");
     325  v1 = (int64_t)mrb_float(x);
     326  return int64_value(mrb, ~v1);
     327}
     328
     329static mrb_value
     330flo_and(mrb_state *mrb, mrb_value x)
     331{
     332  mrb_value y;
     333  int64_t v1, v2;
     334  mrb_get_args(mrb, "o", &y);
     335
     336  v1 = (int64_t)mrb_float(x);
     337  v2 = value_int64(mrb, y);
     338  return int64_value(mrb, v1 & v2);
     339}
     340
     341static mrb_value
     342flo_or(mrb_state *mrb, mrb_value x)
     343{
     344  mrb_value y;
     345  int64_t v1, v2;
     346  mrb_get_args(mrb, "o", &y);
     347
     348  v1 = (int64_t)mrb_float(x);
     349  v2 = value_int64(mrb, y);
     350  return int64_value(mrb, v1 | v2);
     351}
     352
     353static mrb_value
     354flo_xor(mrb_state *mrb, mrb_value x)
     355{
     356  mrb_value y;
     357  int64_t v1, v2;
     358  mrb_get_args(mrb, "o", &y);
     359
     360  v1 = (int64_t)mrb_float(x);
     361  v2 = value_int64(mrb, y);
     362  return int64_value(mrb, v1 ^ v2);
     363}
     364
     365static mrb_value
     366flo_shift(mrb_state *mrb, mrb_value x, mrb_int width)
     367{
     368  mrb_float val;
     369
     370  if (width == 0) {
     371    return x;
     372  }
     373  val = mrb_float(x);
     374  if (width < 0) {
     375    while (width++) {
     376      val /= 2;
     377    }
     378#if defined(_ISOC99_SOURCE)
     379    val = trunc(val);
     380#else
     381    val = val > 0 ? floor(val) : ceil(val);
     382#endif
     383    if (val == 0 && mrb_float(x) < 0) {
     384      return mrb_fixnum_value(-1);
     385    }
     386  }
     387  else {
     388    while (width--) {
     389      val *= 2;
     390    }
     391  }
     392  if (FIXABLE_FLOAT(val)) {
     393    return mrb_fixnum_value((mrb_int)val);
     394  }
     395  return mrb_float_value(mrb, val);
     396}
     397
     398static mrb_value
     399flo_lshift(mrb_state *mrb, mrb_value x)
     400{
     401  mrb_int width;
     402
     403  mrb_get_args(mrb, "i", &width);
     404  return flo_shift(mrb, x, -width);
     405}
     406
     407static mrb_value
     408flo_rshift(mrb_state *mrb, mrb_value x)
     409{
     410  mrb_int width;
     411
     412  mrb_get_args(mrb, "i", &width);
     413  return flo_shift(mrb, x, width);
     414}
     415
    274416/* 15.2.8.3.18 */
    275417/*
     
    285427  char *c;
    286428  size_t i;
    287   int hash;
     429  mrb_int hash;
    288430
    289431  d = (mrb_float)mrb_fixnum(num);
     
    291433  if (d == 0) d = 0.0;
    292434  c = (char*)&d;
    293   for (hash=0, i=0; i<sizeof(mrb_float);i++) {
     435  for (hash=0,i=0; i<sizeof(mrb_float); i++) {
    294436    hash = (hash * 971) ^ (unsigned char)c[i];
    295437  }
     
    351493{
    352494  return mrb_bool_value(isfinite(mrb_float(num)));
     495}
     496
     497void
     498mrb_check_num_exact(mrb_state *mrb, mrb_float num)
     499{
     500  if (isinf(num)) {
     501    mrb_raise(mrb, E_FLOATDOMAIN_ERROR, num < 0 ? "-Infinity" : "Infinity");
     502  }
     503  if (isnan(num)) {
     504    mrb_raise(mrb, E_FLOATDOMAIN_ERROR, "NaN");
     505  }
    353506}
    354507
     
    371524  mrb_float f = floor(mrb_float(num));
    372525
    373   if (!FIXABLE(f)) {
     526  mrb_check_num_exact(mrb, f);
     527  if (!FIXABLE_FLOAT(f)) {
    374528    return mrb_float_value(mrb, f);
    375529  }
     
    396550  mrb_float f = ceil(mrb_float(num));
    397551
    398   if (!FIXABLE(f)) {
     552  mrb_check_num_exact(mrb, f);
     553  if (!FIXABLE_FLOAT(f)) {
    399554    return mrb_float_value(mrb, f);
    400555  }
     
    443598  number = mrb_float(num);
    444599
    445   if (isinf(number)) {
    446     if (0 < ndigits) return num;
    447     else mrb_raise(mrb, E_FLOATDOMAIN_ERROR, number < 0 ? "-Infinity" : "Infinity");
    448   }
    449   if (isnan(number)) {
    450     if (0 < ndigits) return num;
    451     else mrb_raise(mrb, E_FLOATDOMAIN_ERROR, "NaN");
    452   }
     600  if (0 < ndigits && (isinf(number) || isnan(number))) {
     601    return num;
     602  }
     603  mrb_check_num_exact(mrb, number);
    453604
    454605  f = 1.0;
     
    506657  if (f < 0.0) f = ceil(f);
    507658
    508   if (!FIXABLE(f)) {
     659  mrb_check_num_exact(mrb, f);
     660  if (!FIXABLE_FLOAT(f)) {
    509661    return mrb_float_value(mrb, f);
    510662  }
     
    542694}
    543695
    544 /*tests if N*N would overflow*/
    545 #define SQRT_INT_MAX ((mrb_int)1<<((MRB_INT_BIT-1-MRB_FIXNUM_SHIFT)/2))
    546 #define FIT_SQRT_INT(n) (((n)<SQRT_INT_MAX)&&((n)>=-SQRT_INT_MAX))
    547 
    548696mrb_value
    549697mrb_fixnum_mul(mrb_state *mrb, mrb_value x, mrb_value y)
     
    553701  a = mrb_fixnum(x);
    554702  if (mrb_fixnum_p(y)) {
    555     mrb_float c;
    556     mrb_int b;
     703    mrb_int b, c;
    557704
    558705    if (a == 0) return x;
    559706    b = mrb_fixnum(y);
    560     if (FIT_SQRT_INT(a) && FIT_SQRT_INT(b))
    561       return mrb_fixnum_value(a*b);
    562     c = a * b;
    563     if ((a != 0 && c/a != b) || !FIXABLE(c)) {
    564       return mrb_float_value(mrb, (mrb_float)a*(mrb_float)b);
    565     }
    566     return mrb_fixnum_value((mrb_int)c);
     707    if (mrb_int_mul_overflow(a, b, &c)) {
     708      return mrb_float_value(mrb, (mrb_float)a * (mrb_float)b);
     709    }
     710    return mrb_fixnum_value(c);
    567711  }
    568712  return mrb_float_value(mrb, (mrb_float)a * mrb_to_flo(mrb, y));
     
    747891}
    748892
    749 static mrb_value
    750 bit_coerce(mrb_state *mrb, mrb_value x)
    751 {
    752   while (!mrb_fixnum_p(x)) {
    753     if (mrb_float_p(x)) {
    754       mrb_raise(mrb, E_TYPE_ERROR, "can't convert Float into Integer");
    755     }
    756     x = mrb_to_int(mrb, x);
    757   }
    758   return x;
    759 }
     893static mrb_value flo_and(mrb_state *mrb, mrb_value x);
     894static mrb_value flo_or(mrb_state *mrb, mrb_value x);
     895static mrb_value flo_xor(mrb_state *mrb, mrb_value x);
     896#define bit_op(x,y,op1,op2) do {\
     897  if (mrb_fixnum_p(y)) return mrb_fixnum_value(mrb_fixnum(x) op2 mrb_fixnum(y));\
     898  return flo_ ## op1(mrb, mrb_float_value(mrb, mrb_fixnum(x)));\
     899} while(0)
    760900
    761901/* 15.2.8.3.9  */
     
    773913
    774914  mrb_get_args(mrb, "o", &y);
    775 
    776   y = bit_coerce(mrb, y);
    777   return mrb_fixnum_value(mrb_fixnum(x) & mrb_fixnum(y));
     915  bit_op(x, y, and, &);
    778916}
    779917
     
    792930
    793931  mrb_get_args(mrb, "o", &y);
    794 
    795   y = bit_coerce(mrb, y);
    796   return mrb_fixnum_value(mrb_fixnum(x) | mrb_fixnum(y));
     932  bit_op(x, y, or, |);
    797933}
    798934
     
    811947
    812948  mrb_get_args(mrb, "o", &y);
    813 
    814   y = bit_coerce(mrb, y);
    815   return mrb_fixnum_value(mrb_fixnum(x) ^ mrb_fixnum(y));
     949  bit_op(x, y, or, ^);
    816950}
    817951
     
    821955lshift(mrb_state *mrb, mrb_int val, mrb_int width)
    822956{
    823   mrb_assert(width > 0);
    824   if (width > NUMERIC_SHIFT_WIDTH_MAX) {
     957  if (width < 0) {              /* mrb_int overflow */
     958    return mrb_float_value(mrb, INFINITY);
     959  }
     960  if (val > 0) {
     961    if ((width > NUMERIC_SHIFT_WIDTH_MAX) ||
     962        (val   > (MRB_INT_MAX >> width))) {
     963      goto bit_overflow;
     964    }
     965  }
     966  else {
     967    if ((width > NUMERIC_SHIFT_WIDTH_MAX) ||
     968        (val   < (MRB_INT_MIN >> width))) {
     969      goto bit_overflow;
     970    }
     971  }
     972
     973  return mrb_fixnum_value(val << width);
     974
     975bit_overflow:
     976  {
    825977    mrb_float f = (mrb_float)val;
    826978    while (width--) {
     
    829981    return mrb_float_value(mrb, f);
    830982  }
    831   return mrb_fixnum_value(val << width);
    832983}
    833984
     
    835986rshift(mrb_int val, mrb_int width)
    836987{
    837   mrb_assert(width > 0);
     988  if (width < 0) {              /* mrb_int overflow */
     989    return mrb_fixnum_value(0);
     990  }
    838991  if (width >= NUMERIC_SHIFT_WIDTH_MAX) {
    839992    if (val < 0) {
     
    845998}
    846999
    847 static inline void
    848 fix_shift_get_width(mrb_state *mrb, mrb_int *width)
    849 {
    850   mrb_value y;
    851 
    852   mrb_get_args(mrb, "o", &y);
    853   *width = mrb_fixnum(bit_coerce(mrb, y));
    854 }
    855 
    8561000/* 15.2.8.3.12 */
    8571001/*
     
    8671011  mrb_int width, val;
    8681012
    869   fix_shift_get_width(mrb, &width);
    870 
     1013  mrb_get_args(mrb, "i", &width);
    8711014  if (width == 0) {
    8721015    return x;
    8731016  }
    8741017  val = mrb_fixnum(x);
     1018  if (val == 0) return x;
    8751019  if (width < 0) {
    8761020    return rshift(val, -width);
     
    8921036  mrb_int width, val;
    8931037
    894   fix_shift_get_width(mrb, &width);
    895 
     1038  mrb_get_args(mrb, "i", &width);
    8961039  if (width == 0) {
    8971040    return x;
    8981041  }
    8991042  val = mrb_fixnum(x);
     1043  if (val == 0) return x;
    9001044  if (width < 0) {
    9011045    return lshift(mrb, val, -width);
     
    9361080mrb_flo_to_fixnum(mrb_state *mrb, mrb_value x)
    9371081{
    938   mrb_int z;
     1082  mrb_int z = 0;
    9391083
    9401084  if (!mrb_float_p(x)) {
     
    9511095      mrb_raise(mrb, E_FLOATDOMAIN_ERROR, "NaN");
    9521096    }
    953     z = (mrb_int)d;
     1097    if (FIXABLE_FLOAT(d)) {
     1098      z = (mrb_int)d;
     1099    }
     1100    else {
     1101      mrb_raisef(mrb, E_ARGUMENT_ERROR, "number (%S) too big for integer", x);
     1102    }
    9541103  }
    9551104  return mrb_fixnum_value(z);
     
    11501299  numeric = mrb_define_class(mrb, "Numeric",  mrb->object_class);                /* 15.2.7 */
    11511300
    1152   mrb_define_method(mrb, numeric, "**",       num_pow,        MRB_ARGS_REQ(1));
    1153   mrb_define_method(mrb, numeric, "/",        num_div,        MRB_ARGS_REQ(1)); /* 15.2.8.3.4  */
    1154   mrb_define_method(mrb, numeric, "quo",      num_div,        MRB_ARGS_REQ(1)); /* 15.2.7.4.5 (x) */
    1155   mrb_define_method(mrb, numeric, "<=>",      num_cmp,        MRB_ARGS_REQ(1)); /* 15.2.9.3.6  */
     1301  mrb_define_method(mrb, numeric, "**",       num_pow,         MRB_ARGS_REQ(1));
     1302  mrb_define_method(mrb, numeric, "/",        num_div,         MRB_ARGS_REQ(1)); /* 15.2.8.3.4  */
     1303  mrb_define_method(mrb, numeric, "quo",      num_div,         MRB_ARGS_REQ(1)); /* 15.2.7.4.5 (x) */
     1304  mrb_define_method(mrb, numeric, "<=>",      num_cmp,         MRB_ARGS_REQ(1)); /* 15.2.9.3.6  */
    11561305
    11571306  /* Integer Class */
    11581307  integer = mrb_define_class(mrb, "Integer",  numeric);                          /* 15.2.8 */
     1308  MRB_SET_INSTANCE_TT(integer, MRB_TT_FIXNUM);
    11591309  mrb_undef_class_method(mrb, integer, "new");
    1160   mrb_define_method(mrb, integer, "to_i", int_to_i, MRB_ARGS_NONE());            /* 15.2.8.3.24 */
    1161   mrb_define_method(mrb, integer, "to_int", int_to_i, MRB_ARGS_NONE());
     1310  mrb_define_method(mrb, integer, "to_i",     int_to_i,        MRB_ARGS_NONE()); /* 15.2.8.3.24 */
     1311  mrb_define_method(mrb, integer, "to_int",   int_to_i,        MRB_ARGS_NONE());
     1312  mrb_define_method(mrb, integer, "ceil",     int_to_i,        MRB_ARGS_REQ(1)); /* 15.2.8.3.8 (x) */
     1313  mrb_define_method(mrb, integer, "floor",    int_to_i,        MRB_ARGS_REQ(1)); /* 15.2.8.3.10 (x) */
     1314  mrb_define_method(mrb, integer, "round",    int_to_i,        MRB_ARGS_REQ(1)); /* 15.2.8.3.12 (x) */
     1315  mrb_define_method(mrb, integer, "truncate", int_to_i,        MRB_ARGS_REQ(1)); /* 15.2.8.3.15 (x) */
    11621316
    11631317  /* Fixnum Class */
    11641318  mrb->fixnum_class = fixnum = mrb_define_class(mrb, "Fixnum", integer);
    1165   mrb_define_method(mrb, fixnum,  "+",        fix_plus,          MRB_ARGS_REQ(1)); /* 15.2.8.3.1  */
    1166   mrb_define_method(mrb, fixnum,  "-",        fix_minus,         MRB_ARGS_REQ(1)); /* 15.2.8.3.2  */
    1167   mrb_define_method(mrb, fixnum,  "*",        fix_mul,           MRB_ARGS_REQ(1)); /* 15.2.8.3.3  */
    1168   mrb_define_method(mrb, fixnum,  "%",        fix_mod,           MRB_ARGS_REQ(1)); /* 15.2.8.3.5  */
    1169   mrb_define_method(mrb, fixnum,  "==",       fix_equal,         MRB_ARGS_REQ(1)); /* 15.2.8.3.7  */
    1170   mrb_define_method(mrb, fixnum,  "~",        fix_rev,           MRB_ARGS_NONE()); /* 15.2.8.3.8  */
    1171   mrb_define_method(mrb, fixnum,  "&",        fix_and,           MRB_ARGS_REQ(1)); /* 15.2.8.3.9  */
    1172   mrb_define_method(mrb, fixnum,  "|",        fix_or,            MRB_ARGS_REQ(1)); /* 15.2.8.3.10 */
    1173   mrb_define_method(mrb, fixnum,  "^",        fix_xor,           MRB_ARGS_REQ(1)); /* 15.2.8.3.11 */
    1174   mrb_define_method(mrb, fixnum,  "<<",       fix_lshift,        MRB_ARGS_REQ(1)); /* 15.2.8.3.12 */
    1175   mrb_define_method(mrb, fixnum,  ">>",       fix_rshift,        MRB_ARGS_REQ(1)); /* 15.2.8.3.13 */
    1176   mrb_define_method(mrb, fixnum,  "eql?",     fix_eql,           MRB_ARGS_REQ(1)); /* 15.2.8.3.16 */
    1177   mrb_define_method(mrb, fixnum,  "hash",     flo_hash,          MRB_ARGS_NONE()); /* 15.2.8.3.18 */
    1178   mrb_define_method(mrb, fixnum,  "to_f",     fix_to_f,          MRB_ARGS_NONE()); /* 15.2.8.3.23 */
    1179   mrb_define_method(mrb, fixnum,  "to_s",     fix_to_s,          MRB_ARGS_NONE()); /* 15.2.8.3.25 */
    1180   mrb_define_method(mrb, fixnum,  "inspect",  fix_to_s,          MRB_ARGS_NONE());
    1181   mrb_define_method(mrb, fixnum,  "divmod",   fix_divmod,        MRB_ARGS_REQ(1)); /* 15.2.8.3.30 (x) */
     1319  mrb_define_method(mrb, fixnum,  "+",        fix_plus,        MRB_ARGS_REQ(1)); /* 15.2.8.3.1  */
     1320  mrb_define_method(mrb, fixnum,  "-",        fix_minus,       MRB_ARGS_REQ(1)); /* 15.2.8.3.2  */
     1321  mrb_define_method(mrb, fixnum,  "*",        fix_mul,         MRB_ARGS_REQ(1)); /* 15.2.8.3.3  */
     1322  mrb_define_method(mrb, fixnum,  "%",        fix_mod,         MRB_ARGS_REQ(1)); /* 15.2.8.3.5  */
     1323  mrb_define_method(mrb, fixnum,  "==",       fix_equal,       MRB_ARGS_REQ(1)); /* 15.2.8.3.7  */
     1324  mrb_define_method(mrb, fixnum,  "~",        fix_rev,         MRB_ARGS_NONE()); /* 15.2.8.3.8  */
     1325  mrb_define_method(mrb, fixnum,  "&",        fix_and,         MRB_ARGS_REQ(1)); /* 15.2.8.3.9  */
     1326  mrb_define_method(mrb, fixnum,  "|",        fix_or,          MRB_ARGS_REQ(1)); /* 15.2.8.3.10 */
     1327  mrb_define_method(mrb, fixnum,  "^",        fix_xor,         MRB_ARGS_REQ(1)); /* 15.2.8.3.11 */
     1328  mrb_define_method(mrb, fixnum,  "<<",       fix_lshift,      MRB_ARGS_REQ(1)); /* 15.2.8.3.12 */
     1329  mrb_define_method(mrb, fixnum,  ">>",       fix_rshift,      MRB_ARGS_REQ(1)); /* 15.2.8.3.13 */
     1330  mrb_define_method(mrb, fixnum,  "eql?",     fix_eql,         MRB_ARGS_REQ(1)); /* 15.2.8.3.16 */
     1331  mrb_define_method(mrb, fixnum,  "hash",     flo_hash,        MRB_ARGS_NONE()); /* 15.2.8.3.18 */
     1332  mrb_define_method(mrb, fixnum,  "to_f",     fix_to_f,        MRB_ARGS_NONE()); /* 15.2.8.3.23 */
     1333  mrb_define_method(mrb, fixnum,  "to_s",     fix_to_s,        MRB_ARGS_NONE()); /* 15.2.8.3.25 */
     1334  mrb_define_method(mrb, fixnum,  "inspect",  fix_to_s,        MRB_ARGS_NONE());
     1335  mrb_define_method(mrb, fixnum,  "divmod",   fix_divmod,      MRB_ARGS_REQ(1)); /* 15.2.8.3.30 (x) */
    11821336
    11831337  /* Float Class */
    11841338  mrb->float_class = fl = mrb_define_class(mrb, "Float", numeric);                 /* 15.2.9 */
     1339  MRB_SET_INSTANCE_TT(fl, MRB_TT_FLOAT);
    11851340  mrb_undef_class_method(mrb,  fl, "new");
    1186   mrb_define_method(mrb, fl,      "+",         flo_plus,         MRB_ARGS_REQ(1)); /* 15.2.9.3.1  */
    1187   mrb_define_method(mrb, fl,      "-",         flo_minus,        MRB_ARGS_REQ(1)); /* 15.2.9.3.2  */
    1188   mrb_define_method(mrb, fl,      "*",         flo_mul,          MRB_ARGS_REQ(1)); /* 15.2.9.3.3  */
    1189   mrb_define_method(mrb, fl,      "%",         flo_mod,          MRB_ARGS_REQ(1)); /* 15.2.9.3.5  */
    1190   mrb_define_method(mrb, fl,      "==",        flo_eq,           MRB_ARGS_REQ(1)); /* 15.2.9.3.7  */
    1191   mrb_define_method(mrb, fl,      "ceil",      flo_ceil,         MRB_ARGS_NONE()); /* 15.2.9.3.8  */
    1192   mrb_define_method(mrb, fl,      "finite?",   flo_finite_p,     MRB_ARGS_NONE()); /* 15.2.9.3.9  */
    1193   mrb_define_method(mrb, fl,      "floor",     flo_floor,        MRB_ARGS_NONE()); /* 15.2.9.3.10 */
    1194   mrb_define_method(mrb, fl,      "infinite?", flo_infinite_p,   MRB_ARGS_NONE()); /* 15.2.9.3.11 */
    1195   mrb_define_method(mrb, fl,      "round",     flo_round,        MRB_ARGS_OPT(1)); /* 15.2.9.3.12 */
    1196   mrb_define_method(mrb, fl,      "to_f",      flo_to_f,         MRB_ARGS_NONE()); /* 15.2.9.3.13 */
    1197   mrb_define_method(mrb, fl,      "to_i",      flo_truncate,     MRB_ARGS_NONE()); /* 15.2.9.3.14 */
    1198   mrb_define_method(mrb, fl,      "to_int",    flo_truncate,     MRB_ARGS_NONE());
    1199   mrb_define_method(mrb, fl,      "truncate",  flo_truncate,     MRB_ARGS_NONE()); /* 15.2.9.3.15 */
    1200   mrb_define_method(mrb, fl,      "divmod",    flo_divmod,       MRB_ARGS_REQ(1));
    1201   mrb_define_method(mrb, fl,      "eql?",      flo_eql,          MRB_ARGS_REQ(1)); /* 15.2.8.3.16 */
    1202 
    1203   mrb_define_method(mrb, fl,      "to_s",      flo_to_s,         MRB_ARGS_NONE()); /* 15.2.9.3.16(x) */
    1204   mrb_define_method(mrb, fl,      "inspect",   flo_to_s,         MRB_ARGS_NONE());
    1205   mrb_define_method(mrb, fl,      "nan?",      flo_nan_p,        MRB_ARGS_NONE());
     1341  mrb_define_method(mrb, fl,      "+",         flo_plus,       MRB_ARGS_REQ(1)); /* 15.2.9.3.1  */
     1342  mrb_define_method(mrb, fl,      "-",         flo_minus,      MRB_ARGS_REQ(1)); /* 15.2.9.3.2  */
     1343  mrb_define_method(mrb, fl,      "*",         flo_mul,        MRB_ARGS_REQ(1)); /* 15.2.9.3.3  */
     1344  mrb_define_method(mrb, fl,      "%",         flo_mod,        MRB_ARGS_REQ(1)); /* 15.2.9.3.5  */
     1345  mrb_define_method(mrb, fl,      "==",        flo_eq,         MRB_ARGS_REQ(1)); /* 15.2.9.3.7  */
     1346  mrb_define_method(mrb, fl,      "~",         flo_rev,        MRB_ARGS_NONE());
     1347  mrb_define_method(mrb, fl,      "&",         flo_and,        MRB_ARGS_REQ(1));
     1348  mrb_define_method(mrb, fl,      "|",         flo_or,         MRB_ARGS_REQ(1));
     1349  mrb_define_method(mrb, fl,      "^",         flo_xor,        MRB_ARGS_REQ(1));
     1350  mrb_define_method(mrb, fl,      ">>",        flo_lshift,     MRB_ARGS_REQ(1));
     1351  mrb_define_method(mrb, fl,      "<<",        flo_rshift,     MRB_ARGS_REQ(1));
     1352  mrb_define_method(mrb, fl,      "ceil",      flo_ceil,       MRB_ARGS_NONE()); /* 15.2.9.3.8  */
     1353  mrb_define_method(mrb, fl,      "finite?",   flo_finite_p,   MRB_ARGS_NONE()); /* 15.2.9.3.9  */
     1354  mrb_define_method(mrb, fl,      "floor",     flo_floor,      MRB_ARGS_NONE()); /* 15.2.9.3.10 */
     1355  mrb_define_method(mrb, fl,      "infinite?", flo_infinite_p, MRB_ARGS_NONE()); /* 15.2.9.3.11 */
     1356  mrb_define_method(mrb, fl,      "round",     flo_round,      MRB_ARGS_OPT(1)); /* 15.2.9.3.12 */
     1357  mrb_define_method(mrb, fl,      "to_f",      flo_to_f,       MRB_ARGS_NONE()); /* 15.2.9.3.13 */
     1358  mrb_define_method(mrb, fl,      "to_i",      flo_truncate,   MRB_ARGS_NONE()); /* 15.2.9.3.14 */
     1359  mrb_define_method(mrb, fl,      "to_int",    flo_truncate,   MRB_ARGS_NONE());
     1360  mrb_define_method(mrb, fl,      "truncate",  flo_truncate,   MRB_ARGS_NONE()); /* 15.2.9.3.15 */
     1361  mrb_define_method(mrb, fl,      "divmod",    flo_divmod,     MRB_ARGS_REQ(1));
     1362  mrb_define_method(mrb, fl,      "eql?",      flo_eql,        MRB_ARGS_REQ(1)); /* 15.2.8.3.16 */
     1363
     1364  mrb_define_method(mrb, fl,      "to_s",      flo_to_s,       MRB_ARGS_NONE()); /* 15.2.9.3.16(x) */
     1365  mrb_define_method(mrb, fl,      "inspect",   flo_to_s,       MRB_ARGS_NONE());
     1366  mrb_define_method(mrb, fl,      "nan?",      flo_nan_p,      MRB_ARGS_NONE());
    12061367
    12071368#ifdef INFINITY
  • EcnlProtoTool/trunk/mruby-1.3.0/src/object.c

    r321 r331  
    55*/
    66
    7 #include "mruby.h"
    8 #include "mruby/class.h"
    9 #include "mruby/numeric.h"
    10 #include "mruby/string.h"
     7#include <mruby.h>
     8#include <mruby/class.h>
     9#include <mruby/numeric.h>
     10#include <mruby/string.h>
     11#include <mruby/class.h>
    1112
    1213MRB_API mrb_bool
     
    266267
    267268  mrb->nil_class   = n = mrb_define_class(mrb, "NilClass",   mrb->object_class);
     269  MRB_SET_INSTANCE_TT(n, MRB_TT_TRUE);
    268270  mrb_undef_class_method(mrb, n, "new");
    269271  mrb_define_method(mrb, n, "&",    false_and,      MRB_ARGS_REQ(1));  /* 15.2.4.3.1  */
     
    275277
    276278  mrb->true_class  = t = mrb_define_class(mrb, "TrueClass",  mrb->object_class);
     279  MRB_SET_INSTANCE_TT(t, MRB_TT_TRUE);
    277280  mrb_undef_class_method(mrb, t, "new");
    278281  mrb_define_method(mrb, t, "&",    true_and,       MRB_ARGS_REQ(1));  /* 15.2.5.3.1  */
     
    283286
    284287  mrb->false_class = f = mrb_define_class(mrb, "FalseClass", mrb->object_class);
     288  MRB_SET_INSTANCE_TT(f, MRB_TT_TRUE);
    285289  mrb_undef_class_method(mrb, f, "new");
    286290  mrb_define_method(mrb, f, "&",    false_and,      MRB_ARGS_REQ(1));  /* 15.2.6.3.1  */
     
    349353  mrb_value v;
    350354
    351   if (mrb_type(val) == type && type != MRB_TT_DATA) return val;
     355  if (mrb_type(val) == type && type != MRB_TT_DATA && type != MRB_TT_ISTRUCT) return val;
    352356  v = convert_type(mrb, val, tname, method, FALSE);
    353357  if (mrb_nil_p(v) || mrb_type(v) != type) return mrb_nil_value();
     
    381385/*    {MRB_TT_NODE,  "Node"}, */ /* internal use: syntax tree node */
    382386/*    {MRB_TT_UNDEF,  "undef"}, */ /* internal use: #undef; should not happen */
    383     {-1,  0}
     387  {MRB_TT_MAXDEFINE,  0}
    384388};
    385389
     
    391395
    392396  xt = mrb_type(x);
    393   if ((xt != t) || (xt == MRB_TT_DATA)) {
     397  if ((xt != t) || (xt == MRB_TT_DATA) || (xt == MRB_TT_ISTRUCT)) {
    394398    while (type->type < MRB_TT_MAXDEFINE) {
    395399      if (type->type == t) {
     
    441445  mrb_str_cat_cstr(mrb, str, cname);
    442446  mrb_str_cat_lit(mrb, str, ":");
    443   mrb_str_concat(mrb, str, mrb_ptr_to_str(mrb, mrb_cptr(obj)));
     447  mrb_str_concat(mrb, str, mrb_ptr_to_str(mrb, mrb_ptr(obj)));
    444448  mrb_str_cat_lit(mrb, str, ">");
    445449
     
    482486    case MRB_TT_CLASS:
    483487    case MRB_TT_ICLASS:
     488    case MRB_TT_SCLASS:
    484489      break;
    485490
     
    530535    case MRB_TT_FLOAT:
    531536      if (base != 0) goto arg_error;
    532       if (FIXABLE(mrb_float(val))) {
    533         break;
     537      else {
     538        mrb_float f = mrb_float(val);
     539        if (FIXABLE_FLOAT(f)) {
     540          break;
     541        }
    534542      }
    535543      return mrb_flo_to_fixnum(mrb, val);
     
    549557    tmp = mrb_check_string_type(mrb, val);
    550558    if (!mrb_nil_p(tmp)) {
     559      val = tmp;
    551560      goto string_conv;
    552561    }
  • EcnlProtoTool/trunk/mruby-1.3.0/src/opcode.h

    r321 r331  
    11/* this header file is to be removed soon. */
    2 #include "mruby/opcode.h"
     2#include <mruby/opcode.h>
  • EcnlProtoTool/trunk/mruby-1.3.0/src/pool.c

    r321 r331  
    88#include <stdint.h>
    99#include <string.h>
    10 #include "mruby.h"
     10#include <mruby.h>
    1111
    1212/* configuration section */
     
    1414/* or undef it if alignment does not matter */
    1515#ifndef POOL_ALIGNMENT
     16#if INTPTR_MAX == INT64_MAX
     17#define POOL_ALIGNMENT 8
     18#else
    1619#define POOL_ALIGNMENT 4
     20#endif
    1721#endif
    1822/* page size of memory pool */
  • EcnlProtoTool/trunk/mruby-1.3.0/src/print.c

    r321 r331  
    55*/
    66
    7 #include "mruby.h"
    8 #include "mruby/string.h"
    9 #include "mruby/variable.h"
     7#include <mruby.h>
     8#include <mruby/string.h>
     9#include <mruby/variable.h>
    1010
    1111#ifndef MRB_DISABLE_STDIO
  • EcnlProtoTool/trunk/mruby-1.3.0/src/proc.c

    r321 r331  
    55*/
    66
    7 #include "mruby.h"
    8 #include "mruby/class.h"
    9 #include "mruby/proc.h"
    10 #include "mruby/opcode.h"
     7#include <mruby.h>
     8#include <mruby/class.h>
     9#include <mruby/proc.h>
     10#include <mruby/opcode.h>
    1111
    1212static mrb_code call_iseq[] = {
     
    4242  e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, (struct RClass*)mrb->c->ci->proc->env);
    4343  MRB_SET_ENV_STACK_LEN(e, nlocals);
    44   e->mid = mrb->c->ci->mid;
     44  e->cxt.c = mrb->c;
    4545  e->cioff = mrb->c->ci - mrb->c->cibase;
    4646  e->stack = mrb->c->stack;
     
    6262  }
    6363  p->env = e;
     64  mrb_field_write_barrier(mrb, (struct RBasic *)p, (struct RBasic *)p->env);
    6465}
    6566
     
    136137}
    137138
    138 MRB_API void
     139void
    139140mrb_proc_copy(struct RProc *a, struct RProc *b)
    140141{
    141142  a->flags = b->flags;
    142143  a->body = b->body;
    143   if (!MRB_PROC_CFUNC_P(a)) {
     144  if (!MRB_PROC_CFUNC_P(a) && a->body.irep) {
    144145    a->body.irep->refcnt++;
    145146  }
     
    149150
    150151static mrb_value
    151 mrb_proc_initialize(mrb_state *mrb, mrb_value self)
     152mrb_proc_s_new(mrb_state *mrb, mrb_value proc_class)
    152153{
    153154  mrb_value blk;
     155  mrb_value proc;
     156  struct RProc *p;
    154157
    155158  mrb_get_args(mrb, "&", &blk);
     
    158161    mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block");
    159162  }
    160   else {
    161     mrb_proc_copy(mrb_proc_ptr(self), mrb_proc_ptr(blk));
    162   }
    163   return self;
     163  p = (struct RProc *)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb_class_ptr(proc_class));
     164  mrb_proc_copy(p, mrb_proc_ptr(blk));
     165  proc = mrb_obj_value(p);
     166  mrb_funcall_with_block(mrb, proc, mrb_intern_lit(mrb, "initialize"), 0, NULL, blk);
     167  return proc;
    164168}
    165169
     
    189193}
    190194
    191 mrb_code*
    192 mrb_proc_iseq(mrb_state *mrb, struct RProc *p)
    193 {
    194   return p->body.irep->iseq;
    195 }
    196 
    197195/* 15.2.17.4.2 */
    198196static mrb_value
     
    200198{
    201199  struct RProc *p = mrb_proc_ptr(self);
    202   mrb_code *iseq = mrb_proc_iseq(mrb, p);
     200  struct mrb_irep *irep;
     201  mrb_code *iseq;
    203202  mrb_aspec aspec;
    204203  int ma, op, ra, pa, arity;
     
    209208  }
    210209
     210  irep = p->body.irep;
     211  if (!irep) {
     212    return mrb_fixnum_value(0);
     213  }
     214
     215  iseq = irep->iseq;
    211216  /* arity is depend on OP_ENTER */
    212217  if (GET_OPCODE(*iseq) != OP_ENTER) {
     
    267272  call_irep->iseq = call_iseq;
    268273  call_irep->ilen = 1;
    269 
    270   mrb_define_method(mrb, mrb->proc_class, "initialize", mrb_proc_initialize, MRB_ARGS_NONE());
     274  call_irep->nregs = 2;         /* receiver and block */
     275
     276  mrb_define_class_method(mrb, mrb->proc_class, "new", mrb_proc_s_new, MRB_ARGS_ANY());
    271277  mrb_define_method(mrb, mrb->proc_class, "initialize_copy", mrb_proc_init_copy, MRB_ARGS_REQ(1));
    272278  mrb_define_method(mrb, mrb->proc_class, "arity", mrb_proc_arity, MRB_ARGS_NONE());
  • EcnlProtoTool/trunk/mruby-1.3.0/src/range.c

    r321 r331  
    55*/
    66
    7 #include "mruby.h"
    8 #include "mruby/class.h"
    9 #include "mruby/range.h"
    10 #include "mruby/string.h"
    11 #include "mruby/array.h"
     7#include <mruby.h>
     8#include <mruby/class.h>
     9#include <mruby/range.h>
     10#include <mruby/string.h>
     11#include <mruby/array.h>
    1212
    1313#define RANGE_CLASS (mrb_class_get(mrb, "Range"))
     14
     15MRB_API struct RRange*
     16mrb_range_ptr(mrb_state *mrb, mrb_value v)
     17{
     18  struct RRange *r = (struct RRange*)mrb_ptr(v);
     19
     20  if (r->edges == NULL) {
     21    mrb_raise(mrb, E_ARGUMENT_ERROR, "uninitialized range");
     22  }
     23  return r;
     24}
    1425
    1526static void
     
    5869mrb_range_beg(mrb_state *mrb, mrb_value range)
    5970{
    60   struct RRange *r = mrb_range_ptr(range);
     71  struct RRange *r = mrb_range_ptr(mrb, range);
    6172
    6273  return r->edges->beg;
     
    7788mrb_range_end(mrb_state *mrb, mrb_value range)
    7889{
    79   struct RRange *r = mrb_range_ptr(range);
     90  struct RRange *r = mrb_range_ptr(mrb, range);
    8091
    8192  return r->edges->end;
     
    91102mrb_range_excl(mrb_state *mrb, mrb_value range)
    92103{
    93   struct RRange *r = mrb_range_ptr(range);
     104  struct RRange *r = mrb_range_ptr(mrb, range);
    94105
    95106  return mrb_bool_value(r->excl);
     
    99110range_init(mrb_state *mrb, mrb_value range, mrb_value beg, mrb_value end, mrb_bool exclude_end)
    100111{
    101   struct RRange *r = mrb_range_ptr(range);
     112  struct RRange *r = mrb_range_raw_ptr(range);
    102113
    103114  range_check(mrb, beg, end);
     
    130141  }
    131142  /* Ranges are immutable, so that they should be initialized only once. */
     143  if (mrb_range_raw_ptr(range)->edges) {
     144    mrb_name_error(mrb, mrb_intern_lit(mrb, "initialize"), "`initialize' called twice");
     145  }
    132146  range_init(mrb, range, beg, end, exclusive);
    133147  return range;
     
    153167  struct RRange *rr;
    154168  struct RRange *ro;
    155   mrb_value obj;
     169  mrb_value obj, v1, v2;
    156170
    157171  mrb_get_args(mrb, "o", &obj);
     
    162176  }
    163177
    164   rr = mrb_range_ptr(range);
    165   ro = mrb_range_ptr(obj);
    166   if (!mrb_bool(mrb_funcall(mrb, rr->edges->beg, "==", 1, ro->edges->beg)) ||
    167       !mrb_bool(mrb_funcall(mrb, rr->edges->end, "==", 1, ro->edges->end)) ||
    168       rr->excl != ro->excl) {
     178  rr = mrb_range_ptr(mrb, range);
     179  ro = mrb_range_ptr(mrb, obj);
     180  v1 = mrb_funcall(mrb, rr->edges->beg, "==", 1, ro->edges->beg);
     181  v2 = mrb_funcall(mrb, rr->edges->end, "==", 1, ro->edges->end);
     182  if (!mrb_bool(v1) || !mrb_bool(v2) || rr->excl != ro->excl) {
    169183    return mrb_false_value();
    170184  }
     
    220234{
    221235  mrb_value val;
    222   struct RRange *r = mrb_range_ptr(range);
     236  struct RRange *r = mrb_range_ptr(mrb, range);
    223237  mrb_value beg, end;
    224238  mrb_bool include_p;
     
    228242  beg = r->edges->beg;
    229243  end = r->edges->end;
    230   include_p = r_le(mrb, beg, val) && /* beg <= val */
    231               ((r->excl && r_gt(mrb, end, val)) || /* end >  val */
    232               (r_ge(mrb, end, val))); /* end >= val */
     244  include_p = r_le(mrb, beg, val) &&           /* beg <= val */
     245              (r->excl ? r_gt(mrb, end, val)  /* end >  val */
     246                       : r_ge(mrb, end, val)); /* end >= val */
    233247
    234248  return mrb_bool_value(include_p);
    235249}
    236250
    237 static mrb_bool
    238 range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len, mrb_bool trunc)
     251MRB_API mrb_int
     252mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len, mrb_bool trunc)
    239253{
    240254  mrb_int beg, end;
    241   struct RRange *r = mrb_range_ptr(range);
    242 
    243   if (mrb_type(range) != MRB_TT_RANGE) return FALSE;
     255  struct RRange *r;
     256
     257  if (mrb_type(range) != MRB_TT_RANGE) return 0;
     258  r = mrb_range_ptr(mrb, range);
    244259
    245260  beg = mrb_int(mrb, r->edges->beg);
     
    248263  if (beg < 0) {
    249264    beg += len;
    250     if (beg < 0) return FALSE;
     265    if (beg < 0) return 2;
    251266  }
    252267
    253268  if (trunc) {
    254     if (beg > len) return FALSE;
     269    if (beg > len) return 2;
    255270    if (end > len) end = len;
    256271  }
     
    264279  *begp = beg;
    265280  *lenp = len;
    266   return TRUE;
    267 }
    268 
    269 MRB_API mrb_bool
    270 mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len)
    271 {
    272   return range_beg_len(mrb, range, begp, lenp, len, TRUE);
     281  return 1;
    273282}
    274283
     
    285294{
    286295  mrb_value str, str2;
    287   struct RRange *r = mrb_range_ptr(range);
     296  struct RRange *r = mrb_range_ptr(mrb, range);
    288297
    289298  str  = mrb_obj_as_string(mrb, r->edges->beg);
     
    310319{
    311320  mrb_value str, str2;
    312   struct RRange *r = mrb_range_ptr(range);
     321  struct RRange *r = mrb_range_ptr(mrb, range);
    313322
    314323  str  = mrb_inspect(mrb, r->edges->beg);
     
    350359  if (mrb_type(obj) != MRB_TT_RANGE) return mrb_false_value();
    351360
    352   r = mrb_range_ptr(range);
    353   o = mrb_range_ptr(obj);
     361  r = mrb_range_ptr(mrb, range);
     362  o = mrb_range_ptr(mrb, obj);
    354363  if (!mrb_eql(mrb, r->edges->beg, o->edges->beg) ||
    355364      !mrb_eql(mrb, r->edges->end, o->edges->end) ||
     
    374383  }
    375384
    376   r = mrb_range_ptr(src);
     385  r = mrb_range_ptr(mrb, src);
    377386  range_init(mrb, copy, r->edges->beg, r->edges->end, r->excl);
    378387
     
    391400      mrb_ary_push(mrb, result, func(mrb, obj, mrb_fixnum(argv[i])));
    392401    }
    393     else if (range_beg_len(mrb, argv[i], &beg, &len, olen, FALSE)) {
     402    else if (mrb_range_beg_len(mrb, argv[i], &beg, &len, olen, FALSE) == 1) {
    394403      mrb_int const end = olen < beg + len ? olen : beg + len;
    395404      for (j = beg; j < end; ++j) {
  • EcnlProtoTool/trunk/mruby-1.3.0/src/state.c

    r321 r331  
    77#include <stdlib.h>
    88#include <string.h>
    9 #include "mruby.h"
    10 #include "mruby/irep.h"
    11 #include "mruby/variable.h"
    12 #include "mruby/debug.h"
    13 #include "mruby/string.h"
     9#include <mruby.h>
     10#include <mruby/irep.h>
     11#include <mruby/variable.h>
     12#include <mruby/debug.h>
     13#include <mruby/string.h>
    1414
    1515void mrb_init_core(mrb_state*);
     
    142142  if (!(irep->flags & MRB_ISEQ_NO_FREE))
    143143    mrb_free(mrb, irep->iseq);
    144   for (i=0; i<irep->plen; i++) {
     144  if (irep->pool) for (i=0; i<irep->plen; i++) {
    145145    if (mrb_type(irep->pool[i]) == MRB_TT_STRING) {
    146146      mrb_gc_free_str(mrb, RSTRING(irep->pool[i]));
     
    160160  mrb_free(mrb, irep->reps);
    161161  mrb_free(mrb, irep->lv);
    162   mrb_free(mrb, (void *)irep->filename);
     162  if (irep->own_filename) {
     163    mrb_free(mrb, (void *)irep->filename);
     164  }
    163165  mrb_free(mrb, irep->lines);
    164166  mrb_debug_info_free(mrb, irep->debug_info);
     
    216218}
    217219
     220void mrb_free_backtrace(mrb_state *mrb);
     221
    218222MRB_API void
    219223mrb_free_context(mrb_state *mrb, struct mrb_context *c)
     
    259263  *irep = mrb_irep_zero;
    260264  irep->refcnt = 1;
     265  irep->own_filename = FALSE;
    261266
    262267  return irep;
     
    287292  if (mrb->atexit_stack_len == 0) {
    288293    mrb->atexit_stack = (mrb_atexit_func*)mrb_malloc(mrb, stack_size);
    289   } else {
     294  }
     295  else {
    290296    mrb->atexit_stack = (mrb_atexit_func*)mrb_realloc(mrb, mrb->atexit_stack, stack_size);
    291297  }
  • EcnlProtoTool/trunk/mruby-1.3.0/src/string.c

    r321 r331  
    44** See Copyright Notice in mruby.h
    55*/
     6
     7#ifdef _MSC_VER
     8# define _CRT_NONSTDC_NO_DEPRECATE
     9#endif
    610
    711#include <float.h>
     
    1014#include <stdlib.h>
    1115#include <string.h>
    12 #include "mruby.h"
    13 #include "mruby/array.h"
    14 #include "mruby/class.h"
    15 #include "mruby/range.h"
    16 #include "mruby/string.h"
    17 #include "mruby/re.h"
     16#include <mruby.h>
     17#include <mruby/array.h>
     18#include <mruby/class.h>
     19#include <mruby/range.h>
     20#include <mruby/string.h>
     21#include <mruby/re.h>
    1822
    1923typedef struct mrb_shared_string {
     
    6064      memcpy(s->as.ary, p, len);
    6165    }
    62   } else {
     66  }
     67  else {
    6368    if (len >= MRB_INT_MAX) {
    6469      mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big");
     
    115120}
    116121
    117 static inline void
    118 resize_capa(mrb_state *mrb, struct RString *s, mrb_int capacity)
    119 {
     122static void
     123resize_capa(mrb_state *mrb, struct RString *s, size_t capacity)
     124{
     125#if SIZE_MAX > MRB_INT_MAX
     126    mrb_assert(capacity < MRB_INT_MAX);
     127#endif
    120128  if (RSTR_EMBED_P(s)) {
    121129    if (RSTRING_EMBED_LEN_MAX < capacity) {
     
    126134      s->as.heap.ptr = tmp;
    127135      s->as.heap.len = len;
    128       s->as.heap.aux.capa = capacity;
     136      s->as.heap.aux.capa = (mrb_int)capacity;
    129137    }
    130138  }
    131139  else {
    132     s->as.heap.ptr = (char *)mrb_realloc(mrb, RSTR_PTR(s), capacity+1);
    133     s->as.heap.aux.capa = capacity;
     140    s->as.heap.ptr = (char*)mrb_realloc(mrb, RSTR_PTR(s), capacity+1);
     141    s->as.heap.aux.capa = (mrb_int)capacity;
    134142  }
    135143}
     
    148156  }
    149157
    150   if (RSTR_EMBED_P(s))
    151     capa = RSTRING_EMBED_LEN_MAX;
    152   else
    153     capa = s->as.heap.aux.capa;
    154 
    155   if (RSTR_LEN(s) >= MRB_INT_MAX - (mrb_int)len) {
     158  capa = RSTR_CAPA(s);
     159  if (capa <= RSTRING_EMBED_LEN_MAX)
     160    capa = RSTRING_EMBED_LEN_MAX+1;
     161
     162  total = RSTR_LEN(s)+len;
     163  if (total >= MRB_INT_MAX) {
     164  size_error:
    156165    mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big");
    157166  }
    158   total = RSTR_LEN(s)+len;
    159167  if (capa <= total) {
    160168    while (total > capa) {
    161       if (capa + 1 >= MRB_INT_MAX / 2) {
    162         capa = (total + 4095) / 4096;
    163         break;
    164       }
    165       capa = (capa + 1) * 2;
     169      if (capa <= MRB_INT_MAX / 2) {
     170        capa *= 2;
     171      }
     172      else {
     173        capa = total;
     174      }
     175    }
     176    if (capa < total || capa > MRB_INT_MAX) {
     177      goto size_error;
    166178    }
    167179    resize_capa(mrb, s, capa);
     
    270282  char* p = RSTRING_PTR(str);
    271283  char* e = p;
     284  if (RSTRING(str)->flags & MRB_STR_NO_UTF) {
     285    return RSTRING_LEN(str);
     286  }
    272287  e += len < 0 ? RSTRING_LEN(str) : len;
    273288  while (p<e) {
     
    275290    total++;
    276291  }
     292  if (RSTRING_LEN(str) == total) {
     293    RSTRING(str)->flags |= MRB_STR_NO_UTF;
     294  }
    277295  return total;
    278296}
     
    303321
    304322  for (b=i=0; b<bi; i++) {
    305     n = utf8len(p, p+bi);
     323    n = utf8len_codepage[(unsigned char)*p];
    306324    b += n;
    307325    p += n;
    308326  }
     327  if (b != bi) return -1;
    309328  return i;
    310329}
    311330
     331#define BYTES_ALIGN_CHECK(pos) if (pos < 0) return mrb_nil_value();
    312332#else
    313333#define RSTRING_CHAR_LEN(s) RSTRING_LEN(s)
    314334#define chars2bytes(p, off, ci) (ci)
    315335#define bytes2chars(p, bi) (bi)
     336#define BYTES_ALIGN_CHECK(pos)
    316337#endif
    317338
     
    349370  }
    350371  else if (m == 1) {
    351     const unsigned char *ys = y, *ye = ys + n;
    352     for (; y < ye; ++y) {
    353       if (*x == *y)
    354         return y - ys;
    355     }
    356     return -1;
     372    const unsigned char *ys = (const unsigned char *)memchr(y, *x, n);
     373
     374    if (ys)
     375      return ys - y;
     376    else
     377      return -1;
    357378  }
    358379  return mrb_memsearch_qs((const unsigned char *)x0, m, (const unsigned char *)y0, n);
     
    404425
    405426  orig = mrb_str_ptr(str);
    406   if (RSTR_EMBED_P(orig)) {
     427  if (RSTR_EMBED_P(orig) || RSTR_LEN(orig) == 0) {
    407428    s = str_new(mrb, orig->as.ary+beg, len);
    408429  }
     
    450471    if (beg < 0) return mrb_nil_value();
    451472  }
    452   if (beg + len > clen)
     473  if (len > clen - beg)
    453474    len = clen - beg;
    454475  if (len <= 0) {
     
    489510check_frozen(mrb_state *mrb, struct RString *s)
    490511{
    491   if (RSTR_FROZEN_P(s)) {
     512  if (MRB_FROZEN_P(s)) {
    492513    mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen string");
    493514  }
     
    500521
    501522  check_frozen(mrb, s1);
     523  if (s1 == s2) return mrb_obj_value(s1);
     524  s1->flags &= ~MRB_STR_NO_UTF;
     525  s1->flags |= s2->flags&MRB_STR_NO_UTF;
    502526  len = RSTR_LEN(s2);
    503527  if (RSTR_SHARED_P(s1)) {
     
    646670{
    647671  check_frozen(mrb, s);
     672  s->flags &= ~MRB_STR_NO_UTF;
    648673  if (RSTR_SHARED_P(s)) {
    649674    mrb_shared_string *shared = s->as.heap.aux.shared;
    650675
    651     if (shared->refcnt == 1 && s->as.heap.ptr == shared->ptr) {
     676    if (shared->nofree == 0 && shared->refcnt == 1 && s->as.heap.ptr == shared->ptr) {
    652677      s->as.heap.ptr = shared->ptr;
    653678      s->as.heap.aux.capa = shared->len;
     
    661686      p = RSTR_PTR(s);
    662687      len = s->as.heap.len;
    663       ptr = (char *)mrb_malloc(mrb, (size_t)len + 1);
     688      if (len < RSTRING_EMBED_LEN_MAX) {
     689        RSTR_SET_EMBED_FLAG(s);
     690        RSTR_SET_EMBED_LEN(s, len);
     691        ptr = RSTR_PTR(s);
     692      }
     693      else {
     694        ptr = (char *)mrb_malloc(mrb, (size_t)len + 1);
     695        s->as.heap.ptr = ptr;
     696        s->as.heap.aux.capa = len;
     697      }
    664698      if (p) {
    665699        memcpy(ptr, p, len);
    666700      }
    667701      ptr[len] = '\0';
    668       s->as.heap.ptr = ptr;
    669       s->as.heap.aux.capa = len;
    670702      str_decref(mrb, shared);
    671703    }
     
    675707  if (RSTR_NOFREE_P(s)) {
    676708    char *p = s->as.heap.ptr;
    677 
    678     s->as.heap.ptr = (char *)mrb_malloc(mrb, (size_t)s->as.heap.len+1);
     709    mrb_int len = s->as.heap.len;
     710
     711    RSTR_UNSET_NOFREE_FLAG(s);
     712    if (len < RSTRING_EMBED_LEN_MAX) {
     713      RSTR_SET_EMBED_FLAG(s);
     714      RSTR_SET_EMBED_LEN(s, len);
     715    }
     716    else {
     717      s->as.heap.ptr = (char *)mrb_malloc(mrb, (size_t)len+1);
     718      s->as.heap.aux.capa = len;
     719    }
    679720    if (p) {
    680       memcpy(RSTR_PTR(s), p, s->as.heap.len);
    681     }
    682     RSTR_PTR(s)[s->as.heap.len] = '\0';
    683     s->as.heap.aux.capa = s->as.heap.len;
    684     RSTR_UNSET_NOFREE_FLAG(s);
     721      memcpy(RSTR_PTR(s), p, len);
     722    }
     723    RSTR_PTR(s)[len] = '\0';
    685724    return;
    686725  }
    687 }
    688 
    689 static mrb_value
    690 mrb_str_freeze(mrb_state *mrb, mrb_value str)
    691 {
    692   struct RString *s = mrb_str_ptr(str);
    693 
    694   RSTR_SET_FROZEN_FLAG(s);
    695   return str;
    696726}
    697727
     
    747777  }
    748778  s2 = mrb_str_ptr(other);
     779  if (RSTR_LEN(s2) == 0) {
     780    return;
     781  }
    749782  len = RSTR_LEN(s1) + RSTR_LEN(s2);
    750783
     784  if (len < 0 || len >= MRB_INT_MAX) {
     785    mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big");
     786  }
    751787  if (RSTRING_CAPA(self) < len) {
    752788    resize_capa(mrb, s1, len);
     
    932968      mrb_value tmp = mrb_funcall(mrb, str2, "<=>", 1, str1);
    933969
    934       if (mrb_nil_p(tmp)) return mrb_nil_value();
    935       if (!mrb_fixnum(tmp)) {
     970      if (!mrb_nil_p(tmp)) return mrb_nil_value();
     971      if (!mrb_fixnum_p(tmp)) {
    936972        return mrb_funcall(mrb, mrb_fixnum_value(0), "-", 1, tmp);
    937973      }
     
    10141050}
    10151051
     1052MRB_API mrb_int
     1053mrb_string_value_len(mrb_state *mrb, mrb_value ptr)
     1054{
     1055  mrb_value str = mrb_str_to_str(mrb, ptr);
     1056  return RSTRING_LEN(str);
     1057}
     1058
    10161059void
    10171060mrb_noregexp(mrb_state *mrb, mrb_value self)
     
    10591102
    10601103    case MRB_TT_RANGE:
    1061       /* check if indx is Range */
    1062       {
    1063         mrb_int beg, len;
    1064 
    1065         len = RSTRING_CHAR_LEN(str);
    1066         if (mrb_range_beg_len(mrb, indx, &beg, &len, len)) {
    1067           return str_subseq(mrb, str, beg, len);
    1068         }
    1069         else {
    1070           return mrb_nil_value();
    1071         }
    1072       }
    1073     case MRB_TT_FLOAT:
     1104      goto range_arg;
     1105
    10741106    default:
    10751107      indx = mrb_Integer(mrb, indx);
    10761108      if (mrb_nil_p(indx)) {
     1109      range_arg:
     1110        {
     1111          mrb_int beg, len;
     1112
     1113          len = RSTRING_CHAR_LEN(str);
     1114          switch (mrb_range_beg_len(mrb, indx, &beg, &len, len, TRUE)) {
     1115          case 1:
     1116            return str_subseq(mrb, str, beg, len);
     1117          case 2:
     1118            return mrb_nil_value();
     1119          default:
     1120            break;
     1121          }
     1122        }
    10771123        mrb_raise(mrb, E_TYPE_ERROR, "can't convert to Fixnum");
    10781124      }
     
    11311177  argc = mrb_get_args(mrb, "o|o", &a1, &a2);
    11321178  if (argc == 2) {
     1179    mrb_int n1, n2;
     1180
    11331181    mrb_regexp_check(mrb, a1);
    1134     return str_substr(mrb, str, mrb_fixnum(a1), mrb_fixnum(a2));
     1182    mrb_get_args(mrb, "ii", &n1, &n2);
     1183    return str_substr(mrb, str, n1, n2);
    11351184  }
    11361185  if (argc != 1) {
     
    12151264  mrb_int rslen;
    12161265  mrb_int len;
     1266  mrb_int argc;
    12171267  struct RString *s = mrb_str_ptr(str);
    12181268
    12191269  mrb_str_modify(mrb, s);
     1270  argc = mrb_get_args(mrb, "|S", &rs);
    12201271  len = RSTR_LEN(s);
    1221   if (mrb_get_args(mrb, "|S", &rs) == 0) {
     1272  if (argc == 0) {
    12221273    if (len == 0) return mrb_nil_value();
    12231274  smart_chomp:
     
    15101561mrb_str_include(mrb_state *mrb, mrb_value self)
    15111562{
    1512   mrb_int i;
    15131563  mrb_value str2;
    1514   mrb_bool include_p;
    1515 
    1516   mrb_get_args(mrb, "o", &str2);
    1517   if (mrb_fixnum_p(str2)) {
    1518     include_p = (memchr(RSTRING_PTR(self), mrb_fixnum(str2), RSTRING_LEN(self)) != NULL);
    1519   }
    1520   else {
    1521     str2 = mrb_str_to_str(mrb, str2);
    1522     i = str_index(mrb, self, str2, 0);
    1523 
    1524     include_p = (i != -1);
    1525   }
    1526 
    1527   return mrb_bool_value(include_p);
     1564
     1565  mrb_get_args(mrb, "S", &str2);
     1566  if (str_index(mrb, self, str2, 0) < 0)
     1567    return mrb_bool_value(FALSE);
     1568  return mrb_bool_value(TRUE);
    15281569}
    15291570
     
    15591600  mrb_get_args(mrb, "*", &argv, &argc);
    15601601  if (argc == 2) {
    1561     pos = mrb_fixnum(argv[1]);
    1562     sub = argv[0];
     1602    mrb_get_args(mrb, "oi", &sub, &pos);
    15631603  }
    15641604  else {
     
    15771617    }
    15781618  }
    1579   if (pos >= clen) return mrb_nil_value();
     1619  if (pos > clen) return mrb_nil_value();
    15801620  pos = chars2bytes(str, 0, pos);
    15811621
     
    15981638  if (pos == -1) return mrb_nil_value();
    15991639  pos = bytes2chars(RSTRING_PTR(str), pos);
     1640  BYTES_ALIGN_CHECK(pos);
    16001641  return mrb_fixnum_value(pos);
    16011642}
     
    16331674  mrb_value str2;
    16341675
    1635   if (mrb_get_args(mrb, "|S", &str2) == 1) {
    1636     str_replace(mrb, mrb_str_ptr(self), mrb_str_ptr(str2));
    1637   }
     1676  if (mrb_get_args(mrb, "|S", &str2) == 0) {
     1677    struct RString *s = str_new(mrb, 0, 0);
     1678    str2 = mrb_obj_value(s);
     1679  }
     1680  str_replace(mrb, mrb_str_ptr(self), mrb_str_ptr(str2));
    16381681  return self;
    16391682}
     
    17431786    mrb_str_modify(mrb, mrb_str_ptr(str));
    17441787    len = RSTRING_LEN(str);
    1745     buf = mrb_malloc(mrb, (size_t)len);
     1788    buf = (char*)mrb_malloc(mrb, (size_t)len);
    17461789    p = buf;
    17471790    e = buf + len;
     
    18241867  mrb_int argc;
    18251868  mrb_value sub;
    1826   mrb_value vpos;
    18271869  mrb_int pos, len = RSTRING_CHAR_LEN(str);
    18281870
    18291871  mrb_get_args(mrb, "*", &argv, &argc);
    18301872  if (argc == 2) {
    1831     sub = argv[0];
    1832     vpos = argv[1];
    1833     pos = mrb_fixnum(vpos);
     1873    mrb_get_args(mrb, "oi", &sub, &pos);
    18341874    if (pos < 0) {
    18351875      pos += len;
     
    18491889  }
    18501890  pos = chars2bytes(str, 0, pos);
    1851   len = chars2bytes(str, pos, len);
    18521891  mrb_regexp_check(mrb, sub);
    18531892
     
    18671906      if (pos >= 0) {
    18681907        pos = bytes2chars(RSTRING_PTR(str), pos);
     1908        BYTES_ALIGN_CHECK(pos);
    18691909        return mrb_fixnum_value(pos);
    18701910      }
     
    19221962  mrb_value spat = mrb_nil_value();
    19231963  enum {awk, string, regexp} split_type = string;
    1924   long i = 0, lim_p;
     1964  mrb_int i = 0;
    19251965  mrb_int beg;
    19261966  mrb_int end;
    19271967  mrb_int lim = 0;
     1968  mrb_bool lim_p;
    19281969  mrb_value result, tmp;
    19291970
     
    19982039        end = mrb_memsearch(RSTRING_PTR(spat), pat_len, RSTRING_PTR(str)+idx, str_len - idx);
    19992040        if (end < 0) break;
    2000       } else {
     2041      }
     2042      else {
    20012043        end = chars2bytes(str, idx, 1);
    20022044      }
     
    20312073
    20322074MRB_API mrb_value
    2033 mrb_cstr_to_inum(mrb_state *mrb, const char *str, int base, int badcheck)
    2034 {
    2035   const char *p;
     2075mrb_str_len_to_inum(mrb_state *mrb, const char *str, size_t len, int base, int badcheck)
     2076{
     2077  const char *p = str;
     2078  const char *pend = str + len;
    20362079  char sign = 1;
    2037   int c, uscore;
     2080  int c;
    20382081  uint64_t n = 0;
    20392082  mrb_int val;
     
    20452088     -1)
    20462089
    2047   if (!str) {
     2090  if (!p) {
    20482091    if (badcheck) goto bad;
    20492092    return mrb_fixnum_value(0);
    20502093  }
    2051   while (ISSPACE(*str)) str++;
    2052 
    2053   if (str[0] == '+') {
    2054     str++;
    2055   }
    2056   else if (str[0] == '-') {
    2057     str++;
     2094  while (p<pend && ISSPACE(*p))
     2095    p++;
     2096
     2097  if (p[0] == '+') {
     2098    p++;
     2099  }
     2100  else if (p[0] == '-') {
     2101    p++;
    20582102    sign = 0;
    20592103  }
    2060   if (str[0] == '+' || str[0] == '-') {
    2061     if (badcheck) goto bad;
    2062     return mrb_fixnum_value(0);
    2063   }
    20642104  if (base <= 0) {
    2065     if (str[0] == '0') {
    2066       switch (str[1]) {
     2105    if (p[0] == '0') {
     2106      switch (p[1]) {
    20672107        case 'x': case 'X':
    20682108          base = 16;
     
    20792119        default:
    20802120          base = 8;
     2121          break;
    20812122      }
    20822123    }
     
    20902131  switch (base) {
    20912132    case 2:
    2092       if (str[0] == '0' && (str[1] == 'b'||str[1] == 'B')) {
    2093         str += 2;
     2133      if (p[0] == '0' && (p[1] == 'b'||p[1] == 'B')) {
     2134        p += 2;
    20942135      }
    20952136      break;
     
    20972138      break;
    20982139    case 8:
    2099       if (str[0] == '0' && (str[1] == 'o'||str[1] == 'O')) {
    2100         str += 2;
     2140      if (p[0] == '0' && (p[1] == 'o'||p[1] == 'O')) {
     2141        p += 2;
    21012142      }
    21022143    case 4: case 5: case 6: case 7:
    21032144      break;
    21042145    case 10:
    2105       if (str[0] == '0' && (str[1] == 'd'||str[1] == 'D')) {
    2106         str += 2;
     2146      if (p[0] == '0' && (p[1] == 'd'||p[1] == 'D')) {
     2147        p += 2;
    21072148      }
    21082149    case 9: case 11: case 12: case 13: case 14: case 15:
    21092150      break;
    21102151    case 16:
    2111       if (str[0] == '0' && (str[1] == 'x'||str[1] == 'X')) {
    2112         str += 2;
     2152      if (p[0] == '0' && (p[1] == 'x'||p[1] == 'X')) {
     2153        p += 2;
    21132154      }
    21142155      break;
     
    21192160      break;
    21202161  } /* end of switch (base) { */
    2121   if (*str == '0') {    /* squeeze preceding 0s */
    2122     uscore = 0;
    2123     while ((c = *++str) == '0' || c == '_') {
    2124       if (c == '_') {
    2125         if (++uscore >= 2)
    2126           break;
    2127       }
    2128       else
    2129         uscore = 0;
    2130     }
    2131     if (!(c = *str) || ISSPACE(c)) --str;
    2132   }
    2133   c = *str;
    2134   c = conv_digit(c);
    2135   if (c < 0 || c >= base) {
     2162  if (p>=pend) {
    21362163    if (badcheck) goto bad;
    21372164    return mrb_fixnum_value(0);
    21382165  }
    2139 
    2140   uscore = 0;
    2141   for (p=str;*p;p++) {
     2166  if (*p == '0') {    /* squeeze preceding 0s */
     2167    p++;
     2168    while (p<pend) {
     2169      c = *p++;
     2170      if (c == '_') {
     2171        if (p<pend && *p == '_') {
     2172          if (badcheck) goto bad;
     2173          break;
     2174        }
     2175        continue;
     2176      }
     2177      if (c != '0') {
     2178        p--;
     2179        break;
     2180      }
     2181    }
     2182    if (*(p - 1) == '0')
     2183      p--;
     2184  }
     2185  if (p == pend) {
     2186    if (badcheck) goto bad;
     2187    return mrb_fixnum_value(0);
     2188  }
     2189  for ( ;p<pend;p++) {
    21422190    if (*p == '_') {
    2143       if (uscore == 0) {
    2144         uscore++;
     2191      p++;
     2192      if (p==pend) {
     2193        if (badcheck) goto bad;
    21452194        continue;
    21462195      }
    2147       if (badcheck) goto bad;
    2148       break;
    2149     }
    2150     uscore = 0;
     2196      if (*p == '_') {
     2197        if (badcheck) goto bad;
     2198        break;
     2199      }
     2200    }
     2201    if (badcheck && *p == '\0') {
     2202      goto nullbyte;
     2203    }
    21512204    c = conv_digit(*p);
    21522205    if (c < 0 || c >= base) {
    2153       if (badcheck) goto bad;
    21542206      break;
    21552207    }
    21562208    n *= base;
    21572209    n += c;
    2158     if (n > MRB_INT_MAX) {
    2159       mrb_raisef(mrb, E_ARGUMENT_ERROR, "string (%S) too big for integer", mrb_str_new_cstr(mrb, str));
    2160     }
    2161   }
    2162   val = n;
     2210    if (n > (uint64_t)MRB_INT_MAX + (sign ? 0 : 1)) {
     2211      mrb_raisef(mrb, E_ARGUMENT_ERROR, "string (%S) too big for integer",
     2212                 mrb_str_new(mrb, str, pend-str));
     2213    }
     2214  }
     2215  val = (mrb_int)n;
    21632216  if (badcheck) {
    21642217    if (p == str) goto bad; /* no number */
    2165     while (*p && ISSPACE(*p)) p++;
    2166     if (*p) goto bad;           /* trailing garbage */
     2218    while (p<pend && ISSPACE(*p)) p++;
     2219    if (p<pend) goto bad;       /* trailing garbage */
    21672220  }
    21682221
    21692222  return mrb_fixnum_value(sign ? val : -val);
    2170 bad:
    2171   mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid string for number(%S)", mrb_str_new_cstr(mrb, str));
     2223 nullbyte:
     2224  mrb_raise(mrb, E_ARGUMENT_ERROR, "string contains null byte");
     2225  /* not reached */
     2226 bad:
     2227  mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid string for number(%S)",
     2228             mrb_inspect(mrb, mrb_str_new(mrb, str, pend-str)));
    21722229  /* not reached */
    21732230  return mrb_fixnum_value(0);
     2231}
     2232
     2233MRB_API mrb_value
     2234mrb_cstr_to_inum(mrb_state *mrb, const char *str, int base, int badcheck)
     2235{
     2236  return mrb_str_len_to_inum(mrb, str, strlen(str), base, badcheck);
    21742237}
    21752238
     
    21832246
    21842247  if (!p || p[len] != '\0') {
     2248    if (MRB_FROZEN_P(ps)) {
     2249      *ptr = str = mrb_str_dup(mrb, str);
     2250      ps = mrb_str_ptr(str);
     2251    }
    21852252    mrb_str_modify(mrb, ps);
    21862253    return RSTR_PTR(ps);
     
    21952262  mrb_int len;
    21962263
    2197   if (badcheck) {
    2198     /* Raises if the string contains a null character (the badcheck) */
    2199     s = mrb_string_value_cstr(mrb, &str);
    2200   }
    2201   else {
    2202     s = mrb_string_value_ptr(mrb, str);
    2203   }
    2204   if (s) {
    2205     len = RSTRING_LEN(str);
    2206     if (s[len]) {    /* no sentinel somehow */
    2207       struct RString *temp_str = str_new(mrb, s, len);
    2208       s = RSTR_PTR(temp_str);
    2209     }
    2210   }
    2211   return mrb_cstr_to_inum(mrb, s, base, badcheck);
     2264  s = mrb_string_value_ptr(mrb, str);
     2265  len = RSTRING_LEN(str);
     2266  return mrb_str_len_to_inum(mrb, s, len, base, badcheck);
    22122267}
    22132268
     
    22602315    return 0.0;
    22612316  }
    2262   d = strtod(p, &end);
     2317  d = mrb_float_read(p, &end);
    22632318  if (p == end) {
    22642319    if (badcheck) {
     
    22982353    }
    22992354
    2300     d = strtod(p, &end);
     2355    d = mrb_float_read(p, &end);
    23012356    if (badcheck) {
    23022357      if (!end || p == end) goto bad;
     
    26032658#endif
    26042659    c = *p;
    2605     if (c == '"'|| c == '\\' || (c == '#' && IS_EVSTR(p, pend))) {
     2660    if (c == '"'|| c == '\\' || (c == '#' && IS_EVSTR(p+1, pend))) {
    26062661      buf[0] = '\\'; buf[1] = c;
    26072662      mrb_str_cat(mrb, result, buf, 2);
     
    26892744  mrb_define_method(mrb, s, "chomp",           mrb_str_chomp,           MRB_ARGS_ANY());  /* 15.2.10.5.9  */
    26902745  mrb_define_method(mrb, s, "chomp!",          mrb_str_chomp_bang,      MRB_ARGS_ANY());  /* 15.2.10.5.10 */
    2691   mrb_define_method(mrb, s, "chop",            mrb_str_chop,            MRB_ARGS_REQ(1)); /* 15.2.10.5.11 */
    2692   mrb_define_method(mrb, s, "chop!",           mrb_str_chop_bang,       MRB_ARGS_REQ(1)); /* 15.2.10.5.12 */
     2746  mrb_define_method(mrb, s, "chop",            mrb_str_chop,            MRB_ARGS_NONE()); /* 15.2.10.5.11 */
     2747  mrb_define_method(mrb, s, "chop!",           mrb_str_chop_bang,       MRB_ARGS_NONE()); /* 15.2.10.5.12 */
    26932748  mrb_define_method(mrb, s, "downcase",        mrb_str_downcase,        MRB_ARGS_NONE()); /* 15.2.10.5.13 */
    26942749  mrb_define_method(mrb, s, "downcase!",       mrb_str_downcase_bang,   MRB_ARGS_NONE()); /* 15.2.10.5.14 */
     
    27202775  mrb_define_method(mrb, s, "inspect",         mrb_str_inspect,         MRB_ARGS_NONE()); /* 15.2.10.5.46(x) */
    27212776  mrb_define_method(mrb, s, "bytes",           mrb_str_bytes,           MRB_ARGS_NONE());
    2722 
    2723   mrb_define_method(mrb, s, "freeze",          mrb_str_freeze,          MRB_ARGS_NONE());
    2724 }
     2777}
     2778
     2779/*
     2780 *      Source code for the "strtod" library procedure.
     2781 *
     2782 * Copyright (c) 1988-1993 The Regents of the University of California.
     2783 * Copyright (c) 1994 Sun Microsystems, Inc.
     2784 *
     2785 * Permission to use, copy, modify, and distribute this
     2786 * software and its documentation for any purpose and without
     2787 * fee is hereby granted, provided that the above copyright
     2788 * notice appear in all copies.  The University of California
     2789 * makes no representations about the suitability of this
     2790 * software for any purpose.  It is provided "as is" without
     2791 * express or implied warranty.
     2792 *
     2793 * RCS: @(#) $Id$
     2794 */
     2795
     2796#include <ctype.h>
     2797#include <errno.h>
     2798
     2799static const int maxExponent = 511; /* Largest possible base 10 exponent.  Any
     2800                                     * exponent larger than this will already
     2801                                     * produce underflow or overflow, so there's
     2802                                     * no need to worry about additional digits.
     2803                                     */
     2804static const double powersOf10[] = {/* Table giving binary powers of 10.  Entry */
     2805    10.,                            /* is 10^2^i.  Used to convert decimal */
     2806    100.,                           /* exponents into floating-point numbers. */
     2807    1.0e4,
     2808    1.0e8,
     2809    1.0e16,
     2810    1.0e32,
     2811    1.0e64,
     2812    1.0e128,
     2813    1.0e256
     2814};
     2815
     2816MRB_API double
     2817mrb_float_read(const char *string, char **endPtr)
     2818/*  const char *string;            A decimal ASCII floating-point number,
     2819                                 * optionally preceded by white space.
     2820                                 * Must have form "-I.FE-X", where I is the
     2821                                 * integer part of the mantissa, F is the
     2822                                 * fractional part of the mantissa, and X
     2823                                 * is the exponent.  Either of the signs
     2824                                 * may be "+", "-", or omitted.  Either I
     2825                                 * or F may be omitted, or both.  The decimal
     2826                                 * point isn't necessary unless F is present.
     2827                                 * The "E" may actually be an "e".  E and X
     2828                                 * may both be omitted (but not just one).
     2829                                 */
     2830/*  char **endPtr;                 If non-NULL, store terminating character's
     2831                                 * address here. */
     2832{
     2833    int sign, expSign = FALSE;
     2834    double fraction, dblExp;
     2835    const double *d;
     2836    register const char *p;
     2837    register int c;
     2838    int exp = 0;                /* Exponent read from "EX" field. */
     2839    int fracExp = 0;            /* Exponent that derives from the fractional
     2840                                 * part.  Under normal circumstatnces, it is
     2841                                 * the negative of the number of digits in F.
     2842                                 * However, if I is very long, the last digits
     2843                                 * of I get dropped (otherwise a long I with a
     2844                                 * large negative exponent could cause an
     2845                                 * unnecessary overflow on I alone).  In this
     2846                                 * case, fracExp is incremented one for each
     2847                                 * dropped digit. */
     2848    int mantSize;               /* Number of digits in mantissa. */
     2849    int decPt;                  /* Number of mantissa digits BEFORE decimal
     2850                                 * point. */
     2851    const char *pExp;           /* Temporarily holds location of exponent
     2852                                 * in string. */
     2853
     2854    /*
     2855     * Strip off leading blanks and check for a sign.
     2856     */
     2857
     2858    p = string;
     2859    while (isspace(*p)) {
     2860        p += 1;
     2861    }
     2862    if (*p == '-') {
     2863        sign = TRUE;
     2864        p += 1;
     2865    }
     2866    else {
     2867        if (*p == '+') {
     2868            p += 1;
     2869        }
     2870        sign = FALSE;
     2871    }
     2872
     2873    /*
     2874     * Count the number of digits in the mantissa (including the decimal
     2875     * point), and also locate the decimal point.
     2876     */
     2877
     2878    decPt = -1;
     2879    for (mantSize = 0; ; mantSize += 1)
     2880    {
     2881        c = *p;
     2882        if (!isdigit(c)) {
     2883            if ((c != '.') || (decPt >= 0)) {
     2884                break;
     2885            }
     2886            decPt = mantSize;
     2887        }
     2888        p += 1;
     2889    }
     2890
     2891    /*
     2892     * Now suck up the digits in the mantissa.  Use two integers to
     2893     * collect 9 digits each (this is faster than using floating-point).
     2894     * If the mantissa has more than 18 digits, ignore the extras, since
     2895     * they can't affect the value anyway.
     2896     */
     2897
     2898    pExp  = p;
     2899    p -= mantSize;
     2900    if (decPt < 0) {
     2901        decPt = mantSize;
     2902    }
     2903    else {
     2904        mantSize -= 1;                  /* One of the digits was the point. */
     2905    }
     2906    if (mantSize > 18) {
     2907        if (decPt - 18 > 29999) {
     2908            fracExp = 29999;
     2909        }
     2910        else {
     2911            fracExp = decPt - 18;
     2912        }
     2913        mantSize = 18;
     2914    }
     2915    else {
     2916        fracExp = decPt - mantSize;
     2917    }
     2918    if (mantSize == 0) {
     2919        fraction = 0.0;
     2920        p = string;
     2921        goto done;
     2922    }
     2923    else {
     2924        int frac1, frac2;
     2925        frac1 = 0;
     2926        for ( ; mantSize > 9; mantSize -= 1)
     2927        {
     2928            c = *p;
     2929            p += 1;
     2930            if (c == '.') {
     2931                c = *p;
     2932                p += 1;
     2933            }
     2934            frac1 = 10*frac1 + (c - '0');
     2935        }
     2936        frac2 = 0;
     2937        for (; mantSize > 0; mantSize -= 1)
     2938        {
     2939            c = *p;
     2940            p += 1;
     2941            if (c == '.') {
     2942                c = *p;
     2943                p += 1;
     2944            }
     2945            frac2 = 10*frac2 + (c - '0');
     2946        }
     2947        fraction = (1.0e9 * frac1) + frac2;
     2948    }
     2949
     2950    /*
     2951     * Skim off the exponent.
     2952     */
     2953
     2954    p = pExp;
     2955    if ((*p == 'E') || (*p == 'e')) {
     2956        p += 1;
     2957        if (*p == '-') {
     2958            expSign = TRUE;
     2959            p += 1;
     2960        }
     2961        else {
     2962            if (*p == '+') {
     2963                p += 1;
     2964            }
     2965            expSign = FALSE;
     2966        }
     2967        while (isdigit(*p)) {
     2968            exp = exp * 10 + (*p - '0');
     2969            if (exp > 19999) {
     2970                exp = 19999;
     2971            }
     2972            p += 1;
     2973        }
     2974    }
     2975    if (expSign) {
     2976        exp = fracExp - exp;
     2977    }
     2978    else {
     2979        exp = fracExp + exp;
     2980    }
     2981
     2982    /*
     2983     * Generate a floating-point number that represents the exponent.
     2984     * Do this by processing the exponent one bit at a time to combine
     2985     * many powers of 2 of 10. Then combine the exponent with the
     2986     * fraction.
     2987     */
     2988
     2989    if (exp < 0) {
     2990        expSign = TRUE;
     2991        exp = -exp;
     2992    }
     2993    else {
     2994        expSign = FALSE;
     2995    }
     2996    if (exp > maxExponent) {
     2997        exp = maxExponent;
     2998        errno = ERANGE;
     2999    }
     3000    dblExp = 1.0;
     3001    for (d = powersOf10; exp != 0; exp >>= 1, d += 1) {
     3002        if (exp & 01) {
     3003            dblExp *= *d;
     3004        }
     3005    }
     3006    if (expSign) {
     3007        fraction /= dblExp;
     3008    }
     3009    else {
     3010        fraction *= dblExp;
     3011    }
     3012
     3013done:
     3014    if (endPtr != NULL) {
     3015        *endPtr = (char *) p;
     3016    }
     3017
     3018    if (sign) {
     3019        return -fraction;
     3020    }
     3021    return fraction;
     3022}
  • EcnlProtoTool/trunk/mruby-1.3.0/src/symbol.c

    r321 r331  
    77#include <limits.h>
    88#include <string.h>
    9 #include "mruby.h"
    10 #include "mruby/khash.h"
    11 #include "mruby/string.h"
    12 #include "mruby/dump.h"
     9#include <mruby.h>
     10#include <mruby/khash.h>
     11#include <mruby/string.h>
     12#include <mruby/dump.h>
     13#include <mruby/class.h>
    1314
    1415/* ------------------------------------------------------ */
     
    355356      break;
    356357    case '!':
    357       if (*++m == '=') ++m;
     358      switch (*++m) {
     359        case '=': case '~': ++m;
     360      }
    358361      break;
    359362    case '+': case '-':
     
    480483
    481484  mrb->symbol_class = sym = mrb_define_class(mrb, "Symbol", mrb->object_class);                 /* 15.2.11 */
     485  MRB_SET_INSTANCE_TT(sym, MRB_TT_SYMBOL);
     486  mrb_undef_class_method(mrb,  sym, "new");
    482487
    483488  mrb_define_method(mrb, sym, "===",             sym_equal,      MRB_ARGS_REQ(1));              /* 15.2.11.3.1  */
  • EcnlProtoTool/trunk/mruby-1.3.0/src/value_array.h

    r321 r331  
    22#define MRB_VALUE_ARRAY_H__
    33
    4 #include "mruby.h"
     4#include <mruby.h>
    55
    66static inline void
  • EcnlProtoTool/trunk/mruby-1.3.0/src/variable.c

    r321 r331  
    55*/
    66
    7 #include "mruby.h"
    8 #include "mruby/array.h"
    9 #include "mruby/class.h"
    10 #include "mruby/proc.h"
    11 #include "mruby/string.h"
     7#include <mruby.h>
     8#include <mruby/array.h>
     9#include <mruby/class.h>
     10#include <mruby/proc.h>
     11#include <mruby/string.h>
    1212
    1313typedef int (iv_foreach_func)(mrb_state*,mrb_sym,mrb_value,void*);
     
    4545  iv_tbl *t;
    4646
    47   t = mrb_malloc(mrb, sizeof(iv_tbl));
     47  t = (iv_tbl*)mrb_malloc(mrb, sizeof(iv_tbl));
    4848  t->size = 0;
    4949  t->rootseg =  NULL;
     
    103103  }
    104104
    105   seg = mrb_malloc(mrb, sizeof(segment));
     105  seg = (segment*)mrb_malloc(mrb, sizeof(segment));
    106106  if (!seg) return;
    107107  seg->next = NULL;
     
    283283#else
    284284
    285 #include "mruby/khash.h"
     285#include <mruby/khash.h>
    286286
    287287#ifndef MRB_IVHASH_INIT_SIZE
     
    490490  iv_tbl *t = obj->iv;
    491491
     492  if (MRB_FROZEN_P(obj)) {
     493    mrb_raisef(mrb, E_RUNTIME_ERROR, "can't modify frozen %S", mrb_obj_value(obj));
     494  }
    492495  if (!t) {
    493496    t = obj->iv = iv_new(mrb);
     
    757760
    758761MRB_API mrb_value
    759 mrb_mod_cv_get(mrb_state *mrb, struct RClass * c, mrb_sym sym)
     762mrb_mod_cv_get(mrb_state *mrb, struct RClass *c, mrb_sym sym)
    760763{
    761764  struct RClass * cls = c;
    762765  mrb_value v;
     766  int given = FALSE;
    763767
    764768  while (c) {
    765769    if (c->iv && iv_get(mrb, c->iv, sym, &v)) {
    766       return v;
     770      given = TRUE;
    767771    }
    768772    c = c->super;
    769773  }
     774  if (given) return v;
    770775  if (cls && cls->tt == MRB_TT_SCLASS) {
    771776    mrb_value klass;
     
    774779                           mrb_intern_lit(mrb, "__attached__"));
    775780    c = mrb_class_ptr(klass);
    776     if (c->tt == MRB_TT_CLASS) {
     781    if (c->tt == MRB_TT_CLASS || c->tt == MRB_TT_MODULE) {
     782      given = FALSE;
    777783      while (c) {
    778784        if (c->iv && iv_get(mrb, c->iv, sym, &v)) {
    779           return v;
     785          given = TRUE;
    780786        }
    781787        c = c->super;
    782788      }
     789      if (given) return v;
    783790    }
    784791  }
     
    813820  }
    814821
    815   if (!cls->iv) {
    816     cls->iv = iv_new(mrb);
    817   }
    818 
    819   mrb_write_barrier(mrb, (struct RBasic*)cls);
    820   iv_put(mrb, cls->iv, sym, v);
     822  if (cls && cls->tt == MRB_TT_SCLASS) {
     823    mrb_value klass;
     824
     825    klass = mrb_obj_iv_get(mrb, (struct RObject*)cls,
     826                           mrb_intern_lit(mrb, "__attached__"));
     827    switch (mrb_type(klass)) {
     828    case MRB_TT_CLASS:
     829    case MRB_TT_MODULE:
     830    case MRB_TT_SCLASS:
     831      c = mrb_class_ptr(klass);
     832      break;
     833    default:
     834      c = cls;
     835      break;
     836    }
     837  }
     838  else{
     839    c = cls;
     840  }
     841
     842  if (!c->iv) {
     843    c->iv = iv_new(mrb);
     844  }
     845
     846  mrb_write_barrier(mrb, (struct RBasic*)c);
     847  iv_put(mrb, c->iv, sym, v);
    821848}
    822849
     
    927954      return v;
    928955    }
    929     if (c->tt == MRB_TT_SCLASS) {
     956    c2 = c;
     957    while (c2 && c2->tt == MRB_TT_SCLASS) {
    930958      mrb_value klass;
    931       klass = mrb_obj_iv_get(mrb, (struct RObject *)c,
     959      klass = mrb_obj_iv_get(mrb, (struct RObject *)c2,
    932960                             mrb_intern_lit(mrb, "__attached__"));
    933961      c2 = mrb_class_ptr(klass);
    934       if (c2->tt == MRB_TT_CLASS)
    935         c = c2;
    936     }
     962    }
     963    if (c2->tt == MRB_TT_CLASS || c2->tt == MRB_TT_MODULE) c = c2;
    937964    c2 = c;
    938965    for (;;) {
  • EcnlProtoTool/trunk/mruby-1.3.0/src/version.c

    r321 r331  
    1 #include "mruby.h"
    2 #include "mruby/variable.h"
     1#include <mruby.h>
     2#include <mruby/variable.h>
    33
    44void
     
    1010  mrb_define_global_const(mrb, "RUBY_ENGINE", mrb_str_new_lit(mrb, MRUBY_RUBY_ENGINE));
    1111  mrb_define_global_const(mrb, "RUBY_ENGINE_VERSION", mruby_version);
    12   mrb_define_global_const(mrb, "MRUBY_VERSION", mrb_str_new_lit(mrb, MRUBY_VERSION));
     12  mrb_define_global_const(mrb, "MRUBY_VERSION", mruby_version);
    1313  mrb_define_global_const(mrb, "MRUBY_RELEASE_NO", mrb_fixnum_value(MRUBY_RELEASE_NO));
    1414  mrb_define_global_const(mrb, "MRUBY_RELEASE_DATE", mrb_str_new_lit(mrb, MRUBY_RELEASE_DATE));
  • EcnlProtoTool/trunk/mruby-1.3.0/src/vm.c

    r321 r331  
    88#include <stdarg.h>
    99#include <math.h>
    10 #include "mruby.h"
    11 #include "mruby/array.h"
    12 #include "mruby/class.h"
    13 #include "mruby/hash.h"
    14 #include "mruby/irep.h"
    15 #include "mruby/numeric.h"
    16 #include "mruby/proc.h"
    17 #include "mruby/range.h"
    18 #include "mruby/string.h"
    19 #include "mruby/variable.h"
    20 #include "mruby/error.h"
    21 #include "mruby/opcode.h"
     10#include <mruby.h>
     11#include <mruby/array.h>
     12#include <mruby/class.h>
     13#include <mruby/hash.h>
     14#include <mruby/irep.h>
     15#include <mruby/numeric.h>
     16#include <mruby/proc.h>
     17#include <mruby/range.h>
     18#include <mruby/string.h>
     19#include <mruby/variable.h>
     20#include <mruby/error.h>
     21#include <mruby/opcode.h>
    2222#include "value_array.h"
    23 #include "mruby/throw.h"
    24 
    25 #ifdef MRB_DISABLE_STDIO
     23#include <mruby/throw.h>
     24
     25#ifndef MRB_DISABLE_STDIO
    2626#if defined(__cplusplus)
    2727extern "C" {
     
    3636#define CALLINFO_INIT_SIZE 32
    3737
     38#ifndef ENSURE_STACK_INIT_SIZE
     39#define ENSURE_STACK_INIT_SIZE 16
     40#endif
     41
     42#ifndef RESCUE_STACK_INIT_SIZE
     43#define RESCUE_STACK_INIT_SIZE 16
     44#endif
     45
    3846/* Define amount of linear stack growth. */
    3947#ifndef MRB_STACK_GROWTH
    4048#define MRB_STACK_GROWTH 128
     49#endif
     50
     51/* Maximum mrb_funcall() depth. Should be set lower on memory constrained systems. */
     52#ifndef MRB_FUNCALL_DEPTH_MAX
     53#define MRB_FUNCALL_DEPTH_MAX 512
    4154#endif
    4255
     
    5467
    5568#define ARENA_RESTORE(mrb,ai) (mrb)->gc.arena_idx = (ai)
     69
     70#define CALL_MAXARGS 127
     71
     72void mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value self, mrb_value args);
    5673
    5774static inline void
     
    99116
    100117static inline void
    101 envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase)
     118envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase, size_t size)
    102119{
    103120  mrb_callinfo *ci = mrb->c->cibase;
     
    106123  while (ci <= mrb->c->ci) {
    107124    struct REnv *e = ci->env;
    108     if (e && MRB_ENV_STACK_SHARED_P(e)) {
     125    mrb_value *st;
     126
     127    if (e && MRB_ENV_STACK_SHARED_P(e) &&
     128        (st = e->stack) && oldbase <= st && st < oldbase+size) {
    109129      ptrdiff_t off = e->stack - oldbase;
    110130
     
    116136}
    117137
    118 static inline void
    119 init_new_stack_space(mrb_state *mrb, int room, int keep)
    120 {
    121   if (room > keep) {
    122     /* do not leave uninitialized malloc region */
    123     stack_clear(&(mrb->c->stack[keep]), room - keep);
    124   }
    125 }
    126 
    127138/** def rec ; $deep =+ 1 ; if $deep > 1000 ; return 0 ; end ; rec ; end  */
    128139
    129140static void
    130 stack_extend_alloc(mrb_state *mrb, int room, int keep)
     141stack_extend_alloc(mrb_state *mrb, int room)
    131142{
    132143  mrb_value *oldbase = mrb->c->stbase;
    133   int size = mrb->c->stend - mrb->c->stbase;
    134   int off = mrb->c->stack - mrb->c->stbase;
    135 
     144  mrb_value *newstack;
     145  size_t oldsize = mrb->c->stend - mrb->c->stbase;
     146  size_t size = oldsize;
     147  size_t off = mrb->c->stack - mrb->c->stbase;
     148
     149  if (off > size) size = off;
    136150#ifdef MRB_STACK_EXTEND_DOUBLING
    137151  if (room <= size)
     
    149163#endif
    150164
    151   mrb->c->stbase = (mrb_value *)mrb_realloc(mrb, mrb->c->stbase, sizeof(mrb_value) * size);
     165  newstack = (mrb_value *)mrb_realloc(mrb, mrb->c->stbase, sizeof(mrb_value) * size);
     166  if (newstack == NULL) {
     167    mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err));
     168  }
     169  stack_clear(&(newstack[oldsize]), size - oldsize);
     170  envadjust(mrb, oldbase, newstack, size);
     171  mrb->c->stbase = newstack;
    152172  mrb->c->stack = mrb->c->stbase + off;
    153173  mrb->c->stend = mrb->c->stbase + size;
    154   envadjust(mrb, oldbase, mrb->c->stbase);
    155174
    156175  /* Raise an exception if the new stack size will be too large,
    157176     to prevent infinite recursion. However, do this only after resizing the stack, so mrb_raise has stack space to work with. */
    158177  if (size > MRB_STACK_MAX) {
    159     init_new_stack_space(mrb, room, keep);
    160     mrb_raise(mrb, E_SYSSTACK_ERROR, "stack level too deep. (limit=" MRB_STRINGIZE(MRB_STACK_MAX) ")");
     178    mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err));
    161179  }
    162180}
    163181
    164182static inline void
    165 stack_extend(mrb_state *mrb, int room, int keep)
     183stack_extend(mrb_state *mrb, int room)
    166184{
    167185  if (mrb->c->stack + room >= mrb->c->stend) {
    168     stack_extend_alloc(mrb, room, keep);
    169   }
    170   init_new_stack_space(mrb, room, keep);
     186    stack_extend_alloc(mrb, room);
     187  }
    171188}
    172189
     
    188205  int cioff = e->cioff;
    189206
    190   if (MRB_ENV_STACK_SHARED_P(e) && mrb->c->cibase[cioff].proc &&
    191       MRB_PROC_STRICT_P(mrb->c->cibase[cioff].proc)) {
     207  if (MRB_ENV_STACK_SHARED_P(e) && e->cxt.c->cibase[cioff].proc &&
     208      MRB_PROC_STRICT_P(e->cxt.c->cibase[cioff].proc)) {
    192209    return TRUE;
    193210  }
     
    210227#define CI_ACC_SKIP    -1
    211228#define CI_ACC_DIRECT  -2
     229#define CI_ACC_RESUMED -3
    212230
    213231static mrb_callinfo*
     
    217235  mrb_callinfo *ci = c->ci;
    218236
    219   int eidx = ci->eidx;
    220237  int ridx = ci->ridx;
    221238
     
    228245  }
    229246  ci = ++c->ci;
    230   ci->eidx = eidx;
     247  ci->epos = mrb->c->eidx;
    231248  ci->ridx = ridx;
    232249  ci->env = 0;
     
    234251  ci->err = 0;
    235252  ci->proc = 0;
     253  ci->acc = 0;
    236254
    237255  return ci;
     256}
     257
     258MRB_API void
     259mrb_env_unshare(mrb_state *mrb, struct REnv *e)
     260{
     261  size_t len = (size_t)MRB_ENV_STACK_LEN(e);
     262  ptrdiff_t cioff = e->cioff;
     263  mrb_value *p;
     264
     265  if (!MRB_ENV_STACK_SHARED_P(e)) return;
     266  if (e->cxt.c != mrb->c) return;
     267  if (e->cioff == 0 && e->cxt.c == mrb->root_c) return;
     268  MRB_ENV_UNSHARE_STACK(e);
     269  if (!e->c) {
     270    /* save block argument position (negated) */
     271    e->cioff = -e->cxt.c->cibase[cioff].argc-1;
     272  }
     273  e->cxt.mid = e->cxt.c->cibase[cioff].mid;
     274  p = (mrb_value *)mrb_malloc(mrb, sizeof(mrb_value)*len);
     275  if (len > 0) {
     276    stack_copy(p, e->stack, len);
     277  }
     278  e->stack = p;
     279  mrb_write_barrier(mrb, (struct RBasic *)e);
    238280}
    239281
     
    242284{
    243285  struct mrb_context *c = mrb->c;
    244 
    245   if (c->ci->env) {
    246     struct REnv *e = c->ci->env;
    247     size_t len = (size_t)MRB_ENV_STACK_LEN(e);
    248     mrb_value *p = (mrb_value *)mrb_malloc(mrb, sizeof(mrb_value)*len);
    249 
    250     MRB_ENV_UNSHARE_STACK(e);
    251     if (len > 0) {
    252       stack_copy(p, e->stack, len);
    253     }
    254     e->stack = p;
    255     mrb_write_barrier(mrb, (struct RBasic *)e);
    256   }
     286  struct REnv *env = c->ci->env;
    257287
    258288  c->ci--;
    259 }
     289
     290  if (env) {
     291    mrb_env_unshare(mrb, env);
     292  }
     293}
     294
     295void mrb_exc_set(mrb_state *mrb, mrb_value exc);
    260296
    261297static void
     
    263299{
    264300  struct RProc *p;
    265   mrb_callinfo *ci;
     301  mrb_callinfo *ci = mrb->c->ci;
    266302  mrb_value *self = mrb->c->stack;
    267303  struct RObject *exc;
     304  ptrdiff_t cioff;
     305  int ai = mrb_gc_arena_save(mrb);
    268306
    269307  if (i<0) return;
     308  if (ci - mrb->c->cibase > MRB_FUNCALL_DEPTH_MAX) {
     309    mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err));
     310  }
    270311  p = mrb->c->ensure[i];
    271312  if (!p) return;
    272   if (mrb->c->ci->eidx > i)
    273     mrb->c->ci->eidx = i;
     313  mrb->c->ensure[i] = NULL;
     314  cioff = ci - mrb->c->cibase;
    274315  ci = cipush(mrb);
    275316  ci->stackent = mrb->c->stack;
     
    282323  mrb->c->stack = mrb->c->stack + ci[-1].nregs;
    283324  exc = mrb->exc; mrb->exc = 0;
     325  if (exc) {
     326    mrb_gc_protect(mrb, mrb_obj_value(exc));
     327  }
    284328  mrb_run(mrb, p, *self);
    285   mrb->c->ensure[i] = NULL;
     329  mrb->c->ci = mrb->c->cibase + cioff;
    286330  if (!mrb->exc) mrb->exc = exc;
     331  mrb_gc_arena_restore(mrb, ai);
    287332}
    288333
     
    335380    }
    336381    MRB_END_EXC(&c_jmp);
     382    mrb->jmp = 0;
    337383  }
    338384  else {
    339385    struct RProc *p;
    340386    struct RClass *c;
    341     mrb_sym undef = 0;
    342387    mrb_callinfo *ci;
    343388    int n;
     
    354399    p = mrb_method_search_vm(mrb, &c, mid);
    355400    if (!p) {
    356       undef = mid;
    357       mid = mrb_intern_lit(mrb, "method_missing");
    358       p = mrb_method_search_vm(mrb, &c, mid);
    359       n++; argc++;
     401      mrb_sym missing = mrb_intern_lit(mrb, "method_missing");
     402      mrb_value args = mrb_ary_new_from_values(mrb, argc, argv);
     403      p = mrb_method_search_vm(mrb, &c, missing);
     404      if (!p) {
     405        mrb_method_missing(mrb, mid, self, args);
     406      }
     407      mrb_ary_unshift(mrb, args, mrb_symbol_value(mid));
     408      stack_extend(mrb, n+2);
     409      mrb->c->stack[n+1] = args;
     410      argc = -1;
     411    }
     412    if (mrb->c->ci - mrb->c->cibase > MRB_FUNCALL_DEPTH_MAX) {
     413      mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err));
    360414    }
    361415    ci = cipush(mrb);
     
    371425    if (MRB_PROC_CFUNC_P(p)) {
    372426      ci->nregs = argc + 2;
    373       stack_extend(mrb, ci->nregs, 0);
     427      stack_extend(mrb, ci->nregs);
     428    }
     429    else if (argc >= CALL_MAXARGS) {
     430      mrb_value args = mrb_ary_new_from_values(mrb, argc, argv);
     431      stack_extend(mrb, ci->nregs);
     432      mrb->c->stack[1] = args;
     433      ci->argc = -1;
     434      argc = 1;
    374435    }
    375436    else {
    376       ci->nregs = p->body.irep->nregs + n;
    377       stack_extend(mrb, ci->nregs, argc+2);
     437      if (argc < 0) argc = 1;
     438      ci->nregs = p->body.irep->nregs + argc;
     439      stack_extend(mrb, ci->nregs);
    378440    }
    379441    if (voff >= 0) {
     
    381443    }
    382444    mrb->c->stack[0] = self;
    383     if (undef) {
    384       mrb->c->stack[1] = mrb_symbol_value(undef);
    385       if (argc > 1) {
    386         stack_copy(mrb->c->stack+2, argv, argc-1);
    387       }
    388     }
    389     else if (argc > 0) {
     445    if (ci->argc > 0) {
    390446      stack_copy(mrb->c->stack+1, argv, argc);
    391447    }
     
    414470{
    415471  return mrb_funcall_with_block(mrb, self, mid, argc, argv, mrb_nil_value());
     472}
     473
     474mrb_value
     475mrb_exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p)
     476{
     477  mrb_callinfo *ci = mrb->c->ci;
     478
     479  mrb->c->stack[0] = self;
     480  ci->proc = p;
     481  ci->target_class = p->target_class;
     482  if (MRB_PROC_CFUNC_P(p)) {
     483    return p->body.func(mrb, self);
     484  }
     485  if (ci->argc < 0) {
     486    stack_extend(mrb, (p->body.irep->nregs < 3) ? 3 : p->body.irep->nregs);
     487  }
     488  else {
     489    stack_extend(mrb, p->body.irep->nregs);
     490  }
     491
     492  ci->nregs = p->body.irep->nregs;
     493  ci = cipush(mrb);
     494  ci->nregs = 0;
     495  ci->target_class = 0;
     496  ci->pc = p->body.irep->iseq;
     497  ci->stackent = mrb->c->stack;
     498  ci->acc = 0;
     499
     500  return self;
    416501}
    417502
     
    446531
    447532  mrb_get_args(mrb, "n*&", &name, &argv, &argc, &block);
     533  ci = mrb->c->ci;
     534  if (ci->acc < 0) {
     535  funcall:
     536    return mrb_funcall_with_block(mrb, self, name, argc, argv, block);
     537  }
    448538
    449539  c = mrb_class(mrb, self);
     
    451541
    452542  if (!p) {                     /* call method_mising */
    453     return mrb_funcall_with_block(mrb, self, name, argc, argv, block);
    454   }
    455 
    456   ci = mrb->c->ci;
     543    goto funcall;
     544  }
     545
    457546  ci->mid = name;
    458547  ci->target_class = c;
    459   ci->proc = p;
    460548  regs = mrb->c->stack+1;
    461549  /* remove first symbol from arguments */
     
    470558  }
    471559
    472   if (MRB_PROC_CFUNC_P(p)) {
    473     return p->body.func(mrb, self);
    474   }
    475 
    476   if (ci->argc < 0) {
    477     stack_extend(mrb, (p->body.irep->nregs < 3) ? 3 : p->body.irep->nregs, 3);
    478   }
    479   else {
    480     stack_extend(mrb, p->body.irep->nregs, ci->argc+2);
    481   }
    482 
    483   ci->nregs = p->body.irep->nregs;
    484   ci = cipush(mrb);
    485   ci->nregs = 0;
    486   ci->target_class = 0;
    487   ci->pc = p->body.irep->iseq;
    488   ci->stackent = mrb->c->stack;
    489   ci->acc = 0;
    490 
    491   return self;
     560  return mrb_exec_irep(mrb, self, p);
    492561}
    493562
     
    497566  struct RProc *p;
    498567  mrb_callinfo *ci;
     568  mrb_int max = 3;
    499569
    500570  if (mrb_nil_p(blk)) {
     
    503573  ci = mrb->c->ci;
    504574  if (ci->acc == CI_ACC_DIRECT) {
    505     return mrb_yield_with_class(mrb, blk, 0, 0, self, c);
     575    ci->target_class = c;
     576    return mrb_yield_cont(mrb, blk, self, 1, &self);
    506577  }
    507578  ci->target_class = c;
    508579  p = mrb_proc_ptr(blk);
    509580  ci->proc = p;
     581  ci->argc = 1;
     582  ci->mid = ci[-1].mid;
    510583  if (MRB_PROC_CFUNC_P(p)) {
     584    stack_extend(mrb, 3);
     585    mrb->c->stack[0] = self;
     586    mrb->c->stack[1] = self;
     587    mrb->c->stack[2] = mrb_nil_value();
    511588    return p->body.func(mrb, self);
    512589  }
    513590  ci->nregs = p->body.irep->nregs;
     591  if (max < ci->nregs) max = ci->nregs;
     592  stack_extend(mrb, max);
     593  mrb->c->stack[0] = self;
     594  mrb->c->stack[1] = self;
     595  mrb->c->stack[2] = mrb_nil_value();
    514596  ci = cipush(mrb);
    515597  ci->nregs = 0;
     
    600682    mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
    601683  }
     684  if (mrb->c->ci - mrb->c->cibase > MRB_FUNCALL_DEPTH_MAX) {
     685    mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err));
     686  }
    602687  p = mrb_proc_ptr(b);
    603688  ci = cipush(mrb);
     
    611696  if (MRB_PROC_CFUNC_P(p)) {
    612697    ci->nregs = argc + 2;
    613     stack_extend(mrb, ci->nregs, 0);
     698    stack_extend(mrb, ci->nregs);
    614699  }
    615700  else {
    616701    ci->nregs = p->body.irep->nregs;
    617     stack_extend(mrb, ci->nregs, argc+2);
     702    stack_extend(mrb, ci->nregs);
    618703  }
    619704
     
    627712    val = p->body.func(mrb, self);
    628713    mrb->c->stack = mrb->c->ci->stackent;
    629     cipop(mrb);
    630714  }
    631715  else {
     716    int cioff = mrb->c->ci - mrb->c->cibase;
    632717    val = mrb_run(mrb, p, self);
    633   }
     718    mrb->c->ci = mrb->c->cibase + cioff;
     719  }
     720  cipop(mrb);
    634721  return val;
    635722}
     
    649736
    650737  return mrb_yield_with_class(mrb, b, 1, &arg, p->env->stack[0], p->target_class);
     738}
     739
     740mrb_value
     741mrb_yield_cont(mrb_state *mrb, mrb_value b, mrb_value self, mrb_int argc, const mrb_value *argv)
     742{
     743  struct RProc *p;
     744  mrb_callinfo *ci;
     745
     746  if (mrb_nil_p(b)) {
     747    mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
     748  }
     749  if (mrb_type(b) != MRB_TT_PROC) {
     750    mrb_raise(mrb, E_TYPE_ERROR, "not a block");
     751  }
     752
     753  p = mrb_proc_ptr(b);
     754  ci = mrb->c->ci;
     755
     756  stack_extend(mrb, 3);
     757  mrb->c->stack[1] = mrb_ary_new_from_values(mrb, argc, argv);
     758  mrb->c->stack[2] = mrb_nil_value();
     759  ci->argc = -1;
     760  return mrb_exec_irep(mrb, self, p);
     761}
     762
     763static struct RBreak*
     764break_new(mrb_state *mrb, struct RProc *p, mrb_value val)
     765{
     766  struct RBreak *brk;
     767
     768  brk = (struct RBreak*)mrb_obj_alloc(mrb, MRB_TT_BREAK, NULL);
     769  brk->iv = NULL;
     770  brk->proc = p;
     771  brk->val = val;
     772
     773  return brk;
    651774}
    652775
     
    670793  mrb_str_cat(mrb, msg, kind_str[kind], kind_str_len[kind]);
    671794  exc = mrb_exc_new_str(mrb, E_LOCALJUMP_ERROR, msg);
    672   mrb->exc = mrb_obj_ptr(exc);
     795  mrb_exc_set(mrb, exc);
    673796}
    674797
     
    678801  mrb_value exc;
    679802  mrb_value str;
    680 
     803  mrb_int argc = mrb->c->ci->argc;
     804
     805  if (argc < 0) {
     806    mrb_value args = mrb->c->stack[1];
     807    if (mrb_array_p(args)) {
     808      argc = RARRAY_LEN(args);
     809    }
     810  }
    681811  if (mrb->c->ci->mid) {
    682812    str = mrb_format(mrb, "'%S': wrong number of arguments (%S for %S)",
    683813                  mrb_sym2str(mrb, mrb->c->ci->mid),
    684                   mrb_fixnum_value(mrb->c->ci->argc), mrb_fixnum_value(num));
     814                  mrb_fixnum_value(argc), mrb_fixnum_value(num));
    685815  }
    686816  else {
    687817    str = mrb_format(mrb, "wrong number of arguments (%S for %S)",
    688                   mrb_fixnum_value(mrb->c->ci->argc), mrb_fixnum_value(num));
     818                     mrb_fixnum_value(argc), mrb_fixnum_value(num));
    689819  }
    690820  exc = mrb_exc_new_str(mrb, E_ARGUMENT_ERROR, str);
    691   mrb->exc = mrb_obj_ptr(exc);
     821  mrb_exc_set(mrb, exc);
    692822}
    693823
     
    700830#endif
    701831
     832#ifdef MRB_BYTECODE_DECODE_OPTION
     833#define BYTECODE_DECODER(x) ((mrb)->bytecode_decoder)?(mrb)->bytecode_decoder((mrb), (x)):(x)
     834#else
     835#define BYTECODE_DECODER(x) (x)
     836#endif
     837
     838
    702839#if defined __GNUC__ || defined __clang__ || defined __INTEL_COMPILER
    703840#define DIRECT_THREADED
     
    706843#ifndef DIRECT_THREADED
    707844
    708 #define INIT_DISPATCH for (;;) { i = *pc; CODE_FETCH_HOOK(mrb, irep, pc, regs); switch (GET_OPCODE(i)) {
     845#define INIT_DISPATCH for (;;) { i = BYTECODE_DECODER(*pc); CODE_FETCH_HOOK(mrb, irep, pc, regs); switch (GET_OPCODE(i)) {
    709846#define CASE(op) case op:
    710847#define NEXT pc++; break
     
    716853#define INIT_DISPATCH JUMP; return mrb_nil_value();
    717854#define CASE(op) L_ ## op:
    718 #define NEXT i=*++pc; CODE_FETCH_HOOK(mrb, irep, pc, regs); goto *optable[GET_OPCODE(i)]
    719 #define JUMP i=*pc; CODE_FETCH_HOOK(mrb, irep, pc, regs); goto *optable[GET_OPCODE(i)]
     855#define NEXT i=BYTECODE_DECODER(*++pc); CODE_FETCH_HOOK(mrb, irep, pc, regs); goto *optable[GET_OPCODE(i)]
     856#define JUMP i=BYTECODE_DECODER(*pc); CODE_FETCH_HOOK(mrb, irep, pc, regs); goto *optable[GET_OPCODE(i)]
    720857
    721858#define END_DISPATCH
     
    723860#endif
    724861
    725 #define CALL_MAXARGS 127
    726 
    727 void mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value self, mrb_value args);
    728 
    729862MRB_API mrb_value
    730 mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep)
     863mrb_vm_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep)
     864{
     865  mrb_irep *irep = proc->body.irep;
     866  mrb_value result;
     867  struct mrb_context *c = mrb->c;
     868  int cioff = c->ci - c->cibase;
     869  unsigned int nregs = irep->nregs;
     870
     871  if (!c->stack) {
     872    stack_init(mrb);
     873  }
     874  if (stack_keep > nregs)
     875    nregs = stack_keep;
     876  stack_extend(mrb, nregs);
     877  stack_clear(c->stack + stack_keep, nregs - stack_keep);
     878  c->stack[0] = self;
     879  result = mrb_vm_exec(mrb, proc, irep->iseq);
     880  if (c->ci - c->cibase > cioff) {
     881    c->ci = c->cibase + cioff;
     882  }
     883  if (mrb->c != c) {
     884    if (mrb->c->fib) {
     885      mrb_write_barrier(mrb, (struct RBasic*)mrb->c->fib);
     886    }
     887    mrb->c = c;
     888  }
     889  return result;
     890}
     891
     892MRB_API mrb_value
     893mrb_vm_exec(mrb_state *mrb, struct RProc *proc, mrb_code *pc)
    731894{
    732895  /* mrb_assert(mrb_proc_cfunc_p(proc)) */
    733896  mrb_irep *irep = proc->body.irep;
    734   mrb_code *pc = irep->iseq;
    735897  mrb_value *pool = irep->pool;
    736898  mrb_sym *syms = irep->syms;
    737   mrb_value *regs = NULL;
    738899  mrb_code i;
    739900  int ai = mrb_gc_arena_save(mrb);
     
    773934  if (exc_catched) {
    774935    exc_catched = FALSE;
     936    if (mrb->exc && mrb->exc->tt == MRB_TT_BREAK)
     937      goto L_BREAK;
    775938    goto L_RAISE;
    776939  }
    777940  mrb->jmp = &c_jmp;
    778   if (!mrb->c->stack) {
    779     stack_init(mrb);
    780   }
    781   stack_extend(mrb, irep->nregs, stack_keep);
    782941  mrb->c->ci->proc = proc;
    783942  mrb->c->ci->nregs = irep->nregs;
    784   regs = mrb->c->stack;
    785   regs[0] = self;
    786 
     943
     944#define regs (mrb->c->stack)
    787945  INIT_DISPATCH {
    788946    CASE(OP_NOP) {
     
    793951    CASE(OP_MOVE) {
    794952      /* A B    R(A) := R(B) */
    795       regs[GETARG_A(i)] = regs[GETARG_B(i)];
     953      int a = GETARG_A(i);
     954      int b = GETARG_B(i);
     955      regs[a] = regs[b];
    796956      NEXT;
    797957    }
     
    799959    CASE(OP_LOADL) {
    800960      /* A Bx   R(A) := Pool(Bx) */
    801       regs[GETARG_A(i)] = pool[GETARG_Bx(i)];
     961      int a = GETARG_A(i);
     962      int bx = GETARG_Bx(i);
     963#ifdef MRB_WORD_BOXING
     964      mrb_value val = pool[bx];
     965      if (mrb_float_p(val)) {
     966        val = mrb_float_value(mrb, mrb_float(val));
     967      }
     968      regs[a] = val;
     969#else
     970      regs[a] = pool[bx];
     971#endif
    802972      NEXT;
    803973    }
     
    811981    CASE(OP_LOADSYM) {
    812982      /* A Bx   R(A) := Syms(Bx) */
    813       SET_SYM_VALUE(regs[GETARG_A(i)], syms[GETARG_Bx(i)]);
     983      int a = GETARG_A(i);
     984      int bx = GETARG_Bx(i);
     985      SET_SYM_VALUE(regs[a], syms[bx]);
    814986      NEXT;
    815987    }
     
    817989    CASE(OP_LOADSELF) {
    818990      /* A      R(A) := self */
    819       regs[GETARG_A(i)] = regs[0];
     991      int a = GETARG_A(i);
     992      regs[a] = regs[0];
    820993      NEXT;
    821994    }
     
    823996    CASE(OP_LOADT) {
    824997      /* A      R(A) := true */
    825       SET_TRUE_VALUE(regs[GETARG_A(i)]);
     998      int a = GETARG_A(i);
     999      SET_TRUE_VALUE(regs[a]);
    8261000      NEXT;
    8271001    }
     
    8291003    CASE(OP_LOADF) {
    8301004      /* A      R(A) := false */
    831       SET_FALSE_VALUE(regs[GETARG_A(i)]);
     1005      int a = GETARG_A(i);
     1006      SET_FALSE_VALUE(regs[a]);
    8321007      NEXT;
    8331008    }
     
    8351010    CASE(OP_GETGLOBAL) {
    8361011      /* A Bx   R(A) := getglobal(Syms(Bx)) */
    837       regs[GETARG_A(i)] = mrb_gv_get(mrb, syms[GETARG_Bx(i)]);
     1012      int a = GETARG_A(i);
     1013      int bx = GETARG_Bx(i);
     1014      mrb_value val = mrb_gv_get(mrb, syms[bx]);
     1015      regs[a] = val;
    8381016      NEXT;
    8391017    }
    8401018
    8411019    CASE(OP_SETGLOBAL) {
    842       /* setglobal(Syms(Bx), R(A)) */
    843       mrb_gv_set(mrb, syms[GETARG_Bx(i)], regs[GETARG_A(i)]);
     1020      /* A Bx   setglobal(Syms(Bx), R(A)) */
     1021      int a = GETARG_A(i);
     1022      int bx = GETARG_Bx(i);
     1023      mrb_gv_set(mrb, syms[bx], regs[a]);
    8441024      NEXT;
    8451025    }
     
    8471027    CASE(OP_GETSPECIAL) {
    8481028      /* A Bx   R(A) := Special[Bx] */
    849       regs[GETARG_A(i)] = mrb_vm_special_get(mrb, GETARG_Bx(i));
     1029      int a = GETARG_A(i);
     1030      int bx = GETARG_Bx(i);
     1031      mrb_value val = mrb_vm_special_get(mrb, bx);
     1032      regs[a] = val;
    8501033      NEXT;
    8511034    }
     
    8531036    CASE(OP_SETSPECIAL) {
    8541037      /* A Bx   Special[Bx] := R(A) */
    855       mrb_vm_special_set(mrb, GETARG_Bx(i), regs[GETARG_A(i)]);
     1038      int a = GETARG_A(i);
     1039      int bx = GETARG_Bx(i);
     1040      mrb_vm_special_set(mrb, bx, regs[a]);
    8561041      NEXT;
    8571042    }
     
    8591044    CASE(OP_GETIV) {
    8601045      /* A Bx   R(A) := ivget(Bx) */
    861       regs[GETARG_A(i)] = mrb_vm_iv_get(mrb, syms[GETARG_Bx(i)]);
     1046      int a = GETARG_A(i);
     1047      int bx = GETARG_Bx(i);
     1048      mrb_value val = mrb_vm_iv_get(mrb, syms[bx]);
     1049      regs[a] = val;
    8621050      NEXT;
    8631051    }
    8641052
    8651053    CASE(OP_SETIV) {
    866       /* ivset(Syms(Bx),R(A)) */
    867       mrb_vm_iv_set(mrb, syms[GETARG_Bx(i)], regs[GETARG_A(i)]);
     1054      /* A Bx   ivset(Syms(Bx),R(A)) */
     1055      int a = GETARG_A(i);
     1056      int bx = GETARG_Bx(i);
     1057      mrb_vm_iv_set(mrb, syms[bx], regs[a]);
    8681058      NEXT;
    8691059    }
     
    8711061    CASE(OP_GETCV) {
    8721062      /* A Bx   R(A) := cvget(Syms(Bx)) */
     1063      int a = GETARG_A(i);
     1064      int bx = GETARG_Bx(i);
     1065      mrb_value val;
    8731066      ERR_PC_SET(mrb, pc);
    874       regs[GETARG_A(i)] = mrb_vm_cv_get(mrb, syms[GETARG_Bx(i)]);
     1067      val = mrb_vm_cv_get(mrb, syms[bx]);
    8751068      ERR_PC_CLR(mrb);
     1069      regs[a] = val;
    8761070      NEXT;
    8771071    }
    8781072
    8791073    CASE(OP_SETCV) {
    880       /* cvset(Syms(Bx),R(A)) */
    881       mrb_vm_cv_set(mrb, syms[GETARG_Bx(i)], regs[GETARG_A(i)]);
     1074      /* A Bx   cvset(Syms(Bx),R(A)) */
     1075      int a = GETARG_A(i);
     1076      int bx = GETARG_Bx(i);
     1077      mrb_vm_cv_set(mrb, syms[bx], regs[a]);
    8821078      NEXT;
    8831079    }
     
    8861082      /* A Bx    R(A) := constget(Syms(Bx)) */
    8871083      mrb_value val;
     1084      int a = GETARG_A(i);
     1085      int bx = GETARG_Bx(i);
     1086      mrb_sym sym = syms[bx];
    8881087
    8891088      ERR_PC_SET(mrb, pc);
    890       val = mrb_vm_const_get(mrb, syms[GETARG_Bx(i)]);
     1089      val = mrb_vm_const_get(mrb, sym);
    8911090      ERR_PC_CLR(mrb);
    892       regs = mrb->c->stack;
    893       regs[GETARG_A(i)] = val;
     1091      regs[a] = val;
    8941092      NEXT;
    8951093    }
     
    8971095    CASE(OP_SETCONST) {
    8981096      /* A Bx   constset(Syms(Bx),R(A)) */
    899       mrb_vm_const_set(mrb, syms[GETARG_Bx(i)], regs[GETARG_A(i)]);
     1097      int a = GETARG_A(i);
     1098      int bx = GETARG_Bx(i);
     1099      mrb_vm_const_set(mrb, syms[bx], regs[a]);
    9001100      NEXT;
    9011101    }
     
    9051105      mrb_value val;
    9061106      int a = GETARG_A(i);
     1107      int bx = GETARG_Bx(i);
    9071108
    9081109      ERR_PC_SET(mrb, pc);
    909       val = mrb_const_get(mrb, regs[a], syms[GETARG_Bx(i)]);
     1110      val = mrb_const_get(mrb, regs[a], syms[bx]);
    9101111      ERR_PC_CLR(mrb);
    911       regs = mrb->c->stack;
    9121112      regs[a] = val;
    9131113      NEXT;
     
    9171117      /* A Bx    R(A+1)::Syms(Bx) := R(A) */
    9181118      int a = GETARG_A(i);
    919 
    920       mrb_const_set(mrb, regs[a+1], syms[GETARG_Bx(i)], regs[a]);
     1119      int bx = GETARG_Bx(i);
     1120      mrb_const_set(mrb, regs[a+1], syms[bx], regs[a]);
    9211121      NEXT;
    9221122    }
     
    9241124    CASE(OP_GETUPVAR) {
    9251125      /* A B C  R(A) := uvget(B,C) */
    926       mrb_value *regs_a = regs + GETARG_A(i);
    927       int up = GETARG_C(i);
    928 
    929       struct REnv *e = uvenv(mrb, up);
     1126      int a = GETARG_A(i);
     1127      int b = GETARG_B(i);
     1128      int c = GETARG_C(i);
     1129      mrb_value *regs_a = regs + a;
     1130      struct REnv *e = uvenv(mrb, c);
    9301131
    9311132      if (!e) {
     
    9331134      }
    9341135      else {
    935         int idx = GETARG_B(i);
    936         *regs_a = e->stack[idx];
     1136        *regs_a = e->stack[b];
    9371137      }
    9381138      NEXT;
     
    9411141    CASE(OP_SETUPVAR) {
    9421142      /* A B C  uvset(B,C,R(A)) */
    943       int up = GETARG_C(i);
    944 
    945       struct REnv *e = uvenv(mrb, up);
     1143      int a = GETARG_A(i);
     1144      int b = GETARG_B(i);
     1145      int c = GETARG_C(i);
     1146
     1147      struct REnv *e = uvenv(mrb, c);
    9461148
    9471149      if (e) {
    948         mrb_value *regs_a = regs + GETARG_A(i);
    949         int idx = GETARG_B(i);
    950         e->stack[idx] = *regs_a;
    951         mrb_write_barrier(mrb, (struct RBasic*)e);
     1150        mrb_value *regs_a = regs + a;
     1151
     1152        if (b < MRB_ENV_STACK_LEN(e)) {
     1153          e->stack[b] = *regs_a;
     1154          mrb_write_barrier(mrb, (struct RBasic*)e);
     1155        }
    9521156      }
    9531157      NEXT;
     
    9561160    CASE(OP_JMP) {
    9571161      /* sBx    pc+=sBx */
    958       pc += GETARG_sBx(i);
     1162      int sbx = GETARG_sBx(i);
     1163      pc += sbx;
    9591164      JUMP;
    9601165    }
     
    9621167    CASE(OP_JMPIF) {
    9631168      /* A sBx  if R(A) pc+=sBx */
    964       if (mrb_test(regs[GETARG_A(i)])) {
    965         pc += GETARG_sBx(i);
     1169      int a = GETARG_A(i);
     1170      int sbx = GETARG_sBx(i);
     1171      if (mrb_test(regs[a])) {
     1172        pc += sbx;
    9661173        JUMP;
    9671174      }
     
    9711178    CASE(OP_JMPNOT) {
    9721179      /* A sBx  if !R(A) pc+=sBx */
    973       if (!mrb_test(regs[GETARG_A(i)])) {
    974         pc += GETARG_sBx(i);
     1180      int a = GETARG_A(i);
     1181      int sbx = GETARG_sBx(i);
     1182      if (!mrb_test(regs[a])) {
     1183        pc += sbx;
    9751184        JUMP;
    9761185      }
     
    9801189    CASE(OP_ONERR) {
    9811190      /* sBx    pc+=sBx on exception */
     1191      int sbx = GETARG_sBx(i);
    9821192      if (mrb->c->rsize <= mrb->c->ci->ridx) {
    983         if (mrb->c->rsize == 0) mrb->c->rsize = 16;
     1193        if (mrb->c->rsize == 0) mrb->c->rsize = RESCUE_STACK_INIT_SIZE;
    9841194        else mrb->c->rsize *= 2;
    9851195        mrb->c->rescue = (mrb_code **)mrb_realloc(mrb, mrb->c->rescue, sizeof(mrb_code*) * mrb->c->rsize);
    9861196      }
    987       mrb->c->rescue[mrb->c->ci->ridx++] = pc + GETARG_sBx(i);
     1197      mrb->c->rescue[mrb->c->ci->ridx++] = pc + sbx;
    9881198      NEXT;
    9891199    }
    9901200
    9911201    CASE(OP_RESCUE) {
    992       /* A      R(A) := exc; clear(exc) */
    993       SET_OBJ_VALUE(regs[GETARG_A(i)], mrb->exc);
    994       mrb->exc = 0;
     1202      /* A B    R(A) := exc; clear(exc); R(B) := matched (bool) */
     1203      int a = GETARG_A(i);
     1204      int b = GETARG_B(i);
     1205      int c = GETARG_C(i);
     1206      mrb_value exc;
     1207
     1208      if (c == 0) {
     1209        exc = mrb_obj_value(mrb->exc);
     1210        mrb->exc = 0;
     1211      }
     1212      else {           /* continued; exc taken from R(A) */
     1213        exc = regs[a];
     1214      }
     1215      if (b != 0) {
     1216        mrb_value e = regs[b];
     1217        struct RClass *ec;
     1218
     1219        switch (mrb_type(e)) {
     1220        case MRB_TT_CLASS:
     1221        case MRB_TT_MODULE:
     1222          break;
     1223        default:
     1224          {
     1225            mrb_value exc;
     1226
     1227            exc = mrb_exc_new_str_lit(mrb, E_TYPE_ERROR,
     1228                  "class or module required for rescue clause");
     1229            mrb_exc_set(mrb, exc);
     1230            goto L_RAISE;
     1231          }
     1232        }
     1233        ec = mrb_class_ptr(e);
     1234        regs[b] = mrb_bool_value(mrb_obj_is_kind_of(mrb, exc, ec));
     1235      }
     1236      if (a != 0 && c == 0) {
     1237        regs[a] = exc;
     1238      }
    9951239      NEXT;
    9961240    }
     
    10081252    CASE(OP_RAISE) {
    10091253      /* A      raise(R(A)) */
    1010       mrb->exc = mrb_obj_ptr(regs[GETARG_A(i)]);
     1254      int a = GETARG_A(i);
     1255
     1256      mrb_exc_set(mrb, regs[a]);
    10111257      goto L_RAISE;
    10121258    }
     
    10141260    CASE(OP_EPUSH) {
    10151261      /* Bx     ensure_push(SEQ[Bx]) */
     1262      int bx = GETARG_Bx(i);
    10161263      struct RProc *p;
    10171264
    1018       p = mrb_closure_new(mrb, irep->reps[GETARG_Bx(i)]);
     1265      p = mrb_closure_new(mrb, irep->reps[bx]);
    10191266      /* push ensure_stack */
    1020       if (mrb->c->esize <= mrb->c->ci->eidx) {
    1021         if (mrb->c->esize == 0) mrb->c->esize = 16;
     1267      if (mrb->c->esize <= mrb->c->eidx+1) {
     1268        if (mrb->c->esize == 0) mrb->c->esize = ENSURE_STACK_INIT_SIZE;
    10221269        else mrb->c->esize *= 2;
    10231270        mrb->c->ensure = (struct RProc **)mrb_realloc(mrb, mrb->c->ensure, sizeof(struct RProc*) * mrb->c->esize);
    10241271      }
    1025       mrb->c->ensure[mrb->c->ci->eidx++] = p;
     1272      mrb->c->ensure[mrb->c->eidx++] = p;
     1273      mrb->c->ensure[mrb->c->eidx] = NULL;
    10261274      ARENA_RESTORE(mrb, ai);
    10271275      NEXT;
     
    10321280      int a = GETARG_A(i);
    10331281      mrb_callinfo *ci = mrb->c->ci;
    1034       int n, eidx = ci->eidx;
    1035 
    1036       for (n=0; n<a && (ci == mrb->c->cibase || eidx > ci[-1].eidx); n++) {
    1037         ecall(mrb, --eidx);
     1282      int n, epos = ci->epos;
     1283
     1284      for (n=0; n<a && mrb->c->eidx > epos; n++) {
     1285        ecall(mrb, --mrb->c->eidx);
    10381286        ARENA_RESTORE(mrb, ai);
    10391287      }
     
    10611309      struct RProc *m;
    10621310      struct RClass *c;
    1063       mrb_callinfo *ci;
     1311      mrb_callinfo *ci = mrb->c->ci;
    10641312      mrb_value recv, result;
    10651313      mrb_sym mid = syms[GETARG_B(i)];
     1314      int bidx;
     1315      mrb_value blk;
    10661316
    10671317      recv = regs[a];
     1318      if (n == CALL_MAXARGS) {
     1319        bidx = a+2;
     1320      }
     1321      else {
     1322        bidx = a+n+1;
     1323      }
    10681324      if (GET_OPCODE(i) != OP_SENDB) {
    1069         if (n == CALL_MAXARGS) {
    1070           SET_NIL_VALUE(regs[a+2]);
    1071         }
    1072         else {
    1073           SET_NIL_VALUE(regs[a+n+1]);
     1325        if (bidx >= ci->nregs) {
     1326          stack_extend(mrb, bidx+1);
     1327          ci->nregs = bidx+1;
     1328        }
     1329        SET_NIL_VALUE(regs[bidx]);
     1330        blk = mrb_nil_value();
     1331      }
     1332      else {
     1333        blk = regs[bidx];
     1334        if (!mrb_nil_p(blk) && mrb_type(blk) != MRB_TT_PROC) {
     1335          if (bidx >= ci->nregs) {
     1336            stack_extend(mrb, bidx+1);
     1337            ci->nregs = bidx+1;
     1338          }
     1339          result = mrb_convert_type(mrb, blk, MRB_TT_PROC, "Proc", "to_proc");
     1340          blk = regs[bidx] = result;
    10741341        }
    10751342      }
     
    10901357            args = mrb_ary_new_from_values(mrb, n, regs+a+1);
    10911358          }
     1359          ERR_PC_SET(mrb, pc);
    10921360          mrb_method_missing(mrb, mid, recv, args);
    10931361        }
    10941362        mid = missing;
    1095         if (n == CALL_MAXARGS) {
    1096           mrb_ary_unshift(mrb, regs[a+1], sym);
    1097         }
    1098         else {
    1099           value_move(regs+a+2, regs+a+1, ++n);
    1100           regs[a+1] = sym;
    1101         }
     1363        if (n != CALL_MAXARGS) {
     1364          if (a+2 >= irep->nregs) {
     1365            stack_extend(mrb, a+3);
     1366          }
     1367          regs[a+1] = mrb_ary_new_from_values(mrb, n, regs+a+1);
     1368          regs[a+2] = blk;
     1369          n = CALL_MAXARGS;
     1370        }
     1371        mrb_ary_unshift(mrb, regs[a+1], sym);
    11021372      }
    11031373
     
    11251395        }
    11261396        result = m->body.func(mrb, recv);
    1127         mrb->c->stack[0] = result;
    11281397        mrb_gc_arena_restore(mrb, ai);
    11291398        if (mrb->exc) goto L_RAISE;
    1130         /* pop stackpos */
    11311399        ci = mrb->c->ci;
     1400        if (GET_OPCODE(i) == OP_SENDB) {
     1401          if (mrb_type(blk) == MRB_TT_PROC) {
     1402            struct RProc *p = mrb_proc_ptr(blk);
     1403
     1404            if (p && !MRB_PROC_STRICT_P(p) && p->env == ci[-1].env) {
     1405              p->flags |= MRB_PROC_ORPHAN;
     1406            }
     1407          }
     1408        }
    11321409        if (!ci->target_class) { /* return from context modifying method (resume/yield) */
    1133           if (!MRB_PROC_CFUNC_P(ci[-1].proc)) {
     1410          if (ci->acc == CI_ACC_RESUMED) {
     1411            mrb->jmp = prev_jmp;
     1412            return result;
     1413          }
     1414          else {
     1415            mrb_assert(!MRB_PROC_CFUNC_P(ci[-1].proc));
    11341416            proc = ci[-1].proc;
    11351417            irep = proc->body.irep;
     
    11381420          }
    11391421        }
    1140         regs = mrb->c->stack = ci->stackent;
     1422        mrb->c->stack[0] = result;
     1423        /* pop stackpos */
     1424        mrb->c->stack = ci->stackent;
    11411425        pc = ci->pc;
    11421426        cipop(mrb);
     
    11521436        if (n == CALL_MAXARGS) {
    11531437          ci->argc = -1;
    1154           stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
     1438          stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs);
    11551439        }
    11561440        else {
    11571441          ci->argc = n;
    1158           stack_extend(mrb, irep->nregs,  n+2);
    1159         }
    1160         regs = mrb->c->stack;
     1442          stack_extend(mrb, irep->nregs);
     1443        }
    11611444        pc = irep->iseq;
    11621445        JUMP;
     
    11661449    CASE(OP_FSEND) {
    11671450      /* A B C  R(A) := fcall(R(A),Syms(B),R(A+1),... ,R(A+C-1)) */
     1451      /* not implemented yet */
    11681452      NEXT;
    11691453    }
     
    11801464      ci->proc = m;
    11811465      if (m->env) {
    1182         if (m->env->mid) {
    1183           ci->mid = m->env->mid;
    1184         }
     1466        mrb_sym mid;
     1467
     1468        if (MRB_ENV_STACK_SHARED_P(m->env)) {
     1469          mid = m->env->cxt.c->cibase[m->env->cioff].mid;
     1470        }
     1471        else {
     1472          mid = m->env->cxt.mid;
     1473        }
     1474        if (mid) ci->mid = mid;
    11851475        if (!m->env->stack) {
    11861476          m->env->stack = mrb->c->stack;
     
    11951485        /* pop stackpos */
    11961486        ci = mrb->c->ci;
    1197         regs = mrb->c->stack = ci->stackent;
     1487        mrb->c->stack = ci->stackent;
    11981488        regs[ci->acc] = recv;
    11991489        pc = ci->pc;
     
    12151505        syms = irep->syms;
    12161506        ci->nregs = irep->nregs;
     1507        stack_extend(mrb, irep->nregs);
    12171508        if (ci->argc < 0) {
    1218           stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
    1219         }
    1220         else {
    1221           stack_extend(mrb, irep->nregs, ci->argc+2);
    1222         }
    1223         regs = mrb->c->stack;
    1224         regs[0] = m->env->stack[0];
     1509          if (irep->nregs > 3) {
     1510            stack_clear(regs+3, irep->nregs-3);
     1511          }
     1512        }
     1513        else if (ci->argc+2 < irep->nregs) {
     1514          stack_clear(regs+ci->argc+2, irep->nregs-ci->argc-2);
     1515        }
     1516        if (m->env) {
     1517          regs[0] = m->env->stack[0];
     1518        }
    12251519        pc = irep->iseq;
    12261520        JUMP;
     
    12371531      int a = GETARG_A(i);
    12381532      int n = GETARG_C(i);
    1239 
    1240       if (mid == 0) {
     1533      mrb_value blk;
     1534      int bidx;
     1535
     1536      if (mid == 0 || !ci->target_class) {
    12411537        mrb_value exc;
    12421538
    12431539        exc = mrb_exc_new_str_lit(mrb, E_NOMETHOD_ERROR, "super called outside of method");
    1244         mrb->exc = mrb_obj_ptr(exc);
     1540        mrb_exc_set(mrb, exc);
    12451541        goto L_RAISE;
    12461542      }
     
    12491545      m = mrb_method_search_vm(mrb, &c, mid);
    12501546      if (!m) {
    1251         mid = mrb_intern_lit(mrb, "method_missing");
    1252         m = mrb_method_search_vm(mrb, &c, mid);
     1547        mrb_sym missing = mrb_intern_lit(mrb, "method_missing");
     1548        m = mrb_method_search_vm(mrb, &c, missing);
     1549        if (!m) {
     1550          mrb_value args;
     1551
     1552          if (n == CALL_MAXARGS) {
     1553            args = regs[a+1];
     1554          }
     1555          else {
     1556            args = mrb_ary_new_from_values(mrb, n, regs+a+1);
     1557          }
     1558          ERR_PC_SET(mrb, pc);
     1559          mrb_method_missing(mrb, mid, recv, args);
     1560        }
     1561        mid = missing;
     1562        if (n == CALL_MAXARGS-1) {
     1563          regs[a+1] = mrb_ary_new_from_values(mrb, n, regs+a+1);
     1564          n++;
     1565        }
    12531566        if (n == CALL_MAXARGS) {
    12541567          mrb_ary_unshift(mrb, regs[a+1], mrb_symbol_value(ci->mid));
     
    12581571          SET_SYM_VALUE(regs[a+1], ci->mid);
    12591572        }
     1573      }
     1574
     1575      if (n == CALL_MAXARGS) {
     1576        bidx = a+2;
     1577      }
     1578      else {
     1579        bidx = a+n+1;
     1580      }
     1581      blk = regs[bidx];
     1582      if (!mrb_nil_p(blk) && mrb_type(blk) != MRB_TT_PROC) {
     1583        mrb_value result;
     1584
     1585        if (bidx >= ci->nregs) {
     1586          stack_extend(mrb, bidx+1);
     1587          ci->nregs = bidx+1;
     1588        }
     1589        result = mrb_convert_type(mrb, blk, MRB_TT_PROC, "Proc", "to_proc");
     1590        regs[bidx] = result;
    12601591      }
    12611592
     
    12651596      ci->proc = m;
    12661597      ci->stackent = mrb->c->stack;
     1598      ci->target_class = c;
     1599      ci->pc = pc + 1;
    12671600      if (n == CALL_MAXARGS) {
    12681601        ci->argc = -1;
     
    12711604        ci->argc = n;
    12721605      }
    1273       ci->target_class = c;
    1274       ci->pc = pc + 1;
    12751606
    12761607      /* prepare stack */
     
    12791610
    12801611      if (MRB_PROC_CFUNC_P(m)) {
     1612        mrb_value v;
     1613
    12811614        if (n == CALL_MAXARGS) {
    12821615          ci->nregs = 3;
     
    12851618          ci->nregs = n + 2;
    12861619        }
    1287         mrb->c->stack[0] = m->body.func(mrb, recv);
     1620        v = m->body.func(mrb, recv);
    12881621        mrb_gc_arena_restore(mrb, ai);
    12891622        if (mrb->exc) goto L_RAISE;
     1623        ci = mrb->c->ci;
     1624        if (!ci->target_class) { /* return from context modifying method (resume/yield) */
     1625          if (ci->acc == CI_ACC_RESUMED) {
     1626            mrb->jmp = prev_jmp;
     1627            return v;
     1628          }
     1629          else {
     1630            mrb_assert(!MRB_PROC_CFUNC_P(ci[-1].proc));
     1631            proc = ci[-1].proc;
     1632            irep = proc->body.irep;
     1633            pool = irep->pool;
     1634            syms = irep->syms;
     1635          }
     1636        }
     1637        mrb->c->stack[0] = v;
    12901638        /* pop stackpos */
    1291         regs = mrb->c->stack = mrb->c->ci->stackent;
     1639        mrb->c->stack = ci->stackent;
     1640        pc = ci->pc;
    12921641        cipop(mrb);
    1293         NEXT;
     1642        JUMP;
    12941643      }
    12951644      else {
     
    13041653        ci->nregs = irep->nregs;
    13051654        if (n == CALL_MAXARGS) {
    1306           stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
     1655          stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs);
    13071656        }
    13081657        else {
    1309           stack_extend(mrb, irep->nregs, ci->argc+2);
    1310         }
    1311         regs = mrb->c->stack;
     1658          stack_extend(mrb, irep->nregs);
     1659        }
    13121660        pc = irep->iseq;
    13131661        JUMP;
     
    13251673      mrb_value *stack;
    13261674
     1675      if (mrb->c->ci->mid == 0 || mrb->c->ci->target_class == NULL) {
     1676        mrb_value exc;
     1677
     1678      L_NOSUPER:
     1679        exc = mrb_exc_new_str_lit(mrb, E_NOMETHOD_ERROR, "super called outside of method");
     1680        mrb_exc_set(mrb, exc);
     1681        goto L_RAISE;
     1682      }
    13271683      if (lv == 0) stack = regs + 1;
    13281684      else {
    13291685        struct REnv *e = uvenv(mrb, lv-1);
    1330         if (!e) {
    1331           mrb_value exc;
    1332 
    1333           exc = mrb_exc_new_str_lit(mrb, E_NOMETHOD_ERROR, "super called outside of method");
    1334           mrb->exc = mrb_obj_ptr(exc);
    1335           goto L_RAISE;
    1336         }
     1686        if (!e) goto L_NOSUPER;
    13371687        stack = e->stack + 1;
    13381688      }
     
    13881738      mrb_value *blk = &argv[argc < 0 ? 1 : argc];
    13891739
    1390       if (!mrb_nil_p(*blk) && mrb_type(*blk) != MRB_TT_PROC) {
    1391         *blk = mrb_convert_type(mrb, *blk, MRB_TT_PROC, "Proc", "to_proc");
    1392       }
    13931740      if (argc < 0) {
    13941741        struct RArray *ary = mrb_ary_ptr(regs[1]);
     
    14101757        argv = mrb_ary_ptr(argv[0])->ptr;
    14111758      }
    1412       mrb->c->ci->argc = len;
    14131759      if (argc < len) {
    14141760        int mlen = m2;
     
    14241770          value_move(&regs[1], argv, argc-mlen); /* m1 + o */
    14251771        }
     1772        if (argc < m1) {
     1773          stack_clear(&regs[argc+1], m1-argc);
     1774        }
    14261775        if (mlen) {
    14271776          value_move(&regs[len-m2+1], &argv[argc-mlen], mlen);
     1777        }
     1778        if (mlen < m2) {
     1779          stack_clear(&regs[len-m2+mlen+1], m2-mlen);
    14281780        }
    14291781        if (r) {
     
    14541806        pc += o + 1;
    14551807      }
     1808      mrb->c->ci->argc = len;
     1809      /* clear local (but non-argument) variables */
     1810      if (irep->nlocals-len-2 > 0) {
     1811        stack_clear(&regs[len+2], irep->nlocals-len-2);
     1812      }
    14561813      JUMP;
    14571814    }
     
    14741831    CASE(OP_RETURN) {
    14751832      /* A B     return R(A) (B=normal,in-block return/break) */
     1833      mrb_callinfo *ci;
     1834
     1835      ci = mrb->c->ci;
     1836      if (ci->mid) {
     1837        mrb_value blk;
     1838
     1839        if (ci->argc < 0) {
     1840          blk = regs[2];
     1841        }
     1842        else {
     1843          blk = regs[ci->argc+1];
     1844        }
     1845        if (mrb_type(blk) == MRB_TT_PROC) {
     1846          struct RProc *p = mrb_proc_ptr(blk);
     1847
     1848          if (!MRB_PROC_STRICT_P(proc) &&
     1849              ci > mrb->c->cibase && p->env == ci[-1].env) {
     1850            p->flags |= MRB_PROC_ORPHAN;
     1851          }
     1852        }
     1853      }
     1854
    14761855      if (mrb->exc) {
    1477         mrb_callinfo *ci;
    1478         int eidx;
     1856        mrb_callinfo *ci0;
     1857        mrb_value *stk;
    14791858
    14801859      L_RAISE:
    1481         ci = mrb->c->ci;
    1482         mrb_obj_iv_ifnone(mrb, mrb->exc, mrb_intern_lit(mrb, "lastpc"), mrb_cptr_value(mrb, pc));
    1483         mrb_obj_iv_ifnone(mrb, mrb->exc, mrb_intern_lit(mrb, "ciidx"), mrb_fixnum_value(ci - mrb->c->cibase));
    1484         eidx = ci->eidx;
     1860        ci0 = ci = mrb->c->ci;
    14851861        if (ci == mrb->c->cibase) {
    1486           if (ci->ridx == 0) goto L_STOP;
     1862          if (ci->ridx == 0) goto L_FTOP;
    14871863          goto L_RESCUE;
    14881864        }
     1865        stk = mrb->c->stack;
    14891866        while (ci[0].ridx == ci[-1].ridx) {
    14901867          cipop(mrb);
    1491           ci = mrb->c->ci;
    1492           mrb->c->stack = ci[1].stackent;
    1493           if (ci[1].acc == CI_ACC_SKIP && prev_jmp) {
     1868          mrb->c->stack = ci->stackent;
     1869          if (ci->acc == CI_ACC_SKIP && prev_jmp) {
    14941870            mrb->jmp = prev_jmp;
    14951871            MRB_THROW(prev_jmp);
    14961872          }
     1873          ci = mrb->c->ci;
    14971874          if (ci == mrb->c->cibase) {
    1498             while (eidx > 0) {
    1499               ecall(mrb, --eidx);
    1500             }
     1875            mrb->c->stack = stk;
    15011876            if (ci->ridx == 0) {
     1877            L_FTOP:             /* fiber top */
    15021878              if (mrb->c == mrb->root_c) {
    1503                 regs = mrb->c->stack = mrb->c->stbase;
     1879                mrb->c->stack = mrb->c->stbase;
    15041880                goto L_STOP;
    15051881              }
     
    15071883                struct mrb_context *c = mrb->c;
    15081884
     1885                if (c->fib) {
     1886                  mrb_write_barrier(mrb, (struct RBasic*)c->fib);
     1887                }
    15091888                mrb->c = c->prev;
    15101889                c->prev = NULL;
     
    15161895          /* call ensure only when we skip this callinfo */
    15171896          if (ci[0].ridx == ci[-1].ridx) {
    1518             while (eidx > ci[-1].eidx) {
    1519               ecall(mrb, --eidx);
     1897            while (mrb->c->eidx > ci->epos) {
     1898              ecall(mrb, --mrb->c->eidx);
     1899              ci = mrb->c->ci;
    15201900            }
    15211901          }
     
    15271907        pool = irep->pool;
    15281908        syms = irep->syms;
    1529         regs = mrb->c->stack = ci[1].stackent;
     1909        if (ci != ci0) {
     1910          mrb->c->stack = ci[1].stackent;
     1911        }
     1912        stack_extend(mrb, irep->nregs);
    15301913        pc = mrb->c->rescue[--ci->ridx];
    15311914      }
    15321915      else {
    1533         mrb_callinfo *ci = mrb->c->ci;
    1534         int acc, eidx = mrb->c->ci->eidx;
    1535         mrb_value v = regs[GETARG_A(i)];
    1536 
     1916        int acc;
     1917        mrb_value v;
     1918
     1919        v = regs[GETARG_A(i)];
     1920        mrb_gc_protect(mrb, v);
    15371921        switch (GETARG_B(i)) {
    15381922        case OP_R_RETURN:
    15391923          /* Fall through to OP_R_NORMAL otherwise */
    1540           if (proc->env && !MRB_PROC_STRICT_P(proc)) {
     1924          if (ci->acc >=0 && proc->env && !MRB_PROC_STRICT_P(proc)) {
    15411925            struct REnv *e = top_env(mrb, proc);
    1542 
    1543             if (!MRB_ENV_STACK_SHARED_P(e)) {
     1926            mrb_callinfo *ce;
     1927
     1928            if (!MRB_ENV_STACK_SHARED_P(e) || e->cxt.c != mrb->c) {
    15441929              localjump_error(mrb, LOCALJUMP_ERROR_RETURN);
    15451930              goto L_RAISE;
    15461931            }
    1547             ci = mrb->c->cibase + e->cioff;
    1548             if (ci == mrb->c->cibase) {
     1932           
     1933            ce = mrb->c->cibase + e->cioff;
     1934            while (ci >= ce) {
     1935              if (ci->env) {
     1936                mrb_env_unshare(mrb, ci->env);
     1937              }
     1938              if (ci->acc < 0) {
     1939                localjump_error(mrb, LOCALJUMP_ERROR_RETURN);
     1940                goto L_RAISE;
     1941              }
     1942              ci--;
     1943            }
     1944            if (ce == mrb->c->cibase) {
    15491945              localjump_error(mrb, LOCALJUMP_ERROR_RETURN);
    15501946              goto L_RAISE;
    15511947            }
    15521948            mrb->c->stack = mrb->c->ci->stackent;
    1553             mrb->c->ci = ci;
     1949            mrb->c->ci = ce;
    15541950            break;
    15551951          }
    15561952        case OP_R_NORMAL:
     1953        NORMAL_RETURN:
    15571954          if (ci == mrb->c->cibase) {
    15581955            if (!mrb->c->prev) { /* toplevel return */
     
    15621959            if (mrb->c->prev->ci == mrb->c->prev->cibase) {
    15631960              mrb_value exc = mrb_exc_new_str_lit(mrb, E_FIBER_ERROR, "double resume");
    1564               mrb->exc = mrb_obj_ptr(exc);
     1961              mrb_exc_set(mrb, exc);
    15651962              goto L_RAISE;
     1963            }
     1964            while (mrb->c->eidx > 0) {
     1965              ecall(mrb, --mrb->c->eidx);
    15661966            }
    15671967            /* automatic yield at the end */
     
    15731973          break;
    15741974        case OP_R_BREAK:
     1975          if (MRB_PROC_STRICT_P(proc)) goto NORMAL_RETURN;
     1976          if (MRB_PROC_ORPHAN_P(proc)) {
     1977            mrb_value exc;
     1978
     1979          L_BREAK_ERROR:
     1980            exc = mrb_exc_new_str_lit(mrb, E_LOCALJUMP_ERROR,
     1981                                      "break from proc-closure");
     1982            mrb_exc_set(mrb, exc);
     1983            goto L_RAISE;
     1984          }
    15751985          if (!proc->env || !MRB_ENV_STACK_SHARED_P(proc->env)) {
    1576             localjump_error(mrb, LOCALJUMP_ERROR_BREAK);
    1577             goto L_RAISE;
     1986            goto L_BREAK_ERROR;
    15781987          }
    15791988          /* break from fiber block */
     
    15811990            struct mrb_context *c = mrb->c;
    15821991
     1992            while (mrb->c->eidx > 0) {
     1993              ecall(mrb, --mrb->c->eidx);
     1994            }
    15831995            mrb->c = c->prev;
    15841996            c->prev = NULL;
    1585           }
    1586           ci = mrb->c->ci;
     1997            ci = mrb->c->ci;
     1998          }
     1999          if (ci->acc < 0) {
     2000            while (mrb->c->eidx > mrb->c->ci->epos) {
     2001              ecall(mrb, --mrb->c->eidx);
     2002            }
     2003            ARENA_RESTORE(mrb, ai);
     2004            mrb->c->vmexec = FALSE;
     2005            mrb->exc = (struct RObject*)break_new(mrb, proc, v);
     2006            mrb->jmp = prev_jmp;
     2007            MRB_THROW(prev_jmp);
     2008          }
     2009          if (FALSE) {
     2010          L_BREAK:
     2011            v = ((struct RBreak*)mrb->exc)->val;
     2012            proc = ((struct RBreak*)mrb->exc)->proc;
     2013            mrb->exc = NULL;
     2014            ci = mrb->c->ci;
     2015          }
    15872016          mrb->c->stack = ci->stackent;
    15882017          mrb->c->ci = mrb->c->cibase + proc->env->cioff + 1;
    15892018          while (ci > mrb->c->ci) {
     2019            if (ci->env) {
     2020              mrb_env_unshare(mrb, ci->env);
     2021            }
    15902022            if (ci[-1].acc == CI_ACC_SKIP) {
    15912023              mrb->c->ci = ci;
    1592               break;
     2024              goto L_BREAK_ERROR;
    15932025            }
    15942026            ci--;
     
    15992031          break;
    16002032        }
    1601         while (eidx > mrb->c->ci[-1].eidx) {
    1602           ecall(mrb, --eidx);
    1603         }
    1604         cipop(mrb);
    1605         acc = ci->acc;
    1606         pc = ci->pc;
    1607         regs = mrb->c->stack = ci->stackent;
    1608         if (acc == CI_ACC_SKIP) {
     2033        while (mrb->c->eidx > mrb->c->ci->epos) {
     2034          ecall(mrb, --mrb->c->eidx);
     2035        }
     2036        if (mrb->c->vmexec && !mrb->c->ci->target_class) {
     2037          ARENA_RESTORE(mrb, ai);
     2038          mrb->c->vmexec = FALSE;
    16092039          mrb->jmp = prev_jmp;
    16102040          return v;
    16112041        }
    1612         DEBUG(printf("from :%s\n", mrb_sym2name(mrb, ci->mid)));
     2042        ci = mrb->c->ci;
     2043        acc = ci->acc;
     2044        mrb->c->stack = ci->stackent;
     2045        cipop(mrb);
     2046        if (acc == CI_ACC_SKIP || acc == CI_ACC_DIRECT) {
     2047          ARENA_RESTORE(mrb, ai);
     2048          mrb->jmp = prev_jmp;
     2049          return v;
     2050        }
     2051        pc = ci->pc;
     2052        DEBUG(fprintf(stderr, "from :%s\n", mrb_sym2name(mrb, ci->mid)));
    16132053        proc = mrb->c->ci->proc;
    16142054        irep = proc->body.irep;
     
    16172057
    16182058        regs[acc] = v;
     2059        ARENA_RESTORE(mrb, ai);
    16192060      }
    16202061      JUMP;
     
    16362077      if (!m) {
    16372078        mrb_value sym = mrb_symbol_value(mid);
    1638 
    1639         mid = mrb_intern_lit(mrb, "method_missing");
    1640         m = mrb_method_search_vm(mrb, &c, mid);
     2079        mrb_sym missing = mrb_intern_lit(mrb, "method_missing");
     2080        m = mrb_method_search_vm(mrb, &c, missing);
     2081        if (!m) {
     2082          mrb_value args;
     2083
     2084          if (n == CALL_MAXARGS) {
     2085            args = regs[a+1];
     2086          }
     2087          else {
     2088            args = mrb_ary_new_from_values(mrb, n, regs+a+1);
     2089          }
     2090          ERR_PC_SET(mrb, pc);
     2091          mrb_method_missing(mrb, mid, recv, args);
     2092        }
     2093        mid = missing;
    16412094        if (n == CALL_MAXARGS) {
    16422095          mrb_ary_unshift(mrb, regs[a+1], sym);
     
    16632116
    16642117      if (MRB_PROC_CFUNC_P(m)) {
    1665         mrb->c->stack[0] = m->body.func(mrb, recv);
     2118        mrb_value v = m->body.func(mrb, recv);
     2119        mrb->c->stack[0] = v;
    16662120        mrb_gc_arena_restore(mrb, ai);
    16672121        goto L_RETURN;
     
    16732127        syms = irep->syms;
    16742128        if (ci->argc < 0) {
    1675           stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
     2129          stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs);
    16762130        }
    16772131        else {
    1678           stack_extend(mrb, irep->nregs, ci->argc+2);
    1679         }
    1680         regs = mrb->c->stack;
     2132          stack_extend(mrb, irep->nregs);
     2133        }
    16812134        pc = irep->iseq;
    16822135      }
     
    16972150      else {
    16982151        struct REnv *e = uvenv(mrb, lv-1);
    1699         if (!e) {
     2152        if (!e || e->cioff == 0 ||
     2153            (!MRB_ENV_STACK_SHARED_P(e) && e->cxt.mid == 0)) {
    17002154          localjump_error(mrb, LOCALJUMP_ERROR_YIELD);
    17012155          goto L_RAISE;
    17022156        }
    17032157        stack = e->stack + 1;
     2158      }
     2159      if (mrb_nil_p(stack[m1+r+m2])) {
     2160        localjump_error(mrb, LOCALJUMP_ERROR_YIELD);
     2161        goto L_RAISE;
    17042162      }
    17052163      regs[a] = stack[m1+r+m2];
     
    18332291      case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):
    18342292        {
    1835           mrb_value z;
    1836 
    1837           z = mrb_fixnum_mul(mrb, regs[a], regs[a+1]);
    1838 
    1839           switch (mrb_type(z)) {
    1840           case MRB_TT_FIXNUM:
    1841             {
    1842               SET_INT_VALUE(regs[a], mrb_fixnum(z));
    1843             }
     2293          mrb_int x, y, z;
     2294
     2295          x = mrb_fixnum(regs[a]);
     2296          y = mrb_fixnum(regs[a+1]);
     2297          if (mrb_int_mul_overflow(x, y, &z)) {
     2298            SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x * (mrb_float)y);
    18442299            break;
    1845           case MRB_TT_FLOAT:
    1846             {
    1847               SET_FLOAT_VALUE(mrb, regs[a], mrb_float(z));
    1848             }
    1849             break;
    1850           default:
    1851             /* cannot happen */
    1852             break;
    1853           }
     2300          }
     2301          SET_INT_VALUE(regs[a], z);
    18542302        }
    18552303        break;
     
    19362384#ifdef MRB_NAN_BOXING
    19372385      if (isnan(mrb_float(regs[a]))) {
    1938         regs[a] = mrb_float_value(mrb, mrb_float(regs[a]));
     2386        mrb_value v = mrb_float_value(mrb, mrb_float(regs[a]));
     2387        regs[a] = v;
    19392388      }
    19402389#endif
     
    20892538    CASE(OP_ARRAY) {
    20902539      /* A B C          R(A) := ary_new(R(B),R(B+1)..R(B+C)) */
    2091       regs[GETARG_A(i)] = mrb_ary_new_from_values(mrb, GETARG_C(i), &regs[GETARG_B(i)]);
     2540      int a = GETARG_A(i);
     2541      int b = GETARG_B(i);
     2542      int c = GETARG_C(i);
     2543      mrb_value v = mrb_ary_new_from_values(mrb, c, &regs[b]);
     2544      regs[a] = v;
    20922545      ARENA_RESTORE(mrb, ai);
    20932546      NEXT;
     
    20962549    CASE(OP_ARYCAT) {
    20972550      /* A B            mrb_ary_concat(R(A),R(B)) */
    2098       mrb_ary_concat(mrb, regs[GETARG_A(i)],
    2099                      mrb_ary_splat(mrb, regs[GETARG_B(i)]));
     2551      int a = GETARG_A(i);
     2552      int b = GETARG_B(i);
     2553      mrb_value splat = mrb_ary_splat(mrb, regs[b]);
     2554      mrb_ary_concat(mrb, regs[a], splat);
    21002555      ARENA_RESTORE(mrb, ai);
    21012556      NEXT;
     
    21042559    CASE(OP_ARYPUSH) {
    21052560      /* A B            R(A).push(R(B)) */
    2106       mrb_ary_push(mrb, regs[GETARG_A(i)], regs[GETARG_B(i)]);
     2561      int a = GETARG_A(i);
     2562      int b = GETARG_B(i);
     2563      mrb_ary_push(mrb, regs[a], regs[b]);
    21072564      NEXT;
    21082565    }
     
    21112568      /* A B C          R(A) := R(B)[C] */
    21122569      int a = GETARG_A(i);
     2570      int b = GETARG_B(i);
    21132571      int c = GETARG_C(i);
    2114       mrb_value v = regs[GETARG_B(i)];
     2572      mrb_value v = regs[b];
    21152573
    21162574      if (!mrb_array_p(v)) {
    21172575        if (c == 0) {
    2118           regs[GETARG_A(i)] = v;
     2576          regs[a] = v;
    21192577        }
    21202578        else {
     
    21232581      }
    21242582      else {
    2125         regs[GETARG_A(i)] = mrb_ary_ref(mrb, v, c);
     2583        v = mrb_ary_ref(mrb, v, c);
     2584        regs[a] = v;
    21262585      }
    21272586      NEXT;
     
    21302589    CASE(OP_ASET) {
    21312590      /* A B C          R(B)[C] := R(A) */
    2132       mrb_ary_set(mrb, regs[GETARG_B(i)], GETARG_C(i), regs[GETARG_A(i)]);
     2591      int a = GETARG_A(i);
     2592      int b = GETARG_B(i);
     2593      int c = GETARG_C(i);
     2594      mrb_ary_set(mrb, regs[b], c, regs[a]);
    21332595      NEXT;
    21342596    }
     
    21402602      int pre  = GETARG_B(i);
    21412603      int post = GETARG_C(i);
    2142 
    21432604      struct RArray *ary;
    21442605      int len, idx;
     
    21502611      len = ary->len;
    21512612      if (len > pre + post) {
    2152         regs[a++] = mrb_ary_new_from_values(mrb, len - pre - post, ary->ptr+pre);
     2613        v = mrb_ary_new_from_values(mrb, len - pre - post, ary->ptr+pre);
     2614        regs[a++] = v;
    21532615        while (post--) {
    21542616          regs[a++] = ary->ptr[len-post-1];
     
    21562618      }
    21572619      else {
    2158         regs[a++] = mrb_ary_new_capa(mrb, 0);
     2620        v = mrb_ary_new_capa(mrb, 0);
     2621        regs[a++] = v;
    21592622        for (idx=0; idx+pre<len; idx++) {
    21602623          regs[a+idx] = ary->ptr[pre+idx];
     
    21712634    CASE(OP_STRING) {
    21722635      /* A Bx           R(A) := str_new(Lit(Bx)) */
    2173       regs[GETARG_A(i)] = mrb_str_dup(mrb, pool[GETARG_Bx(i)]);
     2636      mrb_value str = mrb_str_dup(mrb, pool[GETARG_Bx(i)]);
     2637      regs[GETARG_A(i)] = str;
    21742638      ARENA_RESTORE(mrb, ai);
    21752639      NEXT;
     
    21792643      /* A B    R(A).concat(R(B)) */
    21802644      mrb_str_concat(mrb, regs[GETARG_A(i)], regs[GETARG_B(i)]);
    2181       regs = mrb->c->stack;
    21822645      NEXT;
    21832646    }
     
    22242687    CASE(OP_CLASS) {
    22252688      /* A B    R(A) := newclass(R(A),Syms(B),R(A+1)) */
    2226       struct RClass *c = 0;
     2689      struct RClass *c = 0, *baseclass;
    22272690      int a = GETARG_A(i);
    22282691      mrb_value base, super;
     
    22322695      super = regs[a+1];
    22332696      if (mrb_nil_p(base)) {
    2234         base = mrb_obj_value(mrb->c->ci->target_class);
     2697        baseclass = mrb->c->ci->proc->target_class;
     2698        if (!baseclass) baseclass = mrb->c->ci->target_class;
     2699
     2700        base = mrb_obj_value(baseclass);
    22352701      }
    22362702      c = mrb_vm_define_class(mrb, base, super, id);
     
    22422708    CASE(OP_MODULE) {
    22432709      /* A B            R(A) := newmodule(R(A),Syms(B)) */
    2244       struct RClass *c = 0;
     2710      struct RClass *c = 0, *baseclass;
    22452711      int a = GETARG_A(i);
    22462712      mrb_value base;
     
    22492715      base = regs[a];
    22502716      if (mrb_nil_p(base)) {
    2251         base = mrb_obj_value(mrb->c->ci->target_class);
     2717        baseclass = mrb->c->ci->proc->target_class;
     2718        if (!baseclass) baseclass = mrb->c->ci->target_class;
     2719
     2720        base = mrb_obj_value(baseclass);
    22522721      }
    22532722      c = mrb_vm_define_module(mrb, base, id);
     
    22632732      mrb_value recv = regs[a];
    22642733      struct RProc *p;
     2734
     2735      /* prepare closure */
     2736      p = mrb_closure_new(mrb, irep->reps[GETARG_Bx(i)]);
     2737      p->c = NULL;
    22652738
    22662739      /* prepare stack */
     
    22762749      mrb->c->stack += a;
    22772750
    2278       p = mrb_proc_new(mrb, irep->reps[GETARG_Bx(i)]);
     2751      /* setup closure */
    22792752      p->target_class = ci->target_class;
    22802753      ci->proc = p;
    22812754
    2282       if (MRB_PROC_CFUNC_P(p)) {
    2283         ci->nregs = 0;
    2284         mrb->c->stack[0] = p->body.func(mrb, recv);
    2285         mrb_gc_arena_restore(mrb, ai);
    2286         if (mrb->exc) goto L_RAISE;
    2287         /* pop stackpos */
    2288         regs = mrb->c->stack = mrb->c->ci->stackent;
    2289         cipop(mrb);
    2290         NEXT;
    2291       }
    2292       else {
    2293         irep = p->body.irep;
    2294         pool = irep->pool;
    2295         syms = irep->syms;
    2296         stack_extend(mrb, irep->nregs, 1);
    2297         ci->nregs = irep->nregs;
    2298         regs = mrb->c->stack;
    2299         pc = irep->iseq;
    2300         JUMP;
    2301       }
     2755      irep = p->body.irep;
     2756      pool = irep->pool;
     2757      syms = irep->syms;
     2758      stack_extend(mrb, irep->nregs);
     2759      stack_clear(regs+1, irep->nregs-1);
     2760      ci->nregs = irep->nregs;
     2761      pc = irep->iseq;
     2762      JUMP;
    23022763    }
    23032764
     
    23242785      if (!mrb->c->ci->target_class) {
    23252786        mrb_value exc = mrb_exc_new_str_lit(mrb, E_TYPE_ERROR, "no target class or module");
    2326         mrb->exc = mrb_obj_ptr(exc);
     2787        mrb_exc_set(mrb, exc);
    23272788        goto L_RAISE;
    23282789      }
     
    23342795      /* A B C  R(A) := range_new(R(B),R(B+1),C) */
    23352796      int b = GETARG_B(i);
    2336       regs[GETARG_A(i)] = mrb_range_new(mrb, regs[b], regs[b+1], GETARG_C(i));
     2797      mrb_value val = mrb_range_new(mrb, regs[b], regs[b+1], GETARG_C(i));
     2798      regs[GETARG_A(i)] = val;
    23372799      ARENA_RESTORE(mrb, ai);
    23382800      NEXT;
     
    23572819    L_STOP:
    23582820      {
    2359         int eidx_stop = mrb->c->ci == mrb->c->cibase ? 0 : mrb->c->ci[-1].eidx;
    2360         int eidx = mrb->c->ci->eidx;
    2361         while (eidx > eidx_stop) {
    2362           ecall(mrb, --eidx);
     2821        int epos = mrb->c->ci->epos;
     2822
     2823        while (mrb->c->eidx > epos) {
     2824          ecall(mrb, --mrb->c->eidx);
    23632825        }
    23642826      }
     
    23822844        exc = mrb_exc_new_str(mrb, E_LOCALJUMP_ERROR, msg);
    23832845      }
    2384       mrb->exc = mrb_obj_ptr(exc);
     2846      mrb_exc_set(mrb, exc);
    23852847      goto L_RAISE;
    23862848    }
    23872849  }
    23882850  END_DISPATCH;
     2851#undef regs
    23892852
    23902853  }
     
    23992862mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
    24002863{
    2401   return mrb_context_run(mrb, proc, self, mrb->c->ci->argc + 2); /* argc + 2 (receiver and block) */
     2864  if (mrb->c->ci->argc < 0) {
     2865    return mrb_vm_run(mrb, proc, self, 3); /* receiver, args and block) */
     2866  }
     2867  else {
     2868    return mrb_vm_run(mrb, proc, self, mrb->c->ci->argc + 2); /* argc + 2 (receiver and block) */
     2869  }
    24022870}
    24032871
    24042872MRB_API mrb_value
    2405 mrb_toplevel_run_keep(mrb_state *mrb, struct RProc *proc, unsigned int stack_keep)
     2873mrb_top_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep)
    24062874{
    24072875  mrb_callinfo *ci;
    24082876  mrb_value v;
    24092877
    2410   if (!mrb->c->cibase || mrb->c->ci == mrb->c->cibase) {
    2411     return mrb_context_run(mrb, proc, mrb_top_self(mrb), stack_keep);
     2878  if (!mrb->c->cibase) {
     2879    return mrb_vm_run(mrb, proc, self, stack_keep);
     2880  }
     2881  if (mrb->c->ci == mrb->c->cibase) {
     2882    mrb->c->ci->env = NULL;
     2883    return mrb_vm_run(mrb, proc, self, stack_keep);
    24122884  }
    24132885  ci = cipush(mrb);
     2886  ci->mid = 0;
    24142887  ci->nregs = 1;   /* protect the receiver */
    24152888  ci->acc = CI_ACC_SKIP;
    24162889  ci->target_class = mrb->object_class;
    2417   v = mrb_context_run(mrb, proc, mrb_top_self(mrb), stack_keep);
     2890  v = mrb_vm_run(mrb, proc, self, stack_keep);
    24182891  cipop(mrb);
    24192892
     
    24212894}
    24222895
    2423 MRB_API mrb_value
    2424 mrb_toplevel_run(mrb_state *mrb, struct RProc *proc)
    2425 {
    2426   return mrb_toplevel_run_keep(mrb, proc, 0);
    2427 }
     2896#if defined(MRB_ENABLE_CXX_EXCEPTION) && defined(__cplusplus)
     2897# if !defined(MRB_ENABLE_CXX_ABI)
     2898} /* end of extern "C" */
     2899# endif
     2900mrb_int mrb_jmpbuf::jmpbuf_id = 0;
     2901# if !defined(MRB_ENABLE_CXX_ABI)
     2902extern "C" {
     2903# endif
     2904#endif
  • EcnlProtoTool/trunk/mruby-1.3.0/tasks/libmruby.rake

    r321 r331  
    66  file "#{build_dir}/lib/libmruby.flags.mak" => [__FILE__, libfile("#{build_dir}/lib/libmruby")] do |t|
    77    open(t.name, 'w') do |f|
    8       f.puts "MRUBY_CFLAGS = #{cc.all_flags.gsub('"', '\\"')}"
     8      f.puts "MRUBY_CFLAGS = #{cc.all_flags}"
    99
    1010      gem_flags = gems.map { |g| g.linker.flags }
    1111      gem_library_paths = gems.map { |g| g.linker.library_paths }
    12       f.puts "MRUBY_LDFLAGS = #{linker.all_flags(gem_library_paths, gem_flags).gsub('"', '\\"')} #{linker.option_library_path % "#{build_dir}/lib"}"
     12      f.puts "MRUBY_LDFLAGS = #{linker.all_flags(gem_library_paths, gem_flags)} #{linker.option_library_path % "#{build_dir}/lib"}"
    1313
    1414      gem_flags_before_libraries = gems.map { |g| g.linker.flags_before_libraries }
    15       f.puts "MRUBY_LDFLAGS_BEFORE_LIBS = #{[linker.flags_before_libraries, gem_flags_before_libraries].flatten.join(' ').gsub('"', '\\"')}"
     15      f.puts "MRUBY_LDFLAGS_BEFORE_LIBS = #{[linker.flags_before_libraries, gem_flags_before_libraries].flatten.join(' ')}"
    1616
    1717      gem_libraries = gems.map { |g| g.linker.libraries }
    18       f.puts "MRUBY_LIBS = #{linker.option_library % 'mruby'} #{linker.library_flags(gem_libraries).gsub('"', '\\"')}"
     18      f.puts "MRUBY_LIBS = #{linker.option_library % 'mruby'} #{linker.library_flags(gem_libraries)}"
     19
     20      f.puts "MRUBY_LIBMRUBY_PATH = #{libfile("#{build_dir}/lib/libmruby")}"
    1921    end
    2022  end
  • EcnlProtoTool/trunk/mruby-1.3.0/tasks/mrbgem_spec.rake

    r321 r331  
    22require 'forwardable'
    33require 'tsort'
     4require 'shellwords'
    45
    56module MRuby
     
    1819      alias mruby build
    1920      attr_accessor :build_config_initializer
     21      attr_accessor :mrblib_dir, :objs_dir
    2022
    2123      attr_accessor :version
     
    4547        @initializer = block
    4648        @version = "0.0.0"
     49        @mrblib_dir = "mrblib"
     50        @objs_dir = "src"
    4751        MRuby::Gem.current = self
    4852      end
     
    5559        @linker = LinkerConfig.new([], [], [], [], [])
    5660
    57         @rbfiles = Dir.glob("#{dir}/mrblib/**/*.rb").sort
    58         @objs = Dir.glob("#{dir}/src/*.{c,cpp,cxx,cc,m,asm,s,S}").map do |f|
     61        @rbfiles = Dir.glob("#{@dir}/#{@mrblib_dir}/**/*.rb").sort
     62        @objs = Dir.glob("#{@dir}/#{@objs_dir}/*.{c,cpp,cxx,cc,m,asm,s,S}").map do |f|
    5963          objfile(f.relative_path_from(@dir).to_s.pathmap("#{build_dir}/%X"))
    6064        end
     
    8791
    8892        instance_eval(&@build_config_initializer) if @build_config_initializer
    89 
     93      end
     94
     95      def setup_compilers
    9096        compilers.each do |compiler|
    9197          compiler.define_rules build_dir, "#{dir}"
     
    122128      def test_rbireps
    123129        "#{build_dir}/gem_test.c"
     130      end
     131
     132      def search_package(name, version_query=nil)
     133        package_query = name
     134        package_query += " #{version_query}" if version_query
     135        _pp "PKG-CONFIG", package_query
     136        escaped_package_query = Shellwords.escape(package_query)
     137        if system("pkg-config --exists #{escaped_package_query}")
     138          cc.flags += [`pkg-config --cflags #{escaped_package_query}`.strip]
     139          cxx.flags += [`pkg-config --cflags #{escaped_package_query}`.strip]
     140          linker.flags_before_libraries += [`pkg-config --libs #{escaped_package_query}`.strip]
     141          true
     142        else
     143          false
     144        end
    124145      end
    125146
     
    182203        print_gem_comment(f)
    183204        f.puts %Q[#include <stdlib.h>] unless rbfiles.empty?
    184         f.puts %Q[#include "mruby.h"]
    185         f.puts %Q[#include "mruby/irep.h"] unless rbfiles.empty?
     205        f.puts %Q[#include <mruby.h>]
     206        f.puts %Q[#include <mruby/irep.h>] unless rbfiles.empty?
    186207      end
    187208
     
    190211        f.puts %Q[#include <stdio.h>]
    191212        f.puts %Q[#include <stdlib.h>]
    192         f.puts %Q[#include "mruby.h"]
    193         f.puts %Q[#include "mruby/irep.h"]
    194         f.puts %Q[#include "mruby/variable.h"]
    195         f.puts %Q[#include "mruby/hash.h"] unless test_args.empty?
     213        f.puts %Q[#include <mruby.h>]
     214        f.puts %Q[#include <mruby/irep.h>]
     215        f.puts %Q[#include <mruby/variable.h>]
     216        f.puts %Q[#include <mruby/hash.h>] unless test_args.empty?
    196217      end
    197218
     
    401422        @ary = tsort_dependencies gem_table.keys, gem_table, true
    402423
     424        each(&:setup_compilers)
     425
    403426        each do |g|
    404427          import_include_paths(g)
     
    414437          import_include_paths(dep_g)
    415438
     439          dep_g.export_include_paths.uniq!
    416440          g.compilers.each do |compiler|
    417441            compiler.include_paths += dep_g.export_include_paths
    418442            g.export_include_paths += dep_g.export_include_paths
     443            compiler.include_paths.uniq!
     444            g.export_include_paths.uniq!
    419445          end
    420446        end
  • EcnlProtoTool/trunk/mruby-1.3.0/tasks/mrbgems.rake

    r321 r331  
    3232        f.puts %Q[ */]
    3333        f.puts %Q[]
    34         f.puts %Q[#include "mruby.h"]
     34        f.puts %Q[#include <mruby.h>]
    3535        f.puts %Q[]
    3636        f.write gem_func_decls
  • EcnlProtoTool/trunk/mruby-1.3.0/tasks/mruby_build.rake

    r321 r331  
    8484        @gems, @libmruby = MRuby::Gem::List.new, []
    8585        @build_mrbtest_lib_only = false
     86        @cxx_exception_enabled = false
     87        @cxx_exception_disabled = false
    8688        @cxx_abi_enabled = false
    87         @cxx_exception_disabled = false
    8889        @enable_bintest = false
    8990        @enable_test = false
     
    111112
    112113    def disable_cxx_exception
     114      if @cxx_exception_enabled or @cxx_abi_enabled
     115        raise "cxx_exception already enabled"
     116      end
    113117      @cxx_exception_disabled = true
     118    end
     119
     120    def enable_cxx_exception
     121      return if @cxx_exception_enabled
     122      return if @cxx_abi_enabled
     123      if @cxx_exception_disabled
     124        raise "cxx_exception disabled"
     125      end
     126      @cxx_exception_enabled = true
     127      compilers.each { |c|
     128        c.defines += %w(MRB_ENABLE_CXX_EXCEPTION)
     129        c.flags << c.cxx_exception_flag
     130      }
     131      linker.command = cxx.command if toolchains.find { |v| v == 'gcc' }
     132    end
     133
     134    def cxx_exception_enabled?
     135      @cxx_exception_enabled
    114136    end
    115137
     
    119141
    120142    def enable_cxx_abi
    121       return if @cxx_exception_disabled or @cxx_abi_enabled
    122       compilers.each { |c| c.defines += %w(MRB_ENABLE_CXX_EXCEPTION) }
     143      return if @cxx_abi_enabled
     144      if @cxx_exception_enabled
     145        raise "cxx_exception already enabled"
     146      end
     147      compilers.each { |c|
     148        c.defines += %w(MRB_ENABLE_CXX_EXCEPTION MRB_ENABLE_CXX_ABI)
     149        c.flags << c.cxx_compile_flag
     150      }
     151      compilers.each { |c| c.flags << c.cxx_compile_flag }
    123152      linker.command = cxx.command if toolchains.find { |v| v == 'gcc' }
    124153      @cxx_abi_enabled = true
     
    136165#define __STDC_LIMIT_MACROS
    137166
     167#ifndef MRB_ENABLE_CXX_ABI
    138168extern "C" {
     169#endif
    139170#include "#{src}"
     171#ifndef MRB_ENABLE_CXX_ABI
    140172}
    141 
    142 #{src == "#{MRUBY_ROOT}/src/error.c"? 'mrb_int mrb_jmpbuf::jmpbuf_id = 0;' : ''}
     173#endif
    143174EOS
    144175      end
  • EcnlProtoTool/trunk/mruby-1.3.0/tasks/mruby_build_commands.rake

    r321 r331  
    4343    attr_accessor :flags, :include_paths, :defines, :source_exts
    4444    attr_accessor :compile_options, :option_define, :option_include_path, :out_ext
     45    attr_accessor :cxx_compile_flag, :cxx_exception_flag
    4546
    4647    def initialize(build, source_exts=[])
  • EcnlProtoTool/trunk/mruby-1.3.0/tasks/mruby_build_gem.rake

    r321 r331  
    3939        Dir.glob("#{Gem.current.dir}/#{subdir}/*.{cpp,cxx,cc}")
    4040      end.flatten
    41       enable_cxx_abi unless cxx_srcs.empty?
     41      enable_cxx_exception unless cxx_srcs.empty?
    4242
    4343      Gem.current
  • EcnlProtoTool/trunk/mruby-1.3.0/tasks/toolchains/android.rake

    r321 r331  
    11class MRuby::Toolchain::Android
    2   DEFAULT_ARCH = 'armeabi'
    3   DEFAULT_PLATFORM = 'android-14'
    4   DEFAULT_TOOLCHAIN = :gcc
     2
     3  DEFAULT_ARCH = 'armeabi' # TODO : Revise if arch should have a default
     4
     5  DEFAULT_TOOLCHAIN = :clang
     6
    57  DEFAULT_NDK_HOMES = %w{
     8    /usr/local/opt/android-sdk/ndk-bundle
    69    /usr/local/opt/android-ndk
     10    %LOCALAPPDATA%/Android/android-sdk/ndk-bundle
     11    %LOCALAPPDATA%/Android/android-ndk
     12    ~/Library/Android/sdk/ndk-bundle
     13    ~/Library/Android/ndk
    714  }
    8   TOOLCHAINS = [:gcc, :clang]
     15
     16  TOOLCHAINS = [:clang, :gcc]
     17
    918  ARCHITECTURES = %w{
    1019    armeabi armeabi-v7a arm64-v8a
     20    x86 x86_64
    1121    mips mips64
    12     x86 x86_64
    1322  }
    1423
     
    2231  end
    2332
     33  class PlatformDirNotFound < StandardError
     34    def message
     35        <<-EOM
     36Couldn't find Android NDK platform directories.
     37Set ANDROID_PLATFORM environment variable or set :platform parameter
     38        EOM
     39    end
     40  end
     41
    2442  attr_reader :params
    2543
    2644  def initialize(params)
    2745    @params = params
     46  end
     47
     48  def bin_gcc(command)
     49    command = command.to_s
     50
     51    command = case arch
     52      when /armeabi/    then 'arm-linux-androideabi-'
     53      when /arm64-v8a/  then 'aarch64-linux-android-'
     54      when /x86_64/     then 'x86_64-linux-android-'
     55      when /x86/        then 'i686-linux-android-'
     56      when /mips64/     then 'mips64el-linux-android-'
     57      when /mips/       then 'mipsel-linux-android-'
     58      end + command
     59
     60    gcc_toolchain_path.join('bin', command).to_s
     61  end
     62
     63  def bin(command)
     64    command = command.to_s
     65    toolchain_path.join('bin', command).to_s
    2866  end
    2967
     
    3169    @home_path ||= Pathname(
    3270      params[:ndk_home] ||
    33         ENV['ANDROID_NDK_HOME'] ||
    34         DEFAULT_NDK_HOMES.find{ |path| File.directory?(path) } ||
    35         raise(AndroidNDKHomeNotFound)
     71      ENV['ANDROID_NDK_HOME'] ||
     72      DEFAULT_NDK_HOMES.find { |path|
     73        path.gsub! '%LOCALAPPDATA%', ENV['LOCALAPPDATA'] || '%LOCALAPPDATA%'
     74        path.gsub! '\\', '/'
     75        path.gsub! '~', Dir.home || '~'
     76        File.directory?(path)
     77      } || raise(AndroidNDKHomeNotFound)
    3678    )
    3779  end
    3880
     81  def toolchain
     82    @toolchain ||= params.fetch(:toolchain){ DEFAULT_TOOLCHAIN }
     83  end
     84
     85  def toolchain_path
     86    @toolchain_path ||= case toolchain
     87      when :gcc
     88        gcc_toolchain_path
     89      when :clang
     90        home_path.join('toolchains', 'llvm' , 'prebuilt', host_platform)
     91      end
     92  end
     93
     94  def gcc_toolchain_path
     95    if @gcc_toolchain_path === nil then
     96      prefix = case arch
     97        when /armeabi/    then 'arm-linux-androideabi-'
     98        when /arm64-v8a/  then 'aarch64-linux-android-'
     99        when /x86_64/     then 'x86_64-'
     100        when /x86/        then 'x86-'
     101        when /mips64/     then 'mips64el-linux-android-'
     102        when /mips/       then 'mipsel-linux-android-'
     103        end
     104
     105      test = case arch
     106        when /armeabi/    then 'arm-linux-androideabi-*'
     107        when /arm64-v8a/  then 'aarch64-linux-android-*'
     108        when /x86_64/     then 'x86_64-*'
     109        when /x86/        then 'x86-*'
     110        when /mips64/     then 'mips64el-linux-android-*'
     111        when /mips/       then 'mipsel-linux-android-*'
     112        end
     113
     114      gcc_toolchain_version = Dir[home_path.join('toolchains', test)].map{|t| t.match(/-(\d+\.\d+)$/); $1.to_f }.max
     115      @gcc_toolchain_path = home_path.join('toolchains', prefix + gcc_toolchain_version.to_s, 'prebuilt', host_platform)
     116    end
     117    @gcc_toolchain_path
     118  end
     119
     120  def host_platform
     121    @host_platform ||= case RUBY_PLATFORM
     122      when /cygwin|mswin|mingw|bccwin|wince|emx/i
     123        path = home_path.join('toolchains', 'llvm' , 'prebuilt', 'windows*')
     124        Dir.glob(path.to_s){ |item|
     125          next if File.file?(item)
     126          path = Pathname(item)
     127          break
     128        }
     129        path.basename
     130      when /x86_64-darwin/i
     131        'darwin-x86_64'
     132      when /darwin/i
     133        'darwin-x86'
     134      when /x86_64-linux/i
     135        'linux-x86_64'
     136      when /linux/i
     137        'linux-x86'
     138      else
     139        raise NotImplementedError, "Unknown host platform (#{RUBY_PLATFORM})"
     140      end
     141  end
     142
    39143  def arch
    40     params.fetch(:arch){ DEFAULT_ARCH }
     144    @arch ||= (params[:arch] || ENV['ANDROID_ARCH'] || DEFAULT_ARCH).to_s
     145  end
     146
     147  def sysroot
     148    @sysroot ||= home_path.join('platforms', platform,
     149        case arch
     150        when /armeabi/    then 'arch-arm'
     151        when /arm64-v8a/  then 'arch-arm64'
     152        when /x86_64/     then 'arch-x86_64'
     153        when /x86/        then 'arch-x86'
     154        when /mips64/     then 'arch-mips64'
     155        when /mips/       then 'arch-mips'
     156        end
     157      ).to_s
    41158  end
    42159
    43160  def platform
    44     params.fetch(:platform){ DEFAULT_PLATFORM }
    45   end
    46 
    47   def toolchain
    48     params.fetch(:toolchain){ DEFAULT_TOOLCHAIN }
    49   end
    50 
    51   def toolchain_version
    52     params.fetch(:toolchain_version) do
    53       test = case toolchain
    54       when :gcc
    55         case arch
    56         when /armeabi/
    57           'arm-linux-androideabi-*'
    58         when /arm64/
    59           'aarch64-linux-android-*'
    60         when /mips64/
    61           'mips64el-linux-android-*'
    62         when /mips/
    63           'mipsel-linux-android-*'
    64         when /x86_64/
    65           'x86_64-*'
    66         when /x86/
    67           'x86-*'
     161    if @platform === nil then
     162      @platform = params[:platform] || ENV['ANDROID_PLATFORM'] || nil
     163      if @platform === nil
     164        Dir.glob(home_path.join('platforms/android-*').to_s){ |item|
     165          next if File.file?(item)
     166          if @platform === nil
     167            @platform = Integer(item.rpartition('-')[2])
     168          else
     169            platform = Integer(item.rpartition('-')[2])
     170            @platform = platform > @platform ? platform : @platform
     171          end
     172        }
     173        if @platform === nil
     174          raise(PlatformDirNotFound)
     175        else
     176          @platform = "android-#{@platform}"
    68177        end
    69       when :clang
    70         'llvm-*'
    71       end
    72 
    73       Dir[home_path.join('toolchains',test)].map{|t| t.match(/-(\d+\.\d+)$/); $1.to_f }.max
    74     end
    75   end
    76 
    77   def toolchain_path
    78     prefix = case toolchain
    79              when :clang then 'llvm-'
    80              when :gcc
    81                case arch
    82                when /armeabi/ then 'arm-linux-androideabi-'
    83                when /arm64/   then 'aarch64-linux-android-'
    84                when /x86_64/  then 'x86_64-'
    85                when /x86/     then 'x86-'
    86                when /mips64/  then 'mips64el-linux-android-'
    87                when /mips/    then 'mipsel-linux-android-'
    88                end
    89              end
    90     home_path.join('toolchains', prefix + toolchain_version.to_s, 'prebuilt', host_platform)
    91   end
    92 
    93   def sysroot
    94     path = case arch
    95            when /armeabi/ then 'arch-arm'
    96            when /arm64/   then 'arch-arm64'
    97            when /x86_64/  then 'arch-x86_64'
    98            when /x86/     then 'arch-x86'
    99            when /mips64/  then 'arch-mips64'
    100            when /mips/    then 'arch-mips'
    101            end
    102 
    103     home_path.join('platforms', platform, path).to_s
    104   end
    105 
    106   def bin(command)
    107     command = command.to_s
    108 
    109     if toolchain == :gcc
    110       command = case arch
    111                 when /armeabi/ then 'arm-linux-androideabi-'
    112                 when /arm64/   then 'aarch64-linux-android-'
    113                 when /x86_64/  then 'x86_64-linux-android-'
    114                 when /x86/     then 'i686-linux-android-'
    115                 when /mips64/  then 'mips64el-linux-android-'
    116                 when /mips/    then 'mipsel-linux-android-'
    117                 end + command
    118     end
    119 
    120     toolchain_path.join('bin',command).to_s
     178      end
     179    end
     180    if Integer(@platform.rpartition('-')[2]) < 21
     181      case arch
     182      when /arm64-v8a/, /x86_64/, /mips64/
     183        raise NotImplementedError, "Platform (#{@platform}) has no implementation for architecture (#{arch})"
     184      end
     185    end
     186    @platform
     187  end
     188
     189  def armeabi_v7a_mfpu
     190    @armeabi_v7a_mfpu ||= (params[:mfpu] || 'vfpv3-d16').to_s
     191  end
     192
     193  def armeabi_v7a_mfloat_abi
     194    @armeabi_v7a_mfloat_abi ||= (params[:mfloat_abi] || 'softfp').to_s
     195  end
     196
     197  def no_warn_mismatch
     198    if %W(soft softfp).include? armeabi_v7a_mfloat_abi
     199      ''
     200    else
     201      ',--no-warn-mismatch'
     202    end
    121203  end
    122204
    123205  def cc
    124206    case toolchain
    125     when :gcc   then bin(:gcc)
    126     when :clang then bin(:clang)
    127     end
     207    when :gcc then bin_gcc('gcc')
     208    when :clang then bin('clang')
     209    end
     210  end
     211
     212  def ar
     213    case toolchain
     214    when :gcc   then bin_gcc('ar')
     215    when :clang then bin_gcc('ar')
     216    end
     217  end
     218
     219  def ctarget
     220    flags = []
     221
     222    case toolchain
     223    when :gcc
     224      case arch
     225      when /armeabi-v7a/  then flags += %W(-march=armv7-a)
     226      when /armeabi/      then flags += %W(-march=armv5te)
     227      when /arm64-v8a/    then flags += %W(-march=armv8-a)
     228      when /x86_64/       then flags += %W(-march=x86-64)
     229      when /x86/          then flags += %W(-march=i686)
     230      when /mips64/       then flags += %W(-march=mips64r6)
     231      when /mips/         then flags += %W(-march=mips32)
     232      end
     233    when :clang
     234      case arch
     235      when /armeabi-v7a/  then flags += %W(-target armv7-none-linux-androideabi)
     236      when /armeabi/      then flags += %W(-target armv5te-none-linux-androideabi)
     237      when /arm64-v8a/    then flags += %W(-target aarch64-none-linux-android)
     238      when /x86_64/       then flags += %W(-target x86_64-none-linux-android)
     239      when /x86/          then flags += %W(-target i686-none-linux-android)
     240      when /mips64/       then flags += %W(-target mips64el-none-linux-android)
     241      when /mips/         then flags += %W(-target mipsel-none-linux-android)
     242      end
     243    end
     244
     245    case arch
     246    when /armeabi-v7a/  then flags += %W(-mfpu=#{armeabi_v7a_mfpu} -mfloat-abi=#{armeabi_v7a_mfloat_abi})
     247    when /armeabi/      then flags += %W(-mtune=xscale -msoft-float)
     248    when /arm64-v8a/    then flags += %W()
     249    when /x86_64/       then flags += %W()
     250    when /x86/          then flags += %W()
     251    when /mips64/       then flags += %W(-fmessage-length=0)
     252    when /mips/         then flags += %W(-fmessage-length=0)
     253    end
     254
     255    flags
    128256  end
    129257
     
    131259    flags = []
    132260
     261    flags += %W(-MMD -MP -D__android__ -DANDROID --sysroot="#{sysroot}")
     262    flags += ctarget
    133263    case toolchain
    134264    when :gcc
    135       flags += %W(-ffunction-sections -funwind-tables -no-canonical-prefixes)
    136       flags += %W(-D__android__ -mandroid --sysroot="#{sysroot}")
    137       case arch
    138       when /arm64/
    139         flags += %W(-fpic -fstack-protector-strong)
    140       when 'armeabi-v7a-hard'
    141         flags += %W(-fpic -fstack-protector-strong -march=armv7-a -mhard-float -D_NDK_MATH_NO_SOFTFP=1 -mfpu=vfpv3-d16)
    142       when 'armeabi-v7a'
    143         flags += %W(-fpic -fstack-protector-strong -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16)
    144       when /arm/
    145         flags += %W(-fpic -fstack-protector-strong -march=armv5te -mtune=xscale -msoft-float)
    146       when /mips/
    147         flags += %W(-fpic -fno-strict-aliasing -finline-functions -fmessage-length=0 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers)
    148       when /x86/
    149         flags += %W(-fstack-protector-strong)
    150       end
    151265    when :clang
    152     end
     266      flags += %W(-gcc-toolchain "#{gcc_toolchain_path.to_s}" -Wno-invalid-command-line-argument -Wno-unused-command-line-argument)
     267    end
     268    flags += %W(-fpic -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes)
    153269
    154270    flags
    155   end
    156 
    157   def ld
    158     cc
    159271  end
    160272
    161273  def ldflags
    162274    flags = []
     275
     276    flags += %W(--sysroot="#{sysroot}")
     277
     278    flags
     279  end
     280
     281  def ldflags_before_libraries
     282    flags = []
     283
    163284    case toolchain
    164285    when :gcc
    165       flags += %W(-no-canonical-prefixes)
    166       flags += %W(-D__android__ -mandroid --sysroot="#{sysroot}")
    167       case arch
    168       when 'armeabi-v7a-hard'
    169         flags += %W(-march=armv7-a -Wl,--fix-cortex-a8 -Wl,--no-warn-mismatch -lm_hard)
    170       when 'armeabi-v7a'
    171         flags += %W(-march=armv7-a -Wl,--fix-cortex-a8)
    172       end
    173     end
    174    
     286      case arch
     287      when /armeabi-v7a/  then flags += %W(-Wl#{no_warn_mismatch})
     288      end
     289    when :clang
     290      flags += %W(-gcc-toolchain "#{gcc_toolchain_path.to_s}")
     291      case arch
     292      when /armeabi-v7a/  then flags += %W(-target armv7-none-linux-androideabi -Wl,--fix-cortex-a8#{no_warn_mismatch})
     293      when /armeabi/      then flags += %W(-target armv5te-none-linux-androideabi)
     294      when /arm64-v8a/    then flags += %W(-target aarch64-none-linux-android)
     295      when /x86_64/       then flags += %W(-target x86_64-none-linux-android)
     296      when /x86/          then flags += %W(-target i686-none-linux-android)
     297      when /mips64/       then flags += %W(-target mips64el-none-linux-android)
     298      when /mips/         then flags += %W(-target mipsel-none-linux-android)
     299      end
     300    end
     301    flags += %W(-no-canonical-prefixes)
     302
    175303    flags
    176304  end
    177 
    178   def ar
    179     case toolchain
    180     when :gcc   then bin(:ar)
    181     when :clang then bin('llvm-ar')
    182     end
    183   end
    184 
    185   def host_platform
    186     case RUBY_PLATFORM
    187     when /cygwin|mswin|mingw|bccwin|wince|emx/i
    188       'windows'
    189     when /x86_64-darwin/i
    190       'darwin-x86_64'
    191     when /darwin/i
    192       'darwin-x86'
    193     when /x86_64-linux/i
    194       'linux-x86_64'
    195     when /linux/i
    196       'linux-x86'
    197     else
    198       raise NotImplementedError, "Unknown host platform (#{RUBY_PLATFORM})"
    199     end
    200   end
    201305end
    202306
    203307MRuby::Toolchain.new(:android) do |conf, params|
    204   ndk = MRuby::Toolchain::Android.new(params)
    205 
    206   toolchain ndk.toolchain
     308  android = MRuby::Toolchain::Android.new(params)
     309
     310  toolchain android.toolchain
    207311
    208312  [conf.cc, conf.cxx, conf.objc, conf.asm].each do |cc|
    209     cc.command = ndk.cc
    210     cc.flags = ndk.cflags
    211   end
    212   conf.linker.command = ndk.ld
    213   conf.linker.flags = ndk.ldflags
    214   conf.archiver.command = ndk.ar
     313    cc.command = android.cc
     314    cc.flags = android.cflags
     315  end
     316
     317  conf.archiver.command = android.ar
     318  conf.linker.command = android.cc
     319  conf.linker.flags = android.ldflags
     320  conf.linker.flags_before_libraries = android.ldflags_before_libraries
    215321end
    216 
  • EcnlProtoTool/trunk/mruby-1.3.0/tasks/toolchains/clang.rake

    r321 r331  
    1 MRuby::Toolchain.new(:clang) do |conf|
     1MRuby::Toolchain.new(:clang) do |conf, _params|
    22  toolchain :gcc
    33
  • EcnlProtoTool/trunk/mruby-1.3.0/tasks/toolchains/gcc.rake

    r321 r331  
    1 MRuby::Toolchain.new(:gcc) do |conf|
     1MRuby::Toolchain.new(:gcc) do |conf, _params|
    22  [conf.cc, conf.objc, conf.asm].each do |cc|
    33    cc.command = ENV['CC'] || 'gcc'
     
    77    cc.option_define = '-D%s'
    88    cc.compile_options = '%{flags} -MMD -o %{outfile} -c %{infile}'
     9    cc.cxx_compile_flag = '-x c++ -std=c++03'
     10    cc.cxx_exception_flag = '-fexceptions'
    911  end
    1012
     
    1618    cxx.option_define = '-D%s'
    1719    cxx.compile_options = '%{flags} -MMD -o %{outfile} -c %{infile}'
     20    cxx.cxx_compile_flag = '-x c++ -std=c++03'
     21    cxx.cxx_exception_flag = '-fexceptions'
    1822  end
    1923
  • EcnlProtoTool/trunk/mruby-1.3.0/tasks/toolchains/visualcpp.rake

    r321 r331  
    1 MRuby::Toolchain.new(:visualcpp) do |conf|
     1MRuby::Toolchain.new(:visualcpp) do |conf, _params|
    22  conf.cc do |cc|
    33    cc.command = ENV['CC'] || 'cl.exe'
    4     cc.flags = [ENV['CFLAGS'] || %w(/c /nologo /utf-8 /W4 /GS /analyze- /Zc:wchar_t /ZI /Gm /Od /Zc:inline /fp:precise /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /Oy- /MDd /EHsc /DWIN32 /D_DEBUG /D_CONSOLE /D_CRT_SECURE_NO_WARNINGS)]
    5     cc.flags << %w(/we4002 /we4003 /we4005 /we4007 /we4010 /we4013 /we4015 /we4020 /we4022 /we4024 /we4028 /we4029 /we4031 /we4033 /we4034 /we4042 /we4047 /we4048 /we4049 /we4056 /we4067 /we4074 /we4079 /we4083 /we4088 /we4089 /we4090 /we4091 /we4094 /we4096 /we4098 /we4099 /we4113 /we4133 /we4715 /we4716)
    6     cc.flags << %w(/wd4214 /wd4100 /wd4996)
    7     cc.flags << "/Fd\"#{conf.build_dir}\\vc140.pdb\""
    8     cc.flags << "/Fp\"%{outdir}\\%{outfilebase}.pch\""
     4    # C4013: implicit function declaration
     5    cc.flags = [ENV['CFLAGS'] || %w(/c /nologo /W3 /we4013 /Zi /MD /O2 /utf-8 /D_CRT_SECURE_NO_WARNINGS)]
    96    cc.defines = %w(DISABLE_GEMS MRB_STACK_EXTEND_DOUBLING)
    107    cc.option_include_path = '/I%s'
    118    cc.option_define = '/D%s'
    129    cc.compile_options = "%{flags} /Fo%{outfile} %{infile}"
     10    cc.cxx_compile_flag = '/TP'
     11    cc.cxx_exception_flag = '/EHs'
    1312  end
    1413
    1514  conf.cxx do |cxx|
    1615    cxx.command = ENV['CXX'] || 'cl.exe'
    17     cxx.flags = [ENV['CXXFLAGS'] || ENV['CFLAGS'] || %w(/c /utf-8 /nologo /W4 /GS /analyze- /Zc:wchar_t /ZI /Gm /Od /Zc:inline /fp:precise /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /Oy- /MDd /EHsc /DWIN32 /D_DEBUG /D_CONSOLE /D_CRT_SECURE_NO_WARNINGS)]
    18     cxx.flags << %w(/we4002 /we4003 /we4005 /we4007 /we4010 /we4013 /we4015 /we4020 /we4022 /we4024 /we4028 /we4029 /we4031 /we4033 /we4034 /we4042 /we4047 /we4048 /we4049 /we4056 /we4067 /we4074 /we4079 /we4083 /we4088 /we4089 /we4090 /we4091 /we4094 /we4096 /we4098 /we4099 /we4113 /we4133 /we4715 /we4716)
    19     cxx.flags << %w(/wd4214 /wd4100 /wd4996)
    20     cxx.flags << "/Fd\"#{conf.build_dir}\\vc140.pdb\""
    21     cxx.flags << "/Fp\"%{outdir}\\%{outfilebase}.pch\""
     16    cxx.flags = [ENV['CXXFLAGS'] || ENV['CFLAGS'] || %w(/c /nologo /W3 /Zi /MD /O2 /EHs /utf-8 /D_CRT_SECURE_NO_WARNINGS)]
    2217    cxx.defines = %w(DISABLE_GEMS MRB_STACK_EXTEND_DOUBLING)
    2318    cxx.option_include_path = '/I%s'
    2419    cxx.option_define = '/D%s'
    2520    cxx.compile_options = "%{flags} /Fo%{outfile} %{infile}"
     21    cxx.cxx_compile_flag = '/TP'
     22    cxx.cxx_exception_flag = '/EHs'
    2623  end
    2724
     
    6158
    6259  conf.file_separator = '\\'
     60
     61  if require 'open3'
     62    Open3.popen3 conf.cc.command do |_, _, e, _|
     63      if /Version (\d{2})\.\d{2}\.\d{5}/ =~ e.gets && $1.to_i <= 17
     64        m = "# VS2010/2012 support will be dropped after the next release! #"
     65        h = "#" * m.length
     66        puts h, m, h
     67      end
     68    end
     69  end
     70
    6371end
  • EcnlProtoTool/trunk/mruby-1.3.0/test/assert.rb

    r321 r331  
    1111  while i < len
    1212    str = args[i].to_s
    13     begin
    14       __printstr__ str
    15     rescue NoMethodError
    16       __t_printstr__ str rescue print str
    17     end
     13    __t_printstr__ str rescue print str
    1814    i += 1
    1915  end
     
    4945    $mrbtest_assert = []
    5046    $mrbtest_assert_idx = 0
    51     if(!yield || $mrbtest_assert.size > 0)
     47    yield
     48    if($mrbtest_assert.size > 0)
    5249      $asserts.push(assertion_string('Fail: ', str, iso, nil))
    5350      $ko_test += 1
     
    218215
    219216  $asserts.each do |msg|
    220     puts msg
     217    t_print "#{msg}\n"
    221218  end
    222219
     
    237234# Performs fuzzy check for equality on methods returning floats
    238235def check_float(a, b)
    239   tolerance = 1e-12
     236  tolerance = Mrbtest::FLOAT_TOLERANCE
    240237  a = a.to_f
    241238  b = b.to_f
  • EcnlProtoTool/trunk/mruby-1.3.0/test/bintest.rb

    r321 r331  
    44def cmd(s)
    55  case RbConfig::CONFIG['host_os']
    6   when /mswin(?!ce)|mingw|cygwin|bccwin/
     6  when /mswin(?!ce)|mingw|bccwin/
    77    "bin\\#{s}.exe"
    88  else
     
    1313def shellquote(s)
    1414  case RbConfig::CONFIG['host_os']
    15   when /mswin(?!ce)|mingw|cygwin|bccwin/
     15  when /mswin(?!ce)|mingw|bccwin/
    1616    "\"#{s}\""
    1717  else
     
    2121
    2222ARGV.each do |gem|
     23  case RbConfig::CONFIG['host_os']
     24  when /mswin(?!ce)|mingw|bccwin/
     25    gem = gem.gsub('\\', '/')
     26  end
     27
    2328  Dir["#{gem}/bintest/**/*.rb"].each do |file|
    2429    load file
  • EcnlProtoTool/trunk/mruby-1.3.0/test/t/array.rb

    r321 r331  
    1212assert('Array.[]', '15.2.12.4.1') do
    1313  assert_equal([1, 2, 3], Array.[](1,2,3))
     14end
     15
     16class SubArray < Array
     17end
     18
     19assert('SubArray.[]') do
     20  a = SubArray[1, 2, 3]
     21  assert_equal(SubArray, a.class)
    1422end
    1523
     
    8391  a[2...4] = 6
    8492  assert_equal([1,2,6,5], a)
     93
     94  # passing self (#3274)
     95  a = [1,2,3]
     96  a[1,0] = a
     97  assert_equal([1,1,2,3,2,3], a)
     98  a = [1,2,3]
     99  a[-1,0] = a
     100  assert_equal([1,2,1,2,3,3], a)
    85101end
    86102
     
    99115assert('Array#concat', '15.2.12.5.8') do
    100116  assert_equal([1,2,3,4], [1, 2].concat([3, 4]))
     117
     118  # passing self (#3302)
     119  a = [1,2,3]
     120  a.concat(a)
     121  assert_equal([1,2,3,1,2,3], a)
    101122end
    102123
     
    319340  a = [ 1, 2, 3 ]
    320341
    321   assert_true(a.hash.is_a? Integer)
     342  #assert_true(a.hash.is_a? Integer)
     343  assert_true(a.hash.is_a? Integral)  # mruby special
    322344  assert_equal([1,2].hash, [1,2].hash)
    323345end
     
    348370  assert_equal({Array=>200}, h)
    349371end
     372
     373assert("Array#rindex") do
     374  class Sneaky
     375    def ==(*)
     376      $a.clear
     377      $a.replace([1])
     378      false
     379    end
     380  end
     381  $a = [2, 3, 4, 5, 6, 7, 8, 9, 10, Sneaky.new]
     382  assert_equal 0, $a.rindex(1)
     383end
     384
     385assert('Array#freeze') do
     386  a = [].freeze
     387  assert_raise(RuntimeError) do
     388    a[0] = 1
     389  end
     390end
  • EcnlProtoTool/trunk/mruby-1.3.0/test/t/class.rb

    r321 r331  
    385385end
    386386
     387assert('class variable definition in singleton_class') do
     388  class ClassVariableDefinitionInSingletonTest
     389    class << self
     390      @@class_variable = "value"
     391    end
     392    def class_variable
     393      @@class_variable
     394    end
     395  end
     396
     397  assert_equal("value", ClassVariableDefinitionInSingletonTest.new.class_variable)
     398end
     399
     400assert('class variable in module and class << self style class method') do
     401  module ClassVariableInModuleTest
     402    @@class_variable = "value"
     403    class << self
     404      def class_variable
     405        @@class_variable
     406      end
     407    end
     408  end
     409
     410  assert_equal("value", ClassVariableInModuleTest.class_variable)
     411end
     412
     413assert('child class/module defined in singleton class get parent constant') do
     414  actual = module GetParentConstantTest
     415            EXPECT = "value"
     416            class << self
     417              class CHILD
     418                class << self
     419                    EXPECT
     420                end
     421              end
     422            end
     423          end
     424  assert_equal("value", actual)
     425end
     426
     427assert('overriding class variable with a module (#3235)') do
     428  module ModuleWithCVar
     429    @@class_variable = 1
     430  end
     431  class CVarOverrideTest
     432    @@class_variable = 2
     433    include ModuleWithCVar
     434
     435    assert_equal(1, @@class_variable)
     436  end
     437end
     438
    387439assert('class with non-class/module outer raises TypeError') do
    388440  assert_raise(TypeError) { class 0::C1; end }
    389441  assert_raise(TypeError) { class []::C2; end }
    390442end
     443
     444assert("remove_method doesn't segfault if the passed in argument isn't a symbol") do
     445  klass = Class.new
     446  assert_raise(TypeError) { klass.remove_method nil }
     447  assert_raise(TypeError) { klass.remove_method 123 }
     448  assert_raise(TypeError) { klass.remove_method 1.23 }
     449  assert_raise(NameError) { klass.remove_method "hello" }
     450  assert_raise(TypeError) { klass.remove_method Class.new }
     451end
  • EcnlProtoTool/trunk/mruby-1.3.0/test/t/exception.rb

    r321 r331  
    339339        1 * "b"
    340340      ensure
    341         @e = self.z
    342       end
    343     end
    344 
     341        @e = self.zz
     342      end
     343    end
     344
     345    def zz
     346      true
     347    end
    345348    def z
    346349      true
     
    351354
    352355assert('Exception#inspect without message') do
    353   assert_equal "Exception: Exception", Exception.new.inspect
     356  assert_equal "Exception", Exception.new.inspect
    354357end
    355358
     
    374377end
    375378
    376 assert('Raise in rescue') do
    377   assert_raise(ArgumentError) do
    378     begin
    379       raise "" # RuntimeError
    380     rescue
    381       raise ArgumentError
    382     end
    383   end
    384 end
     379def backtrace_available?
     380  begin
     381    raise "XXX"
     382  rescue => exception
     383    not exception.backtrace.empty?
     384  end
     385end
     386
     387assert('GC in rescue') do
     388  skip "backtrace isn't available" unless backtrace_available?
     389
     390  line = nil
     391  begin
     392    [1].each do
     393      [2].each do
     394        [3].each do
     395          line = __LINE__; raise "XXX"
     396        end
     397      end
     398    end
     399  rescue => exception
     400    GC.start
     401    assert_equal("#{__FILE__}:#{line}:in call",
     402                 exception.backtrace.first)
     403  end
     404end
     405
     406assert('Method call in rescue') do
     407  skip "backtrace isn't available" unless backtrace_available?
     408
     409  line = nil
     410  begin
     411    [1].each do
     412      [2].each do
     413        line = __LINE__; raise "XXX"
     414      end
     415    end
     416  rescue => exception
     417    [3].each do
     418    end
     419    assert_equal("#{__FILE__}:#{line}:in call",
     420                 exception.backtrace.first)
     421  end
     422end
  • EcnlProtoTool/trunk/mruby-1.3.0/test/t/float.rb

    r321 r331  
    149149assert('Float#to_i', '15.2.9.3.14') do
    150150  assert_equal(3, 3.123456789.to_i)
     151  assert_raise(FloatDomainError) { Float::INFINITY.to_i }
     152  assert_raise(FloatDomainError) { (-Float::INFINITY).to_i }
     153  assert_raise(FloatDomainError) { Float::NAN.to_i }
    151154end
    152155
  • EcnlProtoTool/trunk/mruby-1.3.0/test/t/hash.rb

    r321 r331  
    1717
    1818  assert_equal 'abc', a['abc']
     19
     20  # Hash#[] should call #default (#3272)
     21  hash = {}
     22  def hash.default(k); self[k] = 1; end
     23  hash[:foo] += 1
     24
     25  assert_equal 2, hash[:foo]
    1926end
    2027
     
    3845  a['a'] = 2
    3946  assert_equal({'a' => 1}, b)
     47
     48  c = Hash.new { |h, k| h[k] = k.upcase }
     49  d = c.dup
     50  assert_equal("FOO", d["foo"])
    4051end
    4152
     
    240251  b.replace(a)
    241252  assert_equal(127, b[127])
     253
     254   assert_raise(TypeError) do
     255    { 'abc_key' => 'abc_value' }.replace "a"
     256  end
    242257end
    243258
     
    352367  assert_equal("b", h[[:b]])
    353368end
     369
     370assert('Hash#freeze') do
     371  h = {}.freeze
     372  assert_raise(RuntimeError) do
     373    h[:a] = 'b'
     374  end
     375end
  • EcnlProtoTool/trunk/mruby-1.3.0/test/t/integer.rb

    r321 r331  
    148148  # Left Shift by a negative is Right Shift
    149149  assert_equal 23, 46 << -1
     150
     151  # Left Shift by 31 is bitShift overflow to SignedInt
     152  assert_equal 2147483648, 1 << 31
     153
     154  # -3 Left Shift by 30 is bitShift overflow to SignedInt
     155  assert_equal(-3221225472, -3 << 30)
    150156end
    151157
  • EcnlProtoTool/trunk/mruby-1.3.0/test/t/kernel.rb

    r321 r331  
    222222end
    223223
     224assert('Kernel#dup class') do
     225  assert_nothing_raised do
     226    Array.dup.new(200)
     227    Range.dup.new(2, 3)
     228    String.dup.new("a"*50)
     229  end
     230end
     231
    224232# Kernel#eval is provided by mruby-eval mrbgem '15.3.1.3.12'
    225233
     
    248256
    249257  assert_true respond_to?(:test_method)
     258end
     259
     260assert('Kernel#freeze') do
     261  obj = Object.new
     262  assert_equal obj, obj.freeze
     263  assert_equal 0, 0.freeze
     264  assert_equal :a, :a.freeze
    250265end
    251266
     
    424439assert('Kernel#public_methods', '15.3.1.3.38') do
    425440  assert_equal Array, public_methods.class
     441  class Foo
     442    def foo
     443    end
     444  end
     445  assert_equal [:foo], Foo.new.public_methods(false)
    426446end
    427447
     
    508528end
    509529
     530assert('Kernel#to_s on primitives') do
     531  begin
     532    Fixnum.alias_method :to_s_, :to_s
     533    Fixnum.remove_method :to_s
     534
     535    assert_nothing_raised do
     536      # segfaults if mrb_cptr is used
     537      1.to_s
     538    end
     539  ensure
     540    Fixnum.alias_method :to_s, :to_s_
     541    Fixnum.remove_method :to_s_
     542  end
     543end
     544
    510545assert('Kernel.local_variables', '15.3.1.2.7') do
    511546  a, b = 0, 1
     
    515550  assert_equal [:a, :b, :vars], vars
    516551
    517   Proc.new {
     552  assert_equal [:a, :b, :c, :vars], Proc.new { |a, b|
    518553    c = 2
    519     vars = Kernel.local_variables.sort
    520     assert_equal [:a, :b, :c, :vars], vars
    521   }.call
     554    Kernel.local_variables.sort
     555  }.call(-1, -2)
    522556end
    523557
     
    588622  assert_equal 6, recurse(0, 5)
    589623end
    590 
  • EcnlProtoTool/trunk/mruby-1.3.0/test/t/literals.rb

    r321 r331  
    2727  assert_equal       10, 1_0
    2828  # integer with exponent
    29   assert_equal 10.0, 1e1,
     29  assert_equal 10.0, 1e1
    3030  assert_equal(0.1, 1e-1)
    3131  assert_equal 10.0, 1e+1
  • EcnlProtoTool/trunk/mruby-1.3.0/test/t/module.rb

    r321 r331  
    494494
    495495# Not ISO specified
     496
     497assert('Module#define_method') do
     498  c = Class.new {
     499    define_method(:m1) { :ok }
     500    define_method(:m2, Proc.new { :ok })
     501  }
     502  assert_equal c.new.m1, :ok
     503  assert_equal c.new.m2, :ok
     504  assert_raise(TypeError) do
     505    Class.new { define_method(:n1, nil) }
     506  end
     507end
    496508
    497509# @!group prepend
     
    838850  assert_raise(TypeError) { module []::M2 end }
    839851end
     852
     853assert('get constant of parent module in singleton class; issue #3568') do
     854  actual = module GetConstantInSingletonTest
     855    EXPECTED = "value"
     856    class << self
     857      EXPECTED
     858    end
     859  end
     860
     861  assert_equal("value", actual)
     862end
  • EcnlProtoTool/trunk/mruby-1.3.0/test/t/nil.rb

    r321 r331  
    3333  assert_equal '', nil.to_s
    3434end
     35
     36assert('safe navigation') do
     37  assert_nil nil&.size
     38  assert_equal 0, []&.size
     39end
  • EcnlProtoTool/trunk/mruby-1.3.0/test/t/proc.rb

    r321 r331  
    137137end
    138138
     139assert('call Proc#initialize if defined') do
     140  a = []
     141  c = Class.new(Proc) do
     142    define_method(:initialize) do
     143      a << :ok
     144    end
     145  end
     146
     147  assert_kind_of c, c.new{}
     148  assert_equal [:ok], a
     149end
     150
    139151assert('&obj call to_proc if defined') do
    140152  pr = Proc.new{}
  • EcnlProtoTool/trunk/mruby-1.3.0/test/t/range.rb

    r321 r331  
    4444
    4545assert('Range#include?', '15.2.14.4.8') do
    46   a = (1..10)
     46  assert_true (1..10).include?(10)
     47  assert_false (1..10).include?(11)
    4748
    48   assert_true a.include?(5)
    49   assert_false a.include?(20)
     49  assert_true (1...10).include?(9)
     50  assert_false (1...10).include?(10)
    5051end
    5152
     
    5859  assert_equal (1..10), b
    5960  assert_false b.exclude_end?
     61
     62  assert_raise(NameError) { (0..1).send(:initialize, 1, 3) }
    6063end
    6164
  • EcnlProtoTool/trunk/mruby-1.3.0/test/t/string.rb

    r321 r331  
    252252end
    253253
     254assert('String#chomp! uses the correct length') do
     255  class A
     256    def to_str
     257      $s.replace("AA")
     258      "A"
     259    end
     260  end
     261
     262  $s = "AAA"
     263  $s.chomp!(A.new)
     264  assert_equal $s, "A"
     265end
     266
    254267assert('String#chop', '15.2.10.5.11') do
    255268  a = ''.chop
     
    329342
    330343  assert_equal list, n_list
     344
     345  n_list.clear
     346  a.each_line("li") do |line|
     347    n_list << line
     348  end
     349  assert_equal ["first li", "ne\nsecond li", "ne\nthird li", "ne"], n_list
    331350end
    332351
     
    353372  assert_equal('A',      'a'.gsub('a', 'A'))
    354373  assert_equal('A',      'a'.gsub('a'){|w| w.capitalize })
     374  assert_equal("<a><><>", 'a'.gsub('a', '<\0><\1><\2>'))
     375  assert_equal(".h.e.l.l.o.", "hello".gsub("", "."))
     376  a = []
     377  assert_equal(".h.e.l.l.o.", "hello".gsub("") { |i| a << i; "." })
     378  assert_equal(["", "", "", "", "", ""], a)
     379  assert_raise(ArgumentError) { "".gsub }
     380  assert_raise(ArgumentError) { "".gsub("", "", "") }
    355381end
    356382
     
    382408
    383409assert('String#include?', '15.2.10.5.21') do
    384   assert_true 'abc'.include?(97)
    385   assert_false 'abc'.include?(100)
    386410  assert_true 'abc'.include?('a')
    387411  assert_false 'abc'.include?('d')
     
    392416  assert_nil 'abc'.index('d')
    393417  assert_equal 3, 'abcabc'.index('a', 1)
     418  assert_equal 5, "hello".index("", 5)
     419  assert_equal nil, "hello".index("", 6)
    394420end
    395421
     
    560586  assert_equal 'aBcabc', 'abcabc'.sub('b') { |w| w.capitalize }
    561587  assert_equal 'aa$', 'aa#'.sub('#', '$')
     588  assert_equal '.abc', "abc".sub("", ".")
     589
     590  str = "abc"
     591  miss = str.sub("X", "Z")
     592  assert_equal str, miss
     593  assert_not_equal str.object_id, miss.object_id
     594
     595  a = []
     596  assert_equal '.abc', "abc".sub("") { |i| a << i; "." }
     597  assert_equal [""], a
    562598end
    563599
     
    586622  b = '123456789'.to_f
    587623  c = '12345.6789'.to_f
     624  d = '1e-2147483648'.to_f
     625  e = '1e2147483648'.to_f
    588626
    589627  assert_float(0.0, a)
    590628  assert_float(123456789.0, b)
    591629  assert_float(12345.6789, c)
     630  assert_float(0, d)
     631  assert_float(Float::INFINITY, e)
    592632end
    593633
     
    686726  assert_raise(RuntimeError) { str.upcase! }
    687727end
    688 
  • EcnlProtoTool/trunk/mruby-1.3.0/test/t/symbol.rb

    r321 r331  
    11##
    22# Symbol ISO Test
     3
     4assert('Symbol') do
     5  assert_equal :"a", :a
     6  assert_equal :"a#{1}", :a1
     7  assert_equal :'a', :a
     8  assert_equal :'a#{1}', :"a\#{1}"
     9end
    310
    411assert('Symbol', '15.2.11') do
  • EcnlProtoTool/trunk/mruby-1.3.0/test/t/syntax.rb

    r321 r331  
    3939    yield
    4040  end
     41  assert_raise LocalJumpError do
     42    o = Object.new
     43    def o.foo
     44      yield
     45    end
     46    o.foo
     47  end
     48end
     49
     50assert('redo in a for loop (#3275)') do
     51  sum = 0
     52  for i in 1..10
     53    sum += i
     54    i -= 1
     55    if i > 0
     56      redo
     57    end
     58  end
     59
     60  assert_equal 220, sum
    4161end
    4262
     
    249269end
    250270
     271assert('multiple assignment (empty array rhs #3236, #3239)') do
     272  a,b,*c = []; assert_equal [nil, nil, []], [a, b, c]
     273  a,b,*c = [1]; assert_equal [1, nil, []], [a, b, c]
     274  a,b,*c = [nil]; assert_equal [nil,nil, []], [a, b, c]
     275  a,b,*c = [[]]; assert_equal [[], nil, []], [a, b, c]
     276end
     277
    251278assert('Return values of case statements') do
    252279  a = [] << case 1
     
    299326
    300327  assert_equal 1, when_value
     328end
     329
     330assert('splat object in assignment') do
     331  o = Object.new
     332  def o.to_a
     333    nil
     334  end
     335  assert_equal [o], (a = *o)
     336
     337  def o.to_a
     338    1
     339  end
     340  assert_raise(TypeError) { a = *o }
     341
     342  def o.to_a
     343    [2]
     344  end
     345  assert_equal [2], (a = *o)
     346end
     347
     348assert('splat object in case statement') do
     349  o = Object.new
     350  def o.to_a
     351    nil
     352  end
     353  a = case o
     354  when *o
     355    1
     356  end
     357  assert_equal 1, a
    301358end
    302359
     
    325382
    326383assert('External command execution.') do
    327   class << Kernel
     384  module Kernel
    328385    sym = '`'.to_sym
    329386    alias_method :old_cmd, sym
  • EcnlProtoTool/trunk/mruby-1.3.0/test/t/unicode.rb

    r321 r331  
    33assert('bare \u notation test') do
    44  # Mininum and maximum one byte characters
    5   assert_equal("\u0000", "\x00")
    6   assert_equal("\u007F", "\x7F")
     5  assert_equal("\x00", "\u0000")
     6  assert_equal("\x7F", "\u007F")
    77
    88  # Mininum and maximum two byte characters
    9   assert_equal("\u0080", "\xC2\x80")
    10   assert_equal("\u07FF", "\xDF\xBF")
     9  assert_equal("\xC2\x80", "\u0080")
     10  assert_equal("\xDF\xBF", "\u07FF")
    1111
    1212  # Mininum and maximum three byte characters
    13   assert_equal("\u0800", "\xE0\xA0\x80")
    14   assert_equal("\uFFFF", "\xEF\xBF\xBF")
     13  assert_equal("\xE0\xA0\x80", "\u0800")
     14  assert_equal("\xEF\xBF\xBF", "\uFFFF")
    1515
    1616  # Four byte characters require the \U notation
     
    1919assert('braced \u notation test') do
    2020  # Mininum and maximum one byte characters
    21   assert_equal("\u{0000}", "\x00")
    22   assert_equal("\u{007F}", "\x7F")
     21  assert_equal("\x00", "\u{0000}")
     22  assert_equal("\x7F", "\u{007F}")
    2323
    2424  # Mininum and maximum two byte characters
    25   assert_equal("\u{0080}", "\xC2\x80")
    26   assert_equal("\u{07FF}", "\xDF\xBF")
     25  assert_equal("\xC2\x80", "\u{0080}")
     26  assert_equal("\xDF\xBF", "\u{07FF}")
    2727
    2828  # Mininum and maximum three byte characters
    29   assert_equal("\u{0800}", "\xE0\xA0\x80")
    30   assert_equal("\u{FFFF}", "\xEF\xBF\xBF")
     29  assert_equal("\xE0\xA0\x80", "\u{0800}")
     30  assert_equal("\xEF\xBF\xBF", "\u{FFFF}")
    3131
    3232  # Mininum and maximum four byte characters
    33   assert_equal("\u{10000}",  "\xF0\x90\x80\x80")
    34   assert_equal("\u{10FFFF}", "\xF4\x8F\xBF\xBF")
     33  assert_equal("\xF0\x90\x80\x80", "\u{10000}")
     34  assert_equal("\xF4\x8F\xBF\xBF", "\u{10FFFF}")
    3535end
     36
     37assert('braced multiple \u notation test') do
     38  assert_equal("ABC", "\u{41 42 43}")
     39end
Note: See TracChangeset for help on using the changeset viewer.