Changeset 331 for EcnlProtoTool/trunk/mruby-1.3.0
- Timestamp:
- Jan 21, 2018, 12:10:09 AM (6 years ago)
- 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 19 19 <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"> 20 20 <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"/> 22 22 <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"> 23 23 <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 18 18 /.git 19 19 cscope.out 20 tags 20 21 /src/y.tab.c 21 22 /bin -
EcnlProtoTool/trunk/mruby-1.3.0/.info
r279 r331 4 4 GCC_STRING=5.2-GNUARM-NONE_v16.01 5 5 VERSION_IDE= 6 E2STUDIO_VERSION=5. 3.1.0026 E2STUDIO_VERSION=5.4.0.018 7 7 ACTIVE_CONFIGURATION=Debug -
EcnlProtoTool/trunk/mruby-1.3.0/.project
r279 r331 1 1 <?xml version="1.0" encoding="UTF-8"?> 2 2 <projectDescription> 3 <name>mruby-1. 2.0</name>3 <name>mruby-1.3.0</name> 4 4 <comment></comment> 5 5 <projects> -
EcnlProtoTool/trunk/mruby-1.3.0/.travis.yml
r270 r331 8 8 sudo: 9000 9 9 - os: osx 10 osx_image: xcod 6.410 osx_image: xcode7.1 11 11 12 12 addons: … … 17 17 env: MRUBY_CONFIG=travis_config.rb 18 18 script: "./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: always26 on_failure: never -
EcnlProtoTool/trunk/mruby-1.3.0/AUTHORS
r270 r331 35 35 Terence Lee 36 36 Zachary Scott 37 Tomasz DÄ 38 browski -
EcnlProtoTool/trunk/mruby-1.3.0/MITL
r270 r331 1 Copyright (c) 201 5mruby developers1 Copyright (c) 2017 mruby developers 2 2 3 3 Permission is hereby granted, free of charge, to any person obtaining a -
EcnlProtoTool/trunk/mruby-1.3.0/README.md
r270 r331 18 18 ## How to get mruby 19 19 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)20 The 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) 21 21 22 22 The 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) … … 27 27 $ git clone https://github.com/mruby/mruby.git 28 28 29 You 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 29 31 ## mruby home-page 30 32 … … 33 35 ## Mailing list 34 36 35 We don't have mailing list, but you can use [GitHub issues](https://github.com/mruby/mruby).37 We don't have a mailing list, but you can use [GitHub issues](https://github.com/mruby/mruby). 36 38 37 39 ## How to compile and install (mruby and gems) … … 53 55 mruby contains a package manager called *mrbgems*. To create extensions 54 56 in 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 of57 use mrbgems consult the file [doc/guides/mrbgems.md](doc/guides/mrbgems.md). For example code of 56 58 how to use mrbgems look into the folder *examples/mrbgems/*. 57 59 -
EcnlProtoTool/trunk/mruby-1.3.0/Rakefile
r270 r331 28 28 29 29 load "#{MRUBY_ROOT}/tasks/benchmark.rake" 30 31 load "#{MRUBY_ROOT}/tasks/gitlab.rake" 30 32 31 33 ############################## -
EcnlProtoTool/trunk/mruby-1.3.0/build.bat
r298 r331 1 set DIR=%~dp0 2 set PATH=%PATH%;%DIR%\..\tools\bin 1 3 2 call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" x86 4 rem call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" x86 5 call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x86 6 7 cd /d %DIR% 3 8 4 9 ruby -Eutf-8 ./minirake %1 -
EcnlProtoTool/trunk/mruby-1.3.0/build_config.rb
r321 r331 17 17 # end 18 18 # 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' 21 23 22 24 # include the default GEMs … … 147 149 conf.archiver.command = "arm-none-eabi-ar" 148 150 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) 150 157 151 158 #configuration for low memory environment … … 160 167 conf.gem "#{root}/mrbgems/mruby-string-ext" 161 168 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" 163 170 end 164 171 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" 165 179 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" 170 182 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" 173 187 end 174 188 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"184 189 g.cc.include_paths << "#{g.dir}/../../prototool/src" 190 g.cc.include_paths << "#{g.dir}/../../mbed_api/src" 185 191 end 186 192 conf.gem "#{root}/../mrbgems/mruby-ecnl" -
EcnlProtoTool/trunk/mruby-1.3.0/examples/mrbgems/ruby_extension_example/mrbgem.rake
r321 r331 12 12 # spec.linker.libraries << 'external_lib' 13 13 14 spec.add_dependency('mruby-print', :core => 'mruby-print') 15 14 16 # Default build files 15 17 # spec.rbfiles = Dir.glob("#{dir}/mrblib/*.rb") -
EcnlProtoTool/trunk/mruby-1.3.0/include/mrbconf.h
r321 r331 8 8 #define MRUBYCONF_H 9 9 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 10 27 /* configuration options: */ 11 28 /* add -DMRB_USE_FLOAT to use float instead of double for floating point numbers */ 12 29 //#define MRB_USE_FLOAT 13 #define MRB_USE_FLOAT14 30 15 31 /* add -DMRB_INT16 to use 16bit integer for mrb_int; conflict with MRB_INT64 */ … … 33 49 /* argv max size in mrb_funcall */ 34 50 //#define MRB_FUNCALL_ARGC_MAX 16 35 #define MRB_FUNCALL_ARGC_MAX 836 51 37 52 /* number of object per heap page */ 38 53 //#define MRB_HEAP_PAGE_SIZE 1024 39 #define MRB_HEAP_PAGE_SIZE 6440 54 41 55 /* use segmented list for IV table */ 42 56 //#define MRB_USE_IV_SEGLIST 43 #define MRB_USE_IV_SEGLIST44 57 45 58 /* initial size for IV khash; ignored when MRB_USE_IV_SEGLIST is set */ … … 58 71 /* default size of khash table bucket */ 59 72 //#define KHASH_DEFAULT_SIZE 32 60 #define KHASH_DEFAULT_SIZE 861 73 62 74 /* allocated memory address alignment */ … … 65 77 /* page size of memory pool */ 66 78 //#define POOL_PAGE_SIZE 16000 67 #define POOL_PAGE_SIZE 409668 79 69 80 /* initial minimum size for string buffer */ 70 81 //#define MRB_STR_BUF_MIN_SIZE 128 71 #define MRB_STR_BUF_MIN_SIZE 2072 82 73 83 /* arena size */ … … 76 86 /* fixed size GC arena */ 77 87 //#define MRB_GC_FIXED_ARENA 78 #define MRB_GC_FIXED_ARENA79 88 80 89 /* state atexit stack size */ -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby.h
r321 r331 2 2 ** mruby - An embeddable Ruby implementation 3 3 ** 4 ** Copyright (c) mruby developers 2010-201 54 ** Copyright (c) mruby developers 2010-2017 5 5 ** 6 6 ** Permission is hereby granted, free of charge, to any person obtaining … … 29 29 #define MRUBY_H 30 30 31 #ifdef __cplusplus 32 #define __STDC_LIMIT_MACROS 33 #define __STDC_CONSTANT_MACROS 34 #define __STDC_FORMAT_MACROS 35 #endif 36 31 37 #include <stdint.h> 32 38 #include <stddef.h> 33 39 #include <limits.h> 34 40 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 35 66 #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 36 74 #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> 40 78 41 79 /** … … 76 114 int nregs; 77 115 int ridx; 78 int e idx;116 int epos; 79 117 struct REnv *env; 80 118 mrb_code *pc; /* return address */ … … 88 126 MRB_FIBER_CREATED = 0, 89 127 MRB_FIBER_RUNNING, 90 MRB_FIBER_RESUM ING,128 MRB_FIBER_RESUMED, 91 129 MRB_FIBER_SUSPENDED, 92 130 MRB_FIBER_TRANSFERRED, … … 106 144 int rsize; 107 145 struct RProc **ensure; /* ensure handler stack */ 108 int esize ;146 int esize, eidx; 109 147 110 148 enum mrb_fiber_state status; 149 mrb_bool vmexec; 111 150 struct RFiber *fib; 112 151 }; … … 116 155 typedef void (*mrb_atexit_func)(struct mrb_state*); 117 156 157 #define MRB_STATE_NO_REGEXP 1 158 #define MRB_STATE_REGEXP 2 159 118 160 typedef struct mrb_state { 119 161 struct mrb_jmpbuf *jmp; 120 162 163 uint32_t flags; 121 164 mrb_allocf allocf; /* memory allocation function */ 122 165 void *allocf_ud; /* auxiliary data of allocf */ … … 124 167 struct mrb_context *c; 125 168 struct mrb_context *root_c; 169 struct iv_tbl *globals; /* global variable table */ 126 170 127 171 struct RObject *exc; /* exception */ 128 struct iv_tbl *globals; /* global variable table */129 172 130 173 struct RObject *top_self; … … 158 201 #endif 159 202 203 #ifdef MRB_BYTECODE_DECODE_OPTION 204 mrb_code (*bytecode_decoder)(struct mrb_state* mrb, mrb_code code); 205 #endif 206 160 207 struct RClass *eException_class; 161 208 struct RClass *eStandardError_class; 162 209 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 163 214 164 215 void *ud; /* auxiliary data */ … … 182 233 * !!!c 183 234 * void mrb_example_gem_init(mrb_state* mrb) { 184 * 185 * 235 * struct RClass *example_class; 236 * example_class = mrb_define_class(mrb, "Example_Class", mrb->object_class); 186 237 * } 187 238 * 188 239 * void mrb_example_gem_final(mrb_state* mrb) { 189 * 240 * //free(TheAnimals); 190 241 * } 191 242 * … … 200 251 /** 201 252 * Defines a new module. 253 * 202 254 * @param [mrb_state *] mrb_state* The current mruby state. 203 255 * @param [const char *] char* The name of the module. … … 209 261 /** 210 262 * 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 216 268 * @param [mrb_state *] mrb_state* The current mruby state. 217 269 * @param [struct RClass *] RClass* A reference to module or a class. … … 230 282 * @param [struct RClass *] RClass* A reference to module or a class. 231 283 * @param [struct RClass *] RClass* A reference to the module to be prepended. 232 */ 284 */ 233 285 MRB_API void mrb_prepend_module(mrb_state*, struct RClass*, struct RClass*); 234 286 … … 264 316 * 265 317 * 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 270 323 * 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. 289 334 * @param [struct RClass *] RClass* The class where the class method will be defined. 290 335 * @param [const char *] char* The name of the class method being defined. … … 299 344 * 300 345 * 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 * } 321 361 * @param [mrb_state *] mrb_state* The MRuby state reference. 322 362 * @param [struct RClass *] RClass* The module where the module function will be defined. 323 363 * @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. 325 365 * @param [mrb_aspec] mrb_aspec The method parameters declaration. 326 366 */ … … 331 371 * 332 372 * 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 * } 356 390 * @param [mrb_state *] mrb_state* The MRuby state reference. 357 391 * @param [struct RClass *] RClass* A class or module the constant is defined in. … … 365 399 * 366 400 * 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 373 408 * 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 * } 420 441 * @param [mrb_state*] mrb_state* The mruby state reference. 421 442 * @param [struct RClass*] RClass* A class the method will be undefined from. … … 426 447 /** 427 448 * Undefine a class method. 428 *429 449 * 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 * } 469 480 * @param [mrb_state*] mrb_state* The mruby state reference. 470 481 * @param [RClass*] RClass* A class the class method will be undefined from. … … 478 489 * Example: 479 490 * 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 * } 498 508 * @param [mrb_state*] mrb The current mruby state. 499 509 * @param [RClass*] c Reference to the class of the new object. … … 517 527 * Example: 518 528 * 519 * void520 * 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#p527 * }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 * } 528 538 * 529 539 * @param [mrb_state*] mrb The current mruby state. … … 537 547 * 538 548 * Example: 539 * void540 * 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 * } 545 555 * 546 556 * @param [mrb_state*] mrb The current mruby state. … … 553 563 * 554 564 * 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 * } 567 581 * } 568 * else {569 * puts("False");570 * }571 * }572 582 * 573 583 * @param [mrb_state*] mrb The current mruby state. … … 584 594 */ 585 595 MRB_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 */ 603 MRB_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 */ 634 MRB_API mrb_bool mrb_class_defined_under(mrb_state *mrb, struct RClass *outer, const char *name); 586 635 587 636 /** … … 616 665 * 617 666 * Equivalent to: 618 * Object#dup 667 * Object#dup 619 668 * @param [mrb_state*] mrb The current mruby state. 620 669 * @param [mrb_value] obj Object to be duplicate. … … 628 677 * class it returns true, it returns false otherwise. 629 678 * 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 634 684 * 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 * } 655 708 * } 656 * else if (obj_resp == 0) {657 * puts("False");658 * }659 * }660 709 * 661 710 * @param [mrb_state*] mrb The current mruby state. … … 795 844 /** 796 845 * 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. 797 870 */ 798 871 MRB_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 */ 799 901 MRB_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 */ 800 905 MRB_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 */ 801 918 MRB_API mrb_sym mrb_intern_cstr(mrb_state*,const char*); 802 919 MRB_API mrb_sym mrb_intern(mrb_state*,const char*,size_t); … … 892 1009 MRB_API mrb_value mrb_top_self(mrb_state *); 893 1010 MRB_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); 1011 MRB_API mrb_value mrb_top_run(mrb_state*, struct RProc*, mrb_value, unsigned int); 1012 MRB_API mrb_value mrb_vm_run(mrb_state*, struct RProc*, mrb_value, unsigned int); 1013 MRB_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)) 896 1018 897 1019 MRB_API void mrb_p(mrb_state*, mrb_value); … … 965 1087 + exception objects obtained from those macros are local to mrb 966 1088 */ 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")) 984 1105 985 1106 MRB_API mrb_value mrb_yield(mrb_state *mrb, mrb_value b, mrb_value arg); 986 1107 MRB_API mrb_value mrb_yield_argv(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value *argv); 987 1108 MRB_API mrb_value mrb_yield_with_class(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value *argv, mrb_value self, struct RClass *c); 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); */ 1113 mrb_value mrb_yield_cont(mrb_state *mrb, mrb_value b, mrb_value self, mrb_int argc, const mrb_value *argv); 988 1114 989 1115 /* mrb_gc_protect() leaves the object in the arena */ … … 1013 1139 MRB_API mrb_bool mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid); 1014 1140 MRB_API mrb_bool mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c); 1141 MRB_API mrb_bool mrb_func_basic_p(mrb_state *mrb, mrb_value obj, mrb_sym mid, mrb_func_t func); 1015 1142 1016 1143 … … 1034 1161 * @mrbgem mruby-fiber 1035 1162 */ 1036 #define E_FIBER_ERROR (mrb_ class_get(mrb, "FiberError"))1163 #define E_FIBER_ERROR (mrb_exc_get(mrb, "FiberError")) 1037 1164 1038 1165 /* memory pool implementation */ … … 1050 1177 MRB_API void mrb_show_copyright(mrb_state *mrb); 1051 1178 1052 #ifdef MRB_DEBUG1053 #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 #else1057 #define mrb_assert(p) ((void)0)1058 #define mrb_assert_int_fit(t1,n,t2,max) ((void)0)1059 #endif1060 1061 #if __STDC_VERSION__ >= 201112L1062 #define mrb_static_assert(exp, str) _Static_assert(exp, str)1063 #else1064 #define mrb_static_assert(exp, str) mrb_assert(exp)1065 #endif1066 1067 1179 MRB_API mrb_value mrb_format(mrb_state *mrb, const char *format, ...); 1068 1180 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 1186 static inline void* 1187 mrbmemcpy(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 1197 static inline void* 1198 mrbmemset(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 1069 1208 MRB_END_DECL 1070 1209 -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/array.h
r321 r331 8 8 #define MRUBY_ARRAY_H 9 9 10 #include " mruby/common.h"10 #include "common.h" 11 11 12 12 /* … … 55 55 * 56 56 * @param mrb The mruby state reference. 57 * @return The initialized array 57 * @return The initialized array. 58 58 */ 59 59 MRB_API mrb_value mrb_ary_new(mrb_state *mrb); 60 60 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 */ 61 73 MRB_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 */ 62 87 MRB_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 */ 99 MRB_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 */ 110 MRB_API mrb_value mrb_ary_splat(mrb_state *mrb, mrb_value value); 65 111 66 112 /* … … 85 131 * 86 132 * @param mrb The mruby state reference. 87 * @param ary The array from which the value will be pop ed.88 * @return The pop ed value.133 * @param ary The array from which the value will be popped. 134 * @return The popped value. 89 135 */ 90 136 MRB_API mrb_value mrb_ary_pop(mrb_state *mrb, mrb_value ary); … … 118 164 MRB_API void mrb_ary_set(mrb_state *mrb, mrb_value ary, mrb_int n, mrb_value val); 119 165 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 */ 177 MRB_API void mrb_ary_replace(mrb_state *mrb, mrb_value self, mrb_value other); 121 178 MRB_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 */ 122 191 MRB_API mrb_value mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item); 123 192 MRB_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 */ 124 205 MRB_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 */ 125 218 MRB_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 */ 126 231 MRB_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 */ 240 MRB_API mrb_value mrb_ary_resize(mrb_state *mrb, mrb_value ary, mrb_int new_len); 128 241 129 242 static inline mrb_int … … 135 248 } 136 249 250 static inline mrb_value 251 ary_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 137 259 MRB_END_DECL 138 260 -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/boxing_nan.h
r321 r331 54 54 55 55 #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) 57 57 #define mrb_ptr(o) ((void*)((((uintptr_t)0x3fffffffffff)&((uintptr_t)((o).value.p)))<<2)) 58 58 #define mrb_float(o) (o).f … … 61 61 #define mrb_symbol(o) (o).value.sym 62 62 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 63 69 #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));\ 73 77 } while (0) 74 78 … … 77 81 (r).value.ttt = 0x7ff80000; \ 78 82 (r).value.i = 0; \ 79 } else { \ 83 } \ 84 else { \ 80 85 (r).f = v; \ 81 86 }} while(0) … … 87 92 #define SET_INT_VALUE(r,n) BOXNAN_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n)) 88 93 #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) 91 96 #define SET_UNDEF_VALUE(r) BOXNAN_SET_VALUE(r, MRB_TT_UNDEF, value.i, 0) 92 97 -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/boxing_word.h
r321 r331 10 10 #if defined(MRB_INT16) 11 11 # 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. 12 16 #endif 13 17 … … 63 67 #define mrb_cptr(o) (o).value.vp->p 64 68 #define mrb_float(o) (o).value.fp->f 65 #define mrb_fixnum(o) ( o).value.i69 #define mrb_fixnum(o) ((mrb_int)(o).value.i) 66 70 #define mrb_symbol(o) (o).value.sym 67 71 … … 92 96 #define mrb_nil_p(o) ((o).w == MRB_Qnil) 93 97 94 #define BOXWORD_SET_VALUE(o, ttt, attr, v) do { \98 #define BOXWORD_SET_VALUE(o, ttt, attr, v) do { \ 95 99 switch (ttt) {\ 96 100 case MRB_TT_FALSE: (o).w = (v) ? MRB_Qfalse : MRB_Qnil; break;\ 97 101 case MRB_TT_TRUE: (o).w = MRB_Qtrue; break;\ 98 102 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;\ 101 105 default: (o).w = 0; (o).attr = (v); if ((o).value.bp) (o).value.bp->tt = ttt; break;\ 102 106 }\ -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/class.h
r321 r331 8 8 #define MRUBY_CLASS_H 9 9 10 #include " mruby/common.h"10 #include "common.h" 11 11 12 12 /** … … 52 52 } 53 53 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) 55 56 #define MRB_FLAG_IS_PREPENDED (1 << 19) 56 57 #define MRB_FLAG_IS_ORIGIN (1 << 20) -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/common.h
r321 r331 1 1 /* 2 ** mruby/common.h - mruby common platform definitions2 **"common.h - mruby common platform definition" 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 10 10 11 11 #ifdef __cplusplus 12 #ifdef MRB_ENABLE_CXX_ABI 13 #define MRB_BEGIN_DECL 14 #define MRB_END_DECL 15 #else 12 16 # define MRB_BEGIN_DECL extern "C" { 13 17 # define MRB_END_DECL } 18 #endif 14 19 #else 15 20 /** Start declarations in C mode */ -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/compile.h
r321 r331 8 8 #define MRUBY_COMPILE_H 9 9 10 #include " mruby/common.h"10 #include "common.h" 11 11 12 12 /** … … 15 15 MRB_BEGIN_DECL 16 16 17 #include "mruby.h"17 #include <mruby.h> 18 18 19 19 struct mrb_jmpbuf; … … 40 40 MRB_API const char *mrbc_filename(mrb_state *mrb, mrbc_context *c, const char *s); 41 41 MRB_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);44 42 45 43 /* AST node structure */ … … 105 103 }; 106 104 107 #define MRB_PARSER_BUF_SIZE 1024 105 #define MRB_PARSER_TOKBUF_MAX 65536 106 #define MRB_PARSER_TOKBUF_SIZE 256 108 107 109 108 /* parser structure */ … … 133 132 134 133 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; 137 138 138 139 mrb_ast_node *all_heredocs; /* list of mrb_parser_heredoc_info* */ … … 163 164 MRB_API void mrb_parser_free(struct mrb_parser_state*); 164 165 MRB_API void mrb_parser_parse(struct mrb_parser_state*,mrbc_context*); 166 MRB_API double mrb_float_read(const char*, char**); 165 167 166 168 MRB_API void mrb_parser_set_filename(struct mrb_parser_state*, char const*); … … 174 176 MRB_API struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,int,mrbc_context*); 175 177 MRB_API struct RProc* mrb_generate_code(mrb_state*, struct mrb_parser_state*); 178 MRB_API mrb_value mrb_load_exec(mrb_state *mrb, struct mrb_parser_state *p, mrbc_context *c); 176 179 177 180 /* program load functions */ -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/data.h
r321 r331 8 8 #define MRUBY_DATA_H 9 9 10 #include " mruby/common.h"10 #include "common.h" 11 11 12 12 /** -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/debug.h
r321 r331 8 8 #define MRUBY_DEBUG_H 9 9 10 #include " mruby/common.h"10 #include "common.h" 11 11 12 12 /** -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/dump.h
r321 r331 8 8 #define MRUBY_DUMP_H 9 9 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" 13 13 14 14 /** … … 53 53 #define RITE_BINARY_IDENT "RITE" 54 54 #define RITE_BINARY_IDENT_LIL "ETIR" 55 #define RITE_BINARY_FORMAT_VER "000 3"55 #define RITE_BINARY_FORMAT_VER "0004" 56 56 #define RITE_COMPILER_NAME "MATZ" 57 57 #define RITE_COMPILER_VERSION "0000" -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/error.h
r321 r331 8 8 #define MRUBY_ERROR_H 9 9 10 #include " mruby/common.h"10 #include "common.h" 11 11 12 12 /** … … 32 32 /* declaration for fail method */ 33 33 MRB_API mrb_value mrb_f_raise(mrb_state*, mrb_value); 34 35 struct RBreak { 36 MRB_OBJECT_HEADER; 37 struct iv_tbl *iv; 38 struct RProc *proc; 39 mrb_value val; 40 }; 34 41 35 42 /** -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/gc.h
r321 r331 8 8 #define MRUBY_GC_H 9 9 10 #include " mruby/common.h"10 #include "common.h" 11 11 12 12 /** … … 18 18 struct mrb_state; 19 19 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 22 typedef int (mrb_each_object_callback)(struct mrb_state *mrb, struct RBasic *obj, void *data); 21 23 void mrb_objspace_each_objects(struct mrb_state *mrb, mrb_each_object_callback *callback, void *data); 22 24 MRB_API void mrb_free_context(struct mrb_state *mrb, struct mrb_context *c); … … 63 65 int interval_ratio; 64 66 int step_ratio; 67 mrb_bool iterating :1; 65 68 mrb_bool disabled :1; 66 69 mrb_bool full :1; -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/hash.h
r321 r331 8 8 #define MRUBY_HASH_H 9 9 10 #include "mruby/common.h" 10 #include "common.h" 11 #include <mruby/khash.h> 11 12 12 13 /** … … 24 25 #define mrb_hash_value(p) mrb_obj_value((void*)(p)) 25 26 26 MRB_API mrb_value mrb_hash_new_capa(mrb_state*, int);27 MRB_API mrb_value mrb_hash_new_capa(mrb_state*, mrb_int); 27 28 28 29 /* 29 30 * 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. 30 38 */ 31 39 MRB_API mrb_value mrb_hash_new(mrb_state *mrb); … … 33 41 /* 34 42 * 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. 35 53 */ 36 54 MRB_API void mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val); 37 55 38 56 /* 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. 40 68 */ 41 69 MRB_API mrb_value mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key); 42 70 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 */ 43 85 MRB_API mrb_value mrb_hash_fetch(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value def); 44 86 45 87 /* 46 88 * 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. 47 98 */ 48 99 MRB_API mrb_value mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key); … … 50 101 /* 51 102 * 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. 52 111 */ 53 112 MRB_API mrb_value mrb_hash_keys(mrb_state *mrb, mrb_value hash); 54 113 MRB_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 */ 55 126 MRB_API mrb_value mrb_hash_empty_p(mrb_state *mrb, mrb_value self); 56 127 57 128 /* 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 */ 139 MRB_API mrb_value mrb_hash_values(mrb_state *mrb, mrb_value hash); 140 141 /* 58 142 * 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 59 151 */ 60 152 MRB_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 */ 156 typedef struct { 157 mrb_value v; 158 mrb_int n; 159 } mrb_hash_value; 160 161 KHASH_DECLARE(ht, mrb_value, mrb_hash_value, TRUE) 61 162 62 163 /* RHASH_TBL allocates st_table if not available. */ … … 67 168 MRB_API struct kh_ht * mrb_hash_tbl(mrb_state *mrb, mrb_value hash); 68 169 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) 70 173 #define MRB_RHASH_PROCDEFAULT_P(h) (RHASH(h)->flags & MRB_HASH_PROC_DEFAULT) 71 174 -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/irep.h
r321 r331 8 8 #define MRUBY_IREP_H 9 9 10 #include " mruby/common.h"11 #include "mruby/compile.h"10 #include "common.h" 11 #include <mruby/compile.h> 12 12 13 13 /** … … 40 40 struct mrb_locals *lv; 41 41 /* debug info */ 42 mrb_bool own_filename; 42 43 const char *filename; 43 44 uint16_t *lines; -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/khash.h
r321 r331 10 10 #include <string.h> 11 11 12 #include "mruby.h"13 #include " mruby/common.h"12 #include <mruby.h> 13 #include "common.h" 14 14 15 15 /** -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/numeric.h
r321 r331 8 8 #define MRUBY_NUMERIC_H 9 9 10 #include " mruby/common.h"10 #include "common.h" 11 11 12 12 /** … … 21 21 #define FIXABLE(f) (POSFIXABLE(f) && NEGFIXABLE(f)) 22 22 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 23 29 MRB_API mrb_value mrb_flo_to_fixnum(mrb_state *mrb, mrb_value val); 24 30 MRB_API mrb_value mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, int base); … … 32 38 mrb_value mrb_num_div(mrb_state *mrb, mrb_value x, mrb_value y); 33 39 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 71 static inline mrb_bool 72 mrb_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 77 static inline mrb_bool 78 mrb_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 83 static inline mrb_bool 84 mrb_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 34 93 #define MRB_UINT_MAKE2(n) uint ## n ## _t 35 94 #define MRB_UINT_MAKE(n) MRB_UINT_MAKE2(n) … … 37 96 38 97 #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_bool45 mrb_int_add_overflow(mrb_int augend, mrb_int addend, mrb_int *sum)46 {47 mrb_bool of;48 49 #ifdef MRB_INT6450 long long val;51 of = __builtin_saddll_overflow(augend, addend, &val) ||52 #else53 int val;54 of = __builtin_sadd_overflow(augend, addend, &val) ||55 #endif56 (val > MRB_INT_MAX) || (val < MRB_INT_MIN);57 58 *sum = (mrb_int) val;59 return of;60 }61 62 static inline mrb_bool63 mrb_int_sub_overflow(mrb_int minuend, mrb_int subtrahend, mrb_int *difference)64 {65 mrb_bool of;66 67 #ifdef MRB_INT6468 long long val;69 of = __builtin_ssubll_overflow(minuend, subtrahend, &val) ||70 #else71 int val;72 of = __builtin_ssub_overflow(minuend, subtrahend, &val) ||73 #endif74 (val > MRB_INT_MAX) || (val < MRB_INT_MIN);75 76 *difference = (mrb_int) val;77 return of;78 }79 #else80 98 81 99 static inline mrb_bool … … 99 117 } 100 118 119 static inline mrb_bool 120 mrb_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; 101 145 #endif 146 } 102 147 103 148 #undef MRB_INT_OVERFLOW_MASK … … 106 151 #undef MRB_UINT_MAKE2 107 152 153 #endif 154 108 155 MRB_END_DECL 109 156 -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/object.h
r321 r331 23 23 #define mrb_basic_ptr(v) ((struct RBasic*)(mrb_ptr(v))) 24 24 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 25 29 struct RObject { 26 30 MRB_OBJECT_HEADER; -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/opcode.h
r321 r331 83 83 OP_JMPNOT,/* A sBx if !R(A) pc+=sBx */ 84 84 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) */ 86 87 OP_POPERR,/* A A.times{rescue_pop()} */ 87 88 OP_RAISE,/* A raise(R(A)) */ -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/proc.h
r321 r331 8 8 #define MRUBY_PROC_H 9 9 10 #include " mruby/common.h"11 #include "mruby/irep.h"10 #include "common.h" 11 #include <mruby/irep.h> 12 12 13 13 /** … … 19 19 MRB_OBJECT_HEADER; 20 20 mrb_value *stack; 21 mrb_sym mid;22 21 ptrdiff_t cioff; 22 union { 23 mrb_sym mid; 24 struct mrb_context *c; 25 } cxt; 23 26 }; 24 27 … … 27 30 #define MRB_ENV_UNSHARE_STACK(e) ((e)->cioff = -1) 28 31 #define MRB_ENV_STACK_SHARED_P(e) ((e)->cioff >= 0) 32 33 MRB_API void mrb_env_unshare(mrb_state*, struct REnv*); 29 34 30 35 struct RProc { … … 51 56 #define MRB_PROC_STRICT 256 52 57 #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) 53 60 54 61 #define mrb_proc_ptr(v) ((struct RProc*)(mrb_ptr(v))) … … 69 76 #define mrb_cfunc_env_get(mrb, idx) mrb_proc_cfunc_env_get(mrb, idx) 70 77 71 #include "mruby/khash.h"78 #include <mruby/khash.h> 72 79 KHASH_DECLARE(mt, mrb_sym, struct RProc*, TRUE) 73 80 -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/range.h
r321 r331 8 8 #define MRUBY_RANGE_H 9 9 10 #include " mruby/common.h"10 #include "common.h" 11 11 12 12 /** … … 26 26 }; 27 27 28 #define mrb_range_ptr(v) ((struct RRange*)(mrb_ptr(v))) 28 MRB_API struct RRange* mrb_range_ptr(mrb_state *mrb, mrb_value v); 29 #define mrb_range_raw_ptr(v) ((struct RRange*)mrb_ptr(v)) 29 30 #define mrb_range_value(p) mrb_obj_value((void*)(p)) 30 31 … … 41 42 MRB_API mrb_value mrb_range_new(mrb_state *mrb, mrb_value start, mrb_value end, mrb_bool exclude); 42 43 43 MRB_API mrb_ bool mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len);44 MRB_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); 44 45 mrb_value mrb_get_values_at(mrb_state *mrb, mrb_value obj, mrb_int olen, mrb_int argc, const mrb_value *argv, mrb_value (*func)(mrb_state*, mrb_value, mrb_int)); 45 46 -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/re.h
r321 r331 8 8 #define MRUBY_RE_H 9 9 10 #ifdef __cplusplus 11 extern "C" { 12 #endif 10 MRB_BEGIN_DECL 13 11 14 12 #define REGEXP_CLASS "Regexp" 15 13 16 #ifdef __cplusplus 17 } 18 #endif 14 MRB_END_DECL 19 15 20 16 #endif /* RE_H */ -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/string.h
r321 r331 8 8 #define MRUBY_STRING_H 9 9 10 #include " mruby/common.h"10 #include "common.h" 11 11 12 12 /** … … 45 45 if (RSTR_EMBED_P(s)) {\ 46 46 RSTR_SET_EMBED_LEN((s),(n));\ 47 } else {\ 47 }\ 48 else {\ 48 49 s->as.heap.len = (mrb_int)(n);\ 49 50 }\ … … 63 64 #define RSTR_UNSET_NOFREE_FLAG(s) ((s)->flags &= ~MRB_STR_NOFREE) 64 65 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 69 66 /* 70 67 * Returns a pointer from a Ruby string … … 73 70 #define RSTRING(s) mrb_str_ptr(s) 74 71 #define RSTRING_PTR(s) RSTR_PTR(RSTRING(s)) 75 #define RSTRING_EMBED_LEN(s) RSTR_E NBED_LEN(RSTRING(s))72 #define RSTRING_EMBED_LEN(s) RSTR_EMBED_LEN(RSTRING(s)) 76 73 #define RSTRING_LEN(s) RSTR_LEN(RSTRING(s)) 77 74 #define RSTRING_CAPA(s) RSTR_CAPA(RSTRING(s)) 78 75 #define RSTRING_END(s) (RSTRING_PTR(s) + RSTRING_LEN(s)) 79 mrb_int mrb_str_strlen(mrb_state*, struct RString*);76 MRB_API mrb_int mrb_str_strlen(mrb_state*, struct RString*); 80 77 81 78 #define MRB_STR_SHARED 1 82 79 #define MRB_STR_NOFREE 2 83 #define MRB_STR_ FROZEN 484 #define MRB_STR_EMBED 885 #define MRB_STR_EMBED_LEN_MASK 0x 1f086 #define MRB_STR_EMBED_LEN_SHIFT 480 #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 87 84 88 85 void mrb_gc_free_str(mrb_state*, struct RString*); 89 86 MRB_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 */ 90 132 MRB_API void mrb_str_concat(mrb_state*, mrb_value, mrb_value); 91 133 92 134 /* 93 135 * 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. 94 185 */ 95 186 MRB_API mrb_value mrb_str_plus(mrb_state*, mrb_value, mrb_value); … … 97 188 /* 98 189 * 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. 99 194 */ 100 195 MRB_API mrb_value mrb_ptr_to_str(mrb_state *, void*); … … 102 197 /* 103 198 * 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. 104 203 */ 105 204 MRB_API mrb_value mrb_obj_as_string(mrb_state *mrb, mrb_value obj); 106 205 107 206 /* 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. 109 243 */ 110 244 MRB_API mrb_value mrb_str_resize(mrb_state *mrb, mrb_value str, mrb_int len); … … 112 246 /* 113 247 * 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. 114 286 */ 115 287 MRB_API mrb_value mrb_str_substr(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len); … … 117 289 /* 118 290 * 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. 119 296 */ 120 297 MRB_API mrb_value mrb_string_type(mrb_state *mrb, mrb_value str); … … 124 301 125 302 MRB_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); 303 MRB_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 */ 312 MRB_API mrb_int mrb_string_value_len(mrb_state *mrb, mrb_value str); 127 313 128 314 /* 129 315 * 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. 130 321 */ 131 322 MRB_API mrb_value mrb_str_dup(mrb_state *mrb, mrb_value str); 132 323 133 324 /* 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. 135 330 */ 136 331 MRB_API mrb_value mrb_str_intern(mrb_state *mrb, mrb_value self); … … 146 341 /* 147 342 * 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. 148 348 */ 149 349 MRB_API mrb_bool mrb_str_equal(mrb_state *mrb, mrb_value str1, mrb_value str2); … … 152 352 * Returns a concated string comprised of a Ruby string and a C string. 153 353 * 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. 154 359 * @see mrb_str_cat_cstr 155 360 */ … … 159 364 * Returns a concated string comprised of a Ruby string and a C string. 160 365 * 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. 161 370 * @see mrb_str_cat 162 371 */ … … 176 385 177 386 /* 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. 179 400 */ 180 401 MRB_API char *mrb_str_to_cstr(mrb_state *mrb, mrb_value str); -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/throw.h
r321 r331 8 8 #define MRB_THROW_H 9 9 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) 11 17 12 18 #define MRB_TRY(buf) do { try { … … 21 27 #include <setjmp.h> 22 28 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) { 24 38 #define MRB_CATCH(buf) } else { 25 39 #define MRB_END_EXC(buf) } } while(0) 26 40 27 #define MRB_THROW(buf) longjmp((buf)->impl, 1);41 #define MRB_THROW(buf) MRB_LONGJMP((buf)->impl, 1); 28 42 #define mrb_jmpbuf_impl jmp_buf 29 43 … … 33 47 mrb_jmpbuf_impl impl; 34 48 35 #if def MRB_ENABLE_CXX_EXCEPTION49 #if defined(MRB_ENABLE_CXX_EXCEPTION) && defined(__cplusplus) 36 50 static mrb_int jmpbuf_id; 37 51 mrb_jmpbuf() : impl(jmpbuf_id++) {} -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/value.h
r321 r331 8 8 #define MRUBY_VALUE_H 9 9 10 #include " mruby/common.h"10 #include "common.h" 11 11 12 12 /** … … 21 21 #if defined(MRB_INT16) && defined(MRB_INT64) 22 22 # 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> 23 37 #endif 24 38 … … 28 42 # define MRB_INT_MIN (INT64_MIN>>MRB_FIXNUM_SHIFT) 29 43 # define MRB_INT_MAX (INT64_MAX>>MRB_FIXNUM_SHIFT) 44 # define MRB_PRIo PRIo64 45 # define MRB_PRId PRId64 46 # define MRB_PRIx PRIx64 30 47 #elif defined(MRB_INT16) 31 48 typedef int16_t mrb_int; … … 33 50 # define MRB_INT_MIN (INT16_MIN>>MRB_FIXNUM_SHIFT) 34 51 # define MRB_INT_MAX (INT16_MAX>>MRB_FIXNUM_SHIFT) 52 # define MRB_PRIo PRIo16 53 # define MRB_PRId PRId16 54 # define MRB_PRIx PRIx16 35 55 #else 36 56 typedef int32_t mrb_int; … … 38 58 # define MRB_INT_MIN (INT32_MIN>>MRB_FIXNUM_SHIFT) 39 59 # 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 66 MRB_API double mrb_float_read(const char*, char**); 42 67 #ifdef MRB_USE_FLOAT 43 68 typedef float mrb_float; 44 # define str_to_mrb_float(buf) strtof(buf, NULL)45 69 #else 46 70 typedef double mrb_float; 47 # define str_to_mrb_float(buf) strtod(buf, NULL)48 71 #endif 49 72 … … 63 86 # define isinf(n) (!_finite(n) && !_isnan(n)) 64 87 # define signbit(n) (_copysign(1.0, (n)) < 0.0) 65 # define strtof (float)strtod66 88 static const unsigned int IEEE754_INFINITY_BITS_SINGLE = 0x7F800000; 67 89 # define INFINITY (*(float *)&IEEE754_INFINITY_BITS_SINGLE) … … 94 116 MRB_TT_DATA, /* 21 */ 95 117 MRB_TT_FIBER, /* 22 */ 96 MRB_TT_MAXDEFINE /* 23 */ 118 MRB_TT_ISTRUCT, /* 23 */ 119 MRB_TT_BREAK, /* 24 */ 120 MRB_TT_MAXDEFINE /* 25 */ 97 121 }; 98 122 99 #include "mruby/object.h"123 #include <mruby/object.h> 100 124 101 125 #ifdef MRB_DOCUMENTATION_BLOCK … … 188 212 mrb_value v; 189 213 SET_OBJ_VALUE(v, (struct RBasic*)p); 214 mrb_assert(p == mrb_ptr(v)); 215 mrb_assert(((struct RBasic*)p)->tt == mrb_type(v)); 190 216 return v; 191 217 } … … 242 268 243 269 #ifdef MRB_USE_ETEXT_EDATA 270 #if (defined(__APPLE__) && defined(__MACH__)) 271 #include <mach-o/getsect.h> 272 static inline mrb_bool 273 mrb_ro_data_p(const char *p) 274 { 275 return (const char*)get_etext() < p && p < (const char*)get_edata(); 276 } 277 #else 244 278 extern char _etext[]; 245 279 #ifdef MRB_NO_INIT_ARRAY_START … … 260 294 } 261 295 #endif 296 #endif 262 297 #else 263 298 # define mrb_ro_data_p(p) FALSE -
EcnlProtoTool/trunk/mruby-1.3.0/include/mruby/variable.h
r321 r331 8 8 #define MRUBY_VARIABLE_H 9 9 10 #include " mruby/common.h"10 #include "common.h" 11 11 12 12 /** … … 55 55 MRB_API void mrb_iv_copy(mrb_state *mrb, mrb_value dst, mrb_value src); 56 56 MRB_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 */ 57 76 MRB_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 */ 58 96 MRB_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 */ 59 116 MRB_API void mrb_gv_remove(mrb_state *mrb, mrb_sym sym); 117 60 118 MRB_API mrb_value mrb_cv_get(mrb_state *mrb, mrb_value mod, mrb_sym sym); 61 119 MRB_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 8 8 #define MRUBY_VERSION_H 9 9 10 #include " mruby/common.h"10 #include "common.h" 11 11 12 12 /** … … 43 43 * Minor release version number. 44 44 */ 45 #define MRUBY_RELEASE_MINOR 245 #define MRUBY_RELEASE_MINOR 3 46 46 47 47 /* … … 63 63 * Release year. 64 64 */ 65 #define MRUBY_RELEASE_YEAR 201 565 #define MRUBY_RELEASE_YEAR 2017 66 66 67 67 /* 68 68 * Release month. 69 69 */ 70 #define MRUBY_RELEASE_MONTH 1170 #define MRUBY_RELEASE_MONTH 7 71 71 72 72 /* 73 73 * Release day. 74 74 */ 75 #define MRUBY_RELEASE_DAY 1775 #define MRUBY_RELEASE_DAY 4 76 76 77 77 /* -
EcnlProtoTool/trunk/mruby-1.3.0/minirake
r299 r331 114 114 # their time stamp. Other tasks can be more sophisticated. 115 115 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 118 117 end 119 118 … … 241 240 # Time stamp for file task. 242 241 def timestamp 242 return Time.at(0) unless File.exist?(name) 243 243 stat = File::stat(name.to_s) 244 244 stat.directory? ? Time.at(0) : stat.mtime -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/default.gembox
r270 r331 54 54 conf.gem :core => "mruby-enumerator" 55 55 56 # Use Enumera ble::Lazy class (require mruby-enumerator)56 # Use Enumerator::Lazy class (require mruby-enumerator) 57 57 conf.gem :core => "mruby-enum-lazy" 58 58 … … 72 72 conf.gem :core => "mruby-kernel-ext" 73 73 74 # Use class/module extension 75 conf.gem :core => "mruby-class-ext" 76 74 77 # Use mruby-compiler to build other mrbgems 75 78 conf.gem :core => "mruby-compiler" -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-array-ext/mrblib/array.rb
r321 r331 1 1 class 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 2 27 ## 3 28 # call-seq: … … 251 276 # 252 277 # 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. 255 281 # 256 282 # a = [ 11, 22, 33, 44 ] … … 710 736 nil 711 737 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 712 765 end -
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> 6 6 7 7 /* … … 132 132 if (mrb_nil_p(v)) { 133 133 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))), 135 135 mrb_fixnum_value(i) 136 136 ); … … 150 150 } 151 151 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 173 static mrb_value 174 mrb_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 152 227 void 153 228 mrb_mruby_array_ext_gem_init(mrb_state* mrb) … … 160 235 mrb_define_method(mrb, a, "values_at", mrb_ary_values_at, MRB_ARGS_ANY()); 161 236 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()); 162 238 } 163 239 -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-array-ext/test/array.rb
r321 r331 1 1 ## 2 2 # Array(Ext) Test 3 4 assert("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]) 9 end 3 10 4 11 assert("Array#assoc") do … … 295 302 end 296 303 304 assert('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 } 313 end 314 297 315 assert("Array#index (block)") do 298 316 assert_nil (1..10).to_a.index { |i| i % 5 == 0 and i % 7 == 0 } 299 317 assert_equal 34, (1..100).to_a.index { |i| i % 5 == 0 and i % 7 == 0 } 300 318 end 319 320 assert("Array#to_ary") do 321 assert_equal [], [].to_ary 322 assert_equal [1,2,3], [1,2,3].to_ary 323 end 324 325 assert("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)} 330 end 331 332 assert("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) 354 end -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/bintest/mrdb.rb
r321 r331 15 15 # compile 16 16 `./bin/mrbc -g -o "#{bin.path}" "#{script.path}"` 17 17 18 18 # add mrdb quit 19 19 testcase << {:cmd=>"quit"} -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/bintest/print.rb
r321 r331 14 14 # compile 15 15 `./bin/mrbc -g -o "#{bin.path}" "#{script.path}"` 16 16 17 17 # add mrdb quit 18 18 testcase << {:cmd=>"quit"} -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c
r321 r331 5 5 6 6 #include <string.h> 7 #include "mruby.h"8 #include "mruby/irep.h"7 #include <mruby.h> 8 #include <mruby/irep.h> 9 9 #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> 15 15 #include "mrdberror.h" 16 16 #include "apibreak.h" … … 21 21 22 22 static uint16_t 23 check_lineno( mrb_irep_debug_info_file *info_file, uint16_t lineno)23 check_lineno(mrb_irep_debug_info_file *info_file, uint16_t lineno) 24 24 { 25 25 uint32_t count = info_file->line_entry_count; 26 26 uint16_t l_idx; 27 27 28 if ( info_file->line_type == mrb_debug_line_ary) {28 if (info_file->line_type == mrb_debug_line_ary) { 29 29 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]) { 31 31 return lineno; 32 32 } 33 33 } 34 } else { 34 } 35 else { 35 36 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) { 37 38 return lineno; 38 39 } … … 44 45 45 46 static int32_t 46 get_break_index( mrb_debug_context *dbg, int32_t bpno)47 get_break_index(mrb_debug_context *dbg, uint32_t bpno) 47 48 { 48 49 uint32_t i; … … 51 52 52 53 for(i = 0 ; i < dbg->bpnum; i++) { 53 if (dbg->bp[i].bpno == bpno) {54 if (dbg->bp[i].bpno == bpno) { 54 55 hit = TRUE; 55 56 index = i; … … 58 59 } 59 60 60 if (hit == FALSE) {61 if (hit == FALSE) { 61 62 return MRB_DEBUG_BREAK_INVALID_NO; 62 63 } … … 66 67 67 68 static void 68 free_breakpoint( mrb_state *mrb, mrb_debug_breakpoint *bp)69 free_breakpoint(mrb_state *mrb, mrb_debug_breakpoint *bp) 69 70 { 70 71 switch(bp->type) { … … 74 75 case MRB_DEBUG_BPTYPE_METHOD: 75 76 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) { 77 78 mrb_free(mrb, (void*)bp->point.methodpoint.class_name); 78 79 } … … 84 85 85 86 static uint16_t 86 check_file_lineno( struct mrb_irep *irep, const char *file, uint16_t lineno)87 check_file_lineno(struct mrb_irep *irep, const char *file, uint16_t lineno) 87 88 { 88 89 mrb_irep_debug_info_file *info_file; … … 94 95 for (f_idx = 0; f_idx < irep->debug_info->flen; ++f_idx) { 95 96 info_file = irep->debug_info->files[f_idx]; 96 if (!strcmp(info_file->filename, file)) {97 if (!strcmp(info_file->filename, file)) { 97 98 result = MRB_DEBUG_BP_FILE_OK; 98 99 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) { 101 102 return result | MRB_DEBUG_BP_LINENO_OK; 102 103 } 103 104 } 104 for ( i=0; i < irep->rlen; ++i) {105 for (i=0; i < irep->rlen; ++i) { 105 106 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)) { 107 108 return result; 108 109 } … … 113 114 114 115 static const char* 115 get_class_name( mrb_state *mrb, struct RClass *class_obj)116 get_class_name(mrb_state *mrb, struct RClass *class_obj) 116 117 { 117 118 struct RClass *outer; … … 124 125 125 126 static int32_t 126 compare_break_method( mrb_state *mrb, mrb_debug_breakpoint *bp, struct RClass *class_obj, mrb_sym method_sym, mrb_bool* isCfunc)127 compare_break_method(mrb_state *mrb, mrb_debug_breakpoint *bp, struct RClass *class_obj, mrb_sym method_sym, mrb_bool* isCfunc) 127 128 { 128 129 const char* class_name; … … 138 139 139 140 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) { 141 142 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) { 144 145 return bp->bpno; 145 146 } 146 147 } 147 else if (method_p->class_name != NULL) {148 else if (method_p->class_name != NULL) { 148 149 m = mrb_method_search_vm(mrb, &class_obj, method_sym); 149 if (m == NULL) {150 if (m == NULL) { 150 151 return MRB_DEBUG_OK; 151 152 } 152 if (MRB_PROC_CFUNC_P(m)) {153 if (MRB_PROC_CFUNC_P(m)) { 153 154 *isCfunc = TRUE; 154 155 } 155 156 156 157 is_defined = mrb_class_defined(mrb, method_p->class_name); 157 if (is_defined == FALSE) {158 if (is_defined == FALSE) { 158 159 return MRB_DEBUG_OK; 159 160 } … … 162 163 ssym = mrb_symbol(mrb_check_intern_cstr(mrb, method_p->method_name)); 163 164 m = mrb_method_search_vm(mrb, &sc, ssym); 164 if (m == NULL) {165 if (m == NULL) { 165 166 return MRB_DEBUG_OK; 166 167 } … … 168 169 class_name = get_class_name(mrb, class_obj); 169 170 sn = get_class_name(mrb, sc); 170 if (strcmp(sn, class_name) == 0) {171 if (strcmp(sn, class_name) == 0) { 171 172 return bp->bpno; 172 173 } … … 177 178 178 179 int32_t 179 mrb_debug_set_break_line( 180 mrb_debug_set_break_line(mrb_state *mrb, mrb_debug_context *dbg, const char *file, uint16_t lineno) 180 181 { 181 182 int32_t index; … … 183 184 uint16_t result; 184 185 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) { 190 191 return MRB_DEBUG_BREAK_NUM_OVER; 191 192 } 192 193 193 if (dbg->next_bpno > MAX_BREAKPOINTNO) {194 if (dbg->next_bpno > MAX_BREAKPOINTNO) { 194 195 return MRB_DEBUG_BREAK_NO_OVER; 195 196 } 196 197 197 198 /* 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) { 200 201 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) { 202 204 return MRB_DEBUG_BREAK_INVALID_LINENO; 203 } 205 } 204 206 205 207 set_file = mrb_malloc(mrb, strlen(file) + 1); … … 221 223 222 224 int32_t 223 mrb_debug_set_break_method( mrb_state *mrb, mrb_debug_context *dbg, const char *class_name, const char *method_name)225 mrb_debug_set_break_method(mrb_state *mrb, mrb_debug_context *dbg, const char *class_name, const char *method_name) 224 226 { 225 227 int32_t index; … … 227 229 char* set_method; 228 230 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) { 234 236 return MRB_DEBUG_BREAK_NUM_OVER; 235 237 } 236 238 237 if (dbg->next_bpno > MAX_BREAKPOINTNO) {239 if (dbg->next_bpno > MAX_BREAKPOINTNO) { 238 240 return MRB_DEBUG_BREAK_NO_OVER; 239 241 } 240 242 241 if (class_name != NULL) {243 if (class_name != NULL) { 242 244 set_class = mrb_malloc(mrb, strlen(class_name) + 1); 243 245 strncpy(set_class, class_name, strlen(class_name) + 1); … … 264 266 265 267 int32_t 266 mrb_debug_get_breaknum( mrb_state *mrb, mrb_debug_context *dbg)267 { 268 if ((mrb == NULL) || (dbg == NULL)) {268 mrb_debug_get_breaknum(mrb_state *mrb, mrb_debug_context *dbg) 269 { 270 if ((mrb == NULL) || (dbg == NULL)) { 269 271 return MRB_DEBUG_INVALID_ARGUMENT; 270 272 } … … 273 275 } 274 276 275 int32_t 276 mrb_debug_get_break_all( mrb_state *mrb, mrb_debug_context *dbg, uint32_t size, mrb_debug_breakpoint *bp)277 int32_t 278 mrb_debug_get_break_all(mrb_state *mrb, mrb_debug_context *dbg, uint32_t size, mrb_debug_breakpoint *bp) 277 279 { 278 280 uint32_t get_size = 0; 279 281 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) { 285 287 get_size = size; 286 288 } … … 295 297 296 298 int32_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)) {299 mrb_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)) { 302 304 return MRB_DEBUG_INVALID_ARGUMENT; 303 305 } 304 306 305 307 index = get_break_index(dbg, bpno); 306 if (index == MRB_DEBUG_BREAK_INVALID_NO) {308 if (index == MRB_DEBUG_BREAK_INVALID_NO) { 307 309 return MRB_DEBUG_BREAK_INVALID_NO; 308 310 } … … 316 318 } 317 319 318 int32_t 319 mrb_debug_delete_break( mrb_state *mrb, mrb_debug_context *dbg, uint32_t bpno)320 int32_t 321 mrb_debug_delete_break(mrb_state *mrb, mrb_debug_context *dbg, uint32_t bpno) 320 322 { 321 323 uint32_t i; 322 324 int32_t index; 323 325 324 if ((mrb == NULL) ||(dbg == NULL)) {326 if ((mrb == NULL) ||(dbg == NULL)) { 325 327 return MRB_DEBUG_INVALID_ARGUMENT; 326 328 } 327 329 328 330 index = get_break_index(dbg, bpno); 329 if (index == MRB_DEBUG_BREAK_INVALID_NO) {331 if (index == MRB_DEBUG_BREAK_INVALID_NO) { 330 332 return MRB_DEBUG_BREAK_INVALID_NO; 331 333 } … … 334 336 335 337 for(i = index ; i < dbg->bpnum; i++) { 336 if ((i + 1) == dbg->bpnum) {338 if ((i + 1) == dbg->bpnum) { 337 339 memset(&dbg->bp[i], 0, sizeof(mrb_debug_breakpoint)); 338 340 } … … 347 349 } 348 350 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)) {351 int32_t 352 mrb_debug_delete_break_all(mrb_state *mrb, mrb_debug_context *dbg) 353 { 354 uint32_t i; 355 356 if ((mrb == NULL) || (dbg == NULL)) { 355 357 return MRB_DEBUG_INVALID_ARGUMENT; 356 358 } … … 365 367 } 366 368 367 int32_t 368 mrb_debug_enable_break( mrb_state *mrb, mrb_debug_context *dbg, uint32_t bpno)369 int32_t 370 mrb_debug_enable_break(mrb_state *mrb, mrb_debug_context *dbg, uint32_t bpno) 369 371 { 370 372 int32_t index = 0; 371 373 372 if ((mrb == NULL) || (dbg == NULL)) {374 if ((mrb == NULL) || (dbg == NULL)) { 373 375 return MRB_DEBUG_INVALID_ARGUMENT; 374 376 } 375 377 376 378 index = get_break_index(dbg, bpno); 377 if (index == MRB_DEBUG_BREAK_INVALID_NO) {379 if (index == MRB_DEBUG_BREAK_INVALID_NO) { 378 380 return MRB_DEBUG_BREAK_INVALID_NO; 379 381 } … … 385 387 386 388 int32_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)) {389 mrb_debug_enable_break_all(mrb_state *mrb, mrb_debug_context *dbg) 390 { 391 uint32_t i; 392 393 if ((mrb == NULL) || (dbg == NULL)) { 392 394 return MRB_DEBUG_INVALID_ARGUMENT; 393 395 } … … 400 402 } 401 403 402 int32_t 403 mrb_debug_disable_break( mrb_state *mrb, mrb_debug_context *dbg, uint32_t bpno)404 int32_t 405 mrb_debug_disable_break(mrb_state *mrb, mrb_debug_context *dbg, uint32_t bpno) 404 406 { 405 407 int32_t index = 0; 406 408 407 if ((mrb == NULL) || (dbg == NULL)) {409 if ((mrb == NULL) || (dbg == NULL)) { 408 410 return MRB_DEBUG_INVALID_ARGUMENT; 409 411 } 410 412 411 413 index = get_break_index(dbg, bpno); 412 if (index == MRB_DEBUG_BREAK_INVALID_NO) {414 if (index == MRB_DEBUG_BREAK_INVALID_NO) { 413 415 return MRB_DEBUG_BREAK_INVALID_NO; 414 416 } … … 419 421 } 420 422 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)) {423 int32_t 424 mrb_debug_disable_break_all(mrb_state *mrb, mrb_debug_context *dbg) 425 { 426 uint32_t i; 427 428 if ((mrb == NULL) || (dbg == NULL)) { 427 429 return MRB_DEBUG_INVALID_ARGUMENT; 428 430 } … … 436 438 437 439 static 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))) {440 check_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))) { 442 444 return FALSE; 443 445 } … … 447 449 448 450 int32_t 449 mrb_debug_check_breakpoint_line( mrb_state *mrb, mrb_debug_context *dbg, const char *file, uint16_t line)451 mrb_debug_check_breakpoint_line(mrb_state *mrb, mrb_debug_context *dbg, const char *file, uint16_t line) 450 452 { 451 453 mrb_debug_breakpoint *bp; 452 454 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)) { 460 462 return MRB_DEBUG_OK; 461 463 } … … 465 467 switch (bp->type) { 466 468 case MRB_DEBUG_BPTYPE_LINE: 467 if (bp->enable == TRUE) {469 if (bp->enable == TRUE) { 468 470 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)) { 470 472 return bp->bpno; 471 473 } … … 484 486 485 487 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)488 int32_t 489 mrb_debug_check_breakpoint_method(mrb_state *mrb, mrb_debug_context *dbg, struct RClass *class_obj, mrb_sym method_sym, mrb_bool* isCfunc) 488 490 { 489 491 mrb_debug_breakpoint *bp; 490 492 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)) { 494 496 return MRB_DEBUG_INVALID_ARGUMENT; 495 497 } … … 497 499 bp = dbg->bp; 498 500 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) { 501 503 bpno = compare_break_method(mrb, bp, class_obj, method_sym, isCfunc); 502 if (bpno > 0) {504 if (bpno > 0) { 503 505 return bpno; 504 506 } 505 507 } 506 508 } 507 else if (bp->type == MRB_DEBUG_BPTYPE_NONE) {509 else if (bp->type == MRB_DEBUG_BPTYPE_NONE) { 508 510 break; 509 511 } -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.h
r321 r331 7 7 #define APIBREAK_H_ 8 8 9 #include "mruby.h"9 #include <mruby.h> 10 10 #include "mrdb.h" 11 11 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( 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*);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*); 25 25 26 26 #endif /* APIBREAK_H_ */ -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c
r321 r331 10 10 #include "mrdberror.h" 11 11 #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> 15 15 16 16 #define LINE_BUF_SIZE MAX_COMMAND_LINE … … 72 72 73 73 p = strrchr(path, '/'); 74 len = p != NULL ? p - path: strlen(path);74 len = p != NULL ? (size_t)(p - path) : strlen(path); 75 75 76 76 dir = mrb_malloc(mrb, len + 1); -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.h
r321 r331 6 6 #define APILIST_H_ 7 7 8 #include "mruby.h"8 #include <mruby.h> 9 9 #include "mrdb.h" 10 10 -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c
r321 r331 6 6 #include <string.h> 7 7 #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> 14 14 #include "apiprint.h" 15 15 -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h
r321 r331 6 6 #define APIPRINT_H_ 7 7 8 #include "mruby.h"8 #include <mruby.h> 9 9 #include "mrdb.h" 10 10 -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/cmdbreak.c
r321 r331 6 6 #include <ctype.h> 7 7 #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> 12 12 #include "mrdb.h" 13 13 #include "mrdberror.h" … … 71 71 uint32_t l; 72 72 73 if ((*ps == '0')||(strlen(ps) >= BPNO_LETTER_NUM)) {73 if ((*ps == '0')||(strlen(ps) >= BPNO_LETTER_NUM)) { 74 74 return 0; 75 75 } 76 76 77 while ( !(ISBLANK(*ps)||ISCNTRL(*ps))) {78 if (!ISDIGIT(*ps)) {77 while (!(ISBLANK(*ps)||ISCNTRL(*ps))) { 78 if (!ISDIGIT(*ps)) { 79 79 return 0; 80 80 } … … 91 91 int32_t ret = MRB_DEBUG_OK; 92 92 93 if (mrdb->wcnt == 1) {93 if (mrdb->wcnt == 1) { 94 94 ret = func(mrb, mrdb->dbg); 95 95 print_api_common_error(ret); … … 110 110 ps = mrdb->words[i]; 111 111 bpno = parse_breakpoint_no(ps); 112 if (bpno == 0) {112 if (bpno == 0) { 113 113 printf(BREAK_ERR_MSG_INVALIDBPNO, ps); 114 114 break; 115 115 } 116 116 ret = func(mrb, mrdb->dbg, (uint32_t)bpno); 117 if (ret == MRB_DEBUG_BREAK_INVALID_NO) {117 if (ret == MRB_DEBUG_BREAK_INVALID_NO) { 118 118 printf(BREAK_ERR_MSG_NOBPNO, bpno); 119 119 } 120 else if (ret != MRB_DEBUG_OK) {120 else if (ret != MRB_DEBUG_OK) { 121 121 print_api_common_error(ret); 122 122 } … … 129 129 char* ps = args; 130 130 131 if (ISBLANK(*ps)||ISCNTRL(*ps)) {131 if (ISBLANK(*ps)||ISCNTRL(*ps)) { 132 132 puts(BREAK_ERR_MSG_BLANK); 133 133 return MRB_DEBUG_BPTYPE_NONE; 134 134 } 135 135 136 if (!ISDIGIT(*ps)) {136 if (!ISDIGIT(*ps)) { 137 137 return MRB_DEBUG_BPTYPE_METHOD; 138 138 } 139 139 140 while ( !(ISBLANK(*ps)||ISCNTRL(*ps))) {141 if (!ISDIGIT(*ps)) {140 while (!(ISBLANK(*ps)||ISCNTRL(*ps))) { 141 if (!ISDIGIT(*ps)) { 142 142 printf(BREAK_ERR_MSG_INVALIDSTR, args); 143 143 return MRB_DEBUG_BPTYPE_NONE; … … 146 146 } 147 147 148 if ((*args == '0')||(strlen(args) >= LINENO_MAX_DIGIT)) {148 if ((*args == '0')||(strlen(args) >= LINENO_MAX_DIGIT)) { 149 149 puts(BREAK_ERR_MSG_RANGEOVER); 150 150 return MRB_DEBUG_BPTYPE_NONE; … … 159 159 const char* enable_letter[] = {BREAK_INFO_MSG_DISABLE, BREAK_INFO_MSG_ENABLE}; 160 160 161 if (bp->type == MRB_DEBUG_BPTYPE_LINE) {161 if (bp->type == MRB_DEBUG_BPTYPE_LINE) { 162 162 printf(BREAK_INFO_MSG_LINEBREAK, 163 163 bp->bpno, enable_letter[bp->enable], bp->point.linepoint.file, bp->point.linepoint.lineno); 164 164 } 165 165 else { 166 if (bp->point.methodpoint.class_name == NULL) {166 if (bp->point.methodpoint.class_name == NULL) { 167 167 printf(BREAK_INFO_MSG_METHODBREAK_NOCLASS, 168 168 bp->bpno, enable_letter[bp->enable], bp->point.methodpoint.method_name); … … 184 184 185 185 bpnum = mrb_debug_get_breaknum(mrb, mrdb->dbg); 186 if (bpnum < 0) {186 if (bpnum < 0) { 187 187 print_api_common_error(bpnum); 188 188 return; 189 189 } 190 else if (bpnum == 0) {190 else if (bpnum == 0) { 191 191 puts(BREAK_ERR_MSG_NOBPNO_INFOALL); 192 192 return; … … 195 195 196 196 ret = mrb_debug_get_break_all(mrb, mrdb->dbg, (uint32_t)bpnum, bp_list); 197 if (ret < 0) {197 if (ret < 0) { 198 198 print_api_common_error(ret); 199 199 return; … … 220 220 ps = mrdb->words[i]; 221 221 bpno = parse_breakpoint_no(ps); 222 if (bpno == 0) {222 if (bpno == 0) { 223 223 puts(BREAK_ERR_MSG_INVALIDBPNO_INFO); 224 224 break; … … 226 226 227 227 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) { 229 229 printf(BREAK_ERR_MSG_NOBPNO_INFO, bpno); 230 230 break; 231 231 } 232 else if (ret != MRB_DEBUG_OK) {232 else if (ret != MRB_DEBUG_OK) { 233 233 print_api_common_error(ret); 234 234 break; 235 235 } 236 else if (isFirst == TRUE) {236 else if (isFirst == TRUE) { 237 237 isFirst = FALSE; 238 238 puts(BREAK_INFO_MSG_HEADER); … … 251 251 uint32_t l; 252 252 253 if (mrdb->wcnt <= 1) {253 if (mrdb->wcnt <= 1) { 254 254 puts(BREAK_ERR_MSG_BLANK); 255 255 return MRB_DEBUG_BPTYPE_NONE; … … 257 257 258 258 args = mrdb->words[1]; 259 if ((body = strrchr(args, ':')) == NULL) {259 if ((body = strrchr(args, ':')) == NULL) { 260 260 body = args; 261 261 type = check_bptype(body); 262 } else { 263 if(body == args) { 262 } 263 else { 264 if (body == args) { 264 265 printf(BREAK_ERR_MSG_INVALIDSTR, args); 265 266 return MRB_DEBUG_BPTYPE_NONE; … … 272 273 case MRB_DEBUG_BPTYPE_LINE: 273 274 STRTOUL(l, body); 274 if ( l <= 65535) {275 if (l <= 65535) { 275 276 *line = l; 276 277 *file = (body == args)? mrb_debug_get_filename(dbg->irep, (uint32_t)(dbg->pc - dbg->irep->iseq)): args; 277 } else { 278 } 279 else { 278 280 puts(BREAK_ERR_MSG_RANGEOVER); 279 281 type = MRB_DEBUG_BPTYPE_NONE; … … 281 283 break; 282 284 case MRB_DEBUG_BPTYPE_METHOD: 283 if (body == args) {285 if (body == args) { 284 286 /* method only */ 285 if ( ISUPPER(*body)||ISLOWER(*body)||(*body == '_')) {287 if (ISUPPER(*body)||ISLOWER(*body)||(*body == '_')) { 286 288 *method = body; 287 289 *cname = NULL; 288 } else { 290 } 291 else { 289 292 printf(BREAK_ERR_MSG_INVALIDMETHOD, args); 290 293 type = MRB_DEBUG_BPTYPE_NONE; 291 294 } 292 } else { 293 if( ISUPPER(*args) ) { 295 } 296 else { 297 if (ISUPPER(*args)) { 294 298 switch(*body) { 295 299 case '@': case '$': case '?': case '.': case ',': case ':': … … 303 307 break; 304 308 } 305 } else { 309 } 310 else { 306 311 printf(BREAK_ERR_MSG_INVALIDCLASS, args); 307 312 type = MRB_DEBUG_BPTYPE_NONE; … … 344 349 if (type == MRB_DEBUG_BPTYPE_LINE) { 345 350 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)) { 347 353 printf(BREAK_SET_MSG_METHOD, ret, method); 348 } else { 354 } 355 else { 349 356 printf(BREAK_SET_MSG_CLASS_METHOD, ret, cname, method); 350 357 } 351 } else { 358 } 359 else { 352 360 switch (ret) { 353 361 case MRB_DEBUG_BREAK_INVALID_LINENO: … … 380 388 dbgcmd_info_break(mrb_state *mrb, mrdb_state *mrdb) 381 389 { 382 if (mrdb->wcnt == 2) {390 if (mrdb->wcnt == 2) { 383 391 info_break_all(mrb, mrdb); 384 392 } … … 396 404 397 405 ret = exe_set_command_all(mrb, mrdb, mrb_debug_delete_break_all); 398 if (ret != TRUE) {406 if (ret != TRUE) { 399 407 exe_set_command_select(mrb, mrdb, mrb_debug_delete_break); 400 408 } … … 409 417 410 418 ret = exe_set_command_all(mrb, mrdb, mrb_debug_enable_break_all); 411 if (ret != TRUE) {419 if (ret != TRUE) { 412 420 exe_set_command_select(mrb, mrdb, mrb_debug_enable_break); 413 421 } … … 422 430 423 431 ret = exe_set_command_all(mrb, mrdb, mrb_debug_disable_break_all); 424 if (ret != TRUE) {432 if (ret != TRUE) { 425 433 exe_set_command_select(mrb, mrdb, mrb_debug_disable_break); 426 434 } -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c
r321 r331 9 9 10 10 #include "apilist.h" 11 #include "mruby/compile.h"11 #include <mruby/compile.h> 12 12 13 13 typedef struct help_msg { … … 334 334 return FALSE; 335 335 } 336 if ((lbracket = strchr(pattern, '[')) == NULL) {336 if ((lbracket = strchr(pattern, '[')) == NULL) { 337 337 return !strcmp(pattern, cmd); 338 338 } -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c
r321 r331 6 6 #include <string.h> 7 7 #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> 14 14 #include "apiprint.h" 15 15 -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/cmdrun.c
r321 r331 4 4 */ 5 5 6 #include "mruby/opcode.h"6 #include <mruby/opcode.h> 7 7 #include "mrdb.h" 8 8 … … 12 12 mrb_debug_context *dbg = mrdb->dbg; 13 13 14 if ( dbg->xm == DBG_INIT){14 if (dbg->xm == DBG_INIT){ 15 15 dbg->xm = DBG_RUN; 16 } else { 16 } 17 else { 17 18 dbg->xm = DBG_QUIT; 18 if ( dbg->xphase == DBG_PHASE_RUNNING){19 if (dbg->xphase == DBG_PHASE_RUNNING){ 19 20 struct RClass *exc; 20 21 puts("Start it from the beginning."); … … 23 24 } 24 25 } 25 26 26 27 return DBGST_RESTART; 27 28 } … … 33 34 int ccnt = 1; 34 35 35 if ( mrdb->wcnt > 1){36 if (mrdb->wcnt > 1){ 36 37 sscanf(mrdb->words[1], "%d", &ccnt); 37 38 } 38 39 dbg->ccnt = (uint16_t)(ccnt > 0 ? ccnt : 1); /* count of continue */ 39 40 40 if ( dbg->xphase == DBG_PHASE_AFTER_RUN){41 if (dbg->xphase == DBG_PHASE_AFTER_RUN){ 41 42 puts("The program is not running."); 42 43 dbg->xm = DBG_QUIT; 43 } else { 44 } 45 else { 44 46 dbg->xm = DBG_RUN; 45 47 } … … 53 55 return DBGST_CONTINUE; 54 56 } 57 58 dbgcmd_state 59 dbgcmd_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 9 9 #include <ctype.h> 10 10 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> 17 17 18 18 #include "mrdb.h" … … 58 58 {"run", NULL, 1, 0, 0, DBGCMD_RUN, dbgcmd_run}, /* r[un] */ 59 59 {"step", NULL, 1, 0, 1, DBGCMD_STEP, dbgcmd_step}, /* s[tep] */ 60 {"next", NULL, 1, 0, 1, DBGCMD_NEXT, dbgcmd_next}, /* n[ext] */ 60 61 {NULL} 61 62 }; … … 406 407 407 408 ret = mrb_debug_get_break(mrb, mrdb->dbg, mrdb->dbg->stopped_bpno, &bp); 408 if (ret == 0) {409 if (ret == 0) { 409 410 switch(bp.type) { 410 411 case MRB_DEBUG_BPTYPE_LINE: … … 416 417 method_name = bp.point.methodpoint.method_name; 417 418 class_name = bp.point.methodpoint.class_name; 418 if (class_name == NULL) {419 if (class_name == NULL) { 419 420 printf("Breakpoint %d, %s\n", bp.bpno, method_name); 420 421 } … … 422 423 printf("Breakpoint %d, %s:%s\n", bp.bpno, class_name, method_name); 423 424 } 424 if (mrdb->dbg->isCfunc) {425 if (mrdb->dbg->isCfunc) { 425 426 printf("Stopped before calling the C function.\n"); 426 427 } … … 445 446 char* file = mrb_debug_get_source(mrb, mrdb, mrdb->srcpath, mrdb->dbg->prvfile); 446 447 uint16_t lineno = mrdb->dbg->prvline; 447 if (file != NULL) {448 if (file != NULL) { 448 449 mrb_debug_list(mrb, mrdb->dbg, file, lineno, lineno); 449 450 mrb_free(mrb, file); … … 531 532 break; 532 533 } 533 if (sym != 0) {534 if (sym != 0) { 534 535 dbg->method_bpno = mrb_debug_check_breakpoint_method(mrb, dbg, c, sym, &isCfunc); 535 if (isCfunc) {536 if (isCfunc) { 536 537 bpno = dbg->method_bpno; 537 538 dbg->method_bpno = 0; … … 557 558 dbg->regs = regs; 558 559 559 if (dbg->xphase == DBG_PHASE_RESTART) {560 if (dbg->xphase == DBG_PHASE_RESTART) { 560 561 dbg->root_irep = irep; 561 562 dbg->prvfile = NULL; 562 563 dbg->prvline = 0; 564 dbg->prvci = NULL; 563 565 dbg->xm = DBG_RUN; 564 566 dbg->xphase = DBG_PHASE_RUNNING; … … 570 572 switch (dbg->xm) { 571 573 case DBG_STEP: 572 case DBG_NEXT: // temporary573 574 if (!file || (dbg->prvfile == file && dbg->prvline == line)) { 574 575 return; … … 576 577 dbg->method_bpno = 0; 577 578 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; 578 591 break; 579 592 … … 611 624 dbg->prvline = line; 612 625 613 if (dbg->bm == BRK_BREAK && --dbg->ccnt > 0) {626 if (dbg->bm == BRK_BREAK && --dbg->ccnt > 0) { 614 627 return; 615 628 } … … 634 647 st = cmd->func(mrb, mrdb); 635 648 636 if ( (st == DBGST_CONTINUE) || (st == DBGST_RESTART)) break;649 if ((st == DBGST_CONTINUE) || (st == DBGST_RESTART)) break; 637 650 } 638 651 return dbg->xm; … … 671 684 mrdb->srcpath = args.srcpath; 672 685 673 if (mrdb->dbg->xm == DBG_QUIT) {686 if (mrdb->dbg->xm == DBG_QUIT) { 674 687 mrdb->dbg->xphase = DBG_PHASE_RESTART; 675 688 } … … 679 692 mrdb->dbg->xm = DBG_INIT; 680 693 mrdb->dbg->ccnt = 1; 681 694 682 695 /* setup hook functions */ 683 696 mrb->code_fetch_hook = mrb_code_fetch_hook; … … 726 739 } 727 740 } 728 741 729 742 mrdb->dbg->prvfile = "-"; 730 743 mrdb->dbg->prvline = 0; 731 744 732 745 while (1) { 733 746 cmd = get_and_parse_command(mrb, mrdb); 734 747 mrb_assert(cmd); 735 748 736 749 if (cmd->id == DBGCMD_QUIT) { 737 750 break; 738 751 } 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 743 756 cleanup(mrb, &args); 744 757 -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h
r321 r331 7 7 #define MRDB_H 8 8 9 #include "mruby.h"9 #include <mruby.h> 10 10 11 11 #include "mrdbconf.h" … … 110 110 const char *prvfile; 111 111 int32_t prvline; 112 mrb_callinfo *prvci; 112 113 113 114 mrdb_exemode xm; … … 147 148 dbgcmd_state dbgcmd_continue(mrb_state*, mrdb_state*); 148 149 dbgcmd_state dbgcmd_step(mrb_state*, mrdb_state*); 150 dbgcmd_state dbgcmd_next(mrb_state*, mrdb_state*); 149 151 /* cmdbreak.c */ 150 152 dbgcmd_state dbgcmd_break(mrb_state*, mrdb_state*); -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
r321 r331 11 11 #include <stdio.h> 12 12 #include <ctype.h> 13 14 #include <signal.h> 15 #include <setjmp.h> 13 16 14 17 #ifdef ENABLE_READLINE … … 30 33 #endif 31 34 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> 37 50 38 51 #ifdef ENABLE_READLINE … … 195 208 196 209 struct _args { 210 FILE *rfp; 197 211 mrb_bool verbose : 1; 198 212 int argc; … … 252 266 } 253 267 } 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 254 283 return EXIT_SUCCESS; 255 284 } … … 258 287 cleanup(mrb_state *mrb, struct _args *args) 259 288 { 289 if (args->rfp) 290 fclose(args->rfp); 291 mrb_free(mrb, args->argv); 260 292 mrb_close(mrb); 261 293 } … … 308 340 } 309 341 342 343 #ifndef ENABLE_READLINE 344 volatile sig_atomic_t input_canceled = 0; 345 void 346 ctrl_c_handler(int signo) 347 { 348 input_canceled = 1; 349 } 350 #else 351 SIGJMP_BUF ctrl_c_buf; 352 void 353 ctrl_c_handler(int signo) 354 { 355 MIRB_SIGLONGJMP(ctrl_c_buf, 1); 356 } 357 #endif 358 310 359 int 311 360 main(int argc, char **argv) 312 361 { 313 char ruby_code[ 1024] = { 0 };362 char ruby_code[4096] = { 0 }; 314 363 char last_code_line[1024] = { 0 }; 315 364 #ifndef ENABLE_READLINE 316 365 int last_char; 317 int char_index;366 size_t char_index; 318 367 #else 319 368 char *history_path; 369 char* line; 320 370 #endif 321 371 mrbc_context *cxt; … … 324 374 mrb_value result; 325 375 struct _args args; 376 mrb_value ARGV; 326 377 int n; 378 int i; 327 379 mrb_bool code_block_open = FALSE; 328 380 int ai; … … 335 387 return EXIT_FAILURE; 336 388 } 337 mrb_define_global_const(mrb, "ARGV", mrb_ary_new_capa(mrb, 0));338 389 339 390 n = parse_args(mrb, argc, argv, &args); … … 343 394 return n; 344 395 } 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); 345 406 346 407 #ifdef ENABLE_READLINE … … 369 430 char *utf8; 370 431 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 371 438 #ifndef ENABLE_READLINE 372 439 print_cmdline(code_block_open); 373 440 441 signal(SIGINT, ctrl_c_handler); 374 442 char_index = 0; 375 443 while ((last_char = getchar()) != '\n') { 376 444 if (last_char == EOF) break; 377 if (char_index > sizeof(last_code_line)-2) {445 if (char_index >= sizeof(last_code_line)-2) { 378 446 fputs("input string too long\n", stderr); 379 447 continue; 380 448 } 381 449 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; 382 459 } 383 460 if (last_char == EOF) { … … 389 466 last_code_line[char_index] = '\0'; 390 467 #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 392 481 if (line == NULL) { 393 482 printf("\n"); … … 403 492 free(line); 404 493 #endif 494 495 done: 405 496 406 497 if (code_block_open) { … … 454 545 mrb_codedump_all(mrb, proc); 455 546 } 456 /* pass a proc for eva ulation */547 /* pass a proc for evaluation */ 457 548 /* evaluate the bytecode */ 458 result = mrb_ context_run(mrb,549 result = mrb_vm_run(mrb, 459 550 proc, 460 551 mrb_top_self(mrb), -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c
r321 r331 2 2 #include <stdlib.h> 3 3 #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> 8 8 9 9 #define RITEBIN_EXT ".mrb" -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-mruby-config/mrbgem.rake
r321 r331 24 24 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('\\"', '"') ]}] 25 25 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]}"} 27 27 }) 28 28 FileUtils.chmod(0755, t.name) -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-mruby-config/mruby-config
r270 r331 7 7 --ldflags-before-libs) echo MRUBY_LDFLAGS_BEFORE_LIBS;; 8 8 --libs) echo MRUBY_LIBS;; 9 --libmruby-path) echo MRUBY_LIBMRUBY_PATH;; 9 10 --help) echo "Usage: mruby-config [switches]" 10 11 echo " switches:" 11 12 echo " --cflags print flags passed to compiler" 12 13 echo " --ldflags print flags passed to linker" 13 echo " --ldflags-before-libs print flags pass wd to linker before linked libraries"14 echo " --ldflags-before-libs print flags passed to linker before linked libraries" 14 15 echo " --libs print linked libraries" 16 echo " --libmruby-path print libmruby path" 15 17 exit 0;; 16 18 esac -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-mruby-config/mruby-config.bat
r270 r331 8 8 if "%0" equ "--ldflags-before-libs" goto ldflagsbeforelibs 9 9 if "%0" equ "--libs" goto libs 10 if "%0" equ "--libmruby-path" goto libmrubypath 10 11 if "%0" equ "--help" goto showhelp 11 12 echo Invalid Option … … 28 29 goto top 29 30 31 :libmrubypath 32 echo MRUBY_LIBMRUBY_PATH 33 goto top 34 30 35 :showhelp 31 36 echo Usage: mruby-config [switches] … … 33 38 echo --cflags print flags passed to compiler 34 39 echo --ldflags print flags passed to linker 35 echo --ldflags-before-libs print flags pass wd to linker before linked libraries40 echo --ldflags-before-libs print flags passed to linker before linked libraries 36 41 echo --libs print linked libraries 42 echo --libmruby-path print libmruby path -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-mruby/bintest/mruby.rb
r321 r331 3 3 assert('regression for #1564') do 4 4 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" 6 6 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" 8 8 end 9 9 … … 45 45 assert_equal "\"test\"\n\"fin\"\n", `#{cmd('mruby')} #{script.path}` 46 46 end 47 48 assert('garbage collecting built-in classes') do 49 script = Tempfile.new('test.rb') 50 51 script.write <<RUBY 52 NilClass = nil 53 GC.start 54 Array.dup 55 print nil.class.to_s 56 RUBY 57 script.flush 58 assert_equal "NilClass", `#{cmd('mruby')} #{script.path}` 59 assert_equal 0, $?.exitstatus 60 end -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-mruby/mrbgem.rake
r321 r331 5 5 spec.bins = %w(mruby) 6 6 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 7 13 end -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c
r321 r331 2 2 #include <stdlib.h> 3 3 #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> 9 9 10 10 #ifdef MRB_DISABLE_STDIO … … 189 189 return n; 190 190 } 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); 197 233 mrb_utf8_free(utf8); 198 234 } 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 } 244 250 } 245 251 cleanup(mrb, &args); -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c
r321 r331 2 2 #include <stdlib.h> 3 3 #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> 7 7 8 8 struct strip_args { -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-compiler/bintest/mrbc.rb
r321 r331 11 11 assert_equal 0, $?.exitstatus 12 12 end 13 14 assert('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 21 end 22 23 assert('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 30 end -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-compiler/core/codegen.c
r321 r331 9 9 #include <stdlib.h> 10 10 #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> 17 17 #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 21 25 22 26 typedef mrb_ast_node node; … … 74 78 uint16_t filename_index; 75 79 parser_state* parser; 80 81 int rlev; /* recursion levels */ 76 82 } codegen_scope; 77 83 … … 94 100 while (s->prev) { 95 101 codegen_scope *tmp = s->prev; 102 mrb_free(s->mrb, s->iseq); 96 103 mrb_pool_close(s->mpool); 97 104 s = tmp; 98 105 } 99 #ifndef M BB_DISABLE_STDIO106 #ifndef MRB_DISABLE_STDIO 100 107 if (s->filename && s->lineno) { 101 108 fprintf(stderr, "codegen error:%s:%d: %s\n", s->filename, s->lineno, message); … … 340 347 } 341 348 } 349 if (c0 == OP_LOADNIL) { 350 if (GETARG_B(i) == GETARG_A(i0)) { 351 s->pc--; 352 return 0; 353 } 354 } 342 355 break; 343 356 case OP_JMPIF: … … 381 394 scope_error(s); 382 395 break; 396 } 397 if (diff > MAXARG_sBx) { 398 codegen_error(s, "too distant jump address"); 383 399 } 384 400 s->iseq[pc] = MKOP_AsBx(c, GETARG_A(i), diff); … … 495 511 } 496 512 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 518 static int 498 519 new_msym(codegen_scope *s, mrb_sym sym) 499 520 { … … 503 524 504 525 len = s->irep->slen; 505 if (len > 256) len = 256;526 if (len > MAXMSYMLEN) len = MAXMSYMLEN; 506 527 for (i=0; i<len; i++) { 507 528 if (s->irep->syms[i] == sym) return i; 508 529 if (s->irep->syms[i] == 0) break; 509 530 } 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) ")"); 512 533 } 513 534 s->irep->syms[i] = sym; … … 516 537 } 517 538 518 static in line int539 static int 519 540 new_sym(codegen_scope *s, mrb_sym sym) 520 541 { … … 524 545 if (s->irep->syms[i] == sym) return i; 525 546 } 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++) { 529 555 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; 533 559 } 534 560 s->irep->syms[s->irep->slen] = sym; … … 583 609 push(); /* push for a block parameter */ 584 610 585 lp = loop_push(s, LOOP_FOR);586 lp->pc1 = new_label(s);587 588 611 /* generate loop variable */ 589 612 n2 = tree->car; … … 595 618 gen_vmassignment(s, n2, 1, VAL); 596 619 } 620 /* construct loop */ 621 lp = loop_push(s, LOOP_FOR); 622 lp->pc2 = new_label(s); 623 624 /* loop body */ 597 625 codegen(s, tree->cdr->cdr->car, VAL); 598 626 pop(); … … 645 673 ba = tree->car->cdr->cdr->cdr->cdr ? 1 : 0; 646 674 675 if (ma > 0x1f || oa > 0x1f || pa > 0x1f || ka > 0x1f) { 676 codegen_error(s, "too many formal arguments"); 677 } 647 678 a = ((mrb_aspec)(ma & 0x1f) << 18) 648 679 | ((mrb_aspec)(oa & 0x1f) << 13) … … 765 796 } 766 797 798 #define CALL_MAXARGS 127 799 767 800 static int 768 gen_values(codegen_scope *s, node *t, int val )801 gen_values(codegen_scope *s, node *t, int val, int extra) 769 802 { 770 803 int n = 0; … … 773 806 while (t) { 774 807 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) { 776 811 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(); 784 815 } 785 816 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 } 787 828 } 788 829 t = t->cdr; … … 801 842 } 802 843 else { 803 codegen(s, t->car->cdr, NOVAL);804 t = t->cdr;805 844 while (t) { 806 845 codegen(s, t->car, NOVAL); … … 818 857 } 819 858 820 #define CALL_MAXARGS 127821 822 859 static void 823 gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val )860 gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe) 824 861 { 825 862 mrb_sym sym = name ? name : sym(tree->cdr->car); 826 int idx ;863 int idx, skip = 0; 827 864 int n = 0, noop = 0, sendv = 0, blk = 0; 828 865 829 866 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 } 830 878 idx = new_msym(s, sym); 831 879 tree = tree->cdr->cdr->car; 832 880 if (tree) { 833 n = gen_values(s, tree->car, VAL );881 n = gen_values(s, tree->car, VAL, sp?1:0); 834 882 if (n < 0) { 835 883 n = noop = sendv = 1; … … 863 911 const char *symname = mrb_sym2name_len(s->mrb, sym, &symlen); 864 912 865 if (!noop && symlen == 1 && symname[0] == '+' ) {913 if (!noop && symlen == 1 && symname[0] == '+' && n == 1) { 866 914 genop_peep(s, MKOP_ABC(OP_ADD, cursp(), idx, n), val); 867 915 } 868 else if (!noop && symlen == 1 && symname[0] == '-' ) {916 else if (!noop && symlen == 1 && symname[0] == '-' && n == 1) { 869 917 genop_peep(s, MKOP_ABC(OP_SUB, cursp(), idx, n), val); 870 918 } 871 else if (!noop && symlen == 1 && symname[0] == '*' ) {919 else if (!noop && symlen == 1 && symname[0] == '*' && n == 1) { 872 920 genop(s, MKOP_ABC(OP_MUL, cursp(), idx, n)); 873 921 } 874 else if (!noop && symlen == 1 && symname[0] == '/' ) {922 else if (!noop && symlen == 1 && symname[0] == '/' && n == 1) { 875 923 genop(s, MKOP_ABC(OP_DIV, cursp(), idx, n)); 876 924 } 877 else if (!noop && symlen == 1 && symname[0] == '<' ) {925 else if (!noop && symlen == 1 && symname[0] == '<' && n == 1) { 878 926 genop(s, MKOP_ABC(OP_LT, cursp(), idx, n)); 879 927 } 880 else if (!noop && symlen == 2 && symname[0] == '<' && symname[1] == '=' ) {928 else if (!noop && symlen == 2 && symname[0] == '<' && symname[1] == '=' && n == 1) { 881 929 genop(s, MKOP_ABC(OP_LE, cursp(), idx, n)); 882 930 } 883 else if (!noop && symlen == 1 && symname[0] == '>' ) {931 else if (!noop && symlen == 1 && symname[0] == '>' && n == 1) { 884 932 genop(s, MKOP_ABC(OP_GT, cursp(), idx, n)); 885 933 } 886 else if (!noop && symlen == 2 && symname[0] == '>' && symname[1] == '=' ) {934 else if (!noop && symlen == 2 && symname[0] == '>' && symname[1] == '=' && n == 1) { 887 935 genop(s, MKOP_ABC(OP_GE, cursp(), idx, n)); 888 936 } 889 else if (!noop && symlen == 2 && symname[0] == '=' && symname[1] == '=' ) {937 else if (!noop && symlen == 2 && symname[0] == '=' && symname[1] == '=' && n == 1) { 890 938 genop(s, MKOP_ABC(OP_EQ, cursp(), idx, n)); 891 939 } … … 900 948 } 901 949 } 950 if (safe) { 951 dispatch(s, skip); 952 } 902 953 if (val) { 903 954 push(); … … 912 963 913 964 tree = tree->cdr; 914 switch ( (intptr_t)type) {965 switch (type) { 915 966 case NODE_GVAR: 916 967 idx = new_sym(s, sym(tree)); … … 962 1013 963 1014 case NODE_CALL: 1015 case NODE_SCALL: 964 1016 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); 966 1019 pop(); 967 1020 if (val) { … … 980 1033 default: 981 1034 #ifndef MRB_DISABLE_STDIO 982 printf("unknown lhs %d\n", type);1035 fprintf(stderr, "unknown lhs %d\n", type); 983 1036 #endif 984 1037 break; … … 1033 1086 } 1034 1087 } 1035 push(); 1088 if (!val) { 1089 push(); 1090 } 1036 1091 } 1037 1092 } … … 1176 1231 1177 1232 static void 1233 gen_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 1248 static void 1178 1249 codegen(codegen_scope *s, node *tree, int val) 1179 1250 { 1180 1251 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 } 1184 1266 if (s->irep && s->filename_index != tree->filename_index) { 1185 1267 s->irep->filename = mrb_parser_get_filename(s->parser, s->filename_index); … … 1210 1292 struct loopinfo *lp; 1211 1293 1294 if (tree->car == NULL) goto exit; 1212 1295 onerr = genop(s, MKOP_Bx(OP_ONERR, 0)); 1213 1296 lp = loop_push(s, LOOP_BEGIN); 1214 1297 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(); 1219 1300 lp->type = LOOP_RESCUE; 1220 1301 noexc = genop(s, MKOP_Bx(OP_JMP, 0)); … … 1227 1308 int exc = cursp(); 1228 1309 1229 genop(s, MKOP_A (OP_RESCUE, exc));1310 genop(s, MKOP_ABC(OP_RESCUE, exc, 0, 0)); 1230 1311 push(); 1231 1312 while (n2) { … … 1236 1317 pos2 = 0; 1237 1318 do { 1238 if (n4 ) {1319 if (n4 && n4->car && (intptr_t)n4->car->car == NODE_SPLAT) { 1239 1320 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(); 1248 1323 genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__case_eqq")), 1)); 1249 1324 } 1250 1325 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)); 1252 1335 } 1253 1336 tmp = genop(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2)); … … 1294 1377 1295 1378 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)) { 1297 1382 int idx; 1298 1383 int epush = s->pc; … … 1306 1391 genop_peep(s, MKOP_A(OP_EPOP, 1), NOVAL); 1307 1392 } 1393 else { /* empty ensure ignored */ 1394 codegen(s, tree->car, val); 1395 } 1308 1396 break; 1309 1397 1310 1398 case NODE_LAMBDA: 1311 {1399 if (val) { 1312 1400 int idx = lambda_body(s, tree, 1); 1313 1401 … … 1318 1406 1319 1407 case NODE_BLOCK: 1320 {1408 if (val) { 1321 1409 int idx = lambda_body(s, tree, 1); 1322 1410 … … 1331 1419 node *e = tree->cdr->cdr->car; 1332 1420 1421 if (!tree->car) { 1422 codegen(s, e, val); 1423 goto exit; 1424 } 1333 1425 switch ((intptr_t)tree->car->car) { 1334 1426 case NODE_TRUE: … … 1336 1428 case NODE_STR: 1337 1429 codegen(s, tree->cdr->car, val); 1338 return;1430 goto exit; 1339 1431 case NODE_FALSE: 1340 1432 case NODE_NIL: 1341 1433 codegen(s, e, val); 1342 return;1434 goto exit; 1343 1435 } 1344 1436 codegen(s, tree->car, VAL); … … 1347 1439 1348 1440 codegen(s, tree->cdr->car, val); 1349 if (val && !(tree->cdr->car)) {1350 genop(s, MKOP_A(OP_LOADNIL, cursp()));1351 push();1352 }1353 1441 if (e) { 1354 1442 if (val) pop(); … … 1485 1573 if (pos3) dispatch_linked(s, pos3); 1486 1574 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 } 1488 1578 push(); 1489 1579 } … … 1505 1595 case NODE_FCALL: 1506 1596 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); 1508 1601 break; 1509 1602 … … 1553 1646 int n; 1554 1647 1555 n = gen_values(s, tree, val );1648 n = gen_values(s, tree, val, 0); 1556 1649 if (n >= 0) { 1557 1650 if (val) { … … 1602 1695 1603 1696 case NODE_SPLAT: 1604 codegen(s, tree, VAL);1697 codegen(s, tree, val); 1605 1698 break; 1606 1699 … … 1617 1710 int rhs = cursp(); 1618 1711 1619 if ((intptr_t)t->car == NODE_ARRAY && nosplat(t->cdr)) {1712 if ((intptr_t)t->car == NODE_ARRAY && t->cdr && nosplat(t->cdr)) { 1620 1713 /* fixed rhs */ 1621 1714 t = t->cdr; … … 1630 1723 n = 0; 1631 1724 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 } 1634 1733 t = t->cdr; 1635 1734 } … … 1688 1787 mrb_int len; 1689 1788 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 } 1693 1855 if (len == 2 && 1694 1856 ((name[0] == '|' && name[1] == '|') || … … 1697 1859 1698 1860 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 } 1700 1870 codegen(s, tree->cdr->cdr->car, VAL); 1701 1871 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 } 1703 1894 dispatch(s, pos); 1704 break;1895 goto exit; 1705 1896 } 1706 1897 codegen(s, tree->cdr->cdr->car, VAL); … … 1736 1927 genop(s, MKOP_ABC(OP_SEND, cursp(), idx, 1)); 1737 1928 } 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 } 1740 1949 break; 1741 1950 1742 1951 case NODE_SUPER: 1743 1952 { 1953 codegen_scope *s2 = s; 1954 int lv = 0; 1744 1955 int n = 0, noop = 0, sendv = 0; 1745 1956 1746 1957 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(); 1747 1966 if (tree) { 1748 1967 node *args = tree->car; 1749 1968 if (args) { 1750 n = gen_values(s, args, VAL );1969 n = gen_values(s, args, VAL, 0); 1751 1970 if (n < 0) { 1752 1971 n = noop = sendv = 1; … … 1796 2015 case NODE_RETURN: 1797 2016 if (tree) { 1798 codegen(s, tree, VAL); 1799 pop(); 2017 gen_retval(s, tree); 1800 2018 } 1801 2019 else { … … 1823 2041 } 1824 2042 if (s2) ainfo = s2->ainfo; 1825 genop(s, MKOP_ABx(OP_BLKPUSH, cursp(), (ainfo<<4)|(lv & 0xf)));1826 2043 push(); 1827 2044 if (tree) { 1828 n = gen_values(s, tree, VAL );2045 n = gen_values(s, tree, VAL, 0); 1829 2046 if (n < 0) { 1830 2047 n = sendv = 1; … … 1833 2050 } 1834 2051 pop_n(n+1); 2052 genop(s, MKOP_ABx(OP_BLKPUSH, cursp(), (ainfo<<4)|(lv & 0xf))); 1835 2053 if (sendv) n = CALL_MAXARGS; 1836 2054 genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "call")), n)); … … 1869 2087 1870 2088 case NODE_REDO: 1871 if (!s->loop ) {2089 if (!s->loop || s->loop->type == LOOP_BEGIN || s->loop->type == LOOP_RESCUE) { 1872 2090 raise_error(s, "unexpected redo"); 1873 2091 } … … 1878 2096 genop(s, MKOP_sBx(OP_JMP, s->loop->pc2 - s->pc)); 1879 2097 } 2098 if (val) push(); 1880 2099 break; 1881 2100 … … 1912 2131 } 1913 2132 } 2133 if (val) push(); 1914 2134 } 1915 2135 break; … … 1984 2204 case NODE_BACK_REF: 1985 2205 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; 1987 2221 mrb_value str; 1988 2222 int sym; 1989 2223 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)); 2007 2225 sym = new_sym(s, mrb_intern_str(mrb, str)); 2008 2226 genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym)); … … 2051 2269 if (val) { 2052 2270 char *p = (char*)tree; 2053 mrb_float f = str_to_mrb_float(p);2271 mrb_float f = mrb_float_read(p, NULL); 2054 2272 int off = new_lit(s, mrb_float_value(s->mrb, f)); 2055 2273 … … 2065 2283 switch (nt) { 2066 2284 case NODE_FLOAT: 2067 {2285 if (val) { 2068 2286 char *p = (char*)tree; 2069 mrb_float f = str_to_mrb_float(p);2287 mrb_float f = mrb_float_read(p, NULL); 2070 2288 int off = new_lit(s, mrb_float_value(s->mrb, -f)); 2071 2289 … … 2076 2294 2077 2295 case NODE_INT: 2078 {2296 if (val) { 2079 2297 char *p = (char*)tree->car; 2080 2298 int base = (intptr_t)tree->cdr->car; … … 2105 2323 2106 2324 default: 2107 {2325 if (val) { 2108 2326 int sym = new_msym(s, mrb_intern_lit(s->mrb, "-")); 2109 2327 … … 2113 2331 pop(); pop(); 2114 2332 genop(s, MKOP_ABC(OP_SUB, cursp(), sym, 2)); 2333 } 2334 else { 2335 codegen(s, tree, NOVAL); 2115 2336 } 2116 2337 break; … … 2139 2360 node *n = tree; 2140 2361 2141 if (!n) break; 2362 if (!n) { 2363 genop(s, MKOP_A(OP_LOADNIL, cursp())); 2364 push(); 2365 break; 2366 } 2142 2367 codegen(s, n->car, VAL); 2143 2368 n = n->cdr; … … 2176 2401 int sym = new_sym(s, mrb_intern_lit(s->mrb, "Kernel")); 2177 2402 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())); 2181 2404 push(); 2182 2405 codegen(s, tree->car, VAL); … … 2193 2416 n = n->cdr; 2194 2417 } 2195 p op();2196 pop ();2418 push(); /* for block */ 2419 pop_n(3); 2197 2420 sym = new_sym(s, mrb_intern_lit(s->mrb, "`")); 2198 2421 genop(s, MKOP_ABC(OP_SEND, cursp(), sym, 1)); 2199 if (val == NOVAL) { pop(); } 2200 else { push(); } 2422 if (val) push(); 2201 2423 mrb_gc_arena_restore(s->mrb, ai); 2202 2424 } … … 2208 2430 size_t len = (intptr_t)tree->cdr; 2209 2431 int ai = mrb_gc_arena_save(s->mrb); 2210 int sym = new_sym(s, mrb_intern_lit(s->mrb, "Kernel"));2211 2432 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())); 2216 2436 push(); 2217 2437 genop(s, MKOP_ABx(OP_STRING, cursp(), off)); 2218 pop(); 2438 push(); push(); 2439 pop_n(3); 2219 2440 sym = new_sym(s, mrb_intern_lit(s->mrb, "`")); 2220 2441 genop(s, MKOP_ABC(OP_SEND, cursp(), sym, 1)); 2221 if (val == NOVAL) { pop(); } 2222 else { push(); } 2442 if (val) push(); 2223 2443 mrb_gc_arena_restore(s->mrb, ai); 2224 2444 } … … 2244 2464 off = new_lit(s, mrb_str_new_cstr(s->mrb, p2)); 2245 2465 genop(s, MKOP_ABx(OP_STRING, cursp(), off)); 2246 } else { 2466 } 2467 else { 2247 2468 genop(s, MKOP_A(OP_LOADNIL, cursp())); 2248 2469 } … … 2295 2516 genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL); 2296 2517 } 2297 if (n->cdr ) {2298 char *p2 = (char*)n->cdr ;2518 if (n->cdr->car) { 2519 char *p2 = (char*)n->cdr->car; 2299 2520 2300 2521 push(); … … 2302 2523 genop(s, MKOP_ABx(OP_STRING, cursp(), off)); 2303 2524 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); 2307 2535 sym = new_sym(s, mrb_intern_lit(s->mrb, "compile")); 2308 2536 genop(s, MKOP_ABC(OP_SEND, cursp(), sym, argc)); … … 2379 2607 push(); 2380 2608 genop(s, MKOP_A(OP_LOADNIL, cursp())); 2381 pop_n(3); 2609 push(); 2610 pop_n(4); 2382 2611 genop(s, MKOP_ABC(OP_SEND, cursp(), c, 2)); 2383 2612 if (val) { … … 2396 2625 push(); 2397 2626 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)); 2399 2643 genop(s, MKOP_ABx(OP_LOADSYM, cursp(), symbol)); 2400 2644 push(); … … 2402 2646 num++; 2403 2647 } 2404 pop_n(num + 1); 2648 pop(); 2649 if (num < CALL_MAXARGS) { 2650 pop_n(num); 2651 } 2405 2652 genop(s, MKOP_ABC(OP_SEND, cursp(), undef, num)); 2406 2653 if (val) { … … 2529 2776 break; 2530 2777 } 2778 exit: 2779 s->rlev = rlev; 2531 2780 } 2532 2781 … … 2570 2819 p->icapa = 1024; 2571 2820 p->iseq = (mrb_code*)mrb_malloc(mrb, sizeof(mrb_code)*p->icapa); 2572 p->irep->iseq = p->iseq;2821 p->irep->iseq = NULL; 2573 2822 2574 2823 p->pcapa = 32; … … 2576 2825 p->irep->plen = 0; 2577 2826 2578 p->scapa = 256;2827 p->scapa = MAXMSYMLEN; 2579 2828 p->irep->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*p->scapa); 2580 2829 p->irep->slen = 0; … … 2620 2869 p->filename_index = prev->filename_index; 2621 2870 2871 p->rlev = prev->rlev+1; 2872 2622 2873 return p; 2623 2874 } … … 2646 2897 irep->reps = (mrb_irep**)codegen_realloc(s, irep->reps, sizeof(mrb_irep*)*irep->rlen); 2647 2898 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); 2650 2901 2651 2902 fname_len = strlen(s->filename); … … 2654 2905 fname[fname_len] = '\0'; 2655 2906 irep->filename = fname; 2907 irep->own_filename = TRUE; 2656 2908 } 2657 2909 … … 2689 2941 2690 2942 if (tree) { 2691 codegen(s, tree, VAL); 2692 pop(); 2943 gen_retval(s, tree); 2693 2944 } 2694 2945 … … 2702 2953 } 2703 2954 if (!loop) { 2704 codegen_error(s, "unexpected break"); 2955 raise_error(s, "unexpected break"); 2956 return; 2705 2957 } 2706 2958 … … 2718 2970 } 2719 2971 else { 2972 if (!tree) { 2973 genop(s, MKOP_A(OP_LOADNIL, cursp())); 2974 } 2720 2975 genop(s, MKOP_AB(OP_RETURN, cursp(), OP_R_BREAK)); 2721 2976 } … … 2726 2981 loop_pop(codegen_scope *s, int val) 2727 2982 { 2983 dispatch_linked(s, s->loop->pc3); 2728 2984 if (val) { 2729 2985 genop(s, MKOP_A(OP_LOADNIL, cursp())); 2730 2986 } 2731 dispatch_linked(s, s->loop->pc3);2732 2987 s->loop = s->loop->prev; 2733 2988 if (val) push(); … … 2739 2994 codegen_scope *scope = scope_new(mrb, 0, 0); 2740 2995 struct RProc *proc; 2996 struct mrb_jmpbuf *prev_jmp = mrb->jmp; 2741 2997 2742 2998 if (!scope) { … … 2749 3005 2750 3006 MRB_TRY(&scope->jmp) { 3007 mrb->jmp = &scope->jmp; 2751 3008 /* prepare irep */ 2752 3009 codegen(scope, p->tree, NOVAL); … … 2754 3011 mrb_irep_decref(mrb, scope->irep); 2755 3012 mrb_pool_close(scope->mpool); 3013 proc->c = NULL; 3014 mrb->jmp = prev_jmp; 2756 3015 return proc; 2757 3016 } 2758 3017 MRB_CATCH(&scope->jmp) { 2759 if (scope->filename == scope->irep->filename) {2760 scope->irep->filename = NULL;2761 }2762 3018 mrb_irep_decref(mrb, scope->irep); 2763 3019 mrb_pool_close(scope->mpool); 3020 mrb->jmp = prev_jmp; 2764 3021 return NULL; 2765 3022 } -
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 5 5 */ 6 6 7 #ifndef NODE_H8 #define NODE_H7 #ifndef MRUBY_COMPILER_NODE_H 8 #define MRUBY_COMPILER_NODE_H 9 9 10 10 enum node_type { … … 39 39 NODE_OP_ASGN, 40 40 NODE_CALL, 41 NODE_SCALL, 41 42 NODE_FCALL, 42 43 NODE_VCALL, … … 115 116 }; 116 117 117 #endif /* NODE_H */118 #endif /* MRUBY_COMPILER_NODE_H */ -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-compiler/core/parse.y
r270 r331 23 23 #include <stdlib.h> 24 24 #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> 29 30 #include "node.h" 30 #include "mruby/throw.h"31 31 32 32 #define YYLEX_PARAM p … … 42 42 static void yywarning(parser_state *p, const char *s); 43 43 static void backref_error(parser_state *p, node *n); 44 static void void_expr_error(parser_state *p, node *n); 44 45 static void tokadd(parser_state *p, int32_t c); 45 46 … … 73 74 #define sym(x) ((mrb_sym)(intptr_t)(x)) 74 75 #define nsym(x) ((node*)(intptr_t)(x)) 76 #define nint(x) ((node*)(intptr_t)(x)) 77 #define intn(x) ((int)(intptr_t)(x)) 75 78 76 79 static inline mrb_sym … … 309 312 } 310 313 314 static node* 315 new_mod_rescue(parser_state *p, node *body, node *resq) 316 { 317 return new_rescue(p, body, list1(list3(0, 0, resq)), 0); 318 } 319 311 320 /* (:ensure body ensure) */ 312 321 static node* … … 348 357 new_if(parser_state *p, node *a, node *b, node *c) 349 358 { 359 void_expr_error(p, a); 350 360 return list4((node*)NODE_IF, a, b, c); 351 361 } … … 355 365 new_unless(parser_state *p, node *a, node *b, node *c) 356 366 { 367 void_expr_error(p, a); 357 368 return list4((node*)NODE_IF, a, c, b); 358 369 } … … 362 373 new_while(parser_state *p, node *a, node *b) 363 374 { 375 void_expr_error(p, a); 364 376 return cons((node*)NODE_WHILE, cons(a, b)); 365 377 } … … 369 381 new_until(parser_state *p, node *a, node *b) 370 382 { 383 void_expr_error(p, a); 371 384 return cons((node*)NODE_UNTIL, cons(a, b)); 372 385 } … … 376 389 new_for(parser_state *p, node *v, node *o, node *b) 377 390 { 391 void_expr_error(p, o); 378 392 return list4((node*)NODE_FOR, v, o, b); 379 393 } … … 386 400 node *n2 = n; 387 401 402 void_expr_error(p, a); 388 403 while (n2->cdr) { 389 404 n2 = n2->cdr; … … 409 424 /* (:call a b c) */ 410 425 static 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); 426 new_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); 414 430 NODE_LINENO(n, a); 415 431 return n; … … 507 523 new_colon2(parser_state *p, node *b, mrb_sym c) 508 524 { 525 void_expr_error(p, b); 509 526 return cons((node*)NODE_COLON2, cons(b, nsym(c))); 510 527 } … … 614 631 new_class(parser_state *p, node *c, node *s, node *b) 615 632 { 633 void_expr_error(p, s); 616 634 return list4((node*)NODE_CLASS, c, s, cons(locals_node(p), b)); 617 635 } … … 621 639 new_sclass(parser_state *p, node *o, node *b) 622 640 { 641 void_expr_error(p, o); 623 642 return list3((node*)NODE_SCLASS, o, cons(locals_node(p), b)); 624 643 } … … 642 661 new_sdef(parser_state *p, node *o, mrb_sym m, node *a, node *b) 643 662 { 663 void_expr_error(p, o); 644 664 return list6((node*)NODE_SDEF, o, nsym(m), locals_node(p), a, b); 645 665 } … … 694 714 new_asgn(parser_state *p, node *a, node *b) 695 715 { 716 void_expr_error(p, b); 696 717 return cons((node*)NODE_ASGN, cons(a, b)); 697 718 } … … 701 722 new_masgn(parser_state *p, node *a, node *b) 702 723 { 724 void_expr_error(p, b); 703 725 return cons((node*)NODE_MASGN, cons(a, b)); 704 726 } … … 708 730 new_op_asgn(parser_state *p, node *a, mrb_sym op, node *b) 709 731 { 732 void_expr_error(p, b); 710 733 return list4((node*)NODE_OP_ASGN, a, nsym(op), b); 711 734 } … … 715 738 new_int(parser_state *p, const char *s, int base) 716 739 { 717 return list3((node*)NODE_INT, (node*)strdup(s), (node*)(intptr_t)base);740 return list3((node*)NODE_INT, (node*)strdup(s), nint(base)); 718 741 } 719 742 … … 729 752 new_str(parser_state *p, const char *s, int len) 730 753 { 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))); 732 755 } 733 756 … … 743 766 new_xstr(parser_state *p, const char *s, int len) 744 767 { 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))); 746 769 } 747 770 … … 760 783 } 761 784 762 /* (: str . (a . a)) */785 /* (:regx . (s . (opt . enc))) */ 763 786 static node* 764 787 new_regx(parser_state *p, const char *p1, const char* p2, const char* p3) … … 767 790 } 768 791 769 /* (:dregx . a) */792 /* (:dregx . (a . b)) */ 770 793 static node* 771 794 new_dregx(parser_state *p, node *a, node *b) … … 778 801 new_back_ref(parser_state *p, int n) 779 802 { 780 return cons((node*)NODE_BACK_REF, (node*)(intptr_t)n);803 return cons((node*)NODE_BACK_REF, nint(n)); 781 804 } 782 805 … … 785 808 new_nth_ref(parser_state *p, int n) 786 809 { 787 return cons((node*)NODE_NTH_REF, (node*)(intptr_t)n);810 return cons((node*)NODE_NTH_REF, nint(n)); 788 811 } 789 812 … … 827 850 call_uni_op(parser_state *p, node *recv, const char *m) 828 851 { 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); 830 854 } 831 855 … … 834 858 call_bin_op(parser_state *p, node *recv, const char *m, node *arg1) 835 859 { 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); 837 861 } 838 862 … … 853 877 node *n; 854 878 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: 857 882 if (!a->cdr) a->cdr = cons(0, b); 858 883 else { 859 884 args_with_block(p, a->cdr, b); 860 885 } 861 } 862 else { 886 break; 887 case NODE_CALL: 888 case NODE_FCALL: 889 case NODE_SCALL: 863 890 n = a->cdr->cdr->cdr; 864 891 if (!n->car) n->car = cons(0, b); … … 866 893 args_with_block(p, n->car, b); 867 894 } 895 break; 896 default: 897 break; 868 898 } 869 899 } … … 895 925 assignable(parser_state *p, node *lhs) 896 926 { 897 if ( (int)(intptr_t)lhs->car== NODE_LVAR) {927 if (intn(lhs->car) == NODE_LVAR) { 898 928 local_add(p, sym(lhs->cdr)); 899 929 } … … 905 935 node *n; 906 936 907 if ( (int)(intptr_t)lhs->car== NODE_LVAR) {937 if (intn(lhs->car) == NODE_LVAR) { 908 938 if (!local_var_p(p, sym(lhs->cdr))) { 909 939 n = new_fcall(p, sym(lhs->cdr), 0); … … 921 951 new_strterm(parser_state *p, string_type type, int term, int paren) 922 952 { 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)))); 924 954 } 925 955 … … 1002 1032 else { 1003 1033 /* 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)) 1008 1038 1009 1039 /* xxx ----------------------------- */ … … 1077 1107 %token <id> tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tLABEL 1078 1108 %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 1080 1110 %token <nd> tNTH_REF tBACK_REF 1081 1111 %token <num> tREGEXP_END … … 1085 1115 %type <nd> top_compstmt top_stmts top_stmt 1086 1116 %type <nd> bodystmt compstmt stmts stmt expr arg primary command command_call method_call 1087 %type <nd> expr_value arg_ valueprimary_value1117 %type <nd> expr_value arg_rhs primary_value 1088 1118 %type <nd> if_tail opt_else case_body cases opt_rescue exc_list exc_var opt_ensure 1089 1119 %type <nd> args call_args opt_call_args 1090 1120 %type <nd> paren_args opt_paren_args variable 1091 1121 %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_command1122 %type <nd> command_asgn command_rhs mrhs superclass block_call block_command 1093 1123 %type <nd> f_block_optarg f_block_opt 1094 1124 %type <nd> f_arglist f_args f_arg f_arg_item f_optarg f_marg f_marg_list f_margs … … 1101 1131 %type <id> cname fname op f_rest_arg f_block_arg opt_f_block_arg f_norm_arg f_opt_asgn 1102 1132 %type <nd> heredoc words symbols 1133 %type <num> call_op call_op2 /* 0:'&.', 1:'.', 2:'::' */ 1103 1134 1104 1135 %token tUPLUS /* unary+ */ … … 1129 1160 %token tAMPER /* & */ 1130 1161 %token tLAMBDA /* -> */ 1162 %token tANDDOT /* &. */ 1131 1163 %token tSYMBEG tREGEXP_BEG tWORDS_BEG tSYMBOLS_BEG 1132 1164 %token tSTRING_BEG tXSTRING_BEG tSTRING_DVAR tLAMBEG … … 1292 1324 | stmt modifier_rescue stmt 1293 1325 { 1294 $$ = new_ rescue(p, $1, list1(list3(0, 0, $3)), 0);1326 $$ = new_mod_rescue(p, $1, $3); 1295 1327 } 1296 1328 | keyword_END '{' compstmt '}' 1297 1329 { 1298 yyerror(p, "END not sup orted");1330 yyerror(p, "END not supported"); 1299 1331 $$ = new_postexe(p, $3); 1300 1332 } … … 1304 1336 $$ = new_masgn(p, $1, $3); 1305 1337 } 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 1353 command_asgn : lhs '=' command_rhs 1354 { 1355 $$ = new_asgn(p, $1, $3); 1356 } 1357 | var_lhs tOP_ASGN command_rhs 1307 1358 { 1308 1359 $$ = new_op_asgn(p, $1, $2, $3); 1309 1360 } 1310 | primary_value '[' opt_call_args rbracket tOP_ASGN command_ call1311 { 1312 $$ = new_op_asgn(p, new_call(p, $1, intern("[]",2), $3 ), $5, $6);1313 } 1314 | primary_value '.' tIDENTIFIER tOP_ASGN command_call1315 { 1316 $$ = new_op_asgn(p, new_call(p, $1, $3, 0 ), $4, $5);1317 } 1318 | primary_value '.' tCONSTANT tOP_ASGN command_call1319 { 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); 1321 1372 } 1322 1373 | primary_value tCOLON2 tCONSTANT tOP_ASGN command_call … … 1325 1376 $$ = 0; 1326 1377 } 1327 | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_ call1328 { 1329 $$ = new_op_asgn(p, new_call(p, $1, $3, 0 ), $4, $5);1330 } 1331 | backref tOP_ASGN command_ call1378 | 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 1332 1383 { 1333 1384 backref_error(p, $1); 1334 1385 $$ = new_begin(p, 0); 1335 1386 } 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 1389 command_rhs : command_call %prec tOP_ASGN 1390 | command_call modifier_rescue stmt 1391 { 1392 $$ = new_mod_rescue(p, $1, $3); 1393 } 1394 | command_asgn 1359 1395 ; 1360 1396 … … 1383 1419 { 1384 1420 if (!$1) $$ = new_nil(p); 1385 else $$ = $1; 1421 else { 1422 $$ = $1; 1423 } 1386 1424 } 1387 1425 ; … … 1392 1430 1393 1431 block_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 } 1395 1436 ; 1396 1437 … … 1417 1458 $$ = new_fcall(p, $1, $2); 1418 1459 } 1419 | primary_value '.'operation2 command_args %prec tLOWEST1420 { 1421 $$ = new_call(p, $1, $3, $4 );1422 } 1423 | primary_value '.'operation2 command_args cmd_brace_block1460 | 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 1424 1465 { 1425 1466 args_with_block(p, $4, $5); 1426 $$ = new_call(p, $1, $3, $4 );1467 $$ = new_call(p, $1, $3, $4, $2); 1427 1468 } 1428 1469 | primary_value tCOLON2 operation2 command_args %prec tLOWEST 1429 1470 { 1430 $$ = new_call(p, $1, $3, $4 );1471 $$ = new_call(p, $1, $3, $4, tCOLON2); 1431 1472 } 1432 1473 | primary_value tCOLON2 operation2 command_args cmd_brace_block 1433 1474 { 1434 1475 args_with_block(p, $4, $5); 1435 $$ = new_call(p, $1, $3, $4 );1476 $$ = new_call(p, $1, $3, $4, tCOLON2); 1436 1477 } 1437 1478 | keyword_super command_args … … 1549 1590 | primary_value '[' opt_call_args rbracket 1550 1591 { 1551 $$ = new_call(p, $1, intern("[]",2), $3 );1552 } 1553 | primary_value '.'tIDENTIFIER1554 { 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); 1556 1597 } 1557 1598 | primary_value tCOLON2 tIDENTIFIER 1558 1599 { 1559 $$ = new_call(p, $1, $3, 0 );1560 } 1561 | primary_value '.'tCONSTANT1562 { 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); 1564 1605 } 1565 1606 | primary_value tCOLON2 tCONSTANT … … 1588 1629 | primary_value '[' opt_call_args rbracket 1589 1630 { 1590 $$ = new_call(p, $1, intern("[]",2), $3 );1591 } 1592 | primary_value '.'tIDENTIFIER1593 { 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); 1595 1636 } 1596 1637 | primary_value tCOLON2 tIDENTIFIER 1597 1638 { 1598 $$ = new_call(p, $1, $3, 0 );1599 } 1600 | primary_value '.'tCONSTANT1601 { 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); 1603 1644 } 1604 1645 | primary_value tCOLON2 tCONSTANT … … 1638 1679 | primary_value tCOLON2 cname 1639 1680 { 1681 void_expr_error(p, $1); 1640 1682 $$ = cons($1, nsym($3)); 1641 1683 } … … 1716 1758 ; 1717 1759 1718 arg : lhs '=' arg 1760 arg : lhs '=' arg_rhs 1719 1761 { 1720 1762 $$ = new_asgn(p, $1, $3); 1721 1763 } 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 1727 1765 { 1728 1766 $$ = new_op_asgn(p, $1, $2, $3); 1729 1767 } 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 1751 1785 { 1752 1786 yyerror(p, "constant re-assignment"); 1753 1787 $$ = new_begin(p, 0); 1754 1788 } 1755 | tCOLON3 tCONSTANT tOP_ASGN arg 1789 | tCOLON3 tCONSTANT tOP_ASGN arg_rhs 1756 1790 { 1757 1791 yyerror(p, "constant re-assignment"); 1758 1792 $$ = new_begin(p, 0); 1759 1793 } 1760 | backref tOP_ASGN arg 1794 | backref tOP_ASGN arg_rhs 1761 1795 { 1762 1796 backref_error(p, $1); … … 1897 1931 ; 1898 1932 1899 arg_value : arg1900 {1901 $$ = $1;1902 if (!$$) $$ = new_nil(p);1903 }1904 ;1905 1906 1933 aref_args : none 1907 1934 | args trailer … … 1910 1937 NODE_LINENO($$, $1); 1911 1938 } 1912 | args ','assocs trailer1939 | args comma assocs trailer 1913 1940 { 1914 1941 $$ = push($1, new_hash(p, $3)); … … 1918 1945 $$ = cons(new_hash(p, $1), 0); 1919 1946 NODE_LINENO($$, $1); 1947 } 1948 ; 1949 1950 arg_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); 1920 1959 } 1921 1960 ; … … 1938 1977 NODE_LINENO($$, $1); 1939 1978 } 1940 | args ','assocs ','1979 | args comma assocs ',' 1941 1980 { 1942 1981 $$ = cons(push($1, new_hash(p, $3)), 0); … … 1952 1991 call_args : command 1953 1992 { 1993 void_expr_error(p, $1); 1954 1994 $$ = cons(list1($1), 0); 1955 1995 NODE_LINENO($$, $1); … … 1965 2005 NODE_LINENO($$, $1); 1966 2006 } 1967 | args ','assocs opt_block_arg2007 | args comma assocs opt_block_arg 1968 2008 { 1969 2009 $$ = cons(push($1, new_hash(p, $3)), $4); … … 1988 2028 ; 1989 2029 1990 block_arg : tAMPER arg _value2030 block_arg : tAMPER arg 1991 2031 { 1992 2032 $$ = new_block_arg(p, $2); … … 1994 2034 ; 1995 2035 1996 opt_block_arg : ','block_arg2036 opt_block_arg : comma block_arg 1997 2037 { 1998 2038 $$ = $2; … … 2004 2044 ; 2005 2045 2006 args : arg_value 2007 { 2046 comma : ',' 2047 | ',' heredoc_bodies 2048 ; 2049 2050 args : arg 2051 { 2052 void_expr_error(p, $1); 2008 2053 $$ = cons($1, 0); 2009 2054 NODE_LINENO($$, $1); 2010 2055 } 2011 | tSTAR arg_value 2012 { 2056 | tSTAR arg 2057 { 2058 void_expr_error(p, $2); 2013 2059 $$ = cons(new_splat(p, $2), 0); 2014 2060 NODE_LINENO($$, $2); 2015 2061 } 2016 | args ',' arg_value 2017 { 2062 | args comma arg 2063 { 2064 void_expr_error(p, $3); 2018 2065 $$ = push($1, $3); 2019 2066 } 2020 | args ',' tSTAR arg_value 2021 { 2067 | args comma tSTAR arg 2068 { 2069 void_expr_error(p, $4); 2022 2070 $$ = push($1, new_splat(p, $4)); 2023 2071 } 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 2074 mrhs : args comma arg 2075 { 2076 void_expr_error(p, $3); 2036 2077 $$ = push($1, $3); 2037 2078 } 2038 | args ',' tSTAR arg_value 2039 { 2079 | args comma tSTAR arg 2080 { 2081 void_expr_error(p, $4); 2040 2082 $$ = push($1, new_splat(p, $4)); 2041 2083 } 2042 | tSTAR arg_value 2043 { 2084 | tSTAR arg 2085 { 2086 void_expr_error(p, $2); 2044 2087 $$ = list1(new_splat(p, $2)); 2045 2088 } … … 2073 2116 p->cmdarg_stack = 0; 2074 2117 } 2075 expr{p->lstate = EXPR_ENDARG;} rparen2118 stmt {p->lstate = EXPR_ENDARG;} rparen 2076 2119 { 2077 2120 p->cmdarg_stack = $<stack>2; … … 2080 2123 | tLPAREN_ARG {p->lstate = EXPR_ENDARG;} rparen 2081 2124 { 2082 $$ = 0;2125 $$ = new_nil(p); 2083 2126 } 2084 2127 | tLPAREN compstmt ')' … … 2108 2151 $$ = new_return(p, 0); 2109 2152 } 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); 2121 2156 } 2122 2157 | keyword_not '(' expr rparen … … 2229 2264 term 2230 2265 { 2231 $<nd>$ = cons(local_switch(p), (node*)(intptr_t)p->in_single);2266 $<nd>$ = cons(local_switch(p), nint(p->in_single)); 2232 2267 p->in_single = 0; 2233 2268 } … … 2239 2274 local_resume(p, $<nd>6->car); 2240 2275 p->in_def = $<num>4; 2241 p->in_single = (int)(intptr_t)$<nd>6->cdr;2276 p->in_single = intn($<nd>6->cdr); 2242 2277 } 2243 2278 | keyword_module … … 2433 2468 | f_arg ',' 2434 2469 { 2435 $$ = new_args(p, $1, 0, 1, 0, 0);2470 $$ = new_args(p, $1, 0, 0, 0, 0); 2436 2471 } 2437 2472 | f_arg ',' f_rest_arg ',' f_arg opt_f_block_arg … … 2561 2596 $$ = $1; 2562 2597 } 2563 | block_call dot_or_colonoperation2 opt_paren_args2564 { 2565 $$ = new_call(p, $1, $3, $4 );2566 } 2567 | block_call dot_or_colonoperation2 opt_paren_args brace_block2568 { 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); 2570 2605 call_with_block(p, $$, $5); 2571 2606 } 2572 | block_call dot_or_colonoperation2 command_args do_block2573 { 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); 2575 2610 call_with_block(p, $$, $5); 2576 2611 } … … 2581 2616 $$ = new_fcall(p, $1, $2); 2582 2617 } 2583 | primary_value '.'operation2 opt_paren_args2584 { 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); 2586 2621 } 2587 2622 | primary_value tCOLON2 operation2 paren_args 2588 2623 { 2589 $$ = new_call(p, $1, $3, $4 );2624 $$ = new_call(p, $1, $3, $4, tCOLON2); 2590 2625 } 2591 2626 | primary_value tCOLON2 operation3 2592 2627 { 2593 $$ = new_call(p, $1, $3, 0 );2594 } 2595 | primary_value '.'paren_args2596 { 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); 2598 2633 } 2599 2634 | primary_value tCOLON2 paren_args 2600 2635 { 2601 $$ = new_call(p, $1, intern("call",4), $3 );2636 $$ = new_call(p, $1, intern("call",4), $3, tCOLON2); 2602 2637 } 2603 2638 | keyword_super paren_args … … 2611 2646 | primary_value '[' opt_call_args rbracket 2612 2647 { 2613 $$ = new_call(p, $1, intern("[]",2), $3 );2648 $$ = new_call(p, $1, intern("[]",2), $3, '.'); 2614 2649 } 2615 2650 ; … … 2671 2706 ; 2672 2707 2673 exc_list : arg _value2708 exc_list : arg 2674 2709 { 2675 2710 $$ = list1($1); … … 2766 2801 ; 2767 2802 2768 opt_heredoc_bodies : /* none */2769 | heredoc_bodies2770 ;2771 2772 2803 heredoc_bodies : heredoc_body 2773 2804 | heredoc_bodies heredoc_body … … 2825 2856 $$ = new_sym(p, $1); 2826 2857 } 2827 | tSYMBEG tSTRING_BEG string_ interp tSTRING2858 | tSYMBEG tSTRING_BEG string_rep tSTRING 2828 2859 { 2829 2860 p->lstate = EXPR_END; … … 2925 2956 | keyword__FILE__ 2926 2957 { 2927 if (!p->filename) { 2928 p->filename = "(null)"; 2958 const char *fn = p->filename; 2959 if (!fn) { 2960 fn = "(null)"; 2929 2961 } 2930 $$ = new_str(p, p->filename, strlen(p->filename));2962 $$ = new_str(p, fn, strlen(fn)); 2931 2963 } 2932 2964 | keyword__LINE__ … … 2955 2987 { 2956 2988 $$ = $3; 2957 } /* 2989 } /* 2958 2990 | error term 2959 2991 { … … 3098 3130 ; 3099 3131 3100 f_opt : f_opt_asgn arg_value 3101 { 3132 f_opt : f_opt_asgn arg 3133 { 3134 void_expr_error(p, $2); 3102 3135 $$ = cons(nsym($1), $2); 3103 3136 } … … 3106 3139 f_block_opt : f_opt_asgn primary_value 3107 3140 { 3141 void_expr_error(p, $2); 3108 3142 $$ = cons(nsym($1), $2); 3109 3143 } … … 3179 3213 } 3180 3214 else { 3181 switch ((enum node_type) (int)(intptr_t)$3->car) {3215 switch ((enum node_type)intn($3->car)) { 3182 3216 case NODE_STR: 3183 3217 case NODE_DSTR: … … 3216 3250 ; 3217 3251 3218 assoc : arg_value tASSOC arg_value 3219 { 3252 assoc : arg tASSOC arg 3253 { 3254 void_expr_error(p, $1); 3255 void_expr_error(p, $3); 3220 3256 $$ = cons($1, $3); 3221 3257 } 3222 | tLABEL arg_value 3223 { 3258 | tLABEL arg 3259 { 3260 void_expr_error(p, $2); 3224 3261 $$ = 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); 3225 3277 } 3226 3278 ; … … 3246 3298 ; 3247 3299 3300 call_op : '.' 3301 { 3302 $$ = '.'; 3303 } 3304 | tANDDOT 3305 { 3306 $$ = 0; 3307 } 3308 ; 3309 3310 call_op2 : call_op 3311 | tCOLON2 3312 { 3313 $$ = tCOLON2; 3314 } 3315 ; 3316 3248 3317 opt_terms : /* none */ 3249 3318 | terms … … 3262 3331 trailer : /* none */ 3263 3332 | nl 3264 | ','3333 | comma 3265 3334 ; 3266 3335 3267 3336 term : ';' {yyerrok;} 3268 3337 | nl 3338 | heredoc_body 3269 3339 ; 3270 3340 … … 3274 3344 p->column = 0; 3275 3345 } 3276 opt_heredoc_bodies3346 ; 3277 3347 3278 3348 terms : term 3279 | terms ';' {yyerrok;}3349 | terms term 3280 3350 ; 3281 3351 … … 3286 3356 ; 3287 3357 %% 3288 #define yylval (*((YYSTYPE*)(p->ylval)))3358 #define pylval (*((YYSTYPE*)(p->ylval))) 3289 3359 3290 3360 static void … … 3374 3444 3375 3445 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); 3377 3447 } 3378 3448 else if (c == NODE_BACK_REF) { … … 3381 3451 else { 3382 3452 mrb_bug(p->mrb, "Internal error in backref_error() : n=>car == %S", mrb_fixnum_value(c)); 3453 } 3454 } 3455 3456 static void 3457 void_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; 3383 3486 } 3384 3487 } … … 3469 3572 c0 = nextc(p); 3470 3573 if (c0 == -1) return c0; /* do not skip partial EOF */ 3574 if (c0 >= 0) --p->column; 3471 3575 list = push(list, (node*)(intptr_t)c0); 3472 3576 } while(n--); … … 3517 3621 for (;;) { 3518 3622 c = nextc(p); 3519 if (c < 0) return c;3623 if (c < 0) return FALSE; 3520 3624 if (c == '\n') { 3521 3625 p->lineno++; … … 3547 3651 newtok(parser_state *p) 3548 3652 { 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; 3550 3659 return p->column - 1; 3551 3660 } … … 3555 3664 { 3556 3665 char utf8[4]; 3557 unsignedlen;3666 int i, len; 3558 3667 3559 3668 /* mrb_assert(-0x10FFFF <= c && c <= 0xFF); */ … … 3589 3698 } 3590 3699 } 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]; 3596 3716 } 3597 3717 } … … 3600 3720 toklast(parser_state *p) 3601 3721 { 3602 return p-> buf[p->bidx-1];3722 return p->tokbuf[p->tidx-1]; 3603 3723 } 3604 3724 … … 3606 3726 tokfix(parser_state *p) 3607 3727 { 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; 3612 3730 yyerror(p, "string too long (truncated)"); 3613 3731 } 3614 p-> buf[i] = '\0';3732 p->tokbuf[p->tidx] = '\0'; 3615 3733 } 3616 3734 … … 3618 3736 tok(parser_state *p) 3619 3737 { 3620 return p-> buf;3738 return p->tokbuf; 3621 3739 } 3622 3740 … … 3624 3742 toklen(parser_state *p) 3625 3743 { 3626 return p-> bidx;3744 return p->tidx; 3627 3745 } 3628 3746 … … 3667 3785 3668 3786 return retval; 3787 } 3788 3789 static int32_t 3790 read_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; 3669 3825 } 3670 3826 … … 3741 3897 3742 3898 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, '{')) { 3752 3900 /* \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; 3776 3905 } 3777 3906 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 } 3790 3910 return -c; 3791 3911 … … 3845 3965 int end = (intptr_t)p->lex_strterm->cdr->cdr->cdr; 3846 3966 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; 3848 3971 newtok(p); 3849 3972 while ((c = nextc(p)) != end || nest_level != 0) { … … 3867 3990 } 3868 3991 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 } 3870 3998 } 3871 3999 } … … 3876 4004 return 0; 3877 4005 } 3878 yylval.nd = new_str(p, tok(p), toklen(p));4006 pylval.nd = new_str(p, tok(p), toklen(p)); 3879 4007 return tHD_STRING_MID; 3880 4008 } … … 3908 4036 tokadd(p, c); 3909 4037 } 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 } 3910 4052 else { 3911 4053 pushback(p, c); … … 3935 4077 p->lstate = EXPR_BEG; 3936 4078 p->cmd_start = TRUE; 3937 yylval.nd = new_str(p, tok(p), toklen(p));4079 pylval.nd = new_str(p, tok(p), toklen(p)); 3938 4080 if (hinf) { 3939 4081 hinf->line_head = FALSE; … … 3965 4107 pushback(p, c); 3966 4108 tokfix(p); 3967 yylval.nd = new_str(p, tok(p), toklen(p));4109 pylval.nd = new_str(p, tok(p), toklen(p)); 3968 4110 return tSTRING_MID; 3969 4111 } 4112 } 4113 if (c == '\n') { 4114 p->lineno++; 4115 p->column = 0; 3970 4116 } 3971 4117 tokadd(p, c); … … 3977 4123 3978 4124 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)); 3980 4126 return tXSTRING; 3981 4127 } … … 4019 4165 if (flag > flags) { 4020 4166 dup = strndup(flags, (size_t)(flag - flags)); 4021 } else { 4167 } 4168 else { 4022 4169 dup = NULL; 4023 4170 } 4024 4171 if (enc) { 4025 4172 encp = strndup(&enc, 1); 4026 } else { 4173 } 4174 else { 4027 4175 encp = NULL; 4028 4176 } 4029 yylval.nd = new_regx(p, s, dup, encp);4177 pylval.nd = new_regx(p, s, dup, encp); 4030 4178 4031 4179 return tREGEXP; 4032 4180 } 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 4035 4190 return tSTRING; 4036 4191 } … … 4102 4257 p->lstate = EXPR_END; 4103 4258 4104 yylval.nd = newnode;4259 pylval.nd = newnode; 4105 4260 return tHEREDOC_BEG; 4106 4261 } … … 4206 4361 if ((c = nextc(p)) == '*') { 4207 4362 if ((c = nextc(p)) == '=') { 4208 yylval.id = intern("**",2);4363 pylval.id = intern("**",2); 4209 4364 p->lstate = EXPR_BEG; 4210 4365 return tOP_ASGN; … … 4215 4370 else { 4216 4371 if (c == '=') { 4217 yylval.id = intern_c('*');4372 pylval.id = intern_c('*'); 4218 4373 p->lstate = EXPR_BEG; 4219 4374 return tOP_ASGN; … … 4331 4486 if (c == '<') { 4332 4487 if ((c = nextc(p)) == '=') { 4333 yylval.id = intern("<<",2);4488 pylval.id = intern("<<",2); 4334 4489 p->lstate = EXPR_BEG; 4335 4490 return tOP_ASGN; … … 4353 4508 if (c == '>') { 4354 4509 if ((c = nextc(p)) == '=') { 4355 yylval.id = intern(">>",2);4510 pylval.id = intern(">>",2); 4356 4511 p->lstate = EXPR_BEG; 4357 4512 return tOP_ASGN; … … 4450 4605 } 4451 4606 tokfix(p); 4452 yylval.nd = new_str(p, tok(p), toklen(p));4607 pylval.nd = new_str(p, tok(p), toklen(p)); 4453 4608 p->lstate = EXPR_END; 4454 4609 return tCHAR; … … 4458 4613 p->lstate = EXPR_BEG; 4459 4614 if ((c = nextc(p)) == '=') { 4460 yylval.id = intern("&&",2);4615 pylval.id = intern("&&",2); 4461 4616 p->lstate = EXPR_BEG; 4462 4617 return tOP_ASGN; … … 4465 4620 return tANDOP; 4466 4621 } 4622 else if (c == '.') { 4623 p->lstate = EXPR_DOT; 4624 return tANDDOT; 4625 } 4467 4626 else if (c == '=') { 4468 yylval.id = intern_c('&');4627 pylval.id = intern_c('&'); 4469 4628 p->lstate = EXPR_BEG; 4470 4629 return tOP_ASGN; … … 4493 4652 p->lstate = EXPR_BEG; 4494 4653 if ((c = nextc(p)) == '=') { 4495 yylval.id = intern("||",2);4654 pylval.id = intern("||",2); 4496 4655 p->lstate = EXPR_BEG; 4497 4656 return tOP_ASGN; … … 4501 4660 } 4502 4661 if (c == '=') { 4503 yylval.id = intern_c('|');4662 pylval.id = intern_c('|'); 4504 4663 p->lstate = EXPR_BEG; 4505 4664 return tOP_ASGN; … … 4525 4684 } 4526 4685 if (c == '=') { 4527 yylval.id = intern_c('+');4686 pylval.id = intern_c('+'); 4528 4687 p->lstate = EXPR_BEG; 4529 4688 return tOP_ASGN; … … 4553 4712 } 4554 4713 if (c == '=') { 4555 yylval.id = intern_c('-');4714 pylval.id = intern_c('-'); 4556 4715 p->lstate = EXPR_BEG; 4557 4716 return tOP_ASGN; … … 4627 4786 } 4628 4787 else if (nondigit) goto trailing_uc; 4629 yylval.nd = new_int(p, tok(p), 16);4788 pylval.nd = new_int(p, tok(p), 16); 4630 4789 return tINTEGER; 4631 4790 } … … 4651 4810 } 4652 4811 else if (nondigit) goto trailing_uc; 4653 yylval.nd = new_int(p, tok(p), 2);4812 pylval.nd = new_int(p, tok(p), 2); 4654 4813 return tINTEGER; 4655 4814 } … … 4675 4834 } 4676 4835 else if (nondigit) goto trailing_uc; 4677 yylval.nd = new_int(p, tok(p), 10);4836 pylval.nd = new_int(p, tok(p), 10); 4678 4837 return tINTEGER; 4679 4838 } … … 4708 4867 tokfix(p); 4709 4868 if (nondigit) goto trailing_uc; 4710 yylval.nd = new_int(p, tok(p), 8);4869 pylval.nd = new_int(p, tok(p), 8); 4711 4870 return tINTEGER; 4712 4871 } … … 4725 4884 else { 4726 4885 pushback(p, c); 4727 yylval.nd = new_int(p, "0", 10);4886 pylval.nd = new_int(p, "0", 10); 4728 4887 return tINTEGER; 4729 4888 } … … 4801 4960 4802 4961 errno = 0; 4803 d = strtod(tok(p), &endp);4962 d = mrb_float_read(tok(p), &endp); 4804 4963 if (d == 0 && endp == tok(p)) { 4805 4964 yywarning_s(p, "corrupted float value %s", tok(p)); … … 4809 4968 errno = 0; 4810 4969 } 4811 yylval.nd = new_float(p, tok(p));4970 pylval.nd = new_float(p, tok(p)); 4812 4971 return tFLOAT; 4813 4972 } 4814 yylval.nd = new_int(p, tok(p), 10);4973 pylval.nd = new_int(p, tok(p), 10); 4815 4974 return tINTEGER; 4816 4975 } … … 4854 5013 } 4855 5014 if ((c = nextc(p)) == '=') { 4856 yylval.id = intern_c('/');5015 pylval.id = intern_c('/'); 4857 5016 p->lstate = EXPR_BEG; 4858 5017 return tOP_ASGN; … … 4873 5032 case '^': 4874 5033 if ((c = nextc(p)) == '=') { 4875 yylval.id = intern_c('^');5034 pylval.id = intern_c('^'); 4876 5035 p->lstate = EXPR_BEG; 4877 5036 return tOP_ASGN; … … 5047 5206 } 5048 5207 if ((c = nextc(p)) == '=') { 5049 yylval.id = intern_c('%');5208 pylval.id = intern_c('%'); 5050 5209 p->lstate = EXPR_BEG; 5051 5210 return tOP_ASGN; … … 5101 5260 tokadd(p, c); 5102 5261 tokfix(p); 5103 yylval.id = intern_cstr(tok(p));5262 pylval.id = intern_cstr(tok(p)); 5104 5263 return tGVAR; 5105 5264 … … 5111 5270 gvar: 5112 5271 tokfix(p); 5113 yylval.id = intern_cstr(tok(p));5272 pylval.id = intern_cstr(tok(p)); 5114 5273 return tGVAR; 5115 5274 … … 5123 5282 goto gvar; 5124 5283 } 5125 yylval.nd = new_back_ref(p, c);5284 pylval.nd = new_back_ref(p, c); 5126 5285 return tBACK_REF; 5127 5286 … … 5142 5301 return 0; 5143 5302 } 5144 yylval.nd = new_nth_ref(p, (int)n);5303 pylval.nd = new_nth_ref(p, (int)n); 5145 5304 } 5146 5305 return tNTH_REF; … … 5166 5325 } 5167 5326 if (c < 0) { 5168 if (p-> bidx == 1) {5327 if (p->tidx == 1) { 5169 5328 yyerror(p, "incomplete instance variable syntax"); 5170 5329 } … … 5175 5334 } 5176 5335 else if (isdigit(c)) { 5177 if (p-> bidx == 1) {5336 if (p->tidx == 1) { 5178 5337 yyerror_i(p, "'@%c' is not allowed as an instance variable name", c); 5179 5338 } … … 5270 5429 nextc(p); 5271 5430 tokfix(p); 5272 yylval.id = intern_cstr(tok(p));5431 pylval.id = intern_cstr(tok(p)); 5273 5432 return tLABEL; 5274 5433 } … … 5281 5440 if (kw) { 5282 5441 enum mrb_lex_state_enum state = p->lstate; 5283 yylval.num = p->lineno;5442 pylval.num = p->lineno; 5284 5443 p->lstate = kw->state; 5285 5444 if (state == EXPR_FNAME) { 5286 yylval.id = intern_cstr(kw->name);5445 pylval.id = intern_cstr(kw->name); 5287 5446 return kw->id[0]; 5288 5447 } … … 5331 5490 mrb_sym ident = intern_cstr(tok(p)); 5332 5491 5333 yylval.id = ident;5492 pylval.id = ident; 5334 5493 #if 0 5335 5494 if (last_state != EXPR_DOT && islower(tok(p)[0]) && lvar_defined(ident)) { … … 5396 5555 mrb_parser_parse(parser_state *p, mrbc_context *c) 5397 5556 { 5398 struct mrb_jmpbuf buf ;5399 p->jmp = &buf ;5557 struct mrb_jmpbuf buf1; 5558 p->jmp = &buf1; 5400 5559 5401 5560 MRB_TRY(p->jmp) { 5561 int n; 5402 5562 5403 5563 p->cmd_start = TRUE; … … 5407 5567 5408 5568 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 } 5410 5590 if (!p->tree) { 5411 5591 p->tree = new_nil(p); … … 5415 5595 mrb_parser_dump(p->mrb, p->tree, 0); 5416 5596 } 5417 5418 5597 } 5419 5598 MRB_CATCH(p->jmp) { … … 5443 5622 5444 5623 p->s = p->send = NULL; 5445 #ifndef MRB_DIS BLE_STDIO5624 #ifndef MRB_DISABLE_STDIO 5446 5625 p->f = NULL; 5447 5626 #endif … … 5456 5635 yydebug = 1; 5457 5636 #endif 5637 p->tsiz = MRB_PARSER_TOKBUF_SIZE; 5638 p->tokbuf = p->buf; 5458 5639 5459 5640 p->lex_strterm = NULL; … … 5470 5651 MRB_API void 5471 5652 mrb_parser_free(parser_state *p) { 5653 if (p->tokbuf != p->buf) { 5654 mrb_free(p->mrb, p->tokbuf); 5655 } 5472 5656 mrb_pool_close(p->pool); 5473 5657 } … … 5482 5666 mrbc_context_free(mrb_state *mrb, mrbc_context *cxt) 5483 5667 { 5668 mrb_free(mrb, cxt->filename); 5484 5669 mrb_free(mrb, cxt->syms); 5485 5670 mrb_free(mrb, cxt); … … 5491 5676 if (s) { 5492 5677 int len = strlen(s); 5493 char *p = (char *)mrb_ alloca(mrb, len + 1);5678 char *p = (char *)mrb_malloc(mrb, len + 1); 5494 5679 5495 5680 memcpy(p, s, len + 1); 5681 if (c->filename) { 5682 mrb_free(mrb, c->filename); 5683 } 5496 5684 c->filename = p; 5497 5685 } … … 5578 5766 } 5579 5767 5580 staticmrb_value5581 load_exec(mrb_state *mrb,parser_state *p, mrbc_context *c)5768 MRB_API mrb_value 5769 mrb_load_exec(mrb_state *mrb, struct mrb_parser_state *p, mrbc_context *c) 5582 5770 { 5583 5771 struct RClass *target = mrb->object_class; … … 5601 5789 } 5602 5790 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 } 5604 5794 mrb_parser_free(p); 5605 5795 return mrb_undef_value(); … … 5609 5799 mrb_parser_free(p); 5610 5800 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 } 5612 5804 return mrb_undef_value(); 5613 5805 } … … 5629 5821 mrb->c->ci->target_class = target; 5630 5822 } 5631 v = mrb_top level_run_keep(mrb, proc, keep);5823 v = mrb_top_run(mrb, proc, mrb_top_self(mrb), keep); 5632 5824 if (mrb->exc) return mrb_nil_value(); 5633 5825 return v; … … 5638 5830 mrb_load_file_cxt(mrb_state *mrb, FILE *f, mrbc_context *c) 5639 5831 { 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); 5641 5833 } 5642 5834 … … 5651 5843 mrb_load_nstring_cxt(mrb_state *mrb, const char *s, int len, mrbc_context *c) 5652 5844 { 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); 5654 5846 } 5655 5847 … … 5805 5997 dump_recur(mrb, n->car, offset+2); 5806 5998 } 5807 n = n->cdr; 5808 if (n) { 5999 if (n->cdr) { 5809 6000 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))); 5811 6002 } 5812 6003 } … … 5946 6137 case NODE_FCALL: 5947 6138 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 } 5949 6150 mrb_parser_dump(mrb, tree->car, offset+1); 5950 6151 dump_prefix(tree, offset+1); … … 6154 6355 6155 6356 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); 6157 6358 break; 6158 6359 … … 6206 6407 dump_prefix(tree, offset); 6207 6408 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 } 6210 6417 break; 6211 6418 6212 6419 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); 6214 6422 break; 6215 6423 … … 6425 6633 6426 6634 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); 6429 6637 break; 6430 6638 -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-compiler/mrbgem.rake
r321 r331 9 9 lex_def = "#{current_dir}/core/lex.def" 10 10 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$/ 12 12 objfile(f.pathmap("#{current_build_dir}/core/%n")) 13 13 }.compact 14 14 15 if build.cxx_ abi_enabled?15 if build.cxx_exception_enabled? 16 16 core_objs << 17 17 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 59 59 def take(n) 60 60 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| 67 66 ary << val.__svalue 67 i -= 1 68 break if i == 0 68 69 end 69 70 ary … … 124 125 block.call(ary.dup) if ary.size == n 125 126 end 127 nil 126 128 end 127 129 … … 154 156 end 155 157 block.call(ary) unless ary.empty? 158 nil 156 159 end 157 160 … … 215 218 # If the enumerable is empty, the first form returns <code>nil</code>, and the 216 219 # 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 219 223 self.each do |*val| 220 224 return val.__svalue 221 225 end 222 226 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 223 240 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)" 232 242 end 233 243 end … … 385 395 first = false 386 396 else 397 val = val.__svalue 387 398 if block 388 max = val .__svalue if block.call(*val, max) > 0389 min = val .__svalue if block.call(*val, min) < 0399 max = val if block.call(val, max) > 0 400 min = val if block.call(val, min) < 0 390 401 else 391 val = val.__svalue392 402 max = val if (val <=> max) > 0 393 403 min = val if (val <=> min) < 0 … … 574 584 # 575 585 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 590 593 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 605 618 end 606 619 -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-enum-ext/test/enum.rb
r321 r331 26 26 assert("Enumerable#each_cons") do 27 27 a = [] 28 (1..5).each_cons(3){|e| a << e}28 b = (1..5).each_cons(3){|e| a << e} 29 29 assert_equal [[1, 2, 3], [2, 3, 4], [3, 4, 5]], a 30 assert_equal nil, b 30 31 end 31 32 32 33 assert("Enumerable#each_slice") do 33 34 a = [] 34 (1..10).each_slice(3){|e| a << e}35 b = (1..10).each_slice(3){|e| a << e} 35 36 assert_equal [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]], a 37 assert_equal nil, b 36 38 end 37 39 … … 129 131 assert_equal ["a", "b", "c", "a", "b", "c"], a 130 132 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 } 131 140 end 132 141 -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-enum-lazy/mrbgem.rake
r321 r331 2 2 spec.license = 'MIT' 3 3 spec.author = 'mruby developers' 4 spec.summary = 'Enumera ble::Lazy class'4 spec.summary = 'Enumerator::Lazy class' 5 5 spec.add_dependency('mruby-enumerator', :core => 'mruby-enumerator') 6 6 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 3 3 # = Enumerable#lazy implementation 4 4 # 5 # Enumerable#lazy returns an instance of Enumera ble::Lazy.5 # Enumerable#lazy returns an instance of Enumerator::Lazy. 6 6 # You can use it just like as normal Enumerable object, 7 7 # except these methods act as 'lazy': … … 17 17 # - zip 18 18 def lazy 19 Lazy.new(self)19 Enumerator::Lazy.new(self) 20 20 end 21 end 21 22 23 class Enumerator 22 24 # == Acknowledgements 23 25 # … … 40 42 } 41 43 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 42 53 43 54 def map(&block) -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-enum-lazy/test/lazy.rb
r321 r331 1 assert("Enumera ble::Lazy") do1 assert("Enumerator::Lazy") do 2 2 a = [1, 2] 3 assert_equal Enumera ble::Lazy, a.lazy.class3 assert_equal Enumerator::Lazy, a.lazy.class 4 4 end 5 5 6 assert("Enumera ble::Lazy laziness") do6 assert("Enumerator::Lazy laziness") do 7 7 a = Object.new 8 8 def a.each … … 41 41 end 42 42 43 assert("Enumerable::Lazy#zip with cycle") do 43 assert("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) 47 end 48 49 assert("Enumerator::Lazy#zip with cycle") do 44 50 e1 = [1, 2, 3].cycle 45 51 e2 = [:a, :b].cycle -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-enumerator/mrblib/enumerator.rb
r321 r331 154 154 def with_index(offset=0) 155 155 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| 160 166 n += 1 161 yield [i,n]167 yield i.__svalue, n 162 168 end 163 169 end … … 172 178 # If no block is given, a new Enumerator is returned that includes the index. 173 179 # 174 def each_with_index 175 with_index 180 def each_with_index(&block) 181 with_index(0, &block) 176 182 end 177 183 … … 517 523 # just for internal 518 524 class Generator 525 include Enumerable 519 526 def initialize(&block) 520 527 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 51 51 assert_equal([[1,0],[2,1],[3,2]], @obj.to_enum(:foo, 1, 2, 3).with_index.to_a) 52 52 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 53 56 end 54 57 … … 61 64 assert 'Enumerator#with_index string offset' do 62 65 assert_raise(TypeError){ @obj.to_enum(:foo, 1, 2, 3).with_index('1').to_a } 66 end 67 68 assert '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) 63 73 end 64 74 -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-error/mrbgem.rake
r321 r331 4 4 spec.summary = 'extensional error handling' 5 5 6 if build.cxx_ abi_enabled?6 if build.cxx_exception_enabled? 7 7 @objs << build.compile_as_cxx("#{spec.dir}/src/exception.c", "#{spec.build_dir}/src/exception.cxx") 8 8 @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> 4 4 5 5 MRB_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> 4 4 5 5 static mrb_value -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-error/test/exception.rb
r321 r331 6 6 # failure in protect returns [exception, true] 7 7 result = ExceptionTest.mrb_protect { raise 'test' } 8 assert_kind_of RuntimeError, result[0] 8 assert_kind_of RuntimeError, result[0] 9 9 assert_true result[1] 10 10 end -
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 9 mrb_value mrb_exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p); 10 mrb_value mrb_obj_instance_eval(mrb_state *mrb, mrb_value self); 7 11 8 12 static struct mrb_irep * … … 27 31 28 32 if (!e) return NULL; 33 if (!MRB_ENV_STACK_SHARED_P(e)) return NULL; 34 c = e->cxt.c; 29 35 proc = c->cibase[e->cioff].proc; 30 36 … … 127 133 } 128 134 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 145 void mrb_codedump_all(mrb_state*, struct RProc*); 132 146 133 147 static struct RProc* 134 create_proc_from_string(mrb_state *mrb, char *s, int len, mrb_value binding, c har *file, mrb_int line)148 create_proc_from_string(mrb_state *mrb, char *s, int len, mrb_value binding, const char *file, mrb_int line) 135 149 { 136 150 mrbc_context *cxt; … … 146 160 cxt = mrbc_context_new(mrb); 147 161 cxt->lineno = line; 148 if (file) { 149 mrbc_filename(mrb, cxt, file); 150 } 162 163 mrbc_filename(mrb, cxt, file ? file : "(eval)"); 151 164 cxt->capture_errors = TRUE; 152 165 cxt->no_optimize = TRUE; … … 161 174 if (0 < p->nerr) { 162 175 /* 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 } 166 189 mrb_parser_free(p); 167 190 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)); 169 192 } 170 193 … … 182 205 if (!e) e = c->ci[-1].env; 183 206 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; 186 209 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; 189 213 proc->env = e; 190 214 patch_irep(mrb, proc->body.irep, 0); … … 194 218 195 219 return proc; 220 } 221 222 static mrb_value 223 exec_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); 196 233 } 197 234 … … 204 241 char *file = NULL; 205 242 mrb_int line = 1; 206 mrb_value ret;207 243 struct RProc *proc; 208 244 … … 210 246 211 247 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 } 223 251 224 252 static mrb_value 225 253 f_instance_eval(mrb_state *mrb, mrb_value self) 226 254 { 227 struct mrb_context *c = mrb->c;228 255 mrb_value b; 229 256 mrb_int argc; mrb_value *argv; … … 237 264 mrb_int line = 1; 238 265 mrb_value cv; 266 struct RProc *proc; 239 267 240 268 mrb_get_args(mrb, "s|zi", &s, &len, &file, &line); 241 c->ci->acc = CI_ACC_SKIP;242 269 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); 245 275 } 246 276 else { -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-eval/test/eval.rb
r321 r331 65 65 assert_equal('test') { obj.instance_eval('@test') } 66 66 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] }") 67 69 end 68 70 -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-exit/src/mruby-exit.c
r321 r331 1 1 #include <stdlib.h> 2 #include "mruby.h"2 #include <mruby.h> 3 3 4 4 static 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> 5 5 6 6 #define fiber_ptr(o) ((struct RFiber*)mrb_ptr(o)) … … 8 8 #define FIBER_STACK_INIT_SIZE 64 9 9 #define FIBER_CI_INIT_SIZE 8 10 #define CI_ACC_RESUMED -3 10 11 11 12 /* … … 74 75 mrb_get_args(mrb, "&", &blk); 75 76 77 if (f->cxt) { 78 mrb_raise(mrb, E_RUNTIME_ERROR, "cannot initialize twice"); 79 } 76 80 if (mrb_nil_p(blk)) { 77 81 mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Fiber object without a block"); … … 82 86 } 83 87 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; 87 91 88 92 /* initialize VM stack */ … … 156 160 #define MARK_CONTEXT_MODIFY(c) (c)->ci->target_class = NULL 157 161 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); 162 static void 163 fiber_check_cfunc(mrb_state *mrb, struct mrb_context *c) 164 { 162 165 mrb_callinfo *ci; 163 166 … … 167 170 } 168 171 } 172 } 173 174 static void 175 fiber_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 184 static mrb_value 185 fiber_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); 169 192 if (resume && c->status == MRB_FIBER_TRANSFERRED) { 170 193 mrb_raise(mrb, E_FIBER_ERROR, "resuming transferred fiber"); 171 194 } 172 if (c->status == MRB_FIBER_RUNNING || c->status == MRB_FIBER_RESUM ING) {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)"); 174 197 } 175 198 if (c->status == MRB_FIBER_TERMINATED) { 176 199 mrb_raise(mrb, E_FIBER_ERROR, "resuming dead fiber"); 177 200 } 178 mrb->c->status = resume ? MRB_FIBER_RESUM ING: MRB_FIBER_TRANSFERRED;201 mrb->c->status = resume ? MRB_FIBER_RESUMED : MRB_FIBER_TRANSFERRED; 179 202 c->prev = resume ? mrb->c : (c->prev ? c->prev : mrb->root_c); 180 203 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; 184 211 while (b<e) { 185 212 *b++ = *a++; 186 213 } 187 214 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 { 194 228 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; 204 231 } 205 232 … … 224 251 mrb_value *a; 225 252 mrb_int len; 253 mrb_bool vmexec = FALSE; 226 254 227 255 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); 229 260 } 230 261 … … 233 264 mrb_fiber_resume(mrb_state *mrb, mrb_value fib, mrb_int len, const mrb_value *a) 234 265 { 235 return fiber_switch(mrb, fib, len, a, TRUE );266 return fiber_switch(mrb, fib, len, a, TRUE, TRUE); 236 267 } 237 268 … … 281 312 mrb_int len; 282 313 314 fiber_check_cfunc(mrb, mrb->c); 283 315 mrb_get_args(mrb, "*", &a, &len); 284 316 285 317 if (c == mrb->root_c) { 286 318 mrb->c->status = MRB_FIBER_TRANSFERRED; 287 mrb->c = c; 288 c->status = MRB_FIBER_RUNNING; 319 fiber_switch_context(mrb, c); 289 320 MARK_CONTEXT_MODIFY(c); 290 mrb_write_barrier(mrb, (struct RBasic*)c->fib);291 321 return fiber_result(mrb, a, len); 292 322 } … … 296 326 } 297 327 298 return fiber_switch(mrb, self, len, a, FALSE );328 return fiber_switch(mrb, self, len, a, FALSE, FALSE); 299 329 } 300 330 … … 305 335 { 306 336 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 314 338 if (!c->prev) { 315 339 mrb_raise(mrb, E_FIBER_ERROR, "can't yield from root fiber"); 316 340 } 317 341 342 fiber_check_cfunc(mrb, c); 318 343 c->prev->status = MRB_FIBER_RUNNING; 319 344 c->status = MRB_FIBER_SUSPENDED; 320 mrb->c = c->prev;345 fiber_switch_context(mrb, c->prev); 321 346 c->prev = NULL; 347 if (c->vmexec) { 348 c->vmexec = FALSE; 349 mrb->c->ci->acc = CI_ACC_RESUMED; 350 } 322 351 MARK_CONTEXT_MODIFY(mrb->c); 323 mrb_write_barrier(mrb, (struct RBasic*)c->fib);324 352 return fiber_result(mrb, a, len); 325 353 } … … 333 361 * processing at this point when <code>resume</code> is called next. 334 362 * 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(). 336 366 */ 337 367 static mrb_value -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-hash-ext/mrblib/hash.rb
r321 r331 29 29 o = object[0] 30 30 if o.respond_to?(:to_hash) 31 h = Hash.new31 h = self.new 32 32 object[0].to_hash.each { |k, v| h[k] = v } 33 33 return h 34 34 elsif o.respond_to?(:to_a) 35 h = Hash.new35 h = self.new 36 36 o.to_a.each do |i| 37 37 raise ArgumentError, "wrong element type #{i.class} (expected array)" unless i.respond_to?(:to_a) … … 54 54 raise ArgumentError, 'odd number of arguments for Hash' 55 55 end 56 h = Hash.new56 h = self.new 57 57 0.step(length - 2, 2) do |i| 58 58 h[object[i]] = object[i + 1] 59 59 end 60 60 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 61 80 end 62 81 … … 193 212 194 213 def invert 195 h = Hash.new214 h = self.class.new 196 215 self.each {|k, v| h[v] = k } 197 216 h … … 347 366 } 348 367 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 349 385 end -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-hash-ext/src/hash-ext.c
r321 r331 5 5 */ 6 6 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> 10 10 11 11 /* -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-hash-ext/test/hash.rb
r321 r331 38 38 Hash['d_key'] 39 39 end 40 end 41 42 assert('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) 46 end 47 48 assert('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})) 40 52 end 41 53 … … 138 150 end 139 151 152 assert("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) 156 end 157 140 158 assert("Hash#keep_if") do 141 159 h = { 1 => 2, 3 => 4, 5 => 6 } … … 231 249 assert_false(h2 > h2) 232 250 end 251 252 assert("Hash#dig") do 253 h = {a:{b:{c:1}}} 254 assert_equal(1, h.dig(:a, :b, :c)) 255 assert_nil(h.dig(:d)) 256 end -
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 7 static mrb_value 8 mrb_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 } 5 63 6 64 /* … … 62 120 * 63 121 * 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. 65 123 * 66 124 * Float(1) #=> 1.0 … … 171 229 172 230 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)); 173 232 mrb_define_method(mrb, krn, "__method__", mrb_f_method, MRB_ARGS_NONE()); 174 233 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 2 2 assert_raise(RuntimeError) { fail } 3 3 assert_raise(RuntimeError) { Kernel.fail } 4 end 5 6 assert('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) } 4 35 end 5 36 … … 23 54 assert_equal(930, Integer("0930", 10)) 24 55 assert_equal(7, Integer("111", 2)) 56 assert_equal(0, Integer("0")) 57 assert_equal(0, Integer("00000")) 25 58 assert_raise(TypeError) { Integer(nil) } 26 59 end -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-math/src/math.c
r321 r331 5 5 */ 6 6 7 #include "mruby.h"8 #include "mruby/array.h"7 #include <mruby.h> 8 #include <mruby/array.h> 9 9 10 10 #include <math.h> … … 20 20 21 21 /* math functions not provided by Microsoft Visual C++ 2012 or older */ 22 #if defined _MSC_VER && _MSC_VER < 180022 #if defined _MSC_VER && _MSC_VER <= 1700 23 23 24 24 #include <float.h> -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-numeric-ext/mrblib/numeric_ext.rb
r321 r331 3 3 self.divmod(other)[0] 4 4 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 5 17 end -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-numeric-ext/src/numeric_ext.c
r321 r331 1 1 #include <limits.h> 2 #include "mruby.h"2 #include <mruby.h> 3 3 4 4 static mrb_value -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-numeric-ext/test/numeric.rb
r321 r331 17 17 assert_float 52, 365.2425.div(7) 18 18 end 19 20 assert('Integer#zero?') do 21 assert_equal true, 0.zero? 22 assert_equal false, 1.zero? 23 end 24 25 assert('Integer#nonzero?') do 26 assert_equal nil, 0.nonzero? 27 assert_equal 1000, 1000.nonzero? 28 end -
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> 4 5 5 6 /* … … 63 64 mrb_obj_instance_exec(mrb_state *mrb, mrb_value self) 64 65 { 65 mrb_value *argv;66 const mrb_value *argv; 66 67 mrb_int argc; 67 68 mrb_value blk; 68 69 struct RClass *c; 70 mrb_value args; 69 71 70 72 mrb_get_args(mrb, "*&", &argv, &argc, &blk); … … 84 86 break; 85 87 } 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); 88 92 } 89 93 … … 97 101 mrb_define_method(mrb, n, "to_i", nil_to_i, MRB_ARGS_NONE()); 98 102 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()); 100 104 } 101 105 -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-object-ext/test/object.rb
r321 r331 24 24 assert_equal(:tap_ok, Class.new {def m; tap{return :tap_ok}; end}.new.m) 25 25 end 26 27 assert('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 53 end -
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> 5 5 6 6 struct os_count_struct { … … 10 10 }; 11 11 12 static void12 static int 13 13 os_count_object_type(mrb_state *mrb, struct RBasic *obj, void *data) 14 14 { … … 24 24 obj_count->counts[obj->tt]++; 25 25 } 26 return MRB_EACH_OBJ_OK; 26 27 } 27 28 … … 50 51 { 51 52 struct os_count_struct obj_count = { 0 }; 52 enum mrb_vtypei;53 mrb_int i; 53 54 mrb_value hash; 54 55 … … 110 111 }; 111 112 112 static void113 static int 113 114 os_each_object_cb(mrb_state *mrb, struct RBasic *obj, void *ud) 114 115 { … … 117 118 /* filter dead objects */ 118 119 if (mrb_object_dead_p(mrb, obj)) { 119 return ;120 return MRB_EACH_OBJ_OK; 120 121 } 121 122 … … 124 125 case MRB_TT_ENV: 125 126 case MRB_TT_ICLASS: 126 return ;127 return MRB_EACH_OBJ_OK; 127 128 default: 128 129 break; … … 130 131 131 132 /* filter half baked (or internal) objects */ 132 if (!obj->c) return ;133 if (!obj->c) return MRB_EACH_OBJ_OK; 133 134 134 135 /* filter class kind if target module defined */ 135 136 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; 137 138 } 138 139 139 140 mrb_yield(mrb, d->block, mrb_obj_value(obj)); 140 141 ++d->count; 142 return MRB_EACH_OBJ_OK; 141 143 } 142 144 -
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> 3 3 #include <stdio.h> 4 4 #include <string.h> 5 5 #include <stdlib.h> 6 #if defined(_ _MINGW32__) || defined(__MINGW64__)6 #if defined(_WIN32) 7 7 # include <windows.h> 8 8 # include <io.h> 9 #ifdef _MSC_VER 10 # define isatty(x) _isatty(x) 11 # define fileno(x) _fileno(x) 12 #endif 9 13 #endif 10 14 … … 13 17 { 14 18 if (mrb_string_p(obj)) { 15 #if defined(_ _MINGW32__) || defined(__MINGW64__)19 #if defined(_WIN32) 16 20 if (isatty(fileno(stdout))) { 17 21 DWORD written; … … 19 23 char* utf8 = RSTRING_PTR(obj); 20 24 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)); 22 26 if (utf16 == NULL) return; 23 27 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> 7 7 8 8 static mrb_value … … 53 53 line = mrb_debug_get_line(irep, 0); 54 54 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)); 56 56 } 57 57 else { … … 108 108 const struct mrb_irep *irep = proc->body.irep; 109 109 mrb_aspec aspec; 110 mrb_value parameters;110 mrb_value sname, parameters; 111 111 int i, j; 112 112 113 113 if (MRB_PROC_CFUNC_P(proc)) { 114 114 // TODO cfunc aspec is not implemented yet 115 return mrb_ary_new(mrb); 116 } 117 if (!irep) { 115 118 return mrb_ary_new(mrb); 116 119 } … … 135 138 136 139 parameters = mrb_ary_new_capa(mrb, irep->nlocals-1); 140 137 141 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)); 139 144 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); 145 151 } 146 152 } -
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> 4 4 5 5 static mrb_value -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-proc-ext/test/proc.rb
r321 r331 54 54 assert_equal([[:opt, :a]], lambda {|a=nil|}.parameters) 55 55 assert_equal([[:req, :a]], ->(a){}.parameters) 56 assert_equal([[:rest]], lambda { |*| }.parameters) 56 57 assert_equal([[:rest, :a]], Proc.new {|*a|}.parameters) 57 58 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 2 2 ** mt19937ar.c - MT Random functions 3 3 ** 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 5 34 */ 6 35 7 #include "mruby.h"36 #include <mruby.h> 8 37 #include "mt19937ar.h" 9 38 -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-random/src/mt19937ar.h
r321 r331 2 2 ** mt19937ar.h - MT Random functions 3 3 ** 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 5 34 */ 6 35 -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-random/src/random.c
r321 r331 5 5 */ 6 6 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> 12 12 #include "mt19937ar.h" 13 13 … … 80 80 81 81 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)) { 83 84 mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument type"); 84 85 } 85 arg = mrb_check_convert_type(mrb, arg, MRB_TT_FIXNUM, "Fixnum", "to_int");86 86 if (mrb_fixnum(arg) < 0) { 87 87 arg = mrb_fixnum_value(0 - mrb_fixnum(arg)); … … 125 125 mt_state *t; 126 126 127 seed = get_opt(mrb); 128 127 129 /* avoid memory leaks */ 128 130 t = (mt_state*)DATA_PTR(self); … … 135 137 t->mti = N + 1; 136 138 137 seed = get_opt(mrb);138 139 seed = mrb_random_mt_srand(mrb, t, seed); 139 140 if (mrb_nil_p(seed)) { … … 267 268 mrb_bool given; 268 269 mt_state *random = NULL; 269 mrb_int len = RARRAY_LEN(ary);270 mrb_int len; 270 271 271 272 mrb_get_args(mrb, "|i?d", &n, &given, &random, &mt_state_type); … … 275 276 mrb_random_rand_seed(mrb, random); 276 277 mt_rand(random); 278 len = RARRAY_LEN(ary); 277 279 if (!given) { /* pick one element */ 278 280 switch (len) { -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-random/src/random.h
r321 r331 5 5 */ 6 6 7 #ifndef RANDOM_H8 #define RANDOM_H7 #ifndef MRUBY_RANDOM_H 8 #define MRUBY_RANDOM_H 9 9 10 10 void mrb_mruby_random_gem_init(mrb_state *mrb); -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-random/test/random.rb
r321 r331 75 75 ary1 != [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] and 10.times { |x| ary1.include? x } and ary1 == ary2 76 76 end 77 78 assert('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 88 end -
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> 3 3 #include <math.h> 4 #include <float.h> 4 5 5 6 static mrb_bool … … 44 45 { 45 46 mrb_value val; 46 struct RRange *r = mrb_range_ptr( range);47 struct RRange *r = mrb_range_ptr(mrb, range); 47 48 mrb_value beg, end; 48 49 … … 68 69 /* 69 70 * call-seq: 70 * rng.first -> obj71 * rng.first(n) -> an_array72 *73 * Returns the first object in the range, or an array of the first +n+74 * elements.75 *76 * (10..20).first #=> 1077 * (10..20).first(3) #=> [10, 11, 12]78 */79 static mrb_value80 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:96 71 * rng.last -> obj 97 72 * rng.last(n) -> an_array … … 113 88 mrb_value num; 114 89 mrb_value array; 115 struct RRange *r = mrb_range_ptr( range);90 struct RRange *r = mrb_range_ptr(mrb, range); 116 91 117 92 if (mrb_get_args(mrb, "|o", &num) == 0) { … … 137 112 mrb_range_size(mrb_state *mrb, mrb_value range) 138 113 { 139 struct RRange *r = mrb_range_ptr( range);114 struct RRange *r = mrb_range_ptr(mrb, range); 140 115 mrb_value beg, end; 141 doublebeg_f, end_f;116 mrb_float beg_f, end_f; 142 117 mrb_bool num_p = TRUE; 118 mrb_bool excl; 143 119 144 120 beg = r->edges->beg; 145 121 end = r->edges->end; 122 excl = r->excl; 146 123 if (mrb_fixnum_p(beg)) { 147 beg_f = ( double)mrb_fixnum(beg);124 beg_f = (mrb_float)mrb_fixnum(beg); 148 125 } 149 126 else if (mrb_float_p(beg)) { … … 154 131 } 155 132 if (mrb_fixnum_p(end)) { 156 end_f = ( double)mrb_fixnum(end);133 end_f = (mrb_float)mrb_fixnum(end); 157 134 } 158 135 else if (mrb_float_p(end)) { … … 163 140 } 164 141 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; 166 144 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); 171 152 } 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); 173 160 } 174 161 return mrb_nil_value(); … … 181 168 182 169 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));184 170 mrb_define_method(mrb, s, "last", mrb_range_last, MRB_ARGS_OPT(1)); 185 171 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 11 11 assert_equal 10, (10..20).first 12 12 assert_equal [10, 11, 12], (10..20).first(3) 13 assert_equal [0, 1, 2], (0..Float::INFINITY).first(3) 13 14 end 14 15 … … 26 27 assert_equal 5, (1...6.0).size 27 28 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 28 31 assert_nil ('a'..'z').size 29 32 end -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-sprintf/src/kernel.c
r321 r331 5 5 */ 6 6 7 #include "mruby.h"7 #include <mruby.h> 8 8 9 9 mrb_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 5 5 */ 6 6 7 #include "mruby.h"7 #include <mruby.h> 8 8 9 9 #include <limits.h> 10 10 #include <stdio.h> 11 11 #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> 15 15 #include <math.h> 16 16 #include <ctype.h> … … 18 18 #define BIT_DIGITS(N) (((N)*146)/485 + 1) /* log2(10) =~ 146/485 */ 19 19 #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))) 21 21 22 22 mrb_value mrb_str_format(mrb_state *, int, const mrb_value *, mrb_value); … … 72 72 mrb_fix2binstr(mrb_state *mrb, mrb_value x, int base) 73 73 { 74 char buf[6 4], *b = buf + sizeof buf;74 char buf[66], *b = buf + sizeof buf; 75 75 mrb_int num = mrb_fixnum(x); 76 76 uint64_t val = (uint64_t)num; … … 80 80 mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix %S", mrb_fixnum_value(base)); 81 81 } 82 83 if (val >= (1 << 10))84 val &= 0x3ff;85 86 82 if (val == 0) { 87 83 return mrb_str_new_lit(mrb, "0"); … … 121 117 #define CHECK(l) do {\ 122 118 /* int cr = ENC_CODERANGE(result);*/\ 123 while ( blen + (l) >= bsiz) {\119 while ((l) >= bsiz - blen) {\ 124 120 bsiz*=2;\ 121 if (bsiz < 0) mrb_raise(mrb, E_ARGUMENT_ERROR, "too big specifier"); \ 125 122 }\ 126 123 mrb_str_resize(mrb, result, bsiz);\ … … 141 138 } while (0) 142 139 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()) : \ 140 static void 141 check_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 155 static void 156 check_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 170 static void 171 check_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),\ 148 184 (posarg = nextarg++, GETNTHARG(posarg))) 149 185 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))) 157 191 158 192 #define GETNTHARG(nth) \ 159 193 ((nth >= argc) ? (mrb_raise(mrb, E_ARGUMENT_ERROR, "too few arguments"), mrb_undef_value()) : argv[nth]) 160 194 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),\ 166 197 (posarg = -2, mrb_hash_fetch(mrb, get_hash(mrb, &hash, argc, argv), id, mrb_undef_value()))) 167 198 … … 187 218 } \ 188 219 else { \ 189 tmp_v = GET ARG(); \220 tmp_v = GETNEXTARG(); \ 190 221 p = t; \ 191 222 } \ 192 num = mrb_ fixnum(tmp_v); \223 num = mrb_int(mrb, tmp_v); \ 193 224 } while (0) 194 225 … … 536 567 537 568 for (t = p; t < end && *t != '%'; t++) ; 569 if (t + 1 == end) ++t; 538 570 PUSH(p, t - p); 539 571 if (t >= end) … … 680 712 mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid character"); 681 713 } 714 mrb_check_type(mrb, tmp, MRB_TT_STRING); 682 715 c = RSTRING_PTR(tmp); 683 716 n = RSTRING_LEN(tmp); 684 717 if (!(flags & FWIDTH)) { 685 CHECK(n); 686 memcpy(buf+blen, c, n); 687 blen += n; 718 PUSH(c, n); 688 719 } 689 720 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); 694 723 } 695 724 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); 700 727 } 701 728 } … … 717 744 RSTRING(result)->flags &= ~MRB_STR_EMBED_LEN_MASK; 718 745 RSTRING(result)->flags |= tmp_n << MRB_STR_EMBED_LEN_SHIFT; 719 } else { 746 } 747 else { 720 748 RSTRING(result)->as.heap.len = blen; 721 749 } … … 734 762 width -= (int)slen; 735 763 if (!(flags&FMINUS)) { 736 CHECK(width); 737 while (width--) { 738 buf[blen++] = ' '; 739 } 764 FILL(' ', width); 740 765 } 741 CHECK(len); 742 memcpy(&buf[blen], RSTRING_PTR(str), len); 743 blen += len; 766 PUSH(RSTRING_PTR(str), len); 744 767 if (flags&FMINUS) { 745 CHECK(width); 746 while (width--) { 747 buf[blen++] = ' '; 748 } 768 FILL(' ', width); 749 769 } 750 770 break; … … 764 784 case 'u': { 765 785 mrb_value val = GETARG(); 766 char fbuf[32], nbuf[64], *s;786 char nbuf[68], *s; 767 787 const char *prefix = NULL; 768 788 int sign = 0, dots = 0; 769 789 char sc = 0; 770 mrb_int v = 0 , org_v = 0;790 mrb_int v = 0; 771 791 int base; 772 792 mrb_int len; … … 775 795 case 'd': 776 796 case 'i': 777 case 'u':778 797 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;786 798 default: 787 799 break; … … 801 813 switch (mrb_type(val)) { 802 814 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 }807 815 val = mrb_flo_to_fixnum(mrb, val); 808 816 if (mrb_fixnum_p(val)) goto bin_retry; … … 836 844 837 845 if (base == 2) { 838 org_v = v;839 846 if (v < 0 && !sign) { 840 847 val = mrb_fix2binstr(mrb, mrb_fixnum_value(v), base); … … 844 851 val = mrb_fixnum_to_str(mrb, mrb_fixnum_value(v), base); 845 852 } 846 v = mrb_fixnum(mrb_str_to_inum(mrb, val, 10, FALSE));847 853 } 848 854 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 } 867 879 s = nbuf; 868 880 } 869 881 else { 870 char c = *p;871 if (c == 'X') c = 'x';872 if (base == 2) c = 'd';873 882 s = nbuf; 874 if ( v < 0) {883 if (base != 10 && v < 0) { 875 884 dots = 1; 876 885 } 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 } 879 900 if (v < 0) { 880 901 char d; … … 950 971 } 951 972 952 if (!(flags&FMINUS)) { 953 CHECK(width); 954 while (width-- > 0) { 955 buf[blen++] = ' '; 956 } 973 if (!(flags&FMINUS) && width > 0) { 974 FILL(' ', width); 957 975 } 958 976 … … 963 981 PUSH(prefix, plen); 964 982 } 965 CHECK(prec - len);966 983 if (dots) PUSH("..", 2); 967 984 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 } 981 996 PUSH(s, len); 982 CHECK(width); 983 while (width-- > 0) { 984 buf[blen++] = ' '; 997 if (width > 0) { 998 FILL(' ', width); 985 999 } 986 1000 } … … 1003 1017 const char *expr; 1004 1018 const int elen = 3; 1019 char sign = '\0'; 1005 1020 1006 1021 if (isnan(fval)) { … … 1011 1026 } 1012 1027 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; 1015 1034 if ((flags & FWIDTH) && need < width) 1016 1035 need = width; 1017 1036 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); 1020 1041 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); 1028 1045 } 1029 1046 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 } 1039 1051 break; 1040 1052 } … … 1052 1064 need = width; 1053 1065 need += 20; 1066 if (need <= 0) { 1067 mrb_raise(mrb, E_ARGUMENT_ERROR, 1068 (width > prec ? "width too big" : "prec too big")); 1069 } 1054 1070 1055 1071 CHECK(need); 1056 1072 n = snprintf(&buf[blen], need, fbuf, fval); 1073 if (n < 0) { 1074 mrb_raise(mrb, E_RUNTIME_ERROR, "formatting error"); 1075 } 1057 1076 blen += n; 1058 1077 } -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-sprintf/test/sprintf.rb
r321 r331 6 6 assert_equal "1 one 1.0", "%d %s %3.1f" % [ 1, "one", 1.01 ] 7 7 assert_equal "123 < 456", "%{num} < %<str>s" % { num: 123, str: "456" } 8 assert_equal 15, ("%b" % (1<<14)).size 8 9 end 10 11 assert('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 37 end 38 39 assert('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 65 end 66 67 assert("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 88 end 89 90 assert("String#% %b") do 91 assert_equal("..10115", "%0b5" % -5) 92 end 93 94 assert("String#% invalid format") do 95 assert_raise ArgumentError do 96 "%?" % "" 97 end 98 end 99 100 assert("String#% invalid format shared substring") do 101 fmt = ("x"*30+"%!")[0...-1] 102 assert_equal fmt, sprintf(fmt, "") 103 end -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-string-ext/mrbgem.rake
r321 r331 3 3 spec.author = 'mruby developers' 4 4 spec.summary = 'String class extension' 5 spec.add_test_dependency 'mruby-enumerator', core: 'mruby-enumerator' 5 6 end -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-string-ext/mrblib/string.rb
r321 r331 1 1 class 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 2 21 3 22 ## … … 27 46 a = 0 28 47 z = self.size - 1 29 a += 1 while " \f\n\r\t\v".include?(self[a]) and a <= z48 a += 1 while a <= z and " \f\n\r\t\v".include?(self[a]) 30 49 (z >= 0) ? self[a..z] : "" 31 50 end … … 44 63 a = 0 45 64 z = self.size - 1 46 z -= 1 while " \f\n\r\t\v\0".include?(self[z]) and a <= z65 z -= 1 while a <= z and " \f\n\r\t\v\0".include?(self[z]) 47 66 (z >= 0) ? self[a..z] : "" 48 67 end … … 60 79 a = 0 61 80 z = self.size - 1 62 a += 1 while " \f\n\r\t\v".include?(self[a]) and a <= z63 z -= 1 while " \f\n\r\t\v\0".include?(self[z]) and a <= z81 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]) 64 83 (z >= 0) ? self[a..z] : "" 65 84 end … … 77 96 # 78 97 def lstrip! 98 raise RuntimeError, "can't modify frozen String" if frozen? 79 99 s = self.lstrip 80 100 (s == self) ? nil : self.replace(s) … … 93 113 # 94 114 def rstrip! 115 raise RuntimeError, "can't modify frozen String" if frozen? 95 116 s = self.rstrip 96 117 (s == self) ? nil : self.replace(s) … … 105 126 # 106 127 def strip! 128 raise RuntimeError, "can't modify frozen String" if frozen? 107 129 s = self.strip 108 130 (s == self) ? nil : self.replace(s) … … 165 187 # 166 188 def slice!(arg1, arg2=nil) 189 raise RuntimeError, "can't modify frozen String" if frozen? 167 190 raise "wrong number of arguments (for 1..2)" if arg1.nil? && arg2.nil? 168 191 … … 189 212 idx = arg1 190 213 idx += self.size if arg1 < 0 191 validated = true if idx >=0 && arg1 < self.size 214 validated = true if idx >=0 && arg1 < self.size 192 215 end 193 216 if validated … … 236 259 # 237 260 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 246 268 end 247 269 … … 258 280 # "hello".ljust(20, '1234') #=> "hello123412341234123" 259 281 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 312 306 end 313 307 314 308 def chars(&block) 315 309 if block_given? 316 self.split(''). mapdo |i|310 self.split('').each do |i| 317 311 block.call(i) 318 312 end … … 322 316 end 323 317 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 325 327 326 328 def codepoints(&block) … … 328 330 329 331 if block_given? 330 self.split(''). mapdo|x|332 self.split('').each do|x| 331 333 block.call(x.ord) 332 334 end … … 337 339 end 338 340 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 339 355 end -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-string-ext/src/string.c
r321 r331 1 1 #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> 7 7 8 8 static mrb_value … … 24 24 { 25 25 mrb_int pos, byte; 26 long len = RSTRING_LEN(str);26 long len; 27 27 28 28 mrb_get_args(mrb, "ii", &pos, &byte); 29 29 30 len = RSTRING_LEN(str); 30 31 if (pos < -len || len <= pos) 31 32 mrb_raisef(mrb, E_INDEX_ERROR, "index %S is out of array", mrb_fixnum_value(pos)); … … 56 57 57 58 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 */ 59 63 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; 60 67 } 61 68 return mrb_nil_value(); … … 128 135 } 129 136 137 static mrb_value mrb_fixnum_chr(mrb_state *mrb, mrb_value num); 138 130 139 /* 131 140 * call-seq: … … 147 156 { 148 157 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); 150 164 mrb_str_concat(mrb, self, str); 151 165 return self; … … 308 322 mrb_int len; 309 323 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); 312 327 313 328 mrb_get_args(mrb, "&", &blk); 314 329 315 330 result = mrb_ary_new(mrb); 316 331 ai = mrb_gc_arena_save(mrb); 317 332 if (!mrb_nil_p(blk)) { 318 333 while (p < e) { … … 323 338 arg = mrb_str_new(mrb, t, len); 324 339 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); 325 347 } 326 348 return self; 327 349 } 328 350 while (p < e) { 329 ai = mrb_gc_arena_save(mrb);330 351 t = p; 331 352 while (p < e && *p != '\n') p++; … … 354 375 const char *prepend; 355 376 struct RString *s = mrb_str_ptr(self); 356 size_t l;377 mrb_int l; 357 378 358 379 if (RSTRING_LEN(self) == 0) … … 374 395 e = p + l - 1; 375 396 result = mrb_str_new_lit(mrb, ""); 376 } else { 397 } 398 else { 377 399 // find leading letter of the ascii/number 378 400 b = e; … … 392 414 mrb_str_cat_lit(mrb, result, "\x01"); 393 415 (*e) = 0; 394 } else 416 } 417 else 395 418 (*e)++; 396 419 break; … … 400 423 if (e == b) prepend = "1"; 401 424 *e = '0'; 402 } else if (*e == 'z') { 425 } 426 else if (*e == 'z') { 403 427 if (e == b) prepend = "a"; 404 428 *e = 'a'; 405 } else if (*e == 'Z') { 429 } 430 else if (*e == 'Z') { 406 431 if (e == b) prepend = "A"; 407 432 *e = 'A'; 408 } else { 433 } 434 else { 409 435 (*e)++; 410 436 break; … … 428 454 mrb_str_succ_bang(mrb, str); 429 455 return str; 430 }431 432 /*433 * call-seq:434 * str.prepend(other_str) -> str435 *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_value443 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;468 456 } 469 457 … … 530 518 if (RSTRING_LEN(str) == 0) 531 519 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]); 533 521 } 534 522 #endif 523 524 static mrb_bool 525 all_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 */ 565 static mrb_value 566 mrb_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 } 535 644 536 645 void … … 555 664 mrb_define_method(mrb, s, "succ", mrb_str_succ, MRB_ARGS_NONE()); 556 665 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));558 666 mrb_alias_method(mrb, s, mrb_intern_lit(mrb, "next"), mrb_intern_lit(mrb, "succ")); 559 667 mrb_alias_method(mrb, s, mrb_intern_lit(mrb, "next!"), mrb_intern_lit(mrb, "succ!")); 560 668 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()); 561 670 562 671 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 3 3 4 4 UTF8STRING = ("\343\201\202".size == 1) 5 6 assert('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") 11 end 5 12 6 13 assert('String#getbyte') do … … 22 29 assert_equal(h, str1.getbyte(0)) 23 30 assert_equal("Hello", str1) 31 end 32 33 assert("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) } 24 43 end 25 44 … … 104 123 105 124 assert('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) } 112 135 end 113 136 … … 400 423 assert_raise(IndexError) { "abcd".insert(5, 'X') } 401 424 assert_raise(IndexError) { "abcd".insert(-6, 'X') } 425 426 a = "abcd" 427 a.insert(0, 'X') 428 assert_equal "Xabcd", a 402 429 end 403 430 … … 411 438 assert_equal "hello", "hello".ljust(4) 412 439 assert_equal "hello ", "hello".ljust(20) 440 assert_equal 20, "hello".ljust(20).length 413 441 assert_equal "hello123412341234123", "hello".ljust(20, '1234') 414 442 assert_equal "hello", "hello".ljust(-3) 415 443 end 416 444 445 assert('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) 451 end 452 453 if 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 475 end 476 477 assert('String#ljust should not change string') do 478 a = "hello" 479 a.ljust(20) 480 assert_equal "hello", a 481 end 482 483 assert('String#rjust should not change string') do 484 a = "hello" 485 a.rjust(20) 486 assert_equal "hello", a 487 end 488 489 assert('String#ljust should raise on zero width padding') do 490 assert_raise(ArgumentError) { "foo".ljust(10, '') } 491 end 492 493 assert('String#rjust should raise on zero width padding') do 494 assert_raise(ArgumentError) { "foo".rjust(10, '') } 495 end 496 417 497 assert('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 503 if UTF8STRING 504 assert_equal ["あ", "ぃ", "い", "ぅ", "う", "ぇ", "え", "ぉ", "お"], "あ".upto("お").to_a 505 end 506 507 assert_equal ["9", ":", ";", "<", "=", ">", "?", "@", "A"], "9".upto("A").to_a 508 418 509 a = "aa" 419 510 start = "aa" … … 475 566 }) 476 567 assert_equal(2, count) 568 569 assert_raise(TypeError) { "a".upto(:c) {} } 477 570 end 478 571 … … 480 573 got = "hello!".split('').map {|x| x.ord} 481 574 expect = [104, 101, 108, 108, 111, 33] 575 unless UTF8STRING 576 got << "\xff".ord 577 expect << 0xff 578 end 482 579 assert_equal expect, got 483 580 end -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-struct/mrblib/struct.rb
r321 r331 83 83 alias to_s inspect 84 84 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 85 102 end 86 103 -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-struct/src/struct.c
r321 r331 6 6 7 7 #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> 15 15 16 16 #define RSTRUCT_LEN(st) mrb_ary_ptr(st)->len … … 62 62 } 63 63 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 } 67 72 } 68 73 return members; … … 80 85 } 81 86 87 static void 88 mrb_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 82 97 /* 15.2.18.4.6 */ 83 98 /* … … 99 114 } 100 115 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 } 116 static mrb_value struct_aref_sym(mrb_state *mrb, mrb_value obj, mrb_sym id); 121 117 122 118 static mrb_value 123 119 mrb_struct_ref(mrb_state *mrb, mrb_value obj) 124 120 { 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 } 154 123 155 124 static mrb_sym … … 172 141 } 173 142 174 static mrb_value 175 mrb_struct_set(mrb_state *mrb, mrb_value obj, mrb_value val) 176 { 143 static mrb_value mrb_struct_aset_sym(mrb_state *mrb, mrb_value s, mrb_sym id, mrb_value val); 144 145 static mrb_value 146 mrb_struct_set_m(mrb_state *mrb, mrb_value obj) 147 { 148 mrb_value val; 149 177 150 const char *name; 178 mrb_int i, len,slen;151 mrb_int slen; 179 152 mrb_sym mid; 180 mrb_value members, slot, *ptr; 181 const mrb_value *ptr_members;153 154 mrb_get_args(mrb, "o", &val); 182 155 183 156 /* get base id */ … … 185 158 mid = mrb_intern(mrb, name, slen-1); /* omit last "=" */ 186 159 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); 208 161 } 209 162 … … 235 188 236 189 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()); 243 191 mrb_define_method_id(mrb, c, mrb_id_attrset(mrb, id), mrb_struct_set_m, MRB_ARGS_REQ(1)); 244 192 mrb_gc_arena_restore(mrb, ai); … … 266 214 if (mrb_const_defined_at(mrb, mrb_obj_value(klass), id)) { 267 215 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); 269 217 } 270 218 c = mrb_define_class_under(mrb, klass, RSTRING_PTR(name), klass); … … 336 284 else { 337 285 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); 357 295 for (i=0; i<RARRAY_LEN(rest); i++) { 358 296 id = mrb_obj_to_sym(mrb, RARRAY_PTR(rest)[i]); … … 360 298 } 361 299 } 362 st = make_struct(mrb, name, rest, struct_class(mrb));300 st = make_struct(mrb, name, rest, mrb_class_ptr(klass)); 363 301 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)); 365 303 } 366 304 … … 419 357 { 420 358 mrb_value s; 421 mrb_int i, len;422 359 423 360 mrb_get_args(mrb, "o", &s); … … 430 367 mrb_raise(mrb, E_TYPE_ERROR, "corrupted struct"); 431 368 } 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); 439 370 return copy; 440 371 } 441 372 442 373 static mrb_value 443 struct_aref_sym(mrb_state *mrb, mrb_value s, mrb_sym id)444 { 445 mrb_value *ptr, members;374 struct_aref_sym(mrb_state *mrb, mrb_value obj, mrb_sym id) 375 { 376 mrb_value members, *ptr; 446 377 const mrb_value *ptr_members; 447 378 mrb_int i, len; 448 379 449 ptr = RSTRUCT_PTR(s); 450 members = struct_members(mrb, s); 380 members = struct_members(mrb, obj); 451 381 ptr_members = RARRAY_PTR(members); 452 382 len = RARRAY_LEN(members); 383 ptr = RSTRUCT_PTR(obj); 453 384 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) { 455 387 return ptr[i]; 456 388 } 457 389 } 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)); 459 391 return mrb_nil_value(); /* not reached */ 460 392 } … … 504 436 505 437 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); 507 439 } 508 440 idx = sym; … … 523 455 members = struct_members(mrb, s); 524 456 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 }530 457 ptr = RSTRUCT_PTR(s); 531 458 ptr_members = RARRAY_PTR(members); 532 459 for (i=0; i<len; i++) { 533 460 if (mrb_symbol(ptr_members[i]) == id) { 461 mrb_struct_modify(mrb, s); 534 462 ptr[i] = val; 535 463 return val; 536 464 } 537 465 } 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)); 539 467 return val; /* not reach */ 540 468 } … … 575 503 576 504 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); 578 506 } 579 507 idx = sym; … … 595 523 mrb_fixnum_value(i), mrb_fixnum_value(RSTRUCT_LEN(s))); 596 524 } 525 mrb_struct_modify(mrb, s); 597 526 return RSTRUCT_PTR(s)[i] = val; 598 527 } … … 720 649 mrb_int i; 721 650 722 members = struct_ s_members(mrb, mrb_class(mrb, self));651 members = struct_members(mrb, self); 723 652 ret = mrb_hash_new_capa(mrb, RARRAY_LEN(members)); 724 653 … … 761 690 struct RClass *st; 762 691 st = mrb_define_class(mrb, "Struct", mrb->object_class); 692 MRB_SET_INSTANCE_TT(st, MRB_TT_ARRAY); 763 693 764 694 mrb_define_class_method(mrb, st, "new", mrb_struct_s_def, MRB_ARGS_ANY()); /* 15.2.18.3.1 */ … … 777 707 mrb_define_method(mrb, st, "values", mrb_struct_to_a, MRB_ARGS_NONE()); 778 708 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()); 780 710 } 781 711 -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-struct/test/struct.rb
r321 r331 3 3 4 4 assert('Struct', '15.2.18') do 5 Struct.class == Class5 assert_equal Class, Struct.class 6 6 end 7 7 8 8 assert('Struct.new', '15.2.18.3.1') do 9 9 c = Struct.new(:m1, :m2) 10 c.superclass == Struct and11 c.members == [:m1,:m2]10 assert_equal Struct, c.superclass 11 assert_equal [:m1, :m2], c.members 12 12 end 13 13 … … 15 15 assert('Struct.new', '15.2.18.3.1') do 16 16 c = Struct.new() 17 c.superclass == Struct and c.members == [] 17 assert_equal Struct, c.superclass 18 assert_equal [], c.members 18 19 end 19 20 … … 22 23 cc1 = c.new(1,2) 23 24 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 } 25 29 end 26 30 … … 28 32 c = Struct.new(:m1, :m2) 29 33 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'] } 31 41 end 32 42 … … 35 45 cc = c.new(1,2) 36 46 cc[:m1] = 3 37 cc[:m1] == 347 assert_equal 3, cc[:m1] 38 48 cc["m2"] = 3 39 49 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] 40 54 assert_raise(TypeError) { cc[[]] = 3 } 55 assert_raise(IndexError) { cc[2] = 7 } 56 assert_raise(NameError) { cc['pochi'] = 8 } 41 57 end 42 58 … … 48 64 a << x 49 65 } 50 a [0] == 1 and a[1] == 266 assert_equal [1, 2], a 51 67 end 52 68 … … 58 74 a << [k,v] 59 75 } 60 a [0] == [:m1, 1] and a[1] == [:m2, 2]76 assert_equal [[:m1, 1], [:m2, 2]], a 61 77 end 62 78 63 79 assert('Struct#members', '15.2.18.4.6') do 64 80 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 67 82 end 68 83 69 84 assert('Struct#select', '15.2.18.4.7') do 70 85 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} } 73 87 end 74 88 … … 101 115 end 102 116 117 assert('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 } 123 end 124 103 125 assert('struct inspect') do 104 126 c = Struct.new(:m1, :m2, :m3, :m4, :m5) … … 130 152 assert_raise(IndexError) { a.values_at 2 } 131 153 end 154 155 assert("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) 160 end 161 162 assert("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 169 end 170 171 assert("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 183 end 184 185 assert("Struct.new does not allow array") do 186 assert_raise(TypeError) do 187 Struct.new("Test", [:a]) 188 end 189 end 190 191 assert("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 199 end 200 201 assert '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 212 end -
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> 4 4 5 5 typedef struct symbol_name { -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-test/driver.c
r321 r331 11 11 #include <string.h> 12 12 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> 20 20 21 21 void … … 95 95 mrb_define_const(mrb, mrbtest, "FIXNUM_BIT", mrb_fixnum_value(MRB_INT_BIT)); 96 96 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 97 103 if (verbose) { 98 104 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 1 1 #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> 5 5 6 6 extern const uint8_t mrbtest_assert_irep[]; 7 extern const uint8_t mrbtest_irep[];8 7 9 8 void mrbgemtest_init(mrb_state* mrb); … … 25 24 mrb_init_test_driver(core_test, mrb_test(mrb_gv_get(mrb, mrb_intern_lit(mrb, "$mrbtest_verbose")))); 26 25 mrb_load_irep(core_test, mrbtest_assert_irep); 27 mrb_load_irep(core_test, mrbtest_irep);28 26 mrb_t_pass_result(mrb, core_test); 29 27 -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-test/mrbgem.rake
r321 r331 7 7 spec.add_dependency('mruby-compiler', :core => 'mruby-compiler') 8 8 9 spec.test_rbfiles = Dir.glob("#{MRUBY_ROOT}/test/t/*.rb") 10 9 11 clib = "#{build_dir}/mrbtest.c" 10 12 mlib = clib.ext(exts.object) 11 mrbs = Dir.glob("#{MRUBY_ROOT}/test/t/*.rb")12 13 exec = exefile("#{build.build_dir}/bin/mrbtest") 13 14 … … 27 28 28 29 file assert_lib => assert_c 29 file assert_c => [build.mrbcfile, assert_rb]do |t|30 file assert_c => assert_rb do |t| 30 31 open(t.name, 'w') do |f| 31 32 mrbc.run f, assert_rb, 'mrbtest_assert_irep' … … 41 42 42 43 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| 44 45 FileUtils.mkdir_p File.dirname(t.name) 45 46 open(t.name, 'w') do |f| … … 146 147 147 148 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 148 162 file mlib => clib 149 file clib => [build.mrbcfile, init] + mrbsdo |t|163 file clib => init do |t| 150 164 _pp "GEN", "*.rb", "#{clib.relative_path}" 151 165 FileUtils.mkdir_p File.dirname(clib) … … 161 175 f.puts %Q[] 162 176 f.puts IO.read(init) 163 mrbc.run f, mrbs, 'mrbtest_irep'164 177 build.gems.each do |g| 165 178 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 6 6 7 7 #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 8 14 #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 22 double 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 13 31 14 32 #if !defined(__MINGW64__) && defined(_WIN32) … … 42 60 #endif 43 61 #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 */ 44 69 45 70 /* timegm(3) */ … … 154 179 }; 155 180 181 #ifndef DISABLE_STDIO 156 182 static const char mon_names[12][4] = { 157 183 "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", … … 161 187 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", 162 188 }; 189 #endif 163 190 164 191 struct mrb_time { … … 174 201 seconds setting. Returns self on success, NULL of failure. */ 175 202 static struct mrb_time* 176 mrb_time_update_datetime(struct mrb_time *self)203 time_update_datetime(mrb_state *mrb, struct mrb_time *self) 177 204 { 178 205 struct tm *aid; … … 184 211 aid = localtime_r(&self->sec, &self->datetime); 185 212 } 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 } 187 218 #ifdef NO_GMTIME_R 188 219 self->datetime = *aid; /* copy data */ … … 198 229 } 199 230 231 void mrb_check_num_exact(mrb_state *mrb, mrb_float num); 200 232 201 233 /* Allocates a mrb_time object and initializes it. */ … … 204 236 { 205 237 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 208 243 if (sizeof(time_t) == 4 && (sec > (double)INT32_MAX || (double)INT32_MIN > sec)) { 209 244 goto out_of_range; … … 212 247 goto out_of_range; 213 248 } 214 t m->sec = (time_t)sec;215 if ((sec > 0 && t m->sec < 0) || (sec < 0 && (double)tm->sec > sec)) {249 tsec = (time_t)sec; 250 if ((sec > 0 && tsec < 0) || (sec < 0 && (double)tsec > sec)) { 216 251 out_of_range: 217 252 mrb_raisef(mrb, E_ARGUMENT_ERROR, "%S out of Time range", mrb_float_value(mrb, sec)); 218 253 } 254 tm = (struct mrb_time *)mrb_malloc(mrb, sizeof(struct mrb_time)); 255 tm->sec = tsec; 219 256 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; 227 266 } 228 267 tm->timezone = timezone; 229 mrb_time_update_datetime(tm);268 time_update_datetime(mrb, tm); 230 269 231 270 return tm; … … 279 318 #endif 280 319 tm->timezone = MRB_TIMEZONE_LOCAL; 281 mrb_time_update_datetime(tm);320 time_update_datetime(mrb, tm); 282 321 283 322 return tm; … … 317 356 nowtime.tm_sec = (int)asec; 318 357 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 319 367 if (timezone == MRB_TIMEZONE_UTC) { 320 368 nowsecs = timegm(&nowtime); … … 357 405 } 358 406 407 static struct mrb_time* 408 time_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 } 359 418 360 419 static mrb_value … … 366 425 367 426 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); 369 428 tm2 = DATA_CHECK_GET_PTR(mrb, other, &mrb_time_type, struct mrb_time); 370 429 eq_p = tm1 && tm2 && tm1->sec == tm2->sec && tm1->usec == tm2->usec; … … 380 439 381 440 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); 383 442 tm2 = DATA_CHECK_GET_PTR(mrb, other, &mrb_time_type, struct mrb_time); 384 443 if (!tm1 || !tm2) return mrb_nil_value(); … … 406 465 407 466 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); 409 468 return mrb_time_make(mrb, mrb_obj_class(mrb, self), (double)tm->sec+f, (double)tm->usec, tm->timezone); 410 469 } … … 418 477 419 478 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); 422 480 tm2 = DATA_CHECK_GET_PTR(mrb, other, &mrb_time_type, struct mrb_time); 423 481 if (tm2) { … … 439 497 struct mrb_time *tm; 440 498 441 tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);499 tm = time_get_ptr(mrb, self); 442 500 return mrb_fixnum_value(tm->datetime.tm_wday); 443 501 } … … 450 508 struct mrb_time *tm; 451 509 452 tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);510 tm = time_get_ptr(mrb, self); 453 511 return mrb_fixnum_value(tm->datetime.tm_yday + 1); 454 512 } … … 461 519 struct mrb_time *tm; 462 520 463 tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);521 tm = time_get_ptr(mrb, self); 464 522 return mrb_fixnum_value(tm->datetime.tm_year + 1900); 465 523 } … … 472 530 struct mrb_time *tm; 473 531 474 tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);532 tm = time_get_ptr(mrb, self); 475 533 if (tm->timezone <= MRB_TIMEZONE_NONE) return mrb_nil_value(); 476 534 if (tm->timezone >= MRB_TIMEZONE_LAST) return mrb_nil_value(); … … 485 543 mrb_time_asctime(mrb_state *mrb, mrb_value self) 486 544 { 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 489 559 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 494 561 len = snprintf(buf, sizeof(buf), "%s %s %02d %02d:%02d:%02d %s%d", 495 562 wday_names[d->tm_wday], mon_names[d->tm_mon], d->tm_mday, … … 497 564 tm->timezone == MRB_TIMEZONE_UTC ? "UTC " : "", 498 565 d->tm_year + 1900); 566 #endif 499 567 return mrb_str_new(mrb, buf, len); 500 568 } … … 507 575 struct mrb_time *tm; 508 576 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); 511 578 return mrb_fixnum_value(tm->datetime.tm_mday); 512 579 } … … 520 587 struct mrb_time *tm; 521 588 522 tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);589 tm = time_get_ptr(mrb, self); 523 590 return mrb_bool_value(tm->datetime.tm_isdst); 524 591 } … … 532 599 struct mrb_time *tm, *tm2; 533 600 534 tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);601 tm = time_get_ptr(mrb, self); 535 602 tm2 = (struct mrb_time *)mrb_malloc(mrb, sizeof(*tm)); 536 603 *tm2 = *tm; 537 604 tm2->timezone = MRB_TIMEZONE_UTC; 538 mrb_time_update_datetime(tm2);605 time_update_datetime(mrb, tm2); 539 606 return mrb_time_wrap(mrb, mrb_obj_class(mrb, self), tm2); 540 607 } … … 547 614 struct mrb_time *tm, *tm2; 548 615 549 tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);616 tm = time_get_ptr(mrb, self); 550 617 tm2 = (struct mrb_time *)mrb_malloc(mrb, sizeof(*tm)); 551 618 *tm2 = *tm; 552 619 tm2->timezone = MRB_TIMEZONE_LOCAL; 553 mrb_time_update_datetime(tm2);620 time_update_datetime(mrb, tm2); 554 621 return mrb_time_wrap(mrb, mrb_obj_class(mrb, self), tm2); 555 622 } … … 562 629 struct mrb_time *tm; 563 630 564 tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);631 tm = time_get_ptr(mrb, self); 565 632 return mrb_fixnum_value(tm->datetime.tm_hour); 566 633 } … … 576 643 struct mrb_time *tm; 577 644 645 n = mrb_get_args(mrb, "|iiiiiii", 646 &ayear, &amonth, &aday, &ahour, &amin, &asec, &ausec); 578 647 tm = (struct mrb_time*)DATA_PTR(self); 579 648 if (tm) { … … 582 651 mrb_data_init(self, NULL, &mrb_time_type); 583 652 584 n = mrb_get_args(mrb, "|iiiiiii",585 &ayear, &amonth, &aday, &ahour, &amin, &asec, &ausec);586 653 if (n == 0) { 587 654 tm = current_mrb_time(mrb); … … 600 667 { 601 668 mrb_value src; 669 struct mrb_time *t1, *t2; 602 670 603 671 mrb_get_args(mrb, "o", &src); … … 606 674 mrb_raise(mrb, E_TYPE_ERROR, "wrong argument class"); 607 675 } 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; 612 686 return copy; 613 687 } … … 620 694 struct mrb_time *tm; 621 695 622 tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);696 tm = time_get_ptr(mrb, self); 623 697 tm->timezone = MRB_TIMEZONE_LOCAL; 624 mrb_time_update_datetime(tm);698 time_update_datetime(mrb, tm); 625 699 return self; 626 700 } … … 633 707 struct mrb_time *tm; 634 708 635 tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);709 tm = time_get_ptr(mrb, self); 636 710 return mrb_fixnum_value(tm->datetime.tm_mday); 637 711 } … … 644 718 struct mrb_time *tm; 645 719 646 tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);720 tm = time_get_ptr(mrb, self); 647 721 return mrb_fixnum_value(tm->datetime.tm_min); 648 722 } … … 655 729 struct mrb_time *tm; 656 730 657 tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);731 tm = time_get_ptr(mrb, self); 658 732 return mrb_fixnum_value(tm->datetime.tm_mon + 1); 659 733 } … … 666 740 struct mrb_time *tm; 667 741 668 tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);742 tm = time_get_ptr(mrb, self); 669 743 return mrb_fixnum_value(tm->datetime.tm_sec); 670 744 } … … 678 752 struct mrb_time *tm; 679 753 680 tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);754 tm = time_get_ptr(mrb, self); 681 755 return mrb_float_value(mrb, (mrb_float)tm->sec + (mrb_float)tm->usec/1.0e6); 682 756 } … … 689 763 struct mrb_time *tm; 690 764 691 tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);765 tm = time_get_ptr(mrb, self); 692 766 if (tm->sec > MRB_INT_MAX || tm->sec < MRB_INT_MIN) { 693 767 return mrb_float_value(mrb, (mrb_float)tm->sec); … … 703 777 struct mrb_time *tm; 704 778 705 tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);779 tm = time_get_ptr(mrb, self); 706 780 if (tm->usec > MRB_INT_MAX || tm->usec < MRB_INT_MIN) { 707 781 return mrb_float_value(mrb, (mrb_float)tm->usec); … … 717 791 struct mrb_time *tm; 718 792 719 tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);793 tm = time_get_ptr(mrb, self); 720 794 tm->timezone = MRB_TIMEZONE_UTC; 721 mrb_time_update_datetime(tm);795 time_update_datetime(mrb, tm); 722 796 return self; 723 797 } … … 730 804 struct mrb_time *tm; 731 805 732 tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);806 tm = time_get_ptr(mrb, self); 733 807 return mrb_bool_value(tm->timezone == MRB_TIMEZONE_UTC); 734 808 } -
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-time/test/time.rb
r321 r331 11 11 12 12 assert('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) } 14 21 end 15 22 … … 38 45 t2 = t1.+(60) 39 46 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 } 41 52 end 42 53 … … 45 56 t2 = t1.-(60) 46 57 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 } 48 63 end 49 64 -
EcnlProtoTool/trunk/mruby-1.3.0/mrblib/array.rb
r321 r331 13 13 return to_enum :each unless block_given? 14 14 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 24 19 end 25 20 self -
EcnlProtoTool/trunk/mruby-1.3.0/mrblib/enum.rb
r321 r331 384 384 i = 0 385 385 self.each do |e| 386 n = e.hash<< (i % 16)386 n = (e.hash & (0x7fffffff >> (i % 16))) << (i % 16) 387 387 h ^= n 388 388 i += 1 -
EcnlProtoTool/trunk/mruby-1.3.0/mrblib/hash.rb
r321 r331 155 155 # ISO 15.2.13.4.23 156 156 def replace(hash) 157 raise TypeError, "can't convert argument into Hash" unless hash.respond_to?(:to_hash) 157 158 self.clear 158 159 hash = hash.to_hash … … 201 202 end 202 203 ## 203 # Return the contents of this hash as a string. 204 # Return the contents of this hash as a string. 204 205 # 205 206 # 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> 3 3 4 4 extern const uint8_t mrblib_irep[]; -
EcnlProtoTool/trunk/mruby-1.3.0/mrblib/numeric.rb
r321 r331 101 101 # incremented by +step+ (default 1). 102 102 # 103 def step(num , step =1, &block)103 def step(num=nil, step=1, &block) 104 104 raise ArgumentError, "step can't be 0" if step == 0 105 105 return to_enum(:step, num, step) unless block_given? 106 106 107 107 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 108 115 if step > 0 109 116 while i <= num … … 161 168 # ISO 15.2.9 162 169 class Float 163 include Integral164 170 # mruby special - since mruby integers may be upgraded to floats, 165 171 # 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 194 173 end -
EcnlProtoTool/trunk/mruby-1.3.0/mrblib/range.rb
r321 r331 27 27 end 28 28 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 29 37 raise TypeError, "can't iterate" unless val.respond_to? :succ 30 38 … … 34 42 block.call(val) 35 43 val = val.succ 44 if str_each 45 break if val.size > last.size 46 end 36 47 end 37 48 -
EcnlProtoTool/trunk/mruby-1.3.0/mrblib/string.rb
r321 r331 10 10 # 11 11 # 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 13 16 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 19 24 self 20 25 end … … 35 40 when "'" 36 41 post 42 when "1", "2", "3", "4", "5", "6", "7", "8", "9" 43 "" 37 44 else 38 45 self[j, 2] … … 52 59 # ISO 15.2.10.5.18 53 60 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 71 89 end 72 90 … … 79 97 # ISO 15.2.10.5.19 80 98 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 81 101 str = self.gsub(*args, &block) 82 102 return nil if str == self … … 105 125 # ISO 15.2.10.5.36 106 126 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 113 147 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 116 152 end 117 153 … … 124 160 # ISO 15.2.10.5.37 125 161 def sub!(*args, &block) 162 raise RuntimeError, "can't modify frozen String" if frozen? 126 163 str = self.sub(*args, &block) 127 164 return nil if str == self … … 160 197 if anum == 2 161 198 pos, value = args 162 if pos.kind_of? String 199 case pos 200 when String 163 201 posnum = self.index(pos) 164 202 if posnum … … 166 204 a = self[(posnum + pos.length)..-1] 167 205 self.replace([b, value, a].join('')) 168 return value169 206 else 170 207 raise IndexError, "string not matched" 171 208 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 172 217 else 173 218 pos += self.length if pos < 0 … … 178 223 a = self[pos + 1..-1] 179 224 self.replace([b, value, a].join('')) 180 return value181 end225 end 226 return value 182 227 elsif anum == 3 183 228 pos, len, value = args -
EcnlProtoTool/trunk/mruby-1.3.0/src/array.c
r321 r331 5 5 */ 6 6 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> 12 12 #include "value_array.h" 13 13 … … 17 17 #define ARY_MAX_SIZE ((ARY_C_MAX_SIZE < (size_t)MRB_INT_MAX) ? (mrb_int)ARY_C_MAX_SIZE : MRB_INT_MAX-1) 18 18 19 static inline mrb_value20 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 28 19 static struct RArray* 29 20 ary_new_capa(mrb_state *mrb, mrb_int capa) 30 21 { 31 22 struct RArray *a; 32 mrb_int blen;23 size_t blen; 33 24 34 25 if (capa > ARY_MAX_SIZE) { … … 36 27 } 37 28 blen = capa * sizeof(mrb_value); 38 if (blen < capa) {39 mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big");40 }41 29 42 30 a = (struct RArray*)mrb_obj_alloc(mrb, MRB_TT_ARRAY, mrb->array_class); … … 121 109 ary_modify(mrb_state *mrb, struct RArray *a) 122 110 { 111 if (MRB_FROZEN_P(a)) { 112 mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen array"); 113 } 114 123 115 if (ARY_SHARED_P(a)) { 124 116 mrb_shared_array *shared = a->aux.shared; … … 179 171 180 172 if (len > ARY_MAX_SIZE) { 173 size_error: 181 174 mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); 182 175 } … … 186 179 } 187 180 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 } 192 191 193 192 if (capa > a->aux.capa) { … … 244 243 245 244 static mrb_value 246 mrb_ary_s_create(mrb_state *mrb, mrb_value self) 247 { 245 mrb_ary_s_create(mrb_state *mrb, mrb_value klass) 246 { 247 mrb_value ary; 248 248 mrb_value *vals; 249 249 mrb_int len; 250 struct RArray *a; 250 251 251 252 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; 254 258 } 255 259 256 260 static void 257 ary_concat(mrb_state *mrb, struct RArray *a, mrb_value *ptr, mrb_int blen) 258 { 259 mrb_int len = a->len + blen; 261 ary_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; 260 269 261 270 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); 264 275 mrb_write_barrier(mrb, (struct RBasic*)a); 265 276 a->len = len; … … 271 282 struct RArray *a2 = mrb_ary_ptr(other); 272 283 273 ary_concat(mrb, mrb_ary_ptr(self), a2 ->ptr, a2->len);284 ary_concat(mrb, mrb_ary_ptr(self), a2); 274 285 } 275 286 … … 277 288 mrb_ary_concat_m(mrb_state *mrb, mrb_value self) 278 289 { 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); 284 294 return self; 285 295 } … … 319 329 mrb_ary_replace(mrb_state *mrb, mrb_value self, mrb_value other) 320 330 { 331 struct RArray *a1 = mrb_ary_ptr(self); 321 332 struct RArray *a2 = mrb_ary_ptr(other); 322 333 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 } 324 337 } 325 338 … … 433 446 struct RArray *a = mrb_ary_ptr(ary); 434 447 448 ary_modify(mrb, a); 435 449 if (a->len == 0) return mrb_nil_value(); 436 450 return a->ptr[--a->len]; … … 445 459 mrb_value val; 446 460 461 ary_modify(mrb, a); 447 462 if (a->len == 0) return mrb_nil_value(); 448 463 if (ARY_SHARED_P(a)) { … … 507 522 508 523 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 } 509 527 if (ARY_SHARED_P(a) 510 528 && a->aux.shared->refcnt == 1 /* shared only referenced from this array */ … … 564 582 } 565 583 584 static struct RArray* 585 ary_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 566 593 MRB_API mrb_value 567 594 mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_value rpl) 568 595 { 569 596 struct RArray *a = mrb_ary_ptr(ary); 570 mrb_int tail, size;571 597 const mrb_value *argv; 572 mrb_int i, argc; 598 mrb_int argc; 599 mrb_int tail; 573 600 574 601 ary_modify(mrb, a); … … 584 611 } 585 612 } 586 if (a->len < len || a->len < head + len) { 613 tail = head + len; 614 if (a->len < len || a->len < tail) { 587 615 len = a->len - head; 588 616 } 589 tail = head + len;590 617 591 618 /* size check */ … … 593 620 argc = RARRAY_LEN(rpl); 594 621 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 } 595 631 } 596 632 else { … … 598 634 argv = &rpl; 599 635 } 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 } 607 644 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); 620 671 return ary; 621 672 } … … 703 754 /* a[n..m] */ 704 755 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) { 706 757 return ary_subseq(mrb, a, i, len); 707 758 } … … 767 818 mrb_int i, len; 768 819 820 mrb_ary_modify(mrb, mrb_ary_ptr(self)); 769 821 if (mrb_get_args(mrb, "oo|o", &v1, &v2, &v3) == 2) { 770 switch (mrb_type(v1)) {771 822 /* 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); 776 826 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); 780 829 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); 783 832 break; 784 833 } … … 878 927 { 879 928 mrb_value obj; 880 mrb_int i ;929 mrb_int i, len; 881 930 882 931 mrb_get_args(mrb, "o", &obj); … … 885 934 return mrb_fixnum_value(i); 886 935 } 936 if (i > (len = RARRAY_LEN(self))) { 937 i = len; 938 } 887 939 } 888 940 return mrb_nil_value(); … … 892 944 mrb_ary_splat(mrb_state *mrb, mrb_value v) 893 945 { 946 mrb_value a, recv_class; 947 894 948 if (mrb_array_p(v)) { 895 949 return v; 896 950 } 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); 899 962 } 900 963 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(); 902 972 } 903 973 } … … 916 986 struct RArray *a = mrb_ary_ptr(self); 917 987 988 ary_modify(mrb, a); 918 989 if (ARY_SHARED_P(a)) { 919 990 mrb_ary_decref(mrb, a->aux.shared); … … 988 1059 989 1060 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 } 999 1072 } 1000 1073 val = mrb_obj_as_string(mrb, val); … … 1011 1084 mrb_ary_join(mrb_state *mrb, mrb_value ary, mrb_value sep) 1012 1085 { 1013 sep = mrb_obj_as_string(mrb, sep); 1086 if (!mrb_nil_p(sep)) { 1087 sep = mrb_obj_as_string(mrb, sep); 1088 } 1014 1089 return join_ary(mrb, ary, sep, mrb_ary_new(mrb)); 1015 1090 } … … 1091 1166 mrb_define_method(mrb, a, "pop", mrb_ary_pop, MRB_ARGS_NONE()); /* 15.2.12.5.21 */ 1092 1167 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()); 1093 1169 mrb_define_method(mrb, a, "replace", mrb_ary_replace_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.23 */ 1094 1170 mrb_define_method(mrb, a, "reverse", mrb_ary_reverse, MRB_ARGS_NONE()); /* 15.2.12.5.24 */ … … 1099 1175 mrb_define_method(mrb, a, "slice", mrb_ary_aget, MRB_ARGS_ANY()); /* 15.2.12.5.29 */ 1100 1176 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()); 1101 1178 1102 1179 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 5 5 */ 6 6 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> 16 17 17 18 struct backtrace_location { 18 int i;19 19 int lineno; 20 20 const char *filename; 21 const char *method; 22 const char *sep; 23 const char *class_name; 21 mrb_sym method_id; 24 22 }; 25 23 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; 24 typedef void (*each_backtrace_func)(mrb_state*, int i, struct backtrace_location*, void*); 25 26 static const mrb_data_type bt_type = { "Backtrace", mrb_free }; 27 28 static void 29 each_backtrace(mrb_state *mrb, mrb_int ciidx, mrb_code *pc0, each_backtrace_func func, void *data) 30 { 31 int i, j; 95 32 96 33 if (ciidx >= mrb->c->ciend - mrb->c->cibase) 97 34 ciidx = 10; /* ciidx is broken... */ 98 35 99 for (i = ciidx; i >= 0; i--) {36 for (i=ciidx, j=0; i >= 0; i--,j++) { 100 37 struct backtrace_location loc; 101 38 mrb_callinfo *ci; … … 109 46 110 47 irep = ci->proc->body.irep; 48 if (!irep) continue; 111 49 112 50 if (mrb->c->cibase[i].err) { … … 124 62 if (loc.lineno == -1) continue; 125 63 126 if (ci->target_class == ci->proc->target_class) {127 loc.sep = ".";128 }129 else {130 loc.sep = "#";131 }132 133 64 if (!loc.filename) { 134 65 loc.filename = "(unknown)"; 135 66 } 136 67 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 75 static void 76 print_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 94 static void 95 print_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. 166 127 */ 167 168 #ifndef MRB_DISABLE_STDIO169 128 170 129 MRB_API void 171 130 mrb_print_backtrace(mrb_state *mrb) 172 131 { 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) { 176 135 return; 177 136 } 178 137 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 } 184 147 #else 185 148 … … 191 154 #endif 192 155 156 static void 157 pack_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 167 static mrb_value 168 packed_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 183 void 184 mrb_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 194 mrb_value 195 mrb_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 193 228 MRB_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; 229 mrb_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; 202 242 } 203 243 … … 205 245 mrb_get_backtrace(mrb_state *mrb) 206 246 { 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 6 6 7 7 #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> 17 18 18 19 KHASH_DEFINE(mt, mrb_sym, struct RProc*, TRUE, kh_int_hash_func, kh_int_hash_equal) … … 97 98 else { 98 99 sc->super = o->c; 100 prepare_singleton_class(mrb, (struct RBasic*)sc); 99 101 } 100 102 o->c = sc; … … 122 124 } 123 125 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) 126 static mrb_bool 127 class_ptr_p(mrb_value obj) 136 128 { 137 129 switch (mrb_type(obj)) { … … 139 131 case MRB_TT_SCLASS: 140 132 case MRB_TT_MODULE: 141 return ;133 return TRUE; 142 134 default: 135 return FALSE; 136 } 137 } 138 139 MRB_API struct RClass* 140 mrb_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 160 static void 161 check_if_class_or_module(mrb_state *mrb, mrb_value obj) 162 { 163 if (!class_ptr_p(obj)) { 143 164 mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a class/module", mrb_inspect(mrb, obj)); 144 165 } … … 175 196 { 176 197 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 } 177 206 return define_module(mrb, id, mrb_class_ptr(outer)); 178 207 } … … 232 261 } 233 262 263 static mrb_value mrb_bob_init(mrb_state *mrb, mrb_value cv); 264 234 265 static void 235 266 mrb_class_inherited(mrb_state *mrb, struct RClass *super, struct RClass *klass) 236 267 { 268 mrb_value s; 269 mrb_sym mid; 270 237 271 if (!super) 238 272 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 } 240 279 } 241 280 … … 248 287 if (!mrb_nil_p(super)) { 249 288 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)); 251 291 } 252 292 s = mrb_class_ptr(super); … … 256 296 } 257 297 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 } 258 313 c = define_class(mrb, id, s, mrb_class_ptr(outer)); 259 314 mrb_class_inherited(mrb, mrb_class_real(c->super), c); … … 272 327 } 273 328 329 MRB_API mrb_bool 330 mrb_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 274 339 MRB_API struct RClass * 275 340 mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name) … … 282 347 { 283 348 return mrb_class_get_under(mrb, mrb->object_class, name); 349 } 350 351 MRB_API struct RClass * 352 mrb_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; 284 369 } 285 370 … … 337 422 h = c->mt; 338 423 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 } 339 430 if (!h) h = c->mt = kh_init(mt, mrb); 340 431 k = kh_put(mt, mrb, h, mid); 341 432 kh_value(h, k) = p; 342 433 if (p) { 434 p->c = NULL; 343 435 mrb_field_write_barrier(mrb, (struct RBasic *)c, (struct RBasic *)p); 344 436 } … … 430 522 mrb_value obj = mrb_funcall(mrb, ss, "inspect", 0); 431 523 mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", obj); 524 /* not reached */ 525 return 0; 432 526 } 433 527 } … … 457 551 n: Symbol [mrb_sym] 458 552 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*] 459 554 &: Block [mrb_value] 460 555 *: rest argument [mrb_value*,mrb_int] Receive the rest of the arguments as an array. … … 467 562 char c; 468 563 int i = 0; 469 mrb_value *sp = mrb->c->stack + 1;470 564 va_list ap; 471 565 int argc = mrb->c->ci->argc; 566 int arg_i = 0; 567 mrb_bool array_argv; 472 568 mrb_bool opt = FALSE; 473 569 mrb_bool given = TRUE; … … 478 574 479 575 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 482 585 while ((c = *format++)) { 483 586 switch (c) { … … 503 606 p = va_arg(ap, mrb_value*); 504 607 if (i < argc) { 505 *p = *sp++;608 *p = ARGV[arg_i++]; 506 609 i++; 507 610 } … … 516 619 mrb_value ss; 517 620 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)) { 525 623 mrb_raisef(mrb, E_TYPE_ERROR, "%S is not class/module", ss); 526 break;527 624 } 528 625 *p = ss; … … 538 635 if (*format == '!') { 539 636 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++]; 542 639 i++; 543 640 break; … … 545 642 } 546 643 if (i < argc) { 547 *p = to_str(mrb, *sp++);644 *p = to_str(mrb, ARGV[arg_i++]); 548 645 i++; 549 646 } … … 557 654 if (*format == '!') { 558 655 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++]; 561 658 i++; 562 659 break; … … 564 661 } 565 662 if (i < argc) { 566 *p = to_ary(mrb, *sp++);663 *p = to_ary(mrb, ARGV[arg_i++]); 567 664 i++; 568 665 } … … 576 673 if (*format == '!') { 577 674 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++]; 580 677 i++; 581 678 break; … … 583 680 } 584 681 if (i < argc) { 585 *p = to_hash(mrb, *sp++);682 *p = to_hash(mrb, ARGV[arg_i++]); 586 683 i++; 587 684 } … … 598 695 if (*format == '!') { 599 696 format++; 600 if (i < argc && mrb_nil_p( *sp)) {697 if (i < argc && mrb_nil_p(ARGV[arg_i])) { 601 698 *ps = NULL; 602 699 *pl = 0; 603 i++; 700 i++; arg_i++; 604 701 break; 605 702 } 606 703 } 607 704 if (i < argc) { 608 ss = to_str(mrb, *sp++);705 ss = to_str(mrb, ARGV[arg_i++]); 609 706 *ps = RSTRING_PTR(ss); 610 707 *pl = RSTRING_LEN(ss); … … 621 718 if (*format == '!') { 622 719 format++; 623 if (i < argc && mrb_nil_p( *sp)) {720 if (i < argc && mrb_nil_p(ARGV[arg_i])) { 624 721 *ps = NULL; 625 i++; sp++;722 i++; arg_i++; 626 723 break; 627 724 } 628 725 } 629 726 if (i < argc) { 630 ss = to_str(mrb, *sp++);727 ss = to_str(mrb, ARGV[arg_i++]); 631 728 *ps = mrb_string_value_cstr(mrb, &ss); 632 729 i++; … … 645 742 if (*format == '!') { 646 743 format++; 647 if (i < argc && mrb_nil_p( *sp)) {744 if (i < argc && mrb_nil_p(ARGV[arg_i])) { 648 745 *pb = 0; 649 746 *pl = 0; 650 i++; sp++;747 i++; arg_i++; 651 748 break; 652 749 } 653 750 } 654 751 if (i < argc) { 655 aa = to_ary(mrb, *sp++);752 aa = to_ary(mrb, ARGV[arg_i++]); 656 753 a = mrb_ary_ptr(aa); 657 754 *pb = a->ptr; … … 661 758 } 662 759 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; 663 778 case 'f': 664 779 { … … 667 782 p = va_arg(ap, mrb_float*); 668 783 if (i < argc) { 669 *p = mrb_to_flo(mrb, *sp);670 sp++;784 *p = mrb_to_flo(mrb, ARGV[arg_i]); 785 arg_i++; 671 786 i++; 672 787 } … … 679 794 p = va_arg(ap, mrb_int*); 680 795 if (i < argc) { 681 switch (mrb_type( *sp)) {796 switch (mrb_type(ARGV[arg_i])) { 682 797 case MRB_TT_FIXNUM: 683 *p = mrb_fixnum( *sp);798 *p = mrb_fixnum(ARGV[arg_i]); 684 799 break; 685 800 case MRB_TT_FLOAT: 686 801 { 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)) { 690 805 mrb_raise(mrb, E_RANGE_ERROR, "float too big for int"); 691 806 } … … 697 812 break; 698 813 default: 699 *p = mrb_fixnum(mrb_Integer(mrb, *sp));814 *p = mrb_fixnum(mrb_Integer(mrb, ARGV[arg_i])); 700 815 break; 701 816 } 702 sp++;817 arg_i++; 703 818 i++; 704 819 } … … 710 825 711 826 if (i < argc) { 712 mrb_value b = *sp++;827 mrb_value b = ARGV[arg_i++]; 713 828 *boolp = mrb_test(b); 714 829 i++; … … 724 839 mrb_value ss; 725 840 726 ss = *sp++;841 ss = ARGV[arg_i++]; 727 842 *symp = to_sym(mrb, ss); 728 843 i++; … … 739 854 if (*format == '!') { 740 855 format++; 741 if (i < argc && mrb_nil_p( *sp)) {856 if (i < argc && mrb_nil_p(ARGV[arg_i])) { 742 857 *datap = 0; 743 i++; sp++;858 i++; arg_i++; 744 859 break; 745 860 } 746 861 } 747 862 if (i < argc) { 748 *datap = mrb_data_get_ptr(mrb, *sp++, type);863 *datap = mrb_data_get_ptr(mrb, ARGV[arg_i++], type); 749 864 ++i; 750 865 } … … 788 903 *pl = argc-i; 789 904 if (*pl > 0) { 790 *var = sp;905 *var = ARGV + arg_i; 791 906 } 792 907 i = argc; 793 sp+= *pl;908 arg_i += *pl; 794 909 } 795 910 else { … … 804 919 } 805 920 } 921 922 #undef ARGV 923 806 924 if (!c && argc > i) { 807 925 mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); … … 831 949 boot_initmod(mrb_state *mrb, struct RClass *mod) 832 950 { 833 mod->mt = kh_init(mt, mrb); 951 if (!mod->mt) { 952 mod->mt = kh_init(mt, mrb); 953 } 834 954 } 835 955 … … 847 967 if (m->tt == MRB_TT_ICLASS) { 848 968 ic->c = m->c; 849 } else { 969 } 970 else { 850 971 ic->c = m; 851 972 } … … 873 994 if (p->mt == m->mt) { 874 995 if (!superclass_seen) { 875 ins_pos = p; / / move insert point996 ins_pos = p; /* move insert point */ 876 997 } 877 998 goto skip; … … 937 1058 938 1059 static 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_value957 1060 mrb_mod_append_features(mrb_state *mrb, mrb_value mod) 958 1061 { … … 963 1066 mrb_include_module(mrb, mrb_class_ptr(klass), mrb_class_ptr(mod)); 964 1067 return mod; 965 }966 967 static mrb_value968 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;983 1068 } 984 1069 … … 1076 1161 mrb_value b; 1077 1162 struct RClass *m = mrb_class_ptr(mod); 1078 boot_initmod(mrb, m); / / bootstrap a newly initialized module1163 boot_initmod(mrb, m); /* bootstrap a newly initialized module */ 1079 1164 mrb_get_args(mrb, "|&", &b); 1080 1165 if (!mrb_nil_p(b)) { … … 1156 1241 obj = mrb_basic_ptr(v); 1157 1242 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 }1162 1243 return mrb_obj_value(obj->c); 1163 1244 } … … 1320 1401 1321 1402 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 } 1322 1406 o = (struct RObject*)mrb_obj_alloc(mrb, ttype, c); 1323 1407 return mrb_obj_value(o); … … 1354 1438 { 1355 1439 mrb_value obj; 1440 mrb_sym mid; 1356 1441 1357 1442 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 } 1360 1447 return obj; 1361 1448 } … … 1379 1466 mrb_value super, blk; 1380 1467 mrb_value new_class; 1468 mrb_sym mid; 1381 1469 1382 1470 n = mrb_get_args(mrb, "|C&", &super, &blk); … … 1385 1473 } 1386 1474 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 } 1388 1479 mrb_class_inherited(mrb, mrb_class_ptr(super), mrb_class_ptr(new_class)); 1389 1480 return new_class; … … 1416 1507 } 1417 1508 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 */ 1444 1512 /* 1445 1513 * 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 1475 1539 */ 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(); 1540 mrb_value 1541 mrb_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 1549 static mrb_value 1550 mrb_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)); 1487 1556 } 1488 1557 … … 1533 1602 return mrb_nil_value(); 1534 1603 } 1535 else if (outer && outer != mrb->object_class) {1604 else if (outer && outer != c && outer != mrb->object_class) { 1536 1605 mrb_value base = mrb_class_path(mrb, outer); 1537 1606 path = mrb_str_buf_new(mrb, 0); … … 1552 1621 path = mrb_str_new(mrb, name, len); 1553 1622 } 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); 1557 1628 } 1558 1629 … … 1699 1770 str = mrb_str_new_lit(mrb, "#<Class:"); 1700 1771 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)); 1710 1777 } 1711 1778 return mrb_str_cat_lit(mrb, str, ">"); … … 1786 1853 mrb_get_args(mrb, "*", &argv, &argc); 1787 1854 while (argc--) { 1788 undef_method(mrb, c, mrb_symbol(*argv));1855 undef_method(mrb, c, to_sym(mrb, *argv)); 1789 1856 argv++; 1790 1857 } … … 1798 1865 struct RProc *p; 1799 1866 mrb_sym mid; 1867 mrb_value proc = mrb_undef_value(); 1800 1868 mrb_value blk; 1801 1869 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 } 1803 1882 if (mrb_nil_p(blk)) { 1804 1883 mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given"); … … 2028 2107 mrb_get_args(mrb, "*", &argv, &argc); 2029 2108 while (argc--) { 2030 remove_method(mrb, mod, mrb_symbol(*argv));2109 remove_method(mrb, mod, to_sym(mrb, *argv)); 2031 2110 argv++; 2032 2111 } … … 2159 2238 2160 2239 mrb_get_args(mrb, "*", &argv, &argc); 2161 if (argc == 0) {2240 if (argc == 0) { 2162 2241 /* set MODFUNC SCOPE if implemented */ 2163 2242 return mod; … … 2182 2261 return mod; 2183 2262 } 2263 2264 /* implementation of __id__ */ 2265 mrb_value mrb_obj_id_m(mrb_state *mrb, mrb_value self); 2266 /* implementation of instance_eval */ 2267 mrb_value mrb_obj_instance_eval(mrb_state*, mrb_value); 2184 2268 2185 2269 void … … 2222 2306 mrb_define_method(mrb, bob, "initialize", mrb_bob_init, MRB_ARGS_NONE()); 2223 2307 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 */ 2225 2313 2226 2314 mrb_define_class_method(mrb, cls, "new", mrb_class_new_class, MRB_ARGS_OPT(1)); … … 2236 2324 mrb_define_method(mrb, mod, "extend_object", mrb_mod_extend_object, MRB_ARGS_REQ(1)); /* 15.2.2.4.25 */ 2237 2325 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());2239 2326 mrb_define_method(mrb, mod, "prepended", mrb_bob_init, MRB_ARGS_REQ(1)); 2240 2327 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 */2242 2328 mrb_define_method(mrb, mod, "include?", mrb_mod_include_p, MRB_ARGS_REQ(1)); /* 15.2.2.4.28 */ 2243 2329 mrb_define_method(mrb, mod, "append_features", mrb_mod_append_features, MRB_ARGS_REQ(1)); /* 15.2.2.4.10 */ … … 2269 2355 mrb_define_method(mrb, mod, "remove_const", mrb_mod_remove_const, MRB_ARGS_REQ(1)); /* 15.2.2.4.40 */ 2270 2356 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)); 2272 2358 mrb_define_method(mrb, mod, "class_variables", mrb_mod_class_variables, MRB_ARGS_NONE()); /* 15.2.2.4.19 */ 2273 2359 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> 7 7 8 8 #ifndef MRB_DISABLE_STDIO … … 240 240 switch (GETARG_B(c)) { 241 241 case OP_R_NORMAL: 242 printf("\tnormal\t"); break; 242 243 case OP_R_RETURN: 243 244 printf("\treturn\t"); break; … … 246 247 default: 247 248 printf("\tbroken\t"); break; 248 break;249 249 } 250 250 print_lv(mrb, irep, c, RA); … … 260 260 261 261 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 } 263 271 print_lv(mrb, irep, c, RA); 264 272 break; … … 324 332 break; 325 333 case OP_EQ: 326 printf("OP_EQ\t R%d\t:%s\t%d\n", GETARG_A(c),334 printf("OP_EQ\t\tR%d\t:%s\t%d\n", GETARG_A(c), 327 335 mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), 328 336 GETARG_C(c)); … … 410 418 break; 411 419 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 } 414 436 break; 415 437 case OP_RAISE: … … 418 440 break; 419 441 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)); 422 443 break; 423 444 case OP_EPOP: -
EcnlProtoTool/trunk/mruby-1.3.0/src/compar.c
r321 r331 5 5 */ 6 6 7 #include "mruby.h"7 #include <mruby.h> 8 8 9 9 void -
EcnlProtoTool/trunk/mruby-1.3.0/src/debug.c
r321 r331 1 1 #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> 5 5 6 6 static mrb_irep_debug_info_file * … … 20 20 ret = it + 1; 21 21 count -= step + 1; 22 } else { count = step; } 22 } 23 else { count = step; } 23 24 } 24 25 … … 87 88 ret = it + 1; 88 89 count -= step + 1; 89 } else { count = step; } 90 } 91 else { count = step; } 90 92 } 91 93 -
EcnlProtoTool/trunk/mruby-1.3.0/src/dump.c
r321 r331 7 7 #include <string.h> 8 8 #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> 14 14 15 15 #define FLAG_BYTEORDER_NATIVE 2 … … 55 55 uint8_t *cur = buf; 56 56 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 */ 58 58 cur += uint16_to_bin((uint16_t)irep->nlocals, cur); /* number of local variable */ 59 59 cur += uint16_to_bin((uint16_t)irep->nregs, cur); /* number of register variable */ … … 408 408 if (irep->filename) { 409 409 filename_len = strlen(irep->filename); 410 } else { 410 } 411 else { 411 412 filename_len = 0; 412 413 } … … 1060 1061 } 1061 1062 if (fprintf(fp, 1063 "extern const uint8_t %s[];\n" 1062 1064 "const uint8_t\n" 1063 1065 "#if defined __GNUC__\n" … … 1067 1069 "#endif\n" 1068 1070 "%s[] = {", 1071 initname, 1069 1072 (uint16_t)MRB_DUMP_ALIGNMENT, (uint16_t)MRB_DUMP_ALIGNMENT, initname) < 0) { 1070 1073 mrb_free(mrb, bin); -
EcnlProtoTool/trunk/mruby-1.3.0/src/enum.c
r321 r331 5 5 */ 6 6 7 #include "mruby.h"7 #include <mruby.h> 8 8 9 9 void -
EcnlProtoTool/trunk/mruby-1.3.0/src/error.c
r321 r331 8 8 #include <stdarg.h> 9 9 #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> 20 20 21 21 MRB_API mrb_value … … 45 45 { 46 46 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) { 49 51 mrb_iv_set(mrb, exc, mrb_intern_lit(mrb, "mesg"), mesg); 50 52 } … … 61 63 * return the receiver. Otherwise, create a new 62 64 * 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>. 64 66 * 65 67 */ … … 110 112 * 111 113 * 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. 115 115 */ 116 116 … … 136 136 mrb_value str, mesg, file, line; 137 137 mrb_bool append_mesg; 138 const char *cname; 138 139 139 140 mesg = mrb_attr_get(mrb, exc, mrb_intern_lit(mrb, "mesg")); … … 147 148 } 148 149 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)) { 154 153 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 166 void mrb_keep_backtrace(mrb_state *mrb, mrb_value exc); 167 168 static void 169 set_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"); 162 174 } 163 175 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 187 static mrb_value 188 exc_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 } 177 196 178 197 static void … … 182 201 mrb_code *pc = ci->pc; 183 202 184 mrb_obj_iv_set(mrb, exc, mrb_intern_lit(mrb, "ciidx"), mrb_fixnum_value((mrb_int)(ci - mrb->c->cibase)));185 203 while (ci >= mrb->c->cibase) { 186 204 mrb_code *err = ci->err; … … 203 221 } 204 222 223 void 224 mrb_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 205 238 MRB_API mrb_noreturn void 206 239 mrb_exc_raise(mrb_state *mrb, mrb_value exc) 207 240 { 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); 212 245 if (!mrb->jmp) { 213 246 mrb_p(mrb, exc); … … 220 253 mrb_raise(mrb_state *mrb, struct RClass *c, const char *msg) 221 254 { 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))); 225 256 } 226 257 … … 232 263 ptrdiff_t size; 233 264 mrb_value ary = mrb_ary_new_capa(mrb, 4); 265 int ai = mrb_gc_arena_save(mrb); 234 266 235 267 while (*p) { … … 255 287 } 256 288 } 289 mrb_gc_arena_restore(mrb, ai); 257 290 } 258 291 if (b == format) { … … 261 294 else { 262 295 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()); 265 301 } 266 302 } … … 279 315 } 280 316 317 static mrb_noreturn void 318 raise_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 281 332 MRB_API mrb_noreturn void 282 333 mrb_raisef(mrb_state *mrb, struct RClass *c, const char *fmt, ...) 283 334 { 284 335 va_list args; 285 mrb_value mesg;286 336 287 337 va_start(args, fmt); 288 mesg = mrb_vformat(mrb, fmt, args);338 raise_va(mrb, c, fmt, args, 0, NULL); 289 339 va_end(args); 290 mrb_exc_raise(mrb, mrb_exc_new_str(mrb, c, mesg));291 340 } 292 341 … … 294 343 mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...) 295 344 { 296 mrb_value exc;297 345 mrb_value argv[2]; 298 346 va_list args; 299 347 300 348 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); 302 351 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);307 352 } 308 353 … … 338 383 } 339 384 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) 385 MRB_API mrb_value 386 mrb_make_exception(mrb_state *mrb, int argc, const mrb_value *argv) 348 387 { 349 388 mrb_value mesg; … … 357 396 if (mrb_nil_p(argv[0])) 358 397 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; 365 401 } 366 402 n = 0; … … 389 425 if (argc > 0) { 390 426 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"); 392 428 if (argc > 2) 393 429 set_backtrace(mrb, mesg, argv[2]); 394 430 } 395 431 396 432 return mesg; 397 }398 399 MRB_API mrb_value400 mrb_make_exception(mrb_state *mrb, int argc, const mrb_value *argv)401 {402 return make_exception(mrb, argc, argv, TRUE);403 433 } 404 434 … … 428 458 { 429 459 mrb_value exc; 460 mrb_value argv[3]; 430 461 va_list ap; 431 462 432 463 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; 435 467 va_end(ap); 468 exc = mrb_obj_new(mrb, E_NOMETHOD_ERROR, 3, argv); 436 469 mrb_exc_raise(mrb, exc); 437 470 } … … 440 473 mrb_init_exception(mrb_state *mrb) 441 474 { 442 struct RClass *exception, * runtime_error, *script_error;475 struct RClass *exception, *script_error, *stack_error, *nomem_error; 443 476 444 477 mrb->eException_class = exception = mrb_define_class(mrb, "Exception", mrb->object_class); /* 15.2.22 */ … … 451 484 mrb_define_method(mrb, exception, "inspect", exc_inspect, MRB_ARGS_NONE()); 452 485 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)); 453 487 454 488 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 */ 457 490 script_error = mrb_define_class(mrb, "ScriptError", mrb->eException_class); /* 15.2.37 */ 458 491 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 1 1 /* this header file is to be removed soon. 2 2 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 5 5 */ 6 6 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> 13 13 14 14 MRB_API struct RData* … … 140 140 case MRB_TT_FILE: 141 141 case MRB_TT_DATA: 142 case MRB_TT_ISTRUCT: 142 143 default: 143 144 return MakeID(mrb_ptr(obj)); … … 180 181 mrb_regexp_p(mrb_state *mrb, mrb_value v) 181 182 { 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; 183 195 } 184 196 -
EcnlProtoTool/trunk/mruby-1.3.0/src/fmt_fp.c
r321 r331 34 34 #include <ctype.h> 35 35 36 #include "mruby.h"37 #include "mruby/string.h"36 #include <mruby.h> 37 #include <mruby/string.h> 38 38 39 39 struct fmt_args { … … 157 157 s=buf; 158 158 do { 159 int x= y;159 int x=(int)y; 160 160 *s++=xdigits[x]|(t&32); 161 161 y=16*(y-x); … … 185 185 186 186 do { 187 *z = y;187 *z = (uint32_t)y; 188 188 y = 1000000000*(y-*z++); 189 189 } while (y); … … 195 195 uint64_t x = ((uint64_t)*d<<sh)+carry; 196 196 *d = x % 1000000000; 197 carry = x / 1000000000;197 carry = (uint32_t)(x / 1000000000); 198 198 } 199 199 if (carry) *--a = carry; … … 254 254 } 255 255 for (; z>a && !z[-1]; z--); 256 256 257 257 if ((t|32)=='g') { 258 258 if (!p) p++; … … 355 355 default: 356 356 return -1; 357 } 357 } 358 358 } 359 359 -
EcnlProtoTool/trunk/mruby-1.3.0/src/gc.c
r321 r331 7 7 #include <string.h> 8 8 #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> 20 21 21 22 /* … … 66 67 mruby implementer and C extension library writer must insert a write 67 68 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, 69 70 two different types of write barrier are available: 70 71 … … 110 111 struct RData data; 111 112 struct RProc proc; 113 struct REnv env; 112 114 struct RException exc; 115 struct RBreak brk; 113 116 #ifdef MRB_WORD_BOXING 114 117 struct RFloat floatv; … … 138 141 fprintf(stderr, "gc_invoke: %19.3f\n", gettimeofday_time() - program_invoke_time);\ 139 142 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));\ 141 144 } while(0) 142 145 … … 214 217 215 218 p2 = mrb_realloc_simple(mrb, p, len); 216 if (!p2 && len) { 219 if (len == 0) return p2; 220 if (p2 == NULL) { 217 221 if (mrb->gc.out_of_memory) { 222 mrb_exc_raise(mrb, mrb_obj_value(mrb->nomem_err)); 218 223 /* mrb_panic(mrb); */ 219 224 } … … 367 372 } 368 373 369 static void obj_free(mrb_state *mrb, struct RBasic *obj );374 static void obj_free(mrb_state *mrb, struct RBasic *obj, int end); 370 375 371 376 void … … 381 386 for (p = objects(tmp), e=p+MRB_HEAP_PAGE_SIZE; p<e; p++) { 382 387 if (p->as.free.tt != MRB_TT_FREE) 383 obj_free(mrb, &p->as.basic );388 obj_free(mrb, &p->as.basic, TRUE); 384 389 } 385 390 mrb_free(mrb, tmp); … … 403 408 /* arena overflow error */ 404 409 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)); 406 411 } 407 412 #else … … 429 434 Register your object when it's exported to C world, 430 435 without reference from Ruby world, e.g. callback 431 arguments. Don't forget to remove the ob ejct using436 arguments. Don't forget to remove the object using 432 437 mrb_gc_unregister, otherwise your object will leak. 433 438 */ … … 453 458 mrb_value table = mrb_gv_get(mrb, root); 454 459 struct RArray *a; 455 mrb_int i , j;460 mrb_int i; 456 461 457 462 if (mrb_nil_p(table)) return; … … 462 467 a = mrb_ary_ptr(table); 463 468 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 } 470 476 } 471 477 … … 476 482 static const RVALUE RVALUE_zero = { { { MRB_TT_FALSE } } }; 477 483 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 } 478 506 479 507 #ifdef MRB_GC_STRESS … … 520 548 size_t i; 521 549 size_t e; 522 550 mrb_value nil; 551 int nregs; 552 553 if (c->stack == NULL) return; 523 554 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 } 525 561 if (c->stbase + e > c->stend) e = c->stend - c->stbase; 526 562 for (i=0; i<e; i++) { … … 528 564 529 565 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; 537 573 } 538 574 } … … 541 577 mark_context(mrb_state *mrb, struct mrb_context *c) 542 578 { 543 int i , e = 0;579 int i; 544 580 mrb_callinfo *ci; 545 581 546 /* mark stack */582 /* mark VM stack */ 547 583 mark_context_stack(mrb, c); 548 584 549 /* mark VMstack */585 /* mark call stack */ 550 586 if (c->cibase) { 551 587 for (ci = c->cibase; ci <= c->ci; ci++) { 552 if (ci->eidx > e) {553 e = ci->eidx;554 }555 588 mrb_gc_mark(mrb, (struct RBasic*)ci->env); 556 589 mrb_gc_mark(mrb, (struct RBasic*)ci->proc); … … 559 592 } 560 593 /* 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; 562 596 mrb_gc_mark(mrb, (struct RBasic*)c->ensure[i]); 563 597 } 564 598 /* 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); 567 602 } 568 603 } … … 614 649 { 615 650 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); 623 656 } 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]); 624 662 } 625 663 } … … 679 717 680 718 static void 681 obj_free(mrb_state *mrb, struct RBasic *obj )682 { 683 DEBUG( printf("obj_free(%p,tt=%d)\n",obj,obj->tt));719 obj_free(mrb_state *mrb, struct RBasic *obj, int end) 720 { 721 DEBUG(fprintf(stderr, "obj_free(%p,tt=%d)\n",obj,obj->tt)); 684 722 switch (obj->tt) { 685 723 /* immediate - no mark */ … … 698 736 699 737 case MRB_TT_OBJECT: 738 mrb_gc_free_iv(mrb, (struct RObject*)obj); 739 break; 740 700 741 case MRB_TT_EXCEPTION: 701 742 mrb_gc_free_iv(mrb, (struct RObject*)obj); … … 716 757 struct REnv *e = (struct REnv*)obj; 717 758 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; 721 762 } 763 mrb_free(mrb, e->stack); 764 e->stack = NULL; 722 765 } 723 766 break; … … 727 770 struct mrb_context *c = ((struct RFiber*)obj)->cxt; 728 771 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 } 730 784 mrb_free_context(mrb, c); 785 } 731 786 } 732 787 break; … … 781 836 root_scan_phase(mrb_state *mrb, mrb_gc *gc) 782 837 { 783 size_t i, e;838 int i, e; 784 839 785 840 if (!is_minor_gc(gc)) { … … 795 850 /* mark class hierarchy */ 796 851 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 797 872 /* mark top_self */ 798 873 mrb_gc_mark(mrb, (struct RBasic*)mrb->top_self); … … 801 876 /* mark pre-allocated exception */ 802 877 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); 808 884 if (mrb->root_c != mrb->c) { 809 mark_context(mrb, mrb-> c);885 mark_context(mrb, mrb->root_c); 810 886 } 811 887 } … … 859 935 860 936 /* mark ensure stack */ 861 children += (c->ci) ? c->ci->eidx : 0;937 children += c->eidx; 862 938 863 939 /* mark closure */ … … 920 996 final_marking_phase(mrb_state *mrb, mrb_gc *gc) 921 997 { 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); 923 1008 gc_mark_gray_list(mrb, gc); 924 1009 mrb_assert(gc->gray_list == NULL); … … 958 1043 if (is_dead(gc, &p->as.basic)) { 959 1044 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 } 964 1054 } 965 1055 } … … 967 1057 if (!is_generational(gc)) 968 1058 paint_partial_white(gc, &p->as.basic); /* next gc target */ 969 dead_slot = 0;1059 dead_slot = FALSE; 970 1060 } 971 1061 p++; … … 1080 1170 mrb_gc *gc = &mrb->gc; 1081 1171 1082 if (gc->disabled ) return;1172 if (gc->disabled || gc->iterating) return; 1083 1173 1084 1174 GC_INVOKE_TIME_REPORT("mrb_incremental_gc()"); … … 1120 1210 mrb_gc *gc = &mrb->gc; 1121 1211 1122 if (gc->disabled ) return;1212 if (gc->disabled || gc->iterating) return; 1123 1213 1124 1214 GC_INVOKE_TIME_REPORT("mrb_full_gc()"); … … 1357 1447 change_gen_gc_mode(mrb_state *mrb, mrb_gc *gc, mrb_bool enable) 1358 1448 { 1449 if (gc->disabled || gc->iterating) { 1450 mrb_raise(mrb, E_RUNTIME_ERROR, "generational mode changed when GC disabled"); 1451 return; 1452 } 1359 1453 if (is_generational(gc) && !enable) { 1360 1454 clear_all_old(mrb, gc); … … 1408 1502 gc_each_objects(mrb_state *mrb, mrb_gc *gc, mrb_each_object_callback *callback, void *data) 1409 1503 { 1410 mrb_heap_page* page = gc->heaps; 1411 1504 mrb_heap_page* page; 1505 1506 page = gc->heaps; 1412 1507 while (page != NULL) { 1413 RVALUE *p, *pend; 1508 RVALUE *p; 1509 int i; 1414 1510 1415 1511 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 } 1421 1516 page = page->next; 1422 1517 } … … 1426 1521 mrb_objspace_each_objects(mrb_state *mrb, mrb_each_object_callback *callback, void *data) 1427 1522 { 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 } 1429 1544 } 1430 1545 -
EcnlProtoTool/trunk/mruby-1.3.0/src/hash.c
r321 r331 5 5 */ 6 6 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> 14 14 15 15 /* a function to get hash value of a float number */ … … 92 92 } 93 93 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)100 94 KHASH_DEFINE (ht, mrb_value, mrb_hash_value, TRUE, mrb_hash_ht_hash_func, mrb_hash_ht_hash_equal) 101 95 … … 105 99 mrb_hash_ht_key(mrb_state *mrb, mrb_value key) 106 100 { 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))) { 108 102 key = mrb_str_dup(mrb, key); 109 RSTR_SET_FROZEN_FLAG(mrb_str_ptr(key));103 MRB_SET_FROZEN_FLAG(mrb_str_ptr(key)); 110 104 } 111 105 return key; … … 147 141 148 142 MRB_API mrb_value 149 mrb_hash_new_capa(mrb_state *mrb, int capa)143 mrb_hash_new_capa(mrb_state *mrb, mrb_int capa) 150 144 { 151 145 struct RHash *h; … … 166 160 } 167 161 162 static mrb_value mrb_hash_default(mrb_state *mrb, mrb_value hash); 163 static mrb_value hash_default(mrb_state *mrb, mrb_value hash, mrb_value key); 164 168 165 MRB_API mrb_value 169 166 mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key) … … 171 168 khash_t(ht) *h = RHASH_TBL(hash); 172 169 khiter_t k; 170 mrb_sym mid; 173 171 174 172 if (h) { … … 178 176 } 179 177 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); 185 184 } 186 185 … … 234 233 khash_t(ht) *h, *ret_h; 235 234 khiter_t k, ret_k; 235 mrb_value ifnone, vret; 236 236 237 237 h = RHASH_TBL(hash); … … 239 239 ret->ht = kh_init(ht, mrb); 240 240 241 if ( kh_size(h) > 0) {241 if (h && kh_size(h) > 0) { 242 242 ret_h = ret->ht; 243 243 … … 247 247 ret_k = kh_put(ht, mrb, ret_h, KEY(kh_key(h, k))); 248 248 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; 250 251 } 251 252 } 252 253 } 253 254 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; 255 267 } 256 268 … … 275 287 mrb_hash_modify(mrb_state *mrb, mrb_value hash) 276 288 { 289 if (MRB_FROZEN_P(mrb_hash_ptr(hash))) { 290 mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen hash"); 291 } 277 292 mrb_hash_tbl(mrb, hash); 278 293 } … … 330 345 ifnone = block; 331 346 } 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 } 333 351 return hash; 334 352 } … … 357 375 } 358 376 377 static mrb_value 378 hash_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 359 391 /* 15.2.13.4.5 */ 360 392 /* … … 386 418 387 419 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(); 395 430 } 396 431 … … 424 459 mrb_hash_modify(mrb, hash); 425 460 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 } 428 468 return ifnone; 429 469 } … … 475 515 mrb_hash_modify(mrb, hash); 476 516 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 } 478 525 479 526 return ifnone; … … 530 577 531 578 mrb_get_args(mrb, "o", &key); 579 mrb_hash_modify(mrb, self); 532 580 return mrb_hash_delete_key(mrb, self, key); 533 581 } … … 568 616 } 569 617 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(); 576 627 } 577 628 … … 593 644 khash_t(ht) *h = RHASH_TBL(hash); 594 645 646 mrb_hash_modify(mrb, hash); 595 647 if (h) kh_clear(ht, mrb, h); 596 648 return hash; … … 700 752 khash_t(ht) *h = RHASH_TBL(hash); 701 753 khiter_t k; 754 mrb_int end; 702 755 mrb_value ary; 703 756 mrb_value *p; … … 705 758 if (!h || kh_size(h) == 0) return mrb_ary_new(mrb); 706 759 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()); 708 762 p = mrb_ary_ptr(ary)->ptr; 709 763 for (k = kh_begin(h); k != kh_end(h); k++) { … … 712 766 mrb_hash_value hv = kh_value(h, k); 713 767 714 p[hv.n] = kv; 768 if (hv.n <= end) { 769 p[hv.n] = kv; 770 } 771 else { 772 p[end] = kv; 773 } 715 774 } 716 775 } … … 731 790 */ 732 791 733 staticmrb_value792 MRB_API mrb_value 734 793 mrb_hash_values(mrb_state *mrb, mrb_value hash) 735 794 { -
EcnlProtoTool/trunk/mruby-1.3.0/src/init.c
r321 r331 5 5 */ 6 6 7 #include "mruby.h"7 #include <mruby.h> 8 8 9 9 void mrb_init_symtbl(mrb_state*); … … 14 14 void mrb_init_enumerable(mrb_state*); 15 15 void mrb_init_symbol(mrb_state*); 16 void mrb_init_string(mrb_state*); 16 17 void mrb_init_exception(mrb_state*); 17 18 void mrb_init_proc(mrb_state*); 18 void mrb_init_string(mrb_state*);19 19 void mrb_init_array(mrb_state*); 20 20 void mrb_init_hash(mrb_state*); … … 39 39 40 40 mrb_init_symbol(mrb); DONE; 41 mrb_init_string(mrb); DONE; 41 42 mrb_init_exception(mrb); DONE; 42 43 mrb_init_proc(mrb); DONE; 43 mrb_init_string(mrb); DONE;44 44 mrb_init_array(mrb); DONE; 45 45 mrb_init_hash(mrb); DONE; -
EcnlProtoTool/trunk/mruby-1.3.0/src/kernel.c
r321 r331 5 5 */ 6 6 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> 14 16 15 17 typedef enum { … … 27 29 } mrb_method_flag_t; 28 30 31 MRB_API mrb_bool 32 mrb_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 29 40 static mrb_bool 30 41 mrb_obj_basic_to_s_p(mrb_state *mrb, mrb_value obj) 31 42 { 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); 36 44 } 37 45 … … 57 65 } 58 66 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 false67 * obj.equal?(other) -> true or false68 * obj.eql?(other) -> true or false69 *70 * Equality---At the <code>Object</code> level, <code>==</code> returns71 * <code>true</code> only if <i>obj</i> and <i>other</i> are the72 * same object. Typically, this method is overridden in descendant73 * classes to provide class-specific meaning.74 *75 * Unlike <code>==</code>, the <code>equal?</code> method should never be76 * overridden by subclasses: it is used to determine object identity77 * (that is, <code>a.equal?(b)</code> iff <code>a</code> is the same78 * object as <code>b</code>).79 *80 * The <code>eql?</code> method returns <code>true</code> if81 * <i>obj</i> and <i>anObject</i> have the same value. Used by82 * <code>Hash</code> to test members for equality. For objects of83 * class <code>Object</code>, <code>eql?</code> is synonymous with84 * <code>==</code>. Subclasses normally continue this tradition, but85 * there are exceptions. <code>Numeric</code> types, for example,86 * perform type conversion across <code>==</code>, but not across87 * <code>eql?</code>, so:88 *89 * 1 == 1.0 #=> true90 * 1.eql? 1.0 #=> false91 */92 static mrb_value93 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_value102 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));108 67 } 109 68 … … 143 102 * <code>name</code>. Replaces the deprecated <code>Object#id</code>. 144 103 */ 145 staticmrb_value104 mrb_value 146 105 mrb_obj_id_m(mrb_state *mrb, mrb_value self) 147 106 { … … 178 137 mrb_callinfo *ci = mrb->c->ci; 179 138 mrb_value *bp; 180 mrb_bool given_p;181 139 182 140 bp = ci->stackent + 1; 183 141 ci--; 184 142 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(); 212 171 } 213 172 … … 241 200 struct RClass *clone = (struct RClass*)mrb_obj_alloc(mrb, klass->tt, mrb->class_class); 242 201 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: 247 207 clone->c = mrb_singleton_class_clone(mrb, mrb_obj_value(klass)); 208 break; 248 209 } 249 210 clone->super = klass->super; … … 283 244 c1->super->flags |= MRB_FLAG_IS_ORIGIN; 284 245 } 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 } 286 252 dc->super = sc->super; 253 MRB_SET_INSTANCE_TT(dc, MRB_INSTANCE_TT(sc)); 287 254 } 288 255 … … 302 269 mrb_iv_copy(mrb, dest, obj); 303 270 break; 271 case MRB_TT_ISTRUCT: 272 mrb_istruct_copy(dest, obj); 273 break; 304 274 305 275 default: … … 441 411 mrb_value *argv; 442 412 mrb_int argc; 413 mrb_value args; 443 414 444 415 mrb_get_args(mrb, "*", &argv, &argc); 416 args = mrb_ary_new_from_values(mrb, argc, argv); 417 argv = (mrb_value*)RARRAY_PTR(args); 445 418 return mrb_obj_extend(mrb, argc, argv, self); 419 } 420 421 static mrb_value 422 mrb_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 444 static mrb_value 445 mrb_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(); 446 465 } 447 466 … … 477 496 } 478 497 479 480 /* implementation of instance_eval */481 mrb_value mrb_obj_instance_eval(mrb_state*, mrb_value);482 498 483 499 MRB_API mrb_bool … … 723 739 mrb_obj_methods(mrb_state *mrb, mrb_bool recur, mrb_value obj, mrb_method_flag_t flag) 724 740 { 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); 728 742 } 729 743 /* 15.3.1.3.31 */ … … 853 867 break; 854 868 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]; 857 871 argc = 2; 858 872 a[0] = mrb_obj_value(E_RUNTIME_ERROR); … … 861 875 default: 862 876 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));864 877 mrb_exc_raise(mrb, exc); 865 878 break; … … 905 918 } 906 919 920 void 921 mrb_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 979 static mrb_value 980 mrb_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 907 993 static inline mrb_bool 908 994 basic_obj_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym id, int pub) … … 940 1026 else { 941 1027 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 { 943 1032 tmp = mrb_check_string_type(mrb, mid); 944 1033 if (mrb_nil_p(tmp)) { … … 946 1035 mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", tmp); 947 1036 } 948 }949 tmp = mrb_check_intern_str(mrb, mid);1037 tmp = mrb_check_intern_str(mrb, tmp); 1038 } 950 1039 if (mrb_nil_p(tmp)) { 951 1040 respond_to_p = FALSE; … … 963 1052 rtm_id = mrb_intern_lit(mrb, "respond_to_missing?"); 964 1053 if (basic_obj_respond_to(mrb, self, rtm_id, !priv)) { 965 mrb_value args[2] ;1054 mrb_value args[2], v; 966 1055 args[0] = mid; 967 1056 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)); 969 1059 } 970 1060 } … … 1051 1141 mrb_local_variables(mrb_state *mrb, mrb_value self) 1052 1142 { 1053 mrb_value ret;1054 1143 struct RProc *proc; 1144 mrb_value vars; 1055 1145 struct mrb_irep *irep; 1056 1146 size_t i; … … 1066 1156 return mrb_ary_new(mrb); 1067 1157 } 1068 ret = mrb_ary_new_capa(mrb, irep->nlocals - 1);1158 vars = mrb_hash_new(mrb); 1069 1159 for (i = 0; i + 1 < irep->nlocals; ++i) { 1070 1160 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()); 1072 1162 } 1073 1163 } … … 1076 1166 1077 1167 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; 1080 1171 if (irep->lv) { 1081 1172 for (i = 0; i + 1 < irep->nlocals; ++i) { 1082 1173 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()); 1084 1175 } 1085 1176 } … … 1090 1181 } 1091 1182 1092 return ret; 1093 } 1094 1183 return mrb_hash_keys(mrb, vars); 1184 } 1185 1186 mrb_value mrb_obj_equal_m(mrb_state *mrb, mrb_value); 1095 1187 void 1096 1188 mrb_init_kernel(mrb_state *mrb) … … 1108 1200 mrb_define_method(mrb, krn, "singleton_class", mrb_singleton_class, MRB_ARGS_NONE()); 1109 1201 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));1112 1202 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 */1115 1203 mrb_define_method(mrb, krn, "block_given?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.3.6 */ 1116 1204 mrb_define_method(mrb, krn, "class", mrb_obj_class_m, MRB_ARGS_NONE()); /* 15.3.1.3.7 */ … … 1120 1208 mrb_define_method(mrb, krn, "equal?", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.11 */ 1121 1209 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()); 1122 1212 mrb_define_method(mrb, krn, "global_variables", mrb_f_global_variables, MRB_ARGS_NONE()); /* 15.3.1.3.14 */ 1123 1213 mrb_define_method(mrb, krn, "hash", mrb_obj_hash, MRB_ARGS_NONE()); /* 15.3.1.3.15 */ 1124 1214 mrb_define_method(mrb, krn, "initialize_copy", mrb_obj_init_copy, MRB_ARGS_REQ(1)); /* 15.3.1.3.16 */ 1125 1215 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 */1127 1216 mrb_define_method(mrb, krn, "instance_of?", obj_is_instance_of, MRB_ARGS_REQ(1)); /* 15.3.1.3.19 */ 1128 1217 mrb_define_method(mrb, krn, "instance_variable_defined?", mrb_obj_ivar_defined, MRB_ARGS_REQ(1)); /* 15.3.1.3.20 */ … … 1134 1223 mrb_define_method(mrb, krn, "kind_of?", mrb_obj_is_kind_of_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.26 */ 1135 1224 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 1136 1228 mrb_define_method(mrb, krn, "methods", mrb_obj_methods_m, MRB_ARGS_OPT(1)); /* 15.3.1.3.31 */ 1137 1229 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 8 8 #include <stdlib.h> 9 9 #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> 16 16 17 17 #if SIZE_MAX < UINT32_MAX … … 524 524 if (bigendian_p()) 525 525 *flags |= FLAG_BYTEORDER_NATIVE; 526 else 526 else 527 527 *flags |= FLAG_BYTEORDER_BIG; 528 528 } … … 545 545 } 546 546 547 MRB_APImrb_irep*547 static mrb_irep* 548 548 read_irep(mrb_state *mrb, const uint8_t *bin, uint8_t flags) 549 549 { … … 603 603 } 604 604 605 MRB_APImrb_irep*605 mrb_irep* 606 606 mrb_read_irep(mrb_state *mrb, const uint8_t *bin) 607 607 { … … 615 615 } 616 616 617 void mrb_exc_set(mrb_state *mrb, mrb_value exc); 618 617 619 static void 618 620 irep_error(mrb_state *mrb) 619 621 { 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")); 621 623 } 622 624 … … 634 636 mrb_irep_decref(mrb, irep); 635 637 if (c && c->no_exec) return mrb_obj_value(proc); 636 return mrb_top level_run(mrb, proc);638 return mrb_top_run(mrb, proc, mrb_top_self(mrb), 0); 637 639 } 638 640 … … 645 647 #ifndef MRB_DISABLE_STDIO 646 648 647 MRB_APImrb_irep*649 mrb_irep* 648 650 mrb_read_irep_file(mrb_state *mrb, FILE* fp) 649 651 { … … 696 698 if (c && c->dump_result) mrb_codedump_all(mrb, proc); 697 699 if (c && c->no_exec) return mrb_obj_value(proc); 698 val = mrb_top level_run(mrb, proc);700 val = mrb_top_run(mrb, proc, mrb_top_self(mrb), 0); 699 701 return val; 700 702 } -
EcnlProtoTool/trunk/mruby-1.3.0/src/mruby_core.rake
r321 r331 5 5 6 6 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$/ 8 8 objfile(f.pathmap("#{current_build_dir}/%n")) 9 9 }.compact 10 10 11 if cxx_ abi_enabled?11 if cxx_exception_enabled? 12 12 objs += %w(vm error).map { |v| compile_as_cxx "#{current_dir}/#{v}.c", "#{current_build_dir}/#{v}.cxx" } 13 13 end -
EcnlProtoTool/trunk/mruby-1.3.0/src/numeric.c
r321 r331 10 10 #include <stdlib.h> 11 11 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> 16 17 17 18 #ifdef MRB_USE_FLOAT 19 #define trunc(f) truncf(f) 18 20 #define floor(f) floorf(f) 19 21 #define ceil(f) ceilf(f) … … 51 53 { 52 54 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)); 61 81 return mrb_float_value(mrb, d); 62 82 } … … 272 292 } 273 293 294 static int64_t 295 value_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 311 static mrb_value 312 int64_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 320 static mrb_value 321 flo_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 329 static mrb_value 330 flo_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 341 static mrb_value 342 flo_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 353 static mrb_value 354 flo_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 365 static mrb_value 366 flo_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 398 static mrb_value 399 flo_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 407 static mrb_value 408 flo_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 274 416 /* 15.2.8.3.18 */ 275 417 /* … … 285 427 char *c; 286 428 size_t i; 287 int hash;429 mrb_int hash; 288 430 289 431 d = (mrb_float)mrb_fixnum(num); … … 291 433 if (d == 0) d = 0.0; 292 434 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++) { 294 436 hash = (hash * 971) ^ (unsigned char)c[i]; 295 437 } … … 351 493 { 352 494 return mrb_bool_value(isfinite(mrb_float(num))); 495 } 496 497 void 498 mrb_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 } 353 506 } 354 507 … … 371 524 mrb_float f = floor(mrb_float(num)); 372 525 373 if (!FIXABLE(f)) { 526 mrb_check_num_exact(mrb, f); 527 if (!FIXABLE_FLOAT(f)) { 374 528 return mrb_float_value(mrb, f); 375 529 } … … 396 550 mrb_float f = ceil(mrb_float(num)); 397 551 398 if (!FIXABLE(f)) { 552 mrb_check_num_exact(mrb, f); 553 if (!FIXABLE_FLOAT(f)) { 399 554 return mrb_float_value(mrb, f); 400 555 } … … 443 598 number = mrb_float(num); 444 599 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); 453 604 454 605 f = 1.0; … … 506 657 if (f < 0.0) f = ceil(f); 507 658 508 if (!FIXABLE(f)) { 659 mrb_check_num_exact(mrb, f); 660 if (!FIXABLE_FLOAT(f)) { 509 661 return mrb_float_value(mrb, f); 510 662 } … … 542 694 } 543 695 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 548 696 mrb_value 549 697 mrb_fixnum_mul(mrb_state *mrb, mrb_value x, mrb_value y) … … 553 701 a = mrb_fixnum(x); 554 702 if (mrb_fixnum_p(y)) { 555 mrb_float c; 556 mrb_int b; 703 mrb_int b, c; 557 704 558 705 if (a == 0) return x; 559 706 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); 567 711 } 568 712 return mrb_float_value(mrb, (mrb_float)a * mrb_to_flo(mrb, y)); … … 747 891 } 748 892 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 } 893 static mrb_value flo_and(mrb_state *mrb, mrb_value x); 894 static mrb_value flo_or(mrb_state *mrb, mrb_value x); 895 static 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) 760 900 761 901 /* 15.2.8.3.9 */ … … 773 913 774 914 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, &); 778 916 } 779 917 … … 792 930 793 931 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, |); 797 933 } 798 934 … … 811 947 812 948 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, ^); 816 950 } 817 951 … … 821 955 lshift(mrb_state *mrb, mrb_int val, mrb_int width) 822 956 { 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 975 bit_overflow: 976 { 825 977 mrb_float f = (mrb_float)val; 826 978 while (width--) { … … 829 981 return mrb_float_value(mrb, f); 830 982 } 831 return mrb_fixnum_value(val << width);832 983 } 833 984 … … 835 986 rshift(mrb_int val, mrb_int width) 836 987 { 837 mrb_assert(width > 0); 988 if (width < 0) { /* mrb_int overflow */ 989 return mrb_fixnum_value(0); 990 } 838 991 if (width >= NUMERIC_SHIFT_WIDTH_MAX) { 839 992 if (val < 0) { … … 845 998 } 846 999 847 static inline void848 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 856 1000 /* 15.2.8.3.12 */ 857 1001 /* … … 867 1011 mrb_int width, val; 868 1012 869 fix_shift_get_width(mrb, &width); 870 1013 mrb_get_args(mrb, "i", &width); 871 1014 if (width == 0) { 872 1015 return x; 873 1016 } 874 1017 val = mrb_fixnum(x); 1018 if (val == 0) return x; 875 1019 if (width < 0) { 876 1020 return rshift(val, -width); … … 892 1036 mrb_int width, val; 893 1037 894 fix_shift_get_width(mrb, &width); 895 1038 mrb_get_args(mrb, "i", &width); 896 1039 if (width == 0) { 897 1040 return x; 898 1041 } 899 1042 val = mrb_fixnum(x); 1043 if (val == 0) return x; 900 1044 if (width < 0) { 901 1045 return lshift(mrb, val, -width); … … 936 1080 mrb_flo_to_fixnum(mrb_state *mrb, mrb_value x) 937 1081 { 938 mrb_int z ;1082 mrb_int z = 0; 939 1083 940 1084 if (!mrb_float_p(x)) { … … 951 1095 mrb_raise(mrb, E_FLOATDOMAIN_ERROR, "NaN"); 952 1096 } 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 } 954 1103 } 955 1104 return mrb_fixnum_value(z); … … 1150 1299 numeric = mrb_define_class(mrb, "Numeric", mrb->object_class); /* 15.2.7 */ 1151 1300 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 */ 1156 1305 1157 1306 /* Integer Class */ 1158 1307 integer = mrb_define_class(mrb, "Integer", numeric); /* 15.2.8 */ 1308 MRB_SET_INSTANCE_TT(integer, MRB_TT_FIXNUM); 1159 1309 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) */ 1162 1316 1163 1317 /* Fixnum Class */ 1164 1318 mrb->fixnum_class = fixnum = mrb_define_class(mrb, "Fixnum", integer); 1165 mrb_define_method(mrb, fixnum, "+", fix_plus, 1166 mrb_define_method(mrb, fixnum, "-", fix_minus, 1167 mrb_define_method(mrb, fixnum, "*", fix_mul, 1168 mrb_define_method(mrb, fixnum, "%", fix_mod, 1169 mrb_define_method(mrb, fixnum, "==", fix_equal, 1170 mrb_define_method(mrb, fixnum, "~", fix_rev, 1171 mrb_define_method(mrb, fixnum, "&", fix_and, 1172 mrb_define_method(mrb, fixnum, "|", fix_or, 1173 mrb_define_method(mrb, fixnum, "^", fix_xor, 1174 mrb_define_method(mrb, fixnum, "<<", fix_lshift, 1175 mrb_define_method(mrb, fixnum, ">>", fix_rshift, 1176 mrb_define_method(mrb, fixnum, "eql?", fix_eql, 1177 mrb_define_method(mrb, fixnum, "hash", flo_hash, 1178 mrb_define_method(mrb, fixnum, "to_f", fix_to_f, 1179 mrb_define_method(mrb, fixnum, "to_s", fix_to_s, 1180 mrb_define_method(mrb, fixnum, "inspect", fix_to_s, 1181 mrb_define_method(mrb, fixnum, "divmod", fix_divmod, 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) */ 1182 1336 1183 1337 /* Float Class */ 1184 1338 mrb->float_class = fl = mrb_define_class(mrb, "Float", numeric); /* 15.2.9 */ 1339 MRB_SET_INSTANCE_TT(fl, MRB_TT_FLOAT); 1185 1340 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()); 1206 1367 1207 1368 #ifdef INFINITY -
EcnlProtoTool/trunk/mruby-1.3.0/src/object.c
r321 r331 5 5 */ 6 6 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> 11 12 12 13 MRB_API mrb_bool … … 266 267 267 268 mrb->nil_class = n = mrb_define_class(mrb, "NilClass", mrb->object_class); 269 MRB_SET_INSTANCE_TT(n, MRB_TT_TRUE); 268 270 mrb_undef_class_method(mrb, n, "new"); 269 271 mrb_define_method(mrb, n, "&", false_and, MRB_ARGS_REQ(1)); /* 15.2.4.3.1 */ … … 275 277 276 278 mrb->true_class = t = mrb_define_class(mrb, "TrueClass", mrb->object_class); 279 MRB_SET_INSTANCE_TT(t, MRB_TT_TRUE); 277 280 mrb_undef_class_method(mrb, t, "new"); 278 281 mrb_define_method(mrb, t, "&", true_and, MRB_ARGS_REQ(1)); /* 15.2.5.3.1 */ … … 283 286 284 287 mrb->false_class = f = mrb_define_class(mrb, "FalseClass", mrb->object_class); 288 MRB_SET_INSTANCE_TT(f, MRB_TT_TRUE); 285 289 mrb_undef_class_method(mrb, f, "new"); 286 290 mrb_define_method(mrb, f, "&", false_and, MRB_ARGS_REQ(1)); /* 15.2.6.3.1 */ … … 349 353 mrb_value v; 350 354 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; 352 356 v = convert_type(mrb, val, tname, method, FALSE); 353 357 if (mrb_nil_p(v) || mrb_type(v) != type) return mrb_nil_value(); … … 381 385 /* {MRB_TT_NODE, "Node"}, */ /* internal use: syntax tree node */ 382 386 /* {MRB_TT_UNDEF, "undef"}, */ /* internal use: #undef; should not happen */ 383 {-1, 0}387 {MRB_TT_MAXDEFINE, 0} 384 388 }; 385 389 … … 391 395 392 396 xt = mrb_type(x); 393 if ((xt != t) || (xt == MRB_TT_DATA) ) {397 if ((xt != t) || (xt == MRB_TT_DATA) || (xt == MRB_TT_ISTRUCT)) { 394 398 while (type->type < MRB_TT_MAXDEFINE) { 395 399 if (type->type == t) { … … 441 445 mrb_str_cat_cstr(mrb, str, cname); 442 446 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))); 444 448 mrb_str_cat_lit(mrb, str, ">"); 445 449 … … 482 486 case MRB_TT_CLASS: 483 487 case MRB_TT_ICLASS: 488 case MRB_TT_SCLASS: 484 489 break; 485 490 … … 530 535 case MRB_TT_FLOAT: 531 536 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 } 534 542 } 535 543 return mrb_flo_to_fixnum(mrb, val); … … 549 557 tmp = mrb_check_string_type(mrb, val); 550 558 if (!mrb_nil_p(tmp)) { 559 val = tmp; 551 560 goto string_conv; 552 561 } -
EcnlProtoTool/trunk/mruby-1.3.0/src/opcode.h
r321 r331 1 1 /* 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 8 8 #include <stdint.h> 9 9 #include <string.h> 10 #include "mruby.h"10 #include <mruby.h> 11 11 12 12 /* configuration section */ … … 14 14 /* or undef it if alignment does not matter */ 15 15 #ifndef POOL_ALIGNMENT 16 #if INTPTR_MAX == INT64_MAX 17 #define POOL_ALIGNMENT 8 18 #else 16 19 #define POOL_ALIGNMENT 4 20 #endif 17 21 #endif 18 22 /* page size of memory pool */ -
EcnlProtoTool/trunk/mruby-1.3.0/src/print.c
r321 r331 5 5 */ 6 6 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> 10 10 11 11 #ifndef MRB_DISABLE_STDIO -
EcnlProtoTool/trunk/mruby-1.3.0/src/proc.c
r321 r331 5 5 */ 6 6 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> 11 11 12 12 static mrb_code call_iseq[] = { … … 42 42 e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, (struct RClass*)mrb->c->ci->proc->env); 43 43 MRB_SET_ENV_STACK_LEN(e, nlocals); 44 e-> mid = mrb->c->ci->mid;44 e->cxt.c = mrb->c; 45 45 e->cioff = mrb->c->ci - mrb->c->cibase; 46 46 e->stack = mrb->c->stack; … … 62 62 } 63 63 p->env = e; 64 mrb_field_write_barrier(mrb, (struct RBasic *)p, (struct RBasic *)p->env); 64 65 } 65 66 … … 136 137 } 137 138 138 MRB_APIvoid139 void 139 140 mrb_proc_copy(struct RProc *a, struct RProc *b) 140 141 { 141 142 a->flags = b->flags; 142 143 a->body = b->body; 143 if (!MRB_PROC_CFUNC_P(a) ) {144 if (!MRB_PROC_CFUNC_P(a) && a->body.irep) { 144 145 a->body.irep->refcnt++; 145 146 } … … 149 150 150 151 static mrb_value 151 mrb_proc_ initialize(mrb_state *mrb, mrb_value self)152 mrb_proc_s_new(mrb_state *mrb, mrb_value proc_class) 152 153 { 153 154 mrb_value blk; 155 mrb_value proc; 156 struct RProc *p; 154 157 155 158 mrb_get_args(mrb, "&", &blk); … … 158 161 mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block"); 159 162 } 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; 164 168 } 165 169 … … 189 193 } 190 194 191 mrb_code*192 mrb_proc_iseq(mrb_state *mrb, struct RProc *p)193 {194 return p->body.irep->iseq;195 }196 197 195 /* 15.2.17.4.2 */ 198 196 static mrb_value … … 200 198 { 201 199 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; 203 202 mrb_aspec aspec; 204 203 int ma, op, ra, pa, arity; … … 209 208 } 210 209 210 irep = p->body.irep; 211 if (!irep) { 212 return mrb_fixnum_value(0); 213 } 214 215 iseq = irep->iseq; 211 216 /* arity is depend on OP_ENTER */ 212 217 if (GET_OPCODE(*iseq) != OP_ENTER) { … … 267 272 call_irep->iseq = call_iseq; 268 273 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()); 271 277 mrb_define_method(mrb, mrb->proc_class, "initialize_copy", mrb_proc_init_copy, MRB_ARGS_REQ(1)); 272 278 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 5 5 */ 6 6 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> 12 12 13 13 #define RANGE_CLASS (mrb_class_get(mrb, "Range")) 14 15 MRB_API struct RRange* 16 mrb_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 } 14 25 15 26 static void … … 58 69 mrb_range_beg(mrb_state *mrb, mrb_value range) 59 70 { 60 struct RRange *r = mrb_range_ptr( range);71 struct RRange *r = mrb_range_ptr(mrb, range); 61 72 62 73 return r->edges->beg; … … 77 88 mrb_range_end(mrb_state *mrb, mrb_value range) 78 89 { 79 struct RRange *r = mrb_range_ptr( range);90 struct RRange *r = mrb_range_ptr(mrb, range); 80 91 81 92 return r->edges->end; … … 91 102 mrb_range_excl(mrb_state *mrb, mrb_value range) 92 103 { 93 struct RRange *r = mrb_range_ptr( range);104 struct RRange *r = mrb_range_ptr(mrb, range); 94 105 95 106 return mrb_bool_value(r->excl); … … 99 110 range_init(mrb_state *mrb, mrb_value range, mrb_value beg, mrb_value end, mrb_bool exclude_end) 100 111 { 101 struct RRange *r = mrb_range_ ptr(range);112 struct RRange *r = mrb_range_raw_ptr(range); 102 113 103 114 range_check(mrb, beg, end); … … 130 141 } 131 142 /* 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 } 132 146 range_init(mrb, range, beg, end, exclusive); 133 147 return range; … … 153 167 struct RRange *rr; 154 168 struct RRange *ro; 155 mrb_value obj ;169 mrb_value obj, v1, v2; 156 170 157 171 mrb_get_args(mrb, "o", &obj); … … 162 176 } 163 177 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 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) { 169 183 return mrb_false_value(); 170 184 } … … 220 234 { 221 235 mrb_value val; 222 struct RRange *r = mrb_range_ptr( range);236 struct RRange *r = mrb_range_ptr(mrb, range); 223 237 mrb_value beg, end; 224 238 mrb_bool include_p; … … 228 242 beg = r->edges->beg; 229 243 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 */ 233 247 234 248 return mrb_bool_value(include_p); 235 249 } 236 250 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)251 MRB_API mrb_int 252 mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len, mrb_bool trunc) 239 253 { 240 254 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); 244 259 245 260 beg = mrb_int(mrb, r->edges->beg); … … 248 263 if (beg < 0) { 249 264 beg += len; 250 if (beg < 0) return FALSE;265 if (beg < 0) return 2; 251 266 } 252 267 253 268 if (trunc) { 254 if (beg > len) return FALSE;269 if (beg > len) return 2; 255 270 if (end > len) end = len; 256 271 } … … 264 279 *begp = beg; 265 280 *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; 273 282 } 274 283 … … 285 294 { 286 295 mrb_value str, str2; 287 struct RRange *r = mrb_range_ptr( range);296 struct RRange *r = mrb_range_ptr(mrb, range); 288 297 289 298 str = mrb_obj_as_string(mrb, r->edges->beg); … … 310 319 { 311 320 mrb_value str, str2; 312 struct RRange *r = mrb_range_ptr( range);321 struct RRange *r = mrb_range_ptr(mrb, range); 313 322 314 323 str = mrb_inspect(mrb, r->edges->beg); … … 350 359 if (mrb_type(obj) != MRB_TT_RANGE) return mrb_false_value(); 351 360 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); 354 363 if (!mrb_eql(mrb, r->edges->beg, o->edges->beg) || 355 364 !mrb_eql(mrb, r->edges->end, o->edges->end) || … … 374 383 } 375 384 376 r = mrb_range_ptr( src);385 r = mrb_range_ptr(mrb, src); 377 386 range_init(mrb, copy, r->edges->beg, r->edges->end, r->excl); 378 387 … … 391 400 mrb_ary_push(mrb, result, func(mrb, obj, mrb_fixnum(argv[i]))); 392 401 } 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) { 394 403 mrb_int const end = olen < beg + len ? olen : beg + len; 395 404 for (j = beg; j < end; ++j) { -
EcnlProtoTool/trunk/mruby-1.3.0/src/state.c
r321 r331 7 7 #include <stdlib.h> 8 8 #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> 14 14 15 15 void mrb_init_core(mrb_state*); … … 142 142 if (!(irep->flags & MRB_ISEQ_NO_FREE)) 143 143 mrb_free(mrb, irep->iseq); 144 for (i=0; i<irep->plen; i++) {144 if (irep->pool) for (i=0; i<irep->plen; i++) { 145 145 if (mrb_type(irep->pool[i]) == MRB_TT_STRING) { 146 146 mrb_gc_free_str(mrb, RSTRING(irep->pool[i])); … … 160 160 mrb_free(mrb, irep->reps); 161 161 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 } 163 165 mrb_free(mrb, irep->lines); 164 166 mrb_debug_info_free(mrb, irep->debug_info); … … 216 218 } 217 219 220 void mrb_free_backtrace(mrb_state *mrb); 221 218 222 MRB_API void 219 223 mrb_free_context(mrb_state *mrb, struct mrb_context *c) … … 259 263 *irep = mrb_irep_zero; 260 264 irep->refcnt = 1; 265 irep->own_filename = FALSE; 261 266 262 267 return irep; … … 287 292 if (mrb->atexit_stack_len == 0) { 288 293 mrb->atexit_stack = (mrb_atexit_func*)mrb_malloc(mrb, stack_size); 289 } else { 294 } 295 else { 290 296 mrb->atexit_stack = (mrb_atexit_func*)mrb_realloc(mrb, mrb->atexit_stack, stack_size); 291 297 } -
EcnlProtoTool/trunk/mruby-1.3.0/src/string.c
r321 r331 4 4 ** See Copyright Notice in mruby.h 5 5 */ 6 7 #ifdef _MSC_VER 8 # define _CRT_NONSTDC_NO_DEPRECATE 9 #endif 6 10 7 11 #include <float.h> … … 10 14 #include <stdlib.h> 11 15 #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> 18 22 19 23 typedef struct mrb_shared_string { … … 60 64 memcpy(s->as.ary, p, len); 61 65 } 62 } else { 66 } 67 else { 63 68 if (len >= MRB_INT_MAX) { 64 69 mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big"); … … 115 120 } 116 121 117 static inline void 118 resize_capa(mrb_state *mrb, struct RString *s, mrb_int capacity) 119 { 122 static void 123 resize_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 120 128 if (RSTR_EMBED_P(s)) { 121 129 if (RSTRING_EMBED_LEN_MAX < capacity) { … … 126 134 s->as.heap.ptr = tmp; 127 135 s->as.heap.len = len; 128 s->as.heap.aux.capa = capacity;136 s->as.heap.aux.capa = (mrb_int)capacity; 129 137 } 130 138 } 131 139 else { 132 s->as.heap.ptr = (char 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; 134 142 } 135 143 } … … 148 156 } 149 157 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: 156 165 mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big"); 157 166 } 158 total = RSTR_LEN(s)+len;159 167 if (capa <= total) { 160 168 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; 166 178 } 167 179 resize_capa(mrb, s, capa); … … 270 282 char* p = RSTRING_PTR(str); 271 283 char* e = p; 284 if (RSTRING(str)->flags & MRB_STR_NO_UTF) { 285 return RSTRING_LEN(str); 286 } 272 287 e += len < 0 ? RSTRING_LEN(str) : len; 273 288 while (p<e) { … … 275 290 total++; 276 291 } 292 if (RSTRING_LEN(str) == total) { 293 RSTRING(str)->flags |= MRB_STR_NO_UTF; 294 } 277 295 return total; 278 296 } … … 303 321 304 322 for (b=i=0; b<bi; i++) { 305 n = utf8len (p, p+bi);323 n = utf8len_codepage[(unsigned char)*p]; 306 324 b += n; 307 325 p += n; 308 326 } 327 if (b != bi) return -1; 309 328 return i; 310 329 } 311 330 331 #define BYTES_ALIGN_CHECK(pos) if (pos < 0) return mrb_nil_value(); 312 332 #else 313 333 #define RSTRING_CHAR_LEN(s) RSTRING_LEN(s) 314 334 #define chars2bytes(p, off, ci) (ci) 315 335 #define bytes2chars(p, bi) (bi) 336 #define BYTES_ALIGN_CHECK(pos) 316 337 #endif 317 338 … … 349 370 } 350 371 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; 357 378 } 358 379 return mrb_memsearch_qs((const unsigned char *)x0, m, (const unsigned char *)y0, n); … … 404 425 405 426 orig = mrb_str_ptr(str); 406 if (RSTR_EMBED_P(orig) ) {427 if (RSTR_EMBED_P(orig) || RSTR_LEN(orig) == 0) { 407 428 s = str_new(mrb, orig->as.ary+beg, len); 408 429 } … … 450 471 if (beg < 0) return mrb_nil_value(); 451 472 } 452 if ( beg + len > clen)473 if (len > clen - beg) 453 474 len = clen - beg; 454 475 if (len <= 0) { … … 489 510 check_frozen(mrb_state *mrb, struct RString *s) 490 511 { 491 if ( RSTR_FROZEN_P(s)) {512 if (MRB_FROZEN_P(s)) { 492 513 mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen string"); 493 514 } … … 500 521 501 522 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; 502 526 len = RSTR_LEN(s2); 503 527 if (RSTR_SHARED_P(s1)) { … … 646 670 { 647 671 check_frozen(mrb, s); 672 s->flags &= ~MRB_STR_NO_UTF; 648 673 if (RSTR_SHARED_P(s)) { 649 674 mrb_shared_string *shared = s->as.heap.aux.shared; 650 675 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) { 652 677 s->as.heap.ptr = shared->ptr; 653 678 s->as.heap.aux.capa = shared->len; … … 661 686 p = RSTR_PTR(s); 662 687 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 } 664 698 if (p) { 665 699 memcpy(ptr, p, len); 666 700 } 667 701 ptr[len] = '\0'; 668 s->as.heap.ptr = ptr;669 s->as.heap.aux.capa = len;670 702 str_decref(mrb, shared); 671 703 } … … 675 707 if (RSTR_NOFREE_P(s)) { 676 708 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 } 679 720 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'; 685 724 return; 686 725 } 687 }688 689 static mrb_value690 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;696 726 } 697 727 … … 747 777 } 748 778 s2 = mrb_str_ptr(other); 779 if (RSTR_LEN(s2) == 0) { 780 return; 781 } 749 782 len = RSTR_LEN(s1) + RSTR_LEN(s2); 750 783 784 if (len < 0 || len >= MRB_INT_MAX) { 785 mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big"); 786 } 751 787 if (RSTRING_CAPA(self) < len) { 752 788 resize_capa(mrb, s1, len); … … 932 968 mrb_value tmp = mrb_funcall(mrb, str2, "<=>", 1, str1); 933 969 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)) { 936 972 return mrb_funcall(mrb, mrb_fixnum_value(0), "-", 1, tmp); 937 973 } … … 1014 1050 } 1015 1051 1052 MRB_API mrb_int 1053 mrb_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 1016 1059 void 1017 1060 mrb_noregexp(mrb_state *mrb, mrb_value self) … … 1059 1102 1060 1103 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 1074 1106 default: 1075 1107 indx = mrb_Integer(mrb, indx); 1076 1108 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 } 1077 1123 mrb_raise(mrb, E_TYPE_ERROR, "can't convert to Fixnum"); 1078 1124 } … … 1131 1177 argc = mrb_get_args(mrb, "o|o", &a1, &a2); 1132 1178 if (argc == 2) { 1179 mrb_int n1, n2; 1180 1133 1181 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); 1135 1184 } 1136 1185 if (argc != 1) { … … 1215 1264 mrb_int rslen; 1216 1265 mrb_int len; 1266 mrb_int argc; 1217 1267 struct RString *s = mrb_str_ptr(str); 1218 1268 1219 1269 mrb_str_modify(mrb, s); 1270 argc = mrb_get_args(mrb, "|S", &rs); 1220 1271 len = RSTR_LEN(s); 1221 if ( mrb_get_args(mrb, "|S", &rs)== 0) {1272 if (argc == 0) { 1222 1273 if (len == 0) return mrb_nil_value(); 1223 1274 smart_chomp: … … 1510 1561 mrb_str_include(mrb_state *mrb, mrb_value self) 1511 1562 { 1512 mrb_int i;1513 1563 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); 1528 1569 } 1529 1570 … … 1559 1600 mrb_get_args(mrb, "*", &argv, &argc); 1560 1601 if (argc == 2) { 1561 pos = mrb_fixnum(argv[1]); 1562 sub = argv[0]; 1602 mrb_get_args(mrb, "oi", &sub, &pos); 1563 1603 } 1564 1604 else { … … 1577 1617 } 1578 1618 } 1579 if (pos > =clen) return mrb_nil_value();1619 if (pos > clen) return mrb_nil_value(); 1580 1620 pos = chars2bytes(str, 0, pos); 1581 1621 … … 1598 1638 if (pos == -1) return mrb_nil_value(); 1599 1639 pos = bytes2chars(RSTRING_PTR(str), pos); 1640 BYTES_ALIGN_CHECK(pos); 1600 1641 return mrb_fixnum_value(pos); 1601 1642 } … … 1633 1674 mrb_value str2; 1634 1675 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)); 1638 1681 return self; 1639 1682 } … … 1743 1786 mrb_str_modify(mrb, mrb_str_ptr(str)); 1744 1787 len = RSTRING_LEN(str); 1745 buf = mrb_malloc(mrb, (size_t)len);1788 buf = (char*)mrb_malloc(mrb, (size_t)len); 1746 1789 p = buf; 1747 1790 e = buf + len; … … 1824 1867 mrb_int argc; 1825 1868 mrb_value sub; 1826 mrb_value vpos;1827 1869 mrb_int pos, len = RSTRING_CHAR_LEN(str); 1828 1870 1829 1871 mrb_get_args(mrb, "*", &argv, &argc); 1830 1872 if (argc == 2) { 1831 sub = argv[0]; 1832 vpos = argv[1]; 1833 pos = mrb_fixnum(vpos); 1873 mrb_get_args(mrb, "oi", &sub, &pos); 1834 1874 if (pos < 0) { 1835 1875 pos += len; … … 1849 1889 } 1850 1890 pos = chars2bytes(str, 0, pos); 1851 len = chars2bytes(str, pos, len);1852 1891 mrb_regexp_check(mrb, sub); 1853 1892 … … 1867 1906 if (pos >= 0) { 1868 1907 pos = bytes2chars(RSTRING_PTR(str), pos); 1908 BYTES_ALIGN_CHECK(pos); 1869 1909 return mrb_fixnum_value(pos); 1870 1910 } … … 1922 1962 mrb_value spat = mrb_nil_value(); 1923 1963 enum {awk, string, regexp} split_type = string; 1924 long i = 0, lim_p;1964 mrb_int i = 0; 1925 1965 mrb_int beg; 1926 1966 mrb_int end; 1927 1967 mrb_int lim = 0; 1968 mrb_bool lim_p; 1928 1969 mrb_value result, tmp; 1929 1970 … … 1998 2039 end = mrb_memsearch(RSTRING_PTR(spat), pat_len, RSTRING_PTR(str)+idx, str_len - idx); 1999 2040 if (end < 0) break; 2000 } else { 2041 } 2042 else { 2001 2043 end = chars2bytes(str, idx, 1); 2002 2044 } … … 2031 2073 2032 2074 MRB_API mrb_value 2033 mrb_cstr_to_inum(mrb_state *mrb, const char *str, int base, int badcheck) 2034 { 2035 const char *p; 2075 mrb_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; 2036 2079 char sign = 1; 2037 int c , uscore;2080 int c; 2038 2081 uint64_t n = 0; 2039 2082 mrb_int val; … … 2045 2088 -1) 2046 2089 2047 if (! str) {2090 if (!p) { 2048 2091 if (badcheck) goto bad; 2049 2092 return mrb_fixnum_value(0); 2050 2093 } 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++; 2058 2102 sign = 0; 2059 2103 } 2060 if (str[0] == '+' || str[0] == '-') {2061 if (badcheck) goto bad;2062 return mrb_fixnum_value(0);2063 }2064 2104 if (base <= 0) { 2065 if ( str[0] == '0') {2066 switch ( str[1]) {2105 if (p[0] == '0') { 2106 switch (p[1]) { 2067 2107 case 'x': case 'X': 2068 2108 base = 16; … … 2079 2119 default: 2080 2120 base = 8; 2121 break; 2081 2122 } 2082 2123 } … … 2090 2131 switch (base) { 2091 2132 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; 2094 2135 } 2095 2136 break; … … 2097 2138 break; 2098 2139 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; 2101 2142 } 2102 2143 case 4: case 5: case 6: case 7: 2103 2144 break; 2104 2145 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; 2107 2148 } 2108 2149 case 9: case 11: case 12: case 13: case 14: case 15: 2109 2150 break; 2110 2151 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; 2113 2154 } 2114 2155 break; … … 2119 2160 break; 2120 2161 } /* 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) { 2136 2163 if (badcheck) goto bad; 2137 2164 return mrb_fixnum_value(0); 2138 2165 } 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++) { 2142 2190 if (*p == '_') { 2143 if (uscore == 0) { 2144 uscore++; 2191 p++; 2192 if (p==pend) { 2193 if (badcheck) goto bad; 2145 2194 continue; 2146 2195 } 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 } 2151 2204 c = conv_digit(*p); 2152 2205 if (c < 0 || c >= base) { 2153 if (badcheck) goto bad;2154 2206 break; 2155 2207 } 2156 2208 n *= base; 2157 2209 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; 2163 2216 if (badcheck) { 2164 2217 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 */ 2167 2220 } 2168 2221 2169 2222 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))); 2172 2229 /* not reached */ 2173 2230 return mrb_fixnum_value(0); 2231 } 2232 2233 MRB_API mrb_value 2234 mrb_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); 2174 2237 } 2175 2238 … … 2183 2246 2184 2247 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 } 2185 2252 mrb_str_modify(mrb, ps); 2186 2253 return RSTR_PTR(ps); … … 2195 2262 mrb_int len; 2196 2263 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); 2212 2267 } 2213 2268 … … 2260 2315 return 0.0; 2261 2316 } 2262 d = strtod(p, &end);2317 d = mrb_float_read(p, &end); 2263 2318 if (p == end) { 2264 2319 if (badcheck) { … … 2298 2353 } 2299 2354 2300 d = strtod(p, &end);2355 d = mrb_float_read(p, &end); 2301 2356 if (badcheck) { 2302 2357 if (!end || p == end) goto bad; … … 2603 2658 #endif 2604 2659 c = *p; 2605 if (c == '"'|| c == '\\' || (c == '#' && IS_EVSTR(p , pend))) {2660 if (c == '"'|| c == '\\' || (c == '#' && IS_EVSTR(p+1, pend))) { 2606 2661 buf[0] = '\\'; buf[1] = c; 2607 2662 mrb_str_cat(mrb, result, buf, 2); … … 2689 2744 mrb_define_method(mrb, s, "chomp", mrb_str_chomp, MRB_ARGS_ANY()); /* 15.2.10.5.9 */ 2690 2745 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 */ 2693 2748 mrb_define_method(mrb, s, "downcase", mrb_str_downcase, MRB_ARGS_NONE()); /* 15.2.10.5.13 */ 2694 2749 mrb_define_method(mrb, s, "downcase!", mrb_str_downcase_bang, MRB_ARGS_NONE()); /* 15.2.10.5.14 */ … … 2720 2775 mrb_define_method(mrb, s, "inspect", mrb_str_inspect, MRB_ARGS_NONE()); /* 15.2.10.5.46(x) */ 2721 2776 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 2799 static 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 */ 2804 static 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 2816 MRB_API double 2817 mrb_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 3013 done: 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 7 7 #include <limits.h> 8 8 #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> 13 14 14 15 /* ------------------------------------------------------ */ … … 355 356 break; 356 357 case '!': 357 if (*++m == '=') ++m; 358 switch (*++m) { 359 case '=': case '~': ++m; 360 } 358 361 break; 359 362 case '+': case '-': … … 480 483 481 484 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"); 482 487 483 488 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 2 2 #define MRB_VALUE_ARRAY_H__ 3 3 4 #include "mruby.h"4 #include <mruby.h> 5 5 6 6 static inline void -
EcnlProtoTool/trunk/mruby-1.3.0/src/variable.c
r321 r331 5 5 */ 6 6 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> 12 12 13 13 typedef int (iv_foreach_func)(mrb_state*,mrb_sym,mrb_value,void*); … … 45 45 iv_tbl *t; 46 46 47 t = mrb_malloc(mrb, sizeof(iv_tbl));47 t = (iv_tbl*)mrb_malloc(mrb, sizeof(iv_tbl)); 48 48 t->size = 0; 49 49 t->rootseg = NULL; … … 103 103 } 104 104 105 seg = mrb_malloc(mrb, sizeof(segment));105 seg = (segment*)mrb_malloc(mrb, sizeof(segment)); 106 106 if (!seg) return; 107 107 seg->next = NULL; … … 283 283 #else 284 284 285 #include "mruby/khash.h"285 #include <mruby/khash.h> 286 286 287 287 #ifndef MRB_IVHASH_INIT_SIZE … … 490 490 iv_tbl *t = obj->iv; 491 491 492 if (MRB_FROZEN_P(obj)) { 493 mrb_raisef(mrb, E_RUNTIME_ERROR, "can't modify frozen %S", mrb_obj_value(obj)); 494 } 492 495 if (!t) { 493 496 t = obj->iv = iv_new(mrb); … … 757 760 758 761 MRB_API mrb_value 759 mrb_mod_cv_get(mrb_state *mrb, struct RClass * 762 mrb_mod_cv_get(mrb_state *mrb, struct RClass *c, mrb_sym sym) 760 763 { 761 764 struct RClass * cls = c; 762 765 mrb_value v; 766 int given = FALSE; 763 767 764 768 while (c) { 765 769 if (c->iv && iv_get(mrb, c->iv, sym, &v)) { 766 return v;770 given = TRUE; 767 771 } 768 772 c = c->super; 769 773 } 774 if (given) return v; 770 775 if (cls && cls->tt == MRB_TT_SCLASS) { 771 776 mrb_value klass; … … 774 779 mrb_intern_lit(mrb, "__attached__")); 775 780 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; 777 783 while (c) { 778 784 if (c->iv && iv_get(mrb, c->iv, sym, &v)) { 779 return v;785 given = TRUE; 780 786 } 781 787 c = c->super; 782 788 } 789 if (given) return v; 783 790 } 784 791 } … … 813 820 } 814 821 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); 821 848 } 822 849 … … 927 954 return v; 928 955 } 929 if (c->tt == MRB_TT_SCLASS) { 956 c2 = c; 957 while (c2 && c2->tt == MRB_TT_SCLASS) { 930 958 mrb_value klass; 931 klass = mrb_obj_iv_get(mrb, (struct RObject *)c ,959 klass = mrb_obj_iv_get(mrb, (struct RObject *)c2, 932 960 mrb_intern_lit(mrb, "__attached__")); 933 961 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; 937 964 c2 = c; 938 965 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> 3 3 4 4 void … … 10 10 mrb_define_global_const(mrb, "RUBY_ENGINE", mrb_str_new_lit(mrb, MRUBY_RUBY_ENGINE)); 11 11 mrb_define_global_const(mrb, "RUBY_ENGINE_VERSION", mruby_version); 12 mrb_define_global_const(mrb, "MRUBY_VERSION", mr b_str_new_lit(mrb, MRUBY_VERSION));12 mrb_define_global_const(mrb, "MRUBY_VERSION", mruby_version); 13 13 mrb_define_global_const(mrb, "MRUBY_RELEASE_NO", mrb_fixnum_value(MRUBY_RELEASE_NO)); 14 14 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 8 8 #include <stdarg.h> 9 9 #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> 22 22 #include "value_array.h" 23 #include "mruby/throw.h"24 25 #if def MRB_DISABLE_STDIO23 #include <mruby/throw.h> 24 25 #ifndef MRB_DISABLE_STDIO 26 26 #if defined(__cplusplus) 27 27 extern "C" { … … 36 36 #define CALLINFO_INIT_SIZE 32 37 37 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 38 46 /* Define amount of linear stack growth. */ 39 47 #ifndef MRB_STACK_GROWTH 40 48 #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 41 54 #endif 42 55 … … 54 67 55 68 #define ARENA_RESTORE(mrb,ai) (mrb)->gc.arena_idx = (ai) 69 70 #define CALL_MAXARGS 127 71 72 void mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value self, mrb_value args); 56 73 57 74 static inline void … … 99 116 100 117 static inline void 101 envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase )118 envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase, size_t size) 102 119 { 103 120 mrb_callinfo *ci = mrb->c->cibase; … … 106 123 while (ci <= mrb->c->ci) { 107 124 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) { 109 129 ptrdiff_t off = e->stack - oldbase; 110 130 … … 116 136 } 117 137 118 static inline void119 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 127 138 /** def rec ; $deep =+ 1 ; if $deep > 1000 ; return 0 ; end ; rec ; end */ 128 139 129 140 static void 130 stack_extend_alloc(mrb_state *mrb, int room , int keep)141 stack_extend_alloc(mrb_state *mrb, int room) 131 142 { 132 143 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; 136 150 #ifdef MRB_STACK_EXTEND_DOUBLING 137 151 if (room <= size) … … 149 163 #endif 150 164 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; 152 172 mrb->c->stack = mrb->c->stbase + off; 153 173 mrb->c->stend = mrb->c->stbase + size; 154 envadjust(mrb, oldbase, mrb->c->stbase);155 174 156 175 /* Raise an exception if the new stack size will be too large, 157 176 to prevent infinite recursion. However, do this only after resizing the stack, so mrb_raise has stack space to work with. */ 158 177 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)); 161 179 } 162 180 } 163 181 164 182 static inline void 165 stack_extend(mrb_state *mrb, int room , int keep)183 stack_extend(mrb_state *mrb, int room) 166 184 { 167 185 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 } 171 188 } 172 189 … … 188 205 int cioff = e->cioff; 189 206 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)) { 192 209 return TRUE; 193 210 } … … 210 227 #define CI_ACC_SKIP -1 211 228 #define CI_ACC_DIRECT -2 229 #define CI_ACC_RESUMED -3 212 230 213 231 static mrb_callinfo* … … 217 235 mrb_callinfo *ci = c->ci; 218 236 219 int eidx = ci->eidx;220 237 int ridx = ci->ridx; 221 238 … … 228 245 } 229 246 ci = ++c->ci; 230 ci->e idx =eidx;247 ci->epos = mrb->c->eidx; 231 248 ci->ridx = ridx; 232 249 ci->env = 0; … … 234 251 ci->err = 0; 235 252 ci->proc = 0; 253 ci->acc = 0; 236 254 237 255 return ci; 256 } 257 258 MRB_API void 259 mrb_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); 238 280 } 239 281 … … 242 284 { 243 285 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; 257 287 258 288 c->ci--; 259 } 289 290 if (env) { 291 mrb_env_unshare(mrb, env); 292 } 293 } 294 295 void mrb_exc_set(mrb_state *mrb, mrb_value exc); 260 296 261 297 static void … … 263 299 { 264 300 struct RProc *p; 265 mrb_callinfo *ci ;301 mrb_callinfo *ci = mrb->c->ci; 266 302 mrb_value *self = mrb->c->stack; 267 303 struct RObject *exc; 304 ptrdiff_t cioff; 305 int ai = mrb_gc_arena_save(mrb); 268 306 269 307 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 } 270 311 p = mrb->c->ensure[i]; 271 312 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; 274 315 ci = cipush(mrb); 275 316 ci->stackent = mrb->c->stack; … … 282 323 mrb->c->stack = mrb->c->stack + ci[-1].nregs; 283 324 exc = mrb->exc; mrb->exc = 0; 325 if (exc) { 326 mrb_gc_protect(mrb, mrb_obj_value(exc)); 327 } 284 328 mrb_run(mrb, p, *self); 285 mrb->c-> ensure[i] = NULL;329 mrb->c->ci = mrb->c->cibase + cioff; 286 330 if (!mrb->exc) mrb->exc = exc; 331 mrb_gc_arena_restore(mrb, ai); 287 332 } 288 333 … … 335 380 } 336 381 MRB_END_EXC(&c_jmp); 382 mrb->jmp = 0; 337 383 } 338 384 else { 339 385 struct RProc *p; 340 386 struct RClass *c; 341 mrb_sym undef = 0;342 387 mrb_callinfo *ci; 343 388 int n; … … 354 399 p = mrb_method_search_vm(mrb, &c, mid); 355 400 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)); 360 414 } 361 415 ci = cipush(mrb); … … 371 425 if (MRB_PROC_CFUNC_P(p)) { 372 426 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; 374 435 } 375 436 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); 378 440 } 379 441 if (voff >= 0) { … … 381 443 } 382 444 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) { 390 446 stack_copy(mrb->c->stack+1, argv, argc); 391 447 } … … 414 470 { 415 471 return mrb_funcall_with_block(mrb, self, mid, argc, argv, mrb_nil_value()); 472 } 473 474 mrb_value 475 mrb_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; 416 501 } 417 502 … … 446 531 447 532 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 } 448 538 449 539 c = mrb_class(mrb, self); … … 451 541 452 542 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 457 546 ci->mid = name; 458 547 ci->target_class = c; 459 ci->proc = p;460 548 regs = mrb->c->stack+1; 461 549 /* remove first symbol from arguments */ … … 470 558 } 471 559 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); 492 561 } 493 562 … … 497 566 struct RProc *p; 498 567 mrb_callinfo *ci; 568 mrb_int max = 3; 499 569 500 570 if (mrb_nil_p(blk)) { … … 503 573 ci = mrb->c->ci; 504 574 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); 506 577 } 507 578 ci->target_class = c; 508 579 p = mrb_proc_ptr(blk); 509 580 ci->proc = p; 581 ci->argc = 1; 582 ci->mid = ci[-1].mid; 510 583 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(); 511 588 return p->body.func(mrb, self); 512 589 } 513 590 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(); 514 596 ci = cipush(mrb); 515 597 ci->nregs = 0; … … 600 682 mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given"); 601 683 } 684 if (mrb->c->ci - mrb->c->cibase > MRB_FUNCALL_DEPTH_MAX) { 685 mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err)); 686 } 602 687 p = mrb_proc_ptr(b); 603 688 ci = cipush(mrb); … … 611 696 if (MRB_PROC_CFUNC_P(p)) { 612 697 ci->nregs = argc + 2; 613 stack_extend(mrb, ci->nregs , 0);698 stack_extend(mrb, ci->nregs); 614 699 } 615 700 else { 616 701 ci->nregs = p->body.irep->nregs; 617 stack_extend(mrb, ci->nregs , argc+2);702 stack_extend(mrb, ci->nregs); 618 703 } 619 704 … … 627 712 val = p->body.func(mrb, self); 628 713 mrb->c->stack = mrb->c->ci->stackent; 629 cipop(mrb);630 714 } 631 715 else { 716 int cioff = mrb->c->ci - mrb->c->cibase; 632 717 val = mrb_run(mrb, p, self); 633 } 718 mrb->c->ci = mrb->c->cibase + cioff; 719 } 720 cipop(mrb); 634 721 return val; 635 722 } … … 649 736 650 737 return mrb_yield_with_class(mrb, b, 1, &arg, p->env->stack[0], p->target_class); 738 } 739 740 mrb_value 741 mrb_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 763 static struct RBreak* 764 break_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; 651 774 } 652 775 … … 670 793 mrb_str_cat(mrb, msg, kind_str[kind], kind_str_len[kind]); 671 794 exc = mrb_exc_new_str(mrb, E_LOCALJUMP_ERROR, msg); 672 mrb ->exc = mrb_obj_ptr(exc);795 mrb_exc_set(mrb, exc); 673 796 } 674 797 … … 678 801 mrb_value exc; 679 802 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 } 681 811 if (mrb->c->ci->mid) { 682 812 str = mrb_format(mrb, "'%S': wrong number of arguments (%S for %S)", 683 813 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)); 685 815 } 686 816 else { 687 817 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)); 689 819 } 690 820 exc = mrb_exc_new_str(mrb, E_ARGUMENT_ERROR, str); 691 mrb ->exc = mrb_obj_ptr(exc);821 mrb_exc_set(mrb, exc); 692 822 } 693 823 … … 700 830 #endif 701 831 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 702 839 #if defined __GNUC__ || defined __clang__ || defined __INTEL_COMPILER 703 840 #define DIRECT_THREADED … … 706 843 #ifndef DIRECT_THREADED 707 844 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)) { 709 846 #define CASE(op) case op: 710 847 #define NEXT pc++; break … … 716 853 #define INIT_DISPATCH JUMP; return mrb_nil_value(); 717 854 #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)] 720 857 721 858 #define END_DISPATCH … … 723 860 #endif 724 861 725 #define CALL_MAXARGS 127726 727 void mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value self, mrb_value args);728 729 862 MRB_API mrb_value 730 mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep) 863 mrb_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 892 MRB_API mrb_value 893 mrb_vm_exec(mrb_state *mrb, struct RProc *proc, mrb_code *pc) 731 894 { 732 895 /* mrb_assert(mrb_proc_cfunc_p(proc)) */ 733 896 mrb_irep *irep = proc->body.irep; 734 mrb_code *pc = irep->iseq;735 897 mrb_value *pool = irep->pool; 736 898 mrb_sym *syms = irep->syms; 737 mrb_value *regs = NULL;738 899 mrb_code i; 739 900 int ai = mrb_gc_arena_save(mrb); … … 773 934 if (exc_catched) { 774 935 exc_catched = FALSE; 936 if (mrb->exc && mrb->exc->tt == MRB_TT_BREAK) 937 goto L_BREAK; 775 938 goto L_RAISE; 776 939 } 777 940 mrb->jmp = &c_jmp; 778 if (!mrb->c->stack) {779 stack_init(mrb);780 }781 stack_extend(mrb, irep->nregs, stack_keep);782 941 mrb->c->ci->proc = proc; 783 942 mrb->c->ci->nregs = irep->nregs; 784 regs = mrb->c->stack; 785 regs[0] = self; 786 943 944 #define regs (mrb->c->stack) 787 945 INIT_DISPATCH { 788 946 CASE(OP_NOP) { … … 793 951 CASE(OP_MOVE) { 794 952 /* 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]; 796 956 NEXT; 797 957 } … … 799 959 CASE(OP_LOADL) { 800 960 /* 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 802 972 NEXT; 803 973 } … … 811 981 CASE(OP_LOADSYM) { 812 982 /* 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]); 814 986 NEXT; 815 987 } … … 817 989 CASE(OP_LOADSELF) { 818 990 /* A R(A) := self */ 819 regs[GETARG_A(i)] = regs[0]; 991 int a = GETARG_A(i); 992 regs[a] = regs[0]; 820 993 NEXT; 821 994 } … … 823 996 CASE(OP_LOADT) { 824 997 /* A R(A) := true */ 825 SET_TRUE_VALUE(regs[GETARG_A(i)]); 998 int a = GETARG_A(i); 999 SET_TRUE_VALUE(regs[a]); 826 1000 NEXT; 827 1001 } … … 829 1003 CASE(OP_LOADF) { 830 1004 /* A R(A) := false */ 831 SET_FALSE_VALUE(regs[GETARG_A(i)]); 1005 int a = GETARG_A(i); 1006 SET_FALSE_VALUE(regs[a]); 832 1007 NEXT; 833 1008 } … … 835 1010 CASE(OP_GETGLOBAL) { 836 1011 /* 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; 838 1016 NEXT; 839 1017 } 840 1018 841 1019 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]); 844 1024 NEXT; 845 1025 } … … 847 1027 CASE(OP_GETSPECIAL) { 848 1028 /* 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; 850 1033 NEXT; 851 1034 } … … 853 1036 CASE(OP_SETSPECIAL) { 854 1037 /* 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]); 856 1041 NEXT; 857 1042 } … … 859 1044 CASE(OP_GETIV) { 860 1045 /* 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; 862 1050 NEXT; 863 1051 } 864 1052 865 1053 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]); 868 1058 NEXT; 869 1059 } … … 871 1061 CASE(OP_GETCV) { 872 1062 /* A Bx R(A) := cvget(Syms(Bx)) */ 1063 int a = GETARG_A(i); 1064 int bx = GETARG_Bx(i); 1065 mrb_value val; 873 1066 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]); 875 1068 ERR_PC_CLR(mrb); 1069 regs[a] = val; 876 1070 NEXT; 877 1071 } 878 1072 879 1073 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]); 882 1078 NEXT; 883 1079 } … … 886 1082 /* A Bx R(A) := constget(Syms(Bx)) */ 887 1083 mrb_value val; 1084 int a = GETARG_A(i); 1085 int bx = GETARG_Bx(i); 1086 mrb_sym sym = syms[bx]; 888 1087 889 1088 ERR_PC_SET(mrb, pc); 890 val = mrb_vm_const_get(mrb, sym s[GETARG_Bx(i)]);1089 val = mrb_vm_const_get(mrb, sym); 891 1090 ERR_PC_CLR(mrb); 892 regs = mrb->c->stack; 893 regs[GETARG_A(i)] = val; 1091 regs[a] = val; 894 1092 NEXT; 895 1093 } … … 897 1095 CASE(OP_SETCONST) { 898 1096 /* 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]); 900 1100 NEXT; 901 1101 } … … 905 1105 mrb_value val; 906 1106 int a = GETARG_A(i); 1107 int bx = GETARG_Bx(i); 907 1108 908 1109 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]); 910 1111 ERR_PC_CLR(mrb); 911 regs = mrb->c->stack;912 1112 regs[a] = val; 913 1113 NEXT; … … 917 1117 /* A Bx R(A+1)::Syms(Bx) := R(A) */ 918 1118 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]); 921 1121 NEXT; 922 1122 } … … 924 1124 CASE(OP_GETUPVAR) { 925 1125 /* 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); 930 1131 931 1132 if (!e) { … … 933 1134 } 934 1135 else { 935 int idx = GETARG_B(i); 936 *regs_a = e->stack[idx]; 1136 *regs_a = e->stack[b]; 937 1137 } 938 1138 NEXT; … … 941 1141 CASE(OP_SETUPVAR) { 942 1142 /* 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); 946 1148 947 1149 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 } 952 1156 } 953 1157 NEXT; … … 956 1160 CASE(OP_JMP) { 957 1161 /* sBx pc+=sBx */ 958 pc += GETARG_sBx(i); 1162 int sbx = GETARG_sBx(i); 1163 pc += sbx; 959 1164 JUMP; 960 1165 } … … 962 1167 CASE(OP_JMPIF) { 963 1168 /* 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; 966 1173 JUMP; 967 1174 } … … 971 1178 CASE(OP_JMPNOT) { 972 1179 /* 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; 975 1184 JUMP; 976 1185 } … … 980 1189 CASE(OP_ONERR) { 981 1190 /* sBx pc+=sBx on exception */ 1191 int sbx = GETARG_sBx(i); 982 1192 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; 984 1194 else mrb->c->rsize *= 2; 985 1195 mrb->c->rescue = (mrb_code **)mrb_realloc(mrb, mrb->c->rescue, sizeof(mrb_code*) * mrb->c->rsize); 986 1196 } 987 mrb->c->rescue[mrb->c->ci->ridx++] = pc + GETARG_sBx(i);1197 mrb->c->rescue[mrb->c->ci->ridx++] = pc + sbx; 988 1198 NEXT; 989 1199 } 990 1200 991 1201 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 } 995 1239 NEXT; 996 1240 } … … 1008 1252 CASE(OP_RAISE) { 1009 1253 /* 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]); 1011 1257 goto L_RAISE; 1012 1258 } … … 1014 1260 CASE(OP_EPUSH) { 1015 1261 /* Bx ensure_push(SEQ[Bx]) */ 1262 int bx = GETARG_Bx(i); 1016 1263 struct RProc *p; 1017 1264 1018 p = mrb_closure_new(mrb, irep->reps[ GETARG_Bx(i)]);1265 p = mrb_closure_new(mrb, irep->reps[bx]); 1019 1266 /* 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; 1022 1269 else mrb->c->esize *= 2; 1023 1270 mrb->c->ensure = (struct RProc **)mrb_realloc(mrb, mrb->c->ensure, sizeof(struct RProc*) * mrb->c->esize); 1024 1271 } 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; 1026 1274 ARENA_RESTORE(mrb, ai); 1027 1275 NEXT; … … 1032 1280 int a = GETARG_A(i); 1033 1281 mrb_callinfo *ci = mrb->c->ci; 1034 int n, e idx = 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); 1038 1286 ARENA_RESTORE(mrb, ai); 1039 1287 } … … 1061 1309 struct RProc *m; 1062 1310 struct RClass *c; 1063 mrb_callinfo *ci ;1311 mrb_callinfo *ci = mrb->c->ci; 1064 1312 mrb_value recv, result; 1065 1313 mrb_sym mid = syms[GETARG_B(i)]; 1314 int bidx; 1315 mrb_value blk; 1066 1316 1067 1317 recv = regs[a]; 1318 if (n == CALL_MAXARGS) { 1319 bidx = a+2; 1320 } 1321 else { 1322 bidx = a+n+1; 1323 } 1068 1324 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; 1074 1341 } 1075 1342 } … … 1090 1357 args = mrb_ary_new_from_values(mrb, n, regs+a+1); 1091 1358 } 1359 ERR_PC_SET(mrb, pc); 1092 1360 mrb_method_missing(mrb, mid, recv, args); 1093 1361 } 1094 1362 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); 1102 1372 } 1103 1373 … … 1125 1395 } 1126 1396 result = m->body.func(mrb, recv); 1127 mrb->c->stack[0] = result;1128 1397 mrb_gc_arena_restore(mrb, ai); 1129 1398 if (mrb->exc) goto L_RAISE; 1130 /* pop stackpos */1131 1399 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 } 1132 1409 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)); 1134 1416 proc = ci[-1].proc; 1135 1417 irep = proc->body.irep; … … 1138 1420 } 1139 1421 } 1140 regs = mrb->c->stack = ci->stackent; 1422 mrb->c->stack[0] = result; 1423 /* pop stackpos */ 1424 mrb->c->stack = ci->stackent; 1141 1425 pc = ci->pc; 1142 1426 cipop(mrb); … … 1152 1436 if (n == CALL_MAXARGS) { 1153 1437 ci->argc = -1; 1154 stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs , 3);1438 stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs); 1155 1439 } 1156 1440 else { 1157 1441 ci->argc = n; 1158 stack_extend(mrb, irep->nregs, n+2); 1159 } 1160 regs = mrb->c->stack; 1442 stack_extend(mrb, irep->nregs); 1443 } 1161 1444 pc = irep->iseq; 1162 1445 JUMP; … … 1166 1449 CASE(OP_FSEND) { 1167 1450 /* A B C R(A) := fcall(R(A),Syms(B),R(A+1),... ,R(A+C-1)) */ 1451 /* not implemented yet */ 1168 1452 NEXT; 1169 1453 } … … 1180 1464 ci->proc = m; 1181 1465 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; 1185 1475 if (!m->env->stack) { 1186 1476 m->env->stack = mrb->c->stack; … … 1195 1485 /* pop stackpos */ 1196 1486 ci = mrb->c->ci; 1197 regs =mrb->c->stack = ci->stackent;1487 mrb->c->stack = ci->stackent; 1198 1488 regs[ci->acc] = recv; 1199 1489 pc = ci->pc; … … 1215 1505 syms = irep->syms; 1216 1506 ci->nregs = irep->nregs; 1507 stack_extend(mrb, irep->nregs); 1217 1508 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 } 1225 1519 pc = irep->iseq; 1226 1520 JUMP; … … 1237 1531 int a = GETARG_A(i); 1238 1532 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) { 1241 1537 mrb_value exc; 1242 1538 1243 1539 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); 1245 1541 goto L_RAISE; 1246 1542 } … … 1249 1545 m = mrb_method_search_vm(mrb, &c, mid); 1250 1546 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 } 1253 1566 if (n == CALL_MAXARGS) { 1254 1567 mrb_ary_unshift(mrb, regs[a+1], mrb_symbol_value(ci->mid)); … … 1258 1571 SET_SYM_VALUE(regs[a+1], ci->mid); 1259 1572 } 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; 1260 1591 } 1261 1592 … … 1265 1596 ci->proc = m; 1266 1597 ci->stackent = mrb->c->stack; 1598 ci->target_class = c; 1599 ci->pc = pc + 1; 1267 1600 if (n == CALL_MAXARGS) { 1268 1601 ci->argc = -1; … … 1271 1604 ci->argc = n; 1272 1605 } 1273 ci->target_class = c;1274 ci->pc = pc + 1;1275 1606 1276 1607 /* prepare stack */ … … 1279 1610 1280 1611 if (MRB_PROC_CFUNC_P(m)) { 1612 mrb_value v; 1613 1281 1614 if (n == CALL_MAXARGS) { 1282 1615 ci->nregs = 3; … … 1285 1618 ci->nregs = n + 2; 1286 1619 } 1287 mrb->c->stack[0]= m->body.func(mrb, recv);1620 v = m->body.func(mrb, recv); 1288 1621 mrb_gc_arena_restore(mrb, ai); 1289 1622 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; 1290 1638 /* pop stackpos */ 1291 regs = mrb->c->stack = mrb->c->ci->stackent; 1639 mrb->c->stack = ci->stackent; 1640 pc = ci->pc; 1292 1641 cipop(mrb); 1293 NEXT;1642 JUMP; 1294 1643 } 1295 1644 else { … … 1304 1653 ci->nregs = irep->nregs; 1305 1654 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); 1307 1656 } 1308 1657 else { 1309 stack_extend(mrb, irep->nregs, ci->argc+2); 1310 } 1311 regs = mrb->c->stack; 1658 stack_extend(mrb, irep->nregs); 1659 } 1312 1660 pc = irep->iseq; 1313 1661 JUMP; … … 1325 1673 mrb_value *stack; 1326 1674 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 } 1327 1683 if (lv == 0) stack = regs + 1; 1328 1684 else { 1329 1685 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; 1337 1687 stack = e->stack + 1; 1338 1688 } … … 1388 1738 mrb_value *blk = &argv[argc < 0 ? 1 : argc]; 1389 1739 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 }1393 1740 if (argc < 0) { 1394 1741 struct RArray *ary = mrb_ary_ptr(regs[1]); … … 1410 1757 argv = mrb_ary_ptr(argv[0])->ptr; 1411 1758 } 1412 mrb->c->ci->argc = len;1413 1759 if (argc < len) { 1414 1760 int mlen = m2; … … 1424 1770 value_move(®s[1], argv, argc-mlen); /* m1 + o */ 1425 1771 } 1772 if (argc < m1) { 1773 stack_clear(®s[argc+1], m1-argc); 1774 } 1426 1775 if (mlen) { 1427 1776 value_move(®s[len-m2+1], &argv[argc-mlen], mlen); 1777 } 1778 if (mlen < m2) { 1779 stack_clear(®s[len-m2+mlen+1], m2-mlen); 1428 1780 } 1429 1781 if (r) { … … 1454 1806 pc += o + 1; 1455 1807 } 1808 mrb->c->ci->argc = len; 1809 /* clear local (but non-argument) variables */ 1810 if (irep->nlocals-len-2 > 0) { 1811 stack_clear(®s[len+2], irep->nlocals-len-2); 1812 } 1456 1813 JUMP; 1457 1814 } … … 1474 1831 CASE(OP_RETURN) { 1475 1832 /* 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 1476 1855 if (mrb->exc) { 1477 mrb_callinfo *ci ;1478 int eidx;1856 mrb_callinfo *ci0; 1857 mrb_value *stk; 1479 1858 1480 1859 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; 1485 1861 if (ci == mrb->c->cibase) { 1486 if (ci->ridx == 0) goto L_ STOP;1862 if (ci->ridx == 0) goto L_FTOP; 1487 1863 goto L_RESCUE; 1488 1864 } 1865 stk = mrb->c->stack; 1489 1866 while (ci[0].ridx == ci[-1].ridx) { 1490 1867 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) { 1494 1870 mrb->jmp = prev_jmp; 1495 1871 MRB_THROW(prev_jmp); 1496 1872 } 1873 ci = mrb->c->ci; 1497 1874 if (ci == mrb->c->cibase) { 1498 while (eidx > 0) { 1499 ecall(mrb, --eidx); 1500 } 1875 mrb->c->stack = stk; 1501 1876 if (ci->ridx == 0) { 1877 L_FTOP: /* fiber top */ 1502 1878 if (mrb->c == mrb->root_c) { 1503 regs =mrb->c->stack = mrb->c->stbase;1879 mrb->c->stack = mrb->c->stbase; 1504 1880 goto L_STOP; 1505 1881 } … … 1507 1883 struct mrb_context *c = mrb->c; 1508 1884 1885 if (c->fib) { 1886 mrb_write_barrier(mrb, (struct RBasic*)c->fib); 1887 } 1509 1888 mrb->c = c->prev; 1510 1889 c->prev = NULL; … … 1516 1895 /* call ensure only when we skip this callinfo */ 1517 1896 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; 1520 1900 } 1521 1901 } … … 1527 1907 pool = irep->pool; 1528 1908 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); 1530 1913 pc = mrb->c->rescue[--ci->ridx]; 1531 1914 } 1532 1915 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); 1537 1921 switch (GETARG_B(i)) { 1538 1922 case OP_R_RETURN: 1539 1923 /* 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)) { 1541 1925 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) { 1544 1929 localjump_error(mrb, LOCALJUMP_ERROR_RETURN); 1545 1930 goto L_RAISE; 1546 1931 } 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) { 1549 1945 localjump_error(mrb, LOCALJUMP_ERROR_RETURN); 1550 1946 goto L_RAISE; 1551 1947 } 1552 1948 mrb->c->stack = mrb->c->ci->stackent; 1553 mrb->c->ci = c i;1949 mrb->c->ci = ce; 1554 1950 break; 1555 1951 } 1556 1952 case OP_R_NORMAL: 1953 NORMAL_RETURN: 1557 1954 if (ci == mrb->c->cibase) { 1558 1955 if (!mrb->c->prev) { /* toplevel return */ … … 1562 1959 if (mrb->c->prev->ci == mrb->c->prev->cibase) { 1563 1960 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); 1565 1962 goto L_RAISE; 1963 } 1964 while (mrb->c->eidx > 0) { 1965 ecall(mrb, --mrb->c->eidx); 1566 1966 } 1567 1967 /* automatic yield at the end */ … … 1573 1973 break; 1574 1974 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 } 1575 1985 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; 1578 1987 } 1579 1988 /* break from fiber block */ … … 1581 1990 struct mrb_context *c = mrb->c; 1582 1991 1992 while (mrb->c->eidx > 0) { 1993 ecall(mrb, --mrb->c->eidx); 1994 } 1583 1995 mrb->c = c->prev; 1584 1996 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 } 1587 2016 mrb->c->stack = ci->stackent; 1588 2017 mrb->c->ci = mrb->c->cibase + proc->env->cioff + 1; 1589 2018 while (ci > mrb->c->ci) { 2019 if (ci->env) { 2020 mrb_env_unshare(mrb, ci->env); 2021 } 1590 2022 if (ci[-1].acc == CI_ACC_SKIP) { 1591 2023 mrb->c->ci = ci; 1592 break;2024 goto L_BREAK_ERROR; 1593 2025 } 1594 2026 ci--; … … 1599 2031 break; 1600 2032 } 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; 1609 2039 mrb->jmp = prev_jmp; 1610 2040 return v; 1611 2041 } 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))); 1613 2053 proc = mrb->c->ci->proc; 1614 2054 irep = proc->body.irep; … … 1617 2057 1618 2058 regs[acc] = v; 2059 ARENA_RESTORE(mrb, ai); 1619 2060 } 1620 2061 JUMP; … … 1636 2077 if (!m) { 1637 2078 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; 1641 2094 if (n == CALL_MAXARGS) { 1642 2095 mrb_ary_unshift(mrb, regs[a+1], sym); … … 1663 2116 1664 2117 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; 1666 2120 mrb_gc_arena_restore(mrb, ai); 1667 2121 goto L_RETURN; … … 1673 2127 syms = irep->syms; 1674 2128 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); 1676 2130 } 1677 2131 else { 1678 stack_extend(mrb, irep->nregs, ci->argc+2); 1679 } 1680 regs = mrb->c->stack; 2132 stack_extend(mrb, irep->nregs); 2133 } 1681 2134 pc = irep->iseq; 1682 2135 } … … 1697 2150 else { 1698 2151 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)) { 1700 2154 localjump_error(mrb, LOCALJUMP_ERROR_YIELD); 1701 2155 goto L_RAISE; 1702 2156 } 1703 2157 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; 1704 2162 } 1705 2163 regs[a] = stack[m1+r+m2]; … … 1833 2291 case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM): 1834 2292 { 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); 1844 2299 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); 1854 2302 } 1855 2303 break; … … 1936 2384 #ifdef MRB_NAN_BOXING 1937 2385 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; 1939 2388 } 1940 2389 #endif … … 2089 2538 CASE(OP_ARRAY) { 2090 2539 /* 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), ®s[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, ®s[b]); 2544 regs[a] = v; 2092 2545 ARENA_RESTORE(mrb, ai); 2093 2546 NEXT; … … 2096 2549 CASE(OP_ARYCAT) { 2097 2550 /* 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); 2100 2555 ARENA_RESTORE(mrb, ai); 2101 2556 NEXT; … … 2104 2559 CASE(OP_ARYPUSH) { 2105 2560 /* 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]); 2107 2564 NEXT; 2108 2565 } … … 2111 2568 /* A B C R(A) := R(B)[C] */ 2112 2569 int a = GETARG_A(i); 2570 int b = GETARG_B(i); 2113 2571 int c = GETARG_C(i); 2114 mrb_value v = regs[ GETARG_B(i)];2572 mrb_value v = regs[b]; 2115 2573 2116 2574 if (!mrb_array_p(v)) { 2117 2575 if (c == 0) { 2118 regs[ GETARG_A(i)] = v;2576 regs[a] = v; 2119 2577 } 2120 2578 else { … … 2123 2581 } 2124 2582 else { 2125 regs[GETARG_A(i)] = mrb_ary_ref(mrb, v, c); 2583 v = mrb_ary_ref(mrb, v, c); 2584 regs[a] = v; 2126 2585 } 2127 2586 NEXT; … … 2130 2589 CASE(OP_ASET) { 2131 2590 /* 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]); 2133 2595 NEXT; 2134 2596 } … … 2140 2602 int pre = GETARG_B(i); 2141 2603 int post = GETARG_C(i); 2142 2143 2604 struct RArray *ary; 2144 2605 int len, idx; … … 2150 2611 len = ary->len; 2151 2612 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; 2153 2615 while (post--) { 2154 2616 regs[a++] = ary->ptr[len-post-1]; … … 2156 2618 } 2157 2619 else { 2158 regs[a++] = mrb_ary_new_capa(mrb, 0); 2620 v = mrb_ary_new_capa(mrb, 0); 2621 regs[a++] = v; 2159 2622 for (idx=0; idx+pre<len; idx++) { 2160 2623 regs[a+idx] = ary->ptr[pre+idx]; … … 2171 2634 CASE(OP_STRING) { 2172 2635 /* 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; 2174 2638 ARENA_RESTORE(mrb, ai); 2175 2639 NEXT; … … 2179 2643 /* A B R(A).concat(R(B)) */ 2180 2644 mrb_str_concat(mrb, regs[GETARG_A(i)], regs[GETARG_B(i)]); 2181 regs = mrb->c->stack;2182 2645 NEXT; 2183 2646 } … … 2224 2687 CASE(OP_CLASS) { 2225 2688 /* A B R(A) := newclass(R(A),Syms(B),R(A+1)) */ 2226 struct RClass *c = 0 ;2689 struct RClass *c = 0, *baseclass; 2227 2690 int a = GETARG_A(i); 2228 2691 mrb_value base, super; … … 2232 2695 super = regs[a+1]; 2233 2696 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); 2235 2701 } 2236 2702 c = mrb_vm_define_class(mrb, base, super, id); … … 2242 2708 CASE(OP_MODULE) { 2243 2709 /* A B R(A) := newmodule(R(A),Syms(B)) */ 2244 struct RClass *c = 0 ;2710 struct RClass *c = 0, *baseclass; 2245 2711 int a = GETARG_A(i); 2246 2712 mrb_value base; … … 2249 2715 base = regs[a]; 2250 2716 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); 2252 2721 } 2253 2722 c = mrb_vm_define_module(mrb, base, id); … … 2263 2732 mrb_value recv = regs[a]; 2264 2733 struct RProc *p; 2734 2735 /* prepare closure */ 2736 p = mrb_closure_new(mrb, irep->reps[GETARG_Bx(i)]); 2737 p->c = NULL; 2265 2738 2266 2739 /* prepare stack */ … … 2276 2749 mrb->c->stack += a; 2277 2750 2278 p = mrb_proc_new(mrb, irep->reps[GETARG_Bx(i)]);2751 /* setup closure */ 2279 2752 p->target_class = ci->target_class; 2280 2753 ci->proc = p; 2281 2754 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; 2302 2763 } 2303 2764 … … 2324 2785 if (!mrb->c->ci->target_class) { 2325 2786 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); 2327 2788 goto L_RAISE; 2328 2789 } … … 2334 2795 /* A B C R(A) := range_new(R(B),R(B+1),C) */ 2335 2796 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; 2337 2799 ARENA_RESTORE(mrb, ai); 2338 2800 NEXT; … … 2357 2819 L_STOP: 2358 2820 { 2359 int e idx_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); 2363 2825 } 2364 2826 } … … 2382 2844 exc = mrb_exc_new_str(mrb, E_LOCALJUMP_ERROR, msg); 2383 2845 } 2384 mrb ->exc = mrb_obj_ptr(exc);2846 mrb_exc_set(mrb, exc); 2385 2847 goto L_RAISE; 2386 2848 } 2387 2849 } 2388 2850 END_DISPATCH; 2851 #undef regs 2389 2852 2390 2853 } … … 2399 2862 mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) 2400 2863 { 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 } 2402 2870 } 2403 2871 2404 2872 MRB_API mrb_value 2405 mrb_top level_run_keep(mrb_state *mrb, struct RProc *proc, unsigned int stack_keep)2873 mrb_top_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep) 2406 2874 { 2407 2875 mrb_callinfo *ci; 2408 2876 mrb_value v; 2409 2877 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); 2412 2884 } 2413 2885 ci = cipush(mrb); 2886 ci->mid = 0; 2414 2887 ci->nregs = 1; /* protect the receiver */ 2415 2888 ci->acc = CI_ACC_SKIP; 2416 2889 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); 2418 2891 cipop(mrb); 2419 2892 … … 2421 2894 } 2422 2895 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 2900 mrb_int mrb_jmpbuf::jmpbuf_id = 0; 2901 # if !defined(MRB_ENABLE_CXX_ABI) 2902 extern "C" { 2903 # endif 2904 #endif -
EcnlProtoTool/trunk/mruby-1.3.0/tasks/libmruby.rake
r321 r331 6 6 file "#{build_dir}/lib/libmruby.flags.mak" => [__FILE__, libfile("#{build_dir}/lib/libmruby")] do |t| 7 7 open(t.name, 'w') do |f| 8 f.puts "MRUBY_CFLAGS = #{cc.all_flags .gsub('"', '\\"')}"8 f.puts "MRUBY_CFLAGS = #{cc.all_flags}" 9 9 10 10 gem_flags = gems.map { |g| g.linker.flags } 11 11 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"}" 13 13 14 14 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(' ')}" 16 16 17 17 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")}" 19 21 end 20 22 end -
EcnlProtoTool/trunk/mruby-1.3.0/tasks/mrbgem_spec.rake
r321 r331 2 2 require 'forwardable' 3 3 require 'tsort' 4 require 'shellwords' 4 5 5 6 module MRuby … … 18 19 alias mruby build 19 20 attr_accessor :build_config_initializer 21 attr_accessor :mrblib_dir, :objs_dir 20 22 21 23 attr_accessor :version … … 45 47 @initializer = block 46 48 @version = "0.0.0" 49 @mrblib_dir = "mrblib" 50 @objs_dir = "src" 47 51 MRuby::Gem.current = self 48 52 end … … 55 59 @linker = LinkerConfig.new([], [], [], [], []) 56 60 57 @rbfiles = Dir.glob("#{ dir}/mrblib/**/*.rb").sort58 @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| 59 63 objfile(f.relative_path_from(@dir).to_s.pathmap("#{build_dir}/%X")) 60 64 end … … 87 91 88 92 instance_eval(&@build_config_initializer) if @build_config_initializer 89 93 end 94 95 def setup_compilers 90 96 compilers.each do |compiler| 91 97 compiler.define_rules build_dir, "#{dir}" … … 122 128 def test_rbireps 123 129 "#{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 124 145 end 125 146 … … 182 203 print_gem_comment(f) 183 204 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? 186 207 end 187 208 … … 190 211 f.puts %Q[#include <stdio.h>] 191 212 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? 196 217 end 197 218 … … 401 422 @ary = tsort_dependencies gem_table.keys, gem_table, true 402 423 424 each(&:setup_compilers) 425 403 426 each do |g| 404 427 import_include_paths(g) … … 414 437 import_include_paths(dep_g) 415 438 439 dep_g.export_include_paths.uniq! 416 440 g.compilers.each do |compiler| 417 441 compiler.include_paths += dep_g.export_include_paths 418 442 g.export_include_paths += dep_g.export_include_paths 443 compiler.include_paths.uniq! 444 g.export_include_paths.uniq! 419 445 end 420 446 end -
EcnlProtoTool/trunk/mruby-1.3.0/tasks/mrbgems.rake
r321 r331 32 32 f.puts %Q[ */] 33 33 f.puts %Q[] 34 f.puts %Q[#include "mruby.h"]34 f.puts %Q[#include <mruby.h>] 35 35 f.puts %Q[] 36 36 f.write gem_func_decls -
EcnlProtoTool/trunk/mruby-1.3.0/tasks/mruby_build.rake
r321 r331 84 84 @gems, @libmruby = MRuby::Gem::List.new, [] 85 85 @build_mrbtest_lib_only = false 86 @cxx_exception_enabled = false 87 @cxx_exception_disabled = false 86 88 @cxx_abi_enabled = false 87 @cxx_exception_disabled = false88 89 @enable_bintest = false 89 90 @enable_test = false … … 111 112 112 113 def disable_cxx_exception 114 if @cxx_exception_enabled or @cxx_abi_enabled 115 raise "cxx_exception already enabled" 116 end 113 117 @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 114 136 end 115 137 … … 119 141 120 142 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 } 123 152 linker.command = cxx.command if toolchains.find { |v| v == 'gcc' } 124 153 @cxx_abi_enabled = true … … 136 165 #define __STDC_LIMIT_MACROS 137 166 167 #ifndef MRB_ENABLE_CXX_ABI 138 168 extern "C" { 169 #endif 139 170 #include "#{src}" 171 #ifndef MRB_ENABLE_CXX_ABI 140 172 } 141 142 #{src == "#{MRUBY_ROOT}/src/error.c"? 'mrb_int mrb_jmpbuf::jmpbuf_id = 0;' : ''} 173 #endif 143 174 EOS 144 175 end -
EcnlProtoTool/trunk/mruby-1.3.0/tasks/mruby_build_commands.rake
r321 r331 43 43 attr_accessor :flags, :include_paths, :defines, :source_exts 44 44 attr_accessor :compile_options, :option_define, :option_include_path, :out_ext 45 attr_accessor :cxx_compile_flag, :cxx_exception_flag 45 46 46 47 def initialize(build, source_exts=[]) -
EcnlProtoTool/trunk/mruby-1.3.0/tasks/mruby_build_gem.rake
r321 r331 39 39 Dir.glob("#{Gem.current.dir}/#{subdir}/*.{cpp,cxx,cc}") 40 40 end.flatten 41 enable_cxx_ abiunless cxx_srcs.empty?41 enable_cxx_exception unless cxx_srcs.empty? 42 42 43 43 Gem.current -
EcnlProtoTool/trunk/mruby-1.3.0/tasks/toolchains/android.rake
r321 r331 1 1 class 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 5 7 DEFAULT_NDK_HOMES = %w{ 8 /usr/local/opt/android-sdk/ndk-bundle 6 9 /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 7 14 } 8 TOOLCHAINS = [:gcc, :clang] 15 16 TOOLCHAINS = [:clang, :gcc] 17 9 18 ARCHITECTURES = %w{ 10 19 armeabi armeabi-v7a arm64-v8a 20 x86 x86_64 11 21 mips mips64 12 x86 x86_6413 22 } 14 23 … … 22 31 end 23 32 33 class PlatformDirNotFound < StandardError 34 def message 35 <<-EOM 36 Couldn't find Android NDK platform directories. 37 Set ANDROID_PLATFORM environment variable or set :platform parameter 38 EOM 39 end 40 end 41 24 42 attr_reader :params 25 43 26 44 def initialize(params) 27 45 @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 28 66 end 29 67 … … 31 69 @home_path ||= Pathname( 32 70 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) 36 78 ) 37 79 end 38 80 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 39 143 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 41 158 end 42 159 43 160 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}" 68 177 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 121 203 end 122 204 123 205 def cc 124 206 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 128 256 end 129 257 … … 131 259 flags = [] 132 260 261 flags += %W(-MMD -MP -D__android__ -DANDROID --sysroot="#{sysroot}") 262 flags += ctarget 133 263 case toolchain 134 264 when :gcc 135 flags += %W(-ffunction-sections -funwind-tables -no-canonical-prefixes)136 flags += %W(-D__android__ -mandroid --sysroot="#{sysroot}")137 case arch138 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 end151 265 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) 153 269 154 270 flags 155 end156 157 def ld158 cc159 271 end 160 272 161 273 def ldflags 162 274 flags = [] 275 276 flags += %W(--sysroot="#{sysroot}") 277 278 flags 279 end 280 281 def ldflags_before_libraries 282 flags = [] 283 163 284 case toolchain 164 285 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 175 303 flags 176 304 end 177 178 def ar179 case toolchain180 when :gcc then bin(:ar)181 when :clang then bin('llvm-ar')182 end183 end184 185 def host_platform186 case RUBY_PLATFORM187 when /cygwin|mswin|mingw|bccwin|wince|emx/i188 'windows'189 when /x86_64-darwin/i190 'darwin-x86_64'191 when /darwin/i192 'darwin-x86'193 when /x86_64-linux/i194 'linux-x86_64'195 when /linux/i196 'linux-x86'197 else198 raise NotImplementedError, "Unknown host platform (#{RUBY_PLATFORM})"199 end200 end201 305 end 202 306 203 307 MRuby::Toolchain.new(:android) do |conf, params| 204 ndk= MRuby::Toolchain::Android.new(params)205 206 toolchain ndk.toolchain308 android = MRuby::Toolchain::Android.new(params) 309 310 toolchain android.toolchain 207 311 208 312 [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 215 321 end 216 -
EcnlProtoTool/trunk/mruby-1.3.0/tasks/toolchains/clang.rake
r321 r331 1 MRuby::Toolchain.new(:clang) do |conf |1 MRuby::Toolchain.new(:clang) do |conf, _params| 2 2 toolchain :gcc 3 3 -
EcnlProtoTool/trunk/mruby-1.3.0/tasks/toolchains/gcc.rake
r321 r331 1 MRuby::Toolchain.new(:gcc) do |conf |1 MRuby::Toolchain.new(:gcc) do |conf, _params| 2 2 [conf.cc, conf.objc, conf.asm].each do |cc| 3 3 cc.command = ENV['CC'] || 'gcc' … … 7 7 cc.option_define = '-D%s' 8 8 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' 9 11 end 10 12 … … 16 18 cxx.option_define = '-D%s' 17 19 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' 18 22 end 19 23 -
EcnlProtoTool/trunk/mruby-1.3.0/tasks/toolchains/visualcpp.rake
r321 r331 1 MRuby::Toolchain.new(:visualcpp) do |conf |1 MRuby::Toolchain.new(:visualcpp) do |conf, _params| 2 2 conf.cc do |cc| 3 3 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)] 9 6 cc.defines = %w(DISABLE_GEMS MRB_STACK_EXTEND_DOUBLING) 10 7 cc.option_include_path = '/I%s' 11 8 cc.option_define = '/D%s' 12 9 cc.compile_options = "%{flags} /Fo%{outfile} %{infile}" 10 cc.cxx_compile_flag = '/TP' 11 cc.cxx_exception_flag = '/EHs' 13 12 end 14 13 15 14 conf.cxx do |cxx| 16 15 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)] 22 17 cxx.defines = %w(DISABLE_GEMS MRB_STACK_EXTEND_DOUBLING) 23 18 cxx.option_include_path = '/I%s' 24 19 cxx.option_define = '/D%s' 25 20 cxx.compile_options = "%{flags} /Fo%{outfile} %{infile}" 21 cxx.cxx_compile_flag = '/TP' 22 cxx.cxx_exception_flag = '/EHs' 26 23 end 27 24 … … 61 58 62 59 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 63 71 end -
EcnlProtoTool/trunk/mruby-1.3.0/test/assert.rb
r321 r331 11 11 while i < len 12 12 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 18 14 i += 1 19 15 end … … 49 45 $mrbtest_assert = [] 50 46 $mrbtest_assert_idx = 0 51 if(!yield || $mrbtest_assert.size > 0) 47 yield 48 if($mrbtest_assert.size > 0) 52 49 $asserts.push(assertion_string('Fail: ', str, iso, nil)) 53 50 $ko_test += 1 … … 218 215 219 216 $asserts.each do |msg| 220 puts msg217 t_print "#{msg}\n" 221 218 end 222 219 … … 237 234 # Performs fuzzy check for equality on methods returning floats 238 235 def check_float(a, b) 239 tolerance = 1e-12236 tolerance = Mrbtest::FLOAT_TOLERANCE 240 237 a = a.to_f 241 238 b = b.to_f -
EcnlProtoTool/trunk/mruby-1.3.0/test/bintest.rb
r321 r331 4 4 def cmd(s) 5 5 case RbConfig::CONFIG['host_os'] 6 when /mswin(?!ce)|mingw| cygwin|bccwin/6 when /mswin(?!ce)|mingw|bccwin/ 7 7 "bin\\#{s}.exe" 8 8 else … … 13 13 def shellquote(s) 14 14 case RbConfig::CONFIG['host_os'] 15 when /mswin(?!ce)|mingw| cygwin|bccwin/15 when /mswin(?!ce)|mingw|bccwin/ 16 16 "\"#{s}\"" 17 17 else … … 21 21 22 22 ARGV.each do |gem| 23 case RbConfig::CONFIG['host_os'] 24 when /mswin(?!ce)|mingw|bccwin/ 25 gem = gem.gsub('\\', '/') 26 end 27 23 28 Dir["#{gem}/bintest/**/*.rb"].each do |file| 24 29 load file -
EcnlProtoTool/trunk/mruby-1.3.0/test/t/array.rb
r321 r331 12 12 assert('Array.[]', '15.2.12.4.1') do 13 13 assert_equal([1, 2, 3], Array.[](1,2,3)) 14 end 15 16 class SubArray < Array 17 end 18 19 assert('SubArray.[]') do 20 a = SubArray[1, 2, 3] 21 assert_equal(SubArray, a.class) 14 22 end 15 23 … … 83 91 a[2...4] = 6 84 92 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) 85 101 end 86 102 … … 99 115 assert('Array#concat', '15.2.12.5.8') do 100 116 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) 101 122 end 102 123 … … 319 340 a = [ 1, 2, 3 ] 320 341 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 322 344 assert_equal([1,2].hash, [1,2].hash) 323 345 end … … 348 370 assert_equal({Array=>200}, h) 349 371 end 372 373 assert("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) 383 end 384 385 assert('Array#freeze') do 386 a = [].freeze 387 assert_raise(RuntimeError) do 388 a[0] = 1 389 end 390 end -
EcnlProtoTool/trunk/mruby-1.3.0/test/t/class.rb
r321 r331 385 385 end 386 386 387 assert('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) 398 end 399 400 assert('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) 411 end 412 413 assert('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) 425 end 426 427 assert('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 437 end 438 387 439 assert('class with non-class/module outer raises TypeError') do 388 440 assert_raise(TypeError) { class 0::C1; end } 389 441 assert_raise(TypeError) { class []::C2; end } 390 442 end 443 444 assert("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 } 451 end -
EcnlProtoTool/trunk/mruby-1.3.0/test/t/exception.rb
r321 r331 339 339 1 * "b" 340 340 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 345 348 def z 346 349 true … … 351 354 352 355 assert('Exception#inspect without message') do 353 assert_equal "Exception : Exception", Exception.new.inspect356 assert_equal "Exception", Exception.new.inspect 354 357 end 355 358 … … 374 377 end 375 378 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 379 def backtrace_available? 380 begin 381 raise "XXX" 382 rescue => exception 383 not exception.backtrace.empty? 384 end 385 end 386 387 assert('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 404 end 405 406 assert('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 422 end -
EcnlProtoTool/trunk/mruby-1.3.0/test/t/float.rb
r321 r331 149 149 assert('Float#to_i', '15.2.9.3.14') do 150 150 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 } 151 154 end 152 155 -
EcnlProtoTool/trunk/mruby-1.3.0/test/t/hash.rb
r321 r331 17 17 18 18 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] 19 26 end 20 27 … … 38 45 a['a'] = 2 39 46 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"]) 40 51 end 41 52 … … 240 251 b.replace(a) 241 252 assert_equal(127, b[127]) 253 254 assert_raise(TypeError) do 255 { 'abc_key' => 'abc_value' }.replace "a" 256 end 242 257 end 243 258 … … 352 367 assert_equal("b", h[[:b]]) 353 368 end 369 370 assert('Hash#freeze') do 371 h = {}.freeze 372 assert_raise(RuntimeError) do 373 h[:a] = 'b' 374 end 375 end -
EcnlProtoTool/trunk/mruby-1.3.0/test/t/integer.rb
r321 r331 148 148 # Left Shift by a negative is Right Shift 149 149 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) 150 156 end 151 157 -
EcnlProtoTool/trunk/mruby-1.3.0/test/t/kernel.rb
r321 r331 222 222 end 223 223 224 assert('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 230 end 231 224 232 # Kernel#eval is provided by mruby-eval mrbgem '15.3.1.3.12' 225 233 … … 248 256 249 257 assert_true respond_to?(:test_method) 258 end 259 260 assert('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 250 265 end 251 266 … … 424 439 assert('Kernel#public_methods', '15.3.1.3.38') do 425 440 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) 426 446 end 427 447 … … 508 528 end 509 529 530 assert('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 543 end 544 510 545 assert('Kernel.local_variables', '15.3.1.2.7') do 511 546 a, b = 0, 1 … … 515 550 assert_equal [:a, :b, :vars], vars 516 551 517 Proc.new {552 assert_equal [:a, :b, :c, :vars], Proc.new { |a, b| 518 553 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) 522 556 end 523 557 … … 588 622 assert_equal 6, recurse(0, 5) 589 623 end 590 -
EcnlProtoTool/trunk/mruby-1.3.0/test/t/literals.rb
r321 r331 27 27 assert_equal 10, 1_0 28 28 # integer with exponent 29 assert_equal 10.0, 1e1 ,29 assert_equal 10.0, 1e1 30 30 assert_equal(0.1, 1e-1) 31 31 assert_equal 10.0, 1e+1 -
EcnlProtoTool/trunk/mruby-1.3.0/test/t/module.rb
r321 r331 494 494 495 495 # Not ISO specified 496 497 assert('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 507 end 496 508 497 509 # @!group prepend … … 838 850 assert_raise(TypeError) { module []::M2 end } 839 851 end 852 853 assert('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) 862 end -
EcnlProtoTool/trunk/mruby-1.3.0/test/t/nil.rb
r321 r331 33 33 assert_equal '', nil.to_s 34 34 end 35 36 assert('safe navigation') do 37 assert_nil nil&.size 38 assert_equal 0, []&.size 39 end -
EcnlProtoTool/trunk/mruby-1.3.0/test/t/proc.rb
r321 r331 137 137 end 138 138 139 assert('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 149 end 150 139 151 assert('&obj call to_proc if defined') do 140 152 pr = Proc.new{} -
EcnlProtoTool/trunk/mruby-1.3.0/test/t/range.rb
r321 r331 44 44 45 45 assert('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) 47 48 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) 50 51 end 51 52 … … 58 59 assert_equal (1..10), b 59 60 assert_false b.exclude_end? 61 62 assert_raise(NameError) { (0..1).send(:initialize, 1, 3) } 60 63 end 61 64 -
EcnlProtoTool/trunk/mruby-1.3.0/test/t/string.rb
r321 r331 252 252 end 253 253 254 assert('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" 265 end 266 254 267 assert('String#chop', '15.2.10.5.11') do 255 268 a = ''.chop … … 329 342 330 343 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 331 350 end 332 351 … … 353 372 assert_equal('A', 'a'.gsub('a', 'A')) 354 373 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("", "", "") } 355 381 end 356 382 … … 382 408 383 409 assert('String#include?', '15.2.10.5.21') do 384 assert_true 'abc'.include?(97)385 assert_false 'abc'.include?(100)386 410 assert_true 'abc'.include?('a') 387 411 assert_false 'abc'.include?('d') … … 392 416 assert_nil 'abc'.index('d') 393 417 assert_equal 3, 'abcabc'.index('a', 1) 418 assert_equal 5, "hello".index("", 5) 419 assert_equal nil, "hello".index("", 6) 394 420 end 395 421 … … 560 586 assert_equal 'aBcabc', 'abcabc'.sub('b') { |w| w.capitalize } 561 587 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 562 598 end 563 599 … … 586 622 b = '123456789'.to_f 587 623 c = '12345.6789'.to_f 624 d = '1e-2147483648'.to_f 625 e = '1e2147483648'.to_f 588 626 589 627 assert_float(0.0, a) 590 628 assert_float(123456789.0, b) 591 629 assert_float(12345.6789, c) 630 assert_float(0, d) 631 assert_float(Float::INFINITY, e) 592 632 end 593 633 … … 686 726 assert_raise(RuntimeError) { str.upcase! } 687 727 end 688 -
EcnlProtoTool/trunk/mruby-1.3.0/test/t/symbol.rb
r321 r331 1 1 ## 2 2 # Symbol ISO Test 3 4 assert('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}" 9 end 3 10 4 11 assert('Symbol', '15.2.11') do -
EcnlProtoTool/trunk/mruby-1.3.0/test/t/syntax.rb
r321 r331 39 39 yield 40 40 end 41 assert_raise LocalJumpError do 42 o = Object.new 43 def o.foo 44 yield 45 end 46 o.foo 47 end 48 end 49 50 assert('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 41 61 end 42 62 … … 249 269 end 250 270 271 assert('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] 276 end 277 251 278 assert('Return values of case statements') do 252 279 a = [] << case 1 … … 299 326 300 327 assert_equal 1, when_value 328 end 329 330 assert('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) 346 end 347 348 assert('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 301 358 end 302 359 … … 325 382 326 383 assert('External command execution.') do 327 class <<Kernel384 module Kernel 328 385 sym = '`'.to_sym 329 386 alias_method :old_cmd, sym -
EcnlProtoTool/trunk/mruby-1.3.0/test/t/unicode.rb
r321 r331 3 3 assert('bare \u notation test') do 4 4 # 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") 7 7 8 8 # 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") 11 11 12 12 # 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") 15 15 16 16 # Four byte characters require the \U notation … … 19 19 assert('braced \u notation test') do 20 20 # 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}") 23 23 24 24 # 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}") 27 27 28 28 # 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}") 31 31 32 32 # 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}") 35 35 end 36 37 assert('braced multiple \u notation test') do 38 assert_equal("ABC", "\u{41 42 43}") 39 end
Note:
See TracChangeset
for help on using the changeset viewer.